/ Hex Artifact Content
Login

Artifact acec45dc602a4f58e80e6fa088b9379ccfffd3a4:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61  Int.h"../* Forwa
0360: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f  rd declaration o
0370: 66 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61  f methods */.sta
0380: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
0390: 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 2a  pResize(sqlite3*
03a0: 2c 20 57 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e  , WhereLoop*, in
03b0: 74 29 3b 0a 0a 2f 2a 20 54 65 73 74 20 76 61 72  t);../* Test var
03c0: 69 61 62 6c 65 20 74 68 61 74 20 63 61 6e 20 62  iable that can b
03d0: 65 20 73 65 74 20 74 6f 20 65 6e 61 62 6c 65 20  e set to enable 
03e0: 57 48 45 52 45 20 74 72 61 63 69 6e 67 20 2a 2f  WHERE tracing */
03f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0400: 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
0410: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
0420: 47 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c  G)./***/ int sql
0430: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d  ite3WhereTrace =
0440: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a   0;.#endif.../*.
0450: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 65 73  ** Return the es
0460: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
0470: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 66 72  f output rows fr
0480: 6f 6d 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  om a WHERE claus
0490: 65 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33  e.*/.u64 sqlite3
04a0: 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f  WhereOutputRowCo
04b0: 75 6e 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  unt(WhereInfo *p
04c0: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
04d0: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f   sqlite3LogEstTo
04e0: 49 6e 74 28 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  Int(pWInfo->nRow
04f0: 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Out);.}../*.** R
0500: 65 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65  eturn one of the
0510: 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
0520: 78 78 78 78 78 20 76 61 6c 75 65 73 20 74 6f 20  xxxxx values to 
0530: 69 6e 64 69 63 61 74 65 20 68 6f 77 20 74 68 69  indicate how thi
0540: 73 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  s.** WHERE claus
0550: 65 20 72 65 74 75 72 6e 73 20 6f 75 74 70 75 74  e returns output
0560: 73 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70  s for DISTINCT p
0570: 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e  rocessing..*/.in
0580: 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  t sqlite3WhereIs
0590: 44 69 73 74 69 6e 63 74 28 57 68 65 72 65 49 6e  Distinct(WhereIn
05a0: 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72  fo *pWInfo){.  r
05b0: 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65 44  eturn pWInfo->eD
05c0: 69 73 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  istinct;.}../*.*
05d0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
05e0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
05f0: 65 20 72 65 74 75 72 6e 73 20 72 6f 77 73 20 69  e returns rows i
0600: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72  n ORDER BY order
0610: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53  ..** Return FALS
0620: 45 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  E if the output 
0630: 6e 65 65 64 73 20 74 6f 20 62 65 20 73 6f 72 74  needs to be sort
0640: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
0650: 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64  e3WhereIsOrdered
0660: 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
0670: 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57  fo){.  return pW
0680: 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3b 0a 7d 0a  Info->nOBSat;.}.
0690: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
06a0: 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20 6f  e VDBE address o
06b0: 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20  r label to jump 
06c0: 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  to in order to c
06d0: 6f 6e 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65 64  ontinue.** immed
06e0: 69 61 74 65 6c 79 20 77 69 74 68 20 74 68 65 20  iately with the 
06f0: 6e 65 78 74 20 72 6f 77 20 6f 66 20 61 20 57 48  next row of a WH
0700: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69  ERE clause..*/.i
0710: 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 43  nt sqlite3WhereC
0720: 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 57 68 65  ontinueLabel(Whe
0730: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
0740: 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
0750: 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20  o->iContinue!=0 
0760: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  );.  return pWIn
0770: 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a 7d  fo->iContinue;.}
0780: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
0790: 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20  he VDBE address 
07a0: 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70  or label to jump
07b0: 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20   to in order to 
07c0: 62 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66 20  break.** out of 
07d0: 61 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a 2f  a WHERE loop..*/
07e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72  .int sqlite3Wher
07f0: 65 42 72 65 61 6b 4c 61 62 65 6c 28 57 68 65 72  eBreakLabel(Wher
0800: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0810: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
0820: 3e 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a  >iBreak;.}../*.*
0830: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
0840: 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
0850: 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 63  LETE statement c
0860: 61 6e 20 6f 70 65 72 61 74 65 20 64 69 72 65 63  an operate direc
0870: 74 6c 79 20 6f 6e 0a 2a 2a 20 74 68 65 20 72 6f  tly on.** the ro
0880: 77 69 64 73 20 72 65 74 75 72 6e 65 64 20 62 79  wids returned by
0890: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
08a0: 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69    Return FALSE i
08b0: 66 20 64 6f 69 6e 67 20 61 6e 0a 2a 2a 20 55 50  f doing an.** UP
08c0: 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 6d  DATE or DELETE m
08d0: 69 67 68 74 20 63 68 61 6e 67 65 20 73 75 62 73  ight change subs
08e0: 65 71 75 65 6e 74 20 57 48 45 52 45 20 63 6c 61  equent WHERE cla
08f0: 75 73 65 20 72 65 73 75 6c 74 73 2e 0a 2a 2a 0a  use results..**.
0900: 2a 2a 20 49 66 20 74 68 65 20 4f 4e 45 50 41 53  ** If the ONEPAS
0910: 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  S optimization i
0920: 73 20 75 73 65 64 20 28 69 66 20 74 68 69 73 20  s used (if this 
0930: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
0940: 74 72 75 65 29 0a 2a 2a 20 74 68 65 6e 20 61 6c  true).** then al
0950: 73 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 64  so write the ind
0960: 69 63 65 73 20 6f 66 20 6f 70 65 6e 20 63 75 72  ices of open cur
0970: 73 6f 72 73 20 75 73 65 64 20 62 79 20 4f 4e 45  sors used by ONE
0980: 50 41 53 53 0a 2a 2a 20 69 6e 74 6f 20 61 69 43  PASS.** into aiC
0990: 75 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b  ur[0] and aiCur[
09a0: 31 5d 2e 20 20 69 61 43 75 72 5b 30 5d 20 67 65  1].  iaCur[0] ge
09b0: 74 73 20 74 68 65 20 63 75 72 73 6f 72 20 6f 66  ts the cursor of
09c0: 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 74 61 62   the data.** tab
09d0: 6c 65 20 61 6e 64 20 69 61 43 75 72 5b 31 5d 20  le and iaCur[1] 
09e0: 67 65 74 73 20 74 68 65 20 63 75 72 73 6f 72 20  gets the cursor 
09f0: 75 73 65 64 20 62 79 20 61 6e 20 61 75 78 69 6c  used by an auxil
0a00: 69 61 72 79 20 69 6e 64 65 78 2e 0a 2a 2a 20 45  iary index..** E
0a10: 69 74 68 65 72 20 76 61 6c 75 65 20 6d 61 79 20  ither value may 
0a20: 62 65 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e  be -1, indicatin
0a30: 67 20 74 68 61 74 20 63 75 72 73 6f 72 20 69 73  g that cursor is
0a40: 20 6e 6f 74 20 75 73 65 64 2e 0a 2a 2a 20 41 6e   not used..** An
0a50: 79 20 63 75 72 73 6f 72 73 20 72 65 74 75 72 6e  y cursors return
0a60: 65 64 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  ed will have bee
0a70: 6e 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69  n opened for wri
0a80: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75  ting..**.** aiCu
0a90: 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31  r[0] and aiCur[1
0aa0: 5d 20 62 6f 74 68 20 67 65 74 20 2d 31 20 69 66  ] both get -1 if
0ab0: 20 74 68 65 20 77 68 65 72 65 2d 63 6c 61 75 73   the where-claus
0ac0: 65 20 6c 6f 67 69 63 20 69 73 0a 2a 2a 20 75 6e  e logic is.** un
0ad0: 61 62 6c 65 20 74 6f 20 75 73 65 20 74 68 65 20  able to use the 
0ae0: 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61  ONEPASS optimiza
0af0: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
0b00: 69 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61  ite3WhereOkOnePa
0b10: 73 73 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ss(WhereInfo *pW
0b20: 49 6e 66 6f 2c 20 69 6e 74 20 2a 61 69 43 75 72  Info, int *aiCur
0b30: 29 7b 0a 20 20 6d 65 6d 63 70 79 28 61 69 43 75  ){.  memcpy(aiCu
0b40: 72 2c 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72  r, pWInfo->aiCur
0b50: 4f 6e 65 50 61 73 73 2c 20 73 69 7a 65 6f 66 28  OnePass, sizeof(
0b60: 69 6e 74 29 2a 32 29 3b 0a 20 20 72 65 74 75 72  int)*2);.  retur
0b70: 6e 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50  n pWInfo->okOneP
0b80: 61 73 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  ass;.}../*.** Mo
0b90: 76 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ve the content o
0ba0: 66 20 70 53 72 63 20 69 6e 74 6f 20 70 44 65 73  f pSrc into pDes
0bb0: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
0bc0: 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 57 68 65   whereOrMove(Whe
0bd0: 72 65 4f 72 53 65 74 20 2a 70 44 65 73 74 2c 20  reOrSet *pDest, 
0be0: 57 68 65 72 65 4f 72 53 65 74 20 2a 70 53 72 63  WhereOrSet *pSrc
0bf0: 29 7b 0a 20 20 70 44 65 73 74 2d 3e 6e 20 3d 20  ){.  pDest->n = 
0c00: 70 53 72 63 2d 3e 6e 3b 0a 20 20 6d 65 6d 63 70  pSrc->n;.  memcp
0c10: 79 28 70 44 65 73 74 2d 3e 61 2c 20 70 53 72 63  y(pDest->a, pSrc
0c20: 2d 3e 61 2c 20 70 44 65 73 74 2d 3e 6e 2a 73 69  ->a, pDest->n*si
0c30: 7a 65 6f 66 28 70 44 65 73 74 2d 3e 61 5b 30 5d  zeof(pDest->a[0]
0c40: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  ));.}../*.** Try
0c50: 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77   to insert a new
0c60: 20 70 72 65 72 65 71 75 69 73 69 74 65 2f 63 6f   prerequisite/co
0c70: 73 74 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  st entry into th
0c80: 65 20 57 68 65 72 65 4f 72 53 65 74 20 70 53 65  e WhereOrSet pSe
0c90: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  t..**.** The new
0ca0: 20 65 6e 74 72 79 20 6d 69 67 68 74 20 6f 76 65   entry might ove
0cb0: 72 77 72 69 74 65 20 61 6e 20 65 78 69 73 74 69  rwrite an existi
0cc0: 6e 67 20 65 6e 74 72 79 2c 20 6f 72 20 69 74 20  ng entry, or it 
0cd0: 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 70 70 65  might be.** appe
0ce0: 6e 64 65 64 2c 20 6f 72 20 69 74 20 6d 69 67 68  nded, or it migh
0cf0: 74 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 20  t be discarded. 
0d00: 20 44 6f 20 77 68 61 74 65 76 65 72 20 69 73 20   Do whatever is 
0d10: 74 68 65 20 72 69 67 68 74 20 74 68 69 6e 67 0a  the right thing.
0d20: 2a 2a 20 73 6f 20 74 68 61 74 20 70 53 65 74 20  ** so that pSet 
0d30: 6b 65 65 70 73 20 74 68 65 20 4e 5f 4f 52 5f 43  keeps the N_OR_C
0d40: 4f 53 54 20 62 65 73 74 20 65 6e 74 72 69 65 73  OST best entries
0d50: 20 73 65 65 6e 20 73 6f 20 66 61 72 2e 0a 2a 2f   seen so far..*/
0d60: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
0d70: 65 4f 72 49 6e 73 65 72 74 28 0a 20 20 57 68 65  eOrInsert(.  Whe
0d80: 72 65 4f 72 53 65 74 20 2a 70 53 65 74 2c 20 20  reOrSet *pSet,  
0d90: 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
0da0: 4f 72 53 65 74 20 74 6f 20 62 65 20 75 70 64 61  OrSet to be upda
0db0: 74 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ted */.  Bitmask
0dc0: 20 70 72 65 72 65 71 2c 20 20 20 20 20 20 20 20   prereq,        
0dd0: 2f 2a 20 50 72 65 72 65 71 75 69 73 69 74 65 73  /* Prerequisites
0de0: 20 6f 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72   of the new entr
0df0: 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 52  y */.  LogEst rR
0e00: 75 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  un,           /*
0e10: 20 52 75 6e 2d 63 6f 73 74 20 6f 66 20 74 68 65   Run-cost of the
0e20: 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20 20   new entry */.  
0e30: 4c 6f 67 45 73 74 20 6e 4f 75 74 20 20 20 20 20  LogEst nOut     
0e40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
0e50: 20 6f 66 20 6f 75 74 70 75 74 73 20 66 6f 72 20   of outputs for 
0e60: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f  the new entry */
0e70: 0a 29 7b 0a 20 20 75 31 36 20 69 3b 0a 20 20 57  .){.  u16 i;.  W
0e80: 68 65 72 65 4f 72 43 6f 73 74 20 2a 70 3b 0a 20  hereOrCost *p;. 
0e90: 20 66 6f 72 28 69 3d 70 53 65 74 2d 3e 6e 2c 20   for(i=pSet->n, 
0ea0: 70 3d 70 53 65 74 2d 3e 61 3b 20 69 3e 30 3b 20  p=pSet->a; i>0; 
0eb0: 69 2d 2d 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i--, p++){.    i
0ec0: 66 28 20 72 52 75 6e 3c 3d 70 2d 3e 72 52 75 6e  f( rRun<=p->rRun
0ed0: 20 26 26 20 28 70 72 65 72 65 71 20 26 20 70 2d   && (prereq & p-
0ee0: 3e 70 72 65 72 65 71 29 3d 3d 70 72 65 72 65 71  >prereq)==prereq
0ef0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 77   ){.      goto w
0f00: 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e  hereOrInsert_don
0f10: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
0f20: 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 26   p->rRun<=rRun &
0f30: 26 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  & (p->prereq & p
0f40: 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65  rereq)==p->prere
0f50: 71 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  q ){.      retur
0f60: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 0;.    }.  }. 
0f70: 20 69 66 28 20 70 53 65 74 2d 3e 6e 3c 4e 5f 4f   if( pSet->n<N_O
0f80: 52 5f 43 4f 53 54 20 29 7b 0a 20 20 20 20 70 20  R_COST ){.    p 
0f90: 3d 20 26 70 53 65 74 2d 3e 61 5b 70 53 65 74 2d  = &pSet->a[pSet-
0fa0: 3e 6e 2b 2b 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4f  >n++];.    p->nO
0fb0: 75 74 20 3d 20 6e 4f 75 74 3b 0a 20 20 7d 65 6c  ut = nOut;.  }el
0fc0: 73 65 7b 0a 20 20 20 20 70 20 3d 20 70 53 65 74  se{.    p = pSet
0fd0: 2d 3e 61 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  ->a;.    for(i=1
0fe0: 3b 20 69 3c 70 53 65 74 2d 3e 6e 3b 20 69 2b 2b  ; i<pSet->n; i++
0ff0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
1000: 72 52 75 6e 3e 70 53 65 74 2d 3e 61 5b 69 5d 2e  rRun>pSet->a[i].
1010: 72 52 75 6e 20 29 20 70 20 3d 20 70 53 65 74 2d  rRun ) p = pSet-
1020: 3e 61 20 2b 20 69 3b 0a 20 20 20 20 7d 0a 20 20  >a + i;.    }.  
1030: 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3c 3d 72    if( p->rRun<=r
1040: 52 75 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Run ) return 0;.
1050: 20 20 7d 0a 77 68 65 72 65 4f 72 49 6e 73 65 72    }.whereOrInser
1060: 74 5f 64 6f 6e 65 3a 0a 20 20 70 2d 3e 70 72 65  t_done:.  p->pre
1070: 72 65 71 20 3d 20 70 72 65 72 65 71 3b 0a 20 20  req = prereq;.  
1080: 70 2d 3e 72 52 75 6e 20 3d 20 72 52 75 6e 3b 0a  p->rRun = rRun;.
1090: 20 20 69 66 28 20 70 2d 3e 6e 4f 75 74 3e 6e 4f    if( p->nOut>nO
10a0: 75 74 20 29 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e  ut ) p->nOut = n
10b0: 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  Out;.  return 1;
10c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
10d0: 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
10e0: 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
10f0: 72 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72  r number.  Retur
1100: 6e 20 30 20 69 66 0a 2a 2a 20 69 43 75 72 73 6f  n 0 if.** iCurso
1110: 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  r is not in the 
1120: 73 65 74 2e 0a 2a 2f 0a 42 69 74 6d 61 73 6b 20  set..*/.Bitmask 
1130: 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d  sqlite3WhereGetM
1140: 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74  ask(WhereMaskSet
1150: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
1160: 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20  iCursor){.  int 
1170: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  i;.  assert( pMa
1180: 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73  skSet->n<=(int)s
1190: 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
11a0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
11b0: 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b  <pMaskSet->n; i+
11c0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73  +){.    if( pMas
11d0: 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75  kSet->ix[i]==iCu
11e0: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65  rsor ){.      re
11f0: 74 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29 3b  turn MASKBIT(i);
1200: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1210: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1220: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73  Create a new mas
1230: 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75  k for cursor iCu
1240: 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  rsor..**.** Ther
1250: 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20  e is one cursor 
1260: 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65  per table in the
1270: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
1280: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
1290: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
12a0: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
12b0: 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65  ited by a test e
12c0: 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73  arly in the.** s
12d0: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
12e0: 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20  () routine.  So 
12f0: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
1300: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a   pMaskSet->ix[].
1310: 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65  ** array will ne
1320: 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f  ver overflow..*/
1330: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65  .static void cre
1340: 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73  ateMask(WhereMas
1350: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
1360: 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20  int iCursor){.  
1370: 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74  assert( pMaskSet
1380: 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28  ->n < ArraySize(
1390: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b  pMaskSet->ix) );
13a0: 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  .  pMaskSet->ix[
13b0: 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d  pMaskSet->n++] =
13c0: 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   iCursor;.}../*.
13d0: 2a 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68  ** Advance to th
13e0: 65 20 6e 65 78 74 20 57 68 65 72 65 54 65 72 6d  e next WhereTerm
13f0: 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 63   that matches ac
1400: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63  cording to the c
1410: 72 69 74 65 72 69 61 0a 2a 2a 20 65 73 74 61 62  riteria.** estab
1420: 6c 69 73 68 65 64 20 77 68 65 6e 20 74 68 65 20  lished when the 
1430: 70 53 63 61 6e 20 6f 62 6a 65 63 74 20 77 61 73  pScan object was
1440: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20   initialized by 
1450: 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 29 2e  whereScanInit().
1460: 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
1470: 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
1480: 6d 6f 72 65 20 6d 61 74 63 68 69 6e 67 20 57 68  more matching Wh
1490: 65 72 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61  ereTerms..*/.sta
14a0: 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77  tic WhereTerm *w
14b0: 68 65 72 65 53 63 61 6e 4e 65 78 74 28 57 68 65  hereScanNext(Whe
14c0: 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 29 7b 0a  reScan *pScan){.
14d0: 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20    int iCur;     
14e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
14f0: 72 73 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 20  rsor on the LHS 
1500: 6f 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20  of the term */. 
1510: 20 69 31 36 20 69 43 6f 6c 75 6d 6e 3b 20 20 20   i16 iColumn;   
1520: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c        /* The col
1530: 75 6d 6e 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f  umn on the LHS o
1540: 66 20 74 68 65 20 74 65 72 6d 2e 20 20 2d 31 20  f the term.  -1 
1550: 66 6f 72 20 49 50 4b 20 2a 2f 0a 20 20 45 78 70  for IPK */.  Exp
1560: 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  r *pX;          
1570: 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69    /* An expressi
1580: 6f 6e 20 62 65 69 6e 67 20 74 65 73 74 65 64 20  on being tested 
1590: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
15a0: 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 53 68 6f   *pWC;    /* Sho
15b0: 72 74 68 61 6e 64 20 66 6f 72 20 70 53 63 61 6e  rthand for pScan
15c0: 2d 3e 70 57 43 20 2a 2f 0a 20 20 57 68 65 72 65  ->pWC */.  Where
15d0: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
15e0: 2f 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e  /* The term bein
15f0: 67 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e  g tested */.  in
1600: 74 20 6b 20 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20  t k = pScan->k; 
1610: 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73     /* Where to s
1620: 74 61 72 74 20 73 63 61 6e 6e 69 6e 67 20 2a 2f  tart scanning */
1630: 0a 0a 20 20 77 68 69 6c 65 28 20 70 53 63 61 6e  ..  while( pScan
1640: 2d 3e 69 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d  ->iEquiv<=pScan-
1650: 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 69  >nEquiv ){.    i
1660: 43 75 72 20 3d 20 70 53 63 61 6e 2d 3e 61 69 43  Cur = pScan->aiC
1670: 75 72 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  ur[pScan->iEquiv
1680: 2d 31 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e  -1];.    iColumn
1690: 20 3d 20 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75   = pScan->aiColu
16a0: 6d 6e 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  mn[pScan->iEquiv
16b0: 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  -1];.    if( iCo
16c0: 6c 75 6d 6e 3d 3d 28 2d 32 29 20 26 26 20 70 53  lumn==(-2) && pS
16d0: 63 61 6e 2d 3e 70 49 64 78 45 78 70 72 3d 3d 30  can->pIdxExpr==0
16e0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
16f0: 20 77 68 69 6c 65 28 20 28 70 57 43 20 3d 20 70   while( (pWC = p
1700: 53 63 61 6e 2d 3e 70 57 43 29 21 3d 30 20 29 7b  Scan->pWC)!=0 ){
1710: 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d  .      for(pTerm
1720: 3d 70 57 43 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43  =pWC->a+k; k<pWC
1730: 2d 3e 6e 54 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54  ->nTerm; k++, pT
1740: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
1750: 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
1760: 75 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20  ursor==iCur.    
1770: 20 20 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 75       && pTerm->u
1780: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f  .leftColumn==iCo
1790: 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20 20 26 26  lumn.         &&
17a0: 20 28 69 43 6f 6c 75 6d 6e 21 3d 28 2d 32 29 0a   (iColumn!=(-2).
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17c0: 7c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  | sqlite3ExprCom
17d0: 70 61 72 65 28 70 54 65 72 6d 2d 3e 70 45 78 70  pare(pTerm->pExp
17e0: 72 2d 3e 70 4c 65 66 74 2c 70 53 63 61 6e 2d 3e  r->pLeft,pScan->
17f0: 70 49 64 78 45 78 70 72 2c 69 43 75 72 29 3d 3d  pIdxExpr,iCur)==
1800: 30 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  0).         && (
1810: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d 31  pScan->iEquiv<=1
1820: 20 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70   || !ExprHasProp
1830: 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
1840: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29  r, EP_FromJoin))
1850: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
1860: 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
1870: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1880: 5f 45 51 55 49 56 29 21 3d 30 0a 20 20 20 20 20  _EQUIV)!=0.     
1890: 20 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e        && pScan->
18a0: 6e 45 71 75 69 76 3c 41 72 72 61 79 53 69 7a 65  nEquiv<ArraySize
18b0: 28 70 53 63 61 6e 2d 3e 61 69 43 75 72 29 0a 20  (pScan->aiCur). 
18c0: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58            && (pX
18d0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
18e0: 69 70 43 6f 6c 6c 61 74 65 28 70 54 65 72 6d 2d  ipCollate(pTerm-
18f0: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 29  >pExpr->pRight))
1900: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
1910: 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
1920: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a           int j;.
1930: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
1940: 6a 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45  j=0; j<pScan->nE
1950: 71 75 69 76 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  quiv; j++){.    
1960: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
1970: 63 61 6e 2d 3e 61 69 43 75 72 5b 6a 5d 3d 3d 70  can->aiCur[j]==p
1980: 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20  X->iTable.      
1990: 20 20 20 20 20 20 20 20 20 26 26 20 70 53 63 61           && pSca
19a0: 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3d 3d  n->aiColumn[j]==
19b0: 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pX->iColumn ){. 
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
19e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
19f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1a00: 20 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e    if( j==pScan->
1a10: 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20  nEquiv ){.      
1a20: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61          pScan->a
1a30: 69 43 75 72 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54  iCur[j] = pX->iT
1a40: 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20  able;.          
1a50: 20 20 20 20 70 53 63 61 6e 2d 3e 61 69 43 6f 6c      pScan->aiCol
1a60: 75 6d 6e 5b 6a 5d 20 3d 20 70 58 2d 3e 69 43 6f  umn[j] = pX->iCo
1a70: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  lumn;.          
1a80: 20 20 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69      pScan->nEqui
1a90: 76 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  v++;.           
1aa0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1ab0: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54           if( (pT
1ac0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1ad0: 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21   pScan->opMask)!
1ae0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1af0: 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20    /* Verify the 
1b00: 61 66 66 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c  affinity and col
1b10: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1b20: 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20  match */.       
1b30: 20 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e       if( pScan->
1b40: 7a 43 6f 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54  zCollName && (pT
1b50: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1b60: 20 57 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29   WO_ISNULL)==0 )
1b70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1b80: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 61                Pa
1ba0: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
1bb0: 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  C->pWInfo->pPars
1bc0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
1bd0: 20 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78   pX = pTerm->pEx
1be0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
1bf0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e    if( !sqlite3In
1c00: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58  dexAffinityOk(pX
1c10: 2c 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 29  , pScan->idxaff)
1c20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1c30: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
1c60: 72 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20  rt(pX->pLeft);. 
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
1c80: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  ll = sqlite3Bina
1c90: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
1ca0: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd0: 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 70             pX->p
1ce0: 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74  Left, pX->pRight
1cf0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1d00: 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20   if( pColl==0 ) 
1d10: 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
1d20: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1d40: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1d50: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53  pColl->zName, pS
1d60: 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20  can->zCollName) 
1d70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1d80: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1d90: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1da0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1db0: 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
1dc0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
1dd0: 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30  WO_EQ|WO_IS))!=0
1de0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
1df0: 20 28 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45   (pX = pTerm->pE
1e00: 78 70 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70  xpr->pRight)->op
1e10: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20  ==TK_COLUMN.    
1e20: 20 20 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e           && pX->
1e30: 69 54 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61  iTable==pScan->a
1e40: 69 43 75 72 5b 30 5d 0a 20 20 20 20 20 20 20 20  iCur[0].        
1e50: 20 20 20 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c       && pX->iCol
1e60: 75 6d 6e 3d 3d 70 53 63 61 6e 2d 3e 61 69 43 6f  umn==pScan->aiCo
1e70: 6c 75 6d 6e 5b 30 5d 0a 20 20 20 20 20 20 20 20  lumn[0].        
1e80: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
1e90: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1ea0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1eb0: 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20  & WO_IS );.     
1ec0: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
1ed0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
1ee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63  .            pSc
1ef0: 61 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a 20 20 20  an->k = k+1;.   
1f00: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1f10: 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20  pTerm;.         
1f20: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1f30: 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63 61 6e     }.      pScan
1f40: 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70  ->pWC = pScan->p
1f50: 57 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20  WC->pOuter;.    
1f60: 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20    k = 0;.    }. 
1f70: 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20     pScan->pWC = 
1f80: 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 3b 0a  pScan->pOrigWC;.
1f90: 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 70      k = 0;.    p
1fa0: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2b 2b 3b 0a  Scan->iEquiv++;.
1fb0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1fc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
1fd0: 69 7a 65 20 61 20 57 48 45 52 45 20 63 6c 61 75  ize a WHERE clau
1fe0: 73 65 20 73 63 61 6e 6e 65 72 20 6f 62 6a 65 63  se scanner objec
1ff0: 74 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  t.  Return a poi
2000: 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 66  nter to the.** f
2010: 69 72 73 74 20 6d 61 74 63 68 2e 20 20 52 65 74  irst match.  Ret
2020: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72  urn NULL if ther
2030: 65 20 61 72 65 20 6e 6f 20 6d 61 74 63 68 65 73  e are no matches
2040: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6e  ..**.** The scan
2050: 6e 65 72 20 77 69 6c 6c 20 62 65 20 73 65 61 72  ner will be sear
2060: 63 68 69 6e 67 20 74 68 65 20 57 48 45 52 45 20  ching the WHERE 
2070: 63 6c 61 75 73 65 20 70 57 43 2e 20 20 49 74 20  clause pWC.  It 
2080: 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72  will look.** for
2090: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   terms of the fo
20a0: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
20b0: 3e 22 20 77 68 65 72 65 20 58 20 69 73 20 63 6f  >" where X is co
20c0: 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20  lumn iColumn of 
20d0: 74 61 62 6c 65 0a 2a 2a 20 69 43 75 72 2e 20 20  table.** iCur.  
20e0: 54 68 65 20 3c 6f 70 3e 20 6d 75 73 74 20 62 65  The <op> must be
20f0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72   one of the oper
2100: 61 74 6f 72 73 20 64 65 73 63 72 69 62 65 64 20  ators described 
2110: 62 79 20 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a  by opMask..**.**
2120: 20 49 66 20 74 68 65 20 73 65 61 72 63 68 20 69   If the search i
2130: 73 20 66 6f 72 20 58 20 61 6e 64 20 74 68 65 20  s for X and the 
2140: 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
2150: 74 61 69 6e 73 20 74 65 72 6d 73 20 6f 66 20 74  tains terms of t
2160: 68 65 0a 2a 2a 20 66 6f 72 6d 20 58 3d 59 20 74  he.** form X=Y t
2170: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2180: 20 6d 69 67 68 74 20 61 6c 73 6f 20 72 65 74 75   might also retu
2190: 72 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  rn terms of the 
21a0: 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20  form.** "Y <op> 
21b0: 3c 65 78 70 72 3e 22 2e 20 20 54 68 65 20 6e 75  <expr>".  The nu
21c0: 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73 20 6f  mber of levels o
21d0: 66 20 74 72 61 6e 73 69 74 69 76 69 74 79 20 69  f transitivity i
21e0: 73 20 6c 69 6d 69 74 65 64 2c 0a 2a 2a 20 62 75  s limited,.** bu
21f0: 74 20 69 73 20 65 6e 6f 75 67 68 20 74 6f 20 68  t is enough to h
2200: 61 6e 64 6c 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f  andle most commo
2210: 6e 6c 79 20 6f 63 63 75 72 72 69 6e 67 20 53 51  nly occurring SQ
2220: 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a  L statements..**
2230: 0a 2a 2a 20 49 66 20 58 20 69 73 20 6e 6f 74 20  .** If X is not 
2240: 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d  the INTEGER PRIM
2250: 41 52 59 20 4b 45 59 20 74 68 65 6e 20 58 20 6d  ARY KEY then X m
2260: 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c  ust be compatibl
2270: 65 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20  e with.** index 
2280: 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pIdx..*/.static 
2290: 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65  WhereTerm *where
22a0: 53 63 61 6e 49 6e 69 74 28 0a 20 20 57 68 65 72  ScanInit(.  Wher
22b0: 65 53 63 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20  eScan *pScan,   
22c0: 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
22d0: 53 63 61 6e 20 6f 62 6a 65 63 74 20 62 65 69 6e  Scan object bein
22e0: 67 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  g initialized */
22f0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
2300: 70 57 43 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pWC,       /* Th
2310: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
2320: 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a  o be scanned */.
2330: 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20    int iCur,     
2340: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
2350: 73 6f 72 20 74 6f 20 73 63 61 6e 20 66 6f 72 20  sor to scan for 
2360: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
2370: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2380: 43 6f 6c 75 6d 6e 20 74 6f 20 73 63 61 6e 20 66  Column to scan f
2390: 6f 72 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d 61  or */.  u32 opMa
23a0: 73 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sk,             
23b0: 2f 2a 20 4f 70 65 72 61 74 6f 72 28 73 29 20 74  /* Operator(s) t
23c0: 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20  o scan for */.  
23d0: 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20  Index *pIdx     
23e0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
23f0: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
2400: 74 68 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f  th this index */
2410: 0a 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20  .){.  int j;..  
2420: 2f 2a 20 6d 65 6d 73 65 74 28 70 53 63 61 6e 2c  /* memset(pScan,
2430: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53 63 61   0, sizeof(*pSca
2440: 6e 29 29 3b 20 2a 2f 0a 20 20 70 53 63 61 6e 2d  n)); */.  pScan-
2450: 3e 70 4f 72 69 67 57 43 20 3d 20 70 57 43 3b 0a  >pOrigWC = pWC;.
2460: 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70    pScan->pWC = p
2470: 57 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 49 64  WC;.  pScan->pId
2480: 78 45 78 70 72 20 3d 20 30 3b 0a 20 20 69 66 28  xExpr = 0;.  if(
2490: 20 70 49 64 78 20 29 7b 0a 20 20 20 20 6a 20 3d   pIdx ){.    j =
24a0: 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 43   iColumn;.    iC
24b0: 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 61 69  olumn = pIdx->ai
24c0: 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69  Column[j];.    i
24d0: 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 28 2d 32 29  f( iColumn==(-2)
24e0: 20 29 20 70 53 63 61 6e 2d 3e 70 49 64 78 45 78   ) pScan->pIdxEx
24f0: 70 72 20 3d 20 70 49 64 78 2d 3e 61 43 6f 6c 45  pr = pIdx->aColE
2500: 78 70 72 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 3b  xpr->a[j].pExpr;
2510: 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78 20  .  }.  if( pIdx 
2520: 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b  && iColumn>=0 ){
2530: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64 78 61  .    pScan->idxa
2540: 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  ff = pIdx->pTabl
2550: 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d  e->aCol[iColumn]
2560: 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 70  .affinity;.    p
2570: 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20  Scan->zCollName 
2580: 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a  = pIdx->azColl[j
2590: 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
25a0: 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20  pScan->idxaff = 
25b0: 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43  0;.    pScan->zC
25c0: 6f 6c 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  ollName = 0;.  }
25d0: 0a 20 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b  .  pScan->opMask
25e0: 20 3d 20 6f 70 4d 61 73 6b 3b 0a 20 20 70 53 63   = opMask;.  pSc
25f0: 61 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70 53 63  an->k = 0;.  pSc
2600: 61 6e 2d 3e 61 69 43 75 72 5b 30 5d 20 3d 20 69  an->aiCur[0] = i
2610: 43 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 69  Cur;.  pScan->ai
2620: 43 6f 6c 75 6d 6e 5b 30 5d 20 3d 20 69 43 6f 6c  Column[0] = iCol
2630: 75 6d 6e 3b 0a 20 20 70 53 63 61 6e 2d 3e 6e 45  umn;.  pScan->nE
2640: 71 75 69 76 20 3d 20 31 3b 0a 20 20 70 53 63 61  quiv = 1;.  pSca
2650: 6e 2d 3e 69 45 71 75 69 76 20 3d 20 31 3b 0a 20  n->iEquiv = 1;. 
2660: 20 72 65 74 75 72 6e 20 77 68 65 72 65 53 63 61   return whereSca
2670: 6e 4e 65 78 74 28 70 53 63 61 6e 29 3b 0a 7d 0a  nNext(pScan);.}.
2680: 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f  ./*.** Search fo
2690: 72 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20  r a term in the 
26a0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
26b0: 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
26c0: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
26d0: 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61  .** where X is a
26e0: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
26f0: 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  e iColumn of tab
2700: 6c 65 20 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e  le iCur and <op>
2710: 20 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68   is one of.** th
2720: 65 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72  e WO_xx operator
2730: 20 63 6f 64 65 73 20 73 70 65 63 69 66 69 65 64   codes specified
2740: 20 62 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d   by the op param
2750: 65 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  eter..** Return 
2760: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
2770: 20 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30   term.  Return 0
2780: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
2790: 2a 0a 2a 2a 20 49 66 20 70 49 64 78 21 3d 30 20  *.** If pIdx!=0 
27a0: 74 68 65 6e 20 73 65 61 72 63 68 20 66 6f 72 20  then search for 
27b0: 74 65 72 6d 73 20 6d 61 74 63 68 69 6e 67 20 74  terms matching t
27c0: 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f  he iColumn-th co
27d0: 6c 75 6d 6e 20 6f 66 20 70 49 64 78 0a 2a 2a 20  lumn of pIdx.** 
27e0: 72 61 74 68 65 72 20 74 68 61 6e 20 74 68 65 20  rather than the 
27f0: 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d  iColumn-th colum
2800: 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72 2e  n of table iCur.
2810: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20  .**.** The term 
2820: 72 65 74 75 72 6e 65 64 20 6d 69 67 68 74 20 62  returned might b
2830: 79 20 59 3d 3c 65 78 70 72 3e 20 69 66 20 74 68  y Y=<expr> if th
2840: 65 72 65 20 69 73 20 61 6e 6f 74 68 65 72 20 63  ere is another c
2850: 6f 6e 73 74 72 61 69 6e 74 20 69 6e 0a 2a 2a 20  onstraint in.** 
2860: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2870: 20 74 68 61 74 20 73 70 65 63 69 66 69 65 73 20   that specifies 
2880: 74 68 61 74 20 58 3d 59 2e 20 20 41 6e 79 20 73  that X=Y.  Any s
2890: 75 63 68 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  uch constraints 
28a0: 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 64 65 6e 74  will be.** ident
28b0: 69 66 69 65 64 20 62 79 20 74 68 65 20 57 4f 5f  ified by the WO_
28c0: 45 51 55 49 56 20 62 69 74 20 69 6e 20 74 68 65  EQUIV bit in the
28d0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
28e0: 72 20 66 69 65 6c 64 2e 20 20 54 68 65 0a 2a 2a  r field.  The.**
28f0: 20 61 69 43 75 72 5b 5d 2f 69 61 43 6f 6c 75 6d   aiCur[]/iaColum
2900: 6e 5b 5d 20 61 72 72 61 79 73 20 68 6f 6c 64 20  n[] arrays hold 
2910: 58 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 65 71  X and all its eq
2920: 75 69 76 61 6c 65 6e 74 73 2e 20 54 68 65 72 65  uivalents. There
2930: 20 61 72 65 20 31 31 0a 2a 2a 20 73 6c 6f 74 73   are 11.** slots
2940: 20 69 6e 20 61 69 43 75 72 5b 5d 2f 61 69 43 6f   in aiCur[]/aiCo
2950: 6c 75 6d 6e 5b 5d 20 73 6f 20 74 68 61 74 20 6d  lumn[] so that m
2960: 65 61 6e 73 20 77 65 20 63 61 6e 20 6c 6f 6f 6b  eans we can look
2970: 20 66 6f 72 20 58 20 70 6c 75 73 20 75 70 20 74   for X plus up t
2980: 6f 20 31 30 0a 2a 2a 20 6f 74 68 65 72 20 65 71  o 10.** other eq
2990: 75 69 76 61 6c 65 6e 74 20 76 61 6c 75 65 73 2e  uivalent values.
29a0: 20 20 48 65 6e 63 65 20 61 20 73 65 61 72 63 68    Hence a search
29b0: 20 66 6f 72 20 58 20 77 69 6c 6c 20 72 65 74 75   for X will retu
29c0: 72 6e 20 3c 65 78 70 72 3e 20 69 66 20 58 3d 41  rn <expr> if X=A
29d0: 31 0a 2a 2a 20 61 6e 64 20 41 31 3d 41 32 20 61  1.** and A1=A2 a
29e0: 6e 64 20 41 32 3d 41 33 20 61 6e 64 20 2e 2e 2e  nd A2=A3 and ...
29f0: 20 61 6e 64 20 41 39 3d 41 31 30 20 61 6e 64 20   and A9=A10 and 
2a00: 41 31 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a 2a  A10=<expr>..**.*
2a10: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6d  * If there are m
2a20: 75 6c 74 69 70 6c 65 20 74 65 72 6d 73 20 69 6e  ultiple terms in
2a30: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2a40: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58  e of the form "X
2a50: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a   <op> <expr>".**
2a60: 20 74 68 65 6e 20 74 72 79 20 66 6f 72 20 74 68   then try for th
2a70: 65 20 6f 6e 65 20 77 69 74 68 20 6e 6f 20 64 65  e one with no de
2a80: 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20 3c 65  pendencies on <e
2a90: 78 70 72 3e 20 2d 20 69 6e 20 6f 74 68 65 72 20  xpr> - in other 
2aa0: 77 6f 72 64 73 20 77 68 65 72 65 0a 2a 2a 20 3c  words where.** <
2ab0: 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6e 73 74  expr> is a const
2ac0: 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  ant expression o
2ad0: 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f 6e  f some kind.  On
2ae0: 6c 79 20 72 65 74 75 72 6e 20 65 6e 74 72 69 65  ly return entrie
2af0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d  s of.** the form
2b00: 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72   "X <op> Y" wher
2b10: 65 20 59 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  e Y is a column 
2b20: 69 6e 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65  in another table
2b30: 20 69 66 20 6e 6f 20 74 65 72 6d 73 20 6f 66 0a   if no terms of.
2b40: 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  ** the form "X <
2b50: 6f 70 3e 20 3c 63 6f 6e 73 74 2d 65 78 70 72 3e  op> <const-expr>
2b60: 22 20 65 78 69 73 74 2e 20 20 20 49 66 20 6e 6f  " exist.   If no
2b70: 20 74 65 72 6d 73 20 77 69 74 68 20 61 20 63 6f   terms with a co
2b80: 6e 73 74 61 6e 74 20 52 48 53 0a 2a 2a 20 65 78  nstant RHS.** ex
2b90: 69 73 74 2c 20 74 72 79 20 74 6f 20 72 65 74 75  ist, try to retu
2ba0: 72 6e 20 61 20 74 65 72 6d 20 74 68 61 74 20 64  rn a term that d
2bb0: 6f 65 73 20 6e 6f 74 20 75 73 65 20 57 4f 5f 45  oes not use WO_E
2bc0: 51 55 49 56 2e 0a 2a 2f 0a 57 68 65 72 65 54 65  QUIV..*/.WhereTe
2bd0: 72 6d 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65  rm *sqlite3Where
2be0: 46 69 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72  FindTerm(.  Wher
2bf0: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
2c00: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
2c10: 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65 61 72  lause to be sear
2c20: 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ched */.  int iC
2c30: 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
2c40: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
2c50: 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74   of LHS */.  int
2c60: 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20   iColumn,       
2c70: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
2c80: 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20  ber of LHS */.  
2c90: 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
2ca0: 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73  ,     /* RHS mus
2cb0: 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69  t not overlap wi
2cc0: 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a  th this mask */.
2cd0: 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20 20 20    u32 op,       
2ce0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
2cf0: 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20  of WO_xx values 
2d00: 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61  describing opera
2d10: 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  tor */.  Index *
2d20: 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20 2f  pIdx           /
2d30: 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74  * Must be compat
2d40: 69 62 6c 65 20 77 69 74 68 20 74 68 69 73 20 69  ible with this i
2d50: 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c  ndex, if not NUL
2d60: 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54  L */.){.  WhereT
2d70: 65 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20 30  erm *pResult = 0
2d80: 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
2d90: 3b 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73 63  ;.  WhereScan sc
2da0: 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65 72 65  an;..  p = where
2db0: 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20  ScanInit(&scan, 
2dc0: 70 57 43 2c 20 69 43 75 72 2c 20 69 43 6f 6c 75  pWC, iCur, iColu
2dd0: 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b 0a 20  mn, op, pIdx);. 
2de0: 20 6f 70 20 26 3d 20 57 4f 5f 45 51 7c 57 4f 5f   op &= WO_EQ|WO_
2df0: 49 53 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  IS;.  while( p )
2e00: 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72  {.    if( (p->pr
2e10: 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52  ereqRight & notR
2e20: 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20  eady)==0 ){.    
2e30: 20 20 69 66 28 20 70 2d 3e 70 72 65 72 65 71 52    if( p->prereqR
2e40: 69 67 68 74 3d 3d 30 20 26 26 20 28 70 2d 3e 65  ight==0 && (p->e
2e50: 4f 70 65 72 61 74 6f 72 26 6f 70 29 21 3d 30 20  Operator&op)!=0 
2e60: 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  ){.        testc
2e70: 61 73 65 28 20 70 2d 3e 65 4f 70 65 72 61 74 6f  ase( p->eOperato
2e80: 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20  r & WO_IS );.   
2e90: 20 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20       return p;. 
2ea0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2eb0: 20 70 52 65 73 75 6c 74 3d 3d 30 20 29 20 70 52   pResult==0 ) pR
2ec0: 65 73 75 6c 74 20 3d 20 70 3b 0a 20 20 20 20 7d  esult = p;.    }
2ed0: 0a 20 20 20 20 70 20 3d 20 77 68 65 72 65 53 63  .    p = whereSc
2ee0: 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 3b 0a 20  anNext(&scan);. 
2ef0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 73   }.  return pRes
2f00: 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ult;.}../*.** Th
2f10: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72  is function sear
2f20: 63 68 65 73 20 70 4c 69 73 74 20 66 6f 72 20 61  ches pList for a
2f30: 6e 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74  n entry that mat
2f40: 63 68 65 73 20 74 68 65 20 69 43 6f 6c 2d 74 68  ches the iCol-th
2f50: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69 6e   column.** of in
2f60: 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20  dex pIdx..**.** 
2f70: 49 66 20 73 75 63 68 20 61 6e 20 65 78 70 72 65  If such an expre
2f80: 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20  ssion is found, 
2f90: 69 74 73 20 69 6e 64 65 78 20 69 6e 20 70 4c 69  its index in pLi
2fa0: 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75 72  st->a[] is retur
2fb0: 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78  ned. If.** no ex
2fc0: 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e  pression is foun
2fd0: 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65  d, -1 is returne
2fe0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2ff0: 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20   findIndexCol(. 
3000: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
3010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3020: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
3030: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
3040: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  *pList,         
3050: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
3060: 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65 61  sion list to sea
3070: 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61  rch */.  int iBa
3080: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
3090: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
30a0: 6f 72 20 66 6f 72 20 74 61 62 6c 65 20 61 73 73  or for table ass
30b0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49 64  ociated with pId
30c0: 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  x */.  Index *pI
30d0: 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
30e0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
30f0: 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20  to match column 
3100: 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  of */.  int iCol
3110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3120: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
3130: 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d 61  n of index to ma
3140: 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tch */.){.  int 
3150: 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  i;.  const char 
3160: 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61  *zColl = pIdx->a
3170: 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20  zColl[iCol];..  
3180: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
3190: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
31a0: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c     Expr *p = sql
31b0: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
31c0: 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ate(pList->a[i].
31d0: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
31e0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
31f0: 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c  .     && p->iCol
3200: 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  umn==pIdx->aiCol
3210: 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26  umn[iCol].     &
3220: 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61  & p->iTable==iBa
3230: 73 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  se.    ){.      
3240: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
3250: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
3260: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73  Seq(pParse, pLis
3270: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
3280: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20        if( pColl 
3290: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
32a0: 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
32b0: 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, zColl) ){.   
32c0: 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20       return i;. 
32d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
32e0: 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  ..  return -1;.}
32f0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
3300: 52 55 45 20 69 66 20 74 68 65 20 69 43 6f 6c 2d  RUE if the iCol-
3310: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64  th column of ind
3320: 65 78 20 70 49 64 78 20 69 73 20 4e 4f 54 20 4e  ex pIdx is NOT N
3330: 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ULL.*/.static in
3340: 74 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74  t indexColumnNot
3350: 4e 75 6c 6c 28 49 6e 64 65 78 20 2a 70 49 64 78  Null(Index *pIdx
3360: 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 69  , int iCol){.  i
3370: 6e 74 20 6a 3b 0a 20 20 61 73 73 65 72 74 28 20  nt j;.  assert( 
3380: 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 61 73 73  pIdx!=0 );.  ass
3390: 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20  ert( iCol>=0 && 
33a0: 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  iCol<pIdx->nColu
33b0: 6d 6e 20 29 3b 0a 20 20 6a 20 3d 20 70 49 64 78  mn );.  j = pIdx
33c0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d  ->aiColumn[iCol]
33d0: 3b 0a 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a  ;.  if( j>=0 ){.
33e0: 20 20 20 20 72 65 74 75 72 6e 20 70 49 64 78 2d      return pIdx-
33f0: 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 6a 5d  >pTable->aCol[j]
3400: 2e 6e 6f 74 4e 75 6c 6c 3b 0a 20 20 7d 65 6c 73  .notNull;.  }els
3410: 65 20 69 66 28 20 6a 3d 3d 28 2d 31 29 20 29 7b  e if( j==(-1) ){
3420: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
3430: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
3440: 72 74 28 20 6a 3d 3d 28 2d 32 29 20 29 3b 0a 20  rt( j==(-2) );. 
3450: 20 20 20 72 65 74 75 72 6e 20 21 73 71 6c 69 74     return !sqlit
3460: 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28  e3ExprCanBeNull(
3470: 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e  pIdx->aColExpr->
3480: 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a  a[iCol].pExpr);.
3490: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
34a0: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
34b0: 44 49 53 54 49 4e 43 54 20 65 78 70 72 65 73 73  DISTINCT express
34c0: 69 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64 20  ion-list passed 
34d0: 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67  as the third arg
34e0: 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75  ument.** is redu
34f0: 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 44  ndant..**.** A D
3500: 49 53 54 49 4e 43 54 20 6c 69 73 74 20 69 73 20  ISTINCT list is 
3510: 72 65 64 75 6e 64 61 6e 74 20 69 66 20 61 6e 79  redundant if any
3520: 20 73 75 62 73 65 74 20 6f 66 20 74 68 65 20 63   subset of the c
3530: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 2a 2a  olumns in the.**
3540: 20 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20 61   DISTINCT list a
3550: 72 65 20 63 6f 6c 6c 65 63 74 69 76 65 6c 79 20  re collectively 
3560: 75 6e 69 71 75 65 20 61 6e 64 20 69 6e 64 69 76  unique and indiv
3570: 69 64 75 61 6c 6c 79 20 6e 6f 6e 2d 6e 75 6c 6c  idually non-null
3580: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3590: 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64  isDistinctRedund
35a0: 61 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ant(.  Parse *pP
35b0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
35c0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
35d0: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
35e0: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20   *pTabList,     
35f0: 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
3600: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
3610: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
3620: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
3630: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
3640: 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63  prList *pDistinc
3650: 74 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72  t       /* The r
3660: 65 73 75 6c 74 20 73 65 74 20 74 68 61 74 20 6e  esult set that n
3670: 65 65 64 73 20 74 6f 20 62 65 20 44 49 53 54 49  eeds to be DISTI
3680: 4e 43 54 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  NCT */.){.  Tabl
3690: 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78  e *pTab;.  Index
36a0: 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b   *pIdx;.  int i;
36b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36c0: 20 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74            .  int
36d0: 20 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66   iBase;..  /* If
36e0: 20 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74   there is more t
36f0: 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72  han one table or
3700: 20 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 20 74   sub-select in t
3710: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
3720: 66 0a 20 20 2a 2a 20 74 68 69 73 20 71 75 65 72  f.  ** this quer
3730: 79 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20  y, then it will 
3740: 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  not be possible 
3750: 74 6f 20 73 68 6f 77 20 74 68 61 74 20 74 68 65  to show that the
3760: 20 44 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20   DISTINCT .  ** 
3770: 63 6c 61 75 73 65 20 69 73 20 72 65 64 75 6e 64  clause is redund
3780: 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54  ant. */.  if( pT
3790: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20  abList->nSrc!=1 
37a0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 42  ) return 0;.  iB
37b0: 61 73 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  ase = pTabList->
37c0: 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  a[0].iCursor;.  
37d0: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
37e0: 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f  >a[0].pTab;..  /
37f0: 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20  * If any of the 
3800: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 73 20 61  expressions is a
3810: 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20  n IPK column on 
3820: 74 61 62 6c 65 20 69 42 61 73 65 2c 20 74 68 65  table iBase, the
3830: 6e 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74  n return .  ** t
3840: 72 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28  rue. Note: The (
3850: 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65  p->iTable==iBase
3860: 29 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74  ) part of this t
3870: 65 73 74 20 6d 61 79 20 62 65 20 66 61 6c 73 65  est may be false
3880: 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72   if the.  ** cur
3890: 72 65 6e 74 20 53 45 4c 45 43 54 20 69 73 20 61  rent SELECT is a
38a0: 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d   correlated sub-
38b0: 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f  query..  */.  fo
38c0: 72 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e  r(i=0; i<pDistin
38d0: 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ct->nExpr; i++){
38e0: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73  .    Expr *p = s
38f0: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
3900: 6c 6c 61 74 65 28 70 44 69 73 74 69 6e 63 74 2d  llate(pDistinct-
3910: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
3920: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
3930: 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61  COLUMN && p->iTa
3940: 62 6c 65 3d 3d 69 42 61 73 65 20 26 26 20 70 2d  ble==iBase && p-
3950: 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74  >iColumn<0 ) ret
3960: 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 1;.  }..  /*
3970: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c   Loop through al
3980: 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65  l indices on the
3990: 20 74 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e 67   table, checking
39a0: 20 65 61 63 68 20 74 6f 20 73 65 65 20 69 66 20   each to see if 
39b0: 69 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74 68  it makes.  ** th
39c0: 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69  e DISTINCT quali
39d0: 66 69 65 72 20 72 65 64 75 6e 64 61 6e 74 2e 20  fier redundant. 
39e0: 49 74 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a 20  It does so if:. 
39f0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54 68   **.  **   1. Th
3a00: 65 20 69 6e 64 65 78 20 69 73 20 69 74 73 65 6c  e index is itsel
3a10: 66 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20 20  f UNIQUE, and.  
3a20: 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c 6c  **.  **   2. All
3a30: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   of the columns 
3a40: 69 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72 65  in the index are
3a50: 20 65 69 74 68 65 72 20 70 61 72 74 20 6f 66 20   either part of 
3a60: 74 68 65 20 70 44 69 73 74 69 6e 63 74 0a 20 20  the pDistinct.  
3a70: 2a 2a 20 20 20 20 20 20 6c 69 73 74 2c 20 6f 72  **      list, or
3a80: 20 65 6c 73 65 20 74 68 65 20 57 48 45 52 45 20   else the WHERE 
3a90: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
3aa0: 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f  a term of the fo
3ab0: 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a  rm "col=X",.  **
3ac0: 20 20 20 20 20 20 77 68 65 72 65 20 58 20 69 73        where X is
3ad0: 20 61 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75   a constant valu
3ae0: 65 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  e. The collation
3af0: 20 73 65 71 75 65 6e 63 65 73 20 6f 66 20 74 68   sequences of th
3b00: 65 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d 70  e.  **      comp
3b10: 61 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65 63  arison and selec
3b20: 74 2d 6c 69 73 74 20 65 78 70 72 65 73 73 69 6f  t-list expressio
3b30: 6e 73 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68  ns must match th
3b40: 6f 73 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ose of the index
3b50: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e  ..  **.  **   3.
3b60: 20 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69 6e   All of those in
3b70: 64 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20  dex columns for 
3b80: 77 68 69 63 68 20 74 68 65 20 57 48 45 52 45 20  which the WHERE 
3b90: 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 0a  clause does not.
3ba0: 20 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69    **      contai
3bb0: 6e 20 61 20 22 63 6f 6c 3d 58 22 20 74 65 72 6d  n a "col=X" term
3bc0: 20 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20   are subject to 
3bd0: 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  a NOT NULL const
3be0: 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f  raint..  */.  fo
3bf0: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
3c00: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
3c10: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
3c20: 20 20 69 66 28 20 21 49 73 55 6e 69 71 75 65 49    if( !IsUniqueI
3c30: 6e 64 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e  ndex(pIdx) ) con
3c40: 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69  tinue;.    for(i
3c50: 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65 79  =0; i<pIdx->nKey
3c60: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
3c70: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 57   if( 0==sqlite3W
3c80: 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43  hereFindTerm(pWC
3c90: 2c 20 69 42 61 73 65 2c 20 69 2c 20 7e 28 42 69  , iBase, i, ~(Bi
3ca0: 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20  tmask)0, WO_EQ, 
3cb0: 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20  pIdx) ){.       
3cc0: 20 69 66 28 20 66 69 6e 64 49 6e 64 65 78 43 6f   if( findIndexCo
3cd0: 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69  l(pParse, pDisti
3ce0: 6e 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64 78  nct, iBase, pIdx
3cf0: 2c 20 69 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a  , i)<0 ) break;.
3d00: 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 64 65          if( inde
3d10: 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 70  xColumnNotNull(p
3d20: 49 64 78 2c 20 69 29 3d 3d 30 20 29 20 62 72 65  Idx, i)==0 ) bre
3d30: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
3d40: 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 49 64  }.    if( i==pId
3d50: 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20  x->nKeyCol ){.  
3d60: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65      /* This inde
3d70: 78 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74  x implies that t
3d80: 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c  he DISTINCT qual
3d90: 69 66 69 65 72 20 69 73 20 72 65 64 75 6e 64 61  ifier is redunda
3da0: 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  nt. */.      ret
3db0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
3dc0: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
3dd0: 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  ../*.** Estimate
3de0: 20 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f   the logarithm o
3df0: 66 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75  f the input valu
3e00: 65 20 74 6f 20 62 61 73 65 20 32 2e 0a 2a 2f 0a  e to base 2..*/.
3e10: 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20 65 73  static LogEst es
3e20: 74 4c 6f 67 28 4c 6f 67 45 73 74 20 4e 29 7b 0a  tLog(LogEst N){.
3e30: 20 20 72 65 74 75 72 6e 20 4e 3c 3d 31 30 20 3f    return N<=10 ?
3e40: 20 30 20 3a 20 73 71 6c 69 74 65 33 4c 6f 67 45   0 : sqlite3LogE
3e50: 73 74 28 4e 29 20 2d 20 33 33 3b 0a 7d 0a 0a 2f  st(N) - 33;.}../
3e60: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4f 50 5f  *.** Convert OP_
3e70: 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 73 20 74  Column opcodes t
3e80: 6f 20 4f 50 5f 43 6f 70 79 20 69 6e 20 70 72 65  o OP_Copy in pre
3e90: 76 69 6f 75 73 6c 79 20 67 65 6e 65 72 61 74 65  viously generate
3ea0: 64 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  d code..**.** Th
3eb0: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
3ec0: 6f 76 65 72 20 67 65 6e 65 72 61 74 65 64 20 56  over generated V
3ed0: 44 42 45 20 63 6f 64 65 20 61 6e 64 20 74 72 61  DBE code and tra
3ee0: 6e 73 6c 61 74 65 73 20 4f 50 5f 43 6f 6c 75 6d  nslates OP_Colum
3ef0: 6e 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 69 6e 74  n.** opcodes int
3f00: 6f 20 4f 50 5f 43 6f 70 79 2c 20 61 6e 64 20 4f  o OP_Copy, and O
3f10: 50 5f 52 6f 77 69 64 20 69 6e 74 6f 20 4f 50 5f  P_Rowid into OP_
3f20: 4e 75 6c 6c 2c 20 77 68 65 6e 20 74 68 65 20 74  Null, when the t
3f30: 61 62 6c 65 20 69 73 20 62 65 69 6e 67 0a 2a 2a  able is being.**
3f40: 20 61 63 63 65 73 73 65 64 20 76 69 61 20 63 6f   accessed via co
3f50: 2d 72 6f 75 74 69 6e 65 20 69 6e 73 74 65 61 64  -routine instead
3f60: 20 6f 66 20 76 69 61 20 74 61 62 6c 65 20 6c 6f   of via table lo
3f70: 6f 6b 75 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  okup..*/.static 
3f80: 76 6f 69 64 20 74 72 61 6e 73 6c 61 74 65 43 6f  void translateCo
3f90: 6c 75 6d 6e 54 6f 43 6f 70 79 28 0a 20 20 56 64  lumnToCopy(.  Vd
3fa0: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
3fb0: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 6f    /* The VDBE co
3fc0: 6e 74 61 69 6e 69 6e 67 20 63 6f 64 65 20 74 6f  ntaining code to
3fd0: 20 74 72 61 6e 73 6c 61 74 65 20 2a 2f 0a 20 20   translate */.  
3fe0: 69 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20  int iStart,     
3ff0: 20 20 20 20 2f 2a 20 54 72 61 6e 73 6c 61 74 65      /* Translate
4000: 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 63 6f 64   from this opcod
4010: 65 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a  e to the end */.
4020: 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20    int iTabCur,  
4030: 20 20 20 20 20 20 2f 2a 20 4f 50 5f 43 6f 6c 75        /* OP_Colu
4040: 6d 6e 2f 4f 50 5f 52 6f 77 69 64 20 72 65 66 65  mn/OP_Rowid refe
4050: 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74  rences to this t
4060: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  able */.  int iR
4070: 65 67 69 73 74 65 72 20 20 20 20 20 20 20 2f 2a  egister       /*
4080: 20 54 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d   The first colum
4090: 6e 20 69 73 20 69 6e 20 74 68 69 73 20 72 65 67  n is in this reg
40a0: 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 56 64  ister */.){.  Vd
40b0: 62 65 4f 70 20 2a 70 4f 70 20 3d 20 73 71 6c 69  beOp *pOp = sqli
40c0: 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
40d0: 69 53 74 61 72 74 29 3b 0a 20 20 69 6e 74 20 69  iStart);.  int i
40e0: 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
40f0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
4100: 0a 20 20 66 6f 72 28 3b 20 69 53 74 61 72 74 3c  .  for(; iStart<
4110: 69 45 6e 64 3b 20 69 53 74 61 72 74 2b 2b 2c 20  iEnd; iStart++, 
4120: 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  pOp++){.    if( 
4130: 70 4f 70 2d 3e 70 31 21 3d 69 54 61 62 43 75 72  pOp->p1!=iTabCur
4140: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
4150: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
4160: 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20  ==OP_Column ){. 
4170: 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
4180: 20 3d 20 4f 50 5f 43 6f 70 79 3b 0a 20 20 20 20   = OP_Copy;.    
4190: 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4f 70 2d    pOp->p1 = pOp-
41a0: 3e 70 32 20 2b 20 69 52 65 67 69 73 74 65 72 3b  >p2 + iRegister;
41b0: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d  .      pOp->p2 =
41c0: 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20   pOp->p3;.      
41d0: 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20  pOp->p3 = 0;.   
41e0: 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
41f0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64  opcode==OP_Rowid
4200: 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 6f   ){.      pOp->o
4210: 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b  pcode = OP_Null;
4220: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d  .      pOp->p1 =
4230: 20 30 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70   0;.      pOp->p
4240: 33 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  3 = 0;.    }.  }
4250: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f  .}../*.** Two ro
4260: 75 74 69 6e 65 73 20 66 6f 72 20 70 72 69 6e 74  utines for print
4270: 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ing the content 
4280: 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e  of an sqlite3_in
4290: 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75  dex_info.** stru
42a0: 63 74 75 72 65 2e 20 20 55 73 65 64 20 66 6f 72  cture.  Used for
42b0: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
42c0: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66  ugging only.  If
42d0: 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49   neither.** SQLI
42e0: 54 45 5f 54 45 53 54 20 6f 72 20 53 51 4c 49 54  TE_TEST or SQLIT
42f0: 45 5f 44 45 42 55 47 20 61 72 65 20 64 65 66 69  E_DEBUG are defi
4300: 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 73 65 20  ned, then these 
4310: 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20  routines.** are 
4320: 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21  no-ops..*/.#if !
4330: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
4340: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
4350: 29 20 26 26 20 64 65 66 69 6e 65 64 28 57 48 45  ) && defined(WHE
4360: 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29  RETRACE_ENABLED)
4370: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41  .static void TRA
4380: 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 73 71  CE_IDX_INPUTS(sq
4390: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
43a0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
43b0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65   if( !sqlite3Whe
43c0: 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e  reTrace ) return
43d0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
43e0: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
43f0: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
4400: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 63  DebugPrintf("  c
4410: 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63  onstraint[%d]: c
4420: 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25 64 20  ol=%d termid=%d 
4430: 6f 70 3d 25 64 20 75 73 61 62 6c 65 64 3d 25 64  op=%d usabled=%d
4440: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
4450: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
4460: 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c  aint[i].iColumn,
4470: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
4480: 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f  traint[i].iTermO
4490: 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 70 2d  ffset,.       p-
44a0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
44b0: 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  op,.       p->aC
44c0: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61  onstraint[i].usa
44d0: 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  ble);.  }.  for(
44e0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72  i=0; i<p->nOrder
44f0: 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  By; i++){.    sq
4500: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
4510: 28 22 20 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a  ("  orderby[%d]:
4520: 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c   col=%d desc=%d\
4530: 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20  n",.       i,.  
4540: 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79       p->aOrderBy
4550: 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  [i].iColumn,.   
4560: 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b      p->aOrderBy[
4570: 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a  i].desc);.  }.}.
4580: 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43  static void TRAC
4590: 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 73 71  E_IDX_OUTPUTS(sq
45a0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
45b0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
45c0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65   if( !sqlite3Whe
45d0: 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e  reTrace ) return
45e0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
45f0: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
4600: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
4610: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 75  DebugPrintf("  u
4620: 73 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49 64  sage[%d]: argvId
4630: 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c  x=%d omit=%d\n",
4640: 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20  .       i,.     
4650: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
4660: 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64  Usage[i].argvInd
4670: 65 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  ex,.       p->aC
4680: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
4690: 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73  ].omit);.  }.  s
46a0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
46b0: 66 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e  f("  idxNum=%d\n
46c0: 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20  ", p->idxNum);. 
46d0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
46e0: 6e 74 66 28 22 20 20 69 64 78 53 74 72 3d 25 73  ntf("  idxStr=%s
46f0: 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b  \n", p->idxStr);
4700: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
4710: 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42 79  rintf("  orderBy
4720: 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20  Consumed=%d\n", 
4730: 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  p->orderByConsum
4740: 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  ed);.  sqlite3De
4750: 62 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74  bugPrintf("  est
4760: 69 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22  imatedCost=%g\n"
4770: 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  , p->estimatedCo
4780: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  st);.  sqlite3De
4790: 62 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74  bugPrintf("  est
47a0: 69 6d 61 74 65 64 52 6f 77 73 3d 25 6c 6c 64 5c  imatedRows=%lld\
47b0: 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64  n", p->estimated
47c0: 52 6f 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  Rows);.}.#else.#
47d0: 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58  define TRACE_IDX
47e0: 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66 69  _INPUTS(A).#defi
47f0: 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54  ne TRACE_IDX_OUT
4800: 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a  PUTS(A).#endif..
4810: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4820: 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
4830: 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  DEX./*.** Return
4840: 20 54 52 55 45 20 69 66 20 74 68 65 20 57 48 45   TRUE if the WHE
4850: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70  RE clause term p
4860: 54 65 72 6d 20 69 73 20 6f 66 20 61 20 66 6f 72  Term is of a for
4870: 6d 20 77 68 65 72 65 20 69 74 0a 2a 2a 20 63 6f  m where it.** co
4880: 75 6c 64 20 62 65 20 75 73 65 64 20 77 69 74 68  uld be used with
4890: 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 61 63 63   an index to acc
48a0: 65 73 73 20 70 53 72 63 2c 20 61 73 73 75 6d 69  ess pSrc, assumi
48b0: 6e 67 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ng an appropriat
48c0: 65 0a 2a 2a 20 69 6e 64 65 78 20 65 78 69 73 74  e.** index exist
48d0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
48e0: 74 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  t termCanDriveIn
48f0: 64 65 78 28 0a 20 20 57 68 65 72 65 54 65 72 6d  dex(.  WhereTerm
4900: 20 2a 70 54 65 72 6d 2c 20 20 20 20 20 20 20 20   *pTerm,        
4910: 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63        /* WHERE c
4920: 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 63 68  lause term to ch
4930: 65 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  eck */.  struct 
4940: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
4950: 72 63 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  rc,     /* Table
4960: 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74   we are trying t
4970: 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 42 69  o access */.  Bi
4980: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20  tmask notReady  
4990: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
49a0: 54 61 62 6c 65 73 20 69 6e 20 6f 75 74 65 72 20  Tables in outer 
49b0: 6c 6f 6f 70 73 20 6f 66 20 74 68 65 20 6a 6f 69  loops of the joi
49c0: 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 61  n */.){.  char a
49d0: 66 66 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d  ff;.  if( pTerm-
49e0: 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 70 53 72  >leftCursor!=pSr
49f0: 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 72 65 74  c->iCursor ) ret
4a00: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54  urn 0;.  if( (pT
4a10: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
4a20: 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 3d   (WO_EQ|WO_IS))=
4a30: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
4a40: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
4a50: 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65  reqRight & notRe
4a60: 61 64 79 29 21 3d 30 20 29 20 72 65 74 75 72 6e  ady)!=0 ) return
4a70: 20 30 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d   0;.  if( pTerm-
4a80: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3c 30 20  >u.leftColumn<0 
4a90: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 66  ) return 0;.  af
4aa0: 66 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e  f = pSrc->pTab->
4ab0: 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65  aCol[pTerm->u.le
4ac0: 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69  ftColumn].affini
4ad0: 74 79 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74  ty;.  if( !sqlit
4ae0: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f  e3IndexAffinityO
4af0: 6b 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  k(pTerm->pExpr, 
4b00: 61 66 66 29 20 29 20 72 65 74 75 72 6e 20 30 3b  aff) ) return 0;
4b10: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65  .  testcase( pTe
4b20: 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rm->pExpr->op==T
4b30: 4b 5f 49 53 20 29 3b 0a 20 20 72 65 74 75 72 6e  K_IS );.  return
4b40: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23   1;.}.#endif...#
4b50: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4b60: 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
4b70: 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  EX./*.** Generat
4b80: 65 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73 74 72  e code to constr
4b90: 75 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62  uct the Index ob
4ba0: 6a 65 63 74 20 66 6f 72 20 61 6e 20 61 75 74 6f  ject for an auto
4bb0: 6d 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a 20 61  matic index.** a
4bc0: 6e 64 20 74 6f 20 73 65 74 20 75 70 20 74 68 65  nd to set up the
4bd0: 20 57 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65   WhereLevel obje
4be0: 63 74 20 70 4c 65 76 65 6c 20 73 6f 20 74 68 61  ct pLevel so tha
4bf0: 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  t the code gener
4c00: 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20 75 73  ator.** makes us
4c10: 65 20 6f 66 20 74 68 65 20 61 75 74 6f 6d 61 74  e of the automat
4c20: 69 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ic index..*/.sta
4c30: 74 69 63 20 76 6f 69 64 20 63 6f 6e 73 74 72 75  tic void constru
4c40: 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78  ctAutomaticIndex
4c50: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
4c60: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
4c70: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
4c80: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
4c90: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
4ca0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
4cb0: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
4cc0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
4cd0: 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20  item *pSrc,  /* 
4ce0: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
4cf0: 74 65 72 6d 20 74 6f 20 67 65 74 20 74 68 65 20  term to get the 
4d00: 6e 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  next index */.  
4d10: 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
4d20: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ,           /* M
4d30: 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74  ask of cursors t
4d40: 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69  hat are not avai
4d50: 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65  lable */.  Where
4d60: 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20 20  Level *pLevel   
4d70: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
4d80: 6e 65 77 20 69 6e 64 65 78 20 68 65 72 65 20 2a  new index here *
4d90: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 4b 65 79 43  /.){.  int nKeyC
4da0: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
4db0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4dc0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63  columns in the c
4dd0: 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 64 65 78  onstructed index
4de0: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
4df0: 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
4e00: 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65    /* A single te
4e10: 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
4e20: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
4e30: 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20  eTerm *pWCEnd;  
4e40: 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
4e50: 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20  f pWC->a[] */.  
4e60: 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
4e70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4e80: 62 6a 65 63 74 20 64 65 73 63 72 69 62 69 6e 67  bject describing
4e90: 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 69   the transient i
4ea0: 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ndex */.  Vdbe *
4eb0: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
4ec0: 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65        /* Prepare
4ed0: 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65  d statement unde
4ee0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
4ef0: 2f 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 69 74  /.  int addrInit
4f00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4f10: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
4f20: 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
4f30: 20 62 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f 0a   bypass jump */.
4f40: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b    Table *pTable;
4f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4f60: 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   The table being
4f70: 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
4f80: 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20  t addrTop;      
4f90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70            /* Top
4fa0: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 66 69   of the index fi
4fb0: 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  ll loop */.  int
4fc0: 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20   regRecord;     
4fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
4fe0: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 6e 20  ster holding an 
4ff0: 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a  index record */.
5000: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
5010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5020: 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e 74 65 72 20   Column counter 
5030: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
5040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5050: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
5060: 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 42 69 74 43   */.  int mxBitC
5070: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
5080: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 6c    /* Maximum col
5090: 75 6d 6e 20 69 6e 20 70 53 72 63 2d 3e 63 6f 6c  umn in pSrc->col
50a0: 55 73 65 64 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65  Used */.  CollSe
50b0: 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  q *pColl;       
50c0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
50d0: 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 6f  ng sequence to o
50e0: 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  n a column */.  
50f0: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
5100: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
5110: 68 65 20 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a  he Loop object *
5120: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 6f 74 55 73  /.  char *zNotUs
5130: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
5140: 2f 2a 20 45 78 74 72 61 20 73 70 61 63 65 20 6f  /* Extra space o
5150: 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 70 49 64  n the end of pId
5160: 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69  x */.  Bitmask i
5170: 64 78 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20  dxCols;         
5180: 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20     /* Bitmap of 
5190: 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f 72  columns used for
51a0: 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42   indexing */.  B
51b0: 69 74 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c 73  itmask extraCols
51c0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69  ;          /* Bi
51d0: 74 6d 61 70 20 6f 66 20 61 64 64 69 74 69 6f 6e  tmap of addition
51e0: 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  al columns */.  
51f0: 75 38 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d  u8 sentWarning =
5200: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   0;         /* T
5210: 72 75 65 20 69 66 20 61 20 77 61 72 6e 6e 69 6e  rue if a warnnin
5220: 67 20 68 61 73 20 62 65 65 6e 20 69 73 73 75 65  g has been issue
5230: 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 50 61  d */.  Expr *pPa
5240: 72 74 69 61 6c 20 3d 20 30 3b 20 20 20 20 20 20  rtial = 0;      
5250: 20 20 20 2f 2a 20 50 61 72 74 69 61 6c 20 49 6e     /* Partial In
5260: 64 65 78 20 45 78 70 72 65 73 73 69 6f 6e 20 2a  dex Expression *
5270: 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  /.  int iContinu
5280: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
5290: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
52a0: 73 6b 69 70 20 65 78 63 6c 75 64 65 64 20 72 6f  skip excluded ro
52b0: 77 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ws */.  struct S
52c0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61  rcList_item *pTa
52d0: 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20  bItem;  /* FROM 
52e0: 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e  clause term bein
52f0: 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20  g indexed */..  
5300: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
5310: 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 74 68   to skip over th
5320: 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 69  e creation and i
5330: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66  nitialization of
5340: 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 69   the.  ** transi
5350: 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e 64  ent index on 2nd
5360: 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20   and subsequent 
5370: 69 74 65 72 61 74 69 6f 6e 73 20 6f 66 20 74 68  iterations of th
5380: 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d  e loop. */.  v =
5390: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
53a0: 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
53b0: 3b 0a 20 20 61 64 64 72 49 6e 69 74 20 3d 20 73  ;.  addrInit = s
53c0: 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70  qlite3CodeOnce(p
53d0: 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65  Parse); VdbeCove
53e0: 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 43  rage(v);..  /* C
53f0: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
5400: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
5410: 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f  will be added to
5420: 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
5430: 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63  and used to matc
5440: 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  h WHERE clause c
5450: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
5460: 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 70  nKeyCol = 0;.  p
5470: 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54  Table = pSrc->pT
5480: 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26  ab;.  pWCEnd = &
5490: 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
54a0: 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  m];.  pLoop = pL
54b0: 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
54c0: 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66  idxCols = 0;.  f
54d0: 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
54e0: 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
54f0: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Term++){.    Exp
5500: 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
5510: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ->pExpr;.    ass
5520: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
5530: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
5540: 46 72 6f 6d 4a 6f 69 6e 29 20 20 20 20 2f 2a 20  FromJoin)    /* 
5550: 70 72 65 72 65 71 20 61 6c 77 61 79 73 20 6e 6f  prereq always no
5560: 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20  n-zero */.      
5570: 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69     || pExpr->iRi
5580: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 70 53  ghtJoinTable!=pS
5590: 72 63 2d 3e 69 43 75 72 73 6f 72 20 20 20 2f 2a  rc->iCursor   /*
55a0: 20 20 20 66 6f 72 20 74 68 65 20 72 69 67 68 74     for the right
55b0: 2d 68 61 6e 64 20 20 20 2a 2f 0a 20 20 20 20 20  -hand   */.     
55c0: 20 20 20 20 7c 7c 20 70 4c 6f 6f 70 2d 3e 70 72      || pLoop->pr
55d0: 65 72 65 71 21 3d 30 20 29 3b 20 20 20 20 20 20  ereq!=0 );      
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
55f0: 2a 20 20 20 74 61 62 6c 65 20 6f 66 20 61 20 4c  *   table of a L
5600: 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 20 20  EFT JOIN */.    
5610: 69 66 28 20 70 4c 6f 6f 70 2d 3e 70 72 65 72 65  if( pLoop->prere
5620: 71 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  q==0.     && (pT
5630: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
5640: 45 52 4d 5f 56 49 52 54 55 41 4c 29 3d 3d 30 0a  ERM_VIRTUAL)==0.
5650: 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61 73       && !ExprHas
5660: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
5670: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20  EP_FromJoin).   
5680: 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
5690: 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28  IsTableConstant(
56a0: 70 45 78 70 72 2c 20 70 53 72 63 2d 3e 69 43 75  pExpr, pSrc->iCu
56b0: 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 70  rsor) ){.      p
56c0: 50 61 72 74 69 61 6c 20 3d 20 73 71 6c 69 74 65  Partial = sqlite
56d0: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
56e0: 3e 64 62 2c 20 70 50 61 72 74 69 61 6c 2c 0a 20  >db, pPartial,. 
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
5710: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
5720: 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c  arse->db, pExpr,
5730: 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   0));.    }.    
5740: 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65  if( termCanDrive
5750: 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72  Index(pTerm, pSr
5760: 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a  c, notReady) ){.
5770: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
5780: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
5790: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d  lumn;.      Bitm
57a0: 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c  ask cMask = iCol
57b0: 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28  >=BMS ? MASKBIT(
57c0: 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54  BMS-1) : MASKBIT
57d0: 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65  (iCol);.      te
57e0: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d  stcase( iCol==BM
57f0: 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
5800: 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31  ase( iCol==BMS-1
5810: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73   );.      if( !s
5820: 65 6e 74 57 61 72 6e 69 6e 67 20 29 7b 0a 20 20  entWarning ){.  
5830: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
5840: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
5850: 5f 41 55 54 4f 49 4e 44 45 58 2c 0a 20 20 20 20  _AUTOINDEX,.    
5860: 20 20 20 20 20 20 20 20 22 61 75 74 6f 6d 61 74          "automat
5870: 69 63 20 69 6e 64 65 78 20 6f 6e 20 25 73 28 25  ic index on %s(%
5880: 73 29 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  s)", pTable->zNa
5890: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
58a0: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f  pTable->aCol[iCo
58b0: 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l].zName);.     
58c0: 20 20 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d     sentWarning =
58d0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
58e0: 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26    if( (idxCols &
58f0: 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20   cMask)==0 ){.  
5900: 20 20 20 20 20 20 69 66 28 20 77 68 65 72 65 4c        if( whereL
5910: 6f 6f 70 52 65 73 69 7a 65 28 70 50 61 72 73 65  oopResize(pParse
5920: 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e 4b 65  ->db, pLoop, nKe
5930: 79 43 6f 6c 2b 31 29 20 29 7b 0a 20 20 20 20 20  yCol+1) ){.     
5940: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 75       goto end_au
5950: 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3b  to_index_create;
5960: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5970: 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d     pLoop->aLTerm
5980: 5b 6e 4b 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54  [nKeyCol++] = pT
5990: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 64 78  erm;.        idx
59a0: 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20  Cols |= cMask;. 
59b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
59c0: 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 43  .  assert( nKeyC
59d0: 6f 6c 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d  ol>0 );.  pLoop-
59e0: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 70  >u.btree.nEq = p
59f0: 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e  Loop->nLTerm = n
5a00: 4b 65 79 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d  KeyCol;.  pLoop-
5a10: 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
5a20: 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45  _COLUMN_EQ | WHE
5a30: 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48  RE_IDX_ONLY | WH
5a40: 45 52 45 5f 49 4e 44 45 58 45 44 0a 20 20 20 20  ERE_INDEXED.    
5a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a60: 20 7c 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   | WHERE_AUTO_IN
5a70: 44 45 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74  DEX;..  /* Count
5a80: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
5a90: 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
5aa0: 73 20 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61  s needed to crea
5ab0: 74 65 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69  te a.  ** coveri
5ac0: 6e 67 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f  ng index.  A "co
5ad0: 76 65 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73  vering index" is
5ae0: 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63   an index that c
5af0: 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a  ontains all.  **
5b00: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72   columns that ar
5b10: 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20  e needed by the 
5b20: 71 75 65 72 79 2e 20 20 57 69 74 68 20 61 20 63  query.  With a c
5b30: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74  overing index, t
5b40: 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c  he.  ** original
5b50: 20 74 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65   table never nee
5b60: 64 73 20 74 6f 20 62 65 20 61 63 63 65 73 73 65  ds to be accesse
5b70: 64 2e 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e  d.  Automatic in
5b80: 64 69 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20  dices must.  ** 
5b90: 62 65 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  be a covering in
5ba0: 64 65 78 20 62 65 63 61 75 73 65 20 74 68 65 20  dex because the 
5bb0: 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62  index will not b
5bc0: 65 20 75 70 64 61 74 65 64 20 69 66 20 74 68 65  e updated if the
5bd0: 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74  .  ** original t
5be0: 61 62 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64  able changes and
5bf0: 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74   the index and t
5c00: 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68  able cannot both
5c10: 20 62 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66   be used.  ** if
5c20: 20 74 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20   they go out of 
5c30: 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74  sync..  */.  ext
5c40: 72 61 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63  raCols = pSrc->c
5c50: 6f 6c 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f  olUsed & (~idxCo
5c60: 6c 73 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53  ls | MASKBIT(BMS
5c70: 2d 31 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c  -1));.  mxBitCol
5c80: 20 3d 20 4d 49 4e 28 42 4d 53 2d 31 2c 70 54 61   = MIN(BMS-1,pTa
5c90: 62 6c 65 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 74 65  ble->nCol);.  te
5ca0: 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e  stcase( pTable->
5cb0: 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  nCol==BMS-1 );. 
5cc0: 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 6c   testcase( pTabl
5cd0: 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29  e->nCol==BMS-2 )
5ce0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d  ;.  for(i=0; i<m
5cf0: 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  xBitCol; i++){. 
5d00: 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73     if( extraCols
5d10: 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29 20   & MASKBIT(i) ) 
5d20: 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20  nKeyCol++;.  }. 
5d30: 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73   if( pSrc->colUs
5d40: 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53  ed & MASKBIT(BMS
5d50: 2d 31 29 20 29 7b 0a 20 20 20 20 6e 4b 65 79 43  -1) ){.    nKeyC
5d60: 6f 6c 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43  ol += pTable->nC
5d70: 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20  ol - BMS + 1;.  
5d80: 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63  }..  /* Construc
5d90: 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65  t the Index obje
5da0: 63 74 20 74 6f 20 64 65 73 63 72 69 62 65 20 74  ct to describe t
5db0: 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70  his index */.  p
5dc0: 49 64 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c  Idx = sqlite3All
5dd0: 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74  ocateIndexObject
5de0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65  (pParse->db, nKe
5df0: 79 43 6f 6c 2b 31 2c 20 30 2c 20 26 7a 4e 6f 74  yCol+1, 0, &zNot
5e00: 55 73 65 64 29 3b 0a 20 20 69 66 28 20 70 49 64  Used);.  if( pId
5e10: 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 6e 64 5f  x==0 ) goto end_
5e20: 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74  auto_index_creat
5e30: 65 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  e;.  pLoop->u.bt
5e40: 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64  ree.pIndex = pId
5e50: 78 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  x;.  pIdx->zName
5e60: 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b   = "auto-index";
5e70: 0a 20 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20  .  pIdx->pTable 
5e80: 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20  = pTable;.  n = 
5e90: 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30  0;.  idxCols = 0
5ea0: 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  ;.  for(pTerm=pW
5eb0: 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45  C->a; pTerm<pWCE
5ec0: 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
5ed0: 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69    if( termCanDri
5ee0: 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70  veIndex(pTerm, p
5ef0: 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29  Src, notReady) )
5f00: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
5f10: 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
5f20: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69  Column;.      Bi
5f30: 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43  tmask cMask = iC
5f40: 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49  ol>=BMS ? MASKBI
5f50: 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42  T(BMS-1) : MASKB
5f60: 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20  IT(iCol);.      
5f70: 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
5f80: 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74  BMS-1 );.      t
5f90: 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
5fa0: 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  MS );.      if( 
5fb0: 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b  (idxCols & cMask
5fc0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
5fd0: 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
5fe0: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
5ff0: 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73   idxCols |= cMas
6000: 6b 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  k;.        pIdx-
6010: 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70  >aiColumn[n] = p
6020: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
6030: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  mn;.        pCol
6040: 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  l = sqlite3Binar
6050: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
6060: 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66  pParse, pX->pLef
6070: 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a  t, pX->pRight);.
6080: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
6090: 43 6f 6c 6c 5b 6e 5d 20 3d 20 70 43 6f 6c 6c 20  Coll[n] = pColl 
60a0: 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a  ? pColl->zName :
60b0: 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20   "BINARY";.     
60c0: 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a     n++;.      }.
60d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
60e0: 72 74 28 20 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f  rt( (u32)n==pLoo
60f0: 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 29  p->u.btree.nEq )
6100: 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 64 64 69  ;..  /* Add addi
6110: 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e  tional columns n
6120: 65 65 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68  eeded to make th
6130: 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
6140: 78 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63 6f  x into.  ** a co
6150: 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a  vering index */.
6160: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42    for(i=0; i<mxB
6170: 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  itCol; i++){.   
6180: 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26   if( extraCols &
6190: 20 4d 41 53 4b 42 49 54 28 69 29 20 29 7b 0a 20   MASKBIT(i) ){. 
61a0: 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c       pIdx->aiCol
61b0: 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20  umn[n] = i;.    
61c0: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e    pIdx->azColl[n
61d0: 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  ] = "BINARY";.  
61e0: 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20      n++;.    }. 
61f0: 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63   }.  if( pSrc->c
6200: 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54  olUsed & MASKBIT
6210: 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 66  (BMS-1) ){.    f
6220: 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54  or(i=BMS-1; i<pT
6230: 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  able->nCol; i++)
6240: 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69  {.      pIdx->ai
6250: 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20  Column[n] = i;. 
6260: 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
6270: 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b  l[n] = "BINARY";
6280: 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20  .      n++;.    
6290: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
62a0: 6e 3d 3d 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20 20  n==nKeyCol );.  
62b0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
62c0: 5d 20 3d 20 2d 31 3b 0a 20 20 70 49 64 78 2d 3e  ] = -1;.  pIdx->
62d0: 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e  azColl[n] = "BIN
62e0: 41 52 59 22 3b 0a 0a 20 20 2f 2a 20 43 72 65 61  ARY";..  /* Crea
62f0: 74 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  te the automatic
6300: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73 65   index */.  asse
6310: 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  rt( pLevel->iIdx
6320: 43 75 72 3e 3d 30 20 29 3b 0a 20 20 70 4c 65 76  Cur>=0 );.  pLev
6330: 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50  el->iIdxCur = pP
6340: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
6350: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6360: 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f  2(v, OP_OpenAuto
6370: 69 6e 64 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69  index, pLevel->i
6380: 49 64 78 43 75 72 2c 20 6e 4b 65 79 43 6f 6c 2b  IdxCur, nKeyCol+
6390: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
63a0: 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50  eSetP4KeyInfo(pP
63b0: 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 56  arse, pIdx);.  V
63c0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
63d0: 66 6f 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d  for %s", pTable-
63e0: 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20  >zName));..  /* 
63f0: 46 69 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74  Fill the automat
6400: 69 63 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f  ic index with co
6410: 6e 74 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ntent */.  sqlit
6420: 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
6430: 70 50 61 72 73 65 29 3b 0a 20 20 70 54 61 62 49  pParse);.  pTabI
6440: 74 65 6d 20 3d 20 26 70 57 43 2d 3e 70 57 49 6e  tem = &pWC->pWIn
6450: 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
6460: 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
6470: 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e    if( pTabItem->
6480: 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  fg.viaCoroutine 
6490: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 59 69  ){.    int regYi
64a0: 65 6c 64 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  eld = pTabItem->
64b0: 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 73  regReturn;.    s
64c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
64d0: 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
64e0: 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c 20  tine, regYield, 
64f0: 30 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64 64  0, pTabItem->add
6500: 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 61  rFillSub);.    a
6510: 64 64 72 54 6f 70 20 3d 20 20 73 71 6c 69 74 65  ddrTop =  sqlite
6520: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
6530: 50 5f 59 69 65 6c 64 2c 20 72 65 67 59 69 65 6c  P_Yield, regYiel
6540: 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  d);.    VdbeCove
6550: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62  rage(v);.    Vdb
6560: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65  eComment((v, "ne
6570: 78 74 20 72 6f 77 20 6f 66 20 5c 22 25 73 5c 22  xt row of \"%s\"
6580: 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61  ", pTabItem->pTa
6590: 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 65  b->zName));.  }e
65a0: 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 54 6f 70  lse{.    addrTop
65b0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
65c0: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp1(v, OP_Rewin
65d0: 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  d, pLevel->iTabC
65e0: 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ur); VdbeCoverag
65f0: 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  e(v);.  }.  if( 
6600: 70 50 61 72 74 69 61 6c 20 29 7b 0a 20 20 20 20  pPartial ){.    
6610: 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69  iContinue = sqli
6620: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
6630: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
6640: 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
6650: 73 65 2c 20 70 50 61 72 74 69 61 6c 2c 20 69 43  se, pPartial, iC
6660: 6f 6e 74 69 6e 75 65 2c 20 53 51 4c 49 54 45 5f  ontinue, SQLITE_
6670: 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
6680: 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
6690: 7c 3d 20 57 48 45 52 45 5f 50 41 52 54 49 41 4c  |= WHERE_PARTIAL
66a0: 49 44 58 3b 0a 20 20 7d 0a 20 20 72 65 67 52 65  IDX;.  }.  regRe
66b0: 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
66c0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
66d0: 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72  ;.  sqlite3Gener
66e0: 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72  ateIndexKey(pPar
66f0: 73 65 2c 20 70 49 64 78 2c 20 70 4c 65 76 65 6c  se, pIdx, pLevel
6700: 2d 3e 69 54 61 62 43 75 72 2c 20 72 65 67 52 65  ->iTabCur, regRe
6710: 63 6f 72 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30  cord, 0, 0, 0, 0
6720: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
6730: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
6740: 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e  Insert, pLevel->
6750: 69 49 64 78 43 75 72 2c 20 72 65 67 52 65 63 6f  iIdxCur, regReco
6760: 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rd);.  sqlite3Vd
6770: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
6780: 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55  FLAG_USESEEKRESU
6790: 4c 54 29 3b 0a 20 20 69 66 28 20 70 50 61 72 74  LT);.  if( pPart
67a0: 69 61 6c 20 29 20 73 71 6c 69 74 65 33 56 64 62  ial ) sqlite3Vdb
67b0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
67c0: 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69   iContinue);.  i
67d0: 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e  f( pTabItem->fg.
67e0: 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  viaCoroutine ){.
67f0: 20 20 20 20 74 72 61 6e 73 6c 61 74 65 43 6f 6c      translateCol
6800: 75 6d 6e 54 6f 43 6f 70 79 28 76 2c 20 61 64 64  umnToCopy(v, add
6810: 72 54 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 69 54  rTop, pLevel->iT
6820: 61 62 43 75 72 2c 20 70 54 61 62 49 74 65 6d 2d  abCur, pTabItem-
6830: 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20  >regResult);.   
6840: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6850: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
6860: 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20  , addrTop);.    
6870: 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61  pTabItem->fg.via
6880: 43 6f 72 6f 75 74 69 6e 65 20 3d 20 30 3b 0a 20  Coroutine = 0;. 
6890: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
68a0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
68b0: 20 4f 50 5f 4e 65 78 74 2c 20 70 4c 65 76 65 6c   OP_Next, pLevel
68c0: 2d 3e 69 54 61 62 43 75 72 2c 20 61 64 64 72 54  ->iTabCur, addrT
68d0: 6f 70 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72  op+1); VdbeCover
68e0: 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71  age(v);.  }.  sq
68f0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
6900: 35 28 76 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54  5(v, SQLITE_STMT
6910: 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58  STATUS_AUTOINDEX
6920: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
6930: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
6940: 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  Top);.  sqlite3R
6950: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
6960: 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29  arse, regRecord)
6970: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
6980: 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
6990: 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  .  .  /* Jump he
69a0: 72 65 20 77 68 65 6e 20 73 6b 69 70 70 69 6e 67  re when skipping
69b0: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
69c0: 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
69d0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
69e0: 61 64 64 72 49 6e 69 74 29 3b 0a 0a 65 6e 64 5f  addrInit);..end_
69f0: 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74  auto_index_creat
6a00: 65 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  e:.  sqlite3Expr
6a10: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
6a20: 62 2c 20 70 50 61 72 74 69 61 6c 29 3b 0a 7d 0a  b, pPartial);.}.
6a30: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
6a40: 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
6a50: 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e 64 65  INDEX */..#ifnde
6a60: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
6a70: 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
6a80: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f   Allocate and po
6a90: 70 75 6c 61 74 65 20 61 6e 20 73 71 6c 69 74 65  pulate an sqlite
6aa0: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
6ab0: 75 63 74 75 72 65 2e 20 49 74 20 69 73 20 74 68  ucture. It is th
6ac0: 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69  e .** responsibi
6ad0: 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
6ae0: 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
6af0: 20 72 65 6c 65 61 73 65 20 74 68 65 20 73 74 72   release the str
6b00: 75 63 74 75 72 65 0a 2a 2a 20 62 79 20 70 61 73  ucture.** by pas
6b10: 73 69 6e 67 20 74 68 65 20 70 6f 69 6e 74 65 72  sing the pointer
6b20: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
6b30: 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 73 71  s function to sq
6b40: 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f  lite3_free()..*/
6b50: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
6b60: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c 6c 6f  index_info *allo
6b70: 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 0a 20  cateIndexInfo(. 
6b80: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a   Parse *pParse,.
6b90: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
6ba0: 57 43 2c 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55  WC,.  Bitmask mU
6bb0: 6e 75 73 61 62 6c 65 2c 20 20 20 20 20 20 20 20  nusable,        
6bc0: 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20        /* Ignore 
6bd0: 74 65 72 6d 73 20 77 69 74 68 20 74 68 65 73 65  terms with these
6be0: 20 70 72 65 72 65 71 73 20 2a 2f 0a 20 20 73 74   prereqs */.  st
6bf0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
6c00: 6d 20 2a 70 53 72 63 2c 0a 20 20 45 78 70 72 4c  m *pSrc,.  ExprL
6c10: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 0a 29 7b  ist *pOrderBy.){
6c20: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69  .  int i, j;.  i
6c30: 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75  nt nTerm;.  stru
6c40: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
6c50: 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64  _constraint *pId
6c60: 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20  xCons;.  struct 
6c70: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
6c80: 64 65 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72  derby *pIdxOrder
6c90: 42 79 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  By;.  struct sql
6ca0: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
6cb0: 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73  raint_usage *pUs
6cc0: 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  age;.  WhereTerm
6cd0: 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e   *pTerm;.  int n
6ce0: 4f 72 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74  OrderBy;.  sqlit
6cf0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
6d00: 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 43  IdxInfo;..  /* C
6d10: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
6d20: 6f 66 20 70 6f 73 73 69 62 6c 65 20 57 48 45 52  of possible WHER
6d30: 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61  E clause constra
6d40: 69 6e 74 73 20 72 65 66 65 72 72 69 6e 67 0a 20  ints referring. 
6d50: 20 2a 2a 20 74 6f 20 74 68 69 73 20 76 69 72 74   ** to this virt
6d60: 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66  ual table */.  f
6d70: 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54  or(i=nTerm=0, pT
6d80: 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57  erm=pWC->a; i<pW
6d90: 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70  C->nTerm; i++, p
6da0: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
6db0: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
6dc0: 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72  or != pSrc->iCur
6dd0: 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  sor ) continue;.
6de0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
6df0: 72 65 72 65 71 52 69 67 68 74 20 26 20 6d 55 6e  rereqRight & mUn
6e00: 75 73 61 62 6c 65 20 29 20 63 6f 6e 74 69 6e 75  usable ) continu
6e10: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49  e;.    assert( I
6e20: 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72  sPowerOfTwo(pTer
6e30: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
6e40: 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20  WO_EQUIV) );.   
6e50: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
6e60: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
6e70: 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _IN );.    testc
6e80: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
6e90: 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
6ea0: 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  L );.    testcas
6eb0: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
6ec0: 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20  tor & WO_IS );. 
6ed0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
6ee0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
6ef0: 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66  WO_ALL );.    if
6f00: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
6f10: 74 6f 72 20 26 20 7e 28 57 4f 5f 49 53 4e 55 4c  tor & ~(WO_ISNUL
6f20: 4c 7c 57 4f 5f 45 51 55 49 56 7c 57 4f 5f 49 53  L|WO_EQUIV|WO_IS
6f30: 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ))==0 ) continue
6f40: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
6f50: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
6f60: 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65  VNULL ) continue
6f70: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
6f80: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3c 28 2d  >u.leftColumn<(-
6f90: 31 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  1) ) continue;. 
6fa0: 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a     nTerm++;.  }.
6fb0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44  .  /* If the ORD
6fc0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e  ER BY clause con
6fd0: 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d  tains only colum
6fe0: 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ns in the curren
6ff0: 74 20 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  t .  ** virtual 
7000: 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63  table then alloc
7010: 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ate space for th
7020: 65 20 61 4f 72 64 65 72 42 79 20 70 61 72 74 20  e aOrderBy part 
7030: 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69  of.  ** the sqli
7040: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
7050: 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20  tructure..  */. 
7060: 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   nOrderBy = 0;. 
7070: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
7080: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f 72  .    int n = pOr
7090: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
70a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
70b0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
70c0: 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72   *pExpr = pOrder
70d0: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
70e0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
70f0: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
7100: 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  | pExpr->iTable!
7110: 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29  =pSrc->iCursor )
7120: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7130: 20 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20 20    if( i==n){.   
7140: 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e 3b     nOrderBy = n;
7150: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
7160: 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71   Allocate the sq
7170: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
7180: 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a   structure.  */.
7190: 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c    pIdxInfo = sql
71a0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
71b0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a  (pParse->db, siz
71c0: 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20  eof(*pIdxInfo). 
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71e0: 20 20 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a            + (siz
71f0: 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b  eof(*pIdxCons) +
7200: 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29   sizeof(*pUsage)
7210: 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20  )*nTerm.        
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7230: 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64     + sizeof(*pId
7240: 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72  xOrderBy)*nOrder
7250: 42 79 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78  By );.  if( pIdx
7260: 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Info==0 ){.    s
7270: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
7280: 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d  Parse, "out of m
7290: 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 72 65 74  emory");.    ret
72a0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
72b0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
72c0: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
72d0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
72e0: 66 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  fo structure con
72f0: 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20  tains.  ** many 
7300: 66 69 65 6c 64 73 20 74 68 61 74 20 61 72 65 20  fields that are 
7310: 64 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22  declared "const"
7320: 20 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73   to prevent xBes
7330: 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a  tIndex from.  **
7340: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20   changing them. 
7350: 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73   We have to do s
7360: 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69 6e  ome funky castin
7370: 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20  g in order to.  
7380: 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** initialize th
7390: 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f  ose fields..  */
73a0: 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73  .  pIdxCons = (s
73b0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
73c0: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29  dex_constraint*)
73d0: 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20  &pIdxInfo[1];.  
73e0: 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73  pIdxOrderBy = (s
73f0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
7400: 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49  dex_orderby*)&pI
7410: 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20  dxCons[nTerm];. 
7420: 20 70 55 73 61 67 65 20 3d 20 28 73 74 72 75 63   pUsage = (struc
7430: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
7440: 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
7450: 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e  *)&pIdxOrderBy[n
7460: 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e  OrderBy];.  *(in
7470: 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  t*)&pIdxInfo->nC
7480: 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72  onstraint = nTer
7490: 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64  m;.  *(int*)&pId
74a0: 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20  xInfo->nOrderBy 
74b0: 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28  = nOrderBy;.  *(
74c0: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
74d0: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
74e0: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
74f0: 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 43  nstraint = pIdxC
7500: 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63 74 20  ons;.  *(struct 
7510: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
7520: 64 65 72 62 79 2a 2a 29 26 70 49 64 78 49 6e 66  derby**)&pIdxInf
7530: 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20 70 49  o->aOrderBy = pI
7540: 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73  dxOrderBy;.  *(s
7550: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
7560: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
7570: 73 61 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f  sage**)&pIdxInfo
7580: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
7590: 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  ge =.           
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75d0: 20 20 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a          pUsage;.
75e0: 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54  .  for(i=j=0, pT
75f0: 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57  erm=pWC->a; i<pW
7600: 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70  C->nTerm; i++, p
7610: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 75 38 20  Term++){.    u8 
7620: 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  op;.    if( pTer
7630: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
7640: 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
7650: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
7660: 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  f( pTerm->prereq
7670: 52 69 67 68 74 20 26 20 6d 55 6e 75 73 61 62 6c  Right & mUnusabl
7680: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
7690: 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65    assert( IsPowe
76a0: 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f  rOfTwo(pTerm->eO
76b0: 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51  perator & ~WO_EQ
76c0: 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74  UIV) );.    test
76d0: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
76e0: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
76f0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
7700: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
7710: 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20   & WO_IS );.    
7720: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
7730: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
7740: 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65  ISNULL );.    te
7750: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
7760: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c  Operator & WO_AL
7770: 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  L );.    if( (pT
7780: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
7790: 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f   ~(WO_ISNULL|WO_
77a0: 45 51 55 49 56 7c 57 4f 5f 49 53 29 29 3d 3d 30  EQUIV|WO_IS))==0
77b0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
77c0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
77d0: 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
77e0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
77f0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65   if( pTerm->u.le
7800: 66 74 43 6f 6c 75 6d 6e 3c 28 2d 31 29 20 29 20  ftColumn<(-1) ) 
7810: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 49  continue;.    pI
7820: 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d  dxCons[j].iColum
7830: 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  n = pTerm->u.lef
7840: 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64  tColumn;.    pId
7850: 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66  xCons[j].iTermOf
7860: 66 73 65 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70  fset = i;.    op
7870: 20 3d 20 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f   = (u8)pTerm->eO
7880: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c  perator & WO_ALL
7890: 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f  ;.    if( op==WO
78a0: 5f 49 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51  _IN ) op = WO_EQ
78b0: 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a  ;.    pIdxCons[j
78c0: 5d 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 20 20 2f  ].op = op;.    /
78d0: 2a 20 54 68 65 20 64 69 72 65 63 74 20 61 73 73  * The direct ass
78e0: 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70  ignment in the p
78f0: 72 65 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20  revious line is 
7900: 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65  possible only be
7910: 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65  cause.    ** the
7920: 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f   WO_ and SQLITE_
7930: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
7940: 5f 20 63 6f 64 65 73 20 61 72 65 20 69 64 65 6e  _ codes are iden
7950: 74 69 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20  tical.  The.    
7960: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  ** following ass
7970: 65 72 74 73 20 76 65 72 69 66 79 20 74 68 69 73  erts verify this
7980: 20 66 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73   fact. */.    as
7990: 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c  sert( WO_EQ==SQL
79a0: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
79b0: 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 61  AINT_EQ );.    a
79c0: 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51  ssert( WO_LT==SQ
79d0: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
79e0: 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20  RAINT_LT );.    
79f0: 61 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53  assert( WO_LE==S
7a00: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
7a10: 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20  TRAINT_LE );.   
7a20: 20 61 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d   assert( WO_GT==
7a30: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
7a40: 53 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20  STRAINT_GT );.  
7a50: 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d    assert( WO_GE=
7a60: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
7a70: 4e 53 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20  NSTRAINT_GE );. 
7a80: 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4d 41     assert( WO_MA
7a90: 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  TCH==SQLITE_INDE
7aa0: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54  X_CONSTRAINT_MAT
7ab0: 43 48 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CH );.    assert
7ac0: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
7ad0: 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 45  or & (WO_IN|WO_E
7ae0: 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f  Q|WO_LT|WO_LE|WO
7af0: 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54  _GT|WO_GE|WO_MAT
7b00: 43 48 29 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a  CH) );.    j++;.
7b10: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
7b20: 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
7b30: 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
7b40: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
7b50: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64  ].pExpr;.    pId
7b60: 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c  xOrderBy[i].iCol
7b70: 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  umn = pExpr->iCo
7b80: 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72  lumn;.    pIdxOr
7b90: 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20  derBy[i].desc = 
7ba0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
7bb0: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20  ortOrder;.  }.. 
7bc0: 20 72 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f   return pIdxInfo
7bd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  ;.}../*.** The t
7be0: 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65  able object refe
7bf0: 72 65 6e 63 65 20 70 61 73 73 65 64 20 61 73 20  rence passed as 
7c00: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
7c10: 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
7c20: 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70  tion.** must rep
7c30: 72 65 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c  resent a virtual
7c40: 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e   table. This fun
7c50: 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68  ction invokes th
7c60: 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a  e xBestIndex().*
7c70: 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  * method of the 
7c80: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69  virtual table wi
7c90: 74 68 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  th the sqlite3_i
7ca0: 6e 64 65 78 5f 69 6e 66 6f 20 6f 62 6a 65 63 74  ndex_info object
7cb0: 20 74 68 61 74 0a 2a 2a 20 63 6f 6d 65 73 20 69   that.** comes i
7cc0: 6e 20 61 73 20 74 68 65 20 33 72 64 20 61 72 67  n as the 3rd arg
7cd0: 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
7ce0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
7cf0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
7d00: 2c 20 70 50 61 72 73 65 20 69 73 20 70 6f 70 75  , pParse is popu
7d10: 6c 61 74 65 64 20 77 69 74 68 20 61 6e 20 65 72  lated with an er
7d20: 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20  ror message and 
7d30: 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  a.** non-zero va
7d40: 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  lue is returned.
7d50: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73   Otherwise, 0 is
7d60: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
7d70: 65 20 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72 74  e output.** part
7d80: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
7d90: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
7da0: 74 75 72 65 20 69 73 20 6c 65 66 74 20 70 6f 70  ture is left pop
7db0: 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68  ulated..**.** Wh
7dc0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20  ether or not an 
7dd0: 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
7de0: 64 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73  d, it is the res
7df0: 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
7e00: 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20  he.** caller to 
7e10: 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20  eventually free 
7e20: 70 2d 3e 69 64 78 53 74 72 20 69 66 20 70 2d 3e  p->idxStr if p->
7e30: 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
7e40: 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74 68   indicates.** th
7e50: 61 74 20 74 68 69 73 20 69 73 20 72 65 71 75 69  at this is requi
7e60: 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
7e70: 6e 74 20 76 74 61 62 42 65 73 74 49 6e 64 65 78  nt vtabBestIndex
7e80: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
7e90: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c  Table *pTab, sql
7ea0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
7eb0: 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  *p){.  sqlite3_v
7ec0: 74 61 62 20 2a 70 56 74 61 62 20 3d 20 73 71 6c  tab *pVtab = sql
7ed0: 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 70 50  ite3GetVTable(pP
7ee0: 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d  arse->db, pTab)-
7ef0: 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 69 3b  >pVtab;.  int i;
7f00: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52  .  int rc;..  TR
7f10: 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70  ACE_IDX_INPUTS(p
7f20: 29 3b 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d  );.  rc = pVtab-
7f30: 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49  >pModule->xBestI
7f40: 6e 64 65 78 28 70 56 74 61 62 2c 20 70 29 3b 0a  ndex(pVtab, p);.
7f50: 20 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50    TRACE_IDX_OUTP
7f60: 55 54 53 28 70 29 3b 0a 0a 20 20 69 66 28 20 72  UTS(p);..  if( r
7f70: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
7f80: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
7f90: 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
7fa0: 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61    pParse->db->ma
7fb0: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
7fc0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70      }else if( !p
7fd0: 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b  Vtab->zErrMsg ){
7fe0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
7ff0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8000: 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53  %s", sqlite3ErrS
8010: 74 72 28 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c  tr(rc));.    }el
8020: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
8030: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8040: 2c 20 22 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a  , "%s", pVtab->z
8050: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20  ErrMsg);.    }. 
8060: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
8070: 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  e(pVtab->zErrMsg
8080: 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72  );.  pVtab->zErr
8090: 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28  Msg = 0;..  for(
80a0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74  i=0; i<p->nConst
80b0: 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  raint; i++){.   
80c0: 20 69 66 28 20 21 70 2d 3e 61 43 6f 6e 73 74 72   if( !p->aConstr
80d0: 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26  aint[i].usable &
80e0: 26 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  & p->aConstraint
80f0: 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64  Usage[i].argvInd
8100: 65 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71  ex>0 ){.      sq
8110: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8120: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
8130: 20 22 74 61 62 6c 65 20 25 73 3a 20 78 42 65 73   "table %s: xBes
8140: 74 49 6e 64 65 78 20 72 65 74 75 72 6e 65 64 20  tIndex returned 
8150: 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22  an invalid plan"
8160: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
8170: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
8180: 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  urn pParse->nErr
8190: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
81a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
81b0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
81c0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
81d0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
81e0: 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45  OR_STAT4./*.** E
81f0: 73 74 69 6d 61 74 65 20 74 68 65 20 6c 6f 63 61  stimate the loca
8200: 74 69 6f 6e 20 6f 66 20 61 20 70 61 72 74 69 63  tion of a partic
8210: 75 6c 61 72 20 6b 65 79 20 61 6d 6f 6e 67 20 61  ular key among a
8220: 6c 6c 20 6b 65 79 73 20 69 6e 20 61 6e 0a 2a 2a  ll keys in an.**
8230: 20 69 6e 64 65 78 2e 20 20 53 74 6f 72 65 20 74   index.  Store t
8240: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 53  he results in aS
8250: 74 61 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  tat as follows:.
8260: 2a 2a 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 30  **.**    aStat[0
8270: 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62  ]      Est. numb
8280: 65 72 20 6f 66 20 72 6f 77 73 20 6c 65 73 73 20  er of rows less 
8290: 74 68 61 6e 20 70 52 65 63 0a 2a 2a 20 20 20 20  than pRec.**    
82a0: 61 53 74 61 74 5b 31 5d 20 20 20 20 20 20 45 73  aStat[1]      Es
82b0: 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  t. number of row
82c0: 73 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63 0a  s equal to pRec.
82d0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
82e0: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 73 61   index of the sa
82f0: 6d 70 6c 65 20 74 68 61 74 20 69 73 20 74 68 65  mple that is the
8300: 20 73 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65   smallest sample
8310: 20 74 68 61 74 0a 2a 2a 20 69 73 20 67 72 65 61   that.** is grea
8320: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
8330: 6c 20 74 6f 20 70 52 65 63 2e 20 4e 6f 74 65 20  l to pRec. Note 
8340: 74 68 61 74 20 74 68 69 73 20 69 6e 64 65 78 20  that this index 
8350: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 64 65 78 0a  is not an index.
8360: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 61 53 61 6d  ** into the aSam
8370: 70 6c 65 5b 5d 20 61 72 72 61 79 20 2d 20 69 74  ple[] array - it
8380: 20 69 73 20 61 6e 20 69 6e 64 65 78 20 69 6e 74   is an index int
8390: 6f 20 61 20 76 69 72 74 75 61 6c 20 73 65 74 20  o a virtual set 
83a0: 6f 66 20 73 61 6d 70 6c 65 73 0a 2a 2a 20 62 61  of samples.** ba
83b0: 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  sed on the conte
83c0: 6e 74 73 20 6f 66 20 61 53 61 6d 70 6c 65 5b 5d  nts of aSample[]
83d0: 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20   and the number 
83e0: 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 72 65 63  of fields in rec
83f0: 6f 72 64 20 0a 2a 2a 20 70 52 65 63 2e 20 0a 2a  ord .** pRec. .*
8400: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
8410: 72 65 4b 65 79 53 74 61 74 73 28 0a 20 20 50 61  reKeyStats(.  Pa
8420: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
8430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
8440: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
8450: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
8460: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
8470: 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f    /* Index to co
8480: 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66  nsider domain of
8490: 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
84a0: 63 6f 72 64 20 2a 70 52 65 63 2c 20 20 20 20 20  cord *pRec,     
84b0: 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f 66 20 76    /* Vector of v
84c0: 61 6c 75 65 73 20 74 6f 20 63 6f 6e 73 69 64 65  alues to conside
84d0: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64  r */.  int round
84e0: 55 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Up,             
84f0: 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69     /* Round up i
8500: 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64  f true.  Round d
8510: 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a  own if false */.
8520: 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74    tRowcnt *aStat
8530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8540: 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69 74   OUT: stats writ
8550: 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ten here */.){. 
8560: 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53   IndexSample *aS
8570: 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53  ample = pIdx->aS
8580: 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69 43 6f  ample;.  int iCo
8590: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
85a0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
85b0: 20 72 65 71 75 69 72 65 64 20 73 74 61 74 73 20   required stats 
85c0: 69 6e 20 61 6e 45 71 5b 5d 20 65 74 63 2e 20 2a  in anEq[] etc. *
85d0: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
85e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85f0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
8600: 74 20 73 61 6d 70 6c 65 20 3e 3d 20 70 52 65 63  t sample >= pRec
8610: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 61 6d 70 6c   */.  int iSampl
8620: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
8630: 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61    /* Smallest sa
8640: 6d 70 6c 65 20 6c 61 72 67 65 72 20 74 68 61 6e  mple larger than
8650: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52 65   or equal to pRe
8660: 63 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 20  c */.  int iMin 
8670: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
8680: 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73     /* Smallest s
8690: 61 6d 70 6c 65 20 6e 6f 74 20 79 65 74 20 74 65  ample not yet te
86a0: 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  sted */.  int iT
86b0: 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  est;            
86c0: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 73 61        /* Next sa
86d0: 6d 70 6c 65 20 74 6f 20 74 65 73 74 20 2a 2f 0a  mple to test */.
86e0: 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20    int res;      
86f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8700: 20 52 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61   Result of compa
8710: 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20  rison operation 
8720: 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b  */.  int nField;
8730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8740: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 69   /* Number of fi
8750: 65 6c 64 73 20 69 6e 20 70 52 65 63 20 2a 2f 0a  elds in pRec */.
8760: 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72    tRowcnt iLower
8770: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
8780: 20 61 6e 4c 74 5b 5d 20 2b 20 61 6e 45 71 5b 5d   anLt[] + anEq[]
8790: 20 6f 66 20 6c 61 72 67 65 73 74 20 73 61 6d 70   of largest samp
87a0: 6c 65 20 70 52 65 63 20 69 73 20 3e 20 2a 2f 0a  le pRec is > */.
87b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
87c0: 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50  DEBUG.  UNUSED_P
87d0: 41 52 41 4d 45 54 45 52 28 20 70 50 61 72 73 65  ARAMETER( pParse
87e0: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   );.#endif.  ass
87f0: 65 72 74 28 20 70 52 65 63 21 3d 30 20 29 3b 0a  ert( pRec!=0 );.
8800: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
8810: 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61  nSample>0 );.  a
8820: 73 73 65 72 74 28 20 70 52 65 63 2d 3e 6e 46 69  ssert( pRec->nFi
8830: 65 6c 64 3e 30 20 26 26 20 70 52 65 63 2d 3e 6e  eld>0 && pRec->n
8840: 46 69 65 6c 64 3c 3d 70 49 64 78 2d 3e 6e 53 61  Field<=pIdx->nSa
8850: 6d 70 6c 65 43 6f 6c 20 29 3b 0a 0a 20 20 2f 2a  mpleCol );..  /*
8860: 20 44 6f 20 61 20 62 69 6e 61 72 79 20 73 65 61   Do a binary sea
8870: 72 63 68 20 74 6f 20 66 69 6e 64 20 74 68 65 20  rch to find the 
8880: 66 69 72 73 74 20 73 61 6d 70 6c 65 20 67 72 65  first sample gre
8890: 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
88a0: 61 6c 0a 20 20 2a 2a 20 74 6f 20 70 52 65 63 2e  al.  ** to pRec.
88b0: 20 49 66 20 70 52 65 63 20 63 6f 6e 74 61 69 6e   If pRec contain
88c0: 73 20 61 20 73 69 6e 67 6c 65 20 66 69 65 6c 64  s a single field
88d0: 2c 20 74 68 65 20 73 65 74 20 6f 66 20 73 61 6d  , the set of sam
88e0: 70 6c 65 73 20 74 6f 20 73 65 61 72 63 68 0a 20  ples to search. 
88f0: 20 2a 2a 20 69 73 20 73 69 6d 70 6c 79 20 74 68   ** is simply th
8900: 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61  e aSample[] arra
8910: 79 2e 20 49 66 20 74 68 65 20 73 61 6d 70 6c 65  y. If the sample
8920: 73 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 63  s in aSample[] c
8930: 6f 6e 74 61 69 6e 20 6d 6f 72 65 0a 20 20 2a 2a  ontain more.  **
8940: 20 74 68 61 6e 20 6f 6e 65 20 66 69 65 6c 64 73   than one fields
8950: 2c 20 61 6c 6c 20 66 69 65 6c 64 73 20 66 6f 6c  , all fields fol
8960: 6c 6f 77 69 6e 67 20 74 68 65 20 66 69 72 73 74  lowing the first
8970: 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20   are ignored..  
8980: 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 52 65 63 20  **.  ** If pRec 
8990: 63 6f 6e 74 61 69 6e 73 20 4e 20 66 69 65 6c 64  contains N field
89a0: 73 2c 20 77 68 65 72 65 20 4e 20 69 73 20 6d 6f  s, where N is mo
89b0: 72 65 20 74 68 61 6e 20 6f 6e 65 2c 20 74 68 65  re than one, the
89c0: 6e 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65  n as well as the
89d0: 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 73 20 69 6e  .  ** samples in
89e0: 20 61 53 61 6d 70 6c 65 5b 5d 20 28 74 72 75 6e   aSample[] (trun
89f0: 63 61 74 65 64 20 74 6f 20 4e 20 66 69 65 6c 64  cated to N field
8a00: 73 29 2c 20 74 68 65 20 73 65 61 72 63 68 20 61  s), the search a
8a10: 6c 73 6f 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20  lso has to.  ** 
8a20: 63 6f 6e 73 69 64 65 72 20 70 72 65 66 69 78 65  consider prefixe
8a30: 73 20 6f 66 20 74 68 6f 73 65 20 73 61 6d 70 6c  s of those sampl
8a40: 65 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  es. For example,
8a50: 20 69 66 20 74 68 65 20 73 65 74 20 6f 66 20 73   if the set of s
8a60: 61 6d 70 6c 65 73 0a 20 20 2a 2a 20 69 6e 20 61  amples.  ** in a
8a70: 53 61 6d 70 6c 65 20 69 73 3a 0a 20 20 2a 2a 0a  Sample is:.  **.
8a80: 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65    **     aSample
8a90: 5b 30 5d 20 3d 20 28 61 2c 20 35 29 20 0a 20 20  [0] = (a, 5) .  
8aa0: 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 31  **     aSample[1
8ab0: 5d 20 3d 20 28 61 2c 20 31 30 29 20 0a 20 20 2a  ] = (a, 10) .  *
8ac0: 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 32 5d  *     aSample[2]
8ad0: 20 3d 20 28 62 2c 20 35 29 20 0a 20 20 2a 2a 20   = (b, 5) .  ** 
8ae0: 20 20 20 20 61 53 61 6d 70 6c 65 5b 33 5d 20 3d      aSample[3] =
8af0: 20 28 63 2c 20 31 30 30 29 20 0a 20 20 2a 2a 20   (c, 100) .  ** 
8b00: 20 20 20 20 61 53 61 6d 70 6c 65 5b 34 5d 20 3d      aSample[4] =
8b10: 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a 0a 20   (c, 105).  **. 
8b20: 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 73 65 61   ** Then the sea
8b30: 72 63 68 20 73 70 61 63 65 20 73 68 6f 75 6c 64  rch space should
8b40: 20 69 64 65 61 6c 6c 79 20 62 65 20 74 68 65 20   ideally be the 
8b50: 73 61 6d 70 6c 65 73 20 61 62 6f 76 65 20 61 6e  samples above an
8b60: 64 20 74 68 65 20 0a 20 20 2a 2a 20 75 6e 69 71  d the .  ** uniq
8b70: 75 65 20 70 72 65 66 69 78 65 73 20 5b 61 5d 2c  ue prefixes [a],
8b80: 20 5b 62 5d 20 61 6e 64 20 5b 63 5d 2e 20 42 75   [b] and [c]. Bu
8b90: 74 20 73 69 6e 63 65 20 74 68 61 74 20 69 73 20  t since that is 
8ba0: 68 61 72 64 20 74 6f 20 6f 72 67 61 6e 69 7a 65  hard to organize
8bb0: 2c 20 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64 65  , .  ** the code
8bc0: 20 61 63 74 75 61 6c 6c 79 20 73 65 61 72 63 68   actually search
8bd0: 65 73 20 74 68 69 73 20 73 65 74 3a 0a 20 20 2a  es this set:.  *
8be0: 2a 0a 20 20 2a 2a 20 20 20 20 20 30 3a 20 28 61  *.  **     0: (a
8bf0: 29 20 0a 20 20 2a 2a 20 20 20 20 20 31 3a 20 28  ) .  **     1: (
8c00: 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20  a, 5) .  **     
8c10: 32 3a 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a  2: (a, 10) .  **
8c20: 20 20 20 20 20 33 3a 20 28 61 2c 20 31 30 29 20       3: (a, 10) 
8c30: 0a 20 20 2a 2a 20 20 20 20 20 34 3a 20 28 62 29  .  **     4: (b)
8c40: 20 0a 20 20 2a 2a 20 20 20 20 20 35 3a 20 28 62   .  **     5: (b
8c50: 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 36  , 5) .  **     6
8c60: 3a 20 28 63 29 20 0a 20 20 2a 2a 20 20 20 20 20  : (c) .  **     
8c70: 37 3a 20 28 63 2c 20 31 30 30 29 20 0a 20 20 2a  7: (c, 100) .  *
8c80: 2a 20 20 20 20 20 38 3a 20 28 63 2c 20 31 30 35  *     8: (c, 105
8c90: 29 0a 20 20 2a 2a 20 20 20 20 20 39 3a 20 28 63  ).  **     9: (c
8ca0: 2c 20 31 30 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a  , 105).  **.  **
8cb0: 20 46 6f 72 20 65 61 63 68 20 73 61 6d 70 6c 65   For each sample
8cc0: 20 69 6e 20 74 68 65 20 61 53 61 6d 70 6c 65 5b   in the aSample[
8cd0: 5d 20 61 72 72 61 79 2c 20 4e 20 73 61 6d 70 6c  ] array, N sampl
8ce0: 65 73 20 61 72 65 20 70 72 65 73 65 6e 74 20 69  es are present i
8cf0: 6e 20 74 68 65 0a 20 20 2a 2a 20 65 66 66 65 63  n the.  ** effec
8d00: 74 69 76 65 20 73 61 6d 70 6c 65 20 61 72 72 61  tive sample arra
8d10: 79 2e 20 49 6e 20 74 68 65 20 61 62 6f 76 65 2c  y. In the above,
8d20: 20 73 61 6d 70 6c 65 73 20 30 20 61 6e 64 20 31   samples 0 and 1
8d30: 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20 0a 20   are based on . 
8d40: 20 2a 2a 20 73 61 6d 70 6c 65 20 61 53 61 6d 70   ** sample aSamp
8d50: 6c 65 5b 30 5d 2e 20 53 61 6d 70 6c 65 73 20 32  le[0]. Samples 2
8d60: 20 61 6e 64 20 33 20 6f 6e 20 61 53 61 6d 70 6c   and 3 on aSampl
8d70: 65 5b 31 5d 20 65 74 63 2e 0a 20 20 2a 2a 0a 20  e[1] etc..  **. 
8d80: 20 2a 2a 20 4f 66 74 65 6e 2c 20 73 61 6d 70 6c   ** Often, sampl
8d90: 65 20 69 20 6f 66 20 65 61 63 68 20 62 6c 6f 63  e i of each bloc
8da0: 6b 20 6f 66 20 4e 20 65 66 66 65 63 74 69 76 65  k of N effective
8db0: 20 73 61 6d 70 6c 65 73 20 68 61 73 20 28 69 2b   samples has (i+
8dc0: 31 29 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2a 20  1) fields..  ** 
8dd0: 45 78 63 65 70 74 2c 20 65 61 63 68 20 73 61 6d  Except, each sam
8de0: 70 6c 65 20 6d 61 79 20 62 65 20 65 78 74 65 6e  ple may be exten
8df0: 64 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68  ded to ensure th
8e00: 61 74 20 69 74 20 69 73 20 67 72 65 61 74 65 72  at it is greater
8e10: 20 74 68 61 6e 20 6f 72 0a 20 20 2a 2a 20 65 71   than or.  ** eq
8e20: 75 61 6c 20 74 6f 20 74 68 65 20 70 72 65 76 69  ual to the previ
8e30: 6f 75 73 20 73 61 6d 70 6c 65 20 69 6e 20 74 68  ous sample in th
8e40: 65 20 61 72 72 61 79 2e 20 46 6f 72 20 65 78 61  e array. For exa
8e50: 6d 70 6c 65 2c 20 69 6e 20 74 68 65 20 61 62 6f  mple, in the abo
8e60: 76 65 2c 20 0a 20 20 2a 2a 20 73 61 6d 70 6c 65  ve, .  ** sample
8e70: 20 32 20 69 73 20 74 68 65 20 66 69 72 73 74 20   2 is the first 
8e80: 73 61 6d 70 6c 65 20 6f 66 20 61 20 62 6c 6f 63  sample of a bloc
8e90: 6b 20 6f 66 20 4e 20 73 61 6d 70 6c 65 73 2c 20  k of N samples, 
8ea0: 73 6f 20 61 74 20 66 69 72 73 74 20 69 74 20 0a  so at first it .
8eb0: 20 20 2a 2a 20 61 70 70 65 61 72 73 20 74 68 61    ** appears tha
8ec0: 74 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 31  t it should be 1
8ed0: 20 66 69 65 6c 64 20 69 6e 20 73 69 7a 65 2e 20   field in size. 
8ee0: 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20 77 6f  However, that wo
8ef0: 75 6c 64 20 6d 61 6b 65 20 69 74 20 0a 20 20 2a  uld make it .  *
8f00: 2a 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 73  * smaller than s
8f10: 61 6d 70 6c 65 20 31 2c 20 73 6f 20 74 68 65 20  ample 1, so the 
8f20: 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 77 6f  binary search wo
8f30: 75 6c 64 20 6e 6f 74 20 77 6f 72 6b 2e 20 41 73  uld not work. As
8f40: 20 61 20 72 65 73 75 6c 74 2c 20 0a 20 20 2a 2a   a result, .  **
8f50: 20 69 74 20 69 73 20 65 78 74 65 6e 64 65 64 20   it is extended 
8f60: 74 6f 20 74 77 6f 20 66 69 65 6c 64 73 2e 20 54  to two fields. T
8f70: 68 65 20 64 75 70 6c 69 63 61 74 65 73 20 74 68  he duplicates th
8f80: 61 74 20 74 68 69 73 20 63 72 65 61 74 65 73 20  at this creates 
8f90: 64 6f 20 6e 6f 74 20 0a 20 20 2a 2a 20 63 61 75  do not .  ** cau
8fa0: 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e  se any problems.
8fb0: 0a 20 20 2a 2f 0a 20 20 6e 46 69 65 6c 64 20 3d  .  */.  nField =
8fc0: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3b 0a 20   pRec->nField;. 
8fd0: 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 53 61   iCol = 0;.  iSa
8fe0: 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 6e 53 61  mple = pIdx->nSa
8ff0: 6d 70 6c 65 20 2a 20 6e 46 69 65 6c 64 3b 0a 20  mple * nField;. 
9000: 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20 69 53 61   do{.    int iSa
9010: 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mp;             
9020: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
9030: 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 6f 66 20  in aSample[] of 
9040: 74 65 73 74 20 73 61 6d 70 6c 65 20 2a 2f 0a 20  test sample */. 
9050: 20 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20     int n;       
9060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9070: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 69   /* Number of fi
9080: 65 6c 64 73 20 69 6e 20 74 65 73 74 20 73 61 6d  elds in test sam
9090: 70 6c 65 20 2a 2f 0a 0a 20 20 20 20 69 54 65 73  ple */..    iTes
90a0: 74 20 3d 20 28 69 4d 69 6e 2b 69 53 61 6d 70 6c  t = (iMin+iSampl
90b0: 65 29 2f 32 3b 0a 20 20 20 20 69 53 61 6d 70 20  e)/2;.    iSamp 
90c0: 3d 20 69 54 65 73 74 20 2f 20 6e 46 69 65 6c 64  = iTest / nField
90d0: 3b 0a 20 20 20 20 69 66 28 20 69 53 61 6d 70 3e  ;.    if( iSamp>
90e0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
90f0: 65 20 70 72 6f 70 6f 73 65 64 20 65 66 66 65 63  e proposed effec
9100: 74 69 76 65 20 73 61 6d 70 6c 65 20 69 73 20 61  tive sample is a
9110: 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c   prefix of sampl
9120: 65 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d  e aSample[iSamp]
9130: 2e 0a 20 20 20 20 20 20 2a 2a 20 53 70 65 63 69  ..      ** Speci
9140: 66 69 63 61 6c 6c 79 2c 20 74 68 65 20 73 68 6f  fically, the sho
9150: 72 74 65 73 74 20 70 72 65 66 69 78 20 6f 66 20  rtest prefix of 
9160: 61 74 20 6c 65 61 73 74 20 28 31 20 2b 20 69 54  at least (1 + iT
9170: 65 73 74 25 6e 46 69 65 6c 64 29 20 0a 20 20 20  est%nField) .   
9180: 20 20 20 2a 2a 20 66 69 65 6c 64 73 20 74 68 61     ** fields tha
9190: 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
91a0: 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  n the previous e
91b0: 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65 2e  ffective sample.
91c0: 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6e    */.      for(n
91d0: 3d 28 69 54 65 73 74 20 25 20 6e 46 69 65 6c 64  =(iTest % nField
91e0: 29 20 2b 20 31 3b 20 6e 3c 6e 46 69 65 6c 64 3b  ) + 1; n<nField;
91f0: 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   n++){.        i
9200: 66 28 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70  f( aSample[iSamp
9210: 2d 31 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 21 3d 61  -1].anLt[n-1]!=a
9220: 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e  Sample[iSamp].an
9230: 4c 74 5b 6e 2d 31 5d 20 29 20 62 72 65 61 6b 3b  Lt[n-1] ) break;
9240: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
9250: 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 69 54  se{.      n = iT
9260: 65 73 74 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 0a  est + 1;.    }..
9270: 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64      pRec->nField
9280: 20 3d 20 6e 3b 0a 20 20 20 20 72 65 73 20 3d 20   = n;.    res = 
9290: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
92a0: 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65  dCompare(aSample
92b0: 5b 69 53 61 6d 70 5d 2e 6e 2c 20 61 53 61 6d 70  [iSamp].n, aSamp
92c0: 6c 65 5b 69 53 61 6d 70 5d 2e 70 2c 20 70 52 65  le[iSamp].p, pRe
92d0: 63 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c  c);.    if( res<
92e0: 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65  0 ){.      iLowe
92f0: 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d  r = aSample[iSam
9300: 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 20 2b 20 61  p].anLt[n-1] + a
9310: 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e  Sample[iSamp].an
9320: 45 71 5b 6e 2d 31 5d 3b 0a 20 20 20 20 20 20 69  Eq[n-1];.      i
9330: 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20  Min = iTest+1;. 
9340: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73     }else if( res
9350: 3d 3d 30 20 26 26 20 6e 3c 6e 46 69 65 6c 64 20  ==0 && n<nField 
9360: 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20  ){.      iLower 
9370: 3d 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d  = aSample[iSamp]
9380: 2e 61 6e 4c 74 5b 6e 2d 31 5d 3b 0a 20 20 20 20  .anLt[n-1];.    
9390: 20 20 69 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31    iMin = iTest+1
93a0: 3b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 2d 31  ;.      res = -1
93b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
93c0: 20 20 20 69 53 61 6d 70 6c 65 20 3d 20 69 54 65     iSample = iTe
93d0: 73 74 3b 0a 20 20 20 20 20 20 69 43 6f 6c 20 3d  st;.      iCol =
93e0: 20 6e 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 77   n-1;.    }.  }w
93f0: 68 69 6c 65 28 20 72 65 73 20 26 26 20 69 4d 69  hile( res && iMi
9400: 6e 3c 69 53 61 6d 70 6c 65 20 29 3b 0a 20 20 69  n<iSample );.  i
9410: 20 3d 20 69 53 61 6d 70 6c 65 20 2f 20 6e 46 69   = iSample / nFi
9420: 65 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  eld;..#ifdef SQL
9430: 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54  ITE_DEBUG.  /* T
9440: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
9450: 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 63  ert statements c
9460: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 62 69  heck that the bi
9470: 6e 61 72 79 20 73 65 61 72 63 68 20 63 6f 64 65  nary search code
9480: 0a 20 20 2a 2a 20 61 62 6f 76 65 20 66 6f 75 6e  .  ** above foun
9490: 64 20 74 68 65 20 72 69 67 68 74 20 61 6e 73 77  d the right answ
94a0: 65 72 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 73  er. This block s
94b0: 65 72 76 65 73 20 6e 6f 20 70 75 72 70 6f 73 65  erves no purpose
94c0: 20 6f 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 6e   other.  ** than
94d0: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 61   to invoke the a
94e0: 73 73 65 72 74 73 2e 20 20 2a 2f 0a 20 20 69 66  sserts.  */.  if
94f0: 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
9500: 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b  llocFailed==0 ){
9510: 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20  .    if( res==0 
9520: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 28  ){.      /* If (
9530: 72 65 73 3d 3d 30 29 20 69 73 20 74 72 75 65 2c  res==0) is true,
9540: 20 74 68 65 6e 20 70 52 65 63 20 6d 75 73 74 20   then pRec must 
9550: 62 65 20 65 71 75 61 6c 20 74 6f 20 73 61 6d 70  be equal to samp
9560: 6c 65 20 69 2e 20 2a 2f 0a 20 20 20 20 20 20 61  le i. */.      a
9570: 73 73 65 72 74 28 20 69 3c 70 49 64 78 2d 3e 6e  ssert( i<pIdx->n
9580: 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20 20 20  Sample );.      
9590: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e 46  assert( iCol==nF
95a0: 69 65 6c 64 2d 31 20 29 3b 0a 20 20 20 20 20 20  ield-1 );.      
95b0: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e  pRec->nField = n
95c0: 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 61 73 73  Field;.      ass
95d0: 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 56  ert( 0==sqlite3V
95e0: 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
95f0: 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61  (aSample[i].n, a
9600: 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65  Sample[i].p, pRe
9610: 63 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  c) .           |
9620: 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
9630: 6c 6c 6f 63 46 61 69 6c 65 64 20 0a 20 20 20 20  llocFailed .    
9640: 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a    );.    }else{.
9650: 20 20 20 20 20 20 2f 2a 20 55 6e 6c 65 73 73 20        /* Unless 
9660: 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i==pIdx->nSample
9670: 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
9680: 74 20 70 52 65 63 20 69 73 20 6c 61 72 67 65 72  t pRec is larger
9690: 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 61   than.      ** a
96a0: 6c 6c 20 73 61 6d 70 6c 65 73 20 69 6e 20 74 68  ll samples in th
96b0: 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61  e aSample[] arra
96c0: 79 2c 20 70 52 65 63 20 6d 75 73 74 20 62 65 20  y, pRec must be 
96d0: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
96e0: 0a 20 20 20 20 20 20 2a 2a 20 28 69 43 6f 6c 2b  .      ** (iCol+
96f0: 31 29 20 66 69 65 6c 64 20 70 72 65 66 69 78 20  1) field prefix 
9700: 6f 66 20 73 61 6d 70 6c 65 20 69 2e 20 20 2a 2f  of sample i.  */
9710: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
9720: 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  <=pIdx->nSample 
9730: 26 26 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 20  && i>=0 );.     
9740: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20   pRec->nField = 
9750: 69 43 6f 6c 2b 31 3b 0a 20 20 20 20 20 20 61 73  iCol+1;.      as
9760: 73 65 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e  sert( i==pIdx->n
9770: 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20  Sample .        
9780: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62     || sqlite3Vdb
9790: 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61  eRecordCompare(a
97a0: 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61  Sample[i].n, aSa
97b0: 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29  mple[i].p, pRec)
97c0: 3e 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  >0.           ||
97d0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
97e0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20  locFailed );..  
97f0: 20 20 20 20 2f 2a 20 69 66 20 69 3d 3d 30 20 61      /* if i==0 a
9800: 6e 64 20 69 43 6f 6c 3d 3d 30 2c 20 74 68 65 6e  nd iCol==0, then
9810: 20 72 65 63 6f 72 64 20 70 52 65 63 20 69 73 20   record pRec is 
9820: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 61 6c 6c  smaller than all
9830: 20 73 61 6d 70 6c 65 73 0a 20 20 20 20 20 20 2a   samples.      *
9840: 2a 20 69 6e 20 74 68 65 20 61 53 61 6d 70 6c 65  * in the aSample
9850: 5b 5d 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77  [] array. Otherw
9860: 69 73 65 2c 20 69 66 20 28 69 43 6f 6c 3e 30 29  ise, if (iCol>0)
9870: 20 74 68 65 6e 20 70 52 65 63 20 6d 75 73 74 0a   then pRec must.
9880: 20 20 20 20 20 20 2a 2a 20 62 65 20 67 72 65 61        ** be grea
9890: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
98a0: 6c 20 74 6f 20 74 68 65 20 28 69 43 6f 6c 29 20  l to the (iCol) 
98b0: 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66 20  field prefix of 
98c0: 73 61 6d 70 6c 65 20 69 2e 0a 20 20 20 20 20 20  sample i..      
98d0: 2a 2a 20 49 66 20 28 69 3e 30 29 2c 20 74 68 65  ** If (i>0), the
98e0: 6e 20 70 52 65 63 20 6d 75 73 74 20 61 6c 73 6f  n pRec must also
98f0: 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
9900: 20 73 61 6d 70 6c 65 20 28 69 2d 31 29 2e 20 20   sample (i-1).  
9910: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  */.      if( iCo
9920: 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  l>0 ){.        p
9930: 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 69 43  Rec->nField = iC
9940: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ol;.        asse
9950: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 52  rt( sqlite3VdbeR
9960: 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61  ecordCompare(aSa
9970: 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70  mple[i].n, aSamp
9980: 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3c 3d  le[i].p, pRec)<=
9990: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  0.             |
99a0: 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
99b0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
99c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
99d0: 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  i>0 ){.        p
99e0: 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46  Rec->nField = nF
99f0: 69 65 6c 64 3b 0a 20 20 20 20 20 20 20 20 61 73  ield;.        as
9a00: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62  sert( sqlite3Vdb
9a10: 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61  eRecordCompare(a
9a20: 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c 20 61  Sample[i-1].n, a
9a30: 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c 20 70  Sample[i-1].p, p
9a40: 52 65 63 29 3c 30 0a 20 20 20 20 20 20 20 20 20  Rec)<0.         
9a50: 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64      || pParse->d
9a60: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
9a70: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9a80: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69  .  }.#endif /* i
9a90: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
9aa0: 47 20 2a 2f 0a 0a 20 20 69 66 28 20 72 65 73 3d  G */..  if( res=
9ab0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 63  =0 ){.    /* Rec
9ac0: 6f 72 64 20 70 52 65 63 20 69 73 20 65 71 75 61  ord pRec is equa
9ad0: 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69 20 2a 2f  l to sample i */
9ae0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f  .    assert( iCo
9af0: 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20 29 3b 0a 20  l==nField-1 );. 
9b00: 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 61 53     aStat[0] = aS
9b10: 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43  ample[i].anLt[iC
9b20: 6f 6c 5d 3b 0a 20 20 20 20 61 53 74 61 74 5b 31  ol];.    aStat[1
9b30: 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61  ] = aSample[i].a
9b40: 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 65 6c  nEq[iCol];.  }el
9b50: 73 65 7b 0a 20 20 20 20 2f 2a 20 41 74 20 74 68  se{.    /* At th
9b60: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 28 69  is point, the (i
9b70: 43 6f 6c 2b 31 29 20 66 69 65 6c 64 20 70 72 65  Col+1) field pre
9b80: 66 69 78 20 6f 66 20 61 53 61 6d 70 6c 65 5b 69  fix of aSample[i
9b90: 5d 20 69 73 20 74 68 65 20 66 69 72 73 74 20 0a  ] is the first .
9ba0: 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20 74 68      ** sample th
9bb0: 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  at is greater th
9bc0: 61 6e 20 70 52 65 63 2e 20 4f 72 2c 20 69 66 20  an pRec. Or, if 
9bd0: 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i==pIdx->nSample
9be0: 20 74 68 65 6e 20 70 52 65 63 0a 20 20 20 20 2a   then pRec.    *
9bf0: 2a 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  * is larger than
9c00: 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20 69 6e 20   all samples in 
9c10: 74 68 65 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20  the array. */.  
9c20: 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70 65 72    tRowcnt iUpper
9c30: 2c 20 69 47 61 70 3b 0a 20 20 20 20 69 66 28 20  , iGap;.    if( 
9c40: 69 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i>=pIdx->nSample
9c50: 20 29 7b 0a 20 20 20 20 20 20 69 55 70 70 65 72   ){.      iUpper
9c60: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
9c70: 54 6f 49 6e 74 28 70 49 64 78 2d 3e 61 69 52 6f  ToInt(pIdx->aiRo
9c80: 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 20  wLogEst[0]);.   
9c90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 55   }else{.      iU
9ca0: 70 70 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69  pper = aSample[i
9cb0: 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20  ].anLt[iCol];.  
9cc0: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 4c 6f    }..    if( iLo
9cd0: 77 65 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20  wer>=iUpper ){. 
9ce0: 20 20 20 20 20 69 47 61 70 20 3d 20 30 3b 0a 20       iGap = 0;. 
9cf0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9d00: 69 47 61 70 20 3d 20 69 55 70 70 65 72 20 2d 20  iGap = iUpper - 
9d10: 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d 0a 20 20  iLower;.    }.  
9d20: 20 20 69 66 28 20 72 6f 75 6e 64 55 70 20 29 7b    if( roundUp ){
9d30: 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 28 69  .      iGap = (i
9d40: 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20 20 7d 65  Gap*2)/3;.    }e
9d50: 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20  lse{.      iGap 
9d60: 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20 20 7d 0a  = iGap/3;.    }.
9d70: 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 69      aStat[0] = i
9d80: 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b 0a 20 20  Lower + iGap;.  
9d90: 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 70 49 64    aStat[1] = pId
9da0: 78 2d 3e 61 41 76 67 45 71 5b 69 43 6f 6c 5d 3b  x->aAvgEq[iCol];
9db0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 6f  .  }..  /* Resto
9dc0: 72 65 20 74 68 65 20 70 52 65 63 2d 3e 6e 46 69  re the pRec->nFi
9dd0: 65 6c 64 20 76 61 6c 75 65 20 62 65 66 6f 72 65  eld value before
9de0: 20 72 65 74 75 72 6e 69 6e 67 2e 20 20 2a 2f 0a   returning.  */.
9df0: 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d    pRec->nField =
9e00: 20 6e 46 69 65 6c 64 3b 0a 20 20 72 65 74 75 72   nField;.  retur
9e10: 6e 20 69 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n i;.}.#endif /*
9e20: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
9e30: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f  TAT3_OR_STAT4 */
9e40: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73  ../*.** If it is
9e50: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 70 54 65 72 6d   not NULL, pTerm
9e60: 20 69 73 20 61 20 74 65 72 6d 20 74 68 61 74 20   is a term that 
9e70: 70 72 6f 76 69 64 65 73 20 61 6e 20 75 70 70 65  provides an uppe
9e80: 72 20 6f 72 20 6c 6f 77 65 72 0a 2a 2a 20 62 6f  r or lower.** bo
9e90: 75 6e 64 20 6f 6e 20 61 20 72 61 6e 67 65 20 73  und on a range s
9ea0: 63 61 6e 2e 20 57 69 74 68 6f 75 74 20 63 6f 6e  can. Without con
9eb0: 73 69 64 65 72 69 6e 67 20 70 54 65 72 6d 2c 20  sidering pTerm, 
9ec0: 69 74 20 69 73 20 65 73 74 69 6d 61 74 65 64 20  it is estimated 
9ed0: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 73 63 61  .** that the sca
9ee0: 6e 20 77 69 6c 6c 20 76 69 73 69 74 20 6e 4e 65  n will visit nNe
9ef0: 77 20 72 6f 77 73 2e 20 54 68 69 73 20 66 75 6e  w rows. This fun
9f00: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
9f10: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 65 73 74 69  e number.** esti
9f20: 6d 61 74 65 64 20 74 6f 20 62 65 20 76 69 73 69  mated to be visi
9f30: 74 65 64 20 61 66 74 65 72 20 74 61 6b 69 6e 67  ted after taking
9f40: 20 70 54 65 72 6d 20 69 6e 74 6f 20 61 63 63 6f   pTerm into acco
9f50: 75 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  unt..**.** If th
9f60: 65 20 75 73 65 72 20 65 78 70 6c 69 63 69 74 6c  e user explicitl
9f70: 79 20 73 70 65 63 69 66 69 65 64 20 61 20 6c 69  y specified a li
9f80: 6b 65 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75 65  kelihood() value
9f90: 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d 2c 0a   for this term,.
9fa0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 74 75  ** then the retu
9fb0: 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
9fc0: 6c 69 6b 65 6c 69 68 6f 6f 64 20 6d 75 6c 74 69  likelihood multi
9fd0: 70 6c 69 65 64 20 62 79 20 74 68 65 20 6e 75 6d  plied by the num
9fe0: 62 65 72 20 6f 66 0a 2a 2a 20 69 6e 70 75 74 20  ber of.** input 
9ff0: 72 6f 77 73 2e 20 4f 74 68 65 72 77 69 73 65 2c  rows. Otherwise,
a000: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
a010: 73 73 75 6d 65 73 20 74 68 61 74 20 61 6e 20 22  ssumes that an "
a020: 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 74 65 72  IS NOT NULL" ter
a030: 6d 0a 2a 2a 20 68 61 73 20 61 20 6c 69 6b 65 6c  m.** has a likel
a040: 69 68 6f 6f 64 20 6f 66 20 30 2e 35 30 2c 20 61  ihood of 0.50, a
a050: 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 74 65 72  nd any other ter
a060: 6d 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f  m a likelihood o
a070: 66 20 30 2e 32 35 2e 0a 2a 2f 0a 73 74 61 74 69  f 0.25..*/.stati
a080: 63 20 4c 6f 67 45 73 74 20 77 68 65 72 65 52 61  c LogEst whereRa
a090: 6e 67 65 41 64 6a 75 73 74 28 57 68 65 72 65 54  ngeAdjust(WhereT
a0a0: 65 72 6d 20 2a 70 54 65 72 6d 2c 20 4c 6f 67 45  erm *pTerm, LogE
a0b0: 73 74 20 6e 4e 65 77 29 7b 0a 20 20 4c 6f 67 45  st nNew){.  LogE
a0c0: 73 74 20 6e 52 65 74 20 3d 20 6e 4e 65 77 3b 0a  st nRet = nNew;.
a0d0: 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20    if( pTerm ){. 
a0e0: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72     if( pTerm->tr
a0f0: 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20  uthProb<=0 ){.  
a100: 20 20 20 20 6e 52 65 74 20 2b 3d 20 70 54 65 72      nRet += pTer
a110: 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20  m->truthProb;.  
a120: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65    }else if( (pTe
a130: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
a140: 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a  RM_VNULL)==0 ){.
a150: 20 20 20 20 20 20 6e 52 65 74 20 2d 3d 20 32 30        nRet -= 20
a160: 3b 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  ;        assert(
a170: 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   20==sqlite3LogE
a180: 73 74 28 34 29 20 29 3b 0a 20 20 20 20 7d 0a 20  st(4) );.    }. 
a190: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 74   }.  return nRet
a1a0: 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c  ;.}...#ifdef SQL
a1b0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
a1c0: 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20  _OR_STAT4./*.** 
a1d0: 52 65 74 75 72 6e 20 74 68 65 20 61 66 66 69 6e  Return the affin
a1e0: 69 74 79 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ity for a single
a1f0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e   column of an in
a200: 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  dex..*/.static c
a210: 68 61 72 20 73 71 6c 69 74 65 33 49 6e 64 65 78  har sqlite3Index
a220: 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 73  ColumnAffinity(s
a230: 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65  qlite3 *db, Inde
a240: 78 20 2a 70 49 64 78 2c 20 69 6e 74 20 69 43 6f  x *pIdx, int iCo
a250: 6c 29 7b 0a 20 20 69 66 28 20 21 70 49 64 78 2d  l){.  if( !pIdx-
a260: 3e 7a 43 6f 6c 41 66 66 20 29 7b 0a 20 20 20 20  >zColAff ){.    
a270: 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78  if( sqlite3Index
a280: 41 66 66 69 6e 69 74 79 53 74 72 28 64 62 2c 20  AffinityStr(db, 
a290: 70 49 64 78 29 3d 3d 30 20 29 20 72 65 74 75 72  pIdx)==0 ) retur
a2a0: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  n SQLITE_AFF_BLO
a2b0: 42 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  B;.  }.  return 
a2c0: 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 5b 69 43  pIdx->zColAff[iC
a2d0: 6f 6c 5d 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ol];.}.#endif...
a2e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
a2f0: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
a300: 41 54 34 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  AT4./* .** This 
a310: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
a320: 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  ed to estimate t
a330: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
a340: 73 20 76 69 73 69 74 65 64 20 62 79 20 61 0a 2a  s visited by a.*
a350: 2a 20 72 61 6e 67 65 2d 73 63 61 6e 20 6f 6e 20  * range-scan on 
a360: 61 20 73 6b 69 70 2d 73 63 61 6e 20 69 6e 64 65  a skip-scan inde
a370: 78 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  x. For example:.
a380: 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49  **.**   CREATE I
a390: 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c  NDEX i1 ON t1(a,
a3a0: 20 62 2c 20 63 29 3b 0a 2a 2a 20 20 20 53 45 4c   b, c);.**   SEL
a3b0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
a3c0: 45 52 45 20 61 3d 3f 20 41 4e 44 20 63 20 42 45  ERE a=? AND c BE
a3d0: 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 3b 0a 2a  TWEEN ? AND ?;.*
a3e0: 2a 0a 2a 2a 20 56 61 6c 75 65 20 70 4c 6f 6f 70  *.** Value pLoop
a3f0: 2d 3e 6e 4f 75 74 20 69 73 20 63 75 72 72 65 6e  ->nOut is curren
a400: 74 6c 79 20 73 65 74 20 74 6f 20 74 68 65 20 65  tly set to the e
a410: 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20  stimated number 
a420: 6f 66 20 72 6f 77 73 20 0a 2a 2a 20 76 69 73 69  of rows .** visi
a430: 74 65 64 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67  ted for scanning
a440: 20 28 61 3d 3f 20 41 4e 44 20 62 3d 3f 29 2e 20   (a=? AND b=?). 
a450: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
a460: 64 75 63 65 73 20 74 68 61 74 20 65 73 74 69 6d  duces that estim
a470: 61 74 65 20 0a 2a 2a 20 62 79 20 73 6f 6d 65 20  ate .** by some 
a480: 66 61 63 74 6f 72 20 74 6f 20 61 63 63 6f 75 6e  factor to accoun
a490: 74 20 66 6f 72 20 74 68 65 20 28 63 20 42 45 54  t for the (c BET
a4a0: 57 45 45 4e 20 3f 20 41 4e 44 20 3f 29 20 65 78  WEEN ? AND ?) ex
a4b0: 70 72 65 73 73 69 6f 6e 20 62 61 73 65 64 0a 2a  pression based.*
a4c0: 2a 20 6f 6e 20 74 68 65 20 73 74 61 74 34 20 64  * on the stat4 d
a4d0: 61 74 61 20 66 6f 72 20 74 68 65 20 69 6e 64 65  ata for the inde
a4e0: 78 2e 20 74 68 69 73 20 73 63 61 6e 20 77 69 6c  x. this scan wil
a4f0: 6c 20 62 65 20 70 65 66 6f 72 6d 65 64 20 6d 75  l be peformed mu
a500: 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73  ltiple .** times
a510: 20 28 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20   (once for each 
a520: 28 61 2c 62 29 20 63 6f 6d 62 69 6e 61 74 69 6f  (a,b) combinatio
a530: 6e 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 61  n that matches a
a540: 3d 3f 29 20 69 73 20 64 65 61 6c 74 20 77 69 74  =?) is dealt wit
a550: 68 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  h .** by the cal
a560: 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 64 6f  ler..**.** It do
a570: 65 73 20 74 68 69 73 20 62 79 20 73 63 61 6e 6e  es this by scann
a580: 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  ing through all 
a590: 73 74 61 74 34 20 73 61 6d 70 6c 65 73 2c 20 63  stat4 samples, c
a5a0: 6f 6d 70 61 72 69 6e 67 20 76 61 6c 75 65 73 0a  omparing values.
a5b0: 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ** extracted fro
a5c0: 6d 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  m pLower and pUp
a5d0: 70 65 72 20 77 69 74 68 20 74 68 65 20 63 6f 72  per with the cor
a5e0: 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d  responding colum
a5f0: 6e 20 69 6e 20 65 61 63 68 0a 2a 2a 20 73 61 6d  n in each.** sam
a600: 70 6c 65 2e 20 49 66 20 4c 20 61 6e 64 20 55 20  ple. If L and U 
a610: 61 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  are the number o
a620: 66 20 73 61 6d 70 6c 65 73 20 66 6f 75 6e 64 20  f samples found 
a630: 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  to be less than 
a640: 6f 72 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 20 74  or.** equal to t
a650: 68 65 20 76 61 6c 75 65 73 20 65 78 74 72 61 63  he values extrac
a660: 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20  ted from pLower 
a670: 61 6e 64 20 70 55 70 70 65 72 20 72 65 73 70 65  and pUpper respe
a680: 63 74 69 76 65 6c 79 2c 20 61 6e 64 0a 2a 2a 20  ctively, and.** 
a690: 4e 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  N is the total n
a6a0: 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73  umber of samples
a6b0: 2c 20 74 68 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  , the pLoop->nOu
a6c0: 74 20 76 61 6c 75 65 20 69 73 20 61 64 6a 75 73  t value is adjus
a6d0: 74 65 64 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77  ted.** as follow
a6e0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e 4f 75 74 20  s:.**.**   nOut 
a6f0: 3d 20 6e 4f 75 74 20 2a 20 28 20 6d 69 6e 28 55  = nOut * ( min(U
a700: 20 2d 20 4c 2c 20 31 29 20 2f 20 4e 20 29 0a 2a   - L, 1) / N ).*
a710: 2a 0a 2a 2a 20 49 66 20 70 4c 6f 77 65 72 20 69  *.** If pLower i
a720: 73 20 4e 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c  s NULL, or a val
a730: 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74  ue cannot be ext
a740: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
a750: 74 65 72 6d 2c 20 4c 20 69 73 0a 2a 2a 20 73 65  term, L is.** se
a760: 74 20 74 6f 20 7a 65 72 6f 2e 20 49 66 20 70 55  t to zero. If pU
a770: 70 70 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72  pper is NULL, or
a780: 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20   a value cannot 
a790: 62 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  be extracted fro
a7a0: 6d 20 69 74 2c 0a 2a 2a 20 55 20 69 73 20 73 65  m it,.** U is se
a7b0: 74 20 74 6f 20 4e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  t to N..**.** No
a7c0: 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e  rmally, this fun
a7d0: 63 74 69 6f 6e 20 73 65 74 73 20 2a 70 62 44 6f  ction sets *pbDo
a7e0: 6e 65 20 74 6f 20 31 20 62 65 66 6f 72 65 20 72  ne to 1 before r
a7f0: 65 74 75 72 6e 69 6e 67 2e 20 48 6f 77 65 76 65  eturning. Howeve
a800: 72 2c 0a 2a 2a 20 69 66 20 6e 6f 20 76 61 6c 75  r,.** if no valu
a810: 65 20 63 61 6e 20 62 65 20 65 78 74 72 61 63 74  e can be extract
a820: 65 64 20 66 72 6f 6d 20 65 69 74 68 65 72 20 70  ed from either p
a830: 4c 6f 77 65 72 20 6f 72 20 70 55 70 70 65 72 20  Lower or pUpper 
a840: 28 61 6e 64 20 73 6f 20 74 68 65 0a 2a 2a 20 65  (and so the.** e
a850: 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
a860: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 64 65  umber of rows de
a870: 6c 69 76 65 72 65 64 20 72 65 6d 61 69 6e 73 20  livered remains 
a880: 75 6e 63 68 61 6e 67 65 64 29 2c 20 2a 70 62 44  unchanged), *pbD
a890: 6f 6e 65 0a 2a 2a 20 69 73 20 6c 65 66 74 20 61  one.** is left a
a8a0: 73 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  s is..**.** If a
a8b0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
a8c0: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
a8d0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
a8e0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a  . Otherwise, .**
a8f0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
a900: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 52  tatic int whereR
a910: 61 6e 67 65 53 6b 69 70 53 63 61 6e 45 73 74 28  angeSkipScanEst(
a920: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
a930: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
a940: 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61  ng & code genera
a950: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
a960: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f    WhereTerm *pLo
a970: 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20  wer,   /* Lower 
a980: 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e  bound on the ran
a990: 67 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20  ge. ex: "x>123" 
a9a0: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
a9b0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55  .  WhereTerm *pU
a9c0: 70 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72  pper,   /* Upper
a9d0: 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61   bound on the ra
a9e0: 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22  nge. ex: "x<455"
a9f0: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
aa00: 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
aa10: 4c 6f 6f 70 2c 20 20 20 20 2f 2a 20 55 70 64 61  Loop,    /* Upda
aa20: 74 65 20 74 68 65 20 2e 6e 4f 75 74 20 76 61 6c  te the .nOut val
aa30: 75 65 20 6f 66 20 74 68 69 73 20 6c 6f 6f 70 20  ue of this loop 
aa40: 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 44 6f 6e 65  */.  int *pbDone
aa50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
aa60: 20 74 6f 20 74 72 75 65 20 69 66 20 61 74 20 6c   to true if at l
aa70: 65 61 73 74 20 6f 6e 65 20 65 78 70 72 2e 20 76  east one expr. v
aa80: 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20 2a  alue extracted *
aa90: 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20  /.){.  Index *p 
aaa0: 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
aab0: 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e  .pIndex;.  int n
aac0: 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  Eq = pLoop->u.bt
aad0: 72 65 65 2e 6e 45 71 3b 0a 20 20 73 71 6c 69 74  ree.nEq;.  sqlit
aae0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
aaf0: 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 4c 6f 77 65  >db;.  int nLowe
ab00: 72 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 6e 55  r = -1;.  int nU
ab10: 70 70 65 72 20 3d 20 70 2d 3e 6e 53 61 6d 70 6c  pper = p->nSampl
ab20: 65 2b 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  e+1;.  int rc = 
ab30: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
ab40: 20 69 43 6f 6c 20 3d 20 70 2d 3e 61 69 43 6f 6c   iCol = p->aiCol
ab50: 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 75 38 20 61  umn[nEq];.  u8 a
ab60: 66 66 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  ff = sqlite3Inde
ab70: 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28  xColumnAffinity(
ab80: 64 62 2c 20 70 2c 20 69 43 6f 6c 29 3b 0a 20 20  db, p, iCol);.  
ab90: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
aba0: 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c    .  sqlite3_val
abb0: 75 65 20 2a 70 31 20 3d 20 30 3b 20 20 20 20 20  ue *p1 = 0;     
abc0: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78       /* Value ex
abd0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f  tracted from pLo
abe0: 77 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  wer */.  sqlite3
abf0: 5f 76 61 6c 75 65 20 2a 70 32 20 3d 20 30 3b 20  _value *p2 = 0; 
ac00: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
ac10: 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
ac20: 20 70 55 70 70 65 72 20 2a 2f 0a 20 20 73 71 6c   pUpper */.  sql
ac30: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
ac40: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
ac50: 56 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20  Value extracted 
ac60: 66 72 6f 6d 20 72 65 63 6f 72 64 20 2a 2f 0a 0a  from record */..
ac70: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
ac80: 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
ac90: 50 61 72 73 65 2c 20 70 2d 3e 61 7a 43 6f 6c 6c  Parse, p->azColl
aca0: 5b 6e 45 71 5d 29 3b 0a 20 20 69 66 28 20 70 4c  [nEq]);.  if( pL
acb0: 6f 77 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  ower ){.    rc =
acc0: 20 73 71 6c 69 74 65 33 53 74 61 74 34 56 61 6c   sqlite3Stat4Val
acd0: 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73  ueFromExpr(pPars
ace0: 65 2c 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72  e, pLower->pExpr
acf0: 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 2c 20 26  ->pRight, aff, &
ad00: 70 31 29 3b 0a 20 20 20 20 6e 4c 6f 77 65 72 20  p1);.    nLower 
ad10: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
ad20: 55 70 70 65 72 20 26 26 20 72 63 3d 3d 53 51 4c  Upper && rc==SQL
ad30: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
ad40: 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 56   = sqlite3Stat4V
ad50: 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61  alueFromExpr(pPa
ad60: 72 73 65 2c 20 70 55 70 70 65 72 2d 3e 70 45 78  rse, pUpper->pEx
ad70: 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 2c  pr->pRight, aff,
ad80: 20 26 70 32 29 3b 0a 20 20 20 20 6e 55 70 70 65   &p2);.    nUppe
ad90: 72 20 3d 20 70 32 20 3f 20 30 20 3a 20 70 2d 3e  r = p2 ? 0 : p->
ada0: 6e 53 61 6d 70 6c 65 3b 0a 20 20 7d 0a 0a 20 20  nSample;.  }..  
adb0: 69 66 28 20 70 31 20 7c 7c 20 70 32 20 29 7b 0a  if( p1 || p2 ){.
adc0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
add0: 6e 74 20 6e 44 69 66 66 3b 0a 20 20 20 20 66 6f  nt nDiff;.    fo
ade0: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
adf0: 45 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 53 61  E_OK && i<p->nSa
ae00: 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mple; i++){.    
ae10: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
ae20: 61 74 34 43 6f 6c 75 6d 6e 28 64 62 2c 20 70 2d  at4Column(db, p-
ae30: 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70  >aSample[i].p, p
ae40: 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20  ->aSample[i].n, 
ae50: 6e 45 71 2c 20 26 70 56 61 6c 29 3b 0a 20 20 20  nEq, &pVal);.   
ae60: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
ae70: 45 5f 4f 4b 20 26 26 20 70 31 20 29 7b 0a 20 20  E_OK && p1 ){.  
ae80: 20 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20        int res = 
ae90: 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
aea0: 65 28 70 31 2c 20 70 56 61 6c 2c 20 70 43 6f 6c  e(p1, pVal, pCol
aeb0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
aec0: 72 65 73 3e 3d 30 20 29 20 6e 4c 6f 77 65 72 2b  res>=0 ) nLower+
aed0: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
aee0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
aef0: 4f 4b 20 26 26 20 70 32 20 29 7b 0a 20 20 20 20  OK && p2 ){.    
af00: 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 73 71      int res = sq
af10: 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
af20: 70 32 2c 20 70 56 61 6c 2c 20 70 43 6f 6c 6c 29  p2, pVal, pColl)
af30: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  ;.        if( re
af40: 73 3e 3d 30 20 29 20 6e 55 70 70 65 72 2b 2b 3b  s>=0 ) nUpper++;
af50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
af60: 20 20 20 6e 44 69 66 66 20 3d 20 28 6e 55 70 70     nDiff = (nUpp
af70: 65 72 20 2d 20 6e 4c 6f 77 65 72 29 3b 0a 20 20  er - nLower);.  
af80: 20 20 69 66 28 20 6e 44 69 66 66 3c 3d 30 20 29    if( nDiff<=0 )
af90: 20 6e 44 69 66 66 20 3d 20 31 3b 0a 0a 20 20 20   nDiff = 1;..   
afa0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
afb0: 62 6f 74 68 20 61 6e 20 75 70 70 65 72 20 61 6e  both an upper an
afc0: 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 73 70  d lower bound sp
afd0: 65 63 69 66 69 65 64 2c 20 61 6e 64 20 74 68 65  ecified, and the
afe0: 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69   .    ** compari
aff0: 73 6f 6e 73 20 69 6e 64 69 63 61 74 65 20 74 68  sons indicate th
b000: 61 74 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73  at they are clos
b010: 65 20 74 6f 67 65 74 68 65 72 2c 20 75 73 65 20  e together, use 
b020: 74 68 65 20 66 61 6c 6c 62 61 63 6b 0a 20 20 20  the fallback.   
b030: 20 2a 2a 20 6d 65 74 68 6f 64 20 28 61 73 73 75   ** method (assu
b040: 6d 65 20 74 68 61 74 20 74 68 65 20 73 63 61 6e  me that the scan
b050: 20 76 69 73 69 74 73 20 31 2f 36 34 20 6f 66 20   visits 1/64 of 
b060: 74 68 65 20 72 6f 77 73 29 20 66 6f 72 20 65 73  the rows) for es
b070: 74 69 6d 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20  timating.    ** 
b080: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
b090: 77 73 20 76 69 73 69 74 65 64 2e 20 4f 74 68 65  ws visited. Othe
b0a0: 72 77 69 73 65 2c 20 65 73 74 69 6d 61 74 65 20  rwise, estimate 
b0b0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
b0c0: 77 73 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20  ws.    ** using 
b0d0: 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72  the method descr
b0e0: 69 62 65 64 20 69 6e 20 74 68 65 20 68 65 61 64  ibed in the head
b0f0: 65 72 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20 74  er comment for t
b100: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f  his function. */
b110: 0a 20 20 20 20 69 66 28 20 6e 44 69 66 66 21 3d  .    if( nDiff!=
b120: 31 20 7c 7c 20 70 55 70 70 65 72 3d 3d 30 20 7c  1 || pUpper==0 |
b130: 7c 20 70 4c 6f 77 65 72 3d 3d 30 20 29 7b 0a 20  | pLower==0 ){. 
b140: 20 20 20 20 20 69 6e 74 20 6e 41 64 6a 75 73 74       int nAdjust
b150: 20 3d 20 28 73 71 6c 69 74 65 33 4c 6f 67 45 73   = (sqlite3LogEs
b160: 74 28 70 2d 3e 6e 53 61 6d 70 6c 65 29 20 2d 20  t(p->nSample) - 
b170: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 44  sqlite3LogEst(nD
b180: 69 66 66 29 29 3b 0a 20 20 20 20 20 20 70 4c 6f  iff));.      pLo
b190: 6f 70 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 41 64 6a  op->nOut -= nAdj
b1a0: 75 73 74 3b 0a 20 20 20 20 20 20 2a 70 62 44 6f  ust;.      *pbDo
b1b0: 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 57 48  ne = 1;.      WH
b1c0: 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 20 28  ERETRACE(0x10, (
b1d0: 22 72 61 6e 67 65 20 73 6b 69 70 2d 73 63 61 6e  "range skip-scan
b1e0: 20 72 65 67 69 6f 6e 73 3a 20 25 75 2e 2e 25 75   regions: %u..%u
b1f0: 20 20 61 64 6a 75 73 74 3d 25 64 20 65 73 74 3d    adjust=%d est=
b200: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
b210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b220: 20 20 6e 4c 6f 77 65 72 2c 20 6e 55 70 70 65 72    nLower, nUpper
b230: 2c 20 6e 41 64 6a 75 73 74 2a 2d 31 2c 20 70 4c  , nAdjust*-1, pL
b240: 6f 6f 70 2d 3e 6e 4f 75 74 29 29 3b 0a 20 20 20  oop->nOut));.   
b250: 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   }..  }else{.   
b260: 20 61 73 73 65 72 74 28 20 2a 70 62 44 6f 6e 65   assert( *pbDone
b270: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  ==0 );.  }..  sq
b280: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
b290: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  1);.  sqlite3Val
b2a0: 75 65 46 72 65 65 28 70 32 29 3b 0a 20 20 73 71  ueFree(p2);.  sq
b2b0: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
b2c0: 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Val);..  return 
b2d0: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
b2e0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
b2f0: 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a  AT3_OR_STAT4 */.
b300: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
b310: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
b320: 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  estimate the num
b330: 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
b340: 20 77 69 6c 6c 20 62 65 20 76 69 73 69 74 65 64   will be visited
b350: 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67 20  .** by scanning 
b360: 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 61 20 72  an index for a r
b370: 61 6e 67 65 20 6f 66 20 76 61 6c 75 65 73 2e 20  ange of values. 
b380: 54 68 65 20 72 61 6e 67 65 20 6d 61 79 20 68 61  The range may ha
b390: 76 65 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20 62  ve an upper.** b
b3a0: 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62 6f  ound, a lower bo
b3b0: 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54 68  und, or both. Th
b3c0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
b3d0: 65 72 6d 73 20 74 68 61 74 20 73 65 74 20 74 68  erms that set th
b3e0: 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20 6c  e upper.** and l
b3f0: 6f 77 65 72 20 62 6f 75 6e 64 73 20 61 72 65 20  ower bounds are 
b400: 72 65 70 72 65 73 65 6e 74 65 64 20 62 79 20 70  represented by p
b410: 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72  Lower and pUpper
b420: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 46   respectively. F
b430: 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61  or.** example, a
b440: 73 73 75 6d 69 6e 67 20 74 68 61 74 20 69 6e 64  ssuming that ind
b450: 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61 29  ex p is on t1(a)
b460: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52  :.**.**   ... FR
b470: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e 20  OM t1 WHERE a > 
b480: 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a  ? AND a < ? ....
b490: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
b4a0: 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20        |_____|   
b4b0: 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20  |_____|.**      
b4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4d0: 20 7c 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20   |         |.** 
b4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4f0: 20 20 20 20 70 4c 6f 77 65 72 20 20 20 20 70 55      pLower    pU
b500: 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69  pper.**.** If ei
b510: 74 68 65 72 20 6f 66 20 74 68 65 20 75 70 70 65  ther of the uppe
b520: 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64  r or lower bound
b530: 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c   is not present,
b540: 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70 61   then NULL is pa
b550: 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63 65  ssed in.** place
b560: 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f   of the correspo
b570: 6e 64 69 6e 67 20 57 68 65 72 65 54 65 72 6d 2e  nding WhereTerm.
b580: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
b590: 20 69 6e 20 28 70 42 75 69 6c 64 65 72 2d 3e 70   in (pBuilder->p
b5a0: 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
b5b0: 29 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  ) is the number 
b5c0: 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20  of the index.** 
b5d0: 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20 74  column subject t
b5e0: 6f 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73  o the range cons
b5f0: 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69  traint. Or, equi
b600: 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75  valently, the nu
b610: 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 71 75 61 6c  mber of.** equal
b620: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
b630: 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 74 68 65  optimized by the
b640: 20 70 72 6f 70 6f 73 65 64 20 69 6e 64 65 78 20   proposed index 
b650: 73 63 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c  scan. For exampl
b660: 65 2c 0a 2a 2a 20 61 73 73 75 6d 69 6e 67 20 69  e,.** assuming i
b670: 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28  ndex p is on t1(
b680: 61 2c 20 62 29 2c 20 61 6e 64 20 74 68 65 20 53  a, b), and the S
b690: 51 4c 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a  QL query is:.**.
b6a0: 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  **   ... FROM t1
b6b0: 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44   WHERE a = ? AND
b6c0: 20 62 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f   b > ? AND b < ?
b6d0: 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20   ....**.** then 
b6e0: 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20 31 20  nEq is set to 1 
b6f0: 28 61 73 20 74 68 65 20 72 61 6e 67 65 20 72 65  (as the range re
b700: 73 74 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e 2c  stricted column,
b710: 20 62 2c 20 69 73 20 74 68 65 20 73 65 63 6f 6e   b, is the secon
b720: 64 20 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20  d .** left-most 
b730: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
b740: 64 65 78 29 2e 20 4f 72 2c 20 69 66 20 74 68 65  dex). Or, if the
b750: 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a   query is:.**.**
b760: 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57     ... FROM t1 W
b770: 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61  HERE a > ? AND a
b780: 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74   < ? ....**.** t
b790: 68 65 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74  hen nEq is set t
b7a0: 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  o 0..**.** When 
b7b0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
b7c0: 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 4f 75 74 20   called, *pnOut 
b7d0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 71  is set to the sq
b7e0: 6c 69 74 65 33 4c 6f 67 45 73 74 28 29 20 6f 66  lite3LogEst() of
b7f0: 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
b800: 66 20 72 6f 77 73 20 74 68 61 74 20 74 68 65 20  f rows that the 
b810: 69 6e 64 65 78 20 73 63 61 6e 20 69 73 20 65 78  index scan is ex
b820: 70 65 63 74 65 64 20 74 6f 20 76 69 73 69 74 20  pected to visit 
b830: 77 69 74 68 6f 75 74 20 0a 2a 2a 20 63 6f 6e 73  without .** cons
b840: 69 64 65 72 69 6e 67 20 74 68 65 20 72 61 6e 67  idering the rang
b850: 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 49  e constraints. I
b860: 66 20 6e 45 71 20 69 73 20 30 2c 20 74 68 65 6e  f nEq is 0, then
b870: 20 2a 70 6e 4f 75 74 20 69 73 20 74 68 65 20 6e   *pnOut is the n
b880: 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 72 6f 77  umber of .** row
b890: 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 20  s in the index. 
b8a0: 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f  Assuming no erro
b8b0: 72 20 6f 63 63 75 72 73 2c 20 2a 70 6e 4f 75 74  r occurs, *pnOut
b8c0: 20 69 73 20 61 64 6a 75 73 74 65 64 20 28 72 65   is adjusted (re
b8d0: 64 75 63 65 64 29 0a 2a 2a 20 74 6f 20 61 63 63  duced).** to acc
b8e0: 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 72 61 6e  ount for the ran
b8f0: 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 70  ge constraints p
b900: 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72  Lower and pUpper
b910: 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e 20 74 68 65 20  ..** .** In the 
b920: 61 62 73 65 6e 63 65 20 6f 66 20 73 71 6c 69 74  absence of sqlit
b930: 65 5f 73 74 61 74 34 20 41 4e 41 4c 59 5a 45 20  e_stat4 ANALYZE 
b940: 64 61 74 61 2c 20 6f 72 20 69 66 20 73 75 63 68  data, or if such
b950: 20 64 61 74 61 20 63 61 6e 6e 6f 74 20 62 65 0a   data cannot be.
b960: 2a 2a 20 75 73 65 64 2c 20 61 20 73 69 6e 67 6c  ** used, a singl
b970: 65 20 72 61 6e 67 65 20 69 6e 65 71 75 61 6c 69  e range inequali
b980: 74 79 20 72 65 64 75 63 65 73 20 74 68 65 20 73  ty reduces the s
b990: 65 61 72 63 68 20 73 70 61 63 65 20 62 79 20 61  earch space by a
b9a0: 20 66 61 63 74 6f 72 20 6f 66 20 34 2e 20 0a 2a   factor of 4. .*
b9b0: 2a 20 61 6e 64 20 61 20 70 61 69 72 20 6f 66 20  * and a pair of 
b9c0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 78 3e 3f  constraints (x>?
b9d0: 20 41 4e 44 20 78 3c 3f 29 20 72 65 64 75 63 65   AND x<?) reduce
b9e0: 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20 6e  s the expected n
b9f0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 72 6f 77 73  umber of.** rows
ba00: 20 76 69 73 69 74 65 64 20 62 79 20 61 20 66 61   visited by a fa
ba10: 63 74 6f 72 20 6f 66 20 36 34 2e 0a 2a 2f 0a 73  ctor of 64..*/.s
ba20: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 52  tatic int whereR
ba30: 61 6e 67 65 53 63 61 6e 45 73 74 28 0a 20 20 50  angeScanEst(.  P
ba40: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
ba50: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26      /* Parsing &
ba60: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
ba70: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
ba80: 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
ba90: 70 42 75 69 6c 64 65 72 2c 0a 20 20 57 68 65 72  pBuilder,.  Wher
baa0: 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20  eTerm *pLower,  
bab0: 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20   /* Lower bound 
bac0: 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78  on the range. ex
bad0: 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20  : "x>123" Might 
bae0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65  be NULL */.  Whe
baf0: 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20  reTerm *pUpper, 
bb00: 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64    /* Upper bound
bb10: 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65   on the range. e
bb20: 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74  x: "x<455" Might
bb30: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68   be NULL */.  Wh
bb40: 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 20  ereLoop *pLoop  
bb50: 20 20 20 2f 2a 20 4d 6f 64 69 66 79 20 74 68 65     /* Modify the
bb60: 20 2e 6e 4f 75 74 20 61 6e 64 20 6d 61 79 62 65   .nOut and maybe
bb70: 20 2e 72 52 75 6e 20 66 69 65 6c 64 73 20 2a 2f   .rRun fields */
bb80: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
bb90: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
bba0: 6e 4f 75 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4f  nOut = pLoop->nO
bbb0: 75 74 3b 0a 20 20 4c 6f 67 45 73 74 20 6e 4e 65  ut;.  LogEst nNe
bbc0: 77 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  w;..#ifdef SQLIT
bbd0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
bbe0: 52 5f 53 54 41 54 34 0a 20 20 49 6e 64 65 78 20  R_STAT4.  Index 
bbf0: 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  *p = pLoop->u.bt
bc00: 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e  ree.pIndex;.  in
bc10: 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75  t nEq = pLoop->u
bc20: 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 0a 20 20 69  .btree.nEq;..  i
bc30: 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20  f( p->nSample>0 
bc40: 26 26 20 6e 45 71 3c 70 2d 3e 6e 53 61 6d 70 6c  && nEq<p->nSampl
bc50: 65 43 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  eCol ){.    if( 
bc60: 6e 45 71 3d 3d 70 42 75 69 6c 64 65 72 2d 3e 6e  nEq==pBuilder->n
bc70: 52 65 63 56 61 6c 69 64 20 29 7b 0a 20 20 20 20  RecValid ){.    
bc80: 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
bc90: 20 2a 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65   *pRec = pBuilde
bca0: 72 2d 3e 70 52 65 63 3b 0a 20 20 20 20 20 20 74  r->pRec;.      t
bcb0: 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20 20  Rowcnt a[2];.   
bcc0: 20 20 20 75 38 20 61 66 66 3b 0a 0a 20 20 20 20     u8 aff;..    
bcd0: 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 4c    /* Variable iL
bce0: 6f 77 65 72 20 77 69 6c 6c 20 62 65 20 73 65 74  ower will be set
bcf0: 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65   to the estimate
bd00: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
bd10: 66 20 72 6f 77 73 20 69 6e 20 0a 20 20 20 20 20  f rows in .     
bd20: 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 74 68   ** the index th
bd30: 61 74 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e  at are less than
bd40: 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64   the lower bound
bd50: 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20 71 75   of the range qu
bd60: 65 72 79 2e 20 54 68 65 0a 20 20 20 20 20 20 2a  ery. The.      *
bd70: 2a 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 62 65  * lower bound be
bd80: 69 6e 67 20 74 68 65 20 63 6f 6e 63 61 74 65 6e  ing the concaten
bd90: 61 74 69 6f 6e 20 6f 66 20 24 50 20 61 6e 64 20  ation of $P and 
bda0: 24 4c 2c 20 77 68 65 72 65 20 24 50 20 69 73 20  $L, where $P is 
bdb0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79  the.      ** key
bdc0: 2d 70 72 65 66 69 78 20 66 6f 72 6d 65 64 20 62  -prefix formed b
bdd0: 79 20 74 68 65 20 6e 45 71 20 76 61 6c 75 65 73  y the nEq values
bde0: 20 6d 61 74 63 68 65 64 20 61 67 61 69 6e 73 74   matched against
bdf0: 20 74 68 65 20 6e 45 71 20 6c 65 66 74 2d 6d 6f   the nEq left-mo
be00: 73 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75  st.      ** colu
be10: 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  mns of the index
be20: 2c 20 61 6e 64 20 24 4c 20 69 73 20 74 68 65 20  , and $L is the 
be30: 76 61 6c 75 65 20 69 6e 20 70 4c 6f 77 65 72 2e  value in pLower.
be40: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
be50: 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 6f 77 65 72  ** Or, if pLower
be60: 20 69 73 20 4e 55 4c 4c 20 6f 72 20 24 4c 20 63   is NULL or $L c
be70: 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74  annot be extract
be80: 65 64 20 66 72 6f 6d 20 69 74 20 28 62 65 63 61  ed from it (beca
be90: 75 73 65 20 69 74 0a 20 20 20 20 20 20 2a 2a 20  use it.      ** 
bea0: 69 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20  is not a simple 
beb0: 76 61 72 69 61 62 6c 65 20 6f 72 20 6c 69 74 65  variable or lite
bec0: 72 61 6c 20 76 61 6c 75 65 29 2c 20 74 68 65 20  ral value), the 
bed0: 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74  lower bound of t
bee0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 72 61 6e 67  he.      ** rang
bef0: 65 20 69 73 20 24 50 2e 20 44 75 65 20 74 6f 20  e is $P. Due to 
bf00: 61 20 71 75 69 72 6b 20 69 6e 20 74 68 65 20 77  a quirk in the w
bf10: 61 79 20 77 68 65 72 65 4b 65 79 53 74 61 74 73  ay whereKeyStats
bf20: 28 29 20 77 6f 72 6b 73 2c 20 65 76 65 6e 0a 20  () works, even. 
bf30: 20 20 20 20 20 2a 2a 20 69 66 20 24 4c 20 69 73       ** if $L is
bf40: 20 61 76 61 69 6c 61 62 6c 65 2c 20 77 68 65 72   available, wher
bf50: 65 4b 65 79 53 74 61 74 73 28 29 20 69 73 20 63  eKeyStats() is c
bf60: 61 6c 6c 65 64 20 66 6f 72 20 62 6f 74 68 20 28  alled for both (
bf70: 24 50 29 20 61 6e 64 20 0a 20 20 20 20 20 20 2a  $P) and .      *
bf80: 2a 20 28 24 50 3a 24 4c 29 20 61 6e 64 20 74 68  * ($P:$L) and th
bf90: 65 20 6c 61 72 67 65 72 20 6f 66 20 74 68 65 20  e larger of the 
bfa0: 74 77 6f 20 72 65 74 75 72 6e 65 64 20 76 61 6c  two returned val
bfb0: 75 65 73 20 69 73 20 75 73 65 64 2e 0a 20 20 20  ues is used..   
bfc0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53     **.      ** S
bfd0: 69 6d 69 6c 61 72 6c 79 2c 20 69 55 70 70 65 72  imilarly, iUpper
bfe0: 20 69 73 20 74 6f 20 62 65 20 73 65 74 20 74 6f   is to be set to
bff0: 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66   the estimate of
c000: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
c010: 6f 77 73 0a 20 20 20 20 20 20 2a 2a 20 6c 65 73  ows.      ** les
c020: 73 20 74 68 61 6e 20 74 68 65 20 75 70 70 65 72  s than the upper
c030: 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61   bound of the ra
c040: 6e 67 65 20 71 75 65 72 79 2e 20 57 68 65 72 65  nge query. Where
c050: 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64   the upper bound
c060: 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74  .      ** is eit
c070: 68 65 72 20 28 24 50 29 20 6f 72 20 28 24 50 3a  her ($P) or ($P:
c080: 24 55 29 2e 20 41 67 61 69 6e 2c 20 65 76 65 6e  $U). Again, even
c090: 20 69 66 20 24 55 20 69 73 20 61 76 61 69 6c 61   if $U is availa
c0a0: 62 6c 65 2c 20 62 6f 74 68 20 76 61 6c 75 65 73  ble, both values
c0b0: 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 69 55 70  .      ** of iUp
c0c0: 70 65 72 20 61 72 65 20 72 65 71 75 65 73 74 65  per are requeste
c0d0: 64 20 6f 66 20 77 68 65 72 65 4b 65 79 53 74 61  d of whereKeySta
c0e0: 74 73 28 29 20 61 6e 64 20 74 68 65 20 73 6d 61  ts() and the sma
c0f0: 6c 6c 65 72 20 75 73 65 64 2e 0a 20 20 20 20 20  ller used..     
c100: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
c110: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
c120: 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20  between the two 
c130: 62 6f 75 6e 64 73 20 69 73 20 74 68 65 6e 20 6a  bounds is then j
c140: 75 73 74 20 69 55 70 70 65 72 2d 69 4c 6f 77 65  ust iUpper-iLowe
c150: 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  r..      */.    
c160: 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72    tRowcnt iLower
c170: 3b 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65  ;     /* Rows le
c180: 73 73 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65  ss than the lowe
c190: 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  r bound */.     
c1a0: 20 74 52 6f 77 63 6e 74 20 69 55 70 70 65 72 3b   tRowcnt iUpper;
c1b0: 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65 73       /* Rows les
c1c0: 73 20 74 68 61 6e 20 74 68 65 20 75 70 70 65 72  s than the upper
c1d0: 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   bound */.      
c1e0: 69 6e 74 20 69 4c 77 72 49 64 78 20 3d 20 2d 32  int iLwrIdx = -2
c1f0: 3b 20 20 20 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d  ;   /* aSample[]
c200: 20 66 6f 72 20 74 68 65 20 6c 6f 77 65 72 20 62   for the lower b
c210: 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ound */.      in
c220: 74 20 69 55 70 72 49 64 78 20 3d 20 2d 31 3b 20  t iUprIdx = -1; 
c230: 20 20 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20 66    /* aSample[] f
c240: 6f 72 20 74 68 65 20 75 70 70 65 72 20 62 6f 75  or the upper bou
c250: 6e 64 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28  nd */..      if(
c260: 20 70 52 65 63 20 29 7b 0a 20 20 20 20 20 20 20   pRec ){.       
c270: 20 74 65 73 74 63 61 73 65 28 20 70 52 65 63 2d   testcase( pRec-
c280: 3e 6e 46 69 65 6c 64 21 3d 70 42 75 69 6c 64 65  >nField!=pBuilde
c290: 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a  r->nRecValid );.
c2a0: 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46          pRec->nF
c2b0: 69 65 6c 64 20 3d 20 70 42 75 69 6c 64 65 72 2d  ield = pBuilder-
c2c0: 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 20 20  >nRecValid;.    
c2d0: 20 20 7d 0a 20 20 20 20 20 20 61 66 66 20 3d 20    }.      aff = 
c2e0: 73 71 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75  sqlite3IndexColu
c2f0: 6d 6e 41 66 66 69 6e 69 74 79 28 70 50 61 72 73  mnAffinity(pPars
c300: 65 2d 3e 64 62 2c 20 70 2c 20 6e 45 71 29 3b 0a  e->db, p, nEq);.
c310: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 45        assert( nE
c320: 71 21 3d 70 2d 3e 6e 4b 65 79 43 6f 6c 20 7c 7c  q!=p->nKeyCol ||
c330: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
c340: 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20  _INTEGER );.    
c350: 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 69    /* Determine i
c360: 4c 6f 77 65 72 20 61 6e 64 20 69 55 70 70 65 72  Lower and iUpper
c370: 20 75 73 69 6e 67 20 28 24 50 29 20 6f 6e 6c 79   using ($P) only
c380: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e  . */.      if( n
c390: 45 71 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Eq==0 ){.       
c3a0: 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20   iLower = 0;.   
c3b0: 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 70 2d       iUpper = p-
c3c0: 3e 6e 52 6f 77 45 73 74 30 3b 0a 20 20 20 20 20  >nRowEst0;.     
c3d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c3e0: 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61  /* Note: this ca
c3f0: 6c 6c 20 63 6f 75 6c 64 20 62 65 20 6f 70 74 69  ll could be opti
c400: 6d 69 7a 65 64 20 61 77 61 79 20 2d 20 73 69 6e  mized away - sin
c410: 63 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  ce the same valu
c420: 65 73 20 6d 75 73 74 20 0a 20 20 20 20 20 20 20  es must .       
c430: 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 72 65   ** have been re
c440: 71 75 65 73 74 65 64 20 77 68 65 6e 20 74 65 73  quested when tes
c450: 74 69 6e 67 20 6b 65 79 20 24 50 20 69 6e 20 77  ting key $P in w
c460: 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
c470: 28 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ().  */.        
c480: 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50  whereKeyStats(pP
c490: 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30  arse, p, pRec, 0
c4a0: 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20 69 4c  , a);.        iL
c4b0: 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20  ower = a[0];.   
c4c0: 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 5b       iUpper = a[
c4d0: 30 5d 20 2b 20 61 5b 31 5d 3b 0a 20 20 20 20 20  0] + a[1];.     
c4e0: 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
c4f0: 28 20 70 4c 6f 77 65 72 3d 3d 30 20 7c 7c 20 28  ( pLower==0 || (
c500: 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pLower->eOperato
c510: 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45  r & (WO_GT|WO_GE
c520: 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  ))!=0 );.      a
c530: 73 73 65 72 74 28 20 70 55 70 70 65 72 3d 3d 30  ssert( pUpper==0
c540: 20 7c 7c 20 28 70 55 70 70 65 72 2d 3e 65 4f 70   || (pUpper->eOp
c550: 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c  erator & (WO_LT|
c560: 57 4f 5f 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20  WO_LE))!=0 );.  
c570: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
c580: 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a  SortOrder!=0 );.
c590: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 53 6f        if( p->aSo
c5a0: 72 74 4f 72 64 65 72 5b 6e 45 71 5d 20 29 7b 0a  rtOrder[nEq] ){.
c5b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
c5c0: 6f 6c 65 73 20 6f 66 20 70 4c 6f 77 65 72 20 61  oles of pLower a
c5d0: 6e 64 20 70 55 70 70 65 72 20 61 72 65 20 73 77  nd pUpper are sw
c5e0: 61 70 70 65 64 20 66 6f 72 20 61 20 44 45 53 43  apped for a DESC
c5f0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
c600: 20 20 53 57 41 50 28 57 68 65 72 65 54 65 72 6d    SWAP(WhereTerm
c610: 2a 2c 20 70 4c 6f 77 65 72 2c 20 70 55 70 70 65  *, pLower, pUppe
c620: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  r);.      }..   
c630: 20 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c     /* If possibl
c640: 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68  e, improve on th
c650: 65 20 69 4c 6f 77 65 72 20 65 73 74 69 6d 61 74  e iLower estimat
c660: 65 20 75 73 69 6e 67 20 28 24 50 3a 24 4c 29 2e  e using ($P:$L).
c670: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4c   */.      if( pL
c680: 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ower ){.        
c690: 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20 20 20 20  int bOk;        
c6a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
c6b0: 72 75 65 20 69 66 20 76 61 6c 75 65 20 69 73 20  rue if value is 
c6c0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70  extracted from p
c6d0: 45 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  Expr */.        
c6e0: 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c  Expr *pExpr = pL
c6f0: 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69  ower->pExpr->pRi
c700: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ght;.        rc 
c710: 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72  = sqlite3Stat4Pr
c720: 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72  obeSetValue(pPar
c730: 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45  se, p, &pRec, pE
c740: 78 70 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26  xpr, aff, nEq, &
c750: 62 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  bOk);.        if
c760: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
c770: 26 26 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20  && bOk ){.      
c780: 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4e 65 77      tRowcnt iNew
c790: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4c 77 72  ;.          iLwr
c7a0: 49 64 78 20 3d 20 77 68 65 72 65 4b 65 79 53 74  Idx = whereKeySt
c7b0: 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ats(pParse, p, p
c7c0: 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20  Rec, 0, a);.    
c7d0: 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30        iNew = a[0
c7e0: 5d 20 2b 20 28 28 70 4c 6f 77 65 72 2d 3e 65 4f  ] + ((pLower->eO
c7f0: 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54  perator & (WO_GT
c800: 7c 57 4f 5f 4c 45 29 29 20 3f 20 61 5b 31 5d 20  |WO_LE)) ? a[1] 
c810: 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  : 0);.          
c820: 69 66 28 20 69 4e 65 77 3e 69 4c 6f 77 65 72 20  if( iNew>iLower 
c830: 29 20 69 4c 6f 77 65 72 20 3d 20 69 4e 65 77 3b  ) iLower = iNew;
c840: 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 2d  .          nOut-
c850: 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 6f  -;.          pLo
c860: 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  wer = 0;.       
c870: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
c880: 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65    /* If possible
c890: 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65  , improve on the
c8a0: 20 69 55 70 70 65 72 20 65 73 74 69 6d 61 74 65   iUpper estimate
c8b0: 20 75 73 69 6e 67 20 28 24 50 3a 24 55 29 2e 20   using ($P:$U). 
c8c0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 55 70  */.      if( pUp
c8d0: 70 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69  per ){.        i
c8e0: 6e 74 20 62 4f 6b 3b 20 20 20 20 20 20 20 20 20  nt bOk;         
c8f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
c900: 75 65 20 69 66 20 76 61 6c 75 65 20 69 73 20 65  ue if value is e
c910: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45  xtracted from pE
c920: 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 45  xpr */.        E
c930: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 55 70  xpr *pExpr = pUp
c940: 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  per->pExpr->pRig
c950: 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ht;.        rc =
c960: 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
c970: 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73  beSetValue(pPars
c980: 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78  e, p, &pRec, pEx
c990: 70 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26 62  pr, aff, nEq, &b
c9a0: 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Ok);.        if(
c9b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
c9c0: 26 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20 20  & bOk ){.       
c9d0: 20 20 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b     tRowcnt iNew;
c9e0: 0a 20 20 20 20 20 20 20 20 20 20 69 55 70 72 49  .          iUprI
c9f0: 64 78 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61  dx = whereKeySta
ca00: 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52  ts(pParse, p, pR
ca10: 65 63 2c 20 31 2c 20 61 29 3b 0a 20 20 20 20 20  ec, 1, a);.     
ca20: 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d       iNew = a[0]
ca30: 20 2b 20 28 28 70 55 70 70 65 72 2d 3e 65 4f 70   + ((pUpper->eOp
ca40: 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c  erator & (WO_GT|
ca50: 57 4f 5f 4c 45 29 29 20 3f 20 61 5b 31 5d 20 3a  WO_LE)) ? a[1] :
ca60: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
ca70: 66 28 20 69 4e 65 77 3c 69 55 70 70 65 72 20 29  f( iNew<iUpper )
ca80: 20 69 55 70 70 65 72 20 3d 20 69 4e 65 77 3b 0a   iUpper = iNew;.
ca90: 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d            nOut--
caa0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 55 70 70  ;.          pUpp
cab0: 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  er = 0;.        
cac0: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
cad0: 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20   pBuilder->pRec 
cae0: 3d 20 70 52 65 63 3b 0a 20 20 20 20 20 20 69 66  = pRec;.      if
caf0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
cb00: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
cb10: 55 70 70 65 72 3e 69 4c 6f 77 65 72 20 29 7b 0a  Upper>iLower ){.
cb20: 20 20 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d            nNew =
cb30: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 69   sqlite3LogEst(i
cb40: 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 29 3b  Upper - iLower);
cb50: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55  .          /* TU
cb60: 4e 49 4e 47 3a 20 20 49 66 20 62 6f 74 68 20 69  NING:  If both i
cb70: 55 70 70 65 72 20 61 6e 64 20 69 4c 6f 77 65 72  Upper and iLower
cb80: 20 61 72 65 20 64 65 72 69 76 65 64 20 66 72 6f   are derived fro
cb90: 6d 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20  m the same.     
cba0: 20 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65 2c 20       ** sample, 
cbb0: 74 68 65 6e 20 61 73 73 75 6d 65 20 74 68 65 79  then assume they
cbc0: 20 61 72 65 20 34 78 20 6d 6f 72 65 20 73 65 6c   are 4x more sel
cbd0: 65 63 74 69 76 65 2e 20 20 54 68 69 73 20 62 72  ective.  This br
cbe0: 69 6e 67 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ings.          *
cbf0: 2a 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  * the estimated 
cc00: 73 65 6c 65 63 74 69 76 69 74 79 20 6d 6f 72 65  selectivity more
cc10: 20 69 6e 20 6c 69 6e 65 20 77 69 74 68 20 77 68   in line with wh
cc20: 61 74 20 69 74 20 77 6f 75 6c 64 20 62 65 0a 20  at it would be. 
cc30: 20 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 65           ** if e
cc40: 73 74 69 6d 61 74 65 64 20 77 69 74 68 6f 75 74  stimated without
cc50: 20 74 68 65 20 75 73 65 20 6f 66 20 53 54 41 54   the use of STAT
cc60: 33 2f 34 20 74 61 62 6c 65 73 2e 20 2a 2f 0a 20  3/4 tables. */. 
cc70: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4c 77           if( iLw
cc80: 72 49 64 78 3d 3d 69 55 70 72 49 64 78 20 29 20  rIdx==iUprIdx ) 
cc90: 6e 4e 65 77 20 2d 3d 20 32 30 3b 20 20 61 73 73  nNew -= 20;  ass
cca0: 65 72 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33  ert( 20==sqlite3
ccb0: 4c 6f 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20  LogEst(4) );.   
ccc0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ccd0: 20 20 20 20 20 20 6e 4e 65 77 20 3d 20 31 30 3b        nNew = 10;
cce0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ccf0: 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  10==sqlite3LogEs
cd00: 74 28 32 29 20 29 3b 0a 20 20 20 20 20 20 20 20  t(2) );.        
cd10: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4e  }.        if( nN
cd20: 65 77 3c 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20  ew<nOut ){.     
cd30: 20 20 20 20 20 6e 4f 75 74 20 3d 20 6e 4e 65 77       nOut = nNew
cd40: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
cd50: 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
cd60: 78 31 30 2c 20 28 22 53 54 41 54 34 20 72 61 6e  x10, ("STAT4 ran
cd70: 67 65 20 73 63 61 6e 3a 20 25 75 2e 2e 25 75 20  ge scan: %u..%u 
cd80: 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   est=%d\n",.    
cd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cda0: 20 20 20 20 20 20 20 28 75 33 32 29 69 4c 6f 77         (u32)iLow
cdb0: 65 72 2c 20 28 75 33 32 29 69 55 70 70 65 72 2c  er, (u32)iUpper,
cdc0: 20 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 7d   nOut));.      }
cdd0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
cde0: 20 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b    int bDone = 0;
cdf0: 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
ce00: 65 52 61 6e 67 65 53 6b 69 70 53 63 61 6e 45 73  eRangeSkipScanEs
ce10: 74 28 70 50 61 72 73 65 2c 20 70 4c 6f 77 65 72  t(pParse, pLower
ce20: 2c 20 70 55 70 70 65 72 2c 20 70 4c 6f 6f 70 2c  , pUpper, pLoop,
ce30: 20 26 62 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20   &bDone);.      
ce40: 69 66 28 20 62 44 6f 6e 65 20 29 20 72 65 74 75  if( bDone ) retu
ce50: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
ce60: 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
ce70: 50 41 52 41 4d 45 54 45 52 28 70 50 61 72 73 65  PARAMETER(pParse
ce80: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
ce90: 4d 45 54 45 52 28 70 42 75 69 6c 64 65 72 29 3b  METER(pBuilder);
cea0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65  .  assert( pLowe
ceb0: 72 20 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a 23  r || pUpper );.#
cec0: 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
ced0: 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55  pUpper==0 || (pU
cee0: 70 70 65 72 2d 3e 77 74 46 6c 61 67 73 20 26 20  pper->wtFlags & 
cef0: 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29  TERM_VNULL)==0 )
cf00: 3b 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65  ;.  nNew = where
cf10: 52 61 6e 67 65 41 64 6a 75 73 74 28 70 4c 6f 77  RangeAdjust(pLow
cf20: 65 72 2c 20 6e 4f 75 74 29 3b 0a 20 20 6e 4e 65  er, nOut);.  nNe
cf30: 77 20 3d 20 77 68 65 72 65 52 61 6e 67 65 41 64  w = whereRangeAd
cf40: 6a 75 73 74 28 70 55 70 70 65 72 2c 20 6e 4e 65  just(pUpper, nNe
cf50: 77 29 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e 47  w);..  /* TUNING
cf60: 3a 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f  : If there is bo
cf70: 74 68 20 61 6e 20 75 70 70 65 72 20 61 6e 64 20  th an upper and 
cf80: 6c 6f 77 65 72 20 6c 69 6d 69 74 20 61 6e 64 20  lower limit and 
cf90: 6e 65 69 74 68 65 72 20 6c 69 6d 69 74 0a 20 20  neither limit.  
cfa0: 2a 2a 20 68 61 73 20 61 6e 20 61 70 70 6c 69 63  ** has an applic
cfb0: 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 6c 69  ation-defined li
cfc0: 6b 65 6c 69 68 6f 6f 64 28 29 2c 20 61 73 73 75  kelihood(), assu
cfd0: 6d 65 20 74 68 65 20 72 61 6e 67 65 20 69 73 0a  me the range is.
cfe0: 20 20 2a 2a 20 72 65 64 75 63 65 64 20 62 79 20    ** reduced by 
cff0: 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 37 35  an additional 75
d000: 25 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  %. This means th
d010: 61 74 2c 20 62 79 20 64 65 66 61 75 6c 74 2c 20  at, by default, 
d020: 61 6e 20 6f 70 65 6e 2d 65 6e 64 65 64 0a 20 20  an open-ended.  
d030: 2a 2a 20 72 61 6e 67 65 20 71 75 65 72 79 20 28  ** range query (
d040: 65 2e 67 2e 20 63 6f 6c 20 3e 20 3f 29 20 69 73  e.g. col > ?) is
d050: 20 61 73 73 75 6d 65 64 20 74 6f 20 6d 61 74 63   assumed to matc
d060: 68 20 31 2f 34 20 6f 66 20 74 68 65 20 72 6f 77  h 1/4 of the row
d070: 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e  s in the.  ** in
d080: 64 65 78 2e 20 57 68 69 6c 65 20 61 20 63 6c 6f  dex. While a clo
d090: 73 65 64 20 72 61 6e 67 65 20 28 65 2e 67 2e 20  sed range (e.g. 
d0a0: 63 6f 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e  col BETWEEN ? AN
d0b0: 44 20 3f 29 20 69 73 20 65 73 74 69 6d 61 74 65  D ?) is estimate
d0c0: 64 20 74 6f 0a 20 20 2a 2a 20 6d 61 74 63 68 20  d to.  ** match 
d0d0: 31 2f 36 34 20 6f 66 20 74 68 65 20 69 6e 64 65  1/64 of the inde
d0e0: 78 2e 20 2a 2f 20 0a 20 20 69 66 28 20 70 4c 6f  x. */ .  if( pLo
d0f0: 77 65 72 20 26 26 20 70 4c 6f 77 65 72 2d 3e 74  wer && pLower->t
d100: 72 75 74 68 50 72 6f 62 3e 30 20 26 26 20 70 55  ruthProb>0 && pU
d110: 70 70 65 72 20 26 26 20 70 55 70 70 65 72 2d 3e  pper && pUpper->
d120: 74 72 75 74 68 50 72 6f 62 3e 30 20 29 7b 0a 20  truthProb>0 ){. 
d130: 20 20 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 0a 20     nNew -= 20;. 
d140: 20 7d 0a 0a 20 20 6e 4f 75 74 20 2d 3d 20 28 70   }..  nOut -= (p
d150: 4c 6f 77 65 72 21 3d 30 29 20 2b 20 28 70 55 70  Lower!=0) + (pUp
d160: 70 65 72 21 3d 30 29 3b 0a 20 20 69 66 28 20 6e  per!=0);.  if( n
d170: 4e 65 77 3c 31 30 20 29 20 6e 4e 65 77 20 3d 20  New<10 ) nNew = 
d180: 31 30 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c 6e  10;.  if( nNew<n
d190: 4f 75 74 20 29 20 6e 4f 75 74 20 3d 20 6e 4e 65  Out ) nOut = nNe
d1a0: 77 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57  w;.#if defined(W
d1b0: 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
d1c0: 44 29 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  D).  if( pLoop->
d1d0: 6e 4f 75 74 3e 6e 4f 75 74 20 29 7b 0a 20 20 20  nOut>nOut ){.   
d1e0: 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30   WHERETRACE(0x10
d1f0: 2c 28 22 52 61 6e 67 65 20 73 63 61 6e 20 6c 6f  ,("Range scan lo
d200: 77 65 72 73 20 6e 4f 75 74 20 66 72 6f 6d 20 25  wers nOut from %
d210: 64 20 74 6f 20 25 64 5c 6e 22 2c 0a 20 20 20 20  d to %d\n",.    
d220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d230: 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2c 20 6e 4f 75  pLoop->nOut, nOu
d240: 74 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  t));.  }.#endif.
d250: 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20    pLoop->nOut = 
d260: 28 4c 6f 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20  (LogEst)nOut;.  
d270: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
d280: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
d290: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
d2a0: 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  4./*.** Estimate
d2b0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
d2c0: 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
d2d0: 20 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20   returned based 
d2e0: 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74  on.** an equalit
d2f0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56  y constraint x=V
d300: 41 4c 55 45 20 61 6e 64 20 77 68 65 72 65 20 74  ALUE and where t
d310: 68 61 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73  hat VALUE occurs
d320: 20 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f   in.** the histo
d330: 67 72 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73  gram data.  This
d340: 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e   only works when
d350: 20 78 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d   x is the left-m
d360: 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66  ost.** column of
d370: 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71   an index and sq
d380: 6c 69 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f  lite_stat3 histo
d390: 67 72 61 6d 20 64 61 74 61 20 69 73 20 61 76 61  gram data is ava
d3a0: 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68  ilable.** for th
d3b0: 61 74 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20  at index.  When 
d3c0: 70 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74  pExpr==NULL that
d3d0: 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74   means the const
d3e0: 72 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49  raint is.** "x I
d3f0: 53 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20  S NULL" instead 
d400: 6f 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a  of "x=VALUE"..**
d410: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73  .** Write the es
d420: 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e  timated row coun
d430: 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e  t into *pnRow an
d440: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
d450: 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c  OK. .** If unabl
d460: 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74  e to make an est
d470: 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e  imate, leave *pn
d480: 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  Row unchanged an
d490: 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d  d return.** non-
d4a0: 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  zero..**.** This
d4b0: 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69   routine can fai
d4c0: 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c  l if it is unabl
d4d0: 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c  e to load a coll
d4e0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a  ating sequence.*
d4f0: 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  * required for s
d500: 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e  tring comparison
d510: 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74  , or if unable t
d520: 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
d530: 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63  y.** for a UTF c
d540: 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72  onversion requir
d550: 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f  ed for compariso
d560: 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73  n.  The error is
d570: 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68   stored.** in th
d580: 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75  e pParse structu
d590: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
d5a0: 74 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e  t whereEqualScan
d5b0: 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Est(.  Parse *pP
d5c0: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
d5d0: 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65  arsing & code ge
d5e0: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
d5f0: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42   */.  WhereLoopB
d600: 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
d610: 2c 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  ,.  Expr *pExpr,
d620: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
d630: 65 73 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45  ession for VALUE
d640: 20 69 6e 20 74 68 65 20 78 3d 56 41 4c 55 45 20   in the x=VALUE 
d650: 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
d660: 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20  tRowcnt *pnRow  
d670: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
d680: 65 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73  e revised row es
d690: 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29  timate here */.)
d6a0: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70  {.  Index *p = p
d6b0: 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
d6c0: 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
d6d0: 20 69 6e 74 20 6e 45 71 20 3d 20 70 42 75 69 6c   int nEq = pBuil
d6e0: 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72  der->pNew->u.btr
d6f0: 65 65 2e 6e 45 71 3b 0a 20 20 55 6e 70 61 63 6b  ee.nEq;.  Unpack
d700: 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d  edRecord *pRec =
d710: 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b   pBuilder->pRec;
d720: 0a 20 20 75 38 20 61 66 66 3b 20 20 20 20 20 20  .  u8 aff;      
d730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d740: 43 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20  Column affinity 
d750: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
d760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d770: 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65  * Subfunction re
d780: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74  turn code */.  t
d790: 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20  Rowcnt a[2];    
d7a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
d7b0: 69 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20  istics */.  int 
d7c0: 62 4f 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  bOk;..  assert( 
d7d0: 6e 45 71 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  nEq>=1 );.  asse
d7e0: 72 74 28 20 6e 45 71 3c 3d 70 2d 3e 6e 43 6f 6c  rt( nEq<=p->nCol
d7f0: 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  umn );.  assert(
d800: 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29   p->aSample!=0 )
d810: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
d820: 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73  Sample>0 );.  as
d830: 73 65 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e  sert( pBuilder->
d840: 6e 52 65 63 56 61 6c 69 64 3c 6e 45 71 20 29 3b  nRecValid<nEq );
d850: 0a 0a 20 20 2f 2a 20 49 66 20 76 61 6c 75 65 73  ..  /* If values
d860: 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62   are not availab
d870: 6c 65 20 66 6f 72 20 61 6c 6c 20 66 69 65 6c 64  le for all field
d880: 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74  s of the index t
d890: 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a 2a 20  o the left.  ** 
d8a0: 6f 66 20 74 68 69 73 20 6f 6e 65 2c 20 6e 6f 20  of this one, no 
d8b0: 65 73 74 69 6d 61 74 65 20 63 61 6e 20 62 65 20  estimate can be 
d8c0: 6d 61 64 65 2e 20 52 65 74 75 72 6e 20 53 51 4c  made. Return SQL
d8d0: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 2e 20 2a 2f  ITE_NOTFOUND. */
d8e0: 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d  .  if( pBuilder-
d8f0: 3e 6e 52 65 63 56 61 6c 69 64 3c 28 6e 45 71 2d  >nRecValid<(nEq-
d900: 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  1) ){.    return
d910: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
d920: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73  ;.  }..  /* This
d930: 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
d940: 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68 65 20 63 61  ion only. The ca
d950: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 53 74 61  ll to sqlite3Sta
d960: 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28  t4ProbeSetValue(
d970: 29 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 77 6f 75  ).  ** below wou
d980: 6c 64 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  ld return the sa
d990: 6d 65 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20  me value.  */.  
d9a0: 69 66 28 20 6e 45 71 3e 3d 70 2d 3e 6e 43 6f 6c  if( nEq>=p->nCol
d9b0: 75 6d 6e 20 29 7b 0a 20 20 20 20 2a 70 6e 52 6f  umn ){.    *pnRo
d9c0: 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  w = 1;.    retur
d9d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
d9e0: 0a 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65  ..  aff = sqlite
d9f0: 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41 66 66 69  3IndexColumnAffi
da00: 6e 69 74 79 28 70 50 61 72 73 65 2d 3e 64 62 2c  nity(pParse->db,
da10: 20 70 2c 20 6e 45 71 2d 31 29 3b 0a 20 20 72 63   p, nEq-1);.  rc
da20: 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 50   = sqlite3Stat4P
da30: 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50 61  robeSetValue(pPa
da40: 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70  rse, p, &pRec, p
da50: 45 78 70 72 2c 20 61 66 66 2c 20 6e 45 71 2d 31  Expr, aff, nEq-1
da60: 2c 20 26 62 4f 6b 29 3b 0a 20 20 70 42 75 69 6c  , &bOk);.  pBuil
da70: 64 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63  der->pRec = pRec
da80: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
da90: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
daa0: 63 3b 0a 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20  c;.  if( bOk==0 
dab0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
dac0: 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 70 42 75 69  NOTFOUND;.  pBui
dad0: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
dae0: 3d 20 6e 45 71 3b 0a 0a 20 20 77 68 65 72 65 4b  = nEq;..  whereK
daf0: 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
db00: 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a  p, pRec, 0, a);.
db10: 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
db20: 30 2c 28 22 65 71 75 61 6c 69 74 79 20 73 63 61  0,("equality sca
db30: 6e 20 72 65 67 69 6f 6e 73 3a 20 25 64 5c 6e 22  n regions: %d\n"
db40: 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20  , (int)a[1]));. 
db50: 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a   *pnRow = a[1];.
db60: 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a    .  return rc;.
db70: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
db80: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
db90: 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 23 69 66  OR_STAT4 */..#if
dba0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
dbb0: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
dbc0: 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
dbd0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
dbe0: 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
dbf0: 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f  returned based o
dc00: 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74  n.** an IN const
dc10: 72 61 69 6e 74 20 77 68 65 72 65 20 74 68 65 20  raint where the 
dc20: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
dc30: 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
dc40: 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74 20  or.** is a list 
dc50: 6f 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61 6d  of values.  Exam
dc60: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ple:.**.**      
dc70: 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c    WHERE x IN (1,
dc80: 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69  2,3,4).**.** Wri
dc90: 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  te the estimated
dca0: 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20   row count into 
dcb0: 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72  *pnRow and retur
dcc0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a  n SQLITE_OK. .**
dcd0: 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61   If unable to ma
dce0: 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20  ke an estimate, 
dcf0: 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63  leave *pnRow unc
dd00: 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72  hanged and retur
dd10: 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  n.** non-zero..*
dd20: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
dd30: 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74  e can fail if it
dd40: 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f   is unable to lo
dd50: 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ad a collating s
dd60: 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69  equence.** requi
dd70: 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63  red for string c
dd80: 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66  omparison, or if
dd90: 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63   unable to alloc
dda0: 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  ate memory.** fo
ddb0: 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69  r a UTF conversi
ddc0: 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  on required for 
ddd0: 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65  comparison.  The
dde0: 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64   error is stored
ddf0: 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73  .** in the pPars
de00: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
de10: 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
de20: 49 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  InScanEst(.  Par
de30: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
de40: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
de50: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
de60: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
de70: 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
de80: 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 4c 69  uilder,.  ExprLi
de90: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
dea0: 2a 20 54 68 65 20 76 61 6c 75 65 20 6c 69 73 74  * The value list
deb0: 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 22   on the RHS of "
dec0: 78 20 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e  x IN (v1,v2,v3,.
ded0: 2e 2e 29 22 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  ..)" */.  tRowcn
dee0: 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f  t *pnRow       /
def0: 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76 69  * Write the revi
df00: 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65  sed row estimate
df10: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e   here */.){.  In
df20: 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65  dex *p = pBuilde
df30: 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
df40: 2e 70 49 6e 64 65 78 3b 0a 20 20 69 36 34 20 6e  .pIndex;.  i64 n
df50: 52 6f 77 30 20 3d 20 73 71 6c 69 74 65 33 4c 6f  Row0 = sqlite3Lo
df60: 67 45 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69 52  gEstToInt(p->aiR
df70: 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20  owLogEst[0]);.  
df80: 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20  int nRecValid = 
df90: 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
dfa0: 6c 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  lid;.  int rc = 
dfb0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f  SQLITE_OK;     /
dfc0: 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65  * Subfunction re
dfd0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74  turn code */.  t
dfe0: 52 6f 77 63 6e 74 20 6e 45 73 74 3b 20 20 20 20  Rowcnt nEst;    
dff0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
e000: 20 6f 66 20 72 6f 77 73 20 66 6f 72 20 61 20 73   of rows for a s
e010: 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20  ingle term */.  
e020: 74 52 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74 20  tRowcnt nRowEst 
e030: 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20 65  = 0;    /* New e
e040: 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
e050: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f  umber of rows */
e060: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
e070: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
e080: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
e090: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d   assert( p->aSam
e0a0: 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28  ple!=0 );.  for(
e0b0: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
e0c0: 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e  OK && i<pList->n
e0d0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
e0e0: 6e 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20  nEst = nRow0;.  
e0f0: 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61    rc = whereEqua
e100: 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  lScanEst(pParse,
e110: 20 70 42 75 69 6c 64 65 72 2c 20 70 4c 69 73 74   pBuilder, pList
e120: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e  ->a[i].pExpr, &n
e130: 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73  Est);.    nRowEs
e140: 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70  t += nEst;.    p
e150: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
e160: 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a  id = nRecValid;.
e170: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
e180: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e190: 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 6e 52  if( nRowEst > nR
e1a0: 6f 77 30 20 29 20 6e 52 6f 77 45 73 74 20 3d 20  ow0 ) nRowEst = 
e1b0: 6e 52 6f 77 30 3b 0a 20 20 20 20 2a 70 6e 52 6f  nRow0;.    *pnRo
e1c0: 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20  w = nRowEst;.   
e1d0: 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30   WHERETRACE(0x10
e1e0: 2c 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d 61  ,("IN row estima
e1f0: 74 65 3a 20 65 73 74 3d 25 64 5c 6e 22 2c 20 6e  te: est=%d\n", n
e200: 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20  RowEst));.  }.  
e210: 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65 72  assert( pBuilder
e220: 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52 65  ->nRecValid==nRe
e230: 63 56 61 6c 69 64 20 29 3b 0a 20 20 72 65 74 75  cValid );.  retu
e240: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
e250: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
e260: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
e270: 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 57 48 45 52  */...#ifdef WHER
e280: 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f  ETRACE_ENABLED./
e290: 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63  *.** Print the c
e2a0: 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 68 65 72  ontent of a Wher
e2b0: 65 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2f 0a  eTerm object.*/.
e2c0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
e2d0: 65 54 65 72 6d 50 72 69 6e 74 28 57 68 65 72 65  eTermPrint(Where
e2e0: 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 69 6e 74  Term *pTerm, int
e2f0: 20 69 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70   iTerm){.  if( p
e300: 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Term==0 ){.    s
e310: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
e320: 66 28 22 54 45 52 4d 2d 25 2d 33 64 20 4e 55 4c  f("TERM-%-3d NUL
e330: 4c 5c 6e 22 2c 20 69 54 65 72 6d 29 3b 0a 20 20  L\n", iTerm);.  
e340: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
e350: 7a 54 79 70 65 5b 34 5d 3b 0a 20 20 20 20 6d 65  zType[4];.    me
e360: 6d 63 70 79 28 7a 54 79 70 65 2c 20 22 2e 2e 2e  mcpy(zType, "...
e370: 22 2c 20 34 29 3b 0a 20 20 20 20 69 66 28 20 70  ", 4);.    if( p
e380: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
e390: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 20 7a  TERM_VIRTUAL ) z
e3a0: 54 79 70 65 5b 30 5d 20 3d 20 27 56 27 3b 0a 20  Type[0] = 'V';. 
e3b0: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
e3c0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55  perator & WO_EQU
e3d0: 49 56 20 20 29 20 7a 54 79 70 65 5b 31 5d 20 3d  IV  ) zType[1] =
e3e0: 20 27 45 27 3b 0a 20 20 20 20 69 66 28 20 45 78   'E';.    if( Ex
e3f0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
e400: 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
e410: 72 6f 6d 4a 6f 69 6e 29 20 29 20 7a 54 79 70 65  romJoin) ) zType
e420: 5b 32 5d 20 3d 20 27 4c 27 3b 0a 20 20 20 20 73  [2] = 'L';.    s
e430: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
e440: 66 28 0a 20 20 20 20 20 20 20 22 54 45 52 4d 2d  f(.       "TERM-
e450: 25 2d 33 64 20 25 70 20 25 73 20 63 75 72 73 6f  %-3d %p %s curso
e460: 72 3d 25 2d 33 64 20 70 72 6f 62 3d 25 2d 33 64  r=%-3d prob=%-3d
e470: 20 6f 70 3d 30 78 25 30 33 78 20 77 74 46 6c 61   op=0x%03x wtFla
e480: 67 73 3d 30 78 25 30 34 78 5c 6e 22 2c 0a 20 20  gs=0x%04x\n",.  
e490: 20 20 20 20 20 69 54 65 72 6d 2c 20 70 54 65 72       iTerm, pTer
e4a0: 6d 2c 20 7a 54 79 70 65 2c 20 70 54 65 72 6d 2d  m, zType, pTerm-
e4b0: 3e 6c 65 66 74 43 75 72 73 6f 72 2c 20 70 54 65  >leftCursor, pTe
e4c0: 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 2c 0a 20  rm->truthProb,. 
e4d0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70        pTerm->eOp
e4e0: 65 72 61 74 6f 72 2c 20 70 54 65 72 6d 2d 3e 77  erator, pTerm->w
e4f0: 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 73 71 6c  tFlags);.    sql
e500: 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72  ite3TreeViewExpr
e510: 28 30 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  (0, pTerm->pExpr
e520: 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , 0);.  }.}.#end
e530: 69 66 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45  if..#ifdef WHERE
e540: 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a  TRACE_ENABLED./*
e550: 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57 68 65 72  .** Print a Wher
e560: 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72  eLoop object for
e570: 20 64 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f   debugging purpo
e580: 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ses.*/.static vo
e590: 69 64 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e  id whereLoopPrin
e5a0: 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20  t(WhereLoop *p, 
e5b0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
e5c0: 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
e5d0: 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57  pWInfo = pWC->pW
e5e0: 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e 62 20 3d  Info;.  int nb =
e5f0: 20 31 2b 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62   1+(pWInfo->pTab
e600: 4c 69 73 74 2d 3e 6e 53 72 63 2b 37 29 2f 38 3b  List->nSrc+7)/8;
e610: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
e620: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
e630: 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
e640: 2d 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20  ->a + p->iTab;. 
e650: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
e660: 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73 71  Item->pTab;.  sq
e670: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
e680: 28 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25  ("%c%2d.%0*llx.%
e690: 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a  0*llx", p->cId,.
e6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6b0: 20 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62       p->iTab, nb
e6c0: 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e  , p->maskSelf, n
e6d0: 62 2c 20 70 2d 3e 70 72 65 72 65 71 29 3b 0a 20  b, p->prereq);. 
e6e0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
e6f0: 6e 74 66 28 22 20 25 31 32 73 22 2c 0a 20 20 20  ntf(" %12s",.   
e700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e710: 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20    pItem->zAlias 
e720: 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  ? pItem->zAlias 
e730: 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  : pTab->zName);.
e740: 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67    if( (p->wsFlag
e750: 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
e760: 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20  LTABLE)==0 ){.  
e770: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
e780: 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ame;.    if( p->
e790: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 26  u.btree.pIndex &
e7a0: 26 20 28 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e  & (zName = p->u.
e7b0: 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e  btree.pIndex->zN
e7c0: 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
e7d0: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e 61   if( strncmp(zNa
e7e0: 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f  me, "sqlite_auto
e7f0: 69 6e 64 65 78 5f 22 2c 20 31 37 29 3d 3d 30 20  index_", 17)==0 
e800: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
e810: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
e820: 33 30 28 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a 20  30(zName) - 1;. 
e830: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4e         while( zN
e840: 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29 20 69 2d  ame[i]!='_' ) i-
e850: 2d 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  -;.        zName
e860: 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20   += i;.      }. 
e870: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
e880: 67 50 72 69 6e 74 66 28 22 2e 25 2d 31 36 73 20  gPrintf(".%-16s 
e890: 25 32 64 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e  %2d", zName, p->
e8a0: 75 2e 62 74 72 65 65 2e 6e 45 71 29 3b 0a 20 20  u.btree.nEq);.  
e8b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
e8c0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
e8d0: 66 28 22 25 32 30 73 22 2c 22 22 29 3b 0a 20 20  f("%20s","");.  
e8e0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
e8f0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66   char *z;.    if
e900: 28 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  ( p->u.vtab.idxS
e910: 74 72 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20  tr ){.      z = 
e920: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
e930: 22 28 25 64 2c 5c 22 25 73 5c 22 2c 25 78 29 22  "(%d,\"%s\",%x)"
e940: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e950: 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e    p->u.vtab.idxN
e960: 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64  um, p->u.vtab.id
e970: 78 53 74 72 2c 20 70 2d 3e 75 2e 76 74 61 62 2e  xStr, p->u.vtab.
e980: 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d  omitMask);.    }
e990: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20  else{.      z = 
e9a0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
e9b0: 22 28 25 64 2c 25 78 29 22 2c 20 70 2d 3e 75 2e  "(%d,%x)", p->u.
e9c0: 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e  vtab.idxNum, p->
e9d0: 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29  u.vtab.omitMask)
e9e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
e9f0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
ea00: 20 25 2d 31 39 73 22 2c 20 7a 29 3b 0a 20 20 20   %-19s", z);.   
ea10: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
ea20: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 77  ;.  }.  if( p->w
ea30: 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53  sFlags & WHERE_S
ea40: 4b 49 50 53 43 41 4e 20 29 7b 0a 20 20 20 20 73  KIPSCAN ){.    s
ea50: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
ea60: 66 28 22 20 66 20 25 30 35 78 20 25 64 2d 25 64  f(" f %05x %d-%d
ea70: 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70  ", p->wsFlags, p
ea80: 2d 3e 6e 4c 54 65 72 6d 2c 70 2d 3e 6e 53 6b 69  ->nLTerm,p->nSki
ea90: 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p);.  }else{.   
eaa0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
eab0: 6e 74 66 28 22 20 66 20 25 30 35 78 20 4e 20 25  ntf(" f %05x N %
eac0: 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20  d", p->wsFlags, 
ead0: 70 2d 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 7d 0a  p->nLTerm);.  }.
eae0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
eaf0: 69 6e 74 66 28 22 20 63 6f 73 74 20 25 64 2c 25  intf(" cost %d,%
eb00: 64 2c 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74  d,%d\n", p->rSet
eb10: 75 70 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e  up, p->rRun, p->
eb20: 6e 4f 75 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e  nOut);.  if( p->
eb30: 6e 4c 54 65 72 6d 20 26 26 20 28 73 71 6c 69 74  nLTerm && (sqlit
eb40: 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
eb50: 78 31 30 30 29 21 3d 30 20 29 7b 0a 20 20 20 20  x100)!=0 ){.    
eb60: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
eb70: 3d 30 3b 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d 3b  =0; i<p->nLTerm;
eb80: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65   i++){.      whe
eb90: 72 65 54 65 72 6d 50 72 69 6e 74 28 70 2d 3e 61  reTermPrint(p->a
eba0: 4c 54 65 72 6d 5b 69 5d 2c 20 69 29 3b 0a 20 20  LTerm[i], i);.  
ebb0: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
ebc0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
ebd0: 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f  bulk memory into
ebe0: 20 61 20 76 61 6c 69 64 20 57 68 65 72 65 4c 6f   a valid WhereLo
ebf0: 6f 70 20 74 68 61 74 20 63 61 6e 20 62 65 20 70  op that can be p
ec00: 61 73 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72  assed.** to wher
ec10: 65 4c 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c  eLoopClear harml
ec20: 65 73 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  essly..*/.static
ec30: 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 49   void whereLoopI
ec40: 6e 69 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70  nit(WhereLoop *p
ec50: 29 7b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d  ){.  p->aLTerm =
ec60: 20 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b   p->aLTermSpace;
ec70: 0a 20 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30  .  p->nLTerm = 0
ec80: 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20  ;.  p->nLSlot = 
ec90: 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54  ArraySize(p->aLT
eca0: 65 72 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e  ermSpace);.  p->
ecb0: 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a  wsFlags = 0;.}..
ecc0: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
ecd0: 57 68 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f  WhereLoop.u unio
ece0: 6e 2e 20 20 4c 65 61 76 65 20 57 68 65 72 65 4c  n.  Leave WhereL
ecf0: 6f 6f 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63  oop.pLTerm intac
ed00: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
ed10: 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72  d whereLoopClear
ed20: 55 6e 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64  Union(sqlite3 *d
ed30: 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  b, WhereLoop *p)
ed40: 7b 0a 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61  {.  if( p->wsFla
ed50: 67 73 20 26 20 28 57 48 45 52 45 5f 56 49 52 54  gs & (WHERE_VIRT
ed60: 55 41 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f 41  UALTABLE|WHERE_A
ed70: 55 54 4f 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20  UTO_INDEX) ){.  
ed80: 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67    if( (p->wsFlag
ed90: 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
eda0: 4c 54 41 42 4c 45 29 21 3d 30 20 26 26 20 70 2d  LTABLE)!=0 && p-
edb0: 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
edc0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
edd0: 33 5f 66 72 65 65 28 70 2d 3e 75 2e 76 74 61 62  3_free(p->u.vtab
ede0: 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20  .idxStr);.      
edf0: 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  p->u.vtab.needFr
ee00: 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  ee = 0;.      p-
ee10: 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d  >u.vtab.idxStr =
ee20: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
ee30: 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
ee40: 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
ee50: 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74 72  )!=0 && p->u.btr
ee60: 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a  ee.pIndex!=0 ){.
ee70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
ee80: 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72  ree(db, p->u.btr
ee90: 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41  ee.pIndex->zColA
eea0: 66 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ff);.      sqlit
eeb0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
eec0: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3b  u.btree.pIndex);
eed0: 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65  .      p->u.btre
eee0: 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  e.pIndex = 0;.  
eef0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
ef00: 20 44 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74 65   Deallocate inte
ef10: 72 6e 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64  rnal memory used
ef20: 20 62 79 20 61 20 57 68 65 72 65 4c 6f 6f 70 20   by a WhereLoop 
ef30: 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63  object.*/.static
ef40: 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43   void whereLoopC
ef50: 6c 65 61 72 28 73 71 6c 69 74 65 33 20 2a 64 62  lear(sqlite3 *db
ef60: 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b  , WhereLoop *p){
ef70: 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d  .  if( p->aLTerm
ef80: 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  !=p->aLTermSpace
ef90: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
efa0: 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b  (db, p->aLTerm);
efb0: 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  .  whereLoopClea
efc0: 72 55 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a 20  rUnion(db, p);. 
efd0: 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70   whereLoopInit(p
efe0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  );.}../*.** Incr
eff0: 65 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  ease the memory 
f000: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70  allocation for p
f010: 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74  Loop->aLTerm[] t
f020: 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 6e 2e  o be at least n.
f030: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
f040: 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 73  hereLoopResize(s
f050: 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
f060: 65 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e 29  eLoop *p, int n)
f070: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 2a  {.  WhereTerm **
f080: 70 61 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e  paNew;.  if( p->
f090: 6e 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74 75  nLSlot>=n ) retu
f0a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
f0b0: 6e 20 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20 20  n = (n+7)&~7;.  
f0c0: 70 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44  paNew = sqlite3D
f0d0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
f0e0: 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b  izeof(p->aLTerm[
f0f0: 30 5d 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70 61  0])*n);.  if( pa
f100: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
f110: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
f120: 6d 65 6d 63 70 79 28 70 61 4e 65 77 2c 20 70 2d  memcpy(paNew, p-
f130: 3e 61 4c 54 65 72 6d 2c 20 73 69 7a 65 6f 66 28  >aLTerm, sizeof(
f140: 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 70 2d  p->aLTerm[0])*p-
f150: 3e 6e 4c 53 6c 6f 74 29 3b 0a 20 20 69 66 28 20  >nLSlot);.  if( 
f160: 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c  p->aLTerm!=p->aL
f170: 54 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69  TermSpace ) sqli
f180: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
f190: 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 70 2d 3e 61  >aLTerm);.  p->a
f1a0: 4c 54 65 72 6d 20 3d 20 70 61 4e 65 77 3b 0a 20  LTerm = paNew;. 
f1b0: 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a   p->nLSlot = n;.
f1c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f1d0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61  OK;.}../*.** Tra
f1e0: 6e 73 66 65 72 20 63 6f 6e 74 65 6e 74 20 66 72  nsfer content fr
f1f0: 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 70 4c  om the second pL
f200: 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 66 69 72  oop into the fir
f210: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
f220: 74 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28  t whereLoopXfer(
f230: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
f240: 72 65 4c 6f 6f 70 20 2a 70 54 6f 2c 20 57 68 65  reLoop *pTo, Whe
f250: 72 65 4c 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a  reLoop *pFrom){.
f260: 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
f270: 55 6e 69 6f 6e 28 64 62 2c 20 70 54 6f 29 3b 0a  Union(db, pTo);.
f280: 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52    if( whereLoopR
f290: 65 73 69 7a 65 28 64 62 2c 20 70 54 6f 2c 20 70  esize(db, pTo, p
f2a0: 46 72 6f 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29 7b  From->nLTerm) ){
f2b0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 54 6f  .    memset(&pTo
f2c0: 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ->u, 0, sizeof(p
f2d0: 54 6f 2d 3e 75 29 29 3b 0a 20 20 20 20 72 65 74  To->u));.    ret
f2e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
f2f0: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70  ;.  }.  memcpy(p
f300: 54 6f 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52 45  To, pFrom, WHERE
f310: 5f 4c 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b 0a  _LOOP_XFER_SZ);.
f320: 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c    memcpy(pTo->aL
f330: 54 65 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54  Term, pFrom->aLT
f340: 65 72 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d  erm, pTo->nLTerm
f350: 2a 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c 54  *sizeof(pTo->aLT
f360: 65 72 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20  erm[0]));.  if( 
f370: 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26  pFrom->wsFlags &
f380: 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
f390: 42 4c 45 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d  BLE ){.    pFrom
f3a0: 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
f3b0: 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  e = 0;.  }else i
f3c0: 66 28 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c 61  f( (pFrom->wsFla
f3d0: 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
f3e0: 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20  INDEX)!=0 ){.   
f3f0: 20 70 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e   pFrom->u.btree.
f400: 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a  pIndex = 0;.  }.
f410: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f420: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  OK;.}../*.** Del
f430: 65 74 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20  ete a WhereLoop 
f440: 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63  object.*/.static
f450: 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 44   void whereLoopD
f460: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
f470: 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  b, WhereLoop *p)
f480: 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  {.  whereLoopCle
f490: 61 72 28 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c  ar(db, p);.  sql
f4a0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
f4b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  );.}../*.** Free
f4c0: 20 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72   a WhereInfo str
f4d0: 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63  ucture.*/.static
f4e0: 20 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46   void whereInfoF
f4f0: 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ree(sqlite3 *db,
f500: 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
f510: 66 6f 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59  fo){.  if( ALWAY
f520: 53 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20  S(pWInfo) ){.   
f530: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
f540: 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e  i=0; i<pWInfo->n
f550: 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  Level; i++){.   
f560: 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70     WhereLevel *p
f570: 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
f580: 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  >a[i];.      if(
f590: 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20   pLevel->pWLoop 
f5a0: 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  && (pLevel->pWLo
f5b0: 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
f5c0: 45 52 45 5f 49 4e 5f 41 42 4c 45 29 20 29 7b 0a  ERE_IN_ABLE) ){.
f5d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
f5e0: 62 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c  bFree(db, pLevel
f5f0: 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b  ->u.in.aInLoop);
f600: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f610: 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43     sqlite3WhereC
f620: 6c 61 75 73 65 43 6c 65 61 72 28 26 70 57 49 6e  lauseClear(&pWIn
f630: 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 20 20 77 68  fo->sWC);.    wh
f640: 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f  ile( pWInfo->pLo
f650: 6f 70 73 20 29 7b 0a 20 20 20 20 20 20 57 68 65  ops ){.      Whe
f660: 72 65 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e  reLoop *p = pWIn
f670: 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20  fo->pLoops;.    
f680: 20 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73    pWInfo->pLoops
f690: 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b   = p->pNextLoop;
f6a0: 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
f6b0: 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20  Delete(db, p);. 
f6c0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
f6d0: 44 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  DbFree(db, pWInf
f6e0: 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  o);.  }.}../*.**
f6f0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
f700: 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
f710: 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
f720: 2a 0a 2a 2a 20 20 20 28 31 29 20 20 58 20 68 61  *.**   (1)  X ha
f730: 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f  s the same or lo
f740: 77 65 72 20 63 6f 73 74 20 74 68 61 74 20 59 0a  wer cost that Y.
f750: 2a 2a 20 20 20 28 32 29 20 20 58 20 69 73 20 61  **   (2)  X is a
f760: 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f   proper subset o
f770: 66 20 59 0a 2a 2a 20 20 20 28 33 29 20 20 58 20  f Y.**   (3)  X 
f780: 73 6b 69 70 73 20 61 74 20 6c 65 61 73 74 20 61  skips at least a
f790: 73 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 61  s many columns a
f7a0: 73 20 59 0a 2a 2a 0a 2a 2a 20 42 79 20 22 70 72  s Y.**.** By "pr
f7b0: 6f 70 65 72 20 73 75 62 73 65 74 22 20 77 65 20  oper subset" we 
f7c0: 6d 65 61 6e 20 74 68 61 74 20 58 20 75 73 65 73  mean that X uses
f7d0: 20 66 65 77 65 72 20 57 48 45 52 45 20 63 6c 61   fewer WHERE cla
f7e0: 75 73 65 20 74 65 72 6d 73 0a 2a 2a 20 74 68 61  use terms.** tha
f7f0: 6e 20 59 20 61 6e 64 20 74 68 61 74 20 65 76 65  n Y and that eve
f800: 72 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ry WHERE clause 
f810: 74 65 72 6d 20 75 73 65 64 20 62 79 20 58 20 69  term used by X i
f820: 73 20 61 6c 73 6f 20 75 73 65 64 0a 2a 2a 20 62  s also used.** b
f830: 79 20 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20  y Y..**.** If X 
f840: 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73  is a proper subs
f850: 65 74 20 6f 66 20 59 20 74 68 65 6e 20 59 20 69  et of Y then Y i
f860: 73 20 61 20 62 65 74 74 65 72 20 63 68 6f 69 63  s a better choic
f870: 65 20 61 6e 64 20 6f 75 67 68 74 0a 2a 2a 20 74  e and ought.** t
f880: 6f 20 68 61 76 65 20 61 20 6c 6f 77 65 72 20 63  o have a lower c
f890: 6f 73 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ost.  This routi
f8a0: 6e 65 20 72 65 74 75 72 6e 73 20 54 52 55 45 20  ne returns TRUE 
f8b0: 77 68 65 6e 20 74 68 61 74 20 63 6f 73 74 20 0a  when that cost .
f8c0: 2a 2a 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20  ** relationship 
f8d0: 69 73 20 69 6e 76 65 72 74 65 64 20 61 6e 64 20  is inverted and 
f8e0: 6e 65 65 64 73 20 74 6f 20 62 65 20 61 64 6a 75  needs to be adju
f8f0: 73 74 65 64 2e 20 20 54 68 65 20 74 68 69 72 64  sted.  The third
f900: 20 72 75 6c 65 0a 2a 2a 20 77 61 73 20 61 64 64   rule.** was add
f910: 65 64 20 62 65 63 61 75 73 65 20 69 66 20 58 20  ed because if X 
f920: 75 73 65 73 20 73 6b 69 70 2d 73 63 61 6e 20 6c  uses skip-scan l
f930: 65 73 73 20 74 68 61 6e 20 59 20 69 74 20 73 74  ess than Y it st
f940: 69 6c 6c 20 6d 69 67 68 74 0a 2a 2a 20 64 65 73  ill might.** des
f950: 65 72 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73  erve a lower cos
f960: 74 20 65 76 65 6e 20 69 66 20 69 74 20 69 73 20  t even if it is 
f970: 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20  a proper subset 
f980: 6f 66 20 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  of Y..*/.static 
f990: 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 43 68 65  int whereLoopChe
f9a0: 61 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74  aperProperSubset
f9b0: 28 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c  (.  const WhereL
f9c0: 6f 6f 70 20 2a 70 58 2c 20 20 20 20 20 20 20 2f  oop *pX,       /
f9d0: 2a 20 46 69 72 73 74 20 57 68 65 72 65 4c 6f 6f  * First WhereLoo
f9e0: 70 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a  p to compare */.
f9f0: 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f    const WhereLoo
fa00: 70 20 2a 70 59 20 20 20 20 20 20 20 20 2f 2a 20  p *pY        /* 
fa10: 43 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20  Compare against 
fa20: 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 2a  this WhereLoop *
fa30: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
fa40: 0a 20 20 69 66 28 20 70 58 2d 3e 6e 4c 54 65 72  .  if( pX->nLTer
fa50: 6d 2d 70 58 2d 3e 6e 53 6b 69 70 20 3e 3d 20 70  m-pX->nSkip >= p
fa60: 59 2d 3e 6e 4c 54 65 72 6d 2d 70 59 2d 3e 6e 53  Y->nLTerm-pY->nS
fa70: 6b 69 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72  kip ){.    retur
fa80: 6e 20 30 3b 20 2f 2a 20 58 20 69 73 20 6e 6f 74  n 0; /* X is not
fa90: 20 61 20 73 75 62 73 65 74 20 6f 66 20 59 20 2a   a subset of Y *
faa0: 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 59 2d 3e  /.  }.  if( pY->
fab0: 6e 53 6b 69 70 20 3e 20 70 58 2d 3e 6e 53 6b 69  nSkip > pX->nSki
fac0: 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  p ) return 0;.  
fad0: 69 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e 3d 20  if( pX->rRun >= 
fae0: 70 59 2d 3e 72 52 75 6e 20 29 7b 0a 20 20 20 20  pY->rRun ){.    
faf0: 69 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e 20 70  if( pX->rRun > p
fb00: 59 2d 3e 72 52 75 6e 20 29 20 72 65 74 75 72 6e  Y->rRun ) return
fb10: 20 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f 73 74   0;    /* X cost
fb20: 73 20 6d 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f  s more than Y */
fb30: 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 6e 4f 75  .    if( pX->nOu
fb40: 74 20 3e 20 70 59 2d 3e 6e 4f 75 74 20 29 20 72  t > pY->nOut ) r
fb50: 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58  eturn 0;    /* X
fb60: 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e   costs more than
fb70: 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72 28   Y */.  }.  for(
fb80: 69 3d 70 58 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20  i=pX->nLTerm-1; 
fb90: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
fba0: 69 66 28 20 70 58 2d 3e 61 4c 54 65 72 6d 5b 69  if( pX->aLTerm[i
fbb0: 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ]==0 ) continue;
fbc0: 0a 20 20 20 20 66 6f 72 28 6a 3d 70 59 2d 3e 6e  .    for(j=pY->n
fbd0: 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a  LTerm-1; j>=0; j
fbe0: 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  --){.      if( p
fbf0: 59 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 70 58  Y->aLTerm[j]==pX
fc00: 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 29 20 62 72  ->aLTerm[i] ) br
fc10: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
fc20: 66 28 20 6a 3c 30 20 29 20 72 65 74 75 72 6e 20  f( j<0 ) return 
fc30: 30 3b 20 20 2f 2a 20 58 20 6e 6f 74 20 61 20 73  0;  /* X not a s
fc40: 75 62 73 65 74 20 6f 66 20 59 20 73 69 6e 63 65  ubset of Y since
fc50: 20 74 65 72 6d 20 58 5b 69 5d 20 6e 6f 74 20 75   term X[i] not u
fc60: 73 65 64 20 62 79 20 59 20 2a 2f 0a 20 20 7d 0a  sed by Y */.  }.
fc70: 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20    return 1;  /* 
fc80: 41 6c 6c 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d  All conditions m
fc90: 65 65 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eet */.}../*.** 
fca0: 54 72 79 20 74 6f 20 61 64 6a 75 73 74 20 74 68  Try to adjust th
fcb0: 65 20 63 6f 73 74 20 6f 66 20 57 68 65 72 65 4c  e cost of WhereL
fcc0: 6f 6f 70 20 70 54 65 6d 70 6c 61 74 65 20 75 70  oop pTemplate up
fcd0: 77 61 72 64 73 20 6f 72 20 64 6f 77 6e 77 61 72  wards or downwar
fce0: 64 73 20 73 6f 0a 2a 2a 20 74 68 61 74 3a 0a 2a  ds so.** that:.*
fcf0: 2a 0a 2a 2a 20 20 20 28 31 29 20 70 54 65 6d 70  *.**   (1) pTemp
fd00: 6c 61 74 65 20 63 6f 73 74 73 20 6c 65 73 73 20  late costs less 
fd10: 74 68 61 6e 20 61 6e 79 20 6f 74 68 65 72 20 57  than any other W
fd20: 68 65 72 65 4c 6f 6f 70 73 20 74 68 61 74 20 61  hereLoops that a
fd30: 72 65 20 61 20 70 72 6f 70 65 72 0a 2a 2a 20 20  re a proper.**  
fd40: 20 20 20 20 20 73 75 62 73 65 74 20 6f 66 20 70       subset of p
fd50: 54 65 6d 70 6c 61 74 65 0a 2a 2a 0a 2a 2a 20 20  Template.**.**  
fd60: 20 28 32 29 20 70 54 65 6d 70 6c 61 74 65 20 63   (2) pTemplate c
fd70: 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 61  osts more than a
fd80: 6e 79 20 6f 74 68 65 72 20 57 68 65 72 65 4c 6f  ny other WhereLo
fd90: 6f 70 73 20 66 6f 72 20 77 68 69 63 68 20 70 54  ops for which pT
fda0: 65 6d 70 6c 61 74 65 0a 2a 2a 20 20 20 20 20 20  emplate.**      
fdb0: 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62   is a proper sub
fdc0: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 73 61  set..**.** To sa
fdd0: 79 20 22 57 68 65 72 65 4c 6f 6f 70 20 58 20 69  y "WhereLoop X i
fde0: 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65  s a proper subse
fdf0: 74 20 6f 66 20 59 22 20 6d 65 61 6e 73 20 74 68  t of Y" means th
fe00: 61 74 20 58 20 75 73 65 73 20 66 65 77 65 72 0a  at X uses fewer.
fe10: 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
fe20: 74 65 72 6d 73 20 74 68 61 6e 20 59 20 61 6e 64  terms than Y and
fe30: 20 74 68 61 74 20 65 76 65 72 79 20 57 48 45 52   that every WHER
fe40: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 75 73  E clause term us
fe50: 65 64 20 62 79 20 58 20 69 73 0a 2a 2a 20 61 6c  ed by X is.** al
fe60: 73 6f 20 75 73 65 64 20 62 79 20 59 2e 0a 2a 2f  so used by Y..*/
fe70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
fe80: 72 65 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74  reLoopAdjustCost
fe90: 28 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70  (const WhereLoop
fea0: 20 2a 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a   *p, WhereLoop *
feb0: 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 69 66  pTemplate){.  if
fec0: 28 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73  ( (pTemplate->ws
fed0: 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
fee0: 44 45 58 45 44 29 3d 3d 30 20 29 20 72 65 74 75  DEXED)==0 ) retu
fef0: 72 6e 3b 0a 20 20 66 6f 72 28 3b 20 70 3b 20 70  rn;.  for(; p; p
ff00: 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a  =p->pNextLoop){.
ff10: 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21      if( p->iTab!
ff20: 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62  =pTemplate->iTab
ff30: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
ff40: 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
ff50: 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
ff60: 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
ff70: 0a 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f  .    if( whereLo
ff80: 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53  opCheaperProperS
ff90: 75 62 73 65 74 28 70 2c 20 70 54 65 6d 70 6c 61  ubset(p, pTempla
ffa0: 74 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  te) ){.      /* 
ffb0: 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65  Adjust pTemplate
ffc0: 20 63 6f 73 74 20 64 6f 77 6e 77 61 72 64 20 73   cost downward s
ffd0: 6f 20 74 68 61 74 20 69 74 20 69 73 20 63 68 65  o that it is che
ffe0: 61 70 65 72 20 74 68 61 6e 20 69 74 73 20 0a 20  aper than its . 
fff0: 20 20 20 20 20 2a 2a 20 73 75 62 73 65 74 20 70       ** subset p
10000 2e 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45  . */.      WHERE
10010 54 52 41 43 45 28 30 78 38 30 2c 28 22 73 75 62  TRACE(0x80,("sub
10020 73 65 74 20 63 6f 73 74 20 61 64 6a 75 73 74 6d  set cost adjustm
10030 65 6e 74 20 25 64 2c 25 64 20 74 6f 20 25 64 2c  ent %d,%d to %d,
10040 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
10050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
10060 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70  emplate->rRun, p
10070 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20  Template->nOut, 
10080 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74  p->rRun, p->nOut
10090 2d 31 29 29 3b 0a 20 20 20 20 20 20 70 54 65 6d  -1));.      pTem
100a0 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d  plate->rRun = p-
100b0 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20 70 54 65  >rRun;.      pTe
100c0 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70  mplate->nOut = p
100d0 2d 3e 6e 4f 75 74 20 2d 20 31 3b 0a 20 20 20 20  ->nOut - 1;.    
100e0 7d 65 6c 73 65 20 69 66 28 20 77 68 65 72 65 4c  }else if( whereL
100f0 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65 72  oopCheaperProper
10100 53 75 62 73 65 74 28 70 54 65 6d 70 6c 61 74 65  Subset(pTemplate
10110 2c 20 70 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  , p) ){.      /*
10120 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74   Adjust pTemplat
10130 65 20 63 6f 73 74 20 75 70 77 61 72 64 20 73 6f  e cost upward so
10140 20 74 68 61 74 20 69 74 20 69 73 20 63 6f 73 74   that it is cost
10150 6c 69 65 72 20 74 68 61 6e 20 70 20 73 69 6e 63  lier than p sinc
10160 65 0a 20 20 20 20 20 20 2a 2a 20 70 54 65 6d 70  e.      ** pTemp
10170 6c 61 74 65 20 69 73 20 61 20 70 72 6f 70 65 72  late is a proper
10180 20 73 75 62 73 65 74 20 6f 66 20 70 20 2a 2f 0a   subset of p */.
10190 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
101a0 28 30 78 38 30 2c 28 22 73 75 62 73 65 74 20 63  (0x80,("subset c
101b0 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e 74 20 25  ost adjustment %
101c0 64 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22  d,%d to %d,%d\n"
101d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
101e0 20 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61           pTempla
101f0 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c  te->rRun, pTempl
10200 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52  ate->nOut, p->rR
10210 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2b 31 29 29 3b  un, p->nOut+1));
10220 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65  .      pTemplate
10230 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e  ->rRun = p->rRun
10240 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74  ;.      pTemplat
10250 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75  e->nOut = p->nOu
10260 74 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  t + 1;.    }.  }
10270 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  .}../*.** Search
10280 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65   the list of Whe
10290 72 65 4c 6f 6f 70 73 20 69 6e 20 2a 70 70 50 72  reLoops in *ppPr
102a0 65 76 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f  ev looking for o
102b0 6e 65 20 74 68 61 74 20 63 61 6e 20 62 65 0a 2a  ne that can be.*
102c0 2a 20 73 75 70 70 6c 61 6e 74 65 64 20 62 79 20  * supplanted by 
102d0 70 54 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a  pTemplate..**.**
102e0 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
102f0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6c 69  the WhereLoop li
10300 73 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65  st contains an e
10310 6e 74 72 79 20 74 68 61 74 20 63 61 6e 20 73 75  ntry that can su
10320 70 70 6c 61 6e 74 0a 2a 2a 20 70 54 65 6d 70 6c  pplant.** pTempl
10330 61 74 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f  ate, in other wo
10340 72 64 73 20 69 66 20 70 54 65 6d 70 6c 61 74 65  rds if pTemplate
10350 20 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f 6e 67   does not belong
10360 20 6f 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a   on the list..**
10370 0a 2a 2a 20 49 66 20 70 58 20 69 73 20 61 20 57  .** If pX is a W
10380 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 70 54  hereLoop that pT
10390 65 6d 70 6c 61 74 65 20 63 61 6e 20 73 75 70 70  emplate can supp
103a0 6c 61 6e 74 2c 20 74 68 65 6e 20 72 65 74 75 72  lant, then retur
103b0 6e 20 74 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74 68  n the.** link th
103c0 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 70 58 2e  at points to pX.
103d0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54 65 6d 70 6c  .**.** If pTempl
103e0 61 74 65 20 63 61 6e 6e 6f 74 20 73 75 70 70 6c  ate cannot suppl
103f0 61 6e 74 20 61 6e 79 20 65 78 69 73 74 69 6e 67  ant any existing
10400 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
10410 6c 69 73 74 20 62 75 74 20 6e 65 65 64 73 0a 2a  list but needs.*
10420 2a 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  * to be added to
10430 20 74 68 65 20 6c 69 73 74 2c 20 74 68 65 6e 20   the list, then 
10440 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
10450 20 74 6f 20 74 68 65 20 74 61 69 6c 20 6f 66 20   to the tail of 
10460 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  the list..*/.sta
10470 74 69 63 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  tic WhereLoop **
10480 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73  whereLoopFindLes
10490 73 65 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ser(.  WhereLoop
104a0 20 2a 2a 70 70 50 72 65 76 2c 0a 20 20 63 6f 6e   **ppPrev,.  con
104b0 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54  st WhereLoop *pT
104c0 65 6d 70 6c 61 74 65 0a 29 7b 0a 20 20 57 68 65  emplate.){.  Whe
104d0 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f 72  reLoop *p;.  for
104e0 28 70 3d 28 2a 70 70 50 72 65 76 29 3b 20 70 3b  (p=(*ppPrev); p;
104f0 20 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78   ppPrev=&p->pNex
10500 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76  tLoop, p=*ppPrev
10510 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54  ){.    if( p->iT
10520 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69  ab!=pTemplate->i
10530 54 61 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49  Tab || p->iSortI
10540 64 78 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69  dx!=pTemplate->i
10550 53 6f 72 74 49 64 78 20 29 7b 0a 20 20 20 20 20  SortIdx ){.     
10560 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20 74 68   /* If either th
10570 65 20 69 54 61 62 20 6f 72 20 69 53 6f 72 74 49  e iTab or iSortI
10580 64 78 20 76 61 6c 75 65 73 20 66 6f 72 20 74 77  dx values for tw
10590 6f 20 57 68 65 72 65 4c 6f 6f 70 20 61 72 65 20  o WhereLoop are 
105a0 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20 20 20  different.      
105b0 2a 2a 20 74 68 65 6e 20 74 68 6f 73 65 20 57 68  ** then those Wh
105c0 65 72 65 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f  ereLoops need to
105d0 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 73   be considered s
105e0 65 70 61 72 61 74 65 6c 79 2e 20 20 4e 65 69 74  eparately.  Neit
105f0 68 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  her is.      ** 
10600 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 72  a candidate to r
10610 65 70 6c 61 63 65 20 74 68 65 20 6f 74 68 65 72  eplace the other
10620 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69  . */.      conti
10630 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  nue;.    }.    /
10640 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74  * In the current
10650 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c   implementation,
10660 20 74 68 65 20 72 53 65 74 75 70 20 76 61 6c 75   the rSetup valu
10670 65 20 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f  e is either zero
10680 0a 20 20 20 20 2a 2a 20 6f 72 20 74 68 65 20 63  .    ** or the c
10690 6f 73 74 20 6f 66 20 62 75 69 6c 64 69 6e 67 20  ost of building 
106a0 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
106b0 65 78 20 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74  ex (NlogN) and t
106c0 68 65 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20  he NlogN.    ** 
106d0 69 73 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20  is the same for 
106e0 63 6f 6d 70 61 74 69 62 6c 65 20 57 68 65 72 65  compatible Where
106f0 4c 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73  Loops. */.    as
10700 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3d  sert( p->rSetup=
10710 3d 30 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d  =0 || pTemplate-
10720 3e 72 53 65 74 75 70 3d 3d 30 20 0a 20 20 20 20  >rSetup==0 .    
10730 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
10740 70 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d 70  p->rSetup==pTemp
10750 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a  late->rSetup );.
10760 0a 20 20 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f  .    /* whereLoo
10770 70 41 64 64 42 74 72 65 65 28 29 20 61 6c 77 61  pAddBtree() alwa
10780 79 73 20 67 65 6e 65 72 61 74 65 73 20 61 6e 64  ys generates and
10790 20 69 6e 73 65 72 74 73 20 74 68 65 20 61 75 74   inserts the aut
107a0 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 20 20 20  omatic index.   
107b0 20 2a 2a 20 63 61 73 65 20 66 69 72 73 74 2e 20   ** case first. 
107c0 20 48 65 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c   Hence compatibl
107d0 65 20 63 61 6e 64 69 64 61 74 65 20 57 68 65 72  e candidate Wher
107e0 65 4c 6f 6f 70 73 20 6e 65 76 65 72 20 68 61 76  eLoops never hav
107f0 65 20 61 20 6c 61 72 67 65 72 0a 20 20 20 20 2a  e a larger.    *
10800 2a 20 72 53 65 74 75 70 2e 20 43 61 6c 6c 20 74  * rSetup. Call t
10810 68 69 73 20 53 45 54 55 50 2d 49 4e 56 41 52 49  his SETUP-INVARI
10820 41 4e 54 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ANT */.    asser
10830 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54  t( p->rSetup>=pT
10840 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20  emplate->rSetup 
10850 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6e 79 20 6c  );..    /* Any l
10860 6f 6f 70 20 75 73 69 6e 67 20 61 6e 20 61 70 70  oop using an app
10870 6c 69 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20  liation-defined 
10880 69 6e 64 65 78 20 28 6f 72 20 50 52 49 4d 41 52  index (or PRIMAR
10890 59 20 4b 45 59 20 6f 72 0a 20 20 20 20 2a 2a 20  Y KEY or.    ** 
108a0 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
108b0 74 29 20 77 69 74 68 20 6f 6e 65 20 6f 72 20 6d  t) with one or m
108c0 6f 72 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e  ore == constrain
108d0 74 73 20 69 73 20 62 65 74 74 65 72 0a 20 20 20  ts is better.   
108e0 20 2a 2a 20 74 68 61 6e 20 61 6e 20 61 75 74 6f   ** than an auto
108f0 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 55 6e 6c  matic index. Unl
10900 65 73 73 20 69 74 20 69 73 20 61 20 73 6b 69 70  ess it is a skip
10910 2d 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66  -scan. */.    if
10920 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
10930 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
10940 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  )!=0.     && (pT
10950 65 6d 70 6c 61 74 65 2d 3e 6e 53 6b 69 70 29 3d  emplate->nSkip)=
10960 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d  =0.     && (pTem
10970 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26  plate->wsFlags &
10980 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
10990 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d  =0.     && (pTem
109a0 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26  plate->wsFlags &
109b0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
109c0 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 2d  )!=0.     && (p-
109d0 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c  >prereq & pTempl
109e0 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54  ate->prereq)==pT
109f0 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a  emplate->prereq.
10a00 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65      ){.      bre
10a10 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
10a20 2a 20 49 66 20 65 78 69 73 74 69 6e 67 20 57 68  * If existing Wh
10a30 65 72 65 4c 6f 6f 70 20 70 20 69 73 20 62 65 74  ereLoop p is bet
10a40 74 65 72 20 74 68 61 6e 20 70 54 65 6d 70 6c 61  ter than pTempla
10a50 74 65 2c 20 70 54 65 6d 70 6c 61 74 65 20 63 61  te, pTemplate ca
10a60 6e 20 62 65 0a 20 20 20 20 2a 2a 20 64 69 73 63  n be.    ** disc
10a70 61 72 64 65 64 2e 20 20 57 68 65 72 65 4c 6f 6f  arded.  WhereLoo
10a80 70 20 70 20 69 73 20 62 65 74 74 65 72 20 69 66  p p is better if
10a90 3a 0a 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20  :.    **   (1)  
10aa0 70 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65  p has no more de
10ab0 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20  pendencies than 
10ac0 70 54 65 6d 70 6c 61 74 65 2c 20 61 6e 64 0a 20  pTemplate, and. 
10ad0 20 20 20 2a 2a 20 20 20 28 32 29 20 20 70 20 68     **   (2)  p h
10ae0 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c  as an equal or l
10af0 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70  ower cost than p
10b00 54 65 6d 70 6c 61 74 65 0a 20 20 20 20 2a 2f 0a  Template.    */.
10b10 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72      if( (p->prer
10b20 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e  eq & pTemplate->
10b30 70 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72  prereq)==p->prer
10b40 65 71 20 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f  eq    /* (1)  */
10b50 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74  .     && p->rSet
10b60 75 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up<=pTemplate->r
10b70 53 65 74 75 70 20 20 20 20 20 20 20 20 20 20 20  Setup           
10b80 20 20 20 20 20 20 20 2f 2a 20 28 32 61 29 20 2a         /* (2a) *
10b90 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75  /.     && p->rRu
10ba0 6e 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52  n<=pTemplate->rR
10bb0 75 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  un              
10bc0 20 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20          /* (2b) 
10bd0 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f  */.     && p->nO
10be0 75 74 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e  ut<=pTemplate->n
10bf0 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20  Out             
10c00 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 63 29           /* (2c)
10c10 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20   */.    ){.     
10c20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 44   return 0;  /* D
10c30 69 73 63 61 72 64 20 70 54 65 6d 70 6c 61 74 65  iscard pTemplate
10c40 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   */.    }..    /
10c50 2a 20 49 66 20 70 54 65 6d 70 6c 61 74 65 20 69  * If pTemplate i
10c60 73 20 61 6c 77 61 79 73 20 62 65 74 74 65 72 20  s always better 
10c70 74 68 61 6e 20 70 2c 20 74 68 65 6e 20 63 61 75  than p, then cau
10c80 73 65 20 70 20 74 6f 20 62 65 20 6f 76 65 72 77  se p to be overw
10c90 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 77 69  ritten.    ** wi
10ca0 74 68 20 70 54 65 6d 70 6c 61 74 65 2e 20 20 70  th pTemplate.  p
10cb0 54 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74  Template is bett
10cc0 65 72 20 74 68 61 6e 20 70 20 69 66 3a 0a 20 20  er than p if:.  
10cd0 20 20 2a 2a 20 20 20 28 31 29 20 20 70 54 65 6d    **   (1)  pTem
10ce0 70 6c 61 74 65 20 68 61 73 20 6e 6f 20 6d 6f 72  plate has no mor
10cf0 65 20 64 65 70 65 6e 64 65 6e 63 65 73 20 74 68  e dependences th
10d00 61 6e 20 70 2c 20 61 6e 64 0a 20 20 20 20 2a 2a  an p, and.    **
10d10 20 20 20 28 32 29 20 20 70 54 65 6d 70 6c 61 74     (2)  pTemplat
10d20 65 20 68 61 73 20 61 6e 20 65 71 75 61 6c 20 6f  e has an equal o
10d30 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61  r lower cost tha
10d40 6e 20 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  n p..    */.    
10d50 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26  if( (p->prereq &
10d60 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72   pTemplate->prer
10d70 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  eq)==pTemplate->
10d80 70 72 65 72 65 71 20 20 20 2f 2a 20 28 31 29 20  prereq   /* (1) 
10d90 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72   */.     && p->r
10da0 52 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Run>=pTemplate->
10db0 72 52 75 6e 20 20 20 20 20 20 20 20 20 20 20 20  rRun            
10dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10dd0 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20   /* (2a) */.    
10de0 20 26 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65   && p->nOut>=pTe
10df0 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20  mplate->nOut    
10e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e10 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29           /* (2b)
10e20 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20   */.    ){.     
10e30 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74   assert( p->rSet
10e40 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up>=pTemplate->r
10e50 53 65 74 75 70 20 29 3b 20 2f 2a 20 53 45 54 55  Setup ); /* SETU
10e60 50 2d 49 4e 56 41 52 49 41 4e 54 20 61 62 6f 76  P-INVARIANT abov
10e70 65 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  e */.      break
10e80 3b 20 20 20 2f 2a 20 43 61 75 73 65 20 70 20 74  ;   /* Cause p t
10e90 6f 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  o be overwritten
10ea0 20 62 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f   by pTemplate */
10eb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
10ec0 75 72 6e 20 70 70 50 72 65 76 3b 0a 7d 0a 0a 2f  urn ppPrev;.}../
10ed0 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72  *.** Insert or r
10ee0 65 70 6c 61 63 65 20 61 20 57 68 65 72 65 4c 6f  eplace a WhereLo
10ef0 6f 70 20 65 6e 74 72 79 20 75 73 69 6e 67 20 74  op entry using t
10f00 68 65 20 74 65 6d 70 6c 61 74 65 20 73 75 70 70  he template supp
10f10 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  lied..**.** An e
10f20 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
10f30 70 20 65 6e 74 72 79 20 6d 69 67 68 74 20 62 65  p entry might be
10f40 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66 20   overwritten if 
10f50 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65  the new template
10f60 0a 2a 2a 20 69 73 20 62 65 74 74 65 72 20 61 6e  .** is better an
10f70 64 20 68 61 73 20 66 65 77 65 72 20 64 65 70 65  d has fewer depe
10f80 6e 64 65 6e 63 69 65 73 2e 20 20 4f 72 20 74 68  ndencies.  Or th
10f90 65 20 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20  e template will 
10fa0 62 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e  be ignored.** an
10fb0 64 20 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c  d no insert will
10fc0 20 6f 63 63 75 72 20 69 66 20 61 6e 20 65 78 69   occur if an exi
10fd0 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
10fe0 69 73 20 66 61 73 74 65 72 20 61 6e 64 20 68 61  is faster and ha
10ff0 73 0a 2a 2a 20 66 65 77 65 72 20 64 65 70 65 6e  s.** fewer depen
11000 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65  dencies than the
11010 20 74 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65   template.  Othe
11020 72 77 69 73 65 20 61 20 6e 65 77 20 57 68 65 72  rwise a new Wher
11030 65 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65  eLoop is.** adde
11040 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 74  d based on the t
11050 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49  emplate..**.** I
11060 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  f pBuilder->pOrS
11070 65 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  et is not NULL t
11080 68 65 6e 20 77 65 20 63 61 72 65 20 61 62 6f 75  hen we care abou
11090 74 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72  t only the.** pr
110a0 65 72 65 71 75 69 73 69 74 65 73 20 61 6e 64 20  erequisites and 
110b0 72 52 75 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f  rRun and nOut co
110c0 73 74 73 20 6f 66 20 74 68 65 20 4e 20 62 65 73  sts of the N bes
110d0 74 20 6c 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a  t loops.  That.*
110e0 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  * information is
110f0 20 67 61 74 68 65 72 65 64 20 69 6e 20 74 68 65   gathered in the
11100 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
11110 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20  t object.  This 
11120 73 70 65 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65  special.** proce
11130 73 73 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73  ssing mode is us
11140 65 64 20 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63  ed only for OR c
11150 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
11160 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63  ..**.** When acc
11170 75 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70  umulating multip
11180 6c 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70  le loops (when p
11190 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
111a0 69 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73  is NULL) we.** s
111b0 74 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77  till might overw
111c0 72 69 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f  rite similar loo
111d0 70 73 20 77 69 74 68 20 74 68 65 20 6e 65 77 20  ps with the new 
111e0 74 65 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a  template if the.
111f0 2a 2a 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20  ** new template 
11200 69 73 20 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70  is better.  Loop
11210 73 20 6d 61 79 20 62 65 20 6f 76 65 72 77 72 69  s may be overwri
11220 74 74 65 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c  tten if the foll
11230 6f 77 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74  owing .** condit
11240 69 6f 6e 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a  ions are met:.**
11250 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 79  .**    (1)  They
11260 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69   have the same i
11270 54 61 62 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20  Tab..**    (2)  
11280 54 68 65 79 20 68 61 76 65 20 74 68 65 20 73 61  They have the sa
11290 6d 65 20 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20  me iSortIdx..** 
112a0 20 20 20 28 33 29 20 20 54 68 65 20 74 65 6d 70     (3)  The temp
112b0 6c 61 74 65 20 68 61 73 20 73 61 6d 65 20 6f 72  late has same or
112c0 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63   fewer dependenc
112d0 69 65 73 20 74 68 61 6e 20 74 68 65 20 63 75 72  ies than the cur
112e0 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20  rent loop.**    
112f0 28 34 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74  (4)  The templat
11300 65 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f  e has the same o
11310 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61  r lower cost tha
11320 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  n the current lo
11330 6f 70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  op.*/.static int
11340 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
11350 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65  (WhereLoopBuilde
11360 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 57 68 65  r *pBuilder, Whe
11370 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74  reLoop *pTemplat
11380 65 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  e){.  WhereLoop 
11390 2a 2a 70 70 50 72 65 76 2c 20 2a 70 3b 0a 20 20  **ppPrev, *p;.  
113a0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
113b0 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
113c0 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20  Info;.  sqlite3 
113d0 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  *db = pWInfo->pP
113e0 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  arse->db;..  /* 
113f0 49 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  If pBuilder->pOr
11400 53 65 74 20 69 73 20 64 65 66 69 6e 65 64 2c 20  Set is defined, 
11410 74 68 65 6e 20 6f 6e 6c 79 20 6b 65 65 70 20 74  then only keep t
11420 72 61 63 6b 20 6f 66 20 74 68 65 20 63 6f 73 74  rack of the cost
11430 73 0a 20 20 2a 2a 20 61 6e 64 20 70 72 65 72 65  s.  ** and prere
11440 71 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  qs..  */.  if( p
11450 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 21  Builder->pOrSet!
11460 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54  =0 ){.    if( pT
11470 65 6d 70 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d 20  emplate->nLTerm 
11480 29 7b 0a 23 69 66 20 57 48 45 52 45 54 52 41 43  ){.#if WHERETRAC
11490 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20  E_ENABLED.      
114a0 75 31 36 20 6e 20 3d 20 70 42 75 69 6c 64 65 72  u16 n = pBuilder
114b0 2d 3e 70 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20  ->pOrSet->n;.   
114c0 20 20 20 69 6e 74 20 78 20 3d 0a 23 65 6e 64 69     int x =.#endi
114d0 66 0a 20 20 20 20 20 20 77 68 65 72 65 4f 72 49  f.      whereOrI
114e0 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2d 3e  nsert(pBuilder->
114f0 70 4f 72 53 65 74 2c 20 70 54 65 6d 70 6c 61 74  pOrSet, pTemplat
11500 65 2d 3e 70 72 65 72 65 71 2c 20 70 54 65 6d 70  e->prereq, pTemp
11510 6c 61 74 65 2d 3e 72 52 75 6e 2c 0a 20 20 20 20  late->rRun,.    
11520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11540 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 29  pTemplate->nOut)
11550 3b 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45  ;.#if WHERETRACE
11560 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20  _ENABLED /* 0x8 
11570 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  */.      if( sql
11580 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
11590 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20 20 20   0x8 ){.        
115a0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
115b0 74 66 28 78 3f 22 20 20 20 6f 72 2d 25 64 3a 20  tf(x?"   or-%d: 
115c0 20 22 3a 22 20 20 20 6f 72 2d 58 3a 20 20 22 2c   ":"   or-X:  ",
115d0 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65   n);.        whe
115e0 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d  reLoopPrint(pTem
115f0 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d  plate, pBuilder-
11600 3e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23  >pWC);.      }.#
11610 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
11620 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11630 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b  ;.  }..  /* Look
11640 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67   for an existing
11650 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 72 65   WhereLoop to re
11660 70 6c 61 63 65 20 77 69 74 68 20 70 54 65 6d 70  place with pTemp
11670 6c 61 74 65 0a 20 20 2a 2f 0a 20 20 77 68 65 72  late.  */.  wher
11680 65 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28  eLoopAdjustCost(
11690 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20  pWInfo->pLoops, 
116a0 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 70 70  pTemplate);.  pp
116b0 50 72 65 76 20 3d 20 77 68 65 72 65 4c 6f 6f 70  Prev = whereLoop
116c0 46 69 6e 64 4c 65 73 73 65 72 28 26 70 57 49 6e  FindLesser(&pWIn
116d0 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d  fo->pLoops, pTem
116e0 70 6c 61 74 65 29 3b 0a 0a 20 20 69 66 28 20 70  plate);..  if( p
116f0 70 50 72 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20  pPrev==0 ){.    
11700 2f 2a 20 54 68 65 72 65 20 61 6c 72 65 61 64 79  /* There already
11710 20 65 78 69 73 74 73 20 61 20 57 68 65 72 65 4c   exists a WhereL
11720 6f 6f 70 20 6f 6e 20 74 68 65 20 6c 69 73 74 20  oop on the list 
11730 74 68 61 74 20 69 73 20 62 65 74 74 65 72 0a 20  that is better. 
11740 20 20 20 2a 2a 20 74 68 61 6e 20 70 54 65 6d 70     ** than pTemp
11750 6c 61 74 65 2c 20 73 6f 20 6a 75 73 74 20 69 67  late, so just ig
11760 6e 6f 72 65 20 70 54 65 6d 70 6c 61 74 65 20 2a  nore pTemplate *
11770 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45  /.#if WHERETRACE
11780 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20  _ENABLED /* 0x8 
11790 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
117a0 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
117b0 78 38 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  x8 ){.      sqli
117c0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
117d0 20 20 20 73 6b 69 70 3a 20 22 29 3b 0a 20 20 20     skip: ");.   
117e0 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
117f0 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75  t(pTemplate, pBu
11800 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20  ilder->pWC);.   
11810 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65   }.#endif.    re
11820 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
11830 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70   .  }else{.    p
11840 20 3d 20 2a 70 70 50 72 65 76 3b 0a 20 20 7d 0a   = *ppPrev;.  }.
11850 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
11860 68 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  h this point it 
11870 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65  means that eithe
11880 72 20 70 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20  r p[] should be 
11890 6f 76 65 72 77 72 69 74 74 65 6e 0a 20 20 2a 2a  overwritten.  **
118a0 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65 5b   with pTemplate[
118b0 5d 20 69 66 20 70 5b 5d 20 65 78 69 73 74 73 2c  ] if p[] exists,
118c0 20 6f 72 20 69 66 20 70 3d 3d 4e 55 4c 4c 20 74   or if p==NULL t
118d0 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e  hen allocate a n
118e0 65 77 0a 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f  ew.  ** WhereLoo
118f0 70 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 2e  p and insert it.
11900 0a 20 20 2a 2f 0a 23 69 66 20 57 48 45 52 45 54  .  */.#if WHERET
11910 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
11920 30 78 38 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  0x8 */.  if( sql
11930 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
11940 20 30 78 38 20 29 7b 0a 20 20 20 20 69 66 28 20   0x8 ){.    if( 
11950 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p!=0 ){.      sq
11960 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
11970 28 22 72 65 70 6c 61 63 65 3a 20 22 29 3b 0a 20  ("replace: ");. 
11980 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72       whereLoopPr
11990 69 6e 74 28 70 2c 20 70 42 75 69 6c 64 65 72 2d  int(p, pBuilder-
119a0 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20  >pWC);.    }.   
119b0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
119c0 6e 74 66 28 22 20 20 20 20 61 64 64 3a 20 22 29  ntf("    add: ")
119d0 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50  ;.    whereLoopP
119e0 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20  rint(pTemplate, 
119f0 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
11a00 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
11a10 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20   p==0 ){.    /* 
11a20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57  Allocate a new W
11a30 68 65 72 65 4c 6f 6f 70 20 74 6f 20 61 64 64 20  hereLoop to add 
11a40 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
11a50 65 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 2a 70  e list */.    *p
11a60 70 50 72 65 76 20 3d 20 70 20 3d 20 73 71 6c 69  pPrev = p = sqli
11a70 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
11a80 62 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c  b, sizeof(WhereL
11a90 6f 6f 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70  oop));.    if( p
11aa0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
11ab0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 77  ITE_NOMEM;.    w
11ac0 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b  hereLoopInit(p);
11ad0 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f  .    p->pNextLoo
11ae0 70 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  p = 0;.  }else{.
11af0 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 62      /* We will b
11b00 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 57 68  e overwriting Wh
11b10 65 72 65 4c 6f 6f 70 20 70 5b 5d 2e 20 20 42 75  ereLoop p[].  Bu
11b20 74 20 62 65 66 6f 72 65 20 77 65 20 64 6f 2c 20  t before we do, 
11b30 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 67 6f 20  first.    ** go 
11b40 74 68 72 6f 75 67 68 20 74 68 65 20 72 65 73 74  through the rest
11b50 20 6f 66 20 74 68 65 20 6c 69 73 74 20 61 6e 64   of the list and
11b60 20 64 65 6c 65 74 65 20 61 6e 79 20 6f 74 68 65   delete any othe
11b70 72 20 65 6e 74 72 69 65 73 20 62 65 73 69 64 65  r entries beside
11b80 73 0a 20 20 20 20 2a 2a 20 70 5b 5d 20 74 68 61  s.    ** p[] tha
11b90 74 20 61 72 65 20 61 6c 73 6f 20 73 75 70 70 6c  t are also suppl
11ba0 61 74 65 64 20 62 79 20 70 54 65 6d 70 6c 61 74  ated by pTemplat
11bb0 65 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f  e */.    WhereLo
11bc0 6f 70 20 2a 2a 70 70 54 61 69 6c 20 3d 20 26 70  op **ppTail = &p
11bd0 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20  ->pNextLoop;.   
11be0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 44   WhereLoop *pToD
11bf0 65 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a  el;.    while( *
11c00 70 70 54 61 69 6c 20 29 7b 0a 20 20 20 20 20 20  ppTail ){.      
11c10 70 70 54 61 69 6c 20 3d 20 77 68 65 72 65 4c 6f  ppTail = whereLo
11c20 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 70 70 54  opFindLesser(ppT
11c30 61 69 6c 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  ail, pTemplate);
11c40 0a 20 20 20 20 20 20 69 66 28 20 70 70 54 61 69  .      if( ppTai
11c50 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  l==0 ) break;.  
11c60 20 20 20 20 70 54 6f 44 65 6c 20 3d 20 2a 70 70      pToDel = *pp
11c70 54 61 69 6c 3b 0a 20 20 20 20 20 20 69 66 28 20  Tail;.      if( 
11c80 70 54 6f 44 65 6c 3d 3d 30 20 29 20 62 72 65 61  pToDel==0 ) brea
11c90 6b 3b 0a 20 20 20 20 20 20 2a 70 70 54 61 69 6c  k;.      *ppTail
11ca0 20 3d 20 70 54 6f 44 65 6c 2d 3e 70 4e 65 78 74   = pToDel->pNext
11cb0 4c 6f 6f 70 3b 0a 23 69 66 20 57 48 45 52 45 54  Loop;.#if WHERET
11cc0 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
11cd0 30 78 38 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  0x8 */.      if(
11ce0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
11cf0 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20  ce & 0x8 ){.    
11d00 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
11d10 50 72 69 6e 74 66 28 22 20 64 65 6c 65 74 65 3a  Printf(" delete:
11d20 20 22 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65   ");.        whe
11d30 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 6f 44  reLoopPrint(pToD
11d40 65 6c 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  el, pBuilder->pW
11d50 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  C);.      }.#end
11d60 69 66 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  if.      whereLo
11d70 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f  opDelete(db, pTo
11d80 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Del);.    }.  }.
11d90 20 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28    whereLoopXfer(
11da0 64 62 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74 65  db, p, pTemplate
11db0 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46  );.  if( (p->wsF
11dc0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
11dd0 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b  TUALTABLE)==0 ){
11de0 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  .    Index *pInd
11df0 65 78 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e  ex = p->u.btree.
11e00 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  pIndex;.    if( 
11e10 70 49 6e 64 65 78 20 26 26 20 70 49 6e 64 65 78  pIndex && pIndex
11e20 2d 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20  ->tnum==0 ){.   
11e30 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49     p->u.btree.pI
11e40 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ndex = 0;.    }.
11e50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
11e60 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
11e70 20 41 64 6a 75 73 74 20 74 68 65 20 57 68 65 72   Adjust the Wher
11e80 65 4c 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75 65  eLoop.nOut value
11e90 20 64 6f 77 6e 77 61 72 64 20 74 6f 20 61 63 63   downward to acc
11ea0 6f 75 6e 74 20 66 6f 72 20 74 65 72 6d 73 20 6f  ount for terms o
11eb0 66 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63  f the.** WHERE c
11ec0 6c 61 75 73 65 20 74 68 61 74 20 72 65 66 65 72  lause that refer
11ed0 65 6e 63 65 20 74 68 65 20 6c 6f 6f 70 20 62 75  ence the loop bu
11ee0 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20  t which are not 
11ef0 75 73 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69 6e  used by an.** in
11f00 64 65 78 2e 0a 2a 0a 2a 2a 20 46 6f 72 20 65 76  dex..*.** For ev
11f10 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73 65  ery WHERE clause
11f20 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 6e 6f   term that is no
11f30 74 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6e  t used by the in
11f40 64 65 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63 68  dex.** and which
11f50 20 68 61 73 20 61 20 74 72 75 74 68 20 70 72 6f   has a truth pro
11f60 62 61 62 69 6c 69 74 79 20 61 73 73 69 67 6e 65  bability assigne
11f70 64 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  d by one of the 
11f80 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c 0a 2a 2a  likelihood(),.**
11f90 20 6c 69 6b 65 6c 79 28 29 2c 20 6f 72 20 75 6e   likely(), or un
11fa0 6c 69 6b 65 6c 79 28 29 20 53 51 4c 20 66 75 6e  likely() SQL fun
11fb0 63 74 69 6f 6e 73 2c 20 72 65 64 75 63 65 20 74  ctions, reduce t
11fc0 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d  he estimated num
11fd0 62 65 72 0a 2a 2a 20 6f 66 20 6f 75 74 70 75 74  ber.** of output
11fe0 20 72 6f 77 73 20 62 79 20 74 68 65 20 70 72 6f   rows by the pro
11ff0 62 61 62 69 6c 69 74 79 20 73 70 65 63 69 66 69  bability specifi
12000 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 55 4e 49 4e 47  ed..**.** TUNING
12010 3a 20 20 46 6f 72 20 65 76 65 72 79 20 57 48 45  :  For every WHE
12020 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  RE clause term t
12030 68 61 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20  hat is not used 
12040 62 79 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20  by the index.** 
12050 61 6e 64 20 77 68 69 63 68 20 64 6f 65 73 20 6e  and which does n
12060 6f 74 20 68 61 76 65 20 61 6e 20 61 73 73 69 67  ot have an assig
12070 6e 65 64 20 74 72 75 74 68 20 70 72 6f 62 61 62  ned truth probab
12080 69 6c 69 74 79 2c 20 68 65 75 72 69 73 74 69 63  ility, heuristic
12090 73 0a 2a 2a 20 64 65 73 63 72 69 62 65 64 20 62  s.** described b
120a0 65 6c 6f 77 20 61 72 65 20 75 73 65 64 20 74 6f  elow are used to
120b0 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65   try to estimate
120c0 20 74 68 65 20 74 72 75 74 68 20 70 72 6f 62 61   the truth proba
120d0 62 69 6c 69 74 79 2e 0a 2a 2a 20 54 4f 44 4f 20  bility..** TODO 
120e0 2d 2d 3e 20 50 65 72 68 61 70 73 20 74 68 69 73  --> Perhaps this
120f0 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68   is something th
12100 61 74 20 63 6f 75 6c 64 20 62 65 20 69 6d 70 72  at could be impr
12110 6f 76 65 64 20 62 79 20 62 65 74 74 65 72 0a 2a  oved by better.*
12120 2a 20 74 61 62 6c 65 20 73 74 61 74 69 73 74 69  * table statisti
12130 63 73 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73  cs..**.** Heuris
12140 74 69 63 20 31 3a 20 20 45 73 74 69 6d 61 74 65  tic 1:  Estimate
12150 20 74 68 65 20 74 72 75 74 68 20 70 72 6f 62 61   the truth proba
12160 62 69 6c 69 74 79 20 61 73 20 39 33 2e 37 35 25  bility as 93.75%
12170 2e 20 20 54 68 65 20 39 33 2e 37 35 25 0a 2a 2a  .  The 93.75%.**
12180 20 76 61 6c 75 65 20 63 6f 72 72 65 73 70 6f 6e   value correspon
12190 64 73 20 74 6f 20 2d 31 20 69 6e 20 4c 6f 67 45  ds to -1 in LogE
121a0 73 74 20 6e 6f 74 61 74 69 6f 6e 2c 20 73 6f 20  st notation, so 
121b0 74 68 69 73 20 6d 65 61 6e 73 20 64 65 63 72 65  this means decre
121c0 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 57 68 65 72  ment.** the Wher
121d0 65 4c 6f 6f 70 2e 6e 4f 75 74 20 66 69 65 6c 64  eLoop.nOut field
121e0 20 66 6f 72 20 65 76 65 72 79 20 73 75 63 68 20   for every such 
121f0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
12200 6d 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74  m..**.** Heurist
12210 69 63 20 32 3a 20 20 49 66 20 74 68 65 72 65 20  ic 2:  If there 
12220 65 78 69 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f  exists one or mo
12230 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  re WHERE clause 
12240 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20  terms of the.** 
12250 66 6f 72 6d 20 22 78 3d 3d 45 58 50 52 22 20 61  form "x==EXPR" a
12260 6e 64 20 45 58 50 52 20 69 73 20 6e 6f 74 20 61  nd EXPR is not a
12270 20 63 6f 6e 73 74 61 6e 74 20 30 20 6f 72 20 31   constant 0 or 1
12280 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
12290 20 74 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 6f 75   the.** final ou
122a0 74 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74  tput row estimat
122b0 65 20 69 73 20 6e 6f 20 67 72 65 61 74 65 72 20  e is no greater 
122c0 74 68 61 6e 20 31 2f 34 20 6f 66 20 74 68 65 20  than 1/4 of the 
122d0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 0a 2a 2a 20  total number.** 
122e0 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
122f0 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20  able.  In other 
12300 77 6f 72 64 73 2c 20 61 73 73 75 6d 65 20 74 68  words, assume th
12310 61 74 20 78 3d 3d 45 58 50 52 20 77 69 6c 6c 20  at x==EXPR will 
12320 66 69 6c 74 65 72 0a 2a 2a 20 6f 75 74 20 61 74  filter.** out at
12330 20 6c 65 61 73 74 20 33 20 6f 75 74 20 6f 66 20   least 3 out of 
12340 34 20 72 6f 77 73 2e 20 20 49 66 20 45 58 50 52  4 rows.  If EXPR
12350 20 69 73 20 2d 31 20 6f 72 20 30 20 6f 72 20 31   is -1 or 0 or 1
12360 2c 20 74 68 65 6e 20 6d 61 79 62 65 20 74 68 65  , then maybe the
12370 0a 2a 2a 20 22 78 22 20 63 6f 6c 75 6d 6e 20 69  .** "x" column i
12380 73 20 62 6f 6f 6c 65 61 6e 20 6f 72 20 65 6c 73  s boolean or els
12390 65 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 20 69  e -1 or 0 or 1 i
123a0 73 20 61 20 63 6f 6d 6d 6f 6e 20 64 65 66 61 75  s a common defau
123b0 6c 74 20 76 61 6c 75 65 0a 2a 2a 20 6f 6e 20 74  lt value.** on t
123c0 68 65 20 22 78 22 20 63 6f 6c 75 6d 6e 20 61 6e  he "x" column an
123d0 64 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73  d so in that cas
123e0 65 20 6f 6e 6c 79 20 63 61 70 20 74 68 65 20 6f  e only cap the o
123f0 75 74 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61  utput row estima
12400 74 65 0a 2a 2a 20 61 74 20 31 2f 32 20 69 6e 73  te.** at 1/2 ins
12410 74 65 61 64 20 6f 66 20 31 2f 34 2e 0a 2a 2f 0a  tead of 1/4..*/.
12420 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
12430 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73  eLoopOutputAdjus
12440 74 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  t(.  WhereClause
12450 20 2a 70 57 43 2c 20 20 20 20 20 20 2f 2a 20 54   *pWC,      /* T
12460 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
12470 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
12480 70 4c 6f 6f 70 2c 20 20 20 20 20 20 2f 2a 20 54  pLoop,      /* T
12490 68 65 20 6c 6f 6f 70 20 74 6f 20 61 64 6a 75 73  he loop to adjus
124a0 74 20 64 6f 77 6e 77 61 72 64 20 2a 2f 0a 20 20  t downward */.  
124b0 4c 6f 67 45 73 74 20 6e 52 6f 77 20 20 20 20 20  LogEst nRow     
124c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
124d0 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
124e0 65 6e 74 69 72 65 20 74 61 62 6c 65 20 2a 2f 0a  entire table */.
124f0 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
12500 70 54 65 72 6d 2c 20 2a 70 58 3b 0a 20 20 42 69  pTerm, *pX;.  Bi
12510 74 6d 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64  tmask notAllowed
12520 20 3d 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65 72   = ~(pLoop->prer
12530 65 71 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65  eq|pLoop->maskSe
12540 6c 66 29 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  lf);.  int i, j,
12550 20 6b 3b 0a 20 20 4c 6f 67 45 73 74 20 69 52 65   k;.  LogEst iRe
12560 64 75 63 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20  duce = 0;    /* 
12570 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 73 68 6f 75  pLoop->nOut shou
12580 6c 64 20 6e 6f 74 20 65 78 63 65 65 64 20 6e 52  ld not exceed nR
12590 6f 77 2d 69 52 65 64 75 63 65 20 2a 2f 0a 0a 20  ow-iReduce */.. 
125a0 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d   assert( (pLoop-
125b0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
125c0 5f 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20  _AUTO_INDEX)==0 
125d0 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e  );.  for(i=pWC->
125e0 6e 54 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43  nTerm, pTerm=pWC
125f0 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  ->a; i>0; i--, p
12600 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
12610 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
12620 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29   & TERM_VIRTUAL)
12630 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  !=0 ) break;.   
12640 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
12650 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e  reqAll & pLoop->
12660 6d 61 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63  maskSelf)==0 ) c
12670 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
12680 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
12690 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29  ll & notAllowed)
126a0 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
126b0 20 20 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d      for(j=pLoop-
126c0 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b  >nLTerm-1; j>=0;
126d0 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58 20   j--){.      pX 
126e0 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
126f0 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58  j];.      if( pX
12700 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
12710 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 54        if( pX==pT
12720 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  erm ) break;.   
12730 20 20 20 69 66 28 20 70 58 2d 3e 69 50 61 72 65     if( pX->iPare
12740 6e 74 3e 3d 30 20 26 26 20 28 26 70 57 43 2d 3e  nt>=0 && (&pWC->
12750 61 5b 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d  a[pX->iParent])=
12760 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a  =pTerm ) break;.
12770 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c      }.    if( j<
12780 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
12790 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c  Term->truthProb<
127a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
127b0 20 49 66 20 61 20 74 72 75 74 68 20 70 72 6f 62   If a truth prob
127c0 61 62 69 6c 69 74 79 20 69 73 20 73 70 65 63 69  ability is speci
127d0 66 69 65 64 20 75 73 69 6e 67 20 74 68 65 20 6c  fied using the l
127e0 69 6b 65 6c 69 68 6f 6f 64 28 29 20 68 69 6e 74  ikelihood() hint
127f0 73 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  s,.        ** th
12800 65 6e 20 75 73 65 20 74 68 65 20 70 72 6f 62 61  en use the proba
12810 62 69 6c 69 74 79 20 70 72 6f 76 69 64 65 64 20  bility provided 
12820 62 79 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  by the applicati
12830 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  on. */.        p
12840 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54  Loop->nOut += pT
12850 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a  erm->truthProb;.
12860 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12870 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 61       /* In the a
12880 62 73 65 6e 63 65 20 6f 66 20 65 78 70 6c 69 63  bsence of explic
12890 69 74 20 74 72 75 74 68 20 70 72 6f 62 61 62 69  it truth probabi
128a0 6c 69 74 69 65 73 2c 20 75 73 65 20 68 65 75 72  lities, use heur
128b0 69 73 74 69 63 73 20 74 6f 0a 20 20 20 20 20 20  istics to.      
128c0 20 20 2a 2a 20 67 75 65 73 73 20 61 20 72 65 61    ** guess a rea
128d0 73 6f 6e 61 62 6c 65 20 74 72 75 74 68 20 70 72  sonable truth pr
128e0 6f 62 61 62 69 6c 69 74 79 2e 20 2a 2f 0a 20 20  obability. */.  
128f0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75        pLoop->nOu
12900 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  t--;.        if(
12910 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
12920 72 26 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20  r&(WO_EQ|WO_IS) 
12930 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
12940 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72  r *pRight = pTer
12950 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
12960 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
12970 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78  case( pTerm->pEx
12980 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b  pr->op==TK_IS );
12990 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
129a0 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
129b0 67 65 72 28 70 52 69 67 68 74 2c 20 26 6b 29 20  ger(pRight, &k) 
129c0 26 26 20 6b 3e 3d 28 2d 31 29 20 26 26 20 6b 3c  && k>=(-1) && k<
129d0 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =1 ){.          
129e0 20 20 6b 20 3d 20 31 30 3b 0a 20 20 20 20 20 20    k = 10;.      
129f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12a00 20 20 20 20 20 20 20 6b 20 3d 20 32 30 3b 0a 20         k = 20;. 
12a10 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
12a20 20 20 20 20 20 69 66 28 20 69 52 65 64 75 63 65       if( iReduce
12a30 3c 6b 20 29 20 69 52 65 64 75 63 65 20 3d 20 6b  <k ) iReduce = k
12a40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12a50 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
12a60 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20  if( pLoop->nOut 
12a70 3e 20 6e 52 6f 77 2d 69 52 65 64 75 63 65 20 29  > nRow-iReduce )
12a80 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20    pLoop->nOut = 
12a90 6e 52 6f 77 20 2d 20 69 52 65 64 75 63 65 3b 0a  nRow - iReduce;.
12aa0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
12ab0 74 68 65 20 63 6f 73 74 20 43 20 62 79 20 74 68  the cost C by th
12ac0 65 20 63 6f 73 74 4d 75 6c 74 20 66 61 63 74 65  e costMult facte
12ad0 72 20 54 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20  r T.  This only 
12ae0 6f 63 63 75 72 73 20 69 66 0a 2a 2a 20 63 6f 6d  occurs if.** com
12af0 70 69 6c 65 64 20 77 69 74 68 20 2d 44 53 51 4c  piled with -DSQL
12b00 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d  ITE_ENABLE_COSTM
12b10 55 4c 54 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ULT.*/.#ifdef SQ
12b20 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54  LITE_ENABLE_COST
12b30 4d 55 4c 54 0a 23 20 64 65 66 69 6e 65 20 41 70  MULT.# define Ap
12b40 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65  plyCostMultiplie
12b50 72 28 43 2c 54 29 20 20 43 20 2b 3d 20 54 0a 23  r(C,T)  C += T.#
12b60 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 41 70  else.# define Ap
12b70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65  plyCostMultiplie
12b80 72 28 43 2c 54 29 0a 23 65 6e 64 69 66 0a 0a 2f  r(C,T).#endif../
12b90 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20 73 6f 20  *.** We have so 
12ba0 66 61 72 20 6d 61 74 63 68 65 64 20 70 42 75 69  far matched pBui
12bb0 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74  lder->pNew->u.bt
12bc0 72 65 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f 66  ree.nEq terms of
12bd0 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20 70   the .** index p
12be0 49 6e 64 65 78 2e 20 54 72 79 20 74 6f 20 6d 61  Index. Try to ma
12bf0 74 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a  tch one more..**
12c00 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
12c10 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
12c20 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  , pBuilder->pNew
12c30 2d 3e 6e 4f 75 74 20 63 6f 6e 74 61 69 6e 73 20  ->nOut contains 
12c40 74 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f  the .** number o
12c50 66 20 72 6f 77 73 20 65 78 70 65 63 74 65 64 20  f rows expected 
12c60 74 6f 20 62 65 20 76 69 73 69 74 65 64 20 62 79  to be visited by
12c70 20 66 69 6c 74 65 72 69 6e 67 20 75 73 69 6e 67   filtering using
12c80 20 74 68 65 20 6e 45 71 20 0a 2a 2a 20 74 65 72   the nEq .** ter
12c90 6d 73 20 6f 6e 6c 79 2e 20 49 66 20 69 74 20 69  ms only. If it i
12ca0 73 20 6d 6f 64 69 66 69 65 64 2c 20 74 68 69 73  s modified, this
12cb0 20 76 61 6c 75 65 20 69 73 20 72 65 73 74 6f 72   value is restor
12cc0 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 0a  ed before this .
12cd0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
12ce0 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50  rns..**.** If pP
12cf0 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74  robe->tnum==0, t
12d00 68 61 74 20 6d 65 61 6e 73 20 70 49 6e 64 65 78  hat means pIndex
12d10 20 69 73 20 61 20 66 61 6b 65 20 69 6e 64 65 78   is a fake index
12d20 20 75 73 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a   used for the.**
12d30 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
12d40 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   KEY..*/.static 
12d50 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
12d60 42 74 72 65 65 49 6e 64 65 78 28 0a 20 20 57 68  BtreeIndex(.  Wh
12d70 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
12d80 70 42 75 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a  pBuilder,     /*
12d90 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 66   The WhereLoop f
12da0 61 63 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75  actory */.  stru
12db0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
12dc0 2a 70 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 46  *pSrc,      /* F
12dd0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
12de0 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a  being analyzed *
12df0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62  /.  Index *pProb
12e00 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
12e10 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
12e20 6f 6e 20 70 53 72 63 20 2a 2f 0a 20 20 4c 6f 67  on pSrc */.  Log
12e30 45 73 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20  Est nInMul      
12e40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12e50 6c 6f 67 28 4e 75 6d 62 65 72 20 6f 66 20 69 74  log(Number of it
12e60 65 72 61 74 69 6f 6e 73 20 64 75 65 20 74 6f 20  erations due to 
12e70 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  IN) */.){.  Wher
12e80 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
12e90 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
12ea0 3b 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c  ;  /* WHERE anal
12eb0 79 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  yse context */. 
12ec0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
12ed0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
12ee0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
12ef0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
12f00 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
12f10 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
12f20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
12f30 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f  ection malloc co
12f40 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
12f50 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20  Loop *pNew;     
12f60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
12f70 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70  mplate WhereLoop
12f80 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
12f90 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ion */.  WhereTe
12fa0 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
12fb0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 68           /* A Wh
12fc0 65 72 65 54 65 72 6d 20 75 6e 64 65 72 20 63 6f  ereTerm under co
12fd0 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  nsideration */. 
12fe0 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20   int opMask;    
12ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13000 20 2f 2a 20 56 61 6c 69 64 20 6f 70 65 72 61 74   /* Valid operat
13010 6f 72 73 20 66 6f 72 20 63 6f 6e 73 74 72 61 69  ors for constrai
13020 6e 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 53 63  nts */.  WhereSc
13030 61 6e 20 73 63 61 6e 3b 20 20 20 20 20 20 20 20  an scan;        
13040 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
13050 61 74 6f 72 20 66 6f 72 20 57 48 45 52 45 20 74  ator for WHERE t
13060 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  erms */.  Bitmas
13070 6b 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 20  k saved_prereq; 
13080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
13090 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
130a0 4e 65 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20  New->prereq */. 
130b0 20 75 31 36 20 73 61 76 65 64 5f 6e 4c 54 65 72   u16 saved_nLTer
130c0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
130d0 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
130e0 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65  ue of pNew->nLTe
130f0 72 6d 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65  rm */.  u16 save
13100 64 5f 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20  d_nEq;          
13110 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
13120 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
13130 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a  w->u.btree.nEq *
13140 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 53  /.  u16 saved_nS
13150 6b 69 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  kip;            
13160 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
13170 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e  value of pNew->n
13180 53 6b 69 70 20 2a 2f 0a 20 20 75 33 32 20 73 61  Skip */.  u32 sa
13190 76 65 64 5f 77 73 46 6c 61 67 73 3b 20 20 20 20  ved_wsFlags;    
131a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
131b0 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
131c0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 2a 2f 0a  New->wsFlags */.
131d0 20 20 4c 6f 67 45 73 74 20 73 61 76 65 64 5f 6e    LogEst saved_n
131e0 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Out;            
131f0 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
13200 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75  lue of pNew->nOu
13210 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  t */.  int rc = 
13220 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
13230 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
13240 20 63 6f 64 65 20 2a 2f 0a 20 20 4c 6f 67 45 73   code */.  LogEs
13250 74 20 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  t rSize;        
13260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
13270 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
13280 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c  the table */.  L
13290 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20  ogEst rLogSize; 
132a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
132b0 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74  * Logarithm of t
132c0 61 62 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57  able size */.  W
132d0 68 65 72 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d  hereTerm *pTop =
132e0 20 30 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20 2f   0, *pBtm = 0; /
132f0 2a 20 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d  * Top and bottom
13300 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
13310 74 73 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d 20  ts */..  pNew = 
13320 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
13330 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
13340 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
13350 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20  SQLITE_NOMEM;.. 
13360 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e   assert( (pNew->
13370 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
13380 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
13390 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
133a0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
133b0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d  HERE_TOP_LIMIT)=
133c0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  =0 );.  if( pNew
133d0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
133e0 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_BTM_LIMIT ){. 
133f0 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c     opMask = WO_L
13400 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65  T|WO_LE;.  }else
13410 20 69 66 28 20 2f 2a 70 50 72 6f 62 65 2d 3e 74   if( /*pProbe->t
13420 6e 75 6d 3c 3d 30 20 7c 7c 2a 2f 20 28 70 53 72  num<=0 ||*/ (pSr
13430 63 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  c->fg.jointype &
13440 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a   JT_LEFT)!=0 ){.
13450 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f      opMask = WO_
13460 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57  EQ|WO_IN|WO_GT|W
13470 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_GE|WO_LT|WO_LE
13480 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
13490 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f  pMask = WO_EQ|WO
134a0 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  _IN|WO_GT|WO_GE|
134b0 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 49  WO_LT|WO_LE|WO_I
134c0 53 4e 55 4c 4c 7c 57 4f 5f 49 53 3b 0a 20 20 7d  SNULL|WO_IS;.  }
134d0 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62  .  if( pProbe->b
134e0 55 6e 6f 72 64 65 72 65 64 20 29 20 6f 70 4d 61  Unordered ) opMa
134f0 73 6b 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f  sk &= ~(WO_GT|WO
13500 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29  _GE|WO_LT|WO_LE)
13510 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  ;..  assert( pNe
13520 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70  w->u.btree.nEq<p
13530 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Probe->nColumn )
13540 3b 0a 0a 20 20 73 61 76 65 64 5f 6e 45 71 20 3d  ;..  saved_nEq =
13550 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
13560 45 71 3b 0a 20 20 73 61 76 65 64 5f 6e 53 6b 69  Eq;.  saved_nSki
13570 70 20 3d 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 3b  p = pNew->nSkip;
13580 0a 20 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 20  .  saved_nLTerm 
13590 3d 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a  = pNew->nLTerm;.
135a0 20 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 20    saved_wsFlags 
135b0 3d 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 3b  = pNew->wsFlags;
135c0 0a 20 20 73 61 76 65 64 5f 70 72 65 72 65 71 20  .  saved_prereq 
135d0 3d 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 3b 0a  = pNew->prereq;.
135e0 20 20 73 61 76 65 64 5f 6e 4f 75 74 20 3d 20 70    saved_nOut = p
135f0 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 70 54 65  New->nOut;.  pTe
13600 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e  rm = whereScanIn
13610 69 74 28 26 73 63 61 6e 2c 20 70 42 75 69 6c 64  it(&scan, pBuild
13620 65 72 2d 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69  er->pWC, pSrc->i
13630 43 75 72 73 6f 72 2c 20 73 61 76 65 64 5f 6e 45  Cursor, saved_nE
13640 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  q,.             
13650 20 20 20 20 20 20 20 20 20 20 20 6f 70 4d 61 73             opMas
13660 6b 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 70 4e  k, pProbe);.  pN
13670 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
13680 20 20 72 53 69 7a 65 20 3d 20 70 50 72 6f 62 65    rSize = pProbe
13690 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d  ->aiRowLogEst[0]
136a0 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65  ;.  rLogSize = e
136b0 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 20 20  stLog(rSize);.  
136c0 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45  for(; rc==SQLITE
136d0 5f 4f 4b 20 26 26 20 70 54 65 72 6d 21 3d 30 3b  _OK && pTerm!=0;
136e0 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63   pTerm = whereSc
136f0 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 29 7b 0a  anNext(&scan)){.
13700 20 20 20 20 75 31 36 20 65 4f 70 20 3d 20 70 54      u16 eOp = pT
13710 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 20  erm->eOperator; 
13720 20 20 2f 2a 20 53 68 6f 72 74 68 61 6e 64 20 66    /* Shorthand f
13730 6f 72 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  or pTerm->eOpera
13740 74 6f 72 20 2a 2f 0a 20 20 20 20 4c 6f 67 45 73  tor */.    LogEs
13750 74 20 72 43 6f 73 74 49 64 78 3b 0a 20 20 20 20  t rCostIdx;.    
13760 4c 6f 67 45 73 74 20 6e 4f 75 74 55 6e 61 64 6a  LogEst nOutUnadj
13770 75 73 74 65 64 3b 20 20 20 20 20 20 20 20 2f 2a  usted;        /*
13780 20 6e 4f 75 74 20 62 65 66 6f 72 65 20 49 4e 28   nOut before IN(
13790 29 20 61 6e 64 20 57 48 45 52 45 20 61 64 6a 75  ) and WHERE adju
137a0 73 74 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69  stments */.    i
137b0 6e 74 20 6e 49 6e 20 3d 20 30 3b 0a 23 69 66 64  nt nIn = 0;.#ifd
137c0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
137d0 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
137e0 20 20 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69      int nRecVali
137f0 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  d = pBuilder->nR
13800 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a  ecValid;.#endif.
13810 20 20 20 20 69 66 28 20 28 65 4f 70 3d 3d 57 4f      if( (eOp==WO
13820 5f 49 53 4e 55 4c 4c 20 7c 7c 20 28 70 54 65 72  _ISNULL || (pTer
13830 6d 2d 3e 77 74 46 6c 61 67 73 26 54 45 52 4d 5f  m->wtFlags&TERM_
13840 56 4e 55 4c 4c 29 21 3d 30 29 0a 20 20 20 20 20  VNULL)!=0).     
13850 26 26 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f  && indexColumnNo
13860 74 4e 75 6c 6c 28 70 50 72 6f 62 65 2c 20 73 61  tNull(pProbe, sa
13870 76 65 64 5f 6e 45 71 29 0a 20 20 20 20 29 7b 0a  ved_nEq).    ){.
13880 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
13890 2f 2a 20 69 67 6e 6f 72 65 20 49 53 20 5b 4e 4f  /* ignore IS [NO
138a0 54 5d 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69  T] NULL constrai
138b0 6e 74 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20  nts on NOT NULL 
138c0 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d  columns */.    }
138d0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
138e0 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e  prereqRight & pN
138f0 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63  ew->maskSelf ) c
13900 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
13910 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68   Do not allow th
13920 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66  e upper bound of
13930 20 61 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61   a LIKE optimiza
13940 74 69 6f 6e 20 72 61 6e 67 65 20 63 6f 6e 73 74  tion range const
13950 72 61 69 6e 74 0a 20 20 20 20 2a 2a 20 74 6f 20  raint.    ** to 
13960 6d 69 78 20 77 69 74 68 20 61 20 6c 6f 77 65 72  mix with a lower
13970 20 72 61 6e 67 65 20 62 6f 75 6e 64 20 66 72 6f   range bound fro
13980 6d 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 6f 75  m some other sou
13990 72 63 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  rce */.    if( p
139a0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
139b0 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 26 26 20  TERM_LIKEOPT && 
139c0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
139d0 3d 3d 57 4f 5f 4c 54 20 29 20 63 6f 6e 74 69 6e  ==WO_LT ) contin
139e0 75 65 3b 0a 0a 20 20 20 20 70 4e 65 77 2d 3e 77  ue;..    pNew->w
139f0 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77  sFlags = saved_w
13a00 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65 77  sFlags;.    pNew
13a10 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
13a20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70  saved_nEq;.    p
13a30 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61  New->nLTerm = sa
13a40 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20 20  ved_nLTerm;.    
13a50 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  if( whereLoopRes
13a60 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e  ize(db, pNew, pN
13a70 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20  ew->nLTerm+1) ) 
13a80 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f  break; /* OOM */
13a90 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72  .    pNew->aLTer
13aa0 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b  m[pNew->nLTerm++
13ab0 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70  ] = pTerm;.    p
13ac0 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 28 73  New->prereq = (s
13ad0 61 76 65 64 5f 70 72 65 72 65 71 20 7c 20 70 54  aved_prereq | pT
13ae0 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
13af0 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53  ) & ~pNew->maskS
13b00 65 6c 66 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  elf;..    assert
13b10 28 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20  ( nInMul==0.    
13b20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73      || (pNew->ws
13b30 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
13b40 4c 55 4d 4e 5f 4e 55 4c 4c 29 21 3d 30 20 0a 20  LUMN_NULL)!=0 . 
13b50 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d         || (pNew-
13b60 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
13b70 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 21 3d 30 20 0a  _COLUMN_IN)!=0 .
13b80 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77          || (pNew
13b90 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
13ba0 45 5f 53 4b 49 50 53 43 41 4e 29 21 3d 30 20 0a  E_SKIPSCAN)!=0 .
13bb0 20 20 20 20 29 3b 0a 0a 20 20 20 20 69 66 28 20      );..    if( 
13bc0 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20  eOp & WO_IN ){. 
13bd0 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
13be0 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
13bf0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
13c00 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
13c10 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 69  LUMN_IN;.      i
13c20 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
13c30 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
13c40 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
13c50 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c     /* "x IN (SEL
13c60 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54 55 4e 49  ECT ...)":  TUNI
13c70 4e 47 3a 20 74 68 65 20 53 45 4c 45 43 54 20 72  NG: the SELECT r
13c80 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a  eturns 25 rows *
13c90 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20  /.        nIn = 
13ca0 34 36 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d  46;  assert( 46=
13cb0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32  =sqlite3LogEst(2
13cc0 35 29 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  5) );.      }els
13cd0 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78  e if( ALWAYS(pEx
13ce0 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70  pr->x.pList && p
13cf0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
13d00 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
13d10 20 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c 75 65   /* "x IN (value
13d20 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a  , value, ...)" *
13d30 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20  /.        nIn = 
13d40 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 45  sqlite3LogEst(pE
13d50 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
13d60 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
13d70 20 20 20 20 61 73 73 65 72 74 28 20 6e 49 6e 3e      assert( nIn>
13d80 30 20 29 3b 20 20 2f 2a 20 52 48 53 20 61 6c 77  0 );  /* RHS alw
13d90 61 79 73 20 68 61 73 20 32 20 6f 72 20 6d 6f 72  ays has 2 or mor
13da0 65 20 74 65 72 6d 73 2e 2e 2e 20 20 54 68 65 20  e terms...  The 
13db0 70 61 72 73 65 72 0a 20 20 20 20 20 20 20 20 20  parser.         
13dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
13dd0 2a 20 63 68 61 6e 67 65 73 20 22 78 20 49 4e 20  * changes "x IN 
13de0 28 3f 29 22 20 69 6e 74 6f 20 22 78 3d 3f 22 2e  (?)" into "x=?".
13df0 20 2a 2f 0a 0a 20 20 20 20 7d 65 6c 73 65 20 69   */..    }else i
13e00 66 28 20 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c  f( eOp & (WO_EQ|
13e10 57 4f 5f 49 53 29 20 29 7b 0a 20 20 20 20 20 20  WO_IS) ){.      
13e20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62  int iCol = pProb
13e30 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 73 61 76 65  e->aiColumn[save
13e40 64 5f 6e 45 71 5d 3b 0a 20 20 20 20 20 20 70 4e  d_nEq];.      pN
13e50 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
13e60 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a  HERE_COLUMN_EQ;.
13e70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 61        assert( sa
13e80 76 65 64 5f 6e 45 71 3d 3d 70 4e 65 77 2d 3e 75  ved_nEq==pNew->u
13e90 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b 0a 20 20  .btree.nEq );.  
13ea0 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 28 2d      if( iCol==(-
13eb0 31 29 20 7c 7c 20 28 69 43 6f 6c 3e 30 20 26 26  1) || (iCol>0 &&
13ec0 20 6e 49 6e 4d 75 6c 3d 3d 30 20 26 26 20 73 61   nInMul==0 && sa
13ed0 76 65 64 5f 6e 45 71 3d 3d 70 50 72 6f 62 65 2d  ved_nEq==pProbe-
13ee0 3e 6e 4b 65 79 43 6f 6c 2d 31 29 20 29 7b 0a 20  >nKeyCol-1) ){. 
13ef0 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e         if( iCol>
13f00 3d 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 75 6e  =0 && pProbe->un
13f10 69 71 4e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a  iqNotNull==0 ){.
13f20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
13f30 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
13f40 5f 55 4e 51 5f 57 41 4e 54 45 44 3b 0a 20 20 20  _UNQ_WANTED;.   
13f50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13f60 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
13f70 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45  ags |= WHERE_ONE
13f80 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROW;.        }. 
13f90 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
13fa0 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53   if( eOp & WO_IS
13fb0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e  NULL ){.      pN
13fc0 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
13fd0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c  HERE_COLUMN_NULL
13fe0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
13ff0 65 4f 70 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f  eOp & (WO_GT|WO_
14000 47 45 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73  GE) ){.      tes
14010 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
14020 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GT );.      test
14030 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47  case( eOp & WO_G
14040 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  E );.      pNew-
14050 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
14060 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57  E_COLUMN_RANGE|W
14070 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a  HERE_BTM_LIMIT;.
14080 20 20 20 20 20 20 70 42 74 6d 20 3d 20 70 54 65        pBtm = pTe
14090 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d  rm;.      pTop =
140a0 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   0;.      if( pT
140b0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
140c0 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 7b 0a 20  ERM_LIKEOPT ){. 
140d0 20 20 20 20 20 20 20 2f 2a 20 52 61 6e 67 65 20         /* Range 
140e0 63 6f 6e 74 72 61 69 6e 74 73 20 74 68 61 74 20  contraints that 
140f0 63 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20 4c 49  come from the LI
14100 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  KE optimization 
14110 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  are.        ** a
14120 6c 77 61 79 73 20 75 73 65 64 20 69 6e 20 70 61  lways used in pa
14130 69 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  irs. */.        
14140 70 54 6f 70 20 3d 20 26 70 54 65 72 6d 5b 31 5d  pTop = &pTerm[1]
14150 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
14160 28 20 28 70 54 6f 70 2d 28 70 54 65 72 6d 2d 3e  ( (pTop-(pTerm->
14170 70 57 43 2d 3e 61 29 29 3c 70 54 65 72 6d 2d 3e  pWC->a))<pTerm->
14180 70 57 43 2d 3e 6e 54 65 72 6d 20 29 3b 0a 20 20  pWC->nTerm );.  
14190 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
141a0 6f 70 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  op->wtFlags & TE
141b0 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 3b 0a 20 20  RM_LIKEOPT );.  
141c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
141d0 6f 70 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  op->eOperator==W
141e0 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 20 20  O_LT );.        
141f0 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  if( whereLoopRes
14200 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e  ize(db, pNew, pN
14210 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20  ew->nLTerm+1) ) 
14220 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f  break; /* OOM */
14230 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61  .        pNew->a
14240 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65  LTerm[pNew->nLTe
14250 72 6d 2b 2b 5d 20 3d 20 70 54 6f 70 3b 0a 20 20  rm++] = pTop;.  
14260 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
14270 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50  ags |= WHERE_TOP
14280 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 7d 0a  _LIMIT;.      }.
14290 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
142a0 20 61 73 73 65 72 74 28 20 65 4f 70 20 26 20 28   assert( eOp & (
142b0 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a  WO_LT|WO_LE) );.
142c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
142d0 65 4f 70 20 26 20 57 4f 5f 4c 54 20 29 3b 0a 20  eOp & WO_LT );. 
142e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
142f0 4f 70 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20  Op & WO_LE );.  
14300 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
14310 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
14320 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 54 4f  N_RANGE|WHERE_TO
14330 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70  P_LIMIT;.      p
14340 54 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  Top = pTerm;.   
14350 20 20 20 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d     pBtm = (pNew-
14360 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
14370 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f  _BTM_LIMIT)!=0 ?
14380 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14390 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
143a0 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d  rm[pNew->nLTerm-
143b0 32 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  2] : 0;.    }.. 
143c0 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
143d0 69 6e 74 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 69  int pNew->nOut i
143e0 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
143f0 62 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70 65  ber of rows expe
14400 63 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  cted to.    ** b
14410 65 20 76 69 73 69 74 65 64 20 62 79 20 74 68 65  e visited by the
14420 20 69 6e 64 65 78 20 73 63 61 6e 20 62 65 66 6f   index scan befo
14430 72 65 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74  re considering t
14440 65 72 6d 20 70 54 65 72 6d 2c 20 6f 72 20 74 68  erm pTerm, or th
14450 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  e.    ** values 
14460 6f 66 20 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d 75  of nIn and nInMu
14470 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  l. In other word
14480 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  s, assuming that
14490 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 22 78 20   all .    ** "x 
144a0 49 4e 28 2e 2e 2e 29 22 20 74 65 72 6d 73 20 61  IN(...)" terms a
144b0 72 65 20 72 65 70 6c 61 63 65 64 20 77 69 74 68  re replaced with
144c0 20 22 78 20 3d 20 3f 22 2e 20 54 68 69 73 20 62   "x = ?". This b
144d0 6c 6f 63 6b 20 75 70 64 61 74 65 73 0a 20 20 20  lock updates.   
144e0 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66   ** the value of
144f0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 74 6f 20 61   pNew->nOut to a
14500 63 63 6f 75 6e 74 20 66 6f 72 20 70 54 65 72 6d  ccount for pTerm
14510 20 28 62 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e 49   (but not nIn/nI
14520 6e 4d 75 6c 29 2e 20 20 2a 2f 0a 20 20 20 20 61  nMul).  */.    a
14530 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75  ssert( pNew->nOu
14540 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b  t==saved_nOut );
14550 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77  .    if( pNew->w
14560 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
14570 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20  OLUMN_RANGE ){. 
14580 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e       /* Adjust n
14590 4f 75 74 20 75 73 69 6e 67 20 73 74 61 74 33 2f  Out using stat3/
145a0 73 74 61 74 34 20 64 61 74 61 2e 20 4f 72 2c 20  stat4 data. Or, 
145b0 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  if there is no s
145c0 74 61 74 33 2f 73 74 61 74 34 0a 20 20 20 20 20  tat3/stat4.     
145d0 20 2a 2a 20 64 61 74 61 2c 20 75 73 69 6e 67 20   ** data, using 
145e0 73 6f 6d 65 20 6f 74 68 65 72 20 65 73 74 69 6d  some other estim
145f0 61 74 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 77  ate.  */.      w
14600 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74  hereRangeScanEst
14610 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65  (pParse, pBuilde
14620 72 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 70  r, pBtm, pTop, p
14630 4e 65 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  New);.    }else{
14640 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d  .      int nEq =
14650 20 2b 2b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65   ++pNew->u.btree
14660 2e 6e 45 71 3b 0a 20 20 20 20 20 20 61 73 73 65  .nEq;.      asse
14670 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 49 53  rt( eOp & (WO_IS
14680 4e 55 4c 4c 7c 57 4f 5f 45 51 7c 57 4f 5f 49 4e  NULL|WO_EQ|WO_IN
14690 7c 57 4f 5f 49 53 29 20 29 3b 0a 0a 20 20 20 20  |WO_IS) );..    
146a0 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
146b0 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74  nOut==saved_nOut
146c0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   );.      if( pT
146d0 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d  erm->truthProb<=
146e0 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69 43  0 && pProbe->aiC
146f0 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f 6e 45 71 5d  olumn[saved_nEq]
14700 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  >=0 ){.        a
14710 73 73 65 72 74 28 20 28 65 4f 70 20 26 20 57 4f  ssert( (eOp & WO
14720 5f 49 4e 29 20 7c 7c 20 6e 49 6e 3d 3d 30 20 29  _IN) || nIn==0 )
14730 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
14740 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20  se( eOp & WO_IN 
14750 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
14760 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e  >nOut += pTerm->
14770 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 20  truthProb;.     
14780 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d     pNew->nOut -=
14790 20 6e 49 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73   nIn;.      }els
147a0 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e{.#ifdef SQLITE
147b0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
147c0 5f 53 54 41 54 34 0a 20 20 20 20 20 20 20 20 74  _STAT4.        t
147d0 52 6f 77 63 6e 74 20 6e 4f 75 74 20 3d 20 30 3b  Rowcnt nOut = 0;
147e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 49 6e  .        if( nIn
147f0 4d 75 6c 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  Mul==0 .        
14800 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e 53 61 6d   && pProbe->nSam
14810 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20 26 26  ple .         &&
14820 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
14830 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 53 61 6d  Eq<=pProbe->nSam
14840 70 6c 65 43 6f 6c 0a 20 20 20 20 20 20 20 20 20  pleCol.         
14850 26 26 20 28 28 65 4f 70 20 26 20 57 4f 5f 49 4e  && ((eOp & WO_IN
14860 29 3d 3d 30 20 7c 7c 20 21 45 78 70 72 48 61 73  )==0 || !ExprHas
14870 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
14880 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
14890 65 63 74 29 29 0a 20 20 20 20 20 20 20 20 29 7b  ect)).        ){
148a0 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
148b0 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
148c0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
148d0 20 69 66 28 20 28 65 4f 70 20 26 20 28 57 4f 5f   if( (eOp & (WO_
148e0 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f  EQ|WO_ISNULL|WO_
148f0 49 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  IS))!=0 ){.     
14900 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
14910 20 65 4f 70 20 26 20 57 4f 5f 45 51 20 29 3b 0a   eOp & WO_EQ );.
14920 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
14930 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49  case( eOp & WO_I
14940 53 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  S );.           
14950 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
14960 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
14970 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
14980 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
14990 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65  (pParse, pBuilde
149a0 72 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r, pExpr->pRight
149b0 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  , &nOut);.      
149c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
149d0 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
149e0 65 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72 73  eInScanEst(pPars
149f0 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78  e, pBuilder, pEx
14a00 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f  pr->x.pList, &nO
14a10 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ut);.          }
14a20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
14a30 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  c==SQLITE_NOTFOU
14a40 4e 44 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  ND ) rc = SQLITE
14a50 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69  _OK;.          i
14a60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14a70 20 29 20 62 72 65 61 6b 3b 20 20 20 20 20 20 20   ) break;       
14a80 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 75 74 20 6f     /* Jump out o
14a90 66 20 74 68 65 20 70 54 65 72 6d 20 6c 6f 6f 70  f the pTerm loop
14aa0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
14ab0 28 20 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20  ( nOut ){.      
14ac0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
14ad0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
14ae0 28 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  (nOut);.        
14af0 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6e 4f      if( pNew->nO
14b00 75 74 3e 73 61 76 65 64 5f 6e 4f 75 74 20 29 20  ut>saved_nOut ) 
14b10 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
14b20 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20  ed_nOut;.       
14b30 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
14b40 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20 20 20  -= nIn;.        
14b50 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
14b60 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74 3d 3d        if( nOut==
14b70 30 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  0 ).#endif.     
14b80 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70     {.          p
14b90 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 28 70 50  New->nOut += (pP
14ba0 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  robe->aiRowLogEs
14bb0 74 5b 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d  t[nEq] - pProbe-
14bc0 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71  >aiRowLogEst[nEq
14bd0 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1]);.          
14be0 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e  if( eOp & WO_ISN
14bf0 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ULL ){.         
14c00 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66     /* TUNING: If
14c10 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6b   there is no lik
14c20 65 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75 65 2c  elihood() value,
14c30 20 61 73 73 75 6d 65 20 74 68 61 74 20 61 20 0a   assume that a .
14c40 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 22              ** "
14c50 63 6f 6c 20 49 53 20 4e 55 4c 4c 22 20 65 78 70  col IS NULL" exp
14c60 72 65 73 73 69 6f 6e 20 6d 61 74 63 68 65 73 20  ression matches 
14c70 74 77 69 63 65 20 61 73 20 6d 61 6e 79 20 72 6f  twice as many ro
14c80 77 73 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ws .            
14c90 2a 2a 20 61 73 20 28 63 6f 6c 3d 3f 29 2e 20 2a  ** as (col=?). *
14ca0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e  /.            pN
14cb0 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 31 30 3b 0a  ew->nOut += 10;.
14cc0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
14cd0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
14ce0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
14cf0 72 43 6f 73 74 49 64 78 20 74 6f 20 74 68 65 20  rCostIdx to the 
14d00 63 6f 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67  cost of visiting
14d10 20 73 65 6c 65 63 74 65 64 20 72 6f 77 73 20 69   selected rows i
14d20 6e 20 69 6e 64 65 78 2e 20 41 64 64 0a 20 20 20  n index. Add.   
14d30 20 2a 2a 20 69 74 20 74 6f 20 70 4e 65 77 2d 3e   ** it to pNew->
14d40 72 52 75 6e 2c 20 77 68 69 63 68 20 69 73 20 63  rRun, which is c
14d50 75 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20  urrently set to 
14d60 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20  the cost of the 
14d70 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 73 65 65  index.    ** see
14d80 6b 20 6f 6e 6c 79 2e 20 54 68 65 6e 2c 20 69 66  k only. Then, if
14d90 20 74 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63   this is a non-c
14da0 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 61  overing index, a
14db0 64 64 20 74 68 65 20 63 6f 73 74 20 6f 66 0a 20  dd the cost of. 
14dc0 20 20 20 2a 2a 20 76 69 73 69 74 69 6e 67 20 74     ** visiting t
14dd0 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d  he rows in the m
14de0 61 69 6e 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20  ain table.  */. 
14df0 20 20 20 72 43 6f 73 74 49 64 78 20 3d 20 70 4e     rCostIdx = pN
14e00 65 77 2d 3e 6e 4f 75 74 20 2b 20 31 20 2b 20 28  ew->nOut + 1 + (
14e10 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78  15*pProbe->szIdx
14e20 52 6f 77 29 2f 70 53 72 63 2d 3e 70 54 61 62 2d  Row)/pSrc->pTab-
14e30 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 70  >szTabRow;.    p
14e40 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69  New->rRun = sqli
14e50 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f  te3LogEstAdd(rLo
14e60 67 53 69 7a 65 2c 20 72 43 6f 73 74 49 64 78 29  gSize, rCostIdx)
14e70 3b 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d  ;.    if( (pNew-
14e80 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
14e90 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45  E_IDX_ONLY|WHERE
14ea0 5f 49 50 4b 29 29 3d 3d 30 20 29 7b 0a 20 20 20  _IPK))==0 ){.   
14eb0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
14ec0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
14ed0 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65  (pNew->rRun, pNe
14ee0 77 2d 3e 6e 4f 75 74 20 2b 20 31 36 29 3b 0a 20  w->nOut + 16);. 
14ef0 20 20 20 7d 0a 20 20 20 20 41 70 70 6c 79 43 6f     }.    ApplyCo
14f00 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65  stMultiplier(pNe
14f10 77 2d 3e 72 52 75 6e 2c 20 70 50 72 6f 62 65 2d  w->rRun, pProbe-
14f20 3e 70 54 61 62 6c 65 2d 3e 63 6f 73 74 4d 75 6c  >pTable->costMul
14f30 74 29 3b 0a 0a 20 20 20 20 6e 4f 75 74 55 6e 61  t);..    nOutUna
14f40 64 6a 75 73 74 65 64 20 3d 20 70 4e 65 77 2d 3e  djusted = pNew->
14f50 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  nOut;.    pNew->
14f60 72 52 75 6e 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b  rRun += nInMul +
14f70 20 6e 49 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   nIn;.    pNew->
14f80 6e 4f 75 74 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b  nOut += nInMul +
14f90 20 6e 49 6e 3b 0a 20 20 20 20 77 68 65 72 65 4c   nIn;.    whereL
14fa0 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
14fb0 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70  pBuilder->pWC, p
14fc0 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20  New, rSize);.   
14fd0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
14fe0 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
14ff0 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28 20  pNew);..    if( 
15000 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
15010 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
15020 47 45 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  GE ){.      pNew
15030 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
15040 4f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Out;.    }else{.
15050 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
15060 20 3d 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65   = nOutUnadjuste
15070 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  d;.    }..    if
15080 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
15090 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
150a0 49 54 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70  IT)==0.     && p
150b0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
150c0 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  <pProbe->nColumn
150d0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 77 68  .    ){.      wh
150e0 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49  ereLoopAddBtreeI
150f0 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70  ndex(pBuilder, p
15100 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e  Src, pProbe, nIn
15110 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a  Mul+nIn);.    }.
15120 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
15130 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 23 69 66   saved_nOut;.#if
15140 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
15150 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
15160 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e  .    pBuilder->n
15170 52 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56  RecValid = nRecV
15180 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  alid;.#endif.  }
15190 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20  .  pNew->prereq 
151a0 3d 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 0a  = saved_prereq;.
151b0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
151c0 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b  nEq = saved_nEq;
151d0 0a 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d  .  pNew->nSkip =
151e0 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20   saved_nSkip;.  
151f0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
15200 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20  saved_wsFlags;. 
15210 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61   pNew->nOut = sa
15220 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77  ved_nOut;.  pNew
15230 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64  ->nLTerm = saved
15240 5f 6e 4c 54 65 72 6d 3b 0a 0a 20 20 2f 2a 20 43  _nLTerm;..  /* C
15250 6f 6e 73 69 64 65 72 20 75 73 69 6e 67 20 61 20  onsider using a 
15260 73 6b 69 70 2d 73 63 61 6e 20 69 66 20 74 68 65  skip-scan if the
15270 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20  re are no WHERE 
15280 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
15290 74 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c  ts.  ** availabl
152a0 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 2d 6d  e for the left-m
152b0 6f 73 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65  ost terms of the
152c0 20 69 6e 64 65 78 2c 20 61 6e 64 20 69 66 20 74   index, and if t
152d0 68 65 20 61 76 65 72 61 67 65 0a 20 20 2a 2a 20  he average.  ** 
152e0 6e 75 6d 62 65 72 20 6f 66 20 72 65 70 65 61 74  number of repeat
152f0 73 20 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f  s in the left-mo
15300 73 74 20 74 65 72 6d 73 20 69 73 20 61 74 20 6c  st terms is at l
15310 65 61 73 74 20 31 38 2e 20 0a 20 20 2a 2a 0a 20  east 18. .  **. 
15320 20 2a 2a 20 54 68 65 20 6d 61 67 69 63 20 6e 75   ** The magic nu
15330 6d 62 65 72 20 31 38 20 69 73 20 73 65 6c 65 63  mber 18 is selec
15340 74 65 64 20 6f 6e 20 74 68 65 20 62 61 73 69 73  ted on the basis
15350 20 74 68 61 74 20 73 63 61 6e 6e 69 6e 67 20 31   that scanning 1
15360 37 20 72 6f 77 73 0a 20 20 2a 2a 20 69 73 20 61  7 rows.  ** is a
15370 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 71 75 69  lmost always qui
15380 63 6b 65 72 20 74 68 61 6e 20 61 6e 20 69 6e 64  cker than an ind
15390 65 78 20 73 65 65 6b 20 28 65 76 65 6e 20 74 68  ex seek (even th
153a0 6f 75 67 68 20 69 66 20 74 68 65 20 69 6e 64 65  ough if the inde
153b0 78 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  x.  ** contains 
153c0 66 65 77 65 72 20 74 68 61 6e 20 32 5e 31 37 20  fewer than 2^17 
153d0 72 6f 77 73 20 77 65 20 61 73 73 75 6d 65 20 6f  rows we assume o
153e0 74 68 65 72 77 69 73 65 20 69 6e 20 6f 74 68 65  therwise in othe
153f0 72 20 70 61 72 74 73 20 6f 66 0a 20 20 2a 2a 20  r parts of.  ** 
15400 74 68 65 20 63 6f 64 65 29 2e 20 41 6e 64 2c 20  the code). And, 
15410 65 76 65 6e 20 69 66 20 69 74 20 69 73 20 6e 6f  even if it is no
15420 74 2c 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74  t, it should not
15430 20 62 65 20 74 6f 6f 20 6d 75 63 68 20 73 6c 6f   be too much slo
15440 77 65 72 2e 20 0a 20 20 2a 2a 20 4f 6e 20 74 68  wer. .  ** On th
15450 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68  e other hand, th
15460 65 20 65 78 74 72 61 20 73 65 65 6b 73 20 63 6f  e extra seeks co
15470 75 6c 64 20 65 6e 64 20 75 70 20 62 65 69 6e 67  uld end up being
15480 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20   significantly. 
15490 20 2a 2a 20 6d 6f 72 65 20 65 78 70 65 6e 73 69   ** more expensi
154a0 76 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ve.  */.  assert
154b0 28 20 34 32 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 42==sqlite3Log
154c0 45 73 74 28 31 38 29 20 29 3b 0a 20 20 69 66 28  Est(18) );.  if(
154d0 20 73 61 76 65 64 5f 6e 45 71 3d 3d 73 61 76 65   saved_nEq==save
154e0 64 5f 6e 53 6b 69 70 0a 20 20 20 26 26 20 73 61  d_nSkip.   && sa
154f0 76 65 64 5f 6e 45 71 2b 31 3c 70 50 72 6f 62 65  ved_nEq+1<pProbe
15500 2d 3e 6e 4b 65 79 43 6f 6c 0a 20 20 20 26 26 20  ->nKeyCol.   && 
15510 70 50 72 6f 62 65 2d 3e 6e 6f 53 6b 69 70 53 63  pProbe->noSkipSc
15520 61 6e 3d 3d 30 0a 20 20 20 26 26 20 70 50 72 6f  an==0.   && pPro
15530 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
15540 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3e 3d 34 32  saved_nEq+1]>=42
15550 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 69 6e    /* TUNING: Min
15560 69 6d 75 6d 20 66 6f 72 20 73 6b 69 70 2d 73 63  imum for skip-sc
15570 61 6e 20 2a 2f 0a 20 20 20 26 26 20 28 72 63 20  an */.   && (rc 
15580 3d 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  = whereLoopResiz
15590 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77  e(db, pNew, pNew
155a0 2d 3e 6e 4c 54 65 72 6d 2b 31 29 29 3d 3d 53 51  ->nLTerm+1))==SQ
155b0 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20  LITE_OK.  ){.   
155c0 20 4c 6f 67 45 73 74 20 6e 49 74 65 72 3b 0a 20   LogEst nIter;. 
155d0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
155e0 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 70 4e 65 77  .nEq++;.    pNew
155f0 2d 3e 6e 53 6b 69 70 2b 2b 3b 0a 20 20 20 20 70  ->nSkip++;.    p
15600 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77  New->aLTerm[pNew
15610 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 30 3b  ->nLTerm++] = 0;
15620 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  .    pNew->wsFla
15630 67 73 20 7c 3d 20 57 48 45 52 45 5f 53 4b 49 50  gs |= WHERE_SKIP
15640 53 43 41 4e 3b 0a 20 20 20 20 6e 49 74 65 72 20  SCAN;.    nIter 
15650 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c  = pProbe->aiRowL
15660 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 5d  ogEst[saved_nEq]
15670 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   - pProbe->aiRow
15680 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71  LogEst[saved_nEq
15690 2b 31 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  +1];.    pNew->n
156a0 4f 75 74 20 2d 3d 20 6e 49 74 65 72 3b 0a 20 20  Out -= nIter;.  
156b0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 42 65    /* TUNING:  Be
156c0 63 61 75 73 65 20 75 6e 63 65 72 74 61 69 6e 74  cause uncertaint
156d0 69 65 73 20 69 6e 20 74 68 65 20 65 73 74 69 6d  ies in the estim
156e0 61 74 65 73 20 66 6f 72 20 73 6b 69 70 2d 73 63  ates for skip-sc
156f0 61 6e 20 71 75 65 72 69 65 73 2c 0a 20 20 20 20  an queries,.    
15700 2a 2a 20 61 64 64 20 61 20 31 2e 33 37 35 20 66  ** add a 1.375 f
15710 75 64 67 65 20 66 61 63 74 6f 72 20 74 6f 20 6d  udge factor to m
15720 61 6b 65 20 73 6b 69 70 2d 73 63 61 6e 20 73 6c  ake skip-scan sl
15730 69 67 68 74 6c 79 20 6c 65 73 73 20 6c 69 6b 65  ightly less like
15740 6c 79 2e 20 2a 2f 0a 20 20 20 20 6e 49 74 65 72  ly. */.    nIter
15750 20 2b 3d 20 35 3b 0a 20 20 20 20 77 68 65 72 65   += 5;.    where
15760 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
15770 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63  x(pBuilder, pSrc
15780 2c 20 70 50 72 6f 62 65 2c 20 6e 49 74 65 72 20  , pProbe, nIter 
15790 2b 20 6e 49 6e 4d 75 6c 29 3b 0a 20 20 20 20 70  + nInMul);.    p
157a0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65  New->nOut = save
157b0 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77  d_nOut;.    pNew
157c0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
157d0 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70  saved_nEq;.    p
157e0 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76  New->nSkip = sav
157f0 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 20 20 70 4e  ed_nSkip;.    pN
15800 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61  ew->wsFlags = sa
15810 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 7d  ved_wsFlags;.  }
15820 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
15830 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
15840 72 75 65 20 69 66 20 69 74 20 69 73 20 70 6f 73  rue if it is pos
15850 73 69 62 6c 65 20 74 68 61 74 20 70 49 6e 64 65  sible that pInde
15860 78 20 6d 69 67 68 74 20 62 65 20 75 73 65 66 75  x might be usefu
15870 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  l in.** implemen
15880 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ting the ORDER B
15890 59 20 63 6c 61 75 73 65 20 69 6e 20 70 42 75 69  Y clause in pBui
158a0 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lder..**.** Retu
158b0 72 6e 20 46 61 6c 73 65 20 69 66 20 70 42 75 69  rn False if pBui
158c0 6c 64 65 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f  lder does not co
158d0 6e 74 61 69 6e 20 61 6e 20 4f 52 44 45 52 20 42  ntain an ORDER B
158e0 59 20 63 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69  Y clause or.** i
158f0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61  f there is no wa
15900 79 20 66 6f 72 20 70 49 6e 64 65 78 20 74 6f 20  y for pIndex to 
15910 62 65 20 75 73 65 66 75 6c 20 69 6e 20 69 6d 70  be useful in imp
15920 6c 65 6d 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a  lementing that.*
15930 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  * ORDER BY claus
15940 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
15950 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57   indexMightHelpW
15960 69 74 68 4f 72 64 65 72 42 79 28 0a 20 20 57 68  ithOrderBy(.  Wh
15970 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
15980 70 42 75 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65  pBuilder,.  Inde
15990 78 20 2a 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74  x *pIndex,.  int
159a0 20 69 43 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78   iCursor.){.  Ex
159b0 70 72 4c 69 73 74 20 2a 70 4f 42 3b 0a 20 20 69  prList *pOB;.  i
159c0 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66  nt ii, jj;..  if
159d0 28 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64  ( pIndex->bUnord
159e0 65 72 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b  ered ) return 0;
159f0 0a 20 20 69 66 28 20 28 70 4f 42 20 3d 20 70 42  .  if( (pOB = pB
15a00 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e  uilder->pWInfo->
15a10 70 4f 72 64 65 72 42 79 29 3d 3d 30 20 29 20 72  pOrderBy)==0 ) r
15a20 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69  eturn 0;.  for(i
15a30 69 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45 78  i=0; ii<pOB->nEx
15a40 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 45  pr; ii++){.    E
15a50 78 70 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c  xpr *pExpr = sql
15a60 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
15a70 61 74 65 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70  ate(pOB->a[ii].p
15a80 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
15a90 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
15aa0 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  UMN ) return 0;.
15ab0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
15ac0 54 61 62 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29  Table==iCursor )
15ad0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
15ae0 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72  r->iColumn<0 ) r
15af0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 66  eturn 1;.      f
15b00 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64  or(jj=0; jj<pInd
15b10 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b  ex->nKeyCol; jj+
15b20 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
15b30 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  pExpr->iColumn==
15b40 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
15b50 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20 31 3b  [jj] ) return 1;
15b60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15b70 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
15b80 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
15b90 20 62 69 74 6d 61 73 6b 20 77 68 65 72 65 20 31   bitmask where 1
15ba0 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  s indicate that 
15bb0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
15bc0 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74  g column of.** t
15bd0 68 65 20 74 61 62 6c 65 20 69 73 20 75 73 65 64  he table is used
15be0 20 62 79 20 61 6e 20 69 6e 64 65 78 2e 20 20 4f   by an index.  O
15bf0 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 36 33  nly the first 63
15c00 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f 6e   columns are con
15c10 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  sidered..*/.stat
15c20 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c 75 6d  ic Bitmask colum
15c30 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64 65 78 20  nsInIndex(Index 
15c40 2a 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73  *pIdx){.  Bitmas
15c50 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  k m = 0;.  int j
15c60 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e  ;.  for(j=pIdx->
15c70 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b  nColumn-1; j>=0;
15c80 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78   j--){.    int x
15c90 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
15ca0 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 78 3e  n[j];.    if( x>
15cb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  =0 ){.      test
15cc0 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29  case( x==BMS-1 )
15cd0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
15ce0 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20  ( x==BMS-2 );.  
15cf0 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20      if( x<BMS-1 
15d00 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78  ) m |= MASKBIT(x
15d10 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
15d20 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43  eturn m;.}../* C
15d30 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
15d40 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 77   partial index w
15d50 69 74 68 20 70 50 61 72 74 49 6e 64 65 78 57 68  ith pPartIndexWh
15d60 65 72 65 20 63 61 6e 20 62 65 20 75 73 65 64 0a  ere can be used.
15d70 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ** in the curren
15d80 74 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e  t query.  Return
15d90 20 74 72 75 65 20 69 66 20 69 74 20 63 61 6e 20   true if it can 
15da0 62 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  be and false if 
15db0 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  not..*/.static i
15dc0 6e 74 20 77 68 65 72 65 55 73 61 62 6c 65 50 61  nt whereUsablePa
15dd0 72 74 69 61 6c 49 6e 64 65 78 28 69 6e 74 20 69  rtialIndex(int i
15de0 54 61 62 2c 20 57 68 65 72 65 43 6c 61 75 73 65  Tab, WhereClause
15df0 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 57 68   *pWC, Expr *pWh
15e00 65 72 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ere){.  int i;. 
15e10 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
15e20 6d 3b 0a 20 20 77 68 69 6c 65 28 20 70 57 68 65  m;.  while( pWhe
15e30 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  re->op==TK_AND )
15e40 7b 0a 20 20 20 20 69 66 28 20 21 77 68 65 72 65  {.    if( !where
15e50 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64  UsablePartialInd
15e60 65 78 28 69 54 61 62 2c 70 57 43 2c 70 57 68 65  ex(iTab,pWC,pWhe
15e70 72 65 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74  re->pLeft) ) ret
15e80 75 72 6e 20 30 3b 0a 20 20 20 20 70 57 68 65 72  urn 0;.    pWher
15e90 65 20 3d 20 70 57 68 65 72 65 2d 3e 70 52 69 67  e = pWhere->pRig
15ea0 68 74 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  ht;.  }.  for(i=
15eb0 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  0, pTerm=pWC->a;
15ec0 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
15ed0 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
15ee0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
15ef0 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
15f00 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
15f10 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45 78  rImpliesExpr(pEx
15f20 70 72 2c 20 70 57 68 65 72 65 2c 20 69 54 61 62  pr, pWhere, iTab
15f30 29 20 0a 20 20 20 20 20 26 26 20 28 21 45 78 70  ) .     && (!Exp
15f40 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
15f50 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
15f60 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69 67 68   || pExpr->iRigh
15f70 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69 54 61 62  tJoinTable==iTab
15f80 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
15f90 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
15fa0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
15fb0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20  ../*.** Add all 
15fc0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
15fd0 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74  s for a single t
15fe0 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e  able of the join
15ff0 20 77 68 65 72 65 20 74 68 65 20 74 61 62 6c 65   where the table
16000 0a 2a 2a 20 69 73 20 69 64 65 6e 66 69 65 64 20  .** is idenfied 
16010 62 79 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  by pBuilder->pNe
16020 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74  w->iTab.  That t
16030 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65  able is guarante
16040 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 62 2d  ed to be.** a b-
16050 74 72 65 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20  tree table, not 
16060 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
16070 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 73 74 73  .**.** The costs
16080 20 28 57 68 65 72 65 4c 6f 6f 70 2e 72 52 75 6e   (WhereLoop.rRun
16090 29 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20  ) of the b-tree 
160a0 6c 6f 6f 70 73 20 61 64 64 65 64 20 62 79 20 74  loops added by t
160b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
160c0 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64 20 61  are calculated a
160d0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
160e0 20 46 6f 72 20 61 20 66 75 6c 6c 20 73 63 61 6e   For a full scan
160f0 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 65 20 74  , assuming the t
16100 61 62 6c 65 20 28 6f 72 20 69 6e 64 65 78 29 20  able (or index) 
16110 63 6f 6e 74 61 69 6e 73 20 6e 52 6f 77 20 72 6f  contains nRow ro
16120 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f  ws:.**.**     co
16130 73 74 20 3d 20 6e 52 6f 77 20 2a 20 33 2e 30 20  st = nRow * 3.0 
16140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16150 20 20 20 2f 2f 20 66 75 6c 6c 2d 74 61 62 6c 65     // full-table
16160 20 73 63 61 6e 0a 2a 2a 20 20 20 20 20 63 6f 73   scan.**     cos
16170 74 20 3d 20 6e 52 6f 77 20 2a 20 4b 20 20 20 20  t = nRow * K    
16180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16190 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20 63 6f 76    // scan of cov
161a0 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20  ering index.**  
161b0 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a     cost = nRow *
161c0 20 28 4b 2b 33 2e 30 29 20 20 20 20 20 20 20 20   (K+3.0)        
161d0 20 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20          // scan 
161e0 6f 66 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20  of non-covering 
161f0 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 77 68 65 72  index.**.** wher
16200 65 20 4b 20 69 73 20 61 20 76 61 6c 75 65 20 62  e K is a value b
16210 65 74 77 65 65 6e 20 31 2e 31 20 61 6e 64 20 33  etween 1.1 and 3
16220 2e 30 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20  .0 set based on 
16230 74 68 65 20 72 65 6c 61 74 69 76 65 20 0a 2a 2a  the relative .**
16240 20 65 73 74 69 6d 61 74 65 64 20 61 76 65 72 61   estimated avera
16250 67 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69  ge size of the i
16260 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 72  ndex and table r
16270 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  ecords..**.** Fo
16280 72 20 61 6e 20 69 6e 64 65 78 20 73 63 61 6e 2c  r an index scan,
16290 20 77 68 65 72 65 20 6e 56 69 73 69 74 20 69 73   where nVisit is
162a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69   the number of i
162b0 6e 64 65 78 20 72 6f 77 73 20 76 69 73 69 74 65  ndex rows visite
162c0 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 63 61 6e  d.** by the scan
162d0 2c 20 61 6e 64 20 6e 53 65 65 6b 20 69 73 20 74  , and nSeek is t
162e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 65  he number of see
162f0 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20 72 65 71  k operations req
16300 75 69 72 65 64 20 6f 6e 20 0a 2a 2a 20 74 68 65  uired on .** the
16310 20 69 6e 64 65 78 20 62 2d 74 72 65 65 3a 0a 2a   index b-tree:.*
16320 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20  *.**     cost = 
16330 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f  nSeek * (log(nRo
16340 77 29 20 2b 20 4b 20 2a 20 6e 56 69 73 69 74 29  w) + K * nVisit)
16350 20 20 20 20 20 20 20 20 20 20 2f 2f 20 63 6f 76            // cov
16360 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20  ering index.**  
16370 20 20 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20     cost = nSeek 
16380 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 28  * (log(nRow) + (
16390 4b 2b 33 2e 30 29 20 2a 20 6e 56 69 73 69 74 29  K+3.0) * nVisit)
163a0 20 20 20 20 2f 2f 20 6e 6f 6e 2d 63 6f 76 65 72      // non-cover
163b0 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20  ing index.**.** 
163c0 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 53 65 65 6b 20  Normally, nSeek 
163d0 69 73 20 31 2e 20 6e 53 65 65 6b 20 76 61 6c 75  is 1. nSeek valu
163e0 65 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  es greater than 
163f0 31 20 63 6f 6d 65 20 61 62 6f 75 74 20 69 66 20  1 come about if 
16400 74 68 65 20 0a 2a 2a 20 57 48 45 52 45 20 63 6c  the .** WHERE cl
16410 61 75 73 65 20 69 6e 63 6c 75 64 65 73 20 22 78  ause includes "x
16420 20 49 4e 20 28 2e 2e 2e 2e 29 22 20 74 65 72 6d   IN (....)" term
16430 73 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20  s used in place 
16440 6f 66 20 22 78 3d 3f 22 2e 20 4f 72 20 77 68 65  of "x=?". Or whe
16450 6e 20 0a 2a 2a 20 69 6d 70 6c 69 63 69 74 20 22  n .** implicit "
16460 78 20 49 4e 20 28 53 45 4c 45 43 54 20 78 20 46  x IN (SELECT x F
16470 52 4f 4d 20 74 62 6c 29 22 20 74 65 72 6d 73 20  ROM tbl)" terms 
16480 61 72 65 20 61 64 64 65 64 20 66 6f 72 20 73 6b  are added for sk
16490 69 70 2d 73 63 61 6e 73 2e 0a 2a 2a 0a 2a 2a 20  ip-scans..**.** 
164a0 54 68 65 20 65 73 74 69 6d 61 74 65 64 20 76 61  The estimated va
164b0 6c 75 65 73 20 28 6e 52 6f 77 2c 20 6e 56 69 73  lues (nRow, nVis
164c0 69 74 2c 20 6e 53 65 65 6b 29 20 6f 66 74 65 6e  it, nSeek) often
164d0 20 63 6f 6e 74 61 69 6e 20 61 20 6c 61 72 67 65   contain a large
164e0 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 75 6e   amount.** of un
164f0 63 65 72 74 61 69 6e 74 79 2e 20 20 46 6f 72 20  certainty.  For 
16500 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 73 63 6f  this reason, sco
16510 72 69 6e 67 20 69 73 20 64 65 73 69 67 6e 65 64  ring is designed
16520 20 74 6f 20 70 69 63 6b 20 70 6c 61 6e 73 20 74   to pick plans t
16530 68 61 74 0a 2a 2a 20 22 64 6f 20 74 68 65 20 6c  hat.** "do the l
16540 65 61 73 74 20 68 61 72 6d 22 20 69 66 20 74 68  east harm" if th
16550 65 20 65 73 74 69 6d 61 74 65 73 20 61 72 65 20  e estimates are 
16560 69 6e 61 63 63 75 72 61 74 65 2e 20 20 46 6f 72  inaccurate.  For
16570 20 65 78 61 6d 70 6c 65 2c 20 61 0a 2a 2a 20 6c   example, a.** l
16580 6f 67 28 6e 52 6f 77 29 20 66 61 63 74 6f 72 20  og(nRow) factor 
16590 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20  is omitted from 
165a0 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69  a non-covering i
165b0 6e 64 65 78 20 73 63 61 6e 20 69 6e 20 6f 72 64  ndex scan in ord
165c0 65 72 20 74 6f 0a 2a 2a 20 62 69 61 73 20 74 68  er to.** bias th
165d0 65 20 73 63 6f 72 69 6e 67 20 69 6e 20 66 61 76  e scoring in fav
165e0 6f 72 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69  or of using an i
165f0 6e 64 65 78 2c 20 73 69 6e 63 65 20 74 68 65 20  ndex, since the 
16600 77 6f 72 73 74 2d 63 61 73 65 0a 2a 2a 20 70 65  worst-case.** pe
16610 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 75 73 69  rformance of usi
16620 6e 67 20 61 6e 20 69 6e 64 65 78 20 69 73 20 66  ng an index is f
16630 61 72 20 62 65 74 74 65 72 20 74 68 61 6e 20 74  ar better than t
16640 68 65 20 77 6f 72 73 74 2d 63 61 73 65 20 70 65  he worst-case pe
16650 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 6f 66 20  rformance.** of 
16660 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  a full table sca
16670 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
16680 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
16690 65 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  ee(.  WhereLoopB
166a0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
166b0 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73  , /* WHERE claus
166c0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
166d0 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72  .  Bitmask mExtr
166e0 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  a              /
166f0 2a 20 45 78 74 72 61 20 70 72 65 72 65 71 75 65  * Extra prereque
16700 73 69 74 65 73 20 66 6f 72 20 75 73 69 6e 67 20  sites for using 
16710 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  this table */.){
16720 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
16730 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f  Info;          /
16740 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73  * WHERE analysis
16750 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e   context */.  In
16760 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20  dex *pProbe;    
16770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
16780 69 6e 64 65 78 20 77 65 20 61 72 65 20 65 76 61  index we are eva
16790 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64  luating */.  Ind
167a0 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20  ex sPk;         
167b0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61           /* A fa
167c0 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20  ke index object 
167d0 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20  for the primary 
167e0 6b 65 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  key */.  LogEst 
167f0 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20  aiRowEstPk[2];  
16800 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f       /* The aiRo
16810 77 4c 6f 67 45 73 74 5b 5d 20 76 61 6c 75 65 20  wLogEst[] value 
16820 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65  for the sPk inde
16830 78 20 2a 2f 0a 20 20 69 31 36 20 61 69 43 6f 6c  x */.  i16 aiCol
16840 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20  umnPk = -1;     
16850 20 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d     /* The aColum
16860 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68  n[] value for th
16870 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20  e sPk index */. 
16880 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
16890 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  st;          /* 
168a0 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
168b0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
168c0 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20  ist_item *pSrc; 
168d0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
168e0 75 73 65 20 62 74 72 65 65 20 74 65 72 6d 20 74  use btree term t
168f0 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68 65 72 65  o add */.  Where
16900 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20  Loop *pNew;     
16910 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61         /* Templa
16920 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  te WhereLoop obj
16930 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ect */.  int rc 
16940 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
16950 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
16960 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f  ode */.  int iSo
16970 72 74 49 64 78 20 3d 20 31 3b 20 20 20 20 20 20  rtIdx = 1;      
16980 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75       /* Index nu
16990 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b  mber */.  int b;
169a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169b0 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65        /* A boole
169c0 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4c 6f  an value */.  Lo
169d0 67 45 73 74 20 72 53 69 7a 65 3b 20 20 20 20 20  gEst rSize;     
169e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d            /* num
169f0 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
16a00 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f  he table */.  Lo
16a10 67 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20  gEst rLogSize;  
16a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67            /* Log
16a30 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20 6e 75  arithm of the nu
16a40 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
16a50 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57  the table */.  W
16a60 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
16a70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
16a80 65 20 70 61 72 73 65 64 20 57 48 45 52 45 20 63  e parsed WHERE c
16a90 6c 61 75 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65  lause */.  Table
16aa0 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
16ab0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
16ac0 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f  being queried */
16ad0 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 70 42 75  .  .  pNew = pBu
16ae0 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70  ilder->pNew;.  p
16af0 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
16b00 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 54 61 62  ->pWInfo;.  pTab
16b10 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  List = pWInfo->p
16b20 54 61 62 4c 69 73 74 3b 0a 20 20 70 53 72 63 20  TabList;.  pSrc 
16b30 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20  = pTabList->a + 
16b40 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 70 54  pNew->iTab;.  pT
16b50 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b  ab = pSrc->pTab;
16b60 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65  .  pWC = pBuilde
16b70 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73 65 72 74  r->pWC;.  assert
16b80 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 53 72  ( !IsVirtual(pSr
16b90 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a 20 20 69  c->pTab) );..  i
16ba0 66 28 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65  f( pSrc->pIBInde
16bb0 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49  x ){.    /* An I
16bc0 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
16bd0 20 73 70 65 63 69 66 69 65 73 20 61 20 70 61 72   specifies a par
16be0 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 74 6f  ticular index to
16bf0 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 50 72 6f   use */.    pPro
16c00 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 42 49 6e  be = pSrc->pIBIn
16c10 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  dex;.  }else if(
16c20 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
16c30 20 29 7b 0a 20 20 20 20 70 50 72 6f 62 65 20 3d   ){.    pProbe =
16c40 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
16c50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
16c60 68 65 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58  here is no INDEX
16c70 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43  ED BY clause.  C
16c80 72 65 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64  reate a fake Ind
16c90 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63  ex object in loc
16ca0 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  al.    ** variab
16cb0 6c 65 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73  le sPk to repres
16cc0 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20 70 72  ent the rowid pr
16cd0 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e  imary key index.
16ce0 20 20 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20    Make this.    
16cf0 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68  ** fake index th
16d00 65 20 66 69 72 73 74 20 69 6e 20 61 20 63 68 61  e first in a cha
16d10 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65  in of Index obje
16d20 63 74 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20  cts with all of 
16d30 74 68 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20  the real.    ** 
16d40 69 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f  indices to follo
16d50 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  w */.    Index *
16d60 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  pFirst;         
16d70 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
16d80 74 20 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65  t of real indice
16d90 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s on the table *
16da0 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50  /.    memset(&sP
16db0 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64  k, 0, sizeof(Ind
16dc0 65 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 4b  ex));.    sPk.nK
16dd0 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 73  eyCol = 1;.    s
16de0 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a  Pk.nColumn = 1;.
16df0 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e      sPk.aiColumn
16e00 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a   = &aiColumnPk;.
16e10 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 4c 6f 67      sPk.aiRowLog
16e20 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b  Est = aiRowEstPk
16e30 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f  ;.    sPk.onErro
16e40 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a  r = OE_Replace;.
16e50 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d      sPk.pTable =
16e60 20 70 54 61 62 3b 0a 20 20 20 20 73 50 6b 2e 73   pTab;.    sPk.s
16e70 7a 49 64 78 52 6f 77 20 3d 20 70 54 61 62 2d 3e  zIdxRow = pTab->
16e80 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 61 69  szTabRow;.    ai
16e90 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 54  RowEstPk[0] = pT
16ea0 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a  ab->nRowLogEst;.
16eb0 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 31      aiRowEstPk[1
16ec0 5d 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 72 73  ] = 0;.    pFirs
16ed0 74 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e  t = pSrc->pTab->
16ee0 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  pIndex;.    if( 
16ef0 70 53 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65  pSrc->fg.notInde
16f00 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  xed==0 ){.      
16f10 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69  /* The real indi
16f20 63 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ces of the table
16f30 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64   are only consid
16f40 65 72 65 64 20 69 66 20 74 68 65 0a 20 20 20 20  ered if the.    
16f50 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44    ** NOT INDEXED
16f60 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d   qualifier is om
16f70 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46  itted from the F
16f80 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
16f90 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20      sPk.pNext = 
16fa0 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20  pFirst;.    }.  
16fb0 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b    pProbe = &sPk;
16fc0 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20 70  .  }.  rSize = p
16fd0 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b  Tab->nRowLogEst;
16fe0 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73  .  rLogSize = es
16ff0 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 23 69  tLog(rSize);..#i
17000 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17010 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
17020 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63  X.  /* Automatic
17030 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 66   indexes */.  if
17040 28 20 21 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  ( !pBuilder->pOr
17050 53 65 74 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20  Set      /* Not 
17060 70 61 72 74 20 6f 66 20 61 6e 20 4f 52 20 6f 70  part of an OR op
17070 74 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20  timization */.  
17080 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
17090 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
170a0 4e 4f 5f 41 55 54 4f 49 4e 44 45 58 29 3d 3d 30  NO_AUTOINDEX)==0
170b0 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e  .   && (pWInfo->
170c0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
170d0 73 20 26 20 53 51 4c 49 54 45 5f 41 75 74 6f 49  s & SQLITE_AutoI
170e0 6e 64 65 78 29 21 3d 30 0a 20 20 20 26 26 20 70  ndex)!=0.   && p
170f0 53 72 63 2d 3e 70 49 42 49 6e 64 65 78 3d 3d 30  Src->pIBIndex==0
17100 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
17110 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
17120 65 20 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63  e */.   && !pSrc
17130 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 20  ->fg.notIndexed 
17140 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4e 4f 54 20    /* Has no NOT 
17150 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 2a  INDEXED clause *
17160 2f 0a 20 20 20 26 26 20 48 61 73 52 6f 77 69 64  /.   && HasRowid
17170 28 70 54 61 62 29 20 20 20 20 20 20 20 20 20 2f  (pTab)         /
17180 2a 20 49 73 20 6e 6f 74 20 61 20 57 49 54 48 4f  * Is not a WITHO
17190 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20  UT ROWID table. 
171a0 28 46 49 58 4d 45 3a 20 57 68 79 20 6e 6f 74 3f  (FIXME: Why not?
171b0 29 20 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63  ) */.   && !pSrc
171c0 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61 74 65  ->fg.isCorrelate
171d0 64 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65  d /* Not a corre
171e0 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 20 2a  lated subquery *
171f0 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 66  /.   && !pSrc->f
17200 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 20 2f  g.isRecursive  /
17210 2a 20 4e 6f 74 20 61 20 72 65 63 75 72 73 69 76  * Not a recursiv
17220 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65  e common table e
17230 78 70 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20  xpression. */.  
17240 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ){.    /* Genera
17250 74 65 20 61 75 74 6f 2d 69 6e 64 65 78 20 57 68  te auto-index Wh
17260 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20  ereLoops */.    
17270 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
17280 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
17290 2a 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61  *pWCEnd = pWC->a
172a0 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20   + pWC->nTerm;. 
172b0 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43     for(pTerm=pWC
172c0 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ->a; rc==SQLITE_
172d0 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70 57 43 45  OK && pTerm<pWCE
172e0 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
172f0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
17300 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65  rereqRight & pNe
17310 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f  w->maskSelf ) co
17320 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
17330 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
17340 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
17350 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70   0) ){.        p
17360 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
17370 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e   = 1;.        pN
17380 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20  ew->nSkip = 0;. 
17390 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62         pNew->u.b
173a0 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
173b0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
173c0 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  LTerm = 1;.     
173d0 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
173e0 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
173f0 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f      /* TUNING: O
17400 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f 72  ne-time cost for
17410 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 20 61   computing the a
17420 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69  utomatic index i
17430 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 73 74  s.        ** est
17440 69 6d 61 74 65 64 20 74 6f 20 62 65 20 58 2a 4e  imated to be X*N
17450 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e  *log2(N) where N
17460 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
17470 66 20 72 6f 77 73 20 69 6e 0a 20 20 20 20 20 20  f rows in.      
17480 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62    ** the table b
17490 65 69 6e 67 20 69 6e 64 65 78 65 64 20 61 6e 64  eing indexed and
174a0 20 77 68 65 72 65 20 58 20 69 73 20 37 20 28 4c   where X is 7 (L
174b0 6f 67 45 73 74 3d 32 38 29 20 66 6f 72 20 6e 6f  ogEst=28) for no
174c0 72 6d 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rmal.        ** 
174d0 74 61 62 6c 65 73 20 6f 72 20 31 2e 33 37 35 20  tables or 1.375 
174e0 28 4c 6f 67 45 73 74 3d 34 29 20 66 6f 72 20 76  (LogEst=4) for v
174f0 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72  iews and subquer
17500 69 65 73 2e 20 20 54 68 65 20 76 61 6c 75 65 0a  ies.  The value.
17510 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 58 20          ** of X 
17520 69 73 20 73 6d 61 6c 6c 65 72 20 66 6f 72 20 76  is smaller for v
17530 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72  iews and subquer
17540 69 65 73 20 73 6f 20 74 68 61 74 20 74 68 65 20  ies so that the 
17550 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 0a 20 20  query planner.  
17560 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65        ** will be
17570 20 6d 6f 72 65 20 61 67 67 72 65 73 73 69 76 65   more aggressive
17580 20 61 62 6f 75 74 20 67 65 6e 65 72 61 74 69 6e   about generatin
17590 67 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  g automatic inde
175a0 78 65 73 20 66 6f 72 0a 20 20 20 20 20 20 20 20  xes for.        
175b0 2a 2a 20 74 68 6f 73 65 20 6f 62 6a 65 63 74 73  ** those objects
175c0 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  , since there is
175d0 20 6e 6f 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   no opportunity 
175e0 74 6f 20 61 64 64 20 73 63 68 65 6d 61 0a 20 20  to add schema.  
175f0 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 65 73        ** indexes
17600 20 6f 6e 20 73 75 62 71 75 65 72 69 65 73 20 61   on subqueries a
17610 6e 64 20 76 69 65 77 73 2e 20 2a 2f 0a 20 20 20  nd views. */.   
17620 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75       pNew->rSetu
17630 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72  p = rLogSize + r
17640 53 69 7a 65 20 2b 20 34 3b 0a 20 20 20 20 20 20  Size + 4;.      
17650 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
17660 65 63 74 3d 3d 30 20 26 26 20 28 70 54 61 62 2d  ect==0 && (pTab-
17670 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
17680 70 68 65 6d 65 72 61 6c 29 3d 3d 30 20 29 7b 0a  phemeral)==0 ){.
17690 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
176a0 72 53 65 74 75 70 20 2b 3d 20 32 34 3b 0a 20 20  rSetup += 24;.  
176b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
176c0 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c  ApplyCostMultipl
176d0 69 65 72 28 70 4e 65 77 2d 3e 72 53 65 74 75 70  ier(pNew->rSetup
176e0 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74  , pTab->costMult
176f0 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55  );.        /* TU
17700 4e 49 4e 47 3a 20 45 61 63 68 20 69 6e 64 65 78  NING: Each index
17710 20 6c 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20 32   lookup yields 2
17720 30 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  0 rows in the ta
17730 62 6c 65 2e 20 20 54 68 69 73 0a 20 20 20 20 20  ble.  This.     
17740 20 20 20 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68     ** is more th
17750 61 6e 20 74 68 65 20 75 73 75 61 6c 20 67 75 65  an the usual gue
17760 73 73 20 6f 66 20 31 30 20 72 6f 77 73 2c 20 73  ss of 10 rows, s
17770 69 6e 63 65 20 77 65 20 68 61 76 65 20 6e 6f 20  ince we have no 
17780 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  way.        ** o
17790 66 20 6b 6e 6f 77 69 6e 67 20 68 6f 77 20 73 65  f knowing how se
177a0 6c 65 63 74 69 76 65 20 74 68 65 20 69 6e 64 65  lective the inde
177b0 78 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c  x will ultimatel
177c0 79 20 62 65 2e 20 20 49 74 20 77 6f 75 6c 64 0a  y be.  It would.
177d0 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62          ** not b
177e0 65 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 74  e unreasonable t
177f0 6f 20 6d 61 6b 65 20 74 68 69 73 20 76 61 6c 75  o make this valu
17800 65 20 6d 75 63 68 20 6c 61 72 67 65 72 2e 20 2a  e much larger. *
17810 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
17820 6e 4f 75 74 20 3d 20 34 33 3b 20 20 61 73 73 65  nOut = 43;  asse
17830 72 74 28 20 34 33 3d 3d 73 71 6c 69 74 65 33 4c  rt( 43==sqlite3L
17840 6f 67 45 73 74 28 32 30 29 20 29 3b 0a 20 20 20  ogEst(20) );.   
17850 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
17860 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
17870 64 64 28 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77  dd(rLogSize,pNew
17880 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20  ->nOut);.       
17890 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
178a0 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
178b0 58 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  X;.        pNew-
178c0 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61  >prereq = mExtra
178d0 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   | pTerm->prereq
178e0 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72  Right;.        r
178f0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
17900 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
17910 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ew);.      }.   
17920 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
17930 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
17940 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a  OMATIC_INDEX */.
17950 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20  .  /* Loop over 
17960 61 6c 6c 20 69 6e 64 69 63 65 73 0a 20 20 2a 2f  all indices.  */
17970 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c  .  for(; rc==SQL
17980 49 54 45 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65  ITE_OK && pProbe
17990 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d  ; pProbe=pProbe-
179a0 3e 70 4e 65 78 74 2c 20 69 53 6f 72 74 49 64 78  >pNext, iSortIdx
179b0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 72  ++){.    if( pPr
179c0 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65  obe->pPartIdxWhe
179d0 72 65 21 3d 30 0a 20 20 20 20 20 26 26 20 21 77  re!=0.     && !w
179e0 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61  hereUsablePartia
179f0 6c 49 6e 64 65 78 28 70 53 72 63 2d 3e 69 43 75  lIndex(pSrc->iCu
17a00 72 73 6f 72 2c 20 70 57 43 2c 20 70 50 72 6f 62  rsor, pWC, pProb
17a10 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  e->pPartIdxWhere
17a20 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  ) ){.      testc
17a30 61 73 65 28 20 70 4e 65 77 2d 3e 69 54 61 62 21  ase( pNew->iTab!
17a40 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29  =pSrc->iCursor )
17a50 3b 20 20 2f 2a 20 53 65 65 20 74 69 63 6b 65 74  ;  /* See ticket
17a60 20 5b 39 38 64 39 37 33 62 38 66 35 5d 20 2a 2f   [98d973b8f5] */
17a70 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
17a80 20 20 2f 2a 20 50 61 72 74 69 61 6c 20 69 6e 64    /* Partial ind
17a90 65 78 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65  ex inappropriate
17aa0 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 20   for this query 
17ab0 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 72 53 69  */.    }.    rSi
17ac0 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52  ze = pProbe->aiR
17ad0 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 20  owLogEst[0];.   
17ae0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
17af0 45 71 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  Eq = 0;.    pNew
17b00 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20  ->nSkip = 0;.   
17b10 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
17b20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f  0;.    pNew->iSo
17b30 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 70  rtIdx = 0;.    p
17b40 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
17b50 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  .    pNew->prere
17b60 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20  q = mExtra;.    
17b70 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69  pNew->nOut = rSi
17b80 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ze;.    pNew->u.
17b90 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70  btree.pIndex = p
17ba0 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20 69  Probe;.    b = i
17bb0 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74  ndexMightHelpWit
17bc0 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c 64 65  hOrderBy(pBuilde
17bd0 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63 2d  r, pProbe, pSrc-
17be0 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f  >iCursor);.    /
17bf0 2a 20 54 68 65 20 4f 4e 45 50 41 53 53 5f 44 45  * The ONEPASS_DE
17c00 53 49 52 45 44 20 66 6c 61 67 73 20 6e 65 76 65  SIRED flags neve
17c10 72 20 6f 63 63 75 72 73 20 74 6f 67 65 74 68 65  r occurs togethe
17c20 72 20 77 69 74 68 20 4f 52 44 45 52 20 42 59 20  r with ORDER BY 
17c30 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
17c40 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
17c50 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
17c60 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c  SS_DESIRED)==0 |
17c70 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  | b==0 );.    if
17c80 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d  ( pProbe->tnum<=
17c90 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  0 ){.      /* In
17ca0 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65  teger primary ke
17cb0 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  y index */.     
17cc0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
17cd0 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20   WHERE_IPK;..   
17ce0 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65     /* Full table
17cf0 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70   scan */.      p
17d00 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  New->iSortIdx = 
17d10 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30  b ? iSortIdx : 0
17d20 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e  ;.      /* TUNIN
17d30 47 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20  G: Cost of full 
17d40 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20 28 4e  table scan is (N
17d50 2a 33 2e 30 29 2e 20 2a 2f 0a 20 20 20 20 20 20  *3.0). */.      
17d60 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69  pNew->rRun = rSi
17d70 7a 65 20 2b 20 31 36 3b 0a 20 20 20 20 20 20 41  ze + 16;.      A
17d80 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
17d90 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70  er(pNew->rRun, p
17da0 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a  Tab->costMult);.
17db0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f        whereLoopO
17dc0 75 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c  utputAdjust(pWC,
17dd0 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20   pNew, rSize);. 
17de0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
17df0 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
17e00 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
17e10 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53   pNew->nOut = rS
17e20 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ize;.      if( r
17e30 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  c ) break;.    }
17e40 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d  else{.      Bitm
17e50 61 73 6b 20 6d 3b 0a 20 20 20 20 20 20 69 66 28  ask m;.      if(
17e60 20 70 50 72 6f 62 65 2d 3e 69 73 43 6f 76 65 72   pProbe->isCover
17e70 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ing ){.        p
17e80 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
17e90 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20  HERE_IDX_ONLY | 
17ea0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20  WHERE_INDEXED;. 
17eb0 20 20 20 20 20 20 20 6d 20 3d 20 30 3b 0a 20 20         m = 0;.  
17ec0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17ed0 20 20 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c     m = pSrc->col
17ee0 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49  Used & ~columnsI
17ef0 6e 49 6e 64 65 78 28 70 50 72 6f 62 65 29 3b 0a  nIndex(pProbe);.
17f00 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73          pNew->ws
17f10 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30 29 20 3f  Flags = (m==0) ?
17f20 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59   (WHERE_IDX_ONLY
17f30 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 20  |WHERE_INDEXED) 
17f40 3a 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b  : WHERE_INDEXED;
17f50 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
17f60 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76 69 61  /* Full scan via
17f70 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
17f80 69 66 28 20 62 0a 20 20 20 20 20 20 20 7c 7c 20  if( b.       || 
17f90 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 0a  !HasRowid(pTab).
17fa0 20 20 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30         || ( m==0
17fb0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 72  .         && pPr
17fc0 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d  obe->bUnordered=
17fd0 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
17fe0 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77  pProbe->szIdxRow
17ff0 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 29  <pTab->szTabRow)
18000 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57  .         && (pW
18010 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
18020 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
18030 5f 44 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20  _DESIRED)==0.   
18040 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
18050 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73  GlobalConfig.bUs
18060 65 43 69 73 0a 20 20 20 20 20 20 20 20 20 26 26  eCis.         &&
18070 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
18080 62 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61  bled(pWInfo->pPa
18090 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f  rse->db, SQLITE_
180a0 43 6f 76 65 72 49 64 78 53 63 61 6e 29 0a 20 20  CoverIdxScan).  
180b0 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20          ).      
180c0 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
180d0 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20  >iSortIdx = b ? 
180e0 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 0a 20  iSortIdx : 0;.. 
180f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
18100 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20 74  st of visiting t
18110 68 65 20 69 6e 64 65 78 20 72 6f 77 73 20 69 73  he index rows is
18120 20 4e 2a 4b 2c 20 77 68 65 72 65 20 4b 20 69 73   N*K, where K is
18130 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 74 77  .        ** betw
18140 65 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30 2c  een 1.1 and 3.0,
18150 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
18160 65 20 72 65 6c 61 74 69 76 65 20 73 69 7a 65 73  e relative sizes
18170 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
18180 2a 2a 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62  ** index and tab
18190 6c 65 20 72 6f 77 73 2e 20 49 66 20 74 68 69 73  le rows. If this
181a0 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69   is a non-coveri
181b0 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 2c 0a 20  ng index scan,. 
181c0 20 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20 61         ** also a
181d0 64 64 20 74 68 65 20 63 6f 73 74 20 6f 66 20 76  dd the cost of v
181e0 69 73 69 74 69 6e 67 20 74 61 62 6c 65 20 72 6f  isiting table ro
181f0 77 73 20 28 4e 2a 33 2e 30 29 2e 20 20 2a 2f 0a  ws (N*3.0).  */.
18200 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
18210 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31 20 2b  un = rSize + 1 +
18220 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49   (15*pProbe->szI
18230 64 78 52 6f 77 29 2f 70 54 61 62 2d 3e 73 7a 54  dxRow)/pTab->szT
18240 61 62 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 69  abRow;.        i
18250 66 28 20 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20  f( m!=0 ){.     
18260 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
18270 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
18280 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 72  dd(pNew->rRun, r
18290 53 69 7a 65 2b 31 36 29 3b 0a 20 20 20 20 20 20  Size+16);.      
182a0 20 20 7d 0a 20 20 20 20 20 20 20 20 41 70 70 6c    }.        Appl
182b0 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
182c0 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62  pNew->rRun, pTab
182d0 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20  ->costMult);.   
182e0 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75       whereLoopOu
182f0 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20  tputAdjust(pWC, 
18300 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20  pNew, rSize);.  
18310 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
18320 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
18330 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
18340 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
18350 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20   rSize;.        
18360 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
18370 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
18380 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
18390 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70  pAddBtreeIndex(p
183a0 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70  Builder, pSrc, p
183b0 50 72 6f 62 65 2c 20 30 29 3b 0a 23 69 66 64 65  Probe, 0);.#ifde
183c0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
183d0 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
183e0 20 20 20 73 71 6c 69 74 65 33 53 74 61 74 34 50     sqlite3Stat4P
183f0 72 6f 62 65 46 72 65 65 28 70 42 75 69 6c 64 65  robeFree(pBuilde
18400 72 2d 3e 70 52 65 63 29 3b 0a 20 20 20 20 70 42  r->pRec);.    pB
18410 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
18420 64 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 69 6c  d = 0;.    pBuil
18430 64 65 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23  der->pRec = 0;.#
18440 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66  endif..    /* If
18450 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e   there was an IN
18460 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
18470 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20   then only that 
18480 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20 20  one index is.   
18490 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e 20   ** considered. 
184a0 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d  */.    if( pSrc-
184b0 3e 70 49 42 49 6e 64 65 78 20 29 20 62 72 65 61  >pIBIndex ) brea
184c0 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
184d0 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
184e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
184f0 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 64  ALTABLE./*.** Ad
18500 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20  d all WhereLoop 
18510 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20 74 61  objects for a ta
18520 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ble of the join 
18530 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a  identified by.**
18540 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
18550 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62  >iTab.  That tab
18560 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  le is guaranteed
18570 20 74 6f 20 62 65 20 61 20 76 69 72 74 75 61 6c   to be a virtual
18580 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
18590 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 4c 45   there are no LE
185a0 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e  FT or CROSS JOIN
185b0 20 6a 6f 69 6e 73 20 69 6e 20 74 68 65 20 71 75   joins in the qu
185c0 65 72 79 2c 20 62 6f 74 68 20 6d 45 78 74 72 61  ery, both mExtra
185d0 20 61 6e 64 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c   and.** mUnusabl
185e0 65 20 61 72 65 20 73 65 74 20 74 6f 20 30 2e 20  e are set to 0. 
185f0 4f 74 68 65 72 77 69 73 65 2c 20 6d 45 78 74 72  Otherwise, mExtr
18600 61 20 69 73 20 61 20 6d 61 73 6b 20 6f 66 20 61  a is a mask of a
18610 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a  ll FROM clause.*
18620 2a 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6f  * entries that o
18630 63 63 75 72 20 62 65 66 6f 72 65 20 74 68 65 20  ccur before the 
18640 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e  virtual table in
18650 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
18660 20 61 6e 64 20 61 72 65 0a 2a 2a 20 73 65 70 61   and are.** sepa
18670 72 61 74 65 64 20 66 72 6f 6d 20 69 74 20 62 79  rated from it by
18680 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 4c 45   at least one LE
18690 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e  FT or CROSS JOIN
186a0 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65  . Similarly, the
186b0 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 6d 61  .** mUnusable ma
186c0 73 6b 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20  sk contains all 
186d0 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74 72  FROM clause entr
186e0 69 65 73 20 74 68 61 74 20 6f 63 63 75 72 20 61  ies that occur a
186f0 66 74 65 72 20 74 68 65 0a 2a 2a 20 76 69 72 74  fter the.** virt
18700 75 61 6c 20 74 61 62 6c 65 20 61 6e 64 20 61 72  ual table and ar
18710 65 20 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d  e separated from
18720 20 69 74 20 62 79 20 61 74 20 6c 65 61 73 74 20   it by at least 
18730 6f 6e 65 20 4c 45 46 54 20 6f 72 20 0a 2a 2a 20  one LEFT or .** 
18740 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 0a 2a 2a 0a  CROSS JOIN. .**.
18750 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
18760 69 66 20 74 68 65 20 71 75 65 72 79 20 77 65 72  if the query wer
18770 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46  e:.**.**   ... F
18780 52 4f 4d 20 74 31 2c 20 74 32 20 4c 45 46 54 20  ROM t1, t2 LEFT 
18790 4a 4f 49 4e 20 74 33 2c 20 74 34 2c 20 76 74 20  JOIN t3, t4, vt 
187a0 43 52 4f 53 53 20 4a 4f 49 4e 20 74 35 2c 20 74  CROSS JOIN t5, t
187b0 36 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6d 45  6;.**.** then mE
187c0 78 74 72 61 20 63 6f 72 72 65 73 70 6f 6e 64 73  xtra corresponds
187d0 20 74 6f 20 28 74 31 2c 20 74 32 29 20 61 6e 64   to (t1, t2) and
187e0 20 6d 55 6e 75 73 61 62 6c 65 20 74 6f 20 28 74   mUnusable to (t
187f0 35 2c 20 74 36 29 2e 0a 2a 2a 0a 2a 2a 20 41 6c  5, t6)..**.** Al
18800 6c 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20  l the tables in 
18810 6d 45 78 74 72 61 20 6d 75 73 74 20 62 65 20 73  mExtra must be s
18820 63 61 6e 6e 65 64 20 62 65 66 6f 72 65 20 74 68  canned before th
18830 65 20 63 75 72 72 65 6e 74 20 76 69 72 74 75 61  e current virtua
18840 6c 20 0a 2a 2a 20 74 61 62 6c 65 2e 20 53 6f 20  l .** table. So 
18850 61 6e 79 20 74 65 72 6d 73 20 66 6f 72 20 77 68  any terms for wh
18860 69 63 68 20 61 6c 6c 20 70 72 65 72 65 71 75 69  ich all prerequi
18870 73 69 74 65 73 20 61 72 65 20 73 61 74 69 73 66  sites are satisf
18880 69 65 64 20 62 79 20 0a 2a 2a 20 6d 45 78 74 72  ied by .** mExtr
18890 61 20 6d 61 79 20 62 65 20 73 70 65 63 69 66 69  a may be specifi
188a0 65 64 20 61 73 20 22 75 73 61 62 6c 65 22 20 69  ed as "usable" i
188b0 6e 20 61 6c 6c 20 63 61 6c 6c 73 20 74 6f 20 78  n all calls to x
188c0 42 65 73 74 49 6e 64 65 78 2e 20 0a 2a 2a 20 43  BestIndex. .** C
188d0 6f 6e 76 65 72 73 65 6c 79 2c 20 61 6c 6c 20 74  onversely, all t
188e0 61 62 6c 65 73 20 69 6e 20 6d 55 6e 75 73 61 62  ables in mUnusab
188f0 6c 65 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e  le must be scann
18900 65 64 20 61 66 74 65 72 20 74 68 65 20 63 75 72  ed after the cur
18910 72 65 6e 74 0a 2a 2a 20 76 69 72 74 75 61 6c 20  rent.** virtual 
18920 74 61 62 6c 65 2c 20 73 6f 20 61 6e 79 20 74 65  table, so any te
18930 72 6d 73 20 66 6f 72 20 77 68 69 63 68 20 74 68  rms for which th
18940 65 20 70 72 65 72 65 71 75 69 73 69 74 65 73 20  e prerequisites 
18950 6f 76 65 72 6c 61 70 20 77 69 74 68 0a 2a 2a 20  overlap with.** 
18960 6d 55 6e 75 73 61 62 6c 65 20 73 68 6f 75 6c 64  mUnusable should
18970 20 61 6c 77 61 79 73 20 62 65 20 63 6f 6e 66 69   always be confi
18980 67 75 72 65 64 20 61 73 20 22 6e 6f 74 2d 75 73  gured as "not-us
18990 61 62 6c 65 22 20 66 6f 72 20 78 42 65 73 74 49  able" for xBestI
189a0 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
189b0 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
189c0 56 69 72 74 75 61 6c 28 0a 20 20 57 68 65 72 65  Virtual(.  Where
189d0 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
189e0 69 6c 64 65 72 2c 20 20 2f 2a 20 57 48 45 52 45  ilder,  /* WHERE
189f0 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74   clause informat
18a00 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ion */.  Bitmask
18a10 20 6d 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   mExtra,        
18a20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
18a30 74 68 61 74 20 6d 75 73 74 20 62 65 20 73 63 61  that must be sca
18a40 6e 6e 65 64 20 62 65 66 6f 72 65 20 74 68 69 73  nned before this
18a50 20 6f 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73   one */.  Bitmas
18a60 6b 20 6d 55 6e 75 73 61 62 6c 65 20 20 20 20 20  k mUnusable     
18a70 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73         /* Tables
18a80 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 73 63   that must be sc
18a90 61 6e 6e 65 64 20 61 66 74 65 72 20 74 68 69 73  anned after this
18aa0 20 6f 6e 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65   one */.){.  Whe
18ab0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
18ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45            /* WHE
18ad0 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74  RE analysis cont
18ae0 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  ext */.  Parse *
18af0 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
18b00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
18b10 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
18b20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
18b30 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  WC;            /
18b40 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
18b50 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
18b60 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
18b70 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
18b80 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
18b90 73 65 61 72 63 68 20 2a 2f 0a 20 20 54 61 62 6c  search */.  Tabl
18ba0 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  e *pTab;.  sqlit
18bb0 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65  e3 *db;.  sqlite
18bc0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
18bd0 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  dxInfo;.  struct
18be0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
18bf0 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43  onstraint *pIdxC
18c00 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71  ons;.  struct sq
18c10 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
18c20 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55  traint_usage *pU
18c30 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72  sage;.  WhereTer
18c40 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20  m *pTerm;.  int 
18c50 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 69 54 65 72  i, j;.  int iTer
18c60 6d 2c 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74  m, mxTerm;.  int
18c70 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20   nConstraint;.  
18c80 69 6e 74 20 73 65 65 6e 49 6e 20 3d 20 30 3b 20  int seenIn = 0; 
18c90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18ca0 54 72 75 65 20 69 66 20 61 6e 20 49 4e 20 6f 70  True if an IN op
18cb0 65 72 61 74 6f 72 20 69 73 20 73 65 65 6e 20 2a  erator is seen *
18cc0 2f 0a 20 20 69 6e 74 20 73 65 65 6e 56 61 72 20  /.  int seenVar 
18cd0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
18ce0 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6e 6f   /* True if a no
18cf0 6e 2d 63 6f 6e 73 74 61 6e 74 20 63 6f 6e 73 74  n-constant const
18d00 72 61 69 6e 74 20 69 73 20 73 65 65 6e 20 2a 2f  raint is seen */
18d10 0a 20 20 69 6e 74 20 69 50 68 61 73 65 3b 20 20  .  int iPhase;  
18d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d30 2f 2a 20 30 3a 20 63 6f 6e 73 74 20 77 2f 6f 20  /* 0: const w/o 
18d40 49 4e 2c 20 31 3a 20 63 6f 6e 73 74 2c 20 32 3a  IN, 1: const, 2:
18d50 20 6e 6f 20 49 4e 2c 20 20 32 3a 20 49 4e 20 2a   no IN,  2: IN *
18d60 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
18d70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  New;.  int rc = 
18d80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
18d90 73 65 72 74 28 20 28 6d 45 78 74 72 61 20 26 20  sert( (mExtra & 
18da0 6d 55 6e 75 73 61 62 6c 65 29 3d 3d 30 20 29 3b  mUnusable)==0 );
18db0 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  .  pWInfo = pBui
18dc0 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
18dd0 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
18de0 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20  >pParse;.  db = 
18df0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 57  pParse->db;.  pW
18e00 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  C = pBuilder->pW
18e10 43 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  C;.  pNew = pBui
18e20 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53  lder->pNew;.  pS
18e30 72 63 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54  rc = &pWInfo->pT
18e40 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e  abList->a[pNew->
18e50 69 54 61 62 5d 3b 0a 20 20 70 54 61 62 20 3d 20  iTab];.  pTab = 
18e60 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 61 73  pSrc->pTab;.  as
18e70 73 65 72 74 28 20 49 73 56 69 72 74 75 61 6c 28  sert( IsVirtual(
18e80 70 54 61 62 29 20 29 3b 0a 20 20 70 49 64 78 49  pTab) );.  pIdxI
18e90 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e  nfo = allocateIn
18ea0 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  dexInfo(pParse, 
18eb0 70 57 43 2c 20 6d 55 6e 75 73 61 62 6c 65 2c 20  pWC, mUnusable, 
18ec0 70 53 72 63 2c 70 42 75 69 6c 64 65 72 2d 3e 70  pSrc,pBuilder->p
18ed0 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20  OrderBy);.  if( 
18ee0 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 20 72 65  pIdxInfo==0 ) re
18ef0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
18f00 4d 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  M;.  pNew->prere
18f10 71 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72  q = 0;.  pNew->r
18f20 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65  Setup = 0;.  pNe
18f30 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
18f40 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b  RE_VIRTUALTABLE;
18f50 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20  .  pNew->nLTerm 
18f60 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76  = 0;.  pNew->u.v
18f70 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
18f80 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49 64  ;.  pUsage = pId
18f90 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
18fa0 6e 74 55 73 61 67 65 3b 0a 20 20 6e 43 6f 6e 73  ntUsage;.  nCons
18fb0 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e 66  traint = pIdxInf
18fc0 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  o->nConstraint;.
18fd0 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52    if( whereLoopR
18fe0 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20  esize(db, pNew, 
18ff0 6e 43 6f 6e 73 74 72 61 69 6e 74 29 20 29 7b 0a  nConstraint) ){.
19000 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
19010 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b  e(db, pIdxInfo);
19020 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
19030 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
19040 20 66 6f 72 28 69 50 68 61 73 65 3d 30 3b 20 69   for(iPhase=0; i
19050 50 68 61 73 65 3c 3d 33 3b 20 69 50 68 61 73 65  Phase<=3; iPhase
19060 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73 65  ++){.    if( !se
19070 65 6e 49 6e 20 26 26 20 28 69 50 68 61 73 65 26  enIn && (iPhase&
19080 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  1)!=0 ){.      i
19090 50 68 61 73 65 2b 2b 3b 0a 20 20 20 20 20 20 69  Phase++;.      i
190a0 66 28 20 69 50 68 61 73 65 3e 33 20 29 20 62 72  f( iPhase>3 ) br
190b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
190c0 66 28 20 21 73 65 65 6e 56 61 72 20 26 26 20 69  f( !seenVar && i
190d0 50 68 61 73 65 3e 31 20 29 20 62 72 65 61 6b 3b  Phase>1 ) break;
190e0 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  .    pIdxCons = 
190f0 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
19100 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
19110 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
19120 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20  Constraint;.    
19130 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49  for(i=0; i<pIdxI
19140 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
19150 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b  ; i++, pIdxCons+
19160 2b 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70 49  +){.      j = pI
19170 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66  dxCons->iTermOff
19180 73 65 74 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  set;.      pTerm
19190 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20   = &pWC->a[j];. 
191a0 20 20 20 20 20 73 77 69 74 63 68 28 20 69 50 68       switch( iPh
191b0 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ase ){.        c
191c0 61 73 65 20 30 3a 20 20 20 20 2f 2a 20 43 6f 6e  ase 0:    /* Con
191d0 73 74 61 6e 74 73 20 77 69 74 68 6f 75 74 20 49  stants without I
191e0 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
191f0 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
19200 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20  ->usable = 0;.  
19210 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
19220 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
19230 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20  WO_IN)!=0 ){.   
19240 20 20 20 20 20 20 20 20 20 73 65 65 6e 49 6e 20           seenIn 
19250 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
19260 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
19270 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
19280 68 74 20 26 20 7e 6d 45 78 74 72 61 29 21 3d 30  ht & ~mExtra)!=0
19290 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
192a0 73 65 65 6e 56 61 72 20 3d 20 31 3b 0a 20 20 20  seenVar = 1;.   
192b0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
192c0 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
192d0 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 29  or & WO_IN)==0 )
192e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  {.            pI
192f0 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
19300 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
19310 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
19320 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 31 3a  .        case 1:
19330 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73      /* Constants
19340 20 77 69 74 68 20 49 4e 20 6f 70 65 72 61 74 6f   with IN operato
19350 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  rs */.          
19360 61 73 73 65 72 74 28 20 73 65 65 6e 49 6e 20 29  assert( seenIn )
19370 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78  ;.          pIdx
19380 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28  Cons->usable = (
19390 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
193a0 68 74 20 26 20 7e 6d 45 78 74 72 61 29 3d 3d 30  ht & ~mExtra)==0
193b0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
193c0 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
193d0 32 3a 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c  2:    /* Variabl
193e0 65 73 20 77 69 74 68 6f 75 74 20 49 4e 20 2a 2f  es without IN */
193f0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
19400 74 28 20 73 65 65 6e 56 61 72 20 29 3b 0a 20 20  t( seenVar );.  
19410 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
19420 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72  ->usable = (pTer
19430 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
19440 4f 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20 20 20 20  O_IN)==0;.      
19450 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
19460 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 2f 2a     default:   /*
19470 20 56 61 72 69 61 62 6c 65 73 20 77 69 74 68 20   Variables with 
19480 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  IN */.          
19490 61 73 73 65 72 74 28 20 73 65 65 6e 56 61 72 20  assert( seenVar 
194a0 26 26 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20  && seenIn );.   
194b0 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
194c0 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  >usable = 1;.   
194d0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
194e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
194f0 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30  memset(pUsage, 0
19500 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b  , sizeof(pUsage[
19510 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  0])*pIdxInfo->nC
19520 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20  onstraint);.    
19530 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65  if( pIdxInfo->ne
19540 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29  edToFreeIdxStr )
19550 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
19560 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b  dxInfo->idxStr);
19570 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  .    pIdxInfo->i
19580 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70  dxStr = 0;.    p
19590 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20  IdxInfo->idxNum 
195a0 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 0;.    pIdxInf
195b0 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
195c0 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64  Str = 0;.    pId
195d0 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
195e0 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20  nsumed = 0;.    
195f0 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
19600 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45  tedCost = SQLITE
19610 5f 42 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75 62  _BIG_DBL / (doub
19620 6c 65 29 32 3b 0a 20 20 20 20 70 49 64 78 49 6e  le)2;.    pIdxIn
19630 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77  fo->estimatedRow
19640 73 20 3d 20 32 35 3b 0a 20 20 20 20 72 63 20 3d  s = 25;.    rc =
19650 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 70   vtabBestIndex(p
19660 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64  Parse, pTab, pId
19670 78 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20  xInfo);.    if( 
19680 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 4c  rc ) goto whereL
19690 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b  oopAddVtab_exit;
196a0 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  .    pIdxCons = 
196b0 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
196c0 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
196d0 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
196e0 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20  Constraint;.    
196f0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d  pNew->prereq = m
19700 45 78 74 72 61 3b 0a 20 20 20 20 6d 78 54 65 72  Extra;.    mxTer
19710 6d 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65  m = -1;.    asse
19720 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74  rt( pNew->nLSlot
19730 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 3b  >=nConstraint );
19740 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
19750 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
19760 29 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69  ) pNew->aLTerm[i
19770 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  ] = 0;.    pNew-
19780 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
19790 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
197a0 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; i<nConstraint
197b0 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b  ; i++, pIdxCons+
197c0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69  +){.      if( (i
197d0 54 65 72 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d  Term = pUsage[i]
197e0 2e 61 72 67 76 49 6e 64 65 78 20 2d 20 31 29 3e  .argvIndex - 1)>
197f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20  =0 ){.        j 
19800 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72  = pIdxCons->iTer
19810 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  mOffset;.       
19820 20 69 66 28 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e   if( iTerm>=nCon
19830 73 74 72 61 69 6e 74 0a 20 20 20 20 20 20 20 20  straint.        
19840 20 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20 20   || j<0.        
19850 20 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72   || j>=pWC->nTer
19860 6d 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4e  m.         || pN
19870 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d  ew->aLTerm[iTerm
19880 5d 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a  ]!=0.        ){.
19890 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
198a0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
198b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
198c0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
198d0 25 73 2e 78 42 65 73 74 49 6e 64 65 78 28 29 20  %s.xBestIndex() 
198e0 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 20 70 54  malfunction", pT
198f0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
19900 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65        goto where
19910 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74  LoopAddVtab_exit
19920 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
19930 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54      testcase( iT
19940 65 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  erm==nConstraint
19950 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  -1 );.        te
19960 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 29 3b 0a  stcase( j==0 );.
19970 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
19980 28 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d  ( j==pWC->nTerm-
19990 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65  1 );.        pTe
199a0 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b  rm = &pWC->a[j];
199b0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
199c0 72 65 72 65 71 20 7c 3d 20 70 54 65 72 6d 2d 3e  rereq |= pTerm->
199d0 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20  prereqRight;.   
199e0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 54 65       assert( iTe
199f0 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20  rm<pNew->nLSlot 
19a00 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
19a10 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d  >aLTerm[iTerm] =
19a20 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   pTerm;.        
19a30 69 66 28 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d  if( iTerm>mxTerm
19a40 20 29 20 6d 78 54 65 72 6d 20 3d 20 69 54 65 72   ) mxTerm = iTer
19a50 6d 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  m;.        testc
19a60 61 73 65 28 20 69 54 65 72 6d 3d 3d 31 35 20 29  ase( iTerm==15 )
19a70 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
19a80 73 65 28 20 69 54 65 72 6d 3d 3d 31 36 20 29 3b  se( iTerm==16 );
19a90 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65  .        if( iTe
19aa0 72 6d 3c 31 36 20 26 26 20 70 55 73 61 67 65 5b  rm<16 && pUsage[
19ab0 69 5d 2e 6f 6d 69 74 20 29 20 70 4e 65 77 2d 3e  i].omit ) pNew->
19ac0 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20  u.vtab.omitMask 
19ad0 7c 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a 20 20 20  |= 1<<iTerm;.   
19ae0 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
19af0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
19b00 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  IN)!=0 ){.      
19b10 20 20 20 20 69 66 28 20 70 55 73 61 67 65 5b 69      if( pUsage[i
19b20 5d 2e 6f 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  ].omit==0 ){.   
19b30 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
19b40 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ot attempt to us
19b50 65 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69  e an IN constrai
19b60 6e 74 20 69 66 20 74 68 65 20 76 69 72 74 75 61  nt if the virtua
19b70 6c 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20  l table.        
19b80 20 20 20 20 2a 2a 20 73 61 79 73 20 74 68 61 74      ** says that
19b90 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
19ba0 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61  EQ constraint ca
19bb0 6e 6e 6f 74 20 62 65 20 73 61 66 65 6c 79 20 6f  nnot be safely o
19bc0 6d 69 74 74 65 64 2e 0a 20 20 20 20 20 20 20 20  mitted..        
19bd0 20 20 20 20 2a 2a 20 49 66 20 77 65 20 64 6f 20      ** If we do 
19be0 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 73  attempt to use s
19bf0 75 63 68 20 61 20 63 6f 6e 73 74 72 61 69 6e 74  uch a constraint
19c00 2c 20 73 6f 6d 65 20 72 6f 77 73 20 6d 69 67 68  , some rows migh
19c10 74 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 20  t be.           
19c20 20 2a 2a 20 72 65 70 65 61 74 65 64 20 69 6e 20   ** repeated in 
19c30 74 68 65 20 6f 75 74 70 75 74 2e 20 2a 2f 0a 20  the output. */. 
19c40 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
19c50 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
19c60 20 20 20 20 20 20 20 20 2f 2a 20 41 20 76 69 72          /* A vir
19c70 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20  tual table that 
19c80 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62  is constrained b
19c90 79 20 61 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d  y an IN clause m
19ca0 61 79 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 20  ay not.         
19cb0 20 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68 65 20   ** consume the 
19cc0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
19cd0 62 65 63 61 75 73 65 20 28 31 29 20 74 68 65 20  because (1) the 
19ce0 6f 72 64 65 72 20 6f 66 20 49 4e 20 74 65 72 6d  order of IN term
19cf0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  s.          ** i
19d00 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
19d10 79 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65  y related to the
19d20 20 6f 72 64 65 72 20 6f 66 20 6f 75 74 70 75 74   order of output
19d30 20 74 65 72 6d 73 20 61 6e 64 0a 20 20 20 20 20   terms and.     
19d40 20 20 20 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74       ** (2) Mult
19d50 69 70 6c 65 20 6f 75 74 70 75 74 73 20 66 72 6f  iple outputs fro
19d60 6d 20 61 20 73 69 6e 67 6c 65 20 49 4e 20 76 61  m a single IN va
19d70 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72  lue will not mer
19d80 67 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ge.          ** 
19d90 74 6f 67 65 74 68 65 72 2e 20 20 2a 2f 0a 20 20  together.  */.  
19da0 20 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f          pIdxInfo
19db0 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
19dc0 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  d = 0;.        }
19dd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19de0 20 20 20 69 66 28 20 69 3e 3d 6e 43 6f 6e 73 74     if( i>=nConst
19df0 72 61 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 70  raint ){.      p
19e00 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78  New->nLTerm = mx
19e10 54 65 72 6d 2b 31 3b 0a 20 20 20 20 20 20 61 73  Term+1;.      as
19e20 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 54 65  sert( pNew->nLTe
19e30 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74  rm<=pNew->nLSlot
19e40 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
19e50 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 20 3d 20  u.vtab.idxNum = 
19e60 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d  pIdxInfo->idxNum
19e70 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ;.      pNew->u.
19e80 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
19e90 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
19ea0 46 72 65 65 49 64 78 53 74 72 3b 0a 20 20 20 20  FreeIdxStr;.    
19eb0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64    pIdxInfo->need
19ec0 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30  ToFreeIdxStr = 0
19ed0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ;.      pNew->u.
19ee0 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20 70 49  vtab.idxStr = pI
19ef0 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 3b 0a  dxInfo->idxStr;.
19f00 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74        pNew->u.vt
19f10 61 62 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 28  ab.isOrdered = (
19f20 69 38 29 28 70 49 64 78 49 6e 66 6f 2d 3e 6f 72  i8)(pIdxInfo->or
19f30 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3f 0a  derByConsumed ?.
19f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f60 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
19f70 6e 4f 72 64 65 72 42 79 20 3a 20 30 29 3b 0a 20  nOrderBy : 0);. 
19f80 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75       pNew->rSetu
19f90 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65  p = 0;.      pNe
19fa0 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65  w->rRun = sqlite
19fb0 33 4c 6f 67 45 73 74 46 72 6f 6d 44 6f 75 62 6c  3LogEstFromDoubl
19fc0 65 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69  e(pIdxInfo->esti
19fd0 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 20 20  matedCost);.    
19fe0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
19ff0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 49 64  qlite3LogEst(pId
1a000 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
1a010 52 6f 77 73 29 3b 0a 20 20 20 20 20 20 77 68 65  Rows);.      whe
1a020 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
1a030 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
1a040 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e      if( pNew->u.
1a050 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b  vtab.needFree ){
1a060 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1a070 5f 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74  _free(pNew->u.vt
1a080 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  ab.idxStr);.    
1a090 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
1a0a0 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
1a0b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1a0c0 20 20 0a 0a 77 68 65 72 65 4c 6f 6f 70 41 64 64    ..whereLoopAdd
1a0d0 56 74 61 62 5f 65 78 69 74 3a 0a 20 20 69 66 28  Vtab_exit:.  if(
1a0e0 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
1a0f0 6f 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71  oFreeIdxStr ) sq
1a100 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49  lite3_free(pIdxI
1a110 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  nfo->idxStr);.  
1a120 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1a130 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72  , pIdxInfo);.  r
1a140 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
1a150 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1a160 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
1a170 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65  /../*.** Add Whe
1a180 72 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20 74  reLoop entries t
1a190 6f 20 68 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d  o handle OR term
1a1a0 73 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 66  s.  This works f
1a1b0 6f 72 20 65 69 74 68 65 72 0a 2a 2a 20 62 74 72  or either.** btr
1a1c0 65 65 73 20 6f 72 20 76 69 72 74 75 61 6c 20 74  ees or virtual t
1a1d0 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ables..*/.static
1a1e0 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
1a1f0 64 4f 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  dOr(.  WhereLoop
1a200 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
1a210 72 2c 20 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45  r, .  Bitmask mE
1a220 78 74 72 61 2c 20 0a 20 20 42 69 74 6d 61 73 6b  xtra, .  Bitmask
1a230 20 6d 55 6e 75 73 61 62 6c 65 0a 29 7b 0a 20 20   mUnusable.){.  
1a240 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
1a250 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
1a260 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43 6c 61  Info;.  WhereCla
1a270 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72  use *pWC;.  Wher
1a280 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57  eLoop *pNew;.  W
1a290 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
1a2a0 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20   *pWCEnd;.  int 
1a2b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1a2c0 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 57 68    int iCur;.  Wh
1a2d0 65 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43  ereClause tempWC
1a2e0 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  ;.  WhereLoopBui
1a2f0 6c 64 65 72 20 73 53 75 62 42 75 69 6c 64 3b 0a  lder sSubBuild;.
1a300 20 20 57 68 65 72 65 4f 72 53 65 74 20 73 53 75    WhereOrSet sSu
1a310 6d 2c 20 73 43 75 72 3b 0a 20 20 73 74 72 75 63  m, sCur;.  struc
1a320 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1a330 70 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57 43 20  pItem;.  .  pWC 
1a340 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b  = pBuilder->pWC;
1a350 0a 20 20 70 57 43 45 6e 64 20 3d 20 70 57 43 2d  .  pWCEnd = pWC-
1a360 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b  >a + pWC->nTerm;
1a370 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
1a380 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65 6d 73  er->pNew;.  mems
1a390 65 74 28 26 73 53 75 6d 2c 20 30 2c 20 73 69 7a  et(&sSum, 0, siz
1a3a0 65 6f 66 28 73 53 75 6d 29 29 3b 0a 20 20 70 49  eof(sSum));.  pI
1a3b0 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  tem = pWInfo->pT
1a3c0 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77  abList->a + pNew
1a3d0 2d 3e 69 54 61 62 3b 0a 20 20 69 43 75 72 20 3d  ->iTab;.  iCur =
1a3e0 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b   pItem->iCursor;
1a3f0 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  ..  for(pTerm=pW
1a400 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45  C->a; pTerm<pWCE
1a410 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  nd && rc==SQLITE
1a420 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  _OK; pTerm++){. 
1a430 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
1a440 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52  Operator & WO_OR
1a450 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  )!=0.     && (pT
1a460 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e  erm->u.pOrInfo->
1a470 69 6e 64 65 78 61 62 6c 65 20 26 20 70 4e 65 77  indexable & pNew
1a480 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 0a  ->maskSelf)!=0 .
1a490 20 20 20 20 29 7b 0a 20 20 20 20 20 20 57 68 65      ){.      Whe
1a4a0 72 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74  reClause * const
1a4b0 20 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d 2d   pOrWC = &pTerm-
1a4c0 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a  >u.pOrInfo->wc;.
1a4d0 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
1a4e0 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64  * const pOrWCEnd
1a4f0 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72   = &pOrWC->a[pOr
1a500 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20  WC->nTerm];.    
1a510 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72    WhereTerm *pOr
1a520 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  Term;.      int 
1a530 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  once = 1;.      
1a540 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 0a 20  int i, j;.    . 
1a550 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 20 3d       sSubBuild =
1a560 20 2a 70 42 75 69 6c 64 65 72 3b 0a 20 20 20 20   *pBuilder;.    
1a570 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 64    sSubBuild.pOrd
1a580 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
1a590 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 53 65 74  sSubBuild.pOrSet
1a5a0 20 3d 20 26 73 43 75 72 3b 0a 0a 20 20 20 20 20   = &sCur;..     
1a5b0 20 57 48 45 52 45 54 52 41 43 45 28 30 78 32 30   WHERETRACE(0x20
1a5c0 30 2c 20 28 22 42 65 67 69 6e 20 70 72 6f 63 65  0, ("Begin proce
1a5d0 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20  ssing OR-clause 
1a5e0 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a  %p\n", pTerm));.
1a5f0 20 20 20 20 20 20 66 6f 72 28 70 4f 72 54 65 72        for(pOrTer
1a600 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54  m=pOrWC->a; pOrT
1a610 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f  erm<pOrWCEnd; pO
1a620 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
1a630 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e    if( (pOrTerm->
1a640 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
1a650 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ND)!=0 ){.      
1a660 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57      sSubBuild.pW
1a670 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e  C = &pOrTerm->u.
1a680 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  pAndInfo->wc;.  
1a690 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1a6a0 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
1a6b0 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20  sor==iCur ){.   
1a6c0 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 57         tempWC.pW
1a6d0 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e  Info = pWC->pWIn
1a6e0 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  fo;.          te
1a6f0 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d 20 70 57  mpWC.pOuter = pW
1a700 43 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  C;.          tem
1a710 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b  pWC.op = TK_AND;
1a720 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
1a730 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  C.nTerm = 1;.   
1a740 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 61 20         tempWC.a 
1a750 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20  = pOrTerm;.     
1a760 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70       sSubBuild.p
1a770 57 43 20 3d 20 26 74 65 6d 70 57 43 3b 0a 20 20  WC = &tempWC;.  
1a780 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a790 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
1a7a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a7b0 20 20 20 73 43 75 72 2e 6e 20 3d 20 30 3b 0a 23     sCur.n = 0;.#
1a7c0 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
1a7d0 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 20  _ENABLED.       
1a7e0 20 57 48 45 52 45 54 52 41 43 45 28 30 78 32 30   WHERETRACE(0x20
1a7f0 30 2c 20 28 22 4f 52 2d 74 65 72 6d 20 25 64 20  0, ("OR-term %d 
1a800 6f 66 20 25 70 20 68 61 73 20 25 64 20 73 75 62  of %p has %d sub
1a810 74 65 72 6d 73 3a 5c 6e 22 2c 20 0a 20 20 20 20  terms:\n", .    
1a820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1a830 69 6e 74 29 28 70 4f 72 54 65 72 6d 2d 70 4f 72  int)(pOrTerm-pOr
1a840 57 43 2d 3e 61 29 2c 20 70 54 65 72 6d 2c 20 73  WC->a), pTerm, s
1a850 53 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e 6e 54  SubBuild.pWC->nT
1a860 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 20 20 69  erm));.        i
1a870 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
1a880 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a  race & 0x400 ){.
1a890 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
1a8a0 30 3b 20 69 3c 73 53 75 62 42 75 69 6c 64 2e 70  0; i<sSubBuild.p
1a8b0 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b  WC->nTerm; i++){
1a8c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65  .            whe
1a8d0 72 65 54 65 72 6d 50 72 69 6e 74 28 26 73 53 75  reTermPrint(&sSu
1a8e0 62 42 75 69 6c 64 2e 70 57 43 2d 3e 61 5b 69 5d  bBuild.pWC->a[i]
1a8f0 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
1a900 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  }.        }.#end
1a910 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
1a920 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1a930 42 4c 45 0a 20 20 20 20 20 20 20 20 69 66 28 20  BLE.        if( 
1a940 49 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d  IsVirtual(pItem-
1a950 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  >pTab) ){.      
1a960 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1a970 6f 70 41 64 64 56 69 72 74 75 61 6c 28 26 73 53  opAddVirtual(&sS
1a980 75 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 2c  ubBuild, mExtra,
1a990 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20   mUnusable);.   
1a9a0 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
1a9b0 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  f.        {.    
1a9c0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1a9d0 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 26 73 53  LoopAddBtree(&sS
1a9e0 75 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29  ubBuild, mExtra)
1a9f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1aa00 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1aa10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1aa20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
1aa30 70 41 64 64 4f 72 28 26 73 53 75 62 42 75 69 6c  pAddOr(&sSubBuil
1aa40 64 2c 20 6d 45 78 74 72 61 2c 20 6d 55 6e 75 73  d, mExtra, mUnus
1aa50 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  able);.        }
1aa60 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1aa70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
1aa80 7c 20 73 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20  | sCur.n==0 );. 
1aa90 20 20 20 20 20 20 20 69 66 28 20 73 43 75 72 2e         if( sCur.
1aaa0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
1aab0 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20    sSum.n = 0;.  
1aac0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1aad0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1aae0 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20   once ){.       
1aaf0 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26     whereOrMove(&
1ab00 73 53 75 6d 2c 20 26 73 43 75 72 29 3b 0a 20 20  sSum, &sCur);.  
1ab10 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30          once = 0
1ab20 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1ab30 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65  .          Where
1ab40 4f 72 53 65 74 20 73 50 72 65 76 3b 0a 20 20 20  OrSet sPrev;.   
1ab50 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f         whereOrMo
1ab60 76 65 28 26 73 50 72 65 76 2c 20 26 73 53 75 6d  ve(&sPrev, &sSum
1ab70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  );.          sSu
1ab80 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  m.n = 0;.       
1ab90 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50     for(i=0; i<sP
1aba0 72 65 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  rev.n; i++){.   
1abb0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
1abc0 3b 20 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29  ; j<sCur.n; j++)
1abd0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1abe0 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 26 73  whereOrInsert(&s
1abf0 53 75 6d 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e  Sum, sPrev.a[i].
1ac00 70 72 65 72 65 71 20 7c 20 73 43 75 72 2e 61 5b  prereq | sCur.a[
1ac10 6a 5d 2e 70 72 65 72 65 71 2c 0a 20 20 20 20 20  j].prereq,.     
1ac20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f         sqlite3Lo
1ac40 67 45 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b  gEstAdd(sPrev.a[
1ac50 69 5d 2e 72 52 75 6e 2c 20 73 43 75 72 2e 61 5b  i].rRun, sCur.a[
1ac60 6a 5d 2e 72 52 75 6e 29 2c 0a 20 20 20 20 20 20  j].rRun),.      
1ac70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac80 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67        sqlite3Log
1ac90 45 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69  EstAdd(sPrev.a[i
1aca0 5d 2e 6e 4f 75 74 2c 20 73 43 75 72 2e 61 5b 6a  ].nOut, sCur.a[j
1acb0 5d 2e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20  ].nOut));.      
1acc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1acd0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1ace0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77      }.      pNew
1acf0 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20  ->nLTerm = 1;.  
1ad00 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
1ad10 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [0] = pTerm;.   
1ad20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
1ad30 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   = WHERE_MULTI_O
1ad40 52 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  R;.      pNew->r
1ad50 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20  Setup = 0;.     
1ad60 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20   pNew->iSortIdx 
1ad70 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  = 0;.      memse
1ad80 74 28 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73  t(&pNew->u, 0, s
1ad90 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b  izeof(pNew->u));
1ada0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
1adb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1adc0 20 69 3c 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b   i<sSum.n; i++){
1add0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  .        /* TUNI
1ade0 4e 47 3a 20 43 75 72 72 65 6e 74 6c 79 20 73 53  NG: Currently sS
1adf0 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 69 73 20  um.a[i].rRun is 
1ae00 73 65 74 20 74 6f 20 74 68 65 20 73 75 6d 20 6f  set to the sum o
1ae10 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20 20 20  f the costs.    
1ae20 20 20 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 73 75      ** of all su
1ae30 62 2d 73 63 61 6e 73 20 72 65 71 75 69 72 65 64  b-scans required
1ae40 20 62 79 20 74 68 65 20 4f 52 2d 73 63 61 6e 2e   by the OR-scan.
1ae50 20 48 6f 77 65 76 65 72 2c 20 64 75 65 20 74 6f   However, due to
1ae60 20 72 6f 75 6e 64 69 6e 67 0a 20 20 20 20 20 20   rounding.      
1ae70 20 20 2a 2a 20 65 72 72 6f 72 73 2c 20 69 74 20    ** errors, it 
1ae80 6d 61 79 20 62 65 20 74 68 61 74 20 74 68 65 20  may be that the 
1ae90 63 6f 73 74 20 6f 66 20 74 68 65 20 4f 52 2d 73  cost of the OR-s
1aea0 63 61 6e 20 69 73 20 65 71 75 61 6c 20 74 6f 20  can is equal to 
1aeb0 69 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  its.        ** m
1aec0 6f 73 74 20 65 78 70 65 6e 73 69 76 65 20 73 75  ost expensive su
1aed0 62 2d 73 63 61 6e 2e 20 41 64 64 20 74 68 65 20  b-scan. Add the 
1aee0 73 6d 61 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c  smallest possibl
1aef0 65 20 70 65 6e 61 6c 74 79 20 0a 20 20 20 20 20  e penalty .     
1af00 20 20 20 2a 2a 20 28 65 71 75 69 76 61 6c 65 6e     ** (equivalen
1af10 74 20 74 6f 20 6d 75 6c 74 69 70 6c 79 69 6e 67  t to multiplying
1af20 20 74 68 65 20 63 6f 73 74 20 62 79 20 31 2e 30   the cost by 1.0
1af30 37 29 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  7) to ensure tha
1af40 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  t .        ** th
1af50 69 73 20 64 6f 65 73 20 6e 6f 74 20 68 61 70 70  is does not happ
1af60 65 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 66  en. Otherwise, f
1af70 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 73  or WHERE clauses
1af80 20 73 75 63 68 20 61 73 20 74 68 65 0a 20 20 20   such as the.   
1af90 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e       ** followin
1afa0 67 20 77 68 65 72 65 20 74 68 65 72 65 20 69 73  g where there is
1afb0 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 22 79 22   an index on "y"
1afc0 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
1afd0 20 20 20 20 20 2a 2a 20 20 20 20 20 57 48 45 52       **     WHER
1afe0 45 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 78 3d 3f  E likelihood(x=?
1aff0 2c 20 30 2e 39 39 29 20 4f 52 20 79 3d 3f 0a 20  , 0.99) OR y=?. 
1b000 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
1b010 20 20 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72    ** the planner
1b020 20 6d 61 79 20 65 6c 65 63 74 20 74 6f 20 22 4f   may elect to "O
1b030 52 22 20 74 6f 67 65 74 68 65 72 20 61 20 66 75  R" together a fu
1b040 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e 20 61 6e  ll-table scan an
1b050 64 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  d an.        ** 
1b060 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 2e 20 41 6e  index lookup. An
1b070 64 20 6f 74 68 65 72 20 73 69 6d 69 6c 61 72 6c  d other similarl
1b080 79 20 6f 64 64 20 72 65 73 75 6c 74 73 2e 20 20  y odd results.  
1b090 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  */.        pNew-
1b0a0 3e 72 52 75 6e 20 3d 20 73 53 75 6d 2e 61 5b 69  >rRun = sSum.a[i
1b0b0 5d 2e 72 52 75 6e 20 2b 20 31 3b 0a 20 20 20 20  ].rRun + 1;.    
1b0c0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
1b0d0 20 73 53 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b   sSum.a[i].nOut;
1b0e0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
1b0f0 72 65 72 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69  rereq = sSum.a[i
1b100 5d 2e 70 72 65 72 65 71 3b 0a 20 20 20 20 20 20  ].prereq;.      
1b110 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1b120 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
1b130 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a   pNew);.      }.
1b140 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
1b150 28 30 78 32 30 30 2c 20 28 22 45 6e 64 20 70 72  (0x200, ("End pr
1b160 6f 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75  ocessing OR-clau
1b170 73 65 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29  se %p\n", pTerm)
1b180 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1b190 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1b1a0 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65  ** Add all Where
1b1b0 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72  Loop objects for
1b1c0 20 61 6c 6c 20 74 61 62 6c 65 73 20 0a 2a 2f 0a   all tables .*/.
1b1d0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
1b1e0 4c 6f 6f 70 41 64 64 41 6c 6c 28 57 68 65 72 65  LoopAddAll(Where
1b1f0 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
1b200 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49  ilder){.  WhereI
1b210 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
1b220 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
1b230 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61    Bitmask mExtra
1b240 20 3d 20 30 3b 0a 20 20 42 69 74 6d 61 73 6b 20   = 0;.  Bitmask 
1b250 6d 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 69 6e  mPrior = 0;.  in
1b260 74 20 69 54 61 62 3b 0a 20 20 53 72 63 4c 69 73  t iTab;.  SrcLis
1b270 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57  t *pTabList = pW
1b280 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a  Info->pTabList;.
1b290 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1b2a0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1b2b0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1b2c0 74 65 6d 20 2a 70 45 6e 64 20 3d 20 26 70 54 61  tem *pEnd = &pTa
1b2d0 62 4c 69 73 74 2d 3e 61 5b 70 57 49 6e 66 6f 2d  bList->a[pWInfo-
1b2e0 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 73 71 6c 69  >nLevel];.  sqli
1b2f0 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f  te3 *db = pWInfo
1b300 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  ->pParse->db;.  
1b310 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1b320 4f 4b 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  OK;.  WhereLoop 
1b330 2a 70 4e 65 77 3b 0a 20 20 75 38 20 70 72 69 6f  *pNew;.  u8 prio
1b340 72 4a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 0a  rJointype = 0;..
1b350 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74    /* Loop over t
1b360 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  he tables in the
1b370 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74   join, from left
1b380 20 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20 70   to right */.  p
1b390 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
1b3a0 70 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f 6f  pNew;.  whereLoo
1b3b0 70 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20 66  pInit(pNew);.  f
1b3c0 6f 72 28 69 54 61 62 3d 30 2c 20 70 49 74 65 6d  or(iTab=0, pItem
1b3d0 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 70 49  =pTabList->a; pI
1b3e0 74 65 6d 3c 70 45 6e 64 3b 20 69 54 61 62 2b 2b  tem<pEnd; iTab++
1b3f0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1b400 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c  Bitmask mUnusabl
1b410 65 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  e = 0;.    pNew-
1b420 3e 69 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20  >iTab = iTab;.  
1b430 20 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66    pNew->maskSelf
1b440 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 47   = sqlite3WhereG
1b450 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e  etMask(&pWInfo->
1b460 73 4d 61 73 6b 53 65 74 2c 20 70 49 74 65 6d 2d  sMaskSet, pItem-
1b470 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69  >iCursor);.    i
1b480 66 28 20 28 28 70 49 74 65 6d 2d 3e 66 67 2e 6a  f( ((pItem->fg.j
1b490 6f 69 6e 74 79 70 65 7c 70 72 69 6f 72 4a 6f 69  ointype|priorJoi
1b4a0 6e 74 79 70 65 29 20 26 20 28 4a 54 5f 4c 45 46  ntype) & (JT_LEF
1b4b0 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 20  T|JT_CROSS))!=0 
1b4c0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
1b4d0 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72   condition is tr
1b4e0 75 65 20 77 68 65 6e 20 70 49 74 65 6d 20 69 73  ue when pItem is
1b4f0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1b500 20 74 65 72 6d 20 6f 6e 20 74 68 65 0a 20 20 20   term on the.   
1b510 20 20 20 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64     ** right-hand
1b520 2d 73 69 64 65 20 6f 66 20 61 20 4c 45 46 54 20  -side of a LEFT 
1b530 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 20  or CROSS JOIN.  
1b540 2a 2f 0a 20 20 20 20 20 20 6d 45 78 74 72 61 20  */.      mExtra 
1b550 3d 20 6d 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a  = mPrior;.    }.
1b560 20 20 20 20 70 72 69 6f 72 4a 6f 69 6e 74 79 70      priorJointyp
1b570 65 20 3d 20 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f  e = pItem->fg.jo
1b580 69 6e 74 79 70 65 3b 0a 20 20 20 20 69 66 28 20  intype;.    if( 
1b590 49 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d  IsVirtual(pItem-
1b5a0 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  >pTab) ){.      
1b5b0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1b5c0 74 65 6d 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f  tem *p;.      fo
1b5d0 72 28 70 3d 26 70 49 74 65 6d 5b 31 5d 3b 20 70  r(p=&pItem[1]; p
1b5e0 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20  <pEnd; p++){.   
1b5f0 20 20 20 20 20 69 66 28 20 6d 55 6e 75 73 61 62       if( mUnusab
1b600 6c 65 20 7c 7c 20 28 70 2d 3e 66 67 2e 6a 6f 69  le || (p->fg.joi
1b610 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54  ntype & (JT_LEFT
1b620 7c 4a 54 5f 43 52 4f 53 53 29 29 20 29 7b 0a 20  |JT_CROSS)) ){. 
1b630 20 20 20 20 20 20 20 20 20 6d 55 6e 75 73 61 62           mUnusab
1b640 6c 65 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65  le |= sqlite3Whe
1b650 72 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66  reGetMask(&pWInf
1b660 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  o->sMaskSet, p->
1b670 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
1b680 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1b690 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1b6a0 41 64 64 56 69 72 74 75 61 6c 28 70 42 75 69 6c  AddVirtual(pBuil
1b6b0 64 65 72 2c 20 6d 45 78 74 72 61 2c 20 6d 55 6e  der, mExtra, mUn
1b6c0 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d 65 6c  usable);.    }el
1b6d0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  se{.      rc = w
1b6e0 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
1b6f0 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72  (pBuilder, mExtr
1b700 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  a);.    }.    if
1b710 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b720 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  ){.      rc = wh
1b730 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75  ereLoopAddOr(pBu
1b740 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 2c 20 6d  ilder, mExtra, m
1b750 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d  Unusable);.    }
1b760 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70  .    mPrior |= p
1b770 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  New->maskSelf;. 
1b780 20 20 20 69 66 28 20 72 63 20 7c 7c 20 64 62 2d     if( rc || db-
1b790 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1b7a0 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68  break;.  }..  wh
1b7b0 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c  ereLoopClear(db,
1b7c0 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e   pNew);.  return
1b7d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78   rc;.}../*.** Ex
1b7e0 61 6d 69 6e 65 20 61 20 57 68 65 72 65 50 61 74  amine a WherePat
1b7f0 68 20 28 77 69 74 68 20 74 68 65 20 61 64 64 69  h (with the addi
1b800 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 78 74 72  tion of the extr
1b810 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74  a WhereLoop of t
1b820 68 65 20 35 74 68 0a 2a 2a 20 70 61 72 61 6d 65  he 5th.** parame
1b830 74 65 72 73 29 20 74 6f 20 73 65 65 20 69 66 20  ters) to see if 
1b840 69 74 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20  it outputs rows 
1b850 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
1b860 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72   ORDER BY.** (or
1b870 20 47 52 4f 55 50 20 42 59 29 20 77 69 74 68 6f   GROUP BY) witho
1b880 75 74 20 72 65 71 75 69 72 69 6e 67 20 61 20 73  ut requiring a s
1b890 65 70 61 72 61 74 65 20 73 6f 72 74 20 6f 70 65  eparate sort ope
1b8a0 72 61 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  ration.  Return 
1b8b0 4e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a  N:.** .**   N>0:
1b8c0 20 20 20 4e 20 74 65 72 6d 73 20 6f 66 20 74 68     N terms of th
1b8d0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1b8e0 65 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a  e are satisfied.
1b8f0 2a 2a 20 20 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74  **   N==0:  No t
1b900 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
1b910 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
1b920 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e  satisfied.**   N
1b930 3c 30 3a 20 20 20 55 6e 6b 6e 6f 77 6e 20 79 65  <0:   Unknown ye
1b940 74 20 68 6f 77 20 6d 61 6e 79 20 74 65 72 6d 73  t how many terms
1b950 20 6f 66 20 4f 52 44 45 52 20 42 59 20 6d 69 67   of ORDER BY mig
1b960 68 74 20 62 65 20 73 61 74 69 73 66 69 65 64 2e  ht be satisfied.
1b970 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74     .**.** Note t
1b980 68 61 74 20 70 72 6f 63 65 73 73 69 6e 67 20 66  hat processing f
1b990 6f 72 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59  or WHERE_GROUPBY
1b9a0 20 61 6e 64 20 57 48 45 52 45 5f 44 49 53 54 49   and WHERE_DISTI
1b9b0 4e 43 54 42 59 20 69 73 20 6e 6f 74 20 61 73 0a  NCTBY is not as.
1b9c0 2a 2a 20 73 74 72 69 63 74 2e 20 20 57 69 74 68  ** strict.  With
1b9d0 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49   GROUP BY and DI
1b9e0 53 54 49 4e 43 54 20 74 68 65 20 6f 6e 6c 79 20  STINCT the only 
1b9f0 72 65 71 75 69 72 65 6d 65 6e 74 20 69 73 20 74  requirement is t
1ba00 68 61 74 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e  hat.** equivalen
1ba10 74 20 72 6f 77 73 20 61 70 70 65 61 72 20 69 6d  t rows appear im
1ba20 6d 65 64 69 61 74 65 6c 79 20 61 64 6a 61 63 65  mediately adjace
1ba30 6e 74 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65  nt to one anothe
1ba40 72 2e 20 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20  r.  GROUP BY.** 
1ba50 61 6e 64 20 44 49 53 54 49 4e 43 54 20 64 6f 20  and DISTINCT do 
1ba60 6e 6f 74 20 72 65 71 75 69 72 65 20 72 6f 77 73  not require rows
1ba70 20 74 6f 20 61 70 70 65 61 72 20 69 6e 20 61 6e   to appear in an
1ba80 79 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64  y particular ord
1ba90 65 72 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73  er as long.** as
1baa0 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73   equivalent rows
1bab0 20 61 72 65 20 67 72 6f 75 70 65 64 20 74 6f 67   are grouped tog
1bac0 65 74 68 65 72 2e 20 20 54 68 75 73 20 66 6f 72  ether.  Thus for
1bad0 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49   GROUP BY and DI
1bae0 53 54 49 4e 43 54 0a 2a 2a 20 74 68 65 20 70 4f  STINCT.** the pO
1baf0 72 64 65 72 42 79 20 74 65 72 6d 73 20 63 61 6e  rderBy terms can
1bb00 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20 61   be matched in a
1bb10 6e 79 20 6f 72 64 65 72 2e 20 20 57 69 74 68 20  ny order.  With 
1bb20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 0a 2a  ORDER BY, the .*
1bb30 2a 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73  * pOrderBy terms
1bb40 20 6d 75 73 74 20 62 65 20 6d 61 74 63 68 65 64   must be matched
1bb50 20 69 6e 20 73 74 72 69 63 74 20 6c 65 66 74 2d   in strict left-
1bb60 74 6f 2d 72 69 67 68 74 20 6f 72 64 65 72 2e 0a  to-right order..
1bb70 2a 2f 0a 73 74 61 74 69 63 20 69 38 20 77 68 65  */.static i8 whe
1bb80 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f  rePathSatisfiesO
1bb90 72 64 65 72 42 79 28 0a 20 20 57 68 65 72 65 49  rderBy(.  WhereI
1bba0 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20  nfo *pWInfo,    
1bbb0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
1bbc0 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
1bbd0 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f  t *pOrderBy,   /
1bbe0 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  * ORDER BY or GR
1bbf0 4f 55 50 20 42 59 20 6f 72 20 44 49 53 54 49 4e  OUP BY or DISTIN
1bc00 43 54 20 63 6c 61 75 73 65 20 74 6f 20 63 68 65  CT clause to che
1bc10 63 6b 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  ck */.  WherePat
1bc20 68 20 2a 70 50 61 74 68 2c 20 20 20 20 20 2f 2a  h *pPath,     /*
1bc30 20 54 68 65 20 57 68 65 72 65 50 61 74 68 20 74   The WherePath t
1bc40 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36  o check */.  u16
1bc50 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20   wctrlFlags,    
1bc60 20 20 20 2f 2a 20 4d 69 67 68 74 20 63 6f 6e 74     /* Might cont
1bc70 61 69 6e 20 57 48 45 52 45 5f 47 52 4f 55 50 42  ain WHERE_GROUPB
1bc80 59 20 6f 72 20 57 48 45 52 45 5f 44 49 53 54 49  Y or WHERE_DISTI
1bc90 4e 43 54 42 59 20 2a 2f 0a 20 20 75 31 36 20 6e  NCTBY */.  u16 n
1bca0 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  Loop,           
1bcb0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
1bcc0 74 72 69 65 73 20 69 6e 20 70 50 61 74 68 2d 3e  tries in pPath->
1bcd0 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68 65  aLoop[] */.  Whe
1bce0 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20  reLoop *pLast,  
1bcf0 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 57     /* Add this W
1bd00 68 65 72 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20  hereLoop to the 
1bd10 65 6e 64 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c  end of pPath->aL
1bd20 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61  oop[] */.  Bitma
1bd30 73 6b 20 2a 70 52 65 76 4d 61 73 6b 20 20 20 20  sk *pRevMask    
1bd40 20 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66   /* OUT: Mask of
1bd50 20 57 68 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72   WhereLoops to r
1bd60 75 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  un in reverse or
1bd70 64 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72  der */.){.  u8 r
1bd80 65 76 53 65 74 3b 20 20 20 20 20 20 20 20 20 20  evSet;          
1bd90 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 76    /* True if rev
1bda0 20 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75   is known */.  u
1bdb0 38 20 72 65 76 3b 20 20 20 20 20 20 20 20 20 20  8 rev;          
1bdc0 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74       /* Composit
1bdd0 65 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a  e sort order */.
1bde0 20 20 75 38 20 72 65 76 49 64 78 3b 20 20 20 20    u8 revIdx;    
1bdf0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1be00 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20   sort order */. 
1be10 20 75 38 20 69 73 4f 72 64 65 72 44 69 73 74 69   u8 isOrderDisti
1be20 6e 63 74 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72  nct;   /* All pr
1be30 69 6f 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 61  ior WhereLoops a
1be40 72 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  re order-distinc
1be50 74 20 2a 2f 0a 20 20 75 38 20 64 69 73 74 69 6e  t */.  u8 distin
1be60 63 74 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20  ctColumns;   /* 
1be70 54 72 75 65 20 69 66 20 74 68 65 20 6c 6f 6f 70  True if the loop
1be80 20 68 61 73 20 55 4e 49 51 55 45 20 4e 4f 54 20   has UNIQUE NOT 
1be90 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  NULL columns */.
1bea0 20 20 75 38 20 69 73 4d 61 74 63 68 3b 20 20 20    u8 isMatch;   
1beb0 20 20 20 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75          /* iColu
1bec0 6d 6e 20 6d 61 74 63 68 65 73 20 61 20 74 65 72  mn matches a ter
1bed0 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  m of the ORDER B
1bee0 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31  Y clause */.  u1
1bef0 36 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20  6 nKeyCol;      
1bf00 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1bf10 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   key columns in 
1bf20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20  pIndex */.  u16 
1bf30 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20  nColumn;        
1bf40 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
1bf50 72 20 6f 66 20 6f 72 64 65 72 65 64 20 63 6f 6c  r of ordered col
1bf60 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65  umns in the inde
1bf70 78 20 2a 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65  x */.  u16 nOrde
1bf80 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rBy;         /* 
1bf90 4e 75 6d 62 65 72 20 74 65 72 6d 73 20 69 6e 20  Number terms in 
1bfa0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1bfb0 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f  use */.  int iLo
1bfc0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  op;            /
1bfd0 2a 20 49 6e 64 65 78 20 6f 66 20 57 68 65 72 65  * Index of Where
1bfe0 4c 6f 6f 70 20 69 6e 20 70 50 61 74 68 20 62 65  Loop in pPath be
1bff0 69 6e 67 20 70 72 6f 63 65 73 73 65 64 20 2a 2f  ing processed */
1c000 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
1c010 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1c020 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
1c030 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
1c040 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
1c050 75 6d 62 65 72 20 66 6f 72 20 63 75 72 72 65 6e  umber for curren
1c060 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20  t WhereLoop */. 
1c070 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20   int iColumn;   
1c080 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75         /* A colu
1c090 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e  mn number within
1c0a0 20 74 61 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20   table iCur */. 
1c0b0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
1c0c0 70 20 3d 20 30 3b 20 2f 2a 20 43 75 72 72 65 6e  p = 0; /* Curren
1c0d0 74 20 57 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e  t WhereLoop bein
1c0e0 67 20 70 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a  g processed. */.
1c0f0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
1c100 72 6d 3b 20 20 20 20 20 2f 2a 20 41 20 73 69 6e  rm;     /* A sin
1c110 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20  gle term of the 
1c120 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
1c130 20 20 45 78 70 72 20 2a 70 4f 42 45 78 70 72 3b    Expr *pOBExpr;
1c140 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
1c150 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68  pression from th
1c160 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1c170 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  e */.  CollSeq *
1c180 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20  pColl;       /* 
1c190 43 4f 4c 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e  COLLATE function
1c1a0 20 66 72 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42   from an ORDER B
1c1b0 59 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f  Y clause term */
1c1c0 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
1c1d0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
1c1e0 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
1c1f0 20 77 69 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20   with pLoop */. 
1c200 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1c210 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
1c220 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  b;  /* Database 
1c230 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
1c240 42 69 74 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20  Bitmask obSat = 
1c250 30 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66  0;    /* Mask of
1c260 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
1c270 73 61 74 69 73 66 69 65 64 20 73 6f 20 66 61 72  satisfied so far
1c280 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62   */.  Bitmask ob
1c290 44 6f 6e 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d  Done;       /* M
1c2a0 61 73 6b 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52  ask of all ORDER
1c2b0 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42   BY terms */.  B
1c2c0 69 74 6d 61 73 6b 20 6f 72 64 65 72 44 69 73 74  itmask orderDist
1c2d0 69 6e 63 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61  inctMask;  /* Ma
1c2e0 73 6b 20 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f  sk of all well-o
1c2f0 72 64 65 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a  rdered loops */.
1c300 20 20 42 69 74 6d 61 73 6b 20 72 65 61 64 79 3b    Bitmask ready;
1c310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c320 20 4d 61 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c   Mask of inner l
1c330 6f 6f 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20  oops */..  /*.  
1c340 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20 57 68  ** We say the Wh
1c350 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d  ereLoop is "one-
1c360 72 6f 77 22 20 69 66 20 69 74 20 67 65 6e 65 72  row" if it gener
1c370 61 74 65 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61  ates no more tha
1c380 6e 20 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f  n one.  ** row o
1c390 66 20 6f 75 74 70 75 74 2e 20 20 41 20 57 68 65  f output.  A Whe
1c3a0 72 65 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f  reLoop is one-ro
1c3b0 77 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  w if all of the 
1c3c0 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
1c3d0 75 65 3a 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c  ue:.  **  (a) Al
1c3e0 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  l index columns 
1c3f0 6d 61 74 63 68 20 77 69 74 68 20 57 48 45 52 45  match with WHERE
1c400 5f 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a  _COLUMN_EQ..  **
1c410 20 20 28 62 29 20 54 68 65 20 69 6e 64 65 78 20    (b) The index 
1c420 69 73 20 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41  is unique.  ** A
1c430 6e 79 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74  ny WhereLoop wit
1c440 68 20 61 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d  h an WHERE_COLUM
1c450 4e 5f 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20  N_EQ constraint 
1c460 6f 6e 20 74 68 65 20 72 6f 77 69 64 20 69 73 20  on the rowid is 
1c470 6f 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76  one-row..  ** Ev
1c480 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72  ery one-row Wher
1c490 65 4c 6f 6f 70 20 77 69 6c 6c 20 68 61 76 65 20  eLoop will have 
1c4a0 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  the WHERE_ONEROW
1c4b0 20 62 69 74 20 73 65 74 20 69 6e 20 77 73 46 6c   bit set in wsFl
1c4c0 61 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ags..  **.  ** W
1c4d0 65 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c  e say the WhereL
1c4e0 6f 6f 70 20 69 73 20 22 6f 72 64 65 72 2d 64 69  oop is "order-di
1c4f0 73 74 69 6e 63 74 22 20 69 66 20 74 68 65 20 73  stinct" if the s
1c500 65 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72  et of columns fr
1c510 6f 6d 0a 20 20 2a 2a 20 74 68 61 74 20 57 68 65  om.  ** that Whe
1c520 72 65 4c 6f 6f 70 20 74 68 61 74 20 61 72 65 20  reLoop that are 
1c530 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
1c540 63 6c 61 75 73 65 20 61 72 65 20 64 69 66 66 65  clause are diffe
1c550 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 0a 20  rent for every. 
1c560 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 57   ** row of the W
1c570 68 65 72 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79  hereLoop.  Every
1c580 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f   one-row WhereLo
1c590 6f 70 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  op is automatica
1c5a0 6c 6c 79 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64  lly.  ** order-d
1c5b0 69 73 74 69 6e 63 74 2e 20 20 20 41 20 57 68 65  istinct.   A Whe
1c5c0 72 65 4c 6f 6f 70 20 74 68 61 74 20 68 61 73 20  reLoop that has 
1c5d0 6e 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  no columns in th
1c5e0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1c5f0 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72  e.  ** is not or
1c600 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f  der-distinct. To
1c610 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e   be order-distin
1c620 63 74 20 69 73 20 6e 6f 74 20 71 75 69 74 65 20  ct is not quite 
1c630 74 68 65 20 73 61 6d 65 20 61 73 20 62 65 69 6e  the same as bein
1c640 67 0a 20 20 2a 2a 20 55 4e 49 51 55 45 20 73 69  g.  ** UNIQUE si
1c650 6e 63 65 20 61 20 55 4e 49 51 55 45 20 63 6f 6c  nce a UNIQUE col
1c660 75 6d 6e 20 6f 72 20 69 6e 64 65 78 20 63 61 6e  umn or index can
1c670 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 72   have multiple r
1c680 6f 77 73 20 74 68 61 74 20 0a 20 20 2a 2a 20 61  ows that .  ** a
1c690 72 65 20 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c  re NULL and NULL
1c6a0 20 76 61 6c 75 65 73 20 61 72 65 20 65 71 75 69   values are equi
1c6b0 76 61 6c 65 6e 74 20 66 6f 72 20 74 68 65 20 70  valent for the p
1c6c0 75 72 70 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d  urpose of order-
1c6d0 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54  distinct..  ** T
1c6e0 6f 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69  o be order-disti
1c6f0 6e 63 74 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73  nct, the columns
1c700 20 6d 75 73 74 20 62 65 20 55 4e 49 51 55 45 20   must be UNIQUE 
1c710 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20  and NOT NULL..  
1c720 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 6f 77 69  **.  ** The rowi
1c730 64 20 66 6f 72 20 61 20 74 61 62 6c 65 20 69 73  d for a table is
1c740 20 61 6c 77 61 79 73 20 55 4e 49 51 55 45 20 61   always UNIQUE a
1c750 6e 64 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77  nd NOT NULL so w
1c760 68 65 6e 65 76 65 72 20 74 68 65 0a 20 20 2a 2a  henever the.  **
1c770 20 72 6f 77 69 64 20 61 70 70 65 61 72 73 20 69   rowid appears i
1c780 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
1c790 6c 61 75 73 65 2c 20 74 68 65 20 63 6f 72 72 65  lause, the corre
1c7a0 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f  sponding WhereLo
1c7b0 6f 70 20 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d  op is.  ** autom
1c7c0 61 74 69 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64  atically order-d
1c7d0 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20  istinct..  */.. 
1c7e0 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
1c7f0 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 4c  y!=0 );.  if( nL
1c800 6f 6f 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  oop && Optimizat
1c810 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20  ionDisabled(db, 
1c820 53 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64  SQLITE_OrderById
1c830 78 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20  xJoin) ) return 
1c840 30 3b 0a 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d  0;..  nOrderBy =
1c850 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
1c860 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 4f  ;.  testcase( nO
1c870 72 64 65 72 42 79 3d 3d 42 4d 53 2d 31 20 29 3b  rderBy==BMS-1 );
1c880 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 3e  .  if( nOrderBy>
1c890 42 4d 53 2d 31 20 29 20 72 65 74 75 72 6e 20 30  BMS-1 ) return 0
1c8a0 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74  ;  /* Cannot opt
1c8b0 69 6d 69 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72  imize overly lar
1c8c0 67 65 20 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a  ge ORDER BYs */.
1c8d0 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
1c8e0 74 20 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20  t = 1;.  obDone 
1c8f0 3d 20 4d 41 53 4b 42 49 54 28 6e 4f 72 64 65 72  = MASKBIT(nOrder
1c900 42 79 29 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69  By)-1;.  orderDi
1c910 73 74 69 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a  stinctMask = 0;.
1c920 20 20 72 65 61 64 79 20 3d 20 30 3b 0a 20 20 66    ready = 0;.  f
1c930 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72  or(iLoop=0; isOr
1c940 64 65 72 44 69 73 74 69 6e 63 74 20 26 26 20 6f  derDistinct && o
1c950 62 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20 69  bSat<obDone && i
1c960 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f  Loop<=nLoop; iLo
1c970 6f 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69  op++){.    if( i
1c980 4c 6f 6f 70 3e 30 20 29 20 72 65 61 64 79 20 7c  Loop>0 ) ready |
1c990 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  = pLoop->maskSel
1c9a0 66 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 69  f;.    pLoop = i
1c9b0 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61  Loop<nLoop ? pPa
1c9c0 74 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d  th->aLoop[iLoop]
1c9d0 20 3a 20 70 4c 61 73 74 3b 0a 20 20 20 20 69 66   : pLast;.    if
1c9e0 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
1c9f0 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
1ca00 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 69  TABLE ){.      i
1ca10 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62  f( pLoop->u.vtab
1ca20 2e 69 73 4f 72 64 65 72 65 64 20 29 20 6f 62 53  .isOrdered ) obS
1ca30 61 74 20 3d 20 6f 62 44 6f 6e 65 3b 0a 20 20 20  at = obDone;.   
1ca40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1ca50 20 20 20 20 69 43 75 72 20 3d 20 70 57 49 6e 66      iCur = pWInf
1ca60 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
1ca70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72  Loop->iTab].iCur
1ca80 73 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72  sor;..    /* Mar
1ca90 6b 20 6f 66 66 20 61 6e 79 20 4f 52 44 45 52 20  k off any ORDER 
1caa0 42 59 20 74 65 72 6d 20 58 20 74 68 61 74 20 69  BY term X that i
1cab0 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  s a column in th
1cac0 65 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a  e table of.    *
1cad0 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  * the current lo
1cae0 6f 70 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  op for which the
1caf0 72 65 20 69 73 20 74 65 72 6d 20 69 6e 20 74 68  re is term in th
1cb00 65 20 57 48 45 52 45 0a 20 20 20 20 2a 2a 20 63  e WHERE.    ** c
1cb10 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72  lause of the for
1cb20 6d 20 58 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58  m X IS NULL or X
1cb30 3d 3f 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  =? that referenc
1cb40 65 20 6f 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20  e only outer.   
1cb50 20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a   ** loops..    *
1cb60 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
1cb70 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
1cb80 0a 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42  .      if( MASKB
1cb90 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20  IT(i) & obSat ) 
1cba0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1cbb0 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65  pOBExpr = sqlite
1cbc0 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
1cbd0 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e  (pOrderBy->a[i].
1cbe0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  pExpr);.      if
1cbf0 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54  ( pOBExpr->op!=T
1cc00 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69  K_COLUMN ) conti
1cc10 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  nue;.      if( p
1cc20 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d  OBExpr->iTable!=
1cc30 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  iCur ) continue;
1cc40 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 73  .      pTerm = s
1cc50 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64 54  qlite3WhereFindT
1cc60 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  erm(&pWInfo->sWC
1cc70 2c 20 69 43 75 72 2c 20 70 4f 42 45 78 70 72 2d  , iCur, pOBExpr-
1cc80 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  >iColumn,.      
1cc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cca0 20 7e 72 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57   ~ready, WO_EQ|W
1ccb0 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 2c 20  O_ISNULL|WO_IS, 
1ccc0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  0);.      if( pT
1ccd0 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  erm==0 ) continu
1cce0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  e;.      if( (pT
1ccf0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28  erm->eOperator&(
1cd00 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30  WO_EQ|WO_IS))!=0
1cd10 20 26 26 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f   && pOBExpr->iCo
1cd20 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20  lumn>=0 ){.     
1cd30 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1cd40 31 2c 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20  1, *z2;.        
1cd50 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
1cd60 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66  xprCollSeq(pWInf
1cd70 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65  o->pParse, pOrde
1cd80 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  rBy->a[i].pExpr)
1cd90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
1cda0 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
1cdb0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
1cdc0 20 20 20 20 20 20 7a 31 20 3d 20 70 43 6f 6c 6c        z1 = pColl
1cdd0 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
1cde0 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
1cdf0 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e  ExprCollSeq(pWIn
1ce00 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 54 65 72  fo->pParse, pTer
1ce10 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
1ce20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
1ce30 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
1ce40 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a  tColl;.        z
1ce50 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  2 = pColl->zName
1ce60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
1ce70 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c  lite3StrICmp(z1,
1ce80 20 7a 32 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e   z2)!=0 ) contin
1ce90 75 65 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ue;.        test
1cea0 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78  case( pTerm->pEx
1ceb0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b  pr->op==TK_IS );
1cec0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6f  .      }.      o
1ced0 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28  bSat |= MASKBIT(
1cee0 69 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  i);.    }..    i
1cef0 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
1cf00 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f  gs & WHERE_ONERO
1cf10 57 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  W)==0 ){.      i
1cf20 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1cf30 73 20 26 20 57 48 45 52 45 5f 49 50 4b 20 29 7b  s & WHERE_IPK ){
1cf40 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 20  .        pIndex 
1cf50 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 4b 65  = 0;.        nKe
1cf60 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  yCol = 0;.      
1cf70 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20    nColumn = 1;. 
1cf80 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
1cf90 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e  pIndex = pLoop->
1cfa0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3d  u.btree.pIndex)=
1cfb0 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 62 55  =0 || pIndex->bU
1cfc0 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20  nordered ){.    
1cfd0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1cfe0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1cff0 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 70 49 6e     nKeyCol = pIn
1d000 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20  dex->nKeyCol;.  
1d010 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20        nColumn = 
1d020 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  pIndex->nColumn;
1d030 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1d040 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f   nColumn==nKeyCo
1d050 6c 2b 31 20 7c 7c 20 21 48 61 73 52 6f 77 69 64  l+1 || !HasRowid
1d060 28 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29  (pIndex->pTable)
1d070 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
1d080 72 74 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  rt( pIndex->aiCo
1d090 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d  lumn[nColumn-1]=
1d0a0 3d 28 2d 31 29 20 7c 7c 20 21 48 61 73 52 6f 77  =(-1) || !HasRow
1d0b0 69 64 28 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  id(pIndex->pTabl
1d0c0 65 29 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f  e));.        isO
1d0d0 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 49  rderDistinct = I
1d0e0 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e  sUniqueIndex(pIn
1d0f0 64 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  dex);.      }.. 
1d100 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72       /* Loop thr
1d110 6f 75 67 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  ough all columns
1d120 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e   of the index an
1d130 64 20 64 65 61 6c 20 77 69 74 68 20 74 68 65 20  d deal with the 
1d140 6f 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68  ones.      ** th
1d150 61 74 20 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74  at are not const
1d160 72 61 69 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20  rained by == or 
1d170 49 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  IN..      */.   
1d180 20 20 20 72 65 76 20 3d 20 72 65 76 53 65 74 20     rev = revSet 
1d190 3d 20 30 3b 0a 20 20 20 20 20 20 64 69 73 74 69  = 0;.      disti
1d1a0 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a  nctColumns = 0;.
1d1b0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
1d1c0 3c 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a  <nColumn; j++){.
1d1d0 20 20 20 20 20 20 20 20 75 38 20 62 4f 6e 63 65          u8 bOnce
1d1e0 3b 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72  ;   /* True to r
1d1f0 75 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  un the ORDER BY 
1d200 73 65 61 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a  search loop */..
1d210 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20          /* Skip 
1d220 6f 76 65 72 20 3d 3d 20 61 6e 64 20 49 53 20 4e  over == and IS N
1d230 55 4c 4c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  ULL terms */.   
1d240 20 20 20 20 20 69 66 28 20 6a 3c 70 4c 6f 6f 70       if( j<pLoop
1d250 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20  ->u.btree.nEq.  
1d260 20 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d         && pLoop-
1d270 3e 6e 53 6b 69 70 3d 3d 30 0a 20 20 20 20 20 20  >nSkip==0.      
1d280 20 20 20 26 26 20 28 28 69 20 3d 20 70 4c 6f 6f     && ((i = pLoo
1d290 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f  p->aLTerm[j]->eO
1d2a0 70 65 72 61 74 6f 72 29 20 26 20 28 57 4f 5f 45  perator) & (WO_E
1d2b0 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49  Q|WO_ISNULL|WO_I
1d2c0 53 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 29  S))!=0.        )
1d2d0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1d2e0 69 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b  i & WO_ISNULL ){
1d2f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
1d300 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69  tcase( isOrderDi
1d310 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20  stinct );.      
1d320 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
1d330 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20  tinct = 0;.     
1d340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1d350 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20   continue;  .   
1d360 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1d370 2f 2a 20 47 65 74 20 74 68 65 20 63 6f 6c 75 6d  /* Get the colum
1d380 6e 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20  n number in the 
1d390 74 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e 29 20  table (iColumn) 
1d3a0 61 6e 64 20 73 6f 72 74 20 6f 72 64 65 72 0a 20  and sort order. 
1d3b0 20 20 20 20 20 20 20 2a 2a 20 28 72 65 76 49 64         ** (revId
1d3c0 78 29 20 66 6f 72 20 74 68 65 20 6a 2d 74 68 20  x) for the j-th 
1d3d0 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
1d3e0 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  dex..        */.
1d3f0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 64          if( pInd
1d400 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ex ){.          
1d410 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78  iColumn = pIndex
1d420 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
1d430 20 20 20 20 20 20 20 20 20 72 65 76 49 64 78 20           revIdx 
1d440 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f  = pIndex->aSortO
1d450 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  rder[j];.       
1d460 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d     if( iColumn==
1d470 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
1d480 69 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20  iPKey ) iColumn 
1d490 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  = -1;.        }e
1d4a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
1d4b0 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
1d4c0 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20         revIdx = 
1d4d0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
1d4e0 20 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f        /* An unco
1d4f0 6e 73 74 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e  nstrained column
1d500 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 4e   that might be N
1d510 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ULL means that t
1d520 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 57  his.        ** W
1d530 68 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20  hereLoop is not 
1d540 77 65 6c 6c 2d 6f 72 64 65 72 65 64 0a 20 20 20  well-ordered.   
1d550 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1d560 69 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  if( isOrderDisti
1d570 6e 63 74 0a 20 20 20 20 20 20 20 20 20 26 26 20  nct.         && 
1d580 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20  iColumn>=0.     
1d590 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d      && j>=pLoop-
1d5a0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20  >u.btree.nEq.   
1d5b0 20 20 20 20 20 20 26 26 20 70 49 6e 64 65 78 2d        && pIndex-
1d5c0 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43  >pTable->aCol[iC
1d5d0 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d  olumn].notNull==
1d5e0 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  0.        ){.   
1d5f0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
1d600 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20  stinct = 0;.    
1d610 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
1d620 2a 20 46 69 6e 64 20 74 68 65 20 4f 52 44 45 52  * Find the ORDER
1d630 20 42 59 20 74 65 72 6d 20 74 68 61 74 20 63 6f   BY term that co
1d640 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
1d650 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20   j-th column.   
1d660 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 69       ** of the i
1d670 6e 64 65 78 20 61 6e 64 20 6d 61 72 6b 20 74 68  ndex and mark th
1d680 61 74 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  at ORDER BY term
1d690 20 6f 66 66 20 0a 20 20 20 20 20 20 20 20 2a 2f   off .        */
1d6a0 0a 20 20 20 20 20 20 20 20 62 4f 6e 63 65 20 3d  .        bOnce =
1d6b0 20 31 3b 0a 20 20 20 20 20 20 20 20 69 73 4d 61   1;.        isMa
1d6c0 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tch = 0;.       
1d6d0 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20   for(i=0; bOnce 
1d6e0 26 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  && i<nOrderBy; i
1d6f0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
1d700 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20  f( MASKBIT(i) & 
1d710 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65  obSat ) continue
1d720 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 42 45  ;.          pOBE
1d730 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
1d740 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72  rSkipCollate(pOr
1d750 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
1d760 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  r);.          te
1d770 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61  stcase( wctrlFla
1d780 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50  gs & WHERE_GROUP
1d790 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  BY );.          
1d7a0 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46  testcase( wctrlF
1d7b0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53  lags & WHERE_DIS
1d7c0 54 49 4e 43 54 42 59 20 29 3b 0a 20 20 20 20 20  TINCTBY );.     
1d7d0 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46       if( (wctrlF
1d7e0 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 47 52  lags & (WHERE_GR
1d7f0 4f 55 50 42 59 7c 57 48 45 52 45 5f 44 49 53 54  OUPBY|WHERE_DIST
1d800 49 4e 43 54 42 59 29 29 3d 3d 30 20 29 20 62 4f  INCTBY))==0 ) bO
1d810 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nce = 0;.       
1d820 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
1d830 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
1d840 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1d850 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
1d860 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20  >iTable!=iCur ) 
1d870 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1d880 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
1d890 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d  >iColumn!=iColum
1d8a0 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  n ) continue;.  
1d8b0 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
1d8c0 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn>=0 ){.      
1d8d0 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
1d8e0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1d8f0 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c  (pWInfo->pParse,
1d900 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
1d910 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
1d920 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
1d930 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
1d940 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
1d950 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1d960 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e  trICmp(pColl->zN
1d970 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43  ame, pIndex->azC
1d980 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e  oll[j])!=0 ) con
1d990 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
1d9a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 73 4d   }.          isM
1d9b0 61 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20  atch = 1;.      
1d9c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1d9d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1d9e0 20 69 73 4d 61 74 63 68 20 26 26 20 28 77 63 74   isMatch && (wct
1d9f0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
1da00 47 52 4f 55 50 42 59 29 3d 3d 30 20 29 7b 0a 20  GROUPBY)==0 ){. 
1da10 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65           /* Make
1da20 20 73 75 72 65 20 74 68 65 20 73 6f 72 74 20 6f   sure the sort o
1da30 72 64 65 72 20 69 73 20 63 6f 6d 70 61 74 69 62  rder is compatib
1da40 6c 65 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42  le in an ORDER B
1da50 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20  Y clause..      
1da60 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65      ** Sort orde
1da70 72 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74 20  r is irrelevant 
1da80 66 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20 63  for a GROUP BY c
1da90 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20  lause. */.      
1daa0 20 20 20 20 69 66 28 20 72 65 76 53 65 74 20 29      if( revSet )
1dab0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
1dac0 28 20 28 72 65 76 20 5e 20 72 65 76 49 64 78 29  ( (rev ^ revIdx)
1dad0 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  !=pOrderBy->a[i]
1dae0 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 69 73 4d  .sortOrder ) isM
1daf0 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  atch = 0;.      
1db00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1db10 20 20 20 20 20 20 20 72 65 76 20 3d 20 72 65 76         rev = rev
1db20 49 64 78 20 5e 20 70 4f 72 64 65 72 42 79 2d 3e  Idx ^ pOrderBy->
1db30 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
1db40 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1db50 72 65 76 20 29 20 2a 70 52 65 76 4d 61 73 6b 20  rev ) *pRevMask 
1db60 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70  |= MASKBIT(iLoop
1db70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
1db80 65 76 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20  evSet = 1;.     
1db90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1dba0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4d  .        if( isM
1dbb0 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20  atch ){.        
1dbc0 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20    if( iColumn<0 
1dbd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ){.            t
1dbe0 65 73 74 63 61 73 65 28 20 64 69 73 74 69 6e 63  estcase( distinc
1dbf0 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20  tColumns==0 );. 
1dc00 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 69             disti
1dc10 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a  nctColumns = 1;.
1dc20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1dc30 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d        obSat |= M
1dc40 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20  ASKBIT(i);.     
1dc50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1dc60 20 20 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20      /* No match 
1dc70 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20  found */.       
1dc80 20 20 20 69 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a     if( j==0 || j
1dc90 3c 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20  <nKeyCol ){.    
1dca0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1dcb0 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ( isOrderDistinc
1dcc0 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
1dcd0 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
1dce0 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nct = 0;.       
1dcf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
1dd00 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
1dd10 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 4c        } /* end L
1dd20 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64  oop over all ind
1dd30 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  ex columns */.  
1dd40 20 20 20 20 69 66 28 20 64 69 73 74 69 6e 63 74      if( distinct
1dd50 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20 20 20 20  Columns ){.     
1dd60 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f     testcase( isO
1dd70 72 64 65 72 44 69 73 74 69 6e 63 74 3d 3d 30 20  rderDistinct==0 
1dd80 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64  );.        isOrd
1dd90 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a  erDistinct = 1;.
1dda0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a        }.    } /*
1ddb0 20 65 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d   end-if not one-
1ddc0 72 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d  row */..    /* M
1ddd0 61 72 6b 20 6f 66 66 20 61 6e 79 20 6f 74 68 65  ark off any othe
1dde0 72 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  r ORDER BY terms
1ddf0 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20   that reference 
1de00 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28  pLoop */.    if(
1de10 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
1de20 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 44   ){.      orderD
1de30 69 73 74 69 6e 63 74 4d 61 73 6b 20 7c 3d 20 70  istinctMask |= p
1de40 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  Loop->maskSelf;.
1de50 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1de60 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
1de70 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
1de80 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  ;.        Bitmas
1de90 6b 20 6d 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  k mTerm;.       
1dea0 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20   if( MASKBIT(i) 
1deb0 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e  & obSat ) contin
1dec0 75 65 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20  ue;.        p = 
1ded0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
1dee0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6d 54  Expr;.        mT
1def0 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65  erm = sqlite3Whe
1df00 72 65 45 78 70 72 55 73 61 67 65 28 26 70 57 49  reExprUsage(&pWI
1df10 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 70 29  nfo->sMaskSet,p)
1df20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 54  ;.        if( mT
1df30 65 72 6d 3d 3d 30 20 26 26 20 21 73 71 6c 69 74  erm==0 && !sqlit
1df40 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
1df50 28 70 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  (p) ) continue;.
1df60 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 54 65          if( (mTe
1df70 72 6d 26 7e 6f 72 64 65 72 44 69 73 74 69 6e 63  rm&~orderDistinc
1df80 74 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  tMask)==0 ){.   
1df90 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20         obSat |= 
1dfa0 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20  MASKBIT(i);.    
1dfb0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1dfc0 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 74    }.  } /* End t
1dfd0 68 65 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  he loop over all
1dfe0 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 72 6f 6d   WhereLoops from
1dff0 20 6f 75 74 65 72 2d 6d 6f 73 74 20 64 6f 77 6e   outer-most down
1e000 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a   to inner-most *
1e010 2f 0a 20 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f  /.  if( obSat==o
1e020 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 28  bDone ) return (
1e030 69 38 29 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69  i8)nOrderBy;.  i
1e040 66 28 20 21 69 73 4f 72 64 65 72 44 69 73 74 69  f( !isOrderDisti
1e050 6e 63 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  nct ){.    for(i
1e060 3d 6e 4f 72 64 65 72 42 79 2d 31 3b 20 69 3e 30  =nOrderBy-1; i>0
1e070 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69  ; i--){.      Bi
1e080 74 6d 61 73 6b 20 6d 20 3d 20 4d 41 53 4b 42 49  tmask m = MASKBI
1e090 54 28 69 29 20 2d 20 31 3b 0a 20 20 20 20 20 20  T(i) - 1;.      
1e0a0 69 66 28 20 28 6f 62 53 61 74 26 6d 29 3d 3d 6d  if( (obSat&m)==m
1e0b0 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20   ) return i;.   
1e0c0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b   }.    return 0;
1e0d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
1e0e0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ;.}.../*.** If t
1e0f0 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59  he WHERE_GROUPBY
1e100 20 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20   flag is set in 
1e110 74 68 65 20 6d 61 73 6b 20 70 61 73 73 65 64 20  the mask passed 
1e120 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
1e130 65 67 69 6e 28 29 2c 0a 2a 2a 20 74 68 65 20 70  egin(),.** the p
1e140 6c 61 6e 6e 65 72 20 61 73 73 75 6d 65 73 20 74  lanner assumes t
1e150 68 61 74 20 74 68 65 20 73 70 65 63 69 66 69 65  hat the specifie
1e160 64 20 70 4f 72 64 65 72 42 79 20 6c 69 73 74 20  d pOrderBy list 
1e170 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 47 52  is actually a GR
1e180 4f 55 50 0a 2a 2a 20 42 59 20 63 6c 61 75 73 65  OUP.** BY clause
1e190 20 2d 20 61 6e 64 20 73 6f 20 61 6e 79 20 6f 72   - and so any or
1e1a0 64 65 72 20 74 68 61 74 20 67 72 6f 75 70 73 20  der that groups 
1e1b0 72 6f 77 73 20 61 73 20 72 65 71 75 69 72 65 64  rows as required
1e1c0 20 73 61 74 69 73 66 69 65 73 20 74 68 65 0a 2a   satisfies the.*
1e1d0 2a 20 72 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a  * request..**.**
1e1e0 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 6e 20 74 68   Normally, in th
1e1f0 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f  is case it is no
1e200 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  t possible for t
1e210 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 64 65 74  he caller to det
1e220 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65  ermine.** whethe
1e230 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 72 6f 77  r or not the row
1e240 73 20 61 72 65 20 72 65 61 6c 6c 79 20 62 65 69  s are really bei
1e250 6e 67 20 64 65 6c 69 76 65 72 65 64 20 69 6e 20  ng delivered in 
1e260 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20 6f 72  sorted order, or
1e270 0a 2a 2a 20 6a 75 73 74 20 69 6e 20 73 6f 6d 65  .** just in some
1e280 20 6f 74 68 65 72 20 6f 72 64 65 72 20 74 68 61   other order tha
1e290 74 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 72  t provides the r
1e2a0 65 71 75 69 72 65 64 20 67 72 6f 75 70 69 6e 67  equired grouping
1e2b0 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66  . However,.** if
1e2c0 20 74 68 65 20 57 48 45 52 45 5f 53 4f 52 54 42   the WHERE_SORTB
1e2d0 59 47 52 4f 55 50 20 66 6c 61 67 20 69 73 20 61  YGROUP flag is a
1e2e0 6c 73 6f 20 70 61 73 73 65 64 20 74 6f 20 73 71  lso passed to sq
1e2f0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
1e300 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  ), then.** this 
1e310 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
1e320 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 72 65  called on the re
1e330 74 75 72 6e 65 64 20 57 68 65 72 65 49 6e 66 6f  turned WhereInfo
1e340 20 6f 62 6a 65 63 74 2e 20 49 74 20 72 65 74 75   object. It retu
1e350 72 6e 73 0a 2a 2a 20 74 72 75 65 20 69 66 20 74  rns.** true if t
1e360 68 65 20 72 6f 77 73 20 72 65 61 6c 6c 79 20 77  he rows really w
1e370 69 6c 6c 20 62 65 20 73 6f 72 74 65 64 20 69 6e  ill be sorted in
1e380 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6f   the specified o
1e390 72 64 65 72 2c 20 6f 72 20 66 61 6c 73 65 0a 2a  rder, or false.*
1e3a0 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  * otherwise..**.
1e3b0 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1e3c0 61 73 73 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  assuming:.**.** 
1e3d0 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
1e3e0 31 20 4f 4e 20 74 31 28 78 2c 20 59 29 3b 0a 2a  1 ON t1(x, Y);.*
1e3f0 2a 0a 2a 2a 20 74 68 65 6e 0a 2a 2a 0a 2a 2a 20  *.** then.**.** 
1e400 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1e410 74 31 20 47 52 4f 55 50 20 42 59 20 78 2c 79 20  t1 GROUP BY x,y 
1e420 4f 52 44 45 52 20 42 59 20 78 2c 79 3b 20 20 20  ORDER BY x,y;   
1e430 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d 3d 31  -- IsSorted()==1
1e440 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46  .**   SELECT * F
1e450 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20  ROM t1 GROUP BY 
1e460 79 2c 78 20 4f 52 44 45 52 20 42 59 20 79 2c 78  y,x ORDER BY y,x
1e470 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74 65 64 28  ;   -- IsSorted(
1e480 29 3d 3d 30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  )==0.*/.int sqli
1e490 74 65 33 57 68 65 72 65 49 73 53 6f 72 74 65 64  te3WhereIsSorted
1e4a0 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
1e4b0 66 6f 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  fo){.  assert( p
1e4c0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
1e4d0 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42  s & WHERE_GROUPB
1e4e0 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Y );.  assert( p
1e4f0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
1e500 73 20 26 20 57 48 45 52 45 5f 53 4f 52 54 42 59  s & WHERE_SORTBY
1e510 47 52 4f 55 50 20 29 3b 0a 20 20 72 65 74 75 72  GROUP );.  retur
1e520 6e 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64  n pWInfo->sorted
1e530 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52  ;.}..#ifdef WHER
1e540 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f  ETRACE_ENABLED./
1e550 2a 20 46 6f 72 20 64 65 62 75 67 67 69 6e 67 20  * For debugging 
1e560 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61  use only: */.sta
1e570 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
1e580 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 57 68  wherePathName(Wh
1e590 65 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20  erePath *pPath, 
1e5a0 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65  int nLoop, Where
1e5b0 4c 6f 6f 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20  Loop *pLast){.  
1e5c0 73 74 61 74 69 63 20 63 68 61 72 20 7a 4e 61 6d  static char zNam
1e5d0 65 5b 36 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a  e[65];.  int i;.
1e5e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f    for(i=0; i<nLo
1e5f0 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b  op; i++){ zName[
1e600 69 5d 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f  i] = pPath->aLoo
1e610 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69  p[i]->cId; }.  i
1e620 66 28 20 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65  f( pLast ) zName
1e630 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63  [i++] = pLast->c
1e640 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d  Id;.  zName[i] =
1e650 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61   0;.  return zNa
1e660 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  me;.}.#endif../*
1e670 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
1e680 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e  ost of sorting n
1e690 52 6f 77 20 72 6f 77 73 2c 20 61 73 73 75 6d 69  Row rows, assumi
1e6a0 6e 67 20 74 68 61 74 20 74 68 65 20 6b 65 79 73  ng that the keys
1e6b0 20 68 61 76 65 20 0a 2a 2a 20 6e 4f 72 64 65 72   have .** nOrder
1e6c0 62 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74  by columns and t
1e6d0 68 61 74 20 74 68 65 20 66 69 72 73 74 20 6e 53  hat the first nS
1e6e0 6f 72 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72  orted columns ar
1e6f0 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 2a 2a 20  e already in.** 
1e700 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
1e710 20 4c 6f 67 45 73 74 20 77 68 65 72 65 53 6f 72   LogEst whereSor
1e720 74 69 6e 67 43 6f 73 74 28 0a 20 20 57 68 65 72  tingCost(.  Wher
1e730 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20  eInfo *pWInfo,. 
1e740 20 4c 6f 67 45 73 74 20 6e 52 6f 77 2c 0a 20 20   LogEst nRow,.  
1e750 69 6e 74 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20  int nOrderBy,.  
1e760 69 6e 74 20 6e 53 6f 72 74 65 64 0a 29 7b 0a 20  int nSorted.){. 
1e770 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 73 74 69   /* TUNING: Esti
1e780 6d 61 74 65 64 20 63 6f 73 74 20 6f 66 20 61 20  mated cost of a 
1e790 66 75 6c 6c 20 65 78 74 65 72 6e 61 6c 20 73 6f  full external so
1e7a0 72 74 2c 20 77 68 65 72 65 20 4e 20 69 73 20 0a  rt, where N is .
1e7b0 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20    ** the number 
1e7c0 6f 66 20 72 6f 77 73 20 74 6f 20 73 6f 72 74 20  of rows to sort 
1e7d0 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
1e7e0 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20  cost = (3.0 * N 
1e7f0 2a 20 6c 6f 67 28 4e 29 29 2e 0a 20 20 2a 2a 20  * log(N))..  ** 
1e800 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  .  ** Or, if the
1e810 20 6f 72 64 65 72 2d 62 79 20 63 6c 61 75 73 65   order-by clause
1e820 20 68 61 73 20 58 20 74 65 72 6d 73 20 62 75 74   has X terms but
1e830 20 6f 6e 6c 79 20 74 68 65 20 6c 61 73 74 20 59   only the last Y
1e840 20 0a 20 20 2a 2a 20 74 65 72 6d 73 20 61 72 65   .  ** terms are
1e850 20 6f 75 74 20 6f 66 20 6f 72 64 65 72 2c 20 74   out of order, t
1e860 68 65 6e 20 62 6c 6f 63 6b 2d 73 6f 72 74 69 6e  hen block-sortin
1e870 67 20 77 69 6c 6c 20 72 65 64 75 63 65 20 74 68  g will reduce th
1e880 65 20 0a 20 20 2a 2a 20 73 6f 72 74 69 6e 67 20  e .  ** sorting 
1e890 63 6f 73 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20  cost to:.  **.  
1e8a0 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28 33 2e 30  **   cost = (3.0
1e8b0 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 20 2a   * N * log(N)) *
1e8c0 20 28 59 2f 58 29 0a 20 20 2a 2a 0a 20 20 2a 2a   (Y/X).  **.  **
1e8d0 20 54 68 65 20 28 59 2f 58 29 20 74 65 72 6d 20   The (Y/X) term 
1e8e0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  is implemented u
1e8f0 73 69 6e 67 20 73 74 61 63 6b 20 76 61 72 69 61  sing stack varia
1e900 62 6c 65 20 72 53 63 61 6c 65 0a 20 20 2a 2a 20  ble rScale.  ** 
1e910 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 4c 6f 67  below.  */.  Log
1e920 45 73 74 20 72 53 63 61 6c 65 2c 20 72 53 6f 72  Est rScale, rSor
1e930 74 43 6f 73 74 3b 0a 20 20 61 73 73 65 72 74 28  tCost;.  assert(
1e940 20 6e 4f 72 64 65 72 42 79 3e 30 20 26 26 20 36   nOrderBy>0 && 6
1e950 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  6==sqlite3LogEst
1e960 28 31 30 30 29 20 29 3b 0a 20 20 72 53 63 61 6c  (100) );.  rScal
1e970 65 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  e = sqlite3LogEs
1e980 74 28 28 6e 4f 72 64 65 72 42 79 2d 6e 53 6f 72  t((nOrderBy-nSor
1e990 74 65 64 29 2a 31 30 30 2f 6e 4f 72 64 65 72 42  ted)*100/nOrderB
1e9a0 79 29 20 2d 20 36 36 3b 0a 20 20 72 53 6f 72 74  y) - 66;.  rSort
1e9b0 43 6f 73 74 20 3d 20 6e 52 6f 77 20 2b 20 65 73  Cost = nRow + es
1e9c0 74 4c 6f 67 28 6e 52 6f 77 29 20 2b 20 72 53 63  tLog(nRow) + rSc
1e9d0 61 6c 65 20 2b 20 31 36 3b 0a 0a 20 20 2f 2a 20  ale + 16;..  /* 
1e9e0 54 55 4e 49 4e 47 3a 20 54 68 65 20 63 6f 73 74  TUNING: The cost
1e9f0 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67   of implementing
1ea00 20 44 49 53 54 49 4e 43 54 20 75 73 69 6e 67 20   DISTINCT using 
1ea10 61 20 42 2d 54 52 45 45 20 69 73 0a 20 20 2a 2a  a B-TREE is.  **
1ea20 20 73 69 6d 69 6c 61 72 20 62 75 74 20 77 69 74   similar but wit
1ea30 68 20 61 20 6c 61 72 67 65 72 20 63 6f 6e 73 74  h a larger const
1ea40 61 6e 74 20 6f 66 20 70 72 6f 70 6f 72 74 69 6f  ant of proportio
1ea50 6e 61 6c 69 74 79 2e 20 0a 20 20 2a 2a 20 4d 75  nality. .  ** Mu
1ea60 6c 74 69 70 6c 79 20 62 79 20 61 6e 20 61 64 64  ltiply by an add
1ea70 69 74 69 6f 6e 61 6c 20 66 61 63 74 6f 72 20 6f  itional factor o
1ea80 66 20 33 2e 30 2e 20 20 2a 2f 0a 20 20 69 66 28  f 3.0.  */.  if(
1ea90 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
1eaa0 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
1eab0 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20  _DISTINCT ){.   
1eac0 20 72 53 6f 72 74 43 6f 73 74 20 2b 3d 20 31 36   rSortCost += 16
1ead0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1eae0 72 53 6f 72 74 43 6f 73 74 3b 0a 7d 0a 0a 2f 2a  rSortCost;.}../*
1eaf0 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6c 69  .** Given the li
1eb00 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20  st of WhereLoop 
1eb10 6f 62 6a 65 63 74 73 20 61 74 20 70 57 49 6e 66  objects at pWInf
1eb20 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20  o->pLoops, this 
1eb30 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d  routine.** attem
1eb40 70 74 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20  pts to find the 
1eb50 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68  lowest cost path
1eb60 20 74 68 61 74 20 76 69 73 69 74 73 20 65 61 63   that visits eac
1eb70 68 20 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f  h WhereLoop.** o
1eb80 6e 63 65 2e 20 20 54 68 69 73 20 70 61 74 68 20  nce.  This path 
1eb90 69 73 20 74 68 65 6e 20 6c 6f 61 64 65 64 20 69  is then loaded i
1eba0 6e 74 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e  nto the pWInfo->
1ebb0 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64  a[].pWLoop field
1ebc0 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65 20  s..**.** Assume 
1ebd0 74 68 61 74 20 74 68 65 20 74 6f 74 61 6c 20 6e  that the total n
1ebe0 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
1ebf0 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 6e  rows that will n
1ec00 65 65 64 20 74 6f 20 62 65 20 73 6f 72 74 65 64  eed to be sorted
1ec10 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6e 52 6f 77  .** will be nRow
1ec20 45 73 74 20 28 69 6e 20 74 68 65 20 31 30 2a 6c  Est (in the 10*l
1ec30 6f 67 32 20 72 65 70 72 65 73 65 6e 74 61 74 69  og2 representati
1ec40 6f 6e 29 2e 20 20 4f 72 2c 20 69 67 6e 6f 72 65  on).  Or, ignore
1ec50 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f 73 74   sorting.** cost
1ec60 73 20 69 66 20 6e 52 6f 77 45 73 74 3d 3d 30 2e  s if nRowEst==0.
1ec70 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
1ec80 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
1ec90 73 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d  ss or SQLITE_NOM
1eca0 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61  EM of a memory a
1ecb0 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72  llocation.** err
1ecc0 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  or occurs..*/.st
1ecd0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 50 61  atic int wherePa
1ece0 74 68 53 6f 6c 76 65 72 28 57 68 65 72 65 49 6e  thSolver(WhereIn
1ecf0 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 4c 6f 67 45  fo *pWInfo, LogE
1ed00 73 74 20 6e 52 6f 77 45 73 74 29 7b 0a 20 20 69  st nRowEst){.  i
1ed10 6e 74 20 6d 78 43 68 6f 69 63 65 3b 20 20 20 20  nt mxChoice;    
1ed20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
1ed30 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  mum number of si
1ed40 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61 74 68 73  multaneous paths
1ed50 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20 20 69 6e   tracked */.  in
1ed60 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20  t nLoop;        
1ed70 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1ed80 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68  r of terms in th
1ed90 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61 72 73  e join */.  Pars
1eda0 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
1edb0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
1edc0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
1edd0 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
1ede0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
1edf0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1ee00 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f  on */.  int iLoo
1ee10 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1ee20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1ee30 72 20 6f 76 65 72 20 74 68 65 20 74 65 72 6d 73  r over the terms
1ee40 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
1ee50 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 20 20 20    int ii, jj;   
1ee60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1ee70 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
1ee80 20 20 69 6e 74 20 6d 78 49 20 3d 20 30 3b 20 20    int mxI = 0;  
1ee90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1eea0 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 65 6e 74  ndex of next ent
1eeb0 72 79 20 74 6f 20 72 65 70 6c 61 63 65 20 2a 2f  ry to replace */
1eec0 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b  .  int nOrderBy;
1eed0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1eee0 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20  Number of ORDER 
1eef0 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  BY clause terms 
1ef00 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 43 6f  */.  LogEst mxCo
1ef10 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  st = 0;        /
1ef20 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f  * Maximum cost o
1ef30 66 20 61 20 73 65 74 20 6f 66 20 70 61 74 68 73  f a set of paths
1ef40 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 55   */.  LogEst mxU
1ef50 6e 73 6f 72 74 65 64 20 3d 20 30 3b 20 20 20 20  nsorted = 0;    
1ef60 2f 2a 20 4d 61 78 69 6d 75 6d 20 75 6e 73 6f 72  /* Maximum unsor
1ef70 74 65 64 20 63 6f 73 74 20 6f 66 20 61 20 73 65  ted cost of a se
1ef80 74 20 6f 66 20 70 61 74 68 20 2a 2f 0a 20 20 69  t of path */.  i
1ef90 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20  nt nTo, nFrom;  
1efa0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1efb0 65 72 20 6f 66 20 76 61 6c 69 64 20 65 6e 74 72  er of valid entr
1efc0 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e 64  ies in aTo[] and
1efd0 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68   aFrom[] */.  Wh
1efe0 65 72 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b 20  erePath *aFrom; 
1eff0 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6e          /* All n
1f000 46 72 6f 6d 20 70 61 74 68 73 20 61 74 20 74 68  From paths at th
1f010 65 20 70 72 65 76 69 6f 75 73 20 6c 65 76 65 6c  e previous level
1f020 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
1f030 2a 61 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20  *aTo;           
1f040 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65 73 74 20  /* The nTo best 
1f050 70 61 74 68 73 20 61 74 20 74 68 65 20 63 75 72  paths at the cur
1f060 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  rent level */.  
1f070 57 68 65 72 65 50 61 74 68 20 2a 70 46 72 6f 6d  WherePath *pFrom
1f080 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  ;         /* An 
1f090 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f 6d  element of aFrom
1f0a0 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77  [] that we are w
1f0b0 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57  orking on */.  W
1f0c0 68 65 72 65 50 61 74 68 20 2a 70 54 6f 3b 20 20  herePath *pTo;  
1f0d0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
1f0e0 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d 20  lement of aTo[] 
1f0f0 74 68 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b  that we are work
1f100 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72  ing on */.  Wher
1f110 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20  eLoop *pWLoop;  
1f120 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
1f130 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  the WhereLoop ob
1f140 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68 65 72 65  jects */.  Where
1f150 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20 20  Loop **pX;      
1f160 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
1f170 64 69 76 79 20 75 70 20 74 68 65 20 70 53 70 61  divy up the pSpa
1f180 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 4c  ce memory */.  L
1f190 6f 67 45 73 74 20 2a 61 53 6f 72 74 43 6f 73 74  ogEst *aSortCost
1f1a0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53 6f 72 74   = 0;    /* Sort
1f1b0 69 6e 67 20 61 6e 64 20 70 61 72 74 69 61 6c 20  ing and partial 
1f1c0 73 6f 72 74 69 6e 67 20 63 6f 73 74 73 20 2a 2f  sorting costs */
1f1d0 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 3b  .  char *pSpace;
1f1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f1f0 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79  Temporary memory
1f200 20 75 73 65 64 20 62 79 20 74 68 69 73 20 72 6f   used by this ro
1f210 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  utine */.  int n
1f220 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
1f230 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
1f240 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
1f250 20 61 74 20 70 53 70 61 63 65 20 2a 2f 0a 0a 20   at pSpace */.. 
1f260 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f   pParse = pWInfo
1f270 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d  ->pParse;.  db =
1f280 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e   pParse->db;.  n
1f290 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e  Loop = pWInfo->n
1f2a0 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49  Level;.  /* TUNI
1f2b0 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20 71  NG: For simple q
1f2c0 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68 65  ueries, only the
1f2d0 20 62 65 73 74 20 70 61 74 68 20 69 73 20 74 72   best path is tr
1f2e0 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20  acked..  ** For 
1f2f0 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68 65  2-way joins, the
1f300 20 35 20 62 65 73 74 20 70 61 74 68 73 20 61 72   5 best paths ar
1f310 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a  e followed..  **
1f320 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33 20   For joins of 3 
1f330 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c 20  or more tables, 
1f340 74 72 61 63 6b 20 74 68 65 20 31 30 20 62 65 73  track the 10 bes
1f350 74 20 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78 43  t paths */.  mxC
1f360 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3c 3d  hoice = (nLoop<=
1f370 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d  1) ? 1 : (nLoop=
1f380 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20 20  =2 ? 5 : 10);.  
1f390 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70  assert( nLoop<=p
1f3a0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
1f3b0 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48 45 52 45  >nSrc );.  WHERE
1f3c0 54 52 41 43 45 28 30 78 30 30 32 2c 20 28 22 2d  TRACE(0x002, ("-
1f3d0 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65 72  --- begin solver
1f3e0 2e 20 20 28 6e 52 6f 77 45 73 74 3d 25 64 29 5c  .  (nRowEst=%d)\
1f3f0 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 0a  n", nRowEst));..
1f400 20 20 2f 2a 20 49 66 20 6e 52 6f 77 45 73 74 20    /* If nRowEst 
1f410 69 73 20 7a 65 72 6f 20 61 6e 64 20 74 68 65 72  is zero and ther
1f420 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
1f430 20 63 6c 61 75 73 65 2c 20 69 67 6e 6f 72 65 20   clause, ignore 
1f440 69 74 2e 20 49 6e 20 74 68 69 73 0a 20 20 2a 2a  it. In this.  **
1f450 20 63 61 73 65 20 74 68 65 20 70 75 72 70 6f 73   case the purpos
1f460 65 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 20 69  e of this call i
1f470 73 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68  s to estimate th
1f480 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
1f490 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 62   returned.  ** b
1f4a0 79 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 71 75  y the overall qu
1f4b0 65 72 79 2e 20 4f 6e 63 65 20 74 68 69 73 20 65  ery. Once this e
1f4c0 73 74 69 6d 61 74 65 20 68 61 73 20 62 65 65 6e  stimate has been
1f4d0 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 20 63   obtained, the c
1f4e0 61 6c 6c 65 72 0a 20 20 2a 2a 20 77 69 6c 6c 20  aller.  ** will 
1f4f0 69 6e 76 6f 6b 65 20 74 68 69 73 20 66 75 6e 63  invoke this func
1f500 74 69 6f 6e 20 61 20 73 65 63 6f 6e 64 20 74 69  tion a second ti
1f510 6d 65 2c 20 70 61 73 73 69 6e 67 20 74 68 65 20  me, passing the 
1f520 65 73 74 69 6d 61 74 65 20 61 73 20 74 68 65 0a  estimate as the.
1f530 20 20 2a 2a 20 6e 52 6f 77 45 73 74 20 70 61 72    ** nRowEst par
1f540 61 6d 65 74 65 72 2e 20 20 2a 2f 0a 20 20 69 66  ameter.  */.  if
1f550 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
1f560 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73 74  By==0 || nRowEst
1f570 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4f 72 64 65  ==0 ){.    nOrde
1f580 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  rBy = 0;.  }else
1f590 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d  {.    nOrderBy =
1f5a0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
1f5b0 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 0a 20  y->nExpr;.  }.. 
1f5c0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64   /* Allocate and
1f5d0 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 70 61 63   initialize spac
1f5e0 65 20 66 6f 72 20 61 54 6f 2c 20 61 46 72 6f 6d  e for aTo, aFrom
1f5f0 20 61 6e 64 20 61 53 6f 72 74 43 6f 73 74 5b 5d   and aSortCost[]
1f600 20 2a 2f 0a 20 20 6e 53 70 61 63 65 20 3d 20 28   */.  nSpace = (
1f610 73 69 7a 65 6f 66 28 57 68 65 72 65 50 61 74 68  sizeof(WherePath
1f620 29 2b 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  )+sizeof(WhereLo
1f630 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68  op*)*nLoop)*mxCh
1f640 6f 69 63 65 2a 32 3b 0a 20 20 6e 53 70 61 63 65  oice*2;.  nSpace
1f650 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73   += sizeof(LogEs
1f660 74 29 20 2a 20 6e 4f 72 64 65 72 42 79 3b 0a 20  t) * nOrderBy;. 
1f670 20 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65   pSpace = sqlite
1f680 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
1f690 20 6e 53 70 61 63 65 29 3b 0a 20 20 69 66 28 20   nSpace);.  if( 
1f6a0 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75  pSpace==0 ) retu
1f6b0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
1f6c0 0a 20 20 61 54 6f 20 3d 20 28 57 68 65 72 65 50  .  aTo = (WhereP
1f6d0 61 74 68 2a 29 70 53 70 61 63 65 3b 0a 20 20 61  ath*)pSpace;.  a
1f6e0 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f  From = aTo+mxCho
1f6f0 69 63 65 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46  ice;.  memset(aF
1f700 72 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61  rom, 0, sizeof(a
1f710 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20  From[0]));.  pX 
1f720 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28  = (WhereLoop**)(
1f730 61 46 72 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b  aFrom+mxChoice);
1f740 0a 20 20 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69  .  for(ii=mxChoi
1f750 63 65 2a 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b  ce*2, pFrom=aTo;
1f760 20 69 69 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72   ii>0; ii--, pFr
1f770 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f  om++, pX += nLoo
1f780 70 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61  p){.    pFrom->a
1f790 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 20  Loop = pX;.  }. 
1f7a0 20 69 66 28 20 6e 4f 72 64 65 72 42 79 20 29 7b   if( nOrderBy ){
1f7b0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
1f7c0 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
1f7d0 63 6c 61 75 73 65 20 61 6e 64 20 69 74 20 69 73  clause and it is
1f7e0 20 6e 6f 74 20 62 65 69 6e 67 20 69 67 6e 6f 72   not being ignor
1f7f0 65 64 2c 20 73 65 74 20 75 70 0a 20 20 20 20 2a  ed, set up.    *
1f800 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  * space for the 
1f810 61 53 6f 72 74 43 6f 73 74 5b 5d 20 61 72 72 61  aSortCost[] arra
1f820 79 2e 20 45 61 63 68 20 65 6c 65 6d 65 6e 74 20  y. Each element 
1f830 6f 66 20 74 68 65 20 61 53 6f 72 74 43 6f 73 74  of the aSortCost
1f840 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 69 73   array.    ** is
1f850 20 65 69 74 68 65 72 20 7a 65 72 6f 20 2d 20 6d   either zero - m
1f860 65 61 6e 69 6e 67 20 69 74 20 68 61 73 20 6e 6f  eaning it has no
1f870 74 20 79 65 74 20 62 65 65 6e 20 69 6e 69 74 69  t yet been initi
1f880 61 6c 69 7a 65 64 20 2d 20 6f 72 20 74 68 65 0a  alized - or the.
1f890 20 20 20 20 2a 2a 20 63 6f 73 74 20 6f 66 20 73      ** cost of s
1f8a0 6f 72 74 69 6e 67 20 6e 52 6f 77 45 73 74 20 72  orting nRowEst r
1f8b0 6f 77 73 20 6f 66 20 64 61 74 61 20 77 68 65 72  ows of data wher
1f8c0 65 20 74 68 65 20 66 69 72 73 74 20 58 20 74 65  e the first X te
1f8d0 72 6d 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  rms of.    ** th
1f8e0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1f8f0 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  e are already in
1f900 20 6f 72 64 65 72 2c 20 77 68 65 72 65 20 58 20   order, where X 
1f910 69 73 20 74 68 65 20 61 72 72 61 79 20 0a 20 20  is the array .  
1f920 20 20 2a 2a 20 69 6e 64 65 78 2e 20 20 2a 2f 0a    ** index.  */.
1f930 20 20 20 20 61 53 6f 72 74 43 6f 73 74 20 3d 20      aSortCost = 
1f940 28 4c 6f 67 45 73 74 2a 29 70 58 3b 0a 20 20 20  (LogEst*)pX;.   
1f950 20 6d 65 6d 73 65 74 28 61 53 6f 72 74 43 6f 73   memset(aSortCos
1f960 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4c 6f 67  t, 0, sizeof(Log
1f970 45 73 74 29 20 2a 20 6e 4f 72 64 65 72 42 79 29  Est) * nOrderBy)
1f980 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1f990 61 53 6f 72 74 43 6f 73 74 3d 3d 30 20 7c 7c 20  aSortCost==0 || 
1f9a0 26 70 53 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d  &pSpace[nSpace]=
1f9b0 3d 28 63 68 61 72 2a 29 26 61 53 6f 72 74 43 6f  =(char*)&aSortCo
1f9c0 73 74 5b 6e 4f 72 64 65 72 42 79 5d 20 29 3b 0a  st[nOrderBy] );.
1f9d0 20 20 61 73 73 65 72 74 28 20 61 53 6f 72 74 43    assert( aSortC
1f9e0 6f 73 74 21 3d 30 20 7c 7c 20 26 70 53 70 61 63  ost!=0 || &pSpac
1f9f0 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72  e[nSpace]==(char
1fa00 2a 29 70 58 20 29 3b 0a 0a 20 20 2f 2a 20 53 65  *)pX );..  /* Se
1fa10 65 64 20 74 68 65 20 73 65 61 72 63 68 20 77 69  ed the search wi
1fa20 74 68 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72  th a single Wher
1fa30 65 50 61 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67  ePath containing
1fa40 20 7a 65 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73   zero WhereLoops
1fa50 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49  ..  **.  ** TUNI
1fa60 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74  NG: Do not let t
1fa70 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 74 65  he number of ite
1fa80 72 61 74 69 6f 6e 73 20 67 6f 20 61 62 6f 76 65  rations go above
1fa90 20 32 38 2e 20 20 49 66 20 74 68 65 20 63 6f 73   28.  If the cos
1faa0 74 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d 70 75 74  t.  ** of comput
1fab0 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  ing an automatic
1fac0 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 70 61   index is not pa
1fad0 69 64 20 62 61 63 6b 20 77 69 74 68 69 6e 20 74  id back within t
1fae0 68 65 20 66 69 72 73 74 20 32 38 0a 20 20 2a 2a  he first 28.  **
1faf0 20 72 6f 77 73 2c 20 74 68 65 6e 20 64 6f 20 6e   rows, then do n
1fb00 6f 74 20 75 73 65 20 74 68 65 20 61 75 74 6f 6d  ot use the autom
1fb10 61 74 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20  atic index. */. 
1fb20 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d   aFrom[0].nRow =
1fb30 20 4d 49 4e 28 70 50 61 72 73 65 2d 3e 6e 51 75   MIN(pParse->nQu
1fb40 65 72 79 4c 6f 6f 70 2c 20 34 38 29 3b 20 20 61  eryLoop, 48);  a
1fb50 73 73 65 72 74 28 20 34 38 3d 3d 73 71 6c 69 74  ssert( 48==sqlit
1fb60 65 33 4c 6f 67 45 73 74 28 32 38 29 20 29 3b 0a  e3LogEst(28) );.
1fb70 20 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 20 20 61    nFrom = 1;.  a
1fb80 73 73 65 72 74 28 20 61 46 72 6f 6d 5b 30 5d 2e  ssert( aFrom[0].
1fb90 69 73 4f 72 64 65 72 65 64 3d 3d 30 20 29 3b 0a  isOrdered==0 );.
1fba0 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 20 29    if( nOrderBy )
1fbb0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 4c 6f 6f  {.    /* If nLoo
1fbc0 70 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  p is zero, then 
1fbd0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 46 52 4f  there are no FRO
1fbe0 4d 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 71  M terms in the q
1fbf0 75 65 72 79 2e 20 53 69 6e 63 65 0a 20 20 20 20  uery. Since.    
1fc00 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  ** in this case 
1fc10 74 68 65 20 71 75 65 72 79 20 6d 61 79 20 72 65  the query may re
1fc20 74 75 72 6e 20 61 20 6d 61 78 69 6d 75 6d 20 6f  turn a maximum o
1fc30 66 20 6f 6e 65 20 72 6f 77 2c 20 74 68 65 20 72  f one row, the r
1fc40 65 73 75 6c 74 73 0a 20 20 20 20 2a 2a 20 61 72  esults.    ** ar
1fc50 65 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  e already in the
1fc60 20 72 65 71 75 65 73 74 65 64 20 6f 72 64 65 72   requested order
1fc70 2e 20 53 65 74 20 69 73 4f 72 64 65 72 65 64 20  . Set isOrdered 
1fc80 74 6f 20 6e 4f 72 64 65 72 42 79 20 74 6f 0a 20  to nOrderBy to. 
1fc90 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 20 74     ** indicate t
1fca0 68 69 73 2e 20 4f 72 2c 20 69 66 20 6e 4c 6f 6f  his. Or, if nLoo
1fcb0 70 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  p is greater tha
1fcc0 6e 20 7a 65 72 6f 2c 20 73 65 74 20 69 73 4f 72  n zero, set isOr
1fcd0 64 65 72 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  dered to.    ** 
1fce0 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74  -1, indicating t
1fcf0 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 73  hat the result s
1fd00 65 74 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  et may or may no
1fd10 74 20 62 65 20 6f 72 64 65 72 65 64 2c 20 0a 20  t be ordered, . 
1fd20 20 20 20 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20     ** depending 
1fd30 6f 6e 20 74 68 65 20 6c 6f 6f 70 73 20 61 64 64  on the loops add
1fd40 65 64 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ed to the curren
1fd50 74 20 70 6c 61 6e 2e 20 20 2a 2f 0a 20 20 20 20  t plan.  */.    
1fd60 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72  aFrom[0].isOrder
1fd70 65 64 20 3d 20 6e 4c 6f 6f 70 3e 30 20 3f 20 2d  ed = nLoop>0 ? -
1fd80 31 20 3a 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  1 : nOrderBy;.  
1fd90 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
1fda0 73 75 63 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e  successively lon
1fdb0 67 65 72 20 57 68 65 72 65 50 61 74 68 73 20 75  ger WherePaths u
1fdc0 73 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75  sing the previou
1fdd0 73 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a  s generation.  *
1fde0 2a 20 6f 66 20 57 68 65 72 65 50 61 74 68 73 20  * of WherePaths 
1fdf0 61 73 20 74 68 65 20 62 61 73 69 73 20 66 6f 72  as the basis for
1fe00 20 74 68 65 20 6e 65 78 74 2e 20 20 4b 65 65 70   the next.  Keep
1fe10 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6d 78   track of the mx
1fe20 43 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73 74  Choice.  ** best
1fe30 20 70 61 74 68 73 20 61 74 20 65 61 63 68 20 67   paths at each g
1fe40 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66  eneration */.  f
1fe50 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f  or(iLoop=0; iLoo
1fe60 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  p<nLoop; iLoop++
1fe70 29 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a  ){.    nTo = 0;.
1fe80 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 46      for(ii=0, pF
1fe90 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46  rom=aFrom; ii<nF
1fea0 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d  rom; ii++, pFrom
1feb0 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  ++){.      for(p
1fec0 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c  WLoop=pWInfo->pL
1fed0 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57  oops; pWLoop; pW
1fee0 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65  Loop=pWLoop->pNe
1fef0 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20  xtLoop){.       
1ff00 20 4c 6f 67 45 73 74 20 6e 4f 75 74 3b 20 20 20   LogEst nOut;   
1ff10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff20 20 20 20 2f 2a 20 52 6f 77 73 20 76 69 73 69 74     /* Rows visit
1ff30 65 64 20 62 79 20 28 70 46 72 6f 6d 2b 70 57 4c  ed by (pFrom+pWL
1ff40 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  oop) */.        
1ff50 4c 6f 67 45 73 74 20 72 43 6f 73 74 3b 20 20 20  LogEst rCost;   
1ff60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff70 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 70 61 74    /* Cost of pat
1ff80 68 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29  h (pFrom+pWLoop)
1ff90 20 2a 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67 45   */.        LogE
1ffa0 73 74 20 72 55 6e 73 6f 72 74 65 64 3b 20 20 20  st rUnsorted;   
1ffb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ffc0 20 55 6e 73 6f 72 74 65 64 20 63 6f 73 74 20 6f   Unsorted cost o
1ffd0 66 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29  f (pFrom+pWLoop)
1ffe0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 38 20 69   */.        i8 i
1fff0 73 4f 72 64 65 72 65 64 20 3d 20 70 46 72 6f 6d  sOrdered = pFrom
20000 2d 3e 69 73 4f 72 64 65 72 65 64 3b 20 20 2f 2a  ->isOrdered;  /*
20010 20 69 73 4f 72 64 65 72 65 64 20 66 6f 72 20 28   isOrdered for (
20020 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f  pFrom+pWLoop) */
20030 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
20040 20 6d 61 73 6b 4e 65 77 3b 20 20 20 20 20 20 20   maskNew;       
20050 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
20060 73 6b 20 6f 66 20 73 72 63 20 76 69 73 69 74 65  sk of src visite
20070 64 20 62 79 20 28 2e 2e 29 20 2a 2f 0a 20 20 20  d by (..) */.   
20080 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76       Bitmask rev
20090 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  Mask = 0;       
200a0 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
200b0 66 20 72 65 76 2d 6f 72 64 65 72 20 6c 6f 6f 70  f rev-order loop
200c0 73 20 66 6f 72 20 28 2e 2e 29 20 2a 2f 0a 0a 20  s for (..) */.. 
200d0 20 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f         if( (pWLo
200e0 6f 70 2d 3e 70 72 65 72 65 71 20 26 20 7e 70 46  op->prereq & ~pF
200f0 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d  rom->maskLoop)!=
20100 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
20110 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f        if( (pWLoo
20120 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 26 20 70 46  p->maskSelf & pF
20130 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d  rom->maskLoop)!=
20140 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
20150 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
20160 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69   point, pWLoop i
20170 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f  s a candidate to
20180 20 62 65 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f   be the next loo
20190 70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 43  p. .        ** C
201a0 6f 6d 70 75 74 65 20 69 74 73 20 63 6f 73 74 20  ompute its cost 
201b0 2a 2f 0a 20 20 20 20 20 20 20 20 72 55 6e 73 6f  */.        rUnso
201c0 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rted = sqlite3Lo
201d0 67 45 73 74 41 64 64 28 70 57 4c 6f 6f 70 2d 3e  gEstAdd(pWLoop->
201e0 72 53 65 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72  rSetup,pWLoop->r
201f0 52 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f  Run + pFrom->nRo
20200 77 29 3b 0a 20 20 20 20 20 20 20 20 72 55 6e 73  w);.        rUns
20210 6f 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4c  orted = sqlite3L
20220 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f 72 74  ogEstAdd(rUnsort
20230 65 64 2c 20 70 46 72 6f 6d 2d 3e 72 55 6e 73 6f  ed, pFrom->rUnso
20240 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 6e  rted);.        n
20250 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f  Out = pFrom->nRo
20260 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74  w + pWLoop->nOut
20270 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 4e 65  ;.        maskNe
20280 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c  w = pFrom->maskL
20290 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61  oop | pWLoop->ma
202a0 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20  skSelf;.        
202b0 69 66 28 20 69 73 4f 72 64 65 72 65 64 3c 30 20  if( isOrdered<0 
202c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f  ){.          isO
202d0 72 64 65 72 65 64 20 3d 20 77 68 65 72 65 50 61  rdered = wherePa
202e0 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
202f0 42 79 28 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20  By(pWInfo,.     
20300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20310 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
20320 42 79 2c 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66  By, pFrom, pWInf
20330 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20  o->wctrlFlags,. 
20340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20350 20 20 20 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c        iLoop, pWL
20360 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29 3b 0a  oop, &revMask);.
20370 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
20380 20 20 20 20 20 20 20 20 20 72 65 76 4d 61 73 6b           revMask
20390 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f   = pFrom->revLoo
203a0 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
203b0 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72       if( isOrder
203c0 65 64 3e 3d 30 20 26 26 20 69 73 4f 72 64 65 72  ed>=0 && isOrder
203d0 65 64 3c 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20  ed<nOrderBy ){. 
203e0 20 20 20 20 20 20 20 20 20 69 66 28 20 61 53 6f           if( aSo
203f0 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64  rtCost[isOrdered
20400 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
20410 20 20 20 20 61 53 6f 72 74 43 6f 73 74 5b 69 73      aSortCost[is
20420 4f 72 64 65 72 65 64 5d 20 3d 20 77 68 65 72 65  Ordered] = where
20430 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20 20 20  SortingCost(.   
20440 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49               pWI
20450 6e 66 6f 2c 20 6e 52 6f 77 45 73 74 2c 20 6e 4f  nfo, nRowEst, nO
20460 72 64 65 72 42 79 2c 20 69 73 4f 72 64 65 72 65  rderBy, isOrdere
20470 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b  d.            );
20480 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
20490 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 73         rCost = s
204a0 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
204b0 72 55 6e 73 6f 72 74 65 64 2c 20 61 53 6f 72 74  rUnsorted, aSort
204c0 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 29  Cost[isOrdered])
204d0 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 57 48 45  ;..          WHE
204e0 52 45 54 52 41 43 45 28 30 78 30 30 32 2c 0a 20  RETRACE(0x002,. 
204f0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 22 2d               ("-
20500 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25 2d  --- sort cost=%-
20510 33 64 20 28 25 64 2f 25 64 29 20 69 6e 63 72 65  3d (%d/%d) incre
20520 61 73 65 73 20 63 6f 73 74 20 25 33 64 20 74 6f  ases cost %3d to
20530 20 25 2d 33 64 5c 6e 22 2c 0a 20 20 20 20 20 20   %-3d\n",.      
20540 20 20 20 20 20 20 20 20 20 61 53 6f 72 74 43 6f           aSortCo
20550 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 2c 20 28  st[isOrdered], (
20560 6e 4f 72 64 65 72 42 79 2d 69 73 4f 72 64 65 72  nOrderBy-isOrder
20570 65 64 29 2c 20 6e 4f 72 64 65 72 42 79 2c 20 0a  ed), nOrderBy, .
20580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
20590 55 6e 73 6f 72 74 65 64 2c 20 72 43 6f 73 74 29  Unsorted, rCost)
205a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
205b0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 43 6f 73  {.          rCos
205c0 74 20 3d 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20  t = rUnsorted;. 
205d0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
205e0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
205f0 65 20 69 66 20 70 57 4c 6f 6f 70 20 73 68 6f 75  e if pWLoop shou
20600 6c 64 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  ld be added to t
20610 68 65 20 73 65 74 20 6f 66 0a 20 20 20 20 20 20  he set of.      
20620 20 20 2a 2a 20 6d 78 43 68 6f 69 63 65 20 62 65    ** mxChoice be
20630 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 2e  st-so-far paths.
20640 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
20650 20 20 20 20 2a 2a 20 46 69 72 73 74 20 6c 6f 6f      ** First loo
20660 6b 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  k for an existin
20670 67 20 70 61 74 68 20 61 6d 6f 6e 67 20 62 65 73  g path among bes
20680 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 0a 20  t-so-far paths. 
20690 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63         ** that c
206a0 6f 76 65 72 73 20 74 68 65 20 73 61 6d 65 20 73  overs the same s
206b0 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20  et of loops and 
206c0 68 61 73 20 74 68 65 20 73 61 6d 65 20 69 73 4f  has the same isO
206d0 72 64 65 72 65 64 0a 20 20 20 20 20 20 20 20 2a  rdered.        *
206e0 2a 20 73 65 74 74 69 6e 67 20 61 73 20 74 68 65  * setting as the
206f0 20 63 75 72 72 65 6e 74 20 70 61 74 68 20 63 61   current path ca
20700 6e 64 69 64 61 74 65 2e 0a 20 20 20 20 20 20 20  ndidate..       
20710 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
20720 68 65 20 74 65 72 6d 20 22 28 28 70 54 6f 2d 3e  he term "((pTo->
20730 69 73 4f 72 64 65 72 65 64 5e 69 73 4f 72 64 65  isOrdered^isOrde
20740 72 65 64 29 26 30 78 38 30 29 3d 3d 30 22 20 69  red)&0x80)==0" i
20750 73 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20  s equivalent.   
20760 20 20 20 20 20 2a 2a 20 74 6f 20 28 70 54 6f 2d       ** to (pTo-
20770 3e 69 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29  >isOrdered==(-1)
20780 29 3d 3d 28 69 73 4f 72 64 65 72 65 64 3d 3d 28  )==(isOrdered==(
20790 2d 31 29 29 22 20 66 6f 72 20 74 68 65 20 72 61  -1))" for the ra
207a0 6e 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  nge.        ** o
207b0 66 20 6c 65 67 61 6c 20 76 61 6c 75 65 73 20 66  f legal values f
207c0 6f 72 20 69 73 4f 72 64 65 72 65 64 2c 20 2d 31  or isOrdered, -1
207d0 2e 2e 36 34 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ..64..        */
207e0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d  .        for(jj=
207f0 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e  0, pTo=aTo; jj<n
20800 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29  To; jj++, pTo++)
20810 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
20820 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d  pTo->maskLoop==m
20830 61 73 6b 4e 65 77 0a 20 20 20 20 20 20 20 20 20  askNew.         
20840 20 20 26 26 20 28 28 70 54 6f 2d 3e 69 73 4f 72    && ((pTo->isOr
20850 64 65 72 65 64 5e 69 73 4f 72 64 65 72 65 64 29  dered^isOrdered)
20860 26 30 78 38 30 29 3d 3d 30 0a 20 20 20 20 20 20  &0x80)==0.      
20870 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
20880 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 6a 3d     testcase( jj=
20890 3d 6e 54 6f 2d 31 20 29 3b 0a 20 20 20 20 20 20  =nTo-1 );.      
208a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
208b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
208c0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
208d0 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20  j>=nTo ){.      
208e0 20 20 20 20 2f 2a 20 4e 6f 6e 65 20 6f 66 20 74      /* None of t
208f0 68 65 20 65 78 69 73 74 69 6e 67 20 62 65 73 74  he existing best
20900 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 20 6d 61  -so-far paths ma
20910 74 63 68 20 74 68 65 20 63 61 6e 64 69 64 61 74  tch the candidat
20920 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
20930 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63  if( nTo>=mxChoic
20940 65 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  e.           && 
20950 28 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 7c 7c  (rCost>mxCost ||
20960 20 28 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20   (rCost==mxCost 
20970 26 26 20 72 55 6e 73 6f 72 74 65 64 3e 3d 6d 78  && rUnsorted>=mx
20980 55 6e 73 6f 72 74 65 64 29 29 0a 20 20 20 20 20  Unsorted)).     
20990 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
209a0 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65      /* The curre
209b0 6e 74 20 63 61 6e 64 69 64 61 74 65 20 69 73 20  nt candidate is 
209c0 6e 6f 20 62 65 74 74 65 72 20 74 68 61 6e 20 61  no better than a
209d0 6e 79 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69  ny of the mxChoi
209e0 63 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ce.            *
209f0 2a 20 70 61 74 68 73 20 63 75 72 72 65 6e 74 6c  * paths currentl
20a00 79 20 69 6e 20 74 68 65 20 62 65 73 74 2d 73 6f  y in the best-so
20a10 2d 66 61 72 20 62 75 66 66 65 72 2e 20 20 53 6f  -far buffer.  So
20a20 20 64 69 73 63 61 72 64 0a 20 20 20 20 20 20 20   discard.       
20a30 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 6e       ** this can
20a40 64 69 64 61 74 65 20 61 73 20 6e 6f 74 20 76 69  didate as not vi
20a50 61 62 6c 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20  able. */.#ifdef 
20a60 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
20a70 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20  ED /* 0x4 */.   
20a80 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
20a90 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30  ite3WhereTrace&0
20aa0 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x4 ){.          
20ab0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
20ac0 50 72 69 6e 74 66 28 22 53 6b 69 70 20 20 20 25  Printf("Skip   %
20ad0 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20  s cost=%-3d,%3d 
20ae0 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20  order=%c\n",.   
20af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
20b00 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72  herePathName(pFr
20b10 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f  om, iLoop, pWLoo
20b20 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c  p), rCost, nOut,
20b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20b40 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20     isOrdered>=0 
20b50 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20  ? isOrdered+'0' 
20b60 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
20b70 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
20b80 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
20b90 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
20ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
20bb0 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
20bc0 6e 74 73 20 69 74 20 6d 65 61 6e 73 20 74 68 61  nts it means tha
20bd0 74 20 74 68 65 20 6e 65 77 20 63 61 6e 64 69 64  t the new candid
20be0 61 74 65 20 70 61 74 68 0a 20 20 20 20 20 20 20  ate path.       
20bf0 20 20 20 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62     ** needs to b
20c00 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 73  e added to the s
20c10 65 74 20 6f 66 20 62 65 73 74 2d 73 6f 2d 66 61  et of best-so-fa
20c20 72 20 70 61 74 68 73 2e 20 2a 2f 0a 20 20 20 20  r paths. */.    
20c30 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3c 6d 78        if( nTo<mx
20c40 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20  Choice ){.      
20c50 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 61 73        /* Increas
20c60 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
20c70 65 20 61 54 6f 20 73 65 74 20 62 79 20 6f 6e 65  e aTo set by one
20c80 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
20c90 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20  jj = nTo++;.    
20ca0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
20cc0 70 61 74 68 20 72 65 70 6c 61 63 65 73 20 74 68  path replaces th
20cd0 65 20 70 72 69 6f 72 20 77 6f 72 73 74 20 74 6f  e prior worst to
20ce0 20 6b 65 65 70 20 63 6f 75 6e 74 20 62 65 6c 6f   keep count belo
20cf0 77 20 6d 78 43 68 6f 69 63 65 20 2a 2f 0a 20 20  w mxChoice */.  
20d00 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6d            jj = m
20d10 78 49 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  xI;.          }.
20d20 20 20 20 20 20 20 20 20 20 20 70 54 6f 20 3d 20            pTo = 
20d30 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65 66  &aTo[jj];.#ifdef
20d40 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
20d50 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20  LED /* 0x4 */.  
20d60 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
20d70 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78  te3WhereTrace&0x
20d80 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
20d90 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
20da0 6e 74 66 28 22 4e 65 77 20 20 20 20 25 73 20 63  ntf("New    %s c
20db0 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64  ost=%-3d,%3d ord
20dc0 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
20dd0 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
20de0 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69  athName(pFrom, i
20df0 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72  Loop, pWLoop), r
20e00 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20  Cost, nOut,.    
20e10 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
20e20 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64  dered>=0 ? isOrd
20e30 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b  ered+'0' : '?');
20e40 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  .          }.#en
20e50 64 69 66 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  dif.        }els
20e60 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
20e70 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68 65 73 20  Control reaches 
20e80 68 65 72 65 20 69 66 20 62 65 73 74 2d 73 6f 2d  here if best-so-
20e90 66 61 72 20 70 61 74 68 20 70 54 6f 3d 61 54 6f  far path pTo=aTo
20ea0 5b 6a 6a 5d 20 63 6f 76 65 72 73 20 74 68 65 0a  [jj] covers the.
20eb0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d            ** sam
20ec0 65 20 73 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61  e set of loops a
20ed0 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d 20 69  nd has the sam i
20ee0 73 4f 72 64 65 72 65 64 20 73 65 74 74 69 6e 67  sOrdered setting
20ef0 20 61 73 20 74 68 65 0a 20 20 20 20 20 20 20 20   as the.        
20f00 20 20 2a 2a 20 63 61 6e 64 69 64 61 74 65 20 70    ** candidate p
20f10 61 74 68 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  ath.  Check to s
20f20 65 65 20 69 66 20 74 68 65 20 63 61 6e 64 69 64  ee if the candid
20f30 61 74 65 20 73 68 6f 75 6c 64 20 72 65 70 6c 61  ate should repla
20f40 63 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ce.          ** 
20f50 70 54 6f 20 6f 72 20 69 66 20 74 68 65 20 63 61  pTo or if the ca
20f60 6e 64 69 64 61 74 65 20 73 68 6f 75 6c 64 20 62  ndidate should b
20f70 65 20 73 6b 69 70 70 65 64 20 2a 2f 0a 20 20 20  e skipped */.   
20f80 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
20f90 72 43 6f 73 74 3c 72 43 6f 73 74 20 7c 7c 20 28  rCost<rCost || (
20fa0 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73  pTo->rCost==rCos
20fb0 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c 3d  t && pTo->nRow<=
20fc0 6e 4f 75 74 29 20 29 7b 0a 23 69 66 64 65 66 20  nOut) ){.#ifdef 
20fd0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
20fe0 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20  ED /* 0x4 */.   
20ff0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
21000 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30  ite3WhereTrace&0
21010 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x4 ){.          
21020 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
21030 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
21040 20 20 20 20 20 20 20 20 20 20 22 53 6b 69 70 20            "Skip 
21050 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25    %s cost=%-3d,%
21060 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20  3d order=%c",.  
21070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21080 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
21090 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
210a0 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74  op), rCost, nOut
210b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
210c0 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30      isOrdered>=0
210d0 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27   ? isOrdered+'0'
210e0 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
210f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
21100 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 76 73  bugPrintf("   vs
21110 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 64   %s cost=%-3d,%d
21120 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20   order=%c\n",.  
21130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21140 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54  wherePathName(pT
21150 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20  o, iLoop+1, 0), 
21160 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d  pTo->rCost, pTo-
21170 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20  >nRow,.         
21180 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73           pTo->is
21190 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f  Ordered>=0 ? pTo
211a0 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20  ->isOrdered+'0' 
211b0 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
211c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
211d0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 63           /* Disc
211e0 61 72 64 20 74 68 65 20 63 61 6e 64 69 64 61 74  ard the candidat
211f0 65 20 70 61 74 68 20 66 72 6f 6d 20 66 75 72 74  e path from furt
21200 68 65 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f  her consideratio
21210 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  n */.           
21220 20 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e   testcase( pTo->
21230 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20 29 3b 0a  rCost==rCost );.
21240 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
21250 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
21260 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  }.          test
21270 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74  case( pTo->rCost
21280 3d 3d 72 43 6f 73 74 2b 31 20 29 3b 0a 20 20 20  ==rCost+1 );.   
21290 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f         /* Contro
212a0 6c 20 72 65 61 63 68 65 73 20 68 65 72 65 20 69  l reaches here i
212b0 66 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20  f the candidate 
212c0 70 61 74 68 20 69 73 20 62 65 74 74 65 72 20 74  path is better t
212d0 68 61 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20  han the.        
212e0 20 20 2a 2a 20 70 54 6f 20 70 61 74 68 2e 20 20    ** pTo path.  
212f0 52 65 70 6c 61 63 65 20 70 54 6f 20 77 69 74 68  Replace pTo with
21300 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 2e 20   the candidate. 
21310 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  */.#ifdef WHERET
21320 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
21330 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  0x4 */.         
21340 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
21350 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20  eTrace&0x4 ){.  
21360 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
21370 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20  3DebugPrintf(.  
21380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 55                "U
21390 70 64 61 74 65 20 25 73 20 63 6f 73 74 3d 25 2d  pdate %s cost=%-
213a0 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22  3d,%3d order=%c"
213b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
213c0 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
213d0 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57  pFrom, iLoop, pW
213e0 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f  Loop), rCost, nO
213f0 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ut,.            
21400 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30      isOrdered>=0
21410 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27   ? isOrdered+'0'
21420 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
21430 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
21440 67 50 72 69 6e 74 66 28 22 20 20 77 61 73 20 25  gPrintf("  was %
21450 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20  s cost=%-3d,%3d 
21460 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20  order=%c\n",.   
21470 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
21480 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20  rePathName(pTo, 
21490 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f  iLoop+1, 0), pTo
214a0 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52  ->rCost, pTo->nR
214b0 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow,.            
214c0 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72      pTo->isOrder
214d0 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f  ed>=0 ? pTo->isO
214e0 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27  rdered+'0' : '?'
214f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23  );.          }.#
21500 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a  endif.        }.
21510 20 20 20 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f          /* pWLoo
21520 70 20 69 73 20 61 20 77 69 6e 6e 65 72 2e 20 20  p is a winner.  
21530 41 64 64 20 69 74 20 74 6f 20 74 68 65 20 73 65  Add it to the se
21540 74 20 6f 66 20 62 65 73 74 20 73 6f 20 66 61 72  t of best so far
21550 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 2d   */.        pTo-
21560 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f  >maskLoop = pFro
21570 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57  m->maskLoop | pW
21580 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  Loop->maskSelf;.
21590 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 65 76          pTo->rev
215a0 4c 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a  Loop = revMask;.
215b0 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f          pTo->nRo
215c0 77 20 3d 20 6e 4f 75 74 3b 0a 20 20 20 20 20 20  w = nOut;.      
215d0 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72    pTo->rCost = r
215e0 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 70 54  Cost;.        pT
215f0 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 20 3d 20 72  o->rUnsorted = r
21600 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20  Unsorted;.      
21610 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64    pTo->isOrdered
21620 20 3d 20 69 73 4f 72 64 65 72 65 64 3b 0a 20 20   = isOrdered;.  
21630 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 6f        memcpy(pTo
21640 2d 3e 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e  ->aLoop, pFrom->
21650 61 4c 6f 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68  aLoop, sizeof(Wh
21660 65 72 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29  ereLoop*)*iLoop)
21670 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 61  ;.        pTo->a
21680 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57  Loop[iLoop] = pW
21690 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66  Loop;.        if
216a0 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20  ( nTo>=mxChoice 
216b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 49  ){.          mxI
216c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
216d0 6d 78 43 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e  mxCost = aTo[0].
216e0 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20  rCost;.         
216f0 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 61 54   mxUnsorted = aT
21700 6f 5b 30 5d 2e 6e 52 6f 77 3b 0a 20 20 20 20 20  o[0].nRow;.     
21710 20 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70       for(jj=1, p
21720 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d  To=&aTo[1]; jj<m
21730 78 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70  xChoice; jj++, p
21740 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  To++){.         
21750 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73     if( pTo->rCos
21760 74 3e 6d 78 43 6f 73 74 20 0a 20 20 20 20 20 20  t>mxCost .      
21770 20 20 20 20 20 20 20 7c 7c 20 28 70 54 6f 2d 3e         || (pTo->
21780 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26  rCost==mxCost &&
21790 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3e   pTo->rUnsorted>
217a0 6d 78 55 6e 73 6f 72 74 65 64 29 20 0a 20 20 20  mxUnsorted) .   
217b0 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
217c0 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74            mxCost
217d0 20 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20   = pTo->rCost;. 
217e0 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 55               mxU
217f0 6e 73 6f 72 74 65 64 20 3d 20 70 54 6f 2d 3e 72  nsorted = pTo->r
21800 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20  Unsorted;.      
21810 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20 6a 6a          mxI = jj
21820 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
21830 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21840 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
21850 20 20 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52    }..#ifdef WHER
21860 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 20  ETRACE_ENABLED  
21870 2f 2a 20 3e 3d 32 20 2a 2f 0a 20 20 20 20 69 66  /* >=2 */.    if
21880 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
21890 61 63 65 20 26 20 30 78 30 32 20 29 7b 0a 20 20  ace & 0x02 ){.  
218a0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
218b0 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 61 66 74  Printf("---- aft
218c0 65 72 20 72 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d  er round %d ----
218d0 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20 20  \n", iLoop);.   
218e0 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 54 6f     for(ii=0, pTo
218f0 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69 69  =aTo; ii<nTo; ii
21900 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20  ++, pTo++){.    
21910 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
21920 50 72 69 6e 74 66 28 22 20 25 73 20 63 6f 73 74  Printf(" %s cost
21930 3d 25 2d 33 64 20 6e 72 6f 77 3d 25 2d 33 64 20  =%-3d nrow=%-3d 
21940 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20  order=%c",.     
21950 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
21960 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31  ame(pTo, iLoop+1
21970 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74  , 0), pTo->rCost
21980 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20  , pTo->nRow,.   
21990 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f          pTo->isO
219a0 72 64 65 72 65 64 3e 3d 30 20 3f 20 28 70 54 6f  rdered>=0 ? (pTo
219b0 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27 29  ->isOrdered+'0')
219c0 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
219d0 20 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65   if( pTo->isOrde
219e0 72 65 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  red>0 ){.       
219f0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
21a00 72 69 6e 74 66 28 22 20 72 65 76 3d 30 78 25 6c  rintf(" rev=0x%l
21a10 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c  lx\n", pTo->revL
21a20 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  oop);.        }e
21a30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
21a40 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
21a50 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  f("\n");.       
21a60 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
21a70 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
21a80 53 77 61 70 20 74 68 65 20 72 6f 6c 65 73 20 6f  Swap the roles o
21a90 66 20 61 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20  f aFrom and aTo 
21aa0 66 6f 72 20 74 68 65 20 6e 65 78 74 20 67 65 6e  for the next gen
21ab0 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70  eration */.    p
21ac0 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20  From = aTo;.    
21ad0 61 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20  aTo = aFrom;.   
21ae0 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a   aFrom = pFrom;.
21af0 20 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b      nFrom = nTo;
21b00 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f  .  }..  if( nFro
21b10 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  m==0 ){.    sqli
21b20 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
21b30 73 65 2c 20 22 6e 6f 20 71 75 65 72 79 20 73 6f  se, "no query so
21b40 6c 75 74 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71  lution");.    sq
21b50 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
21b60 70 53 70 61 63 65 29 3b 0a 20 20 20 20 72 65 74  pSpace);.    ret
21b70 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
21b80 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69  ;.  }.  .  /* Fi
21b90 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  nd the lowest co
21ba0 73 74 20 70 61 74 68 2e 20 20 70 46 72 6f 6d 20  st path.  pFrom 
21bb0 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69  will be left poi
21bc0 6e 74 69 6e 67 20 74 6f 20 74 68 61 74 20 70 61  nting to that pa
21bd0 74 68 20 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20  th */.  pFrom = 
21be0 61 46 72 6f 6d 3b 0a 20 20 66 6f 72 28 69 69 3d  aFrom;.  for(ii=
21bf0 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b  1; ii<nFrom; ii+
21c00 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 72 6f  +){.    if( pFro
21c10 6d 2d 3e 72 43 6f 73 74 3e 61 46 72 6f 6d 5b 69  m->rCost>aFrom[i
21c20 69 5d 2e 72 43 6f 73 74 20 29 20 70 46 72 6f 6d  i].rCost ) pFrom
21c30 20 3d 20 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20   = &aFrom[ii];. 
21c40 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 57 49   }.  assert( pWI
21c50 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f  nfo->nLevel==nLo
21c60 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20  op );.  /* Load 
21c70 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
21c80 70 61 74 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f  path into pWInfo
21c90 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d   */.  for(iLoop=
21ca0 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20  0; iLoop<nLoop; 
21cb0 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68  iLoop++){.    Wh
21cc0 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
21cd0 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69   = pWInfo->a + i
21ce0 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Loop;.    pLevel
21cf0 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f  ->pWLoop = pWLoo
21d00 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  p = pFrom->aLoop
21d10 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65  [iLoop];.    pLe
21d20 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c  vel->iFrom = pWL
21d30 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20 20 20 70  oop->iTab;.    p
21d40 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d  Level->iTabCur =
21d50 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
21d60 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
21d70 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d  om].iCursor;.  }
21d80 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e  .  if( (pWInfo->
21d90 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
21da0 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
21db0 29 21 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e  )!=0.   && (pWIn
21dc0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
21dd0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
21de0 59 29 3d 3d 30 0a 20 20 20 26 26 20 70 57 49 6e  Y)==0.   && pWIn
21df0 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57  fo->eDistinct==W
21e00 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f  HERE_DISTINCT_NO
21e10 4f 50 0a 20 20 20 26 26 20 6e 52 6f 77 45 73 74  OP.   && nRowEst
21e20 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73  .  ){.    Bitmas
21e30 6b 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 69  k notUsed;.    i
21e40 6e 74 20 72 63 20 3d 20 77 68 65 72 65 50 61 74  nt rc = wherePat
21e50 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42  hSatisfiesOrderB
21e60 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f  y(pWInfo, pWInfo
21e70 2d 3e 70 52 65 73 75 6c 74 53 65 74 2c 20 70 46  ->pResultSet, pF
21e80 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rom,.           
21e90 20 20 20 20 20 20 57 48 45 52 45 5f 44 49 53 54        WHERE_DIST
21ea0 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c  INCTBY, nLoop-1,
21eb0 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c   pFrom->aLoop[nL
21ec0 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64  oop-1], &notUsed
21ed0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 70  );.    if( rc==p
21ee0 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65  WInfo->pResultSe
21ef0 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
21f00 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69    pWInfo->eDisti
21f10 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54  nct = WHERE_DIST
21f20 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20  INCT_ORDERED;.  
21f30 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57    }.  }.  if( pW
21f40 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29  Info->pOrderBy )
21f50 7b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  {.    if( pWInfo
21f60 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
21f70 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20  HERE_DISTINCTBY 
21f80 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72  ){.      if( pFr
21f90 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d 70  om->isOrdered==p
21fa0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d  WInfo->pOrderBy-
21fb0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
21fc0 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69    pWInfo->eDisti
21fd0 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54  nct = WHERE_DIST
21fe0 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20  INCT_ORDERED;.  
21ff0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
22000 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e  .      pWInfo->n
22010 4f 42 53 61 74 20 3d 20 70 46 72 6f 6d 2d 3e 69  OBSat = pFrom->i
22020 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20  sOrdered;.      
22030 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53  if( pWInfo->nOBS
22040 61 74 3c 30 20 29 20 70 57 49 6e 66 6f 2d 3e 6e  at<0 ) pWInfo->n
22050 4f 42 53 61 74 20 3d 20 30 3b 0a 20 20 20 20 20  OBSat = 0;.     
22060 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b   pWInfo->revMask
22070 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f   = pFrom->revLoo
22080 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  p;.    }.    if(
22090 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
220a0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4f 52  lags & WHERE_SOR
220b0 54 42 59 47 52 4f 55 50 29 0a 20 20 20 20 20 20  TBYGROUP).      
220c0 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42    && pWInfo->nOB
220d0 53 61 74 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72  Sat==pWInfo->pOr
220e0 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 26 26 20  derBy->nExpr && 
220f0 6e 4c 6f 6f 70 3e 30 0a 20 20 20 20 29 7b 0a 20  nLoop>0.    ){. 
22100 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76       Bitmask rev
22110 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  Mask = 0;.      
22120 69 6e 74 20 6e 4f 72 64 65 72 20 3d 20 77 68 65  int nOrder = whe
22130 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f  rePathSatisfiesO
22140 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70  rderBy(pWInfo, p
22150 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c  WInfo->pOrderBy,
22160 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f   .          pFro
22170 6d 2c 20 30 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70  m, 0, nLoop-1, p
22180 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f  From->aLoop[nLoo
22190 70 2d 31 5d 2c 20 26 72 65 76 4d 61 73 6b 0a 20  p-1], &revMask. 
221a0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73       );.      as
221b0 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 73 6f  sert( pWInfo->so
221c0 72 74 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 20  rted==0 );.     
221d0 20 69 66 28 20 6e 4f 72 64 65 72 3d 3d 70 57 49   if( nOrder==pWI
221e0 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  nfo->pOrderBy->n
221f0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
22200 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 20 3d  pWInfo->sorted =
22210 20 31 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e   1;.        pWIn
22220 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 72 65  fo->revMask = re
22230 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  vMask;.      }. 
22240 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 70 57 49     }.  }...  pWI
22250 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 70  nfo->nRowOut = p
22260 46 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f  From->nRow;..  /
22270 2a 20 46 72 65 65 20 74 65 6d 70 6f 72 61 72 79  * Free temporary
22280 20 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65 74 75   memory and retu
22290 72 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20  rn success */.  
222a0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
222b0 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 72 65 74  , pSpace);.  ret
222c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
222d0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75 65  ../*.** Most que
222e0 72 69 65 73 20 75 73 65 20 6f 6e 6c 79 20 61 20  ries use only a 
222f0 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 28 74 68  single table (th
22300 65 79 20 61 72 65 20 6e 6f 74 20 6a 6f 69 6e 73  ey are not joins
22310 29 20 61 6e 64 20 68 61 76 65 0a 2a 2a 20 73 69  ) and have.** si
22320 6d 70 6c 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69  mple == constrai
22330 6e 74 73 20 61 67 61 69 6e 73 74 20 69 6e 64 65  nts against inde
22340 78 65 64 20 66 69 65 6c 64 73 2e 20 20 54 68 69  xed fields.  Thi
22350 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
22360 74 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20 74 68  ts.** to plan th
22370 6f 73 65 20 73 69 6d 70 6c 65 20 63 61 73 65 73  ose simple cases
22380 20 75 73 69 6e 67 20 6d 75 63 68 20 6c 65 73 73   using much less
22390 20 63 65 72 65 6d 6f 6e 79 20 74 68 61 6e 20 74   ceremony than t
223a0 68 65 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75  he.** general-pu
223b0 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e  rpose query plan
223c0 6e 65 72 2c 20 61 6e 64 20 74 68 65 72 65 62 79  ner, and thereby
223d0 20 79 69 65 6c 64 20 66 61 73 74 65 72 20 73 71   yield faster sq
223e0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 0a  lite3_prepare().
223f0 2a 2a 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65  ** times for the
22400 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a   common case..**
22410 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  .** Return non-z
22420 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ero on success, 
22430 69 66 20 74 68 69 73 20 71 75 65 72 79 20 63 61  if this query ca
22440 6e 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20  n be handled by 
22450 74 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c  this.** no-frill
22460 73 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e  s query planner.
22470 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 69 66    Return zero if
22480 20 74 68 69 73 20 71 75 65 72 79 20 6e 65 65 64   this query need
22490 73 20 74 68 65 20 0a 2a 2a 20 67 65 6e 65 72 61  s the .** genera
224a0 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79 20  l-purpose query 
224b0 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74  planner..*/.stat
224c0 69 63 20 69 6e 74 20 77 68 65 72 65 53 68 6f 72  ic int whereShor
224d0 74 43 75 74 28 57 68 65 72 65 4c 6f 6f 70 42 75  tCut(WhereLoopBu
224e0 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29  ilder *pBuilder)
224f0 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
22500 57 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  WInfo;.  struct 
22510 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
22520 74 65 6d 3b 0a 20 20 57 68 65 72 65 43 6c 61 75  tem;.  WhereClau
22530 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65  se *pWC;.  Where
22540 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 57  Term *pTerm;.  W
22550 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
22560 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69  .  int iCur;.  i
22570 6e 74 20 6a 3b 0a 20 20 54 61 62 6c 65 20 2a 70  nt j;.  Table *p
22580 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  Tab;.  Index *pI
22590 64 78 3b 0a 20 20 0a 20 20 70 57 49 6e 66 6f 20  dx;.  .  pWInfo 
225a0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
225b0 66 6f 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f  fo;.  if( pWInfo
225c0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
225d0 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45  HERE_FORCE_TABLE
225e0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
225f0 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70  ssert( pWInfo->p
22600 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 31  TabList->nSrc>=1
22610 20 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57   );.  pItem = pW
22620 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
22630 61 3b 0a 20 20 70 54 61 62 20 3d 20 70 49 74 65  a;.  pTab = pIte
22640 6d 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28 20 49  m->pTab;.  if( I
22650 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
22660 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
22670 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64   pItem->fg.isInd
22680 65 78 65 64 42 79 20 29 20 72 65 74 75 72 6e 20  exedBy ) return 
22690 30 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65  0;.  iCur = pIte
226a0 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 57  m->iCursor;.  pW
226b0 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  C = &pWInfo->sWC
226c0 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 42 75 69  ;.  pLoop = pBui
226d0 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c  lder->pNew;.  pL
226e0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30  oop->wsFlags = 0
226f0 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70  ;.  pLoop->nSkip
22700 20 3d 20 30 3b 0a 20 20 70 54 65 72 6d 20 3d 20   = 0;.  pTerm = 
22710 73 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64  sqlite3WhereFind
22720 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
22730 2d 31 2c 20 30 2c 20 57 4f 5f 45 51 7c 57 4f 5f  -1, 0, WO_EQ|WO_
22740 49 53 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54  IS, 0);.  if( pT
22750 65 72 6d 20 29 7b 0a 20 20 20 20 74 65 73 74 63  erm ){.    testc
22760 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
22770 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b  rator & WO_IS );
22780 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  .    pLoop->wsFl
22790 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55  ags = WHERE_COLU
227a0 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 49 50 4b 7c  MN_EQ|WHERE_IPK|
227b0 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20  WHERE_ONEROW;.  
227c0 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b    pLoop->aLTerm[
227d0 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
227e0 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  pLoop->nLTerm = 
227f0 31 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  1;.    pLoop->u.
22800 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20  btree.nEq = 1;. 
22810 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f     /* TUNING: Co
22820 73 74 20 6f 66 20 61 20 72 6f 77 69 64 20 6c 6f  st of a rowid lo
22830 6f 6b 75 70 20 69 73 20 31 30 20 2a 2f 0a 20 20  okup is 10 */.  
22840 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20    pLoop->rRun = 
22850 33 33 3b 20 20 2f 2a 20 33 33 3d 3d 73 71 6c 69  33;  /* 33==sqli
22860 74 65 33 4c 6f 67 45 73 74 28 31 30 29 20 2a 2f  te3LogEst(10) */
22870 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
22880 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
22890 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
228a0 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
228b0 20 20 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 0a      int opMask;.
228c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
228d0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  oop->aLTermSpace
228e0 3d 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 20  ==pLoop->aLTerm 
228f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 49 73  );.      if( !Is
22900 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78  UniqueIndex(pIdx
22910 29 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78  ).       || pIdx
22920 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21  ->pPartIdxWhere!
22930 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 49  =0 .       || pI
22940 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 41 72 72 61  dx->nKeyCol>Arra
22950 79 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54  ySize(pLoop->aLT
22960 65 72 6d 53 70 61 63 65 29 20 0a 20 20 20 20 20  ermSpace) .     
22970 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
22980 20 20 20 6f 70 4d 61 73 6b 20 3d 20 70 49 64 78     opMask = pIdx
22990 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3f 20  ->uniqNotNull ? 
229a0 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 3a 20  (WO_EQ|WO_IS) : 
229b0 57 4f 5f 45 51 3b 0a 20 20 20 20 20 20 66 6f 72  WO_EQ;.      for
229c0 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b  (j=0; j<pIdx->nK
229d0 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  eyCol; j++){.   
229e0 20 20 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c       pTerm = sql
229f0 69 74 65 33 57 68 65 72 65 46 69 6e 64 54 65 72  ite3WhereFindTer
22a00 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20  m(pWC, iCur, j, 
22a10 30 2c 20 6f 70 4d 61 73 6b 2c 20 70 49 64 78 29  0, opMask, pIdx)
22a20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
22a30 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  erm==0 ) break;.
22a40 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
22a50 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
22a60 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20  or & WO_IS );.  
22a70 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54        pLoop->aLT
22a80 65 72 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm[j] = pTerm;.
22a90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
22aa0 28 20 6a 21 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  ( j!=pIdx->nKeyC
22ab0 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ol ) continue;. 
22ac0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c       pLoop->wsFl
22ad0 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55  ags = WHERE_COLU
22ae0 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52  MN_EQ|WHERE_ONER
22af0 4f 57 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44  OW|WHERE_INDEXED
22b00 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
22b10 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 7c 7c 20  ->isCovering || 
22b20 28 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20  (pItem->colUsed 
22b30 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65  & ~columnsInInde
22b40 78 28 70 49 64 78 29 29 3d 3d 30 20 29 7b 0a 20  x(pIdx))==0 ){. 
22b50 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73         pLoop->ws
22b60 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49  Flags |= WHERE_I
22b70 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  DX_ONLY;.      }
22b80 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c  .      pLoop->nL
22b90 54 65 72 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20  Term = j;.      
22ba0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
22bb0 45 71 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c  Eq = j;.      pL
22bc0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
22bd0 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20  dex = pIdx;.    
22be0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73    /* TUNING: Cos
22bf0 74 20 6f 66 20 61 20 75 6e 69 71 75 65 20 69 6e  t of a unique in
22c00 64 65 78 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35  dex lookup is 15
22c10 20 2a 2f 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d   */.      pLoop-
22c20 3e 72 52 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20  >rRun = 39;  /* 
22c30 33 39 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  39==sqlite3LogEs
22c40 74 28 31 35 29 20 2a 2f 0a 20 20 20 20 20 20 62  t(15) */.      b
22c50 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
22c60 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
22c70 6c 61 67 73 20 29 7b 0a 20 20 20 20 70 4c 6f 6f  lags ){.    pLoo
22c80 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73  p->nOut = (LogEs
22c90 74 29 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  t)1;.    pWInfo-
22ca0 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70  >a[0].pWLoop = p
22cb0 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  Loop;.    pLoop-
22cc0 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 73 71 6c 69  >maskSelf = sqli
22cd0 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28  te3WhereGetMask(
22ce0 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
22cf0 74 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 70 57  t, iCur);.    pW
22d00 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62 43  Info->a[0].iTabC
22d10 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70  ur = iCur;.    p
22d20 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d  WInfo->nRowOut =
22d30 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e   1;.    if( pWIn
22d40 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 70  fo->pOrderBy ) p
22d50 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20  WInfo->nOBSat = 
22d60 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
22d70 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 66  y->nExpr;.    if
22d80 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  ( pWInfo->wctrlF
22d90 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
22da0 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20  T_DISTINCT ){.  
22db0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
22dc0 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
22dd0 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20  STINCT_UNIQUE;. 
22de0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
22df0 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70 4c 6f  TE_DEBUG.    pLo
22e00 6f 70 2d 3e 63 49 64 20 3d 20 27 30 27 3b 0a 23  op->cId = '0';.#
22e10 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
22e20 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
22e30 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   0;.}../*.** Gen
22e40 65 72 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e  erate the beginn
22e50 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  ing of the loop 
22e60 75 73 65 64 20 66 6f 72 20 57 48 45 52 45 20 63  used for WHERE c
22e70 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
22e80 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
22e90 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74  value is a point
22ea0 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20  er to an opaque 
22eb0 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63  structure that c
22ec0 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72  ontains.** infor
22ed0 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f  mation needed to
22ee0 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
22ef0 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65  oop.  Later, the
22f00 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
22f10 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b  .** should invok
22f20 65 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  e sqlite3WhereEn
22f30 64 28 29 20 77 69 74 68 20 74 68 65 20 72 65 74  d() with the ret
22f40 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69  urn value of thi
22f50 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e  s function.** in
22f60 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65   order to comple
22f70 74 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  te the WHERE cla
22f80 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
22f90 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
22fa0 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72  r occurs, this r
22fb0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e  outine returns N
22fc0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62  ULL..**.** The b
22fd0 61 73 69 63 20 69 64 65 61 20 69 73 20 74 6f 20  asic idea is to 
22fe0 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70  do a nested loop
22ff0 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65  , one loop for e
23000 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20  ach table in.** 
23010 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
23020 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49  of a select.  (I
23030 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45  NSERT and UPDATE
23040 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
23050 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61  the.** same as a
23060 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c   SELECT with onl
23070 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  y a single table
23080 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
23090 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78  use.)  For.** ex
230a0 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51  ample, if the SQ
230b0 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  L is this:.**.**
230c0 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20         SELECT * 
230d0 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20  FROM t1, t2, t3 
230e0 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a  WHERE ...;.**.**
230f0 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67   Then the code g
23100 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63  enerated is conc
23110 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68  eptually like th
23120 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
23130 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  **      foreach 
23140 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20  row1 in t1 do   
23150 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65      \    Code ge
23160 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  nerated.**      
23170 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69    foreach row2 i
23180 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d  n t2 do      |--
23190 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
231a0 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20  Begin().**      
231b0 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33      foreach row3
231c0 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a   in t3 do   /.**
231d0 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a              ....
231e0 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64 20  **          end 
231f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23200 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65      \    Code ge
23210 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  nerated.**      
23220 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
23230 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d               |--
23240 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
23250 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e  End().**      en
23260 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
23270 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a            /.**.*
23280 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
23290 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20  loops might not 
232a0 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65  be nested in the
232b0 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20   order in which 
232c0 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69  they.** appear i
232d0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
232e0 65 20 69 66 20 61 20 64 69 66 66 65 72 65 6e 74  e if a different
232f0 20 6f 72 64 65 72 20 69 73 20 62 65 74 74 65 72   order is better
23300 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a   able to make.**
23310 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e   use of indices.
23320 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74    Note also that
23330 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65   when the IN ope
23340 72 61 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e  rator appears in
23350 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c  .** the WHERE cl
23360 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72  ause, it might r
23370 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f  esult in additio
23380 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73  nal nested loops
23390 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67   for.** scanning
233a0 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c   through all val
233b0 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ues on the right
233c0 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
233d0 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  e IN..**.** Ther
233e0 65 20 61 72 65 20 42 74 72 65 65 20 63 75 72 73  e are Btree curs
233f0 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ors associated w
23400 69 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20  ith each table. 
23410 20 74 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a   t1 uses cursor.
23420 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69  ** number pTabLi
23430 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  st->a[0].iCursor
23440 2e 20 20 74 32 20 75 73 65 73 20 74 68 65 20 63  .  t2 uses the c
23450 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e  ursor pTabList->
23460 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a  a[1].iCursor..**
23470 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20   And so forth.  
23480 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
23490 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f  erates code to o
234a0 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63  pen those VDBE c
234b0 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71  ursors.** and sq
234c0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20  lite3WhereEnd() 
234d0 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
234e0 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d  de to close them
234f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  ..**.** The code
23500 20 74 68 61 74 20 73 71 6c 69 74 65 33 57 68 65   that sqlite3Whe
23510 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61  reBegin() genera
23520 74 65 73 20 6c 65 61 76 65 73 20 74 68 65 20 63  tes leaves the c
23530 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20  ursors named.** 
23540 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e  in pTabList poin
23550 74 69 6e 67 20 61 74 20 74 68 65 69 72 20 61 70  ting at their ap
23560 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65  propriate entrie
23570 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f  s.  The [...] co
23580 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50  de.** can use OP
23590 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52  _Column and OP_R
235a0 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20  owid opcodes on 
235b0 74 68 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f  these cursors to
235c0 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61   extract.** data
235d0 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75   from the variou
235e0 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20  s tables of the 
235f0 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  loop..**.** If t
23600 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
23610 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f  is empty, the fo
23620 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74  reach loops must
23630 20 65 61 63 68 20 73 63 61 6e 20 74 68 65 69 72   each scan their
23640 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65  .** entire table
23650 73 2e 20 20 54 68 75 73 20 61 20 74 68 72 65 65  s.  Thus a three
23660 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20  -way join is an 
23670 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e  O(N^3) operation
23680 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65  .  But if.** the
23690 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64   tables have ind
236a0 69 63 65 73 20 61 6e 64 20 74 68 65 72 65 20 61  ices and there a
236b0 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  re terms in the 
236c0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
236d0 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68  t.** refer to th
236e0 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63  ose indices, a c
236f0 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63  omplete table sc
23700 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65  an can be avoide
23710 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64  d and the.** cod
23720 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20  e will run much 
23730 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66  faster.  Most of
23740 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69   the work of thi
23750 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65  s routine is che
23760 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20  cking.** to see 
23770 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 64  if there are ind
23780 69 63 65 73 20 74 68 61 74 20 63 61 6e 20 62 65  ices that can be
23790 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75   used to speed u
237a0 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a  p the loop..**.*
237b0 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57  * Terms of the W
237c0 48 45 52 45 20 63 6c 61 75 73 65 20 61 72 65 20  HERE clause are 
237d0 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d  also used to lim
237e0 69 74 20 77 68 69 63 68 20 72 6f 77 73 20 61 63  it which rows ac
237f0 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69  tually.** make i
23800 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69  t to the "..." i
23810 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20  n the middle of 
23820 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72  the loop.  After
23830 20 65 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c   each "foreach",
23840 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65  .** terms of the
23850 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
23860 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d  at use only term
23870 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61  s in that loop a
23880 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70  nd outer.** loop
23890 73 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  s are evaluated 
238a0 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a  and if false a j
238b0 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75  ump is made arou
238c0 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e  nd all subsequen
238d0 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73  t.** inner loops
238e0 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20   (or around the 
238f0 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73  "..." if the tes
23900 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  t occurs within 
23910 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f  the inner-.** mo
23920 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f  st loop).**.** O
23930 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a  UTER JOINS.**.**
23940 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f   An outer join o
23950 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20  f tables t1 and 
23960 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c  t2 is conceptall
23970 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f  y coded as follo
23980 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72  ws:.**.**    for
23990 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20  each row1 in t1 
239a0 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20  do.**      flag 
239b0 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65  = 0.**      fore
239c0 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64  ach row2 in t2 d
239d0 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72  o.**        star
239e0 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e  t:.**          .
239f0 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66  ...**          f
23a00 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20  lag = 1.**      
23a10 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66  end.**      if f
23a20 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20  lag==0 then.**  
23a30 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72        move the r
23a40 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20  ow2 cursor to a 
23a50 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20  null row.**     
23a60 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a     goto start.**
23a70 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65        fi.**    e
23a80 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42  nd.**.** ORDER B
23a90 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53  Y CLAUSE PROCESS
23aa0 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72  ING.**.** pOrder
23ab0 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  By is a pointer 
23ac0 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
23ad0 63 6c 61 75 73 65 20 28 6f 72 20 74 68 65 20 47  clause (or the G
23ae0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 2a  ROUP BY clause.*
23af0 2a 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 47  * if the WHERE_G
23b00 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20 73  ROUPBY flag is s
23b10 65 74 20 69 6e 20 77 63 74 72 6c 46 6c 61 67 73  et in wctrlFlags
23b20 29 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74  ) of a SELECT st
23b30 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 66 20 74 68  atement.** if th
23b40 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20  ere is one.  If 
23b50 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45  there is no ORDE
23b60 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69  R BY clause or i
23b70 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  f this routine.*
23b80 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  * is called from
23b90 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
23ba0 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20  LETE statement, 
23bb0 74 68 65 6e 20 70 4f 72 64 65 72 42 79 20 69 73  then pOrderBy is
23bc0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   NULL..**.** The
23bd0 20 69 49 64 78 43 75 72 20 70 61 72 61 6d 65 74   iIdxCur paramet
23be0 65 72 20 69 73 20 74 68 65 20 63 75 72 73 6f 72  er is the cursor
23bf0 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e   number of an in
23c00 64 65 78 2e 20 20 49 66 20 0a 2a 2a 20 57 48 45  dex.  If .** WHE
23c10 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
23c20 20 69 73 20 73 65 74 2c 20 69 49 64 78 43 75 72   is set, iIdxCur
23c30 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e   is the cursor n
23c40 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65  umber of an inde
23c50 78 0a 2a 2a 20 74 6f 20 75 73 65 20 66 6f 72 20  x.** to use for 
23c60 4f 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  OR clause proces
23c70 73 69 6e 67 2e 20 20 54 68 65 20 57 48 45 52 45  sing.  The WHERE
23c80 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 75   clause should u
23c90 73 65 20 74 68 69 73 0a 2a 2a 20 73 70 65 63 69  se this.** speci
23ca0 66 69 63 20 63 75 72 73 6f 72 2e 20 20 49 66 20  fic cursor.  If 
23cb0 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
23cc0 53 49 52 45 44 20 69 73 20 73 65 74 2c 20 74 68  SIRED is set, th
23cd0 65 6e 20 69 49 64 78 43 75 72 20 69 73 0a 2a 2a  en iIdxCur is.**
23ce0 20 74 68 65 20 66 69 72 73 74 20 63 75 72 73 6f   the first curso
23cf0 72 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  r in an array of
23d00 20 63 75 72 73 6f 72 73 20 66 6f 72 20 61 6c 6c   cursors for all
23d10 20 69 6e 64 69 63 65 73 2e 20 20 69 49 64 78 43   indices.  iIdxC
23d20 75 72 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  ur should.** be 
23d30 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  used to compute 
23d40 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
23d50 63 75 72 73 6f 72 20 64 65 70 65 6e 64 69 6e 67  cursor depending
23d60 20 6f 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20   on which index 
23d70 69 73 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 57  is.** used..*/.W
23d80 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65  hereInfo *sqlite
23d90 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50  3WhereBegin(.  P
23da0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
23db0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
23dc0 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
23dd0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
23de0 74 2c 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  t,    /* FROM cl
23df0 61 75 73 65 3a 20 41 20 6c 69 73 74 20 6f 66 20  ause: A list of 
23e00 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65  all tables to be
23e10 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78   scanned */.  Ex
23e20 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
23e30 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
23e40 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
23e50 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
23e60 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42     /* An ORDER B
23e70 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20  Y (or GROUP BY) 
23e80 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20  clause, or NULL 
23e90 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
23ea0 52 65 73 75 6c 74 53 65 74 2c 20 2f 2a 20 52 65  ResultSet, /* Re
23eb0 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
23ec0 71 75 65 72 79 20 2a 2f 0a 20 20 75 31 36 20 77  query */.  u16 w
23ed0 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20  ctrlFlags,      
23ee0 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57   /* One of the W
23ef0 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66  HERE_* flags def
23f00 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e  ined in sqliteIn
23f10 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  t.h */.  int iId
23f20 78 43 75 72 20 20 20 20 20 20 20 20 20 20 20 2f  xCur           /
23f30 2a 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 54 41  * If WHERE_ONETA
23f40 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c  BLE_ONLY is set,
23f50 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 6e 75   index cursor nu
23f60 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  mber */.){.  int
23f70 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20 20 20   nByteWInfo;    
23f80 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20          /* Num. 
23f90 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
23fa0 66 6f 72 20 57 68 65 72 65 49 6e 66 6f 20 73 74  for WhereInfo st
23fb0 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  ruct */.  int nT
23fc0 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  abList;         
23fd0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
23fe0 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54  f elements in pT
23ff0 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72  abList */.  Wher
24000 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
24010 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62         /* Will b
24020 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e  ecome the return
24030 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
24040 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62  unction */.  Vdb
24050 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
24060 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76  Vdbe;   /* The v
24070 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20  irtual database 
24080 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d  engine */.  Bitm
24090 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20  ask notReady;   
240a0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
240b0 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79  s that are not y
240c0 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f  et positioned */
240d0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
240e0 64 65 72 20 73 57 4c 42 3b 20 20 20 20 20 2f 2a  der sWLB;     /*
240f0 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 62   The WhereLoop b
24100 75 69 6c 64 65 72 20 2a 2f 0a 20 20 57 68 65 72  uilder */.  Wher
24110 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
24120 65 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 65 78  et;    /* The ex
24130 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65  pression mask se
24140 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  t */.  WhereLeve
24150 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20  l *pLevel;      
24160 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65    /* A single le
24170 76 65 6c 20 69 6e 20 70 57 49 6e 66 6f 2d 3e 61  vel in pWInfo->a
24180 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  [] */.  WhereLoo
24190 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  p *pLoop;       
241a0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
241b0 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4c   a single WhereL
241c0 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
241d0 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
241e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
241f0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
24200 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
24210 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
24220 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
24230 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  n */.  int rc;  
24240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24250 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
24260 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 56 61 72 69 61   */...  /* Varia
24270 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ble initializati
24280 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  on */.  db = pPa
24290 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73 65  rse->db;.  memse
242a0 74 28 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a 65  t(&sWLB, 0, size
242b0 6f 66 28 73 57 4c 42 29 29 3b 0a 0a 20 20 2f 2a  of(sWLB));..  /*
242c0 20 41 6e 20 4f 52 44 45 52 2f 47 52 4f 55 50 20   An ORDER/GROUP 
242d0 42 59 20 63 6c 61 75 73 65 20 6f 66 20 6d 6f 72  BY clause of mor
242e0 65 20 74 68 61 6e 20 36 33 20 74 65 72 6d 73 20  e than 63 terms 
242f0 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69  cannot be optimi
24300 7a 65 64 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  zed */.  testcas
24310 65 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 70  e( pOrderBy && p
24320 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d  OrderBy->nExpr==
24330 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 70  BMS-1 );.  if( p
24340 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72 64 65  OrderBy && pOrde
24350 72 42 79 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53 20  rBy->nExpr>=BMS 
24360 29 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ) pOrderBy = 0;.
24370 20 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20    sWLB.pOrderBy 
24380 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f  = pOrderBy;..  /
24390 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20 44 49  * Disable the DI
243a0 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74  STINCT optimizat
243b0 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69  ion if SQLITE_Di
243c0 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74  stinctOpt is set
243d0 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65   via.  ** sqlite
243e0 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49  3_test_ctrl(SQLI
243f0 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
24400 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a  MIZATIONS,...) *
24410 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  /.  if( Optimiza
24420 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c  tionDisabled(db,
24430 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74   SQLITE_Distinct
24440 4f 70 74 29 20 29 7b 0a 20 20 20 20 77 63 74 72  Opt) ){.    wctr
24450 6c 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45  lFlags &= ~WHERE
24460 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b 0a  _WANT_DISTINCT;.
24470 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75    }..  /* The nu
24480 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69  mber of tables i
24490 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
244a0 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20  e is limited by 
244b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
244c0 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69 74  ** bits in a Bit
244d0 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73  mask .  */.  tes
244e0 74 63 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d  tcase( pTabList-
244f0 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20  >nSrc==BMS );.  
24500 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  if( pTabList->nS
24510 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71  rc>BMS ){.    sq
24520 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
24530 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25  arse, "at most %
24540 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f  d tables in a jo
24550 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72  in", BMS);.    r
24560 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
24570 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
24580 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61   normally genera
24590 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f  tes a nested loo
245a0 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  p for all tables
245b0 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69   in .  ** pTabLi
245c0 73 74 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  st.  But if the 
245d0 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
245e0 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74 2c  NLY flag is set,
245f0 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a   then we should.
24600 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61    ** only genera
24610 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
24620 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70  first table in p
24630 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75  TabList and assu
24640 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79  me that.  ** any
24650 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61   cursors associa
24660 74 65 64 20 77 69 74 68 20 73 75 62 73 65 71 75  ted with subsequ
24670 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20 75  ent tables are u
24680 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20  ninitialized..  
24690 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20  */.  nTabList = 
246a0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
246b0 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
246c0 59 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73  Y) ? 1 : pTabLis
246d0 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41  t->nSrc;..  /* A
246e0 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
246f0 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65  ialize the Where
24700 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
24710 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
24720 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  the.  ** return 
24730 76 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20  value. A single 
24740 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73  allocation is us
24750 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
24760 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73  WhereInfo.  ** s
24770 74 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65  truct, the conte
24780 6e 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f  nts of WhereInfo
24790 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43  .a[], the WhereC
247a0 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a  lause structure.
247b0 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65    ** and the Whe
247c0 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74  reMaskSet struct
247d0 75 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65  ure. Since Where
247e0 43 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  Clause contains 
247f0 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66  an 8-byte.  ** f
24800 69 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61  ield (type Bitma
24810 73 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20 61  sk) it must be a
24820 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62  ligned on an 8-b
24830 79 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a  yte boundary on.
24840 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74    ** some archit
24850 65 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74  ectures. Hence t
24860 68 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f  he ROUND8() belo
24870 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57  w..  */.  nByteW
24880 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69  Info = ROUND8(si
24890 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b  zeof(WhereInfo)+
248a0 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a  (nTabList-1)*siz
248b0 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29  eof(WhereLevel))
248c0 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c  ;.  pWInfo = sql
248d0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
248e0 28 64 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20  (db, nByteWInfo 
248f0 2b 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  + sizeof(WhereLo
24900 6f 70 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  op));.  if( db->
24910 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
24920 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
24930 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
24940 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20     pWInfo = 0;. 
24950 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
24960 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  inError;.  }.  p
24970 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50  WInfo->aiCurOneP
24980 61 73 73 5b 30 5d 20 3d 20 70 57 49 6e 66 6f 2d  ass[0] = pWInfo-
24990 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d  >aiCurOnePass[1]
249a0 20 3d 20 2d 31 3b 0a 20 20 70 57 49 6e 66 6f 2d   = -1;.  pWInfo-
249b0 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69  >nLevel = nTabLi
249c0 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50  st;.  pWInfo->pP
249d0 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
249e0 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
249f0 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
24a00 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
24a10 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70   = pOrderBy;.  p
24a20 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65  WInfo->pResultSe
24a30 74 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a  t = pResultSet;.
24a40 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b    pWInfo->iBreak
24a50 20 3d 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74   = pWInfo->iCont
24a60 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64  inue = sqlite3Vd
24a70 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
24a80 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46    pWInfo->wctrlF
24a90 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67  lags = wctrlFlag
24aa0 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76  s;.  pWInfo->sav
24ab0 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  edNQueryLoop = p
24ac0 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
24ad0 70 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20  p;.  pMaskSet = 
24ae0 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
24af0 74 3b 0a 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f  t;.  sWLB.pWInfo
24b00 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c   = pWInfo;.  sWL
24b10 42 2e 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d  B.pWC = &pWInfo-
24b20 3e 73 57 43 3b 0a 20 20 73 57 4c 42 2e 70 4e 65  >sWC;.  sWLB.pNe
24b30 77 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 29  w = (WhereLoop*)
24b40 28 28 28 63 68 61 72 2a 29 70 57 49 6e 66 6f 29  (((char*)pWInfo)
24b50 2b 6e 42 79 74 65 57 49 6e 66 6f 29 3b 0a 20 20  +nByteWInfo);.  
24b60 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
24b70 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 73 57 4c  TE_ALIGNMENT(sWL
24b80 42 2e 70 4e 65 77 29 20 29 3b 0a 20 20 77 68 65  B.pNew) );.  whe
24b90 72 65 4c 6f 6f 70 49 6e 69 74 28 73 57 4c 42 2e  reLoopInit(sWLB.
24ba0 70 4e 65 77 29 3b 0a 23 69 66 64 65 66 20 53 51  pNew);.#ifdef SQ
24bb0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73 57 4c  LITE_DEBUG.  sWL
24bc0 42 2e 70 4e 65 77 2d 3e 63 49 64 20 3d 20 27 2a  B.pNew->cId = '*
24bd0 27 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  ';.#endif..  /* 
24be0 53 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20  Split the WHERE 
24bf0 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61  clause into sepa
24c00 72 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69  rate subexpressi
24c10 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20  ons where each. 
24c20 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f   ** subexpressio
24c30 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62  n is separated b
24c40 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  y an AND operato
24c50 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61  r..  */.  initMa
24c60 73 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b  skSet(pMaskSet);
24c70 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43  .  sqlite3WhereC
24c80 6c 61 75 73 65 49 6e 69 74 28 26 70 57 49 6e 66  lauseInit(&pWInf
24c90 6f 2d 3e 73 57 43 2c 20 70 57 49 6e 66 6f 29 3b  o->sWC, pWInfo);
24ca0 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 53  .  sqlite3WhereS
24cb0 70 6c 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57  plit(&pWInfo->sW
24cc0 43 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e  C, pWhere, TK_AN
24cd0 44 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70  D);.    .  /* Sp
24ce0 65 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48  ecial case: a WH
24cf0 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
24d00 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76  is constant.  Ev
24d10 61 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  aluate the.  ** 
24d20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65  expression and e
24d30 69 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20  ither jump over 
24d40 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20  all of the code 
24d50 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20  or fall thru..  
24d60 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
24d70 69 3c 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72  i<sWLB.pWC->nTer
24d80 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66  m; ii++){.    if
24d90 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c  ( nTabList==0 ||
24da0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
24db0 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 73 57  nstantNotJoin(sW
24dc0 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 70 45  LB.pWC->a[ii].pE
24dd0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71  xpr) ){.      sq
24de0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
24df0 28 70 50 61 72 73 65 2c 20 73 57 4c 42 2e 70 57  (pParse, sWLB.pW
24e00 43 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20  C->a[ii].pExpr, 
24e10 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 0a  pWInfo->iBreak,.
24e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e30 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
24e40 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
24e50 20 20 20 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69     sWLB.pWC->a[i
24e60 69 5d 2e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  i].wtFlags |= TE
24e70 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a  RM_CODED;.    }.
24e80 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61    }..  /* Specia
24e90 6c 20 63 61 73 65 3a 20 4e 6f 20 46 52 4f 4d 20  l case: No FROM 
24ea0 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66  clause.  */.  if
24eb0 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 29 7b  ( nTabList==0 ){
24ec0 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
24ed0 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53  y ) pWInfo->nOBS
24ee0 61 74 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  at = pOrderBy->n
24ef0 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 77 63  Expr;.    if( wc
24f00 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
24f10 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29  _WANT_DISTINCT )
24f20 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
24f30 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
24f40 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
24f50 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
24f60 2f 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74 20  /* Assign a bit 
24f70 66 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b  from the bitmask
24f80 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69   to every term i
24f90 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
24fa0 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  e..  **.  ** Whe
24fb0 6e 20 61 73 73 69 67 6e 69 6e 67 20 62 69 74 6d  n assigning bitm
24fc0 61 73 6b 20 76 61 6c 75 65 73 20 74 6f 20 46 52  ask values to FR
24fd0 4f 4d 20 63 6c 61 75 73 65 20 63 75 72 73 6f 72  OM clause cursor
24fe0 73 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 20 20  s, it must be.  
24ff0 2a 2a 20 74 68 65 20 63 61 73 65 20 74 68 61 74  ** the case that
25000 20 69 66 20 58 20 69 73 20 74 68 65 20 62 69 74   if X is the bit
25010 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74  mask for the N-t
25020 68 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  h FROM clause te
25030 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65  rm then.  ** the
25040 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c   bitmask for all
25050 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
25060 6d 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  ms to the left o
25070 66 20 74 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a  f the N-th term.
25080 20 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20 20    ** is (X-1).  
25090 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66   An expression f
250a0 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73  rom the ON claus
250b0 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
250c0 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74   can use.  ** it
250d0 73 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69  s Expr.iRightJoi
250e0 6e 54 61 62 6c 65 20 76 61 6c 75 65 20 74 6f 20  nTable value to 
250f0 66 69 6e 64 20 74 68 65 20 62 69 74 6d 61 73 6b  find the bitmask
25100 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
25110 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ble.  ** of the 
25120 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61 63 74 69  join.  Subtracti
25130 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20  ng one from the 
25140 72 69 67 68 74 20 74 61 62 6c 65 20 62 69 74 6d  right table bitm
25150 61 73 6b 20 67 69 76 65 73 20 61 0a 20 20 2a 2a  ask gives a.  **
25160 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c   bitmask for all
25170 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
25180 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  eft of the join.
25190 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69    Knowing the bi
251a0 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61  tmask.  ** for a
251b0 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  ll tables to the
251c0 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20   left of a left 
251d0 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e  join is importan
251e0 74 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35  t.  Ticket #3015
251f0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65  ..  **.  ** Note
25200 20 74 68 61 74 20 62 69 74 6d 61 73 6b 73 20 61   that bitmasks a
25210 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61  re created for a
25220 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ll pTabList->nSr
25230 63 20 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a 2a  c tables in.  **
25240 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a   pTabList, not j
25250 75 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 54  ust the first nT
25260 61 62 4c 69 73 74 20 74 61 62 6c 65 73 2e 20 20  abList tables.  
25270 6e 54 61 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d  nTabList is norm
25280 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c 20  ally.  ** equal 
25290 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  to pTabList->nSr
252a0 63 20 62 75 74 20 6d 69 67 68 74 20 62 65 20 73  c but might be s
252b0 68 6f 72 74 65 6e 65 64 20 74 6f 20 31 20 69 66  hortened to 1 if
252c0 20 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45 5f   the.  ** WHERE_
252d0 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c  ONETABLE_ONLY fl
252e0 61 67 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a  ag is set..  */.
252f0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
25300 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
25310 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65  i++){.    create
25320 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
25330 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69  TabList->a[ii].i
25340 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c  Cursor);.    sql
25350 69 74 65 33 57 68 65 72 65 54 61 62 46 75 6e 63  ite3WhereTabFunc
25360 41 72 67 73 28 70 50 61 72 73 65 2c 20 26 70 54  Args(pParse, &pT
25370 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2c 20 26  abList->a[ii], &
25380 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20  pWInfo->sWC);.  
25390 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
253a0 0a 20 20 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b  .  {.    Bitmask
253b0 20 74 6f 54 68 65 4c 65 66 74 20 3d 20 30 3b 0a   toTheLeft = 0;.
253c0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
253d0 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
253e0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 69   ii++){.      Bi
253f0 74 6d 61 73 6b 20 6d 20 3d 20 73 71 6c 69 74 65  tmask m = sqlite
25400 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 70 4d  3WhereGetMask(pM
25410 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74  askSet, pTabList
25420 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29  ->a[ii].iCursor)
25430 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
25440 28 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c 65 66 74  (m-1)==toTheLeft
25450 20 29 3b 0a 20 20 20 20 20 20 74 6f 54 68 65 4c   );.      toTheL
25460 65 66 74 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a  eft |= m;.    }.
25470 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
25480 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20   Analyze all of 
25490 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  the subexpressio
254a0 6e 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ns. */.  sqlite3
254b0 57 68 65 72 65 45 78 70 72 41 6e 61 6c 79 7a 65  WhereExprAnalyze
254c0 28 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e  (pTabList, &pWIn
254d0 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 69 66 28 20  fo->sWC);.  if( 
254e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
254f0 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
25500 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 69 66 28 20  inError;..  if( 
25510 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
25520 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
25530 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 44 69   ){.    if( isDi
25540 73 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28  stinctRedundant(
25550 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
25560 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20  , &pWInfo->sWC, 
25570 70 52 65 73 75 6c 74 53 65 74 29 20 29 7b 0a 20  pResultSet) ){. 
25580 20 20 20 20 20 2f 2a 20 54 68 65 20 44 49 53 54       /* The DIST
25590 49 4e 43 54 20 6d 61 72 6b 69 6e 67 20 69 73 20  INCT marking is 
255a0 70 6f 69 6e 74 6c 65 73 73 2e 20 20 49 67 6e 6f  pointless.  Igno
255b0 72 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20  re it. */.      
255c0 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
255d0 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
255e0 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d  CT_UNIQUE;.    }
255f0 65 6c 73 65 20 69 66 28 20 70 4f 72 64 65 72 42  else if( pOrderB
25600 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  y==0 ){.      /*
25610 20 54 72 79 20 74 6f 20 4f 52 44 45 52 20 42 59   Try to ORDER BY
25620 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
25630 74 6f 20 6d 61 6b 65 20 64 69 73 74 69 6e 63 74  to make distinct
25640 20 70 72 6f 63 65 73 73 69 6e 67 20 65 61 73 69   processing easi
25650 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e  er */.      pWIn
25660 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 7c  fo->wctrlFlags |
25670 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
25680 42 59 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  BY;.      pWInfo
25690 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 52 65  ->pOrderBy = pRe
256a0 73 75 6c 74 53 65 74 3b 0a 20 20 20 20 7d 0a 20  sultSet;.    }. 
256b0 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75   }..  /* Constru
256c0 63 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ct the WhereLoop
256d0 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 48   objects */.  WH
256e0 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66 2c  ERETRACE(0xffff,
256f0 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20  ("*** Optimizer 
25700 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a  Start ***\n"));.
25710 23 69 66 20 64 65 66 69 6e 65 64 28 57 48 45 52  #if defined(WHER
25720 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a  ETRACE_ENABLED).
25730 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
25740 72 65 54 72 61 63 65 20 26 20 30 78 31 30 30 20  reTrace & 0x100 
25750 29 7b 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c  ){ /* Display al
25760 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  l terms of the W
25770 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
25780 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
25790 72 28 69 3d 30 3b 20 69 3c 73 57 4c 42 2e 70 57  r(i=0; i<sWLB.pW
257a0 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a  C->nTerm; i++){.
257b0 20 20 20 20 20 20 77 68 65 72 65 54 65 72 6d 50        whereTermP
257c0 72 69 6e 74 28 26 73 57 4c 42 2e 70 57 43 2d 3e  rint(&sWLB.pWC->
257d0 61 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20 7d 0a  a[i], i);.    }.
257e0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
257f0 28 20 6e 54 61 62 4c 69 73 74 21 3d 31 20 7c 7c  ( nTabList!=1 ||
25800 20 77 68 65 72 65 53 68 6f 72 74 43 75 74 28 26   whereShortCut(&
25810 73 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20 20 20  sWLB)==0 ){.    
25820 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
25830 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20 20  dAll(&sWLB);.   
25840 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77   if( rc ) goto w
25850 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
25860 20 20 0a 23 69 66 64 65 66 20 57 48 45 52 45 54    .#ifdef WHERET
25870 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
25880 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
25890 65 54 72 61 63 65 20 29 7b 20 20 20 20 2f 2a 20  eTrace ){    /* 
258a0 44 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66 20 74  Display all of t
258b0 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  he WhereLoop obj
258c0 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 57 68  ects */.      Wh
258d0 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20 20  ereLoop *p;.    
258e0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73    int i;.      s
258f0 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
25900 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31 32   zLabel[] = "012
25910 33 34 35 36 37 38 39 61 62 63 64 65 66 67 68 69  3456789abcdefghi
25920 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79 78  jklmnopqrstuvwyx
25930 7a 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  z".             
25940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25960 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
25970 50 51 52 53 54 55 56 57 59 58 5a 22 3b 0a 20 20  PQRSTUVWYXZ";.  
25980 20 20 20 20 66 6f 72 28 70 3d 70 57 49 6e 66 6f      for(p=pWInfo
25990 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20 70  ->pLoops, i=0; p
259a0 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  ; p=p->pNextLoop
259b0 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  , i++){.        
259c0 70 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65 6c 5b  p->cId = zLabel[
259d0 69 25 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29  i%sizeof(zLabel)
259e0 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  ];.        where
259f0 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 73 57 4c  LoopPrint(p, sWL
25a00 42 2e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a  B.pWC);.      }.
25a10 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a      }.#endif.  .
25a20 20 20 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c      wherePathSol
25a30 76 65 72 28 70 57 49 6e 66 6f 2c 20 30 29 3b 0a  ver(pWInfo, 0);.
25a40 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
25a50 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
25a60 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
25a70 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
25a80 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
25a90 20 20 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c      wherePathSol
25aa0 76 65 72 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e  ver(pWInfo, pWIn
25ab0 66 6f 2d 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b 0a  fo->nRowOut+1);.
25ac0 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d         if( db->m
25ad0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
25ae0 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
25af0 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  or;.    }.  }.  
25b00 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  if( pWInfo->pOrd
25b10 65 72 42 79 3d 3d 30 20 26 26 20 28 64 62 2d 3e  erBy==0 && (db->
25b20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
25b30 65 76 65 72 73 65 4f 72 64 65 72 29 21 3d 30 20  everseOrder)!=0 
25b40 29 7b 0a 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ){.     pWInfo->
25b50 72 65 76 4d 61 73 6b 20 3d 20 28 42 69 74 6d 61  revMask = (Bitma
25b60 73 6b 29 28 2d 31 29 3b 0a 20 20 7d 0a 20 20 69  sk)(-1);.  }.  i
25b70 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
25b80 7c 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c  || NEVER(db->mal
25b90 6c 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a 20 20  locFailed) ){.  
25ba0 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
25bb0 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64  nError;.  }.#ifd
25bc0 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
25bd0 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
25be0 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b  te3WhereTrace ){
25bf0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
25c00 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f  gPrintf("---- So
25c10 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c  lution nRow=%d",
25c20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
25c30 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  );.    if( pWInf
25c40 6f 2d 3e 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20  o->nOBSat>0 ){. 
25c50 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
25c60 67 50 72 69 6e 74 66 28 22 20 4f 52 44 45 52 42  gPrintf(" ORDERB
25c70 59 3d 25 64 2c 30 78 25 6c 6c 78 22 2c 20 70 57  Y=%d,0x%llx", pW
25c80 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 70 57  Info->nOBSat, pW
25c90 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a  Info->revMask);.
25ca0 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68      }.    switch
25cb0 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69  ( pWInfo->eDisti
25cc0 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73  nct ){.      cas
25cd0 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
25ce0 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20  _UNIQUE: {.     
25cf0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
25d00 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43  rintf("  DISTINC
25d10 54 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20 20 20  T=unique");.    
25d20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
25d30 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48   }.      case WH
25d40 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44  ERE_DISTINCT_ORD
25d50 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20  ERED: {.        
25d60 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
25d70 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 6f  tf("  DISTINCT=o
25d80 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20  rdered");.      
25d90 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
25da0 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
25db0 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44  E_DISTINCT_UNORD
25dc0 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20  ERED: {.        
25dd0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
25de0 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75  tf("  DISTINCT=u
25df0 6e 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20  nordered");.    
25e00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
25e10 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
25e20 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
25e30 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 69  "\n");.    for(i
25e40 69 3d 30 3b 20 69 69 3c 70 57 49 6e 66 6f 2d 3e  i=0; ii<pWInfo->
25e50 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a 20  nLevel; ii++){. 
25e60 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72       whereLoopPr
25e70 69 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b 69 69  int(pWInfo->a[ii
25e80 5d 2e 70 57 4c 6f 6f 70 2c 20 73 57 4c 42 2e 70  ].pWLoop, sWLB.p
25e90 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  WC);.    }.  }.#
25ea0 65 6e 64 69 66 0a 20 20 2f 2a 20 41 74 74 65 6d  endif.  /* Attem
25eb0 70 74 20 74 6f 20 6f 6d 69 74 20 74 61 62 6c 65  pt to omit table
25ec0 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 69 6e 20  s from the join 
25ed0 74 68 61 74 20 64 6f 20 6e 6f 74 20 65 66 66 65  that do not effe
25ee0 63 74 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  ct the result */
25ef0 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e  .  if( pWInfo->n
25f00 4c 65 76 65 6c 3e 3d 32 0a 20 20 20 26 26 20 70  Level>=2.   && p
25f10 52 65 73 75 6c 74 53 65 74 21 3d 30 0a 20 20 20  ResultSet!=0.   
25f20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
25f30 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
25f40 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 29 0a  E_OmitNoopJoin).
25f50 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b    ){.    Bitmask
25f60 20 74 61 62 55 73 65 64 20 3d 20 73 71 6c 69 74   tabUsed = sqlit
25f70 65 33 57 68 65 72 65 45 78 70 72 4c 69 73 74 55  e3WhereExprListU
25f80 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
25f90 52 65 73 75 6c 74 53 65 74 29 3b 0a 20 20 20 20  ResultSet);.    
25fa0 69 66 28 20 73 57 4c 42 2e 70 4f 72 64 65 72 42  if( sWLB.pOrderB
25fb0 79 20 29 7b 0a 20 20 20 20 20 20 74 61 62 55 73  y ){.      tabUs
25fc0 65 64 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65  ed |= sqlite3Whe
25fd0 72 65 45 78 70 72 4c 69 73 74 55 73 61 67 65 28  reExprListUsage(
25fe0 70 4d 61 73 6b 53 65 74 2c 20 73 57 4c 42 2e 70  pMaskSet, sWLB.p
25ff0 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 0a  OrderBy);.    }.
26000 20 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66      while( pWInf
26010 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29 7b 0a  o->nLevel>=2 ){.
26020 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
26030 2a 70 54 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20  *pTerm, *pEnd;. 
26040 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 57 49       pLoop = pWI
26050 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e  nfo->a[pWInfo->n
26060 4c 65 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f 70 3b  Level-1].pWLoop;
26070 0a 20 20 20 20 20 20 69 66 28 20 28 70 57 49 6e  .      if( (pWIn
26080 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
26090 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 66 67 2e  pLoop->iTab].fg.
260a0 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
260b0 46 54 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  FT)==0 ) break;.
260c0 20 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c        if( (wctrl
260d0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
260e0 4e 54 5f 44 49 53 54 49 4e 43 54 29 3d 3d 30 0a  NT_DISTINCT)==0.
260f0 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70         && (pLoop
26100 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
26110 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 0a 20 20 20  E_ONEROW)==0.   
26120 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72     ){.        br
26130 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
26140 20 20 20 69 66 28 20 28 74 61 62 55 73 65 64 20     if( (tabUsed 
26150 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  & pLoop->maskSel
26160 66 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  f)!=0 ) break;. 
26170 20 20 20 20 20 70 45 6e 64 20 3d 20 73 57 4c 42       pEnd = sWLB
26180 2e 70 57 43 2d 3e 61 20 2b 20 73 57 4c 42 2e 70  .pWC->a + sWLB.p
26190 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20  WC->nTerm;.     
261a0 20 66 6f 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e   for(pTerm=sWLB.
261b0 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45  pWC->a; pTerm<pE
261c0 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
261d0 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
261e0 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c  ->prereqAll & pL
261f0 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d  oop->maskSelf)!=
26200 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 45  0.         && !E
26210 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
26220 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f  Term->pExpr, EP_
26230 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20  FromJoin).      
26240 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62    ){.          b
26250 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
26260 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
26270 28 20 70 54 65 72 6d 3c 70 45 6e 64 20 29 20 62  ( pTerm<pEnd ) b
26280 72 65 61 6b 3b 0a 20 20 20 20 20 20 57 48 45 52  reak;.      WHER
26290 45 54 52 41 43 45 28 30 78 66 66 66 66 2c 20 28  ETRACE(0xffff, (
262a0 22 2d 3e 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63  "-> drop loop %c
262b0 20 6e 6f 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c   not used\n", pL
262c0 6f 6f 70 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20  oop->cId));.    
262d0 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c    pWInfo->nLevel
262e0 2d 2d 3b 0a 20 20 20 20 20 20 6e 54 61 62 4c 69  --;.      nTabLi
262f0 73 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  st--;.    }.  }.
26300 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66    WHERETRACE(0xf
26310 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69  fff,("*** Optimi
26320 7a 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a  zer Finished ***
26330 5c 6e 22 29 29 3b 0a 20 20 70 57 49 6e 66 6f 2d  \n"));.  pWInfo-
26340 3e 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c  >pParse->nQueryL
26350 6f 6f 70 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e  oop += pWInfo->n
26360 52 6f 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66  RowOut;..  /* If
26370 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61   the caller is a
26380 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
26390 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  TE statement tha
263a0 74 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a  t is requesting.
263b0 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e    ** to use a on
263c0 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d  e-pass algorithm
263d0 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  , determine if t
263e0 68 69 73 20 69 73 20 61 70 70 72 6f 70 72 69 61  his is appropria
263f0 74 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65  te..  ** The one
26400 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 20  -pass algorithm 
26410 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 74 68  only works if th
26420 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  e WHERE clause c
26430 6f 6e 73 74 72 61 69 6e 73 0a 20 20 2a 2a 20 74  onstrains.  ** t
26440 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  he statement to 
26450 75 70 64 61 74 65 20 6f 72 20 64 65 6c 65 74 65  update or delete
26460 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20   a single row.. 
26470 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77   */.  assert( (w
26480 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
26490 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
264a0 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d  D)==0 || pWInfo-
264b0 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20  >nLevel==1 );.  
264c0 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  if( (wctrlFlags 
264d0 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
264e0 44 45 53 49 52 45 44 29 21 3d 30 20 0a 20 20 20  DESIRED)!=0 .   
264f0 26 26 20 28 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d  && (pWInfo->a[0]
26500 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  .pWLoop->wsFlags
26510 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29   & WHERE_ONEROW)
26520 21 3d 30 20 29 7b 0a 20 20 20 20 70 57 49 6e 66  !=0 ){.    pWInf
26530 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20 31  o->okOnePass = 1
26540 3b 0a 20 20 20 20 69 66 28 20 48 61 73 52 6f 77  ;.    if( HasRow
26550 69 64 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30  id(pTabList->a[0
26560 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ].pTab) ){.     
26570 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57   pWInfo->a[0].pW
26580 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 3d  Loop->wsFlags &=
26590 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59   ~WHERE_IDX_ONLY
265a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
265b0 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65  * Open all table
265c0 73 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73  s in the pTabLis
265d0 74 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65  t and any indice
265e0 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20  s selected for. 
265f0 20 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68   ** searching th
26600 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f  ose tables..  */
26610 0a 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 4c 65  .  for(ii=0, pLe
26620 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69  vel=pWInfo->a; i
26630 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b  i<nTabList; ii++
26640 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20  , pLevel++){.   
26650 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
26660 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70    /* Table to op
26670 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44  en */.    int iD
26680 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  b;         /* In
26690 64 65 78 20 6f 66 20 64 61 74 61 62 61 73 65 20  dex of database 
266a0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65  containing table
266b0 2f 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73 74  /index */.    st
266c0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
266d0 6d 20 2a 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20  m *pTabItem;..  
266e0 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54    pTabItem = &pT
266f0 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
26700 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54  ->iFrom];.    pT
26710 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70  ab = pTabItem->p
26720 54 61 62 3b 0a 20 20 20 20 69 44 62 20 3d 20 73  Tab;.    iDb = s
26730 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
26740 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
26750 63 68 65 6d 61 29 3b 0a 20 20 20 20 70 4c 6f 6f  chema);.    pLoo
26760 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  p = pLevel->pWLo
26770 6f 70 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61  op;.    if( (pTa
26780 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
26790 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c  _Ephemeral)!=0 |
267a0 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  | pTab->pSelect 
267b0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  ){.      /* Do n
267c0 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65  othing */.    }e
267d0 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  lse.#ifndef SQLI
267e0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
267f0 41 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70 4c  ABLE.    if( (pL
26800 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
26810 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
26820 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  E)!=0 ){.      c
26830 6f 6e 73 74 20 63 68 61 72 20 2a 70 56 54 61 62  onst char *pVTab
26840 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
26850 29 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c  )sqlite3GetVTabl
26860 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  e(db, pTab);.   
26870 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54     int iCur = pT
26880 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  abItem->iCursor;
26890 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
268a0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56  beAddOp4(v, OP_V
268b0 4f 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30  Open, iCur, 0, 0
268c0 2c 20 70 56 54 61 62 2c 20 50 34 5f 56 54 41 42  , pVTab, P4_VTAB
268d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
268e0 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
268f0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 6f   ){.      /* noo
26900 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23  p */.    }else.#
26910 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 70  endif.    if( (p
26920 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
26930 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
26940 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
26950 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
26960 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f  RE_OMIT_OPEN_CLO
26970 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  SE)==0 ){.      
26980 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e  int op = OP_Open
26990 52 65 61 64 3b 0a 20 20 20 20 20 20 69 66 28 20  Read;.      if( 
269a0 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
269b0 73 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20  s ){.        op 
269c0 3d 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a  = OP_OpenWrite;.
269d0 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
269e0 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20  aiCurOnePass[0] 
269f0 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  = pTabItem->iCur
26a00 73 6f 72 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20  sor;.      };.  
26a10 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
26a20 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
26a30 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20  bItem->iCursor, 
26a40 69 44 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a  iDb, pTab, op);.
26a50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
26a60 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3d  abItem->iCursor=
26a70 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72  =pLevel->iTabCur
26a80 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
26a90 73 65 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f  se( !pWInfo->okO
26aa0 6e 65 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e  nePass && pTab->
26ab0 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  nCol==BMS-1 );. 
26ac0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21       testcase( !
26ad0 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
26ae0 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d  s && pTab->nCol=
26af0 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66  =BMS );.      if
26b00 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65  ( !pWInfo->okOne
26b10 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43  Pass && pTab->nC
26b20 6f 6c 3c 42 4d 53 20 26 26 20 48 61 73 52 6f 77  ol<BMS && HasRow
26b30 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
26b40 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20      Bitmask b = 
26b50 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pTabItem->colUse
26b60 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  d;.        int n
26b70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
26b80 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e  r(; b; b=b>>1, n
26b90 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 73 71  ++){}.        sq
26ba0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
26bb0 34 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65  4(v, sqlite3Vdbe
26bc0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31  CurrentAddr(v)-1
26bd0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
26be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
26bf0 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
26c00 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a  (n), P4_INT32);.
26c10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
26c20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  n<=pTab->nCol );
26c30 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20  .      }.#ifdef 
26c40 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
26c50 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20  LUMN_USED_MASK. 
26c60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
26c70 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50  AddOp4Dup8(v, OP
26c80 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 70 54  _ColumnsUsed, pT
26c90 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c  abItem->iCursor,
26ca0 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
26cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cc0 20 20 20 28 63 6f 6e 73 74 20 75 38 2a 29 26 70     (const u8*)&p
26cd0 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  TabItem->colUsed
26ce0 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23 65 6e  , P4_INT64);.#en
26cf0 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
26d00 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c       sqlite3Tabl
26d10 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
26d20 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30  b, pTab->tnum, 0
26d30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
26d40 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
26d50 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
26d60 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a  HERE_INDEXED ){.
26d70 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78        Index *pIx
26d80 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
26d90 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  e.pIndex;.      
26da0 69 6e 74 20 69 49 6e 64 65 78 43 75 72 3b 0a 20  int iIndexCur;. 
26db0 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50       int op = OP
26dc0 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20  _OpenRead;.     
26dd0 20 2f 2a 20 69 49 64 78 43 75 72 20 69 73 20 61   /* iIdxCur is a
26de0 6c 77 61 79 73 20 73 65 74 20 69 66 20 74 6f 20  lways set if to 
26df0 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65  a positive value
26e00 20 69 66 20 4f 4e 45 50 41 53 53 20 69 73 20 70   if ONEPASS is p
26e10 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 20 20 20  ossible */.     
26e20 20 61 73 73 65 72 74 28 20 69 49 64 78 43 75 72   assert( iIdxCur
26e30 21 3d 30 20 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e  !=0 || (pWInfo->
26e40 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
26e50 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
26e60 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ED)==0 );.      
26e70 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
26e80 61 62 29 20 26 26 20 49 73 50 72 69 6d 61 72 79  ab) && IsPrimary
26e90 4b 65 79 49 6e 64 65 78 28 70 49 78 29 0a 20 20  KeyIndex(pIx).  
26ea0 20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c       && (wctrlFl
26eb0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54  ags & WHERE_ONET
26ec0 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30 0a 20 20  ABLE_ONLY)!=0.  
26ed0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f      ){.        /
26ee0 2a 20 54 68 69 73 20 69 73 20 6f 6e 65 20 74 65  * This is one te
26ef0 72 6d 20 6f 66 20 61 6e 20 4f 52 2d 6f 70 74 69  rm of an OR-opti
26f00 6d 69 7a 61 74 69 6f 6e 20 75 73 69 6e 67 20 74  mization using t
26f10 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  he PRIMARY KEY o
26f20 66 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 57  f a.        ** W
26f30 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
26f40 6c 65 2e 20 20 4e 6f 20 6e 65 65 64 20 66 6f 72  le.  No need for
26f50 20 61 20 73 65 70 61 72 61 74 65 20 69 6e 64 65   a separate inde
26f60 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 49 6e  x */.        iIn
26f70 64 65 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d  dexCur = pLevel-
26f80 3e 69 54 61 62 43 75 72 3b 0a 20 20 20 20 20 20  >iTabCur;.      
26f90 20 20 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20    op = 0;.      
26fa0 7d 65 6c 73 65 20 69 66 28 20 70 57 49 6e 66 6f  }else if( pWInfo
26fb0 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 29 7b 0a 20  ->okOnePass ){. 
26fc0 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4a         Index *pJ
26fd0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
26fe0 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  b->pIndex;.     
26ff0 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69     iIndexCur = i
27000 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
27010 61 73 73 65 72 74 28 20 77 63 74 72 6c 46 6c 61  assert( wctrlFla
27020 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
27030 53 53 5f 44 45 53 49 52 45 44 20 29 3b 0a 20 20  SS_DESIRED );.  
27040 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57        while( ALW
27050 41 59 53 28 70 4a 29 20 26 26 20 70 4a 21 3d 70  AYS(pJ) && pJ!=p
27060 49 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Ix ){.          
27070 69 49 6e 64 65 78 43 75 72 2b 2b 3b 0a 20 20 20  iIndexCur++;.   
27080 20 20 20 20 20 20 20 70 4a 20 3d 20 70 4a 2d 3e         pJ = pJ->
27090 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d  pNext;.        }
270a0 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  .        op = OP
270b0 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20  _OpenWrite;.    
270c0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75      pWInfo->aiCu
270d0 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20 69 49  rOnePass[1] = iI
270e0 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20 7d  ndexCur;.      }
270f0 65 6c 73 65 20 69 66 28 20 69 49 64 78 43 75 72  else if( iIdxCur
27100 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20   && (wctrlFlags 
27110 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  & WHERE_ONETABLE
27120 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20  _ONLY)!=0 ){.   
27130 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d       iIndexCur =
27140 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20   iIdxCur;.      
27150 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73    if( wctrlFlags
27160 20 26 20 57 48 45 52 45 5f 52 45 4f 50 45 4e 5f   & WHERE_REOPEN_
27170 49 44 58 20 29 20 6f 70 20 3d 20 4f 50 5f 52 65  IDX ) op = OP_Re
27180 6f 70 65 6e 49 64 78 3b 0a 20 20 20 20 20 20 7d  openIdx;.      }
27190 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 49  else{.        iI
271a0 6e 64 65 78 43 75 72 20 3d 20 70 50 61 72 73 65  ndexCur = pParse
271b0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
271c0 7d 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  }.      pLevel->
271d0 69 49 64 78 43 75 72 20 3d 20 69 49 6e 64 65 78  iIdxCur = iIndex
271e0 43 75 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Cur;.      asser
271f0 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d  t( pIx->pSchema=
27200 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
27210 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
27220 69 49 6e 64 65 78 43 75 72 3e 3d 30 20 29 3b 0a  iIndexCur>=0 );.
27230 20 20 20 20 20 20 69 66 28 20 6f 70 20 29 7b 0a        if( op ){.
27240 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
27250 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c  dbeAddOp3(v, op,
27260 20 69 49 6e 64 65 78 43 75 72 2c 20 70 49 78 2d   iIndexCur, pIx-
27270 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20  >tnum, iDb);.   
27280 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
27290 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
272a0 72 73 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20  rse, pIx);.     
272b0 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
272c0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
272d0 4f 4e 53 54 52 41 49 4e 54 29 21 3d 30 0a 20 20  ONSTRAINT)!=0.  
272e0 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70         && (pLoop
272f0 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
27300 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c  RE_COLUMN_RANGE|
27310 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 29 29  WHERE_SKIPSCAN))
27320 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
27330 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
27340 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42  ags&WHERE_ORDERB
27350 59 5f 4d 49 4e 29 3d 3d 30 0a 20 20 20 20 20 20  Y_MIN)==0.      
27360 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73    ){.          s
27370 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
27380 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53 45 45  P5(v, OPFLAG_SEE
27390 4b 45 51 29 3b 20 2f 2a 20 48 69 6e 74 20 74 6f  KEQ); /* Hint to
273a0 20 43 4f 4d 44 42 32 20 2a 2f 0a 20 20 20 20 20   COMDB2 */.     
273b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 56 64 62     }.        Vdb
273c0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
273d0 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b  ", pIx->zName));
273e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
273f0 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45  NABLE_COLUMN_USE
27400 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20 20 20 7b  D_MASK.        {
27410 0a 20 20 20 20 20 20 20 20 20 20 75 36 34 20 63  .          u64 c
27420 6f 6c 55 73 65 64 20 3d 20 30 3b 0a 20 20 20 20  olUsed = 0;.    
27430 20 20 20 20 20 20 69 6e 74 20 69 69 2c 20 6a 6a        int ii, jj
27440 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
27450 69 69 3d 30 3b 20 69 69 3c 70 49 78 2d 3e 6e 43  ii=0; ii<pIx->nC
27460 6f 6c 75 6d 6e 3b 20 69 69 2b 2b 29 7b 0a 20 20  olumn; ii++){.  
27470 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 70            jj = p
27480 49 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 69 5d  Ix->aiColumn[ii]
27490 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
274a0 28 20 6a 6a 3c 30 20 29 20 63 6f 6e 74 69 6e 75  ( jj<0 ) continu
274b0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e;.            i
274c0 66 28 20 6a 6a 3e 36 33 20 29 20 6a 6a 20 3d 20  f( jj>63 ) jj = 
274d0 36 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  63;.            
274e0 69 66 28 20 28 70 54 61 62 49 74 65 6d 2d 3e 63  if( (pTabItem->c
274f0 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54  olUsed & MASKBIT
27500 28 6a 6a 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69  (jj))==0 ) conti
27510 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
27520 20 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28 75 36   colUsed |= ((u6
27530 34 29 31 29 3c 3c 28 69 69 3c 36 33 20 3f 20 69  4)1)<<(ii<63 ? i
27540 69 20 3a 20 36 33 29 3b 0a 20 20 20 20 20 20 20  i : 63);.       
27550 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
27560 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
27570 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  Dup8(v, OP_Colum
27580 6e 73 55 73 65 64 2c 20 69 49 6e 64 65 78 43 75  nsUsed, iIndexCu
27590 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  r, 0, 0,.       
275a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275b0 20 20 20 20 20 20 20 20 20 28 75 38 2a 29 26 63           (u8*)&c
275c0 6f 6c 55 73 65 64 2c 20 50 34 5f 49 4e 54 36 34  olUsed, P4_INT64
275d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  );.        }.#en
275e0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
275f0 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44  ABLE_COLUMN_USED
27600 5f 4d 41 53 4b 20 2a 2f 0a 20 20 20 20 20 20 7d  _MASK */.      }
27610 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
27620 44 62 3e 3d 30 20 29 20 73 71 6c 69 74 65 33 43  Db>=0 ) sqlite3C
27630 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
27640 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
27650 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70  }.  pWInfo->iTop
27660 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
27670 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
27680 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
27690 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72  iled ) goto wher
276a0 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20  eBeginError;..  
276b0 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
276c0 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73  code to do the s
276d0 65 61 72 63 68 2e 20 20 45 61 63 68 20 69 74 65  earch.  Each ite
276e0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f  ration of the fo
276f0 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f  r.  ** loop belo
27700 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  w generates code
27710 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65   for a single ne
27720 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65  sted loop of the
27730 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d   VM.  ** program
27740 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64  ..  */.  notRead
27750 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  y = ~(Bitmask)0;
27760 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
27770 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 29 7b  nTabList; ii++){
27780 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 78 70  .    int addrExp
27790 6c 61 69 6e 3b 0a 20 20 20 20 69 6e 74 20 77 73  lain;.    int ws
277a0 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65  Flags;.    pLeve
277b0 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  l = &pWInfo->a[i
277c0 69 5d 3b 0a 20 20 20 20 77 73 46 6c 61 67 73 20  i];.    wsFlags 
277d0 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
277e0 2d 3e 77 73 46 6c 61 67 73 3b 0a 23 69 66 6e 64  ->wsFlags;.#ifnd
277f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
27800 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20  UTOMATIC_INDEX. 
27810 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e     if( (pLevel->
27820 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  pWLoop->wsFlags 
27830 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
27840 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  EX)!=0 ){.      
27850 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74  constructAutomat
27860 69 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  icIndex(pParse, 
27870 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 0a 20 20  &pWInfo->sWC,.  
27880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
27890 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
278a0 6c 2d 3e 69 46 72 6f 6d 5d 2c 20 6e 6f 74 52 65  l->iFrom], notRe
278b0 61 64 79 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20  ady, pLevel);.  
278c0 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
278d0 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
278e0 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
278f0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
27900 20 20 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20    addrExplain = 
27910 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 6c  sqlite3WhereExpl
27920 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20  ainOneScan(.    
27930 20 20 20 20 70 50 61 72 73 65 2c 20 70 54 61 62      pParse, pTab
27940 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 69 69  List, pLevel, ii
27950 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c  , pLevel->iFrom,
27960 20 77 63 74 72 6c 46 6c 61 67 73 0a 20 20 20 20   wctrlFlags.    
27970 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61  );.    pLevel->a
27980 64 64 72 42 6f 64 79 20 3d 20 73 71 6c 69 74 65  ddrBody = sqlite
27990 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
279a0 28 76 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64  (v);.    notRead
279b0 79 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  y = sqlite3Where
279c0 43 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74  CodeOneLoopStart
279d0 28 70 57 49 6e 66 6f 2c 20 69 69 2c 20 6e 6f 74  (pWInfo, ii, not
279e0 52 65 61 64 79 29 3b 0a 20 20 20 20 70 57 49 6e  Ready);.    pWIn
279f0 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20  fo->iContinue = 
27a00 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74  pLevel->addrCont
27a10 3b 0a 20 20 20 20 69 66 28 20 28 77 73 46 6c 61  ;.    if( (wsFla
27a20 67 73 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f  gs&WHERE_MULTI_O
27a30 52 29 3d 3d 30 20 26 26 20 28 77 63 74 72 6c 46  R)==0 && (wctrlF
27a40 6c 61 67 73 26 57 48 45 52 45 5f 4f 4e 45 54 41  lags&WHERE_ONETA
27a50 42 4c 45 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a  BLE_ONLY)==0 ){.
27a60 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
27a70 72 65 41 64 64 53 63 61 6e 53 74 61 74 75 73 28  reAddScanStatus(
27a80 76 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65  v, pTabList, pLe
27a90 76 65 6c 2c 20 61 64 64 72 45 78 70 6c 61 69 6e  vel, addrExplain
27aa0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
27ab0 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a 20 20 56 64  /* Done. */.  Vd
27ac0 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28  beModuleComment(
27ad0 28 76 2c 20 22 42 65 67 69 6e 20 57 48 45 52 45  (v, "Begin WHERE
27ae0 2d 63 6f 72 65 22 29 29 3b 0a 20 20 72 65 74 75  -core"));.  retu
27af0 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a  rn pWInfo;..  /*
27b00 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61   Jump here if ma
27b10 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68  lloc fails */.wh
27b20 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20  ereBeginError:. 
27b30 20 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20   if( pWInfo ){. 
27b40 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
27b50 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  yLoop = pWInfo->
27b60 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b  savedNQueryLoop;
27b70 0a 20 20 20 20 77 68 65 72 65 49 6e 66 6f 46 72  .    whereInfoFr
27b80 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
27b90 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
27ba0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
27bb0 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  e the end of the
27bc0 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65   WHERE loop.  Se
27bd0 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a  e comments on .*
27be0 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  * sqlite3WhereBe
27bf0 67 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69  gin() for additi
27c00 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
27c10 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
27c20 33 57 68 65 72 65 45 6e 64 28 57 68 65 72 65 49  3WhereEnd(WhereI
27c30 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
27c40 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
27c50 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
27c60 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
27c70 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
27c80 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   i;.  WhereLevel
27c90 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72   *pLevel;.  Wher
27ca0 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20  eLoop *pLoop;.  
27cb0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
27cc0 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
27cd0 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  List;.  sqlite3 
27ce0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
27cf0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
27d00 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f   loop terminatio
27d10 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 56  n code..  */.  V
27d20 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74  dbeModuleComment
27d30 28 28 76 2c 20 22 45 6e 64 20 57 48 45 52 45 2d  ((v, "End WHERE-
27d40 63 6f 72 65 22 29 29 3b 0a 20 20 73 71 6c 69 74  core"));.  sqlit
27d50 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
27d60 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28  (pParse);.  for(
27d70 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  i=pWInfo->nLevel
27d80 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
27d90 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
27da0 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e    pLevel = &pWIn
27db0 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4c  fo->a[i];.    pL
27dc0 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
27dd0 4c 6f 6f 70 3b 0a 20 20 20 20 73 71 6c 69 74 65  Loop;.    sqlite
27de0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
27df0 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
27e00 72 43 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  rCont);.    if( 
27e10 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e  pLevel->op!=OP_N
27e20 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  oop ){.      sql
27e30 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
27e40 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c  , pLevel->op, pL
27e50 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c  evel->p1, pLevel
27e60 2d 3e 70 32 2c 20 70 4c 65 76 65 6c 2d 3e 70 33  ->p2, pLevel->p3
27e70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27e80 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
27e90 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20  pLevel->p5);.   
27ea0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
27eb0 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  v);.      VdbeCo
27ec0 76 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76  verageIf(v, pLev
27ed0 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 4e 65 78 74 29  el->op==OP_Next)
27ee0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
27ef0 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c  rageIf(v, pLevel
27f00 2d 3e 6f 70 3d 3d 4f 50 5f 50 72 65 76 29 3b 0a  ->op==OP_Prev);.
27f10 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
27f20 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  geIf(v, pLevel->
27f30 6f 70 3d 3d 4f 50 5f 56 4e 65 78 74 29 3b 0a 20  op==OP_VNext);. 
27f40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f     }.    if( pLo
27f50 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
27f60 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70  ERE_IN_ABLE && p
27f70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e  Level->u.in.nIn>
27f80 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  0 ){.      struc
27f90 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20  t InLoop *pIn;. 
27fa0 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
27fb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
27fc0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65  olveLabel(v, pLe
27fd0 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20  vel->addrNxt);. 
27fe0 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65       for(j=pLeve
27ff0 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e  l->u.in.nIn, pIn
28000 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  =&pLevel->u.in.a
28010 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30  InLoop[j-1]; j>0
28020 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20  ; j--, pIn--){. 
28030 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
28040 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49  beJumpHere(v, pI
28050 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b  n->addrInTop+1);
28060 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28070 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 49  VdbeAddOp2(v, pI
28080 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70  n->eEndLoopOp, p
28090 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61  In->iCur, pIn->a
280a0 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20  ddrInTop);.     
280b0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
280c0 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  v);.        Vdbe
280d0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 49  CoverageIf(v, pI
280e0 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f  n->eEndLoopOp==O
280f0 50 5f 50 72 65 76 49 66 4f 70 65 6e 29 3b 0a 20  P_PrevIfOpen);. 
28100 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
28110 61 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e 65 45  ageIf(v, pIn->eE
28120 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 4e 65 78  ndLoopOp==OP_Nex
28130 74 49 66 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  tIfOpen);.      
28140 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
28150 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64  pHere(v, pIn->ad
28160 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20  drInTop-1);.    
28170 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
28180 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
28190 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
281a0 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 69  >addrBrk);.    i
281b0 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53  f( pLevel->addrS
281c0 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  kip ){.      sql
281d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
281e0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c  , OP_Goto, 0, pL
281f0 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b  evel->addrSkip);
28200 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
28210 6e 74 28 28 76 2c 20 22 6e 65 78 74 20 73 6b 69  nt((v, "next ski
28220 70 2d 73 63 61 6e 20 6f 6e 20 25 73 22 2c 20 70  p-scan on %s", p
28230 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
28240 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  ndex->zName));. 
28250 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
28260 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76  JumpHere(v, pLev
28270 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20  el->addrSkip);. 
28280 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
28290 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76  JumpHere(v, pLev
282a0 65 6c 2d 3e 61 64 64 72 53 6b 69 70 2d 32 29 3b  el->addrSkip-2);
282b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
282c0 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52  Level->addrLikeR
282d0 65 70 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ep ){.      int 
282e0 6f 70 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  op;.      if( sq
282f0 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
28300 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69  , pLevel->addrLi
28310 6b 65 52 65 70 2d 31 29 2d 3e 70 31 20 29 7b 0a  keRep-1)->p1 ){.
28320 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f          op = OP_
28330 44 65 63 72 4a 75 6d 70 5a 65 72 6f 3b 0a 20 20  DecrJumpZero;.  
28340 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28350 20 20 20 6f 70 20 3d 20 4f 50 5f 4a 75 6d 70 5a     op = OP_JumpZ
28360 65 72 6f 49 6e 63 72 3b 0a 20 20 20 20 20 20 7d  eroIncr;.      }
28370 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
28380 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
28390 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70  pLevel->iLikeRep
283a0 43 6e 74 72 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  Cntr, pLevel->ad
283b0 64 72 4c 69 6b 65 52 65 70 29 3b 0a 20 20 20 20  drLikeRep);.    
283c0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
283d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
283e0 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
283f0 69 6e 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  in ){.      addr
28400 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
28410 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp1(v, OP_IfPos
28420 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  , pLevel->iLeftJ
28430 6f 69 6e 29 3b 20 56 64 62 65 43 6f 76 65 72 61  oin); VdbeCovera
28440 67 65 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73  ge(v);.      ass
28450 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  ert( (pLoop->wsF
28460 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
28470 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20  _ONLY)==0.      
28480 20 20 20 20 20 7c 7c 20 28 70 4c 6f 6f 70 2d 3e       || (pLoop->
28490 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
284a0 49 4e 44 45 58 45 44 29 21 3d 30 20 29 3b 0a 20  INDEXED)!=0 );. 
284b0 20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d       if( (pLoop-
284c0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
284d0 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b  _IDX_ONLY)==0 ){
284e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
284f0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
28500 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69  _NullRow, pTabLi
28510 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
28520 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
28530 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
28540 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
28550 58 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 73  XED ){.        s
28560 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
28570 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
28580 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29  pLevel->iIdxCur)
28590 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
285a0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d  if( pLevel->op==
285b0 4f 50 5f 52 65 74 75 72 6e 20 29 7b 0a 20 20 20  OP_Return ){.   
285c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
285d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
285e0 75 62 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20  ub, pLevel->p1, 
285f0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73  pLevel->addrFirs
28600 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
28610 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28620 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
28630 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c  _Goto, 0, pLevel
28640 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20  ->addrFirst);.  
28650 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
28660 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
28670 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a  v, addr);.    }.
28680 20 20 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f      VdbeModuleCo
28690 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 57  mment((v, "End W
286a0 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22  HERE-loop%d: %s"
286b0 2c 20 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , i,.           
286c0 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f            pWInfo
286d0 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
286e0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 70 54 61  evel->iFrom].pTa
286f0 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a  b->zName));.  }.
28700 0a 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b  .  /* The "break
28710 22 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c  " point is here,
28720 20 6a 75 73 74 20 70 61 73 74 20 74 68 65 20 65   just past the e
28730 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  nd of the outer 
28740 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69  loop..  ** Set i
28750 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  t..  */.  sqlite
28760 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
28770 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  l(v, pWInfo->iBr
28780 65 61 6b 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  eak);..  assert(
28790 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3c   pWInfo->nLevel<
287a0 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  =pTabList->nSrc 
287b0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c  );.  for(i=0, pL
287c0 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
287d0 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  i<pWInfo->nLevel
287e0 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29  ; i++, pLevel++)
287f0 7b 0a 20 20 20 20 69 6e 74 20 6b 2c 20 6c 61 73  {.    int k, las
28800 74 3b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70  t;.    VdbeOp *p
28810 4f 70 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  Op;.    Index *p
28820 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 73 74 72  Idx = 0;.    str
28830 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
28840 20 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54   *pTabItem = &pT
28850 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
28860 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61  ->iFrom];.    Ta
28870 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62  ble *pTab = pTab
28880 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
28890 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20  assert( pTab!=0 
288a0 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70  );.    pLoop = p
288b0 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a  Level->pWLoop;..
288c0 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f 2d      /* For a co-
288d0 72 6f 75 74 69 6e 65 2c 20 63 68 61 6e 67 65 20  routine, change 
288e0 61 6c 6c 20 4f 50 5f 43 6f 6c 75 6d 6e 20 72 65  all OP_Column re
288f0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
28900 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20  table of.    ** 
28910 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69  the co-routine i
28920 6e 74 6f 20 4f 50 5f 43 6f 70 79 20 6f 66 20 72  nto OP_Copy of r
28930 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e 65 64 20  esult contained 
28940 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e 0a 20  in a register.. 
28950 20 20 20 2a 2a 20 4f 50 5f 52 6f 77 69 64 20 62     ** OP_Rowid b
28960 65 63 6f 6d 65 73 20 4f 50 5f 4e 75 6c 6c 2e 0a  ecomes OP_Null..
28970 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
28980 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43  TabItem->fg.viaC
28990 6f 72 6f 75 74 69 6e 65 20 26 26 20 21 64 62 2d  oroutine && !db-
289a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
289b0 0a 20 20 20 20 20 20 74 72 61 6e 73 6c 61 74 65  .      translate
289c0 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 76 2c 20  ColumnToCopy(v, 
289d0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79  pLevel->addrBody
289e0 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
289f0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
28a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
28a10 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 73 75  TabItem->regResu
28a20 6c 74 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  lt);.      conti
28a30 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nue;.    }..    
28a40 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20  /* Close all of 
28a50 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74  the cursors that
28a60 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20   were opened by 
28a70 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
28a80 6e 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65 70 74  n..    ** Except
28a90 2c 20 64 6f 20 6e 6f 74 20 63 6c 6f 73 65 20 63  , do not close c
28aa0 75 72 73 6f 72 73 20 74 68 61 74 20 77 69 6c 6c  ursors that will
28ab0 20 62 65 20 72 65 75 73 65 64 20 62 79 20 74 68   be reused by th
28ac0 65 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f  e OR optimizatio
28ad0 6e 0a 20 20 20 20 2a 2a 20 28 57 48 45 52 45 5f  n.    ** (WHERE_
28ae0 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29  OMIT_OPEN_CLOSE)
28af0 2e 20 20 41 6e 64 20 64 6f 20 6e 6f 74 20 63 6c  .  And do not cl
28b00 6f 73 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 57  ose the OP_OpenW
28b10 72 69 74 65 20 63 75 72 73 6f 72 73 0a 20 20 20  rite cursors.   
28b20 20 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72 20   ** created for 
28b30 74 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74 69  the ONEPASS opti
28b40 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  mization..    */
28b50 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e  .    if( (pTab->
28b60 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
28b70 68 65 6d 65 72 61 6c 29 3d 3d 30 0a 20 20 20 20  hemeral)==0.    
28b80 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
28b90 74 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 57  t==0.     && (pW
28ba0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
28bb0 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50   & WHERE_OMIT_OP
28bc0 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 0a 20 20 20  EN_CLOSE)==0.   
28bd0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 73   ){.      int ws
28be0 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67   = pLoop->wsFlag
28bf0 73 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 57  s;.      if( !pW
28c00 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20  Info->okOnePass 
28c10 26 26 20 28 77 73 20 26 20 57 48 45 52 45 5f 49  && (ws & WHERE_I
28c20 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20  DX_ONLY)==0 ){. 
28c30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
28c40 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
28c50 6c 6f 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e  lose, pTabItem->
28c60 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
28c70 7d 0a 20 20 20 20 20 20 69 66 28 20 28 77 73 20  }.      if( (ws 
28c80 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
28c90 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 77  !=0.       && (w
28ca0 73 20 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57  s & (WHERE_IPK|W
28cb0 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
28cc0 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20  )==0 .       && 
28cd0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 21  pLevel->iIdxCur!
28ce0 3d 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e  =pWInfo->aiCurOn
28cf0 65 50 61 73 73 5b 31 5d 0a 20 20 20 20 20 20 29  ePass[1].      )
28d00 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
28d10 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
28d20 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d  P_Close, pLevel-
28d30 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20  >iIdxCur);.     
28d40 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
28d50 20 49 66 20 74 68 69 73 20 73 63 61 6e 20 75 73   If this scan us
28d60 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b  es an index, mak
28d70 65 20 56 44 42 45 20 63 6f 64 65 20 73 75 62 73  e VDBE code subs
28d80 74 69 74 75 74 69 6f 6e 73 20 74 6f 20 72 65 61  titutions to rea
28d90 64 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66 72  d data.    ** fr
28da0 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 69 6e 73  om the index ins
28db0 74 65 61 64 20 6f 66 20 66 72 6f 6d 20 74 68 65  tead of from the
28dc0 20 74 61 62 6c 65 20 77 68 65 72 65 20 70 6f 73   table where pos
28dd0 73 69 62 6c 65 2e 20 20 49 6e 20 73 6f 6d 65 20  sible.  In some 
28de0 63 61 73 65 73 0a 20 20 20 20 2a 2a 20 74 68 69  cases.    ** thi
28df0 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 70  s optimization p
28e00 72 65 76 65 6e 74 73 20 74 68 65 20 74 61 62 6c  revents the tabl
28e10 65 20 66 72 6f 6d 20 65 76 65 72 20 62 65 69 6e  e from ever bein
28e20 67 20 72 65 61 64 2c 20 77 68 69 63 68 20 63 61  g read, which ca
28e30 6e 0a 20 20 20 20 2a 2a 20 79 69 65 6c 64 20 61  n.    ** yield a
28e40 20 73 69 67 6e 69 66 69 63 61 6e 74 20 70 65 72   significant per
28e50 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e 0a  formance boost..
28e60 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43      ** .    ** C
28e70 61 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65  alls to the code
28e80 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65   generator in be
28e90 74 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65  tween sqlite3Whe
28ea0 72 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20  reBegin and.    
28eb0 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  ** sqlite3WhereE
28ec0 6e 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65  nd will have cre
28ed0 61 74 65 64 20 63 6f 64 65 20 74 68 61 74 20 72  ated code that r
28ee0 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 74 61  eferences the ta
28ef0 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  ble.    ** direc
28f00 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20  tly.  This loop 
28f10 73 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63  scans all that c
28f20 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ode looking for 
28f30 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74  opcodes.    ** t
28f40 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68  hat reference th
28f50 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76  e table and conv
28f60 65 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f  erts them into o
28f70 70 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20  pcodes that.    
28f80 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ** reference the
28f90 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20   index..    */. 
28fa0 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
28fb0 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49  Flags & (WHERE_I
28fc0 4e 44 45 58 45 44 7c 57 48 45 52 45 5f 49 44 58  NDEXED|WHERE_IDX
28fd0 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20 20 20 20 20  _ONLY) ){.      
28fe0 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  pIdx = pLoop->u.
28ff0 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
29000 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f    }else if( pLoo
29010 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
29020 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20  RE_MULTI_OR ){. 
29030 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76       pIdx = pLev
29040 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 3b 0a 20  el->u.pCovidx;. 
29050 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64     }.    if( pId
29060 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  x && !db->malloc
29070 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
29080 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  last = sqlite3Vd
29090 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
290a0 3b 0a 20 20 20 20 20 20 6b 20 3d 20 70 4c 65 76  ;.      k = pLev
290b0 65 6c 2d 3e 61 64 64 72 42 6f 64 79 3b 0a 20 20  el->addrBody;.  
290c0 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65      pOp = sqlite
290d0 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 6b 29  3VdbeGetOp(v, k)
290e0 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 6b 3c  ;.      for(; k<
290f0 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b  last; k++, pOp++
29100 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
29110 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e  Op->p1!=pLevel->
29120 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e  iTabCur ) contin
29130 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
29140 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
29150 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
29160 20 20 20 20 69 6e 74 20 78 20 3d 20 70 4f 70 2d      int x = pOp-
29170 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20 61  >p2;.          a
29180 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70 54 61  ssert( pIdx->pTa
29190 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20  ble==pTab );.   
291a0 20 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52         if( !HasR
291b0 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20  owid(pTab) ){.  
291c0 20 20 20 20 20 20 20 20 20 20 49 6e 64 65 78 20            Index 
291d0 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72  *pPk = sqlite3Pr
291e0 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
291f0 61 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ab);.           
29200 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75   x = pPk->aiColu
29210 6d 6e 5b 78 5d 3b 0a 20 20 20 20 20 20 20 20 20  mn[x];.         
29220 20 7d 0a 20 20 20 20 20 20 20 20 20 20 78 20 3d   }.          x =
29230 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
29240 49 6e 64 65 78 28 70 49 64 78 2c 20 78 29 3b 0a  Index(pIdx, x);.
29250 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78 3e            if( x>
29260 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
29270 20 20 70 4f 70 2d 3e 70 32 20 3d 20 78 3b 0a 20    pOp->p2 = x;. 
29280 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e             pOp->
29290 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  p1 = pLevel->iId
292a0 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20  xCur;.          
292b0 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  }.          asse
292c0 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
292d0 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
292e0 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20 78 3e 3d 30  ONLY)==0 || x>=0
292f0 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   );.        }els
29300 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  e if( pOp->opcod
29310 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20  e==OP_Rowid ){. 
29320 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31           pOp->p1
29330 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
29340 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  ur;.          pO
29350 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49  p->opcode = OP_I
29360 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20  dxRowid;.       
29370 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
29380 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c  .  }..  /* Final
29390 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20   cleanup.  */.  
293a0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
293b0 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76  op = pWInfo->sav
293c0 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  edNQueryLoop;.  
293d0 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62  whereInfoFree(db
293e0 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74  , pWInfo);.  ret
293f0 75 72 6e 3b 0a 7d 0a                             urn;.}.