/ Hex Artifact Content
Login

Artifact b22b416694905555a0cbbd7d8881179392a56aba:


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 23 69 66 20 57 48 45 52 45 54  =0 ){.#if WHERET
11470 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
11480 20 75 31 36 20 6e 20 3d 20 70 42 75 69 6c 64 65   u16 n = pBuilde
11490 72 2d 3e 70 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20  r->pOrSet->n;.  
114a0 20 20 69 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66    int x =.#endif
114b0 0a 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65  .    whereOrInse
114c0 72 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  rt(pBuilder->pOr
114d0 53 65 74 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e  Set, pTemplate->
114e0 70 72 65 72 65 71 2c 20 70 54 65 6d 70 6c 61 74  prereq, pTemplat
114f0 65 2d 3e 72 52 75 6e 2c 0a 20 20 20 20 20 20 20  e->rRun,.       
11500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11510 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65               pTe
11520 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23  mplate->nOut);.#
11530 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
11540 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
11550 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
11560 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20  hereTrace & 0x8 
11570 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11580 44 65 62 75 67 50 72 69 6e 74 66 28 78 3f 22 20  DebugPrintf(x?" 
11590 20 20 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20 20    or-%d:  ":"   
115a0 6f 72 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20  or-X:  ", n);.  
115b0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
115c0 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42  nt(pTemplate, pB
115d0 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20  uilder->pWC);.  
115e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72    }.#endif.    r
115f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11600 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  .  }..  /* Look 
11610 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20  for an existing 
11620 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 72 65 70  WhereLoop to rep
11630 6c 61 63 65 20 77 69 74 68 20 70 54 65 6d 70 6c  lace with pTempl
11640 61 74 65 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65  ate.  */.  where
11650 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 70  LoopAdjustCost(p
11660 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70  WInfo->pLoops, p
11670 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 70 70 50  Template);.  ppP
11680 72 65 76 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46  rev = whereLoopF
11690 69 6e 64 4c 65 73 73 65 72 28 26 70 57 49 6e 66  indLesser(&pWInf
116a0 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70  o->pLoops, pTemp
116b0 6c 61 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 70  late);..  if( pp
116c0 50 72 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Prev==0 ){.    /
116d0 2a 20 54 68 65 72 65 20 61 6c 72 65 61 64 79 20  * There already 
116e0 65 78 69 73 74 73 20 61 20 57 68 65 72 65 4c 6f  exists a WhereLo
116f0 6f 70 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 74  op on the list t
11700 68 61 74 20 69 73 20 62 65 74 74 65 72 0a 20 20  hat is better.  
11710 20 20 2a 2a 20 74 68 61 6e 20 70 54 65 6d 70 6c    ** than pTempl
11720 61 74 65 2c 20 73 6f 20 6a 75 73 74 20 69 67 6e  ate, so just ign
11730 6f 72 65 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f  ore pTemplate */
11740 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
11750 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a  ENABLED /* 0x8 *
11760 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
11770 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
11780 38 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  8 ){.      sqlit
11790 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
117a0 20 20 73 6b 69 70 3a 20 22 29 3b 0a 20 20 20 20    skip: ");.    
117b0 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
117c0 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69  (pTemplate, pBui
117d0 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20  lder->pWC);.    
117e0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  }.#endif.    ret
117f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  urn SQLITE_OK;  
11800 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
11810 3d 20 2a 70 70 50 72 65 76 3b 0a 20 20 7d 0a 0a  = *ppPrev;.  }..
11820 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
11830 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d   this point it m
11840 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72  eans that either
11850 20 70 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f   p[] should be o
11860 76 65 72 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20  verwritten.  ** 
11870 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d  with pTemplate[]
11880 20 69 66 20 70 5b 5d 20 65 78 69 73 74 73 2c 20   if p[] exists, 
11890 6f 72 20 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68  or if p==NULL th
118a0 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  en allocate a ne
118b0 77 0a 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70  w.  ** WhereLoop
118c0 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 2e 0a   and insert it..
118d0 20 20 2a 2f 0a 23 69 66 20 57 48 45 52 45 54 52    */.#if WHERETR
118e0 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
118f0 78 38 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  x8 */.  if( sqli
11900 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
11910 30 78 38 20 29 7b 0a 20 20 20 20 69 66 28 20 70  0x8 ){.    if( p
11920 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
11930 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
11940 22 72 65 70 6c 61 63 65 3a 20 22 29 3b 0a 20 20  "replace: ");.  
11950 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
11960 6e 74 28 70 2c 20 70 42 75 69 6c 64 65 72 2d 3e  nt(p, pBuilder->
11970 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pWC);.    }.    
11980 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
11990 74 66 28 22 20 20 20 20 61 64 64 3a 20 22 29 3b  tf("    add: ");
119a0 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72  .    whereLoopPr
119b0 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70  int(pTemplate, p
119c0 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20  Builder->pWC);. 
119d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
119e0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41  p==0 ){.    /* A
119f0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68  llocate a new Wh
11a00 65 72 65 4c 6f 6f 70 20 74 6f 20 61 64 64 20 74  ereLoop to add t
11a10 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
11a20 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 2a 70 70   list */.    *pp
11a30 50 72 65 76 20 3d 20 70 20 3d 20 73 71 6c 69 74  Prev = p = sqlit
11a40 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
11a50 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  , sizeof(WhereLo
11a60 6f 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d  op));.    if( p=
11a70 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
11a80 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 77 68  TE_NOMEM;.    wh
11a90 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a  ereLoopInit(p);.
11aa0 20 20 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70      p->pNextLoop
11ab0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
11ac0 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 62 65     /* We will be
11ad0 20 6f 76 65 72 77 72 69 74 69 6e 67 20 57 68 65   overwriting Whe
11ae0 72 65 4c 6f 6f 70 20 70 5b 5d 2e 20 20 42 75 74  reLoop p[].  But
11af0 20 62 65 66 6f 72 65 20 77 65 20 64 6f 2c 20 66   before we do, f
11b00 69 72 73 74 0a 20 20 20 20 2a 2a 20 67 6f 20 74  irst.    ** go t
11b10 68 72 6f 75 67 68 20 74 68 65 20 72 65 73 74 20  hrough the rest 
11b20 6f 66 20 74 68 65 20 6c 69 73 74 20 61 6e 64 20  of the list and 
11b30 64 65 6c 65 74 65 20 61 6e 79 20 6f 74 68 65 72  delete any other
11b40 20 65 6e 74 72 69 65 73 20 62 65 73 69 64 65 73   entries besides
11b50 0a 20 20 20 20 2a 2a 20 70 5b 5d 20 74 68 61 74  .    ** p[] that
11b60 20 61 72 65 20 61 6c 73 6f 20 73 75 70 70 6c 61   are also suppla
11b70 74 65 64 20 62 79 20 70 54 65 6d 70 6c 61 74 65  ted by pTemplate
11b80 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f   */.    WhereLoo
11b90 70 20 2a 2a 70 70 54 61 69 6c 20 3d 20 26 70 2d  p **ppTail = &p-
11ba0 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20  >pNextLoop;.    
11bb0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 44 65  WhereLoop *pToDe
11bc0 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 70  l;.    while( *p
11bd0 70 54 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 70  pTail ){.      p
11be0 70 54 61 69 6c 20 3d 20 77 68 65 72 65 4c 6f 6f  pTail = whereLoo
11bf0 70 46 69 6e 64 4c 65 73 73 65 72 28 70 70 54 61  pFindLesser(ppTa
11c00 69 6c 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a  il, pTemplate);.
11c10 20 20 20 20 20 20 69 66 28 20 70 70 54 61 69 6c        if( ppTail
11c20 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
11c30 20 20 20 70 54 6f 44 65 6c 20 3d 20 2a 70 70 54     pToDel = *ppT
11c40 61 69 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ail;.      if( p
11c50 54 6f 44 65 6c 3d 3d 30 20 29 20 62 72 65 61 6b  ToDel==0 ) break
11c60 3b 0a 20 20 20 20 20 20 2a 70 70 54 61 69 6c 20  ;.      *ppTail 
11c70 3d 20 70 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 4c  = pToDel->pNextL
11c80 6f 6f 70 3b 0a 23 69 66 20 57 48 45 52 45 54 52  oop;.#if WHERETR
11c90 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
11ca0 78 38 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  x8 */.      if( 
11cb0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
11cc0 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20  e & 0x8 ){.     
11cd0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
11ce0 72 69 6e 74 66 28 22 20 64 65 6c 65 74 65 3a 20  rintf(" delete: 
11cf0 22 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  ");.        wher
11d00 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 6f 44 65  eLoopPrint(pToDe
11d10 6c 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  l, pBuilder->pWC
11d20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
11d30 66 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  f.      whereLoo
11d40 70 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 44  pDelete(db, pToD
11d50 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  el);.    }.  }. 
11d60 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 64   whereLoopXfer(d
11d70 62 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74 65 29  b, p, pTemplate)
11d80 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c  ;.  if( (p->wsFl
11d90 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
11da0 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a  UALTABLE)==0 ){.
11db0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65      Index *pInde
11dc0 78 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  x = p->u.btree.p
11dd0 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70  Index;.    if( p
11de0 49 6e 64 65 78 20 26 26 20 70 49 6e 64 65 78 2d  Index && pIndex-
11df0 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  >tnum==0 ){.    
11e00 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e    p->u.btree.pIn
11e10 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  dex = 0;.    }. 
11e20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
11e30 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
11e40 41 64 6a 75 73 74 20 74 68 65 20 57 68 65 72 65  Adjust the Where
11e50 4c 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75 65 20  Loop.nOut value 
11e60 64 6f 77 6e 77 61 72 64 20 74 6f 20 61 63 63 6f  downward to acco
11e70 75 6e 74 20 66 6f 72 20 74 65 72 6d 73 20 6f 66  unt for terms of
11e80 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c   the.** WHERE cl
11e90 61 75 73 65 20 74 68 61 74 20 72 65 66 65 72 65  ause that refere
11ea0 6e 63 65 20 74 68 65 20 6c 6f 6f 70 20 62 75 74  nce the loop but
11eb0 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 75   which are not u
11ec0 73 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69 6e 64  sed by an.** ind
11ed0 65 78 2e 0a 2a 0a 2a 2a 20 46 6f 72 20 65 76 65  ex..*.** For eve
11ee0 72 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ry WHERE clause 
11ef0 74 65 72 6d 20 74 68 61 74 20 69 73 20 6e 6f 74  term that is not
11f00 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 64   used by the ind
11f10 65 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63 68 20  ex.** and which 
11f20 68 61 73 20 61 20 74 72 75 74 68 20 70 72 6f 62  has a truth prob
11f30 61 62 69 6c 69 74 79 20 61 73 73 69 67 6e 65 64  ability assigned
11f40 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   by one of the l
11f50 69 6b 65 6c 69 68 6f 6f 64 28 29 2c 0a 2a 2a 20  ikelihood(),.** 
11f60 6c 69 6b 65 6c 79 28 29 2c 20 6f 72 20 75 6e 6c  likely(), or unl
11f70 69 6b 65 6c 79 28 29 20 53 51 4c 20 66 75 6e 63  ikely() SQL func
11f80 74 69 6f 6e 73 2c 20 72 65 64 75 63 65 20 74 68  tions, reduce th
11f90 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62  e estimated numb
11fa0 65 72 0a 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20  er.** of output 
11fb0 72 6f 77 73 20 62 79 20 74 68 65 20 70 72 6f 62  rows by the prob
11fc0 61 62 69 6c 69 74 79 20 73 70 65 63 69 66 69 65  ability specifie
11fd0 64 2e 0a 2a 2a 0a 2a 2a 20 54 55 4e 49 4e 47 3a  d..**.** TUNING:
11fe0 20 20 46 6f 72 20 65 76 65 72 79 20 57 48 45 52    For every WHER
11ff0 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68  E clause term th
12000 61 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62  at is not used b
12010 79 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61  y the index.** a
12020 6e 64 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f  nd which does no
12030 74 20 68 61 76 65 20 61 6e 20 61 73 73 69 67 6e  t have an assign
12040 65 64 20 74 72 75 74 68 20 70 72 6f 62 61 62 69  ed truth probabi
12050 6c 69 74 79 2c 20 68 65 75 72 69 73 74 69 63 73  lity, heuristics
12060 0a 2a 2a 20 64 65 73 63 72 69 62 65 64 20 62 65  .** described be
12070 6c 6f 77 20 61 72 65 20 75 73 65 64 20 74 6f 20  low are used to 
12080 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20  try to estimate 
12090 74 68 65 20 74 72 75 74 68 20 70 72 6f 62 61 62  the truth probab
120a0 69 6c 69 74 79 2e 0a 2a 2a 20 54 4f 44 4f 20 2d  ility..** TODO -
120b0 2d 3e 20 50 65 72 68 61 70 73 20 74 68 69 73 20  -> Perhaps this 
120c0 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61  is something tha
120d0 74 20 63 6f 75 6c 64 20 62 65 20 69 6d 70 72 6f  t could be impro
120e0 76 65 64 20 62 79 20 62 65 74 74 65 72 0a 2a 2a  ved by better.**
120f0 20 74 61 62 6c 65 20 73 74 61 74 69 73 74 69 63   table statistic
12100 73 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74  s..**.** Heurist
12110 69 63 20 31 3a 20 20 45 73 74 69 6d 61 74 65 20  ic 1:  Estimate 
12120 74 68 65 20 74 72 75 74 68 20 70 72 6f 62 61 62  the truth probab
12130 69 6c 69 74 79 20 61 73 20 39 33 2e 37 35 25 2e  ility as 93.75%.
12140 20 20 54 68 65 20 39 33 2e 37 35 25 0a 2a 2a 20    The 93.75%.** 
12150 76 61 6c 75 65 20 63 6f 72 72 65 73 70 6f 6e 64  value correspond
12160 73 20 74 6f 20 2d 31 20 69 6e 20 4c 6f 67 45 73  s to -1 in LogEs
12170 74 20 6e 6f 74 61 74 69 6f 6e 2c 20 73 6f 20 74  t notation, so t
12180 68 69 73 20 6d 65 61 6e 73 20 64 65 63 72 65 6d  his means decrem
12190 65 6e 74 0a 2a 2a 20 74 68 65 20 57 68 65 72 65  ent.** the Where
121a0 4c 6f 6f 70 2e 6e 4f 75 74 20 66 69 65 6c 64 20  Loop.nOut field 
121b0 66 6f 72 20 65 76 65 72 79 20 73 75 63 68 20 57  for every such W
121c0 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
121d0 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69  ..**.** Heuristi
121e0 63 20 32 3a 20 20 49 66 20 74 68 65 72 65 20 65  c 2:  If there e
121f0 78 69 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  xists one or mor
12200 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
12210 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66  erms of the.** f
12220 6f 72 6d 20 22 78 3d 3d 45 58 50 52 22 20 61 6e  orm "x==EXPR" an
12230 64 20 45 58 50 52 20 69 73 20 6e 6f 74 20 61 20  d EXPR is not a 
12240 63 6f 6e 73 74 61 6e 74 20 30 20 6f 72 20 31 2c  constant 0 or 1,
12250 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
12260 74 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 6f 75 74  the.** final out
12270 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65  put row estimate
12280 20 69 73 20 6e 6f 20 67 72 65 61 74 65 72 20 74   is no greater t
12290 68 61 6e 20 31 2f 34 20 6f 66 20 74 68 65 20 74  han 1/4 of the t
122a0 6f 74 61 6c 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f  otal number.** o
122b0 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
122c0 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ble.  In other w
122d0 6f 72 64 73 2c 20 61 73 73 75 6d 65 20 74 68 61  ords, assume tha
122e0 74 20 78 3d 3d 45 58 50 52 20 77 69 6c 6c 20 66  t x==EXPR will f
122f0 69 6c 74 65 72 0a 2a 2a 20 6f 75 74 20 61 74 20  ilter.** out at 
12300 6c 65 61 73 74 20 33 20 6f 75 74 20 6f 66 20 34  least 3 out of 4
12310 20 72 6f 77 73 2e 20 20 49 66 20 45 58 50 52 20   rows.  If EXPR 
12320 69 73 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 2c  is -1 or 0 or 1,
12330 20 74 68 65 6e 20 6d 61 79 62 65 20 74 68 65 0a   then maybe the.
12340 2a 2a 20 22 78 22 20 63 6f 6c 75 6d 6e 20 69 73  ** "x" column is
12350 20 62 6f 6f 6c 65 61 6e 20 6f 72 20 65 6c 73 65   boolean or else
12360 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 20 69 73   -1 or 0 or 1 is
12370 20 61 20 63 6f 6d 6d 6f 6e 20 64 65 66 61 75 6c   a common defaul
12380 74 20 76 61 6c 75 65 0a 2a 2a 20 6f 6e 20 74 68  t value.** on th
12390 65 20 22 78 22 20 63 6f 6c 75 6d 6e 20 61 6e 64  e "x" column and
123a0 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65   so in that case
123b0 20 6f 6e 6c 79 20 63 61 70 20 74 68 65 20 6f 75   only cap the ou
123c0 74 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74  tput row estimat
123d0 65 0a 2a 2a 20 61 74 20 31 2f 32 20 69 6e 73 74  e.** at 1/2 inst
123e0 65 61 64 20 6f 66 20 31 2f 34 2e 0a 2a 2f 0a 73  ead of 1/4..*/.s
123f0 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
12400 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74  LoopOutputAdjust
12410 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  (.  WhereClause 
12420 2a 70 57 43 2c 20 20 20 20 20 20 2f 2a 20 54 68  *pWC,      /* Th
12430 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
12440 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
12450 4c 6f 6f 70 2c 20 20 20 20 20 20 2f 2a 20 54 68  Loop,      /* Th
12460 65 20 6c 6f 6f 70 20 74 6f 20 61 64 6a 75 73 74  e loop to adjust
12470 20 64 6f 77 6e 77 61 72 64 20 2a 2f 0a 20 20 4c   downward */.  L
12480 6f 67 45 73 74 20 6e 52 6f 77 20 20 20 20 20 20  ogEst nRow      
12490 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
124a0 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 65  of rows in the e
124b0 6e 74 69 72 65 20 74 61 62 6c 65 20 2a 2f 0a 29  ntire table */.)
124c0 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
124d0 54 65 72 6d 2c 20 2a 70 58 3b 0a 20 20 42 69 74  Term, *pX;.  Bit
124e0 6d 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64 20  mask notAllowed 
124f0 3d 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65 72 65  = ~(pLoop->prere
12500 71 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  q|pLoop->maskSel
12510 66 29 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  f);.  int i, j, 
12520 6b 3b 0a 20 20 4c 6f 67 45 73 74 20 69 52 65 64  k;.  LogEst iRed
12530 75 63 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 70  uce = 0;    /* p
12540 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 73 68 6f 75 6c  Loop->nOut shoul
12550 64 20 6e 6f 74 20 65 78 63 65 65 64 20 6e 52 6f  d not exceed nRo
12560 77 2d 69 52 65 64 75 63 65 20 2a 2f 0a 0a 20 20  w-iReduce */..  
12570 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
12580 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
12590 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29  AUTO_INDEX)==0 )
125a0 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e  ;.  for(i=pWC->n
125b0 54 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43 2d  Term, pTerm=pWC-
125c0 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54  >a; i>0; i--, pT
125d0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
125e0 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
125f0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21  & TERM_VIRTUAL)!
12600 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
12610 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
12620 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d  eqAll & pLoop->m
12630 61 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63 6f  askSelf)==0 ) co
12640 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
12650 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
12660 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29 21  l & notAllowed)!
12670 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
12680 20 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e     for(j=pLoop->
12690 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20  nLTerm-1; j>=0; 
126a0 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58 20 3d  j--){.      pX =
126b0 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
126c0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d  ];.      if( pX=
126d0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
126e0 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 54 65       if( pX==pTe
126f0 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rm ) break;.    
12700 20 20 69 66 28 20 70 58 2d 3e 69 50 61 72 65 6e    if( pX->iParen
12710 74 3e 3d 30 20 26 26 20 28 26 70 57 43 2d 3e 61  t>=0 && (&pWC->a
12720 5b 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d 3d  [pX->iParent])==
12730 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20  pTerm ) break;. 
12740 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30     }.    if( j<0
12750 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54   ){.      if( pT
12760 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d  erm->truthProb<=
12770 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
12780 49 66 20 61 20 74 72 75 74 68 20 70 72 6f 62 61  If a truth proba
12790 62 69 6c 69 74 79 20 69 73 20 73 70 65 63 69 66  bility is specif
127a0 69 65 64 20 75 73 69 6e 67 20 74 68 65 20 6c 69  ied using the li
127b0 6b 65 6c 69 68 6f 6f 64 28 29 20 68 69 6e 74 73  kelihood() hints
127c0 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
127d0 6e 20 75 73 65 20 74 68 65 20 70 72 6f 62 61 62  n use the probab
127e0 69 6c 69 74 79 20 70 72 6f 76 69 64 65 64 20 62  ility provided b
127f0 79 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  y the applicatio
12800 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c  n. */.        pL
12810 6f 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65  oop->nOut += pTe
12820 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20  rm->truthProb;. 
12830 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12840 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 61 62      /* In the ab
12850 73 65 6e 63 65 20 6f 66 20 65 78 70 6c 69 63 69  sence of explici
12860 74 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c  t truth probabil
12870 69 74 69 65 73 2c 20 75 73 65 20 68 65 75 72 69  ities, use heuri
12880 73 74 69 63 73 20 74 6f 0a 20 20 20 20 20 20 20  stics to.       
12890 20 2a 2a 20 67 75 65 73 73 20 61 20 72 65 61 73   ** guess a reas
128a0 6f 6e 61 62 6c 65 20 74 72 75 74 68 20 70 72 6f  onable truth pro
128b0 62 61 62 69 6c 69 74 79 2e 20 2a 2f 0a 20 20 20  bability. */.   
128c0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74       pLoop->nOut
128d0 2d 2d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  --;.        if( 
128e0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
128f0 26 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29  &(WO_EQ|WO_IS) )
12900 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
12910 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d   *pRight = pTerm
12920 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
12930 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
12940 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70  ase( pTerm->pExp
12950 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  r->op==TK_IS );.
12960 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
12970 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
12980 65 72 28 70 52 69 67 68 74 2c 20 26 6b 29 20 26  er(pRight, &k) &
12990 26 20 6b 3e 3d 28 2d 31 29 20 26 26 20 6b 3c 3d  & k>=(-1) && k<=
129a0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
129b0 20 6b 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20   k = 10;.       
129c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
129d0 20 20 20 20 20 20 6b 20 3d 20 32 30 3b 0a 20 20        k = 20;.  
129e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
129f0 20 20 20 20 69 66 28 20 69 52 65 64 75 63 65 3c      if( iReduce<
12a00 6b 20 29 20 69 52 65 64 75 63 65 20 3d 20 6b 3b  k ) iReduce = k;
12a10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12a20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
12a30 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3e  f( pLoop->nOut >
12a40 20 6e 52 6f 77 2d 69 52 65 64 75 63 65 20 29 20   nRow-iReduce ) 
12a50 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 6e   pLoop->nOut = n
12a60 52 6f 77 20 2d 20 69 52 65 64 75 63 65 3b 0a 7d  Row - iReduce;.}
12a70 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74  ../*.** Adjust t
12a80 68 65 20 63 6f 73 74 20 43 20 62 79 20 74 68 65  he cost C by the
12a90 20 63 6f 73 74 4d 75 6c 74 20 66 61 63 74 65 72   costMult facter
12aa0 20 54 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 6f   T.  This only o
12ab0 63 63 75 72 73 20 69 66 0a 2a 2a 20 63 6f 6d 70  ccurs if.** comp
12ac0 69 6c 65 64 20 77 69 74 68 20 2d 44 53 51 4c 49  iled with -DSQLI
12ad0 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55  TE_ENABLE_COSTMU
12ae0 4c 54 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  LT.*/.#ifdef SQL
12af0 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d  ITE_ENABLE_COSTM
12b00 55 4c 54 0a 23 20 64 65 66 69 6e 65 20 41 70 70  ULT.# define App
12b10 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72  lyCostMultiplier
12b20 28 43 2c 54 29 20 20 43 20 2b 3d 20 54 0a 23 65  (C,T)  C += T.#e
12b30 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 41 70 70  lse.# define App
12b40 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72  lyCostMultiplier
12b50 28 43 2c 54 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (C,T).#endif../*
12b60 0a 2a 2a 20 57 65 20 68 61 76 65 20 73 6f 20 66  .** We have so f
12b70 61 72 20 6d 61 74 63 68 65 64 20 70 42 75 69 6c  ar matched pBuil
12b80 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72  der->pNew->u.btr
12b90 65 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f 66 20  ee.nEq terms of 
12ba0 74 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20 70 49  the .** index pI
12bb0 6e 64 65 78 2e 20 54 72 79 20 74 6f 20 6d 61 74  ndex. Try to mat
12bc0 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a  ch one more..**.
12bd0 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  ** When this fun
12be0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
12bf0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
12c00 3e 6e 4f 75 74 20 63 6f 6e 74 61 69 6e 73 20 74  >nOut contains t
12c10 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  he .** number of
12c20 20 72 6f 77 73 20 65 78 70 65 63 74 65 64 20 74   rows expected t
12c30 6f 20 62 65 20 76 69 73 69 74 65 64 20 62 79 20  o be visited by 
12c40 66 69 6c 74 65 72 69 6e 67 20 75 73 69 6e 67 20  filtering using 
12c50 74 68 65 20 6e 45 71 20 0a 2a 2a 20 74 65 72 6d  the nEq .** term
12c60 73 20 6f 6e 6c 79 2e 20 49 66 20 69 74 20 69 73  s only. If it is
12c70 20 6d 6f 64 69 66 69 65 64 2c 20 74 68 69 73 20   modified, this 
12c80 76 61 6c 75 65 20 69 73 20 72 65 73 74 6f 72 65  value is restore
12c90 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 0a 2a  d before this .*
12ca0 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
12cb0 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72  ns..**.** If pPr
12cc0 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68  obe->tnum==0, th
12cd0 61 74 20 6d 65 61 6e 73 20 70 49 6e 64 65 78 20  at means pIndex 
12ce0 69 73 20 61 20 66 61 6b 65 20 69 6e 64 65 78 20  is a fake index 
12cf0 75 73 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20  used for the.** 
12d00 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
12d10 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  KEY..*/.static i
12d20 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42  nt whereLoopAddB
12d30 74 72 65 65 49 6e 64 65 78 28 0a 20 20 57 68 65  treeIndex(.  Whe
12d40 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
12d50 42 75 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20  Builder,     /* 
12d60 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 66 61  The WhereLoop fa
12d70 63 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75 63  ctory */.  struc
12d80 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
12d90 70 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 46 52  pSrc,      /* FR
12da0 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62  OM clause term b
12db0 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  eing analyzed */
12dc0 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65  .  Index *pProbe
12dd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12de0 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f     /* An index o
12df0 6e 20 70 53 72 63 20 2a 2f 0a 20 20 4c 6f 67 45  n pSrc */.  LogE
12e00 73 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20  st nInMul       
12e10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c              /* l
12e20 6f 67 28 4e 75 6d 62 65 72 20 6f 66 20 69 74 65  og(Number of ite
12e30 72 61 74 69 6f 6e 73 20 64 75 65 20 74 6f 20 49  rations due to I
12e40 4e 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  N) */.){.  Where
12e50 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
12e60 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
12e70 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79    /* WHERE analy
12e80 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
12e90 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
12ea0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20  pWInfo->pParse; 
12eb0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
12ec0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  g context */.  s
12ed0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
12ee0 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f  rse->db;       /
12ef0 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
12f00 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e  ction malloc con
12f10 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
12f20 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  oop *pNew;      
12f30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
12f40 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20  plate WhereLoop 
12f50 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
12f60 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  on */.  WhereTer
12f70 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
12f80 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 68 65          /* A Whe
12f90 72 65 54 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e  reTerm under con
12fa0 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  sideration */.  
12fb0 69 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20  int opMask;     
12fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fd0 2f 2a 20 56 61 6c 69 64 20 6f 70 65 72 61 74 6f  /* Valid operato
12fe0 72 73 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e  rs for constrain
12ff0 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 53 63 61  ts */.  WhereSca
13000 6e 20 73 63 61 6e 3b 20 20 20 20 20 20 20 20 20  n scan;         
13010 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
13020 74 6f 72 20 66 6f 72 20 57 48 45 52 45 20 74 65  tor for WHERE te
13030 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  rms */.  Bitmask
13040 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 20 20   saved_prereq;  
13050 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
13060 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
13070 65 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20 20  ew->prereq */.  
13080 75 31 36 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d  u16 saved_nLTerm
13090 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
130a0 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
130b0 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  e of pNew->nLTer
130c0 6d 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64  m */.  u16 saved
130d0 5f 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20  _nEq;           
130e0 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
130f0 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
13100 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f  ->u.btree.nEq */
13110 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 53 6b  .  u16 saved_nSk
13120 69 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ip;             
13130 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
13140 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 53  alue of pNew->nS
13150 6b 69 70 20 2a 2f 0a 20 20 75 33 32 20 73 61 76  kip */.  u32 sav
13160 65 64 5f 77 73 46 6c 61 67 73 3b 20 20 20 20 20  ed_wsFlags;     
13170 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
13180 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
13190 65 77 2d 3e 77 73 46 6c 61 67 73 20 2a 2f 0a 20  ew->wsFlags */. 
131a0 20 4c 6f 67 45 73 74 20 73 61 76 65 64 5f 6e 4f   LogEst saved_nO
131b0 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
131c0 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
131d0 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74  ue of pNew->nOut
131e0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
131f0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
13200 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
13210 63 6f 64 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  code */.  LogEst
13220 20 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   rSize;         
13230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
13240 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
13250 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f  he table */.  Lo
13260 67 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20  gEst rLogSize;  
13270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13280 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 61   Logarithm of ta
13290 62 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68  ble size */.  Wh
132a0 65 72 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20  ereTerm *pTop = 
132b0 30 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20 2f 2a  0, *pBtm = 0; /*
132c0 20 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20   Top and bottom 
132d0 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
132e0 73 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70  s */..  pNew = p
132f0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
13300 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
13310 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53  ailed ) return S
13320 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20  QLITE_NOMEM;..  
13330 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77  assert( (pNew->w
13340 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
13350 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20  IRTUALTABLE)==0 
13360 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e  );.  assert( (pN
13370 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
13380 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d  ERE_TOP_LIMIT)==
13390 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  0 );.  if( pNew-
133a0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
133b0 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
133c0 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54    opMask = WO_LT
133d0 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 20  |WO_LE;.  }else 
133e0 69 66 28 20 2f 2a 70 50 72 6f 62 65 2d 3e 74 6e  if( /*pProbe->tn
133f0 75 6d 3c 3d 30 20 7c 7c 2a 2f 20 28 70 53 72 63  um<=0 ||*/ (pSrc
13400 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20  ->fg.jointype & 
13410 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20  JT_LEFT)!=0 ){. 
13420 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45     opMask = WO_E
13430 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f  Q|WO_IN|WO_GT|WO
13440 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b  _GE|WO_LT|WO_LE;
13450 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
13460 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f  Mask = WO_EQ|WO_
13470 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57  IN|WO_GT|WO_GE|W
13480 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 49 53  O_LT|WO_LE|WO_IS
13490 4e 55 4c 4c 7c 57 4f 5f 49 53 3b 0a 20 20 7d 0a  NULL|WO_IS;.  }.
134a0 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 55    if( pProbe->bU
134b0 6e 6f 72 64 65 72 65 64 20 29 20 6f 70 4d 61 73  nordered ) opMas
134c0 6b 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f  k &= ~(WO_GT|WO_
134d0 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b  GE|WO_LT|WO_LE);
134e0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ..  assert( pNew
134f0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50  ->u.btree.nEq<pP
13500 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b  robe->nColumn );
13510 0a 0a 20 20 73 61 76 65 64 5f 6e 45 71 20 3d 20  ..  saved_nEq = 
13520 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
13530 71 3b 0a 20 20 73 61 76 65 64 5f 6e 53 6b 69 70  q;.  saved_nSkip
13540 20 3d 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 3b 0a   = pNew->nSkip;.
13550 20 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 20 3d    saved_nLTerm =
13560 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20   pNew->nLTerm;. 
13570 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 20 3d   saved_wsFlags =
13580 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 3b 0a   pNew->wsFlags;.
13590 20 20 73 61 76 65 64 5f 70 72 65 72 65 71 20 3d    saved_prereq =
135a0 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 3b 0a 20   pNew->prereq;. 
135b0 20 73 61 76 65 64 5f 6e 4f 75 74 20 3d 20 70 4e   saved_nOut = pN
135c0 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 70 54 65 72  ew->nOut;.  pTer
135d0 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69  m = whereScanIni
135e0 74 28 26 73 63 61 6e 2c 20 70 42 75 69 6c 64 65  t(&scan, pBuilde
135f0 72 2d 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69 43  r->pWC, pSrc->iC
13600 75 72 73 6f 72 2c 20 73 61 76 65 64 5f 6e 45 71  ursor, saved_nEq
13610 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13620 20 20 20 20 20 20 20 20 20 20 6f 70 4d 61 73 6b            opMask
13630 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 70 4e 65  , pProbe);.  pNe
13640 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
13650 20 72 53 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d   rSize = pProbe-
13660 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b  >aiRowLogEst[0];
13670 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73  .  rLogSize = es
13680 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 20 20 66  tLog(rSize);.  f
13690 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  or(; rc==SQLITE_
136a0 4f 4b 20 26 26 20 70 54 65 72 6d 21 3d 30 3b 20  OK && pTerm!=0; 
136b0 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61  pTerm = whereSca
136c0 6e 4e 65 78 74 28 26 73 63 61 6e 29 29 7b 0a 20  nNext(&scan)){. 
136d0 20 20 20 75 31 36 20 65 4f 70 20 3d 20 70 54 65     u16 eOp = pTe
136e0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 20 20  rm->eOperator;  
136f0 20 2f 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f   /* Shorthand fo
13700 72 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  r pTerm->eOperat
13710 6f 72 20 2a 2f 0a 20 20 20 20 4c 6f 67 45 73 74  or */.    LogEst
13720 20 72 43 6f 73 74 49 64 78 3b 0a 20 20 20 20 4c   rCostIdx;.    L
13730 6f 67 45 73 74 20 6e 4f 75 74 55 6e 61 64 6a 75  ogEst nOutUnadju
13740 73 74 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  sted;        /* 
13750 6e 4f 75 74 20 62 65 66 6f 72 65 20 49 4e 28 29  nOut before IN()
13760 20 61 6e 64 20 57 48 45 52 45 20 61 64 6a 75 73   and WHERE adjus
13770 74 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e  tments */.    in
13780 74 20 6e 49 6e 20 3d 20 30 3b 0a 23 69 66 64 65  t nIn = 0;.#ifde
13790 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
137a0 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
137b0 20 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64     int nRecValid
137c0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65   = pBuilder->nRe
137d0 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20  cValid;.#endif. 
137e0 20 20 20 69 66 28 20 28 65 4f 70 3d 3d 57 4f 5f     if( (eOp==WO_
137f0 49 53 4e 55 4c 4c 20 7c 7c 20 28 70 54 65 72 6d  ISNULL || (pTerm
13800 2d 3e 77 74 46 6c 61 67 73 26 54 45 52 4d 5f 56  ->wtFlags&TERM_V
13810 4e 55 4c 4c 29 21 3d 30 29 0a 20 20 20 20 20 26  NULL)!=0).     &
13820 26 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74  & indexColumnNot
13830 4e 75 6c 6c 28 70 50 72 6f 62 65 2c 20 73 61 76  Null(pProbe, sav
13840 65 64 5f 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20  ed_nEq).    ){. 
13850 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f       continue; /
13860 2a 20 69 67 6e 6f 72 65 20 49 53 20 5b 4e 4f 54  * ignore IS [NOT
13870 5d 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e  ] NULL constrain
13880 74 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63  ts on NOT NULL c
13890 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a  olumns */.    }.
138a0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
138b0 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65  rereqRight & pNe
138c0 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f  w->maskSelf ) co
138d0 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20  ntinue;..    /* 
138e0 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65  Do not allow the
138f0 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20   upper bound of 
13900 61 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74  a LIKE optimizat
13910 69 6f 6e 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  ion range constr
13920 61 69 6e 74 0a 20 20 20 20 2a 2a 20 74 6f 20 6d  aint.    ** to m
13930 69 78 20 77 69 74 68 20 61 20 6c 6f 77 65 72 20  ix with a lower 
13940 72 61 6e 67 65 20 62 6f 75 6e 64 20 66 72 6f 6d  range bound from
13950 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 6f 75 72   some other sour
13960 63 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54  ce */.    if( pT
13970 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
13980 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 26 26 20 70  ERM_LIKEOPT && p
13990 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  Term->eOperator=
139a0 3d 57 4f 5f 4c 54 20 29 20 63 6f 6e 74 69 6e 75  =WO_LT ) continu
139b0 65 3b 0a 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73  e;..    pNew->ws
139c0 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73  Flags = saved_ws
139d0 46 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d  Flags;.    pNew-
139e0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73  >u.btree.nEq = s
139f0 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e  aved_nEq;.    pN
13a00 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76  ew->nLTerm = sav
13a10 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69  ed_nLTerm;.    i
13a20 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
13a30 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65  ze(db, pNew, pNe
13a40 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62  w->nLTerm+1) ) b
13a50 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a  reak; /* OOM */.
13a60 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
13a70 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d  [pNew->nLTerm++]
13a80 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e   = pTerm;.    pN
13a90 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 28 73 61  ew->prereq = (sa
13aa0 76 65 64 5f 70 72 65 72 65 71 20 7c 20 70 54 65  ved_prereq | pTe
13ab0 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 29  rm->prereqRight)
13ac0 20 26 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65   & ~pNew->maskSe
13ad0 6c 66 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  lf;..    assert(
13ae0 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20 20   nInMul==0.     
13af0 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46     || (pNew->wsF
13b00 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
13b10 55 4d 4e 5f 4e 55 4c 4c 29 21 3d 30 20 0a 20 20  UMN_NULL)!=0 .  
13b20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e        || (pNew->
13b30 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
13b40 43 4f 4c 55 4d 4e 5f 49 4e 29 21 3d 30 20 0a 20  COLUMN_IN)!=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 53 4b 49 50 53 43 41 4e 29 21 3d 30 20 0a 20  _SKIPSCAN)!=0 . 
13b80 20 20 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 65     );..    if( e
13b90 4f 70 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20  Op & WO_IN ){.  
13ba0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
13bb0 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
13bc0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
13bd0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
13be0 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 69 66  UMN_IN;.      if
13bf0 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
13c00 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
13c10 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
13c20 20 20 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45    /* "x IN (SELE
13c30 43 54 20 2e 2e 2e 29 22 3a 20 20 54 55 4e 49 4e  CT ...)":  TUNIN
13c40 47 3a 20 74 68 65 20 53 45 4c 45 43 54 20 72 65  G: the SELECT re
13c50 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f  turns 25 rows */
13c60 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 34  .        nIn = 4
13c70 36 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d  6;  assert( 46==
13c80 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35  sqlite3LogEst(25
13c90 29 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ) );.      }else
13ca0 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70   if( ALWAYS(pExp
13cb0 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 45  r->x.pList && pE
13cc0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
13cd0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
13ce0 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c  /* "x IN (value,
13cf0 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f   value, ...)" */
13d00 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 73  .        nIn = s
13d10 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 45 78  qlite3LogEst(pEx
13d20 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
13d30 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
13d40 20 20 20 61 73 73 65 72 74 28 20 6e 49 6e 3e 30     assert( nIn>0
13d50 20 29 3b 20 20 2f 2a 20 52 48 53 20 61 6c 77 61   );  /* RHS alwa
13d60 79 73 20 68 61 73 20 32 20 6f 72 20 6d 6f 72 65  ys has 2 or more
13d70 20 74 65 72 6d 73 2e 2e 2e 20 20 54 68 65 20 70   terms...  The p
13d80 61 72 73 65 72 0a 20 20 20 20 20 20 20 20 20 20  arser.          
13d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
13da0 20 63 68 61 6e 67 65 73 20 22 78 20 49 4e 20 28   changes "x IN (
13db0 3f 29 22 20 69 6e 74 6f 20 22 78 3d 3f 22 2e 20  ?)" into "x=?". 
13dc0 2a 2f 0a 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  */..    }else if
13dd0 28 20 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57  ( eOp & (WO_EQ|W
13de0 4f 5f 49 53 29 20 29 7b 0a 20 20 20 20 20 20 69  O_IS) ){.      i
13df0 6e 74 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65  nt iCol = pProbe
13e00 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 73 61 76 65 64  ->aiColumn[saved
13e10 5f 6e 45 71 5d 3b 0a 20 20 20 20 20 20 70 4e 65  _nEq];.      pNe
13e20 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
13e30 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20  ERE_COLUMN_EQ;. 
13e40 20 20 20 20 20 61 73 73 65 72 74 28 20 73 61 76       assert( sav
13e50 65 64 5f 6e 45 71 3d 3d 70 4e 65 77 2d 3e 75 2e  ed_nEq==pNew->u.
13e60 62 74 72 65 65 2e 6e 45 71 20 29 3b 0a 20 20 20  btree.nEq );.   
13e70 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 28 2d 31     if( iCol==(-1
13e80 29 20 7c 7c 20 28 69 43 6f 6c 3e 30 20 26 26 20  ) || (iCol>0 && 
13e90 6e 49 6e 4d 75 6c 3d 3d 30 20 26 26 20 73 61 76  nInMul==0 && sav
13ea0 65 64 5f 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e  ed_nEq==pProbe->
13eb0 6e 4b 65 79 43 6f 6c 2d 31 29 20 29 7b 0a 20 20  nKeyCol-1) ){.  
13ec0 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d        if( iCol>=
13ed0 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 75 6e 69  0 && pProbe->uni
13ee0 71 4e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20  qNotNull==0 ){. 
13ef0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77           pNew->w
13f00 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
13f10 55 4e 51 5f 57 41 4e 54 45 44 3b 0a 20 20 20 20  UNQ_WANTED;.    
13f20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13f30 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
13f40 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52  gs |= WHERE_ONER
13f50 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OW;.        }.  
13f60 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
13f70 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e  if( eOp & WO_ISN
13f80 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  ULL ){.      pNe
13f90 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
13fa0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b  ERE_COLUMN_NULL;
13fb0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
13fc0 4f 70 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47  Op & (WO_GT|WO_G
13fd0 45 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  E) ){.      test
13fe0 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47  case( eOp & WO_G
13ff0 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
14000 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 45  ase( eOp & WO_GE
14010 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
14020 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
14030 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48  _COLUMN_RANGE|WH
14040 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20  ERE_BTM_LIMIT;. 
14050 20 20 20 20 20 70 42 74 6d 20 3d 20 70 54 65 72       pBtm = pTer
14060 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20  m;.      pTop = 
14070 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  0;.      if( pTe
14080 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
14090 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 7b 0a 20 20  RM_LIKEOPT ){.  
140a0 20 20 20 20 20 20 2f 2a 20 52 61 6e 67 65 20 63        /* Range c
140b0 6f 6e 74 72 61 69 6e 74 73 20 74 68 61 74 20 63  ontraints that c
140c0 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20 4c 49 4b  ome from the LIK
140d0 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61  E optimization a
140e0 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  re.        ** al
140f0 77 61 79 73 20 75 73 65 64 20 69 6e 20 70 61 69  ways used in pai
14100 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  rs. */.        p
14110 54 6f 70 20 3d 20 26 70 54 65 72 6d 5b 31 5d 3b  Top = &pTerm[1];
14120 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
14130 20 28 70 54 6f 70 2d 28 70 54 65 72 6d 2d 3e 70   (pTop-(pTerm->p
14140 57 43 2d 3e 61 29 29 3c 70 54 65 72 6d 2d 3e 70  WC->a))<pTerm->p
14150 57 43 2d 3e 6e 54 65 72 6d 20 29 3b 0a 20 20 20  WC->nTerm );.   
14160 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f       assert( pTo
14170 70 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  p->wtFlags & TER
14180 4d 5f 4c 49 4b 45 4f 50 54 20 29 3b 0a 20 20 20  M_LIKEOPT );.   
14190 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f       assert( pTo
141a0 70 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  p->eOperator==WO
141b0 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 20 20 69  _LT );.        i
141c0 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
141d0 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65  ze(db, pNew, pNe
141e0 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62  w->nLTerm+1) ) b
141f0 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a  reak; /* OOM */.
14200 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c          pNew->aL
14210 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72  Term[pNew->nLTer
14220 6d 2b 2b 5d 20 3d 20 70 54 6f 70 3b 0a 20 20 20  m++] = pTop;.   
14230 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
14240 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f  gs |= WHERE_TOP_
14250 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 7d 0a 20  LIMIT;.      }. 
14260 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14270 61 73 73 65 72 74 28 20 65 4f 70 20 26 20 28 57  assert( eOp & (W
14280 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20  O_LT|WO_LE) );. 
14290 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
142a0 4f 70 20 26 20 57 4f 5f 4c 54 20 29 3b 0a 20 20  Op & WO_LT );.  
142b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
142c0 70 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20  p & WO_LE );.   
142d0 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
142e0 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
142f0 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 54 4f 50  _RANGE|WHERE_TOP
14300 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 54  _LIMIT;.      pT
14310 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  op = pTerm;.    
14320 20 20 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d 3e    pBtm = (pNew->
14330 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
14340 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f 0a  BTM_LIMIT)!=0 ?.
14350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14360 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72       pNew->aLTer
14370 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32  m[pNew->nLTerm-2
14380 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  ] : 0;.    }..  
14390 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
143a0 6e 74 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 69 73  nt pNew->nOut is
143b0 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
143c0 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70 65 63  er of rows expec
143d0 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  ted to.    ** be
143e0 20 76 69 73 69 74 65 64 20 62 79 20 74 68 65 20   visited by the 
143f0 69 6e 64 65 78 20 73 63 61 6e 20 62 65 66 6f 72  index scan befor
14400 65 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 65  e considering te
14410 72 6d 20 70 54 65 72 6d 2c 20 6f 72 20 74 68 65  rm pTerm, or the
14420 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 6f  .    ** values o
14430 66 20 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d 75 6c  f nIn and nInMul
14440 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
14450 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20  , assuming that 
14460 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 22 78 20 49  all .    ** "x I
14470 4e 28 2e 2e 2e 29 22 20 74 65 72 6d 73 20 61 72  N(...)" terms ar
14480 65 20 72 65 70 6c 61 63 65 64 20 77 69 74 68 20  e replaced with 
14490 22 78 20 3d 20 3f 22 2e 20 54 68 69 73 20 62 6c  "x = ?". This bl
144a0 6f 63 6b 20 75 70 64 61 74 65 73 0a 20 20 20 20  ock updates.    
144b0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
144c0 70 4e 65 77 2d 3e 6e 4f 75 74 20 74 6f 20 61 63  pNew->nOut to ac
144d0 63 6f 75 6e 74 20 66 6f 72 20 70 54 65 72 6d 20  count for pTerm 
144e0 28 62 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e 49 6e  (but not nIn/nIn
144f0 4d 75 6c 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73  Mul).  */.    as
14500 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74  sert( pNew->nOut
14510 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a  ==saved_nOut );.
14520 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73      if( pNew->ws
14530 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
14540 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20  LUMN_RANGE ){.  
14550 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e 4f      /* Adjust nO
14560 75 74 20 75 73 69 6e 67 20 73 74 61 74 33 2f 73  ut using stat3/s
14570 74 61 74 34 20 64 61 74 61 2e 20 4f 72 2c 20 69  tat4 data. Or, i
14580 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74  f there is no st
14590 61 74 33 2f 73 74 61 74 34 0a 20 20 20 20 20 20  at3/stat4.      
145a0 2a 2a 20 64 61 74 61 2c 20 75 73 69 6e 67 20 73  ** data, using s
145b0 6f 6d 65 20 6f 74 68 65 72 20 65 73 74 69 6d 61  ome other estima
145c0 74 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 77 68  te.  */.      wh
145d0 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28  ereRangeScanEst(
145e0 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72  pParse, pBuilder
145f0 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 70 4e  , pBtm, pTop, pN
14600 65 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ew);.    }else{.
14610 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20        int nEq = 
14620 2b 2b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ++pNew->u.btree.
14630 6e 45 71 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nEq;.      asser
14640 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 49 53 4e  t( eOp & (WO_ISN
14650 55 4c 4c 7c 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c  ULL|WO_EQ|WO_IN|
14660 57 4f 5f 49 53 29 20 29 3b 0a 0a 20 20 20 20 20  WO_IS) );..     
14670 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
14680 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20  Out==saved_nOut 
14690 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
146a0 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30  rm->truthProb<=0
146b0 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f   && pProbe->aiCo
146c0 6c 75 6d 6e 5b 73 61 76 65 64 5f 6e 45 71 5d 3e  lumn[saved_nEq]>
146d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
146e0 73 65 72 74 28 20 28 65 4f 70 20 26 20 57 4f 5f  sert( (eOp & WO_
146f0 49 4e 29 20 7c 7c 20 6e 49 6e 3d 3d 30 20 29 3b  IN) || nIn==0 );
14700 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
14710 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29  e( eOp & WO_IN )
14720 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
14730 6e 4f 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74  nOut += pTerm->t
14740 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20  ruthProb;.      
14750 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20    pNew->nOut -= 
14760 6e 49 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  nIn;.      }else
14770 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
14780 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
14790 53 54 41 54 34 0a 20 20 20 20 20 20 20 20 74 52  STAT4.        tR
147a0 6f 77 63 6e 74 20 6e 4f 75 74 20 3d 20 30 3b 0a  owcnt nOut = 0;.
147b0 20 20 20 20 20 20 20 20 69 66 28 20 6e 49 6e 4d          if( nInM
147c0 75 6c 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  ul==0 .         
147d0 26 26 20 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70  && pProbe->nSamp
147e0 6c 65 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  le .         && 
147f0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
14800 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70  q<=pProbe->nSamp
14810 6c 65 43 6f 6c 0a 20 20 20 20 20 20 20 20 20 26  leCol.         &
14820 26 20 28 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29  & ((eOp & WO_IN)
14830 3d 3d 30 20 7c 7c 20 21 45 78 70 72 48 61 73 50  ==0 || !ExprHasP
14840 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70  roperty(pTerm->p
14850 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
14860 63 74 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  ct)).        ){.
14870 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
14880 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
14890 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
148a0 69 66 28 20 28 65 4f 70 20 26 20 28 57 4f 5f 45  if( (eOp & (WO_E
148b0 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49  Q|WO_ISNULL|WO_I
148c0 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  S))!=0 ){.      
148d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
148e0 65 4f 70 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20  eOp & WO_EQ );. 
148f0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
14900 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 53  ase( eOp & WO_IS
14910 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
14920 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
14930 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
14940 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68           rc = wh
14950 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28  ereEqualScanEst(
14960 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72  pParse, pBuilder
14970 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
14980 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20   &nOut);.       
14990 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
149a0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
149b0 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  InScanEst(pParse
149c0 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70  , pBuilder, pExp
149d0 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f 75  r->x.pList, &nOu
149e0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  t);.          }.
149f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
14a00 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  ==SQLITE_NOTFOUN
14a10 44 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  D ) rc = SQLITE_
14a20 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  OK;.          if
14a30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14a40 29 20 62 72 65 61 6b 3b 20 20 20 20 20 20 20 20  ) break;        
14a50 20 20 2f 2a 20 4a 75 6d 70 20 6f 75 74 20 6f 66    /* Jump out of
14a60 20 74 68 65 20 70 54 65 72 6d 20 6c 6f 6f 70 20   the pTerm loop 
14a70 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
14a80 20 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20   nOut ){.       
14a90 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
14aa0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
14ab0 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  nOut);.         
14ac0 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6e 4f 75     if( pNew->nOu
14ad0 74 3e 73 61 76 65 64 5f 6e 4f 75 74 20 29 20 70  t>saved_nOut ) p
14ae0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65  New->nOut = save
14af0 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20  d_nOut;.        
14b00 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d      pNew->nOut -
14b10 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20 20 20 20  = nIn;.         
14b20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
14b30 20 20 20 20 20 69 66 28 20 6e 4f 75 74 3d 3d 30       if( nOut==0
14b40 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   ).#endif.      
14b50 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e    {.          pN
14b60 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 28 70 50 72  ew->nOut += (pPr
14b70 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
14b80 5b 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e  [nEq] - pProbe->
14b90 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 2d  aiRowLogEst[nEq-
14ba0 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  1]);.          i
14bb0 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55  f( eOp & WO_ISNU
14bc0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LL ){.          
14bd0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20    /* TUNING: If 
14be0 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6b 65  there is no like
14bf0 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75 65 2c 20  lihood() value, 
14c00 61 73 73 75 6d 65 20 74 68 61 74 20 61 20 0a 20  assume that a . 
14c10 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 22 63             ** "c
14c20 6f 6c 20 49 53 20 4e 55 4c 4c 22 20 65 78 70 72  ol IS NULL" expr
14c30 65 73 73 69 6f 6e 20 6d 61 74 63 68 65 73 20 74  ession matches t
14c40 77 69 63 65 20 61 73 20 6d 61 6e 79 20 72 6f 77  wice as many row
14c50 73 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  s .            *
14c60 2a 20 61 73 20 28 63 6f 6c 3d 3f 29 2e 20 2a 2f  * as (col=?). */
14c70 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65  .            pNe
14c80 77 2d 3e 6e 4f 75 74 20 2b 3d 20 31 30 3b 0a 20  w->nOut += 10;. 
14c90 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
14ca0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
14cb0 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 72   }..    /* Set r
14cc0 43 6f 73 74 49 64 78 20 74 6f 20 74 68 65 20 63  CostIdx to the c
14cd0 6f 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20  ost of visiting 
14ce0 73 65 6c 65 63 74 65 64 20 72 6f 77 73 20 69 6e  selected rows in
14cf0 20 69 6e 64 65 78 2e 20 41 64 64 0a 20 20 20 20   index. Add.    
14d00 2a 2a 20 69 74 20 74 6f 20 70 4e 65 77 2d 3e 72  ** it to pNew->r
14d10 52 75 6e 2c 20 77 68 69 63 68 20 69 73 20 63 75  Run, which is cu
14d20 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20 74  rrently set to t
14d30 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20 69  he cost of the i
14d40 6e 64 65 78 0a 20 20 20 20 2a 2a 20 73 65 65 6b  ndex.    ** seek
14d50 20 6f 6e 6c 79 2e 20 54 68 65 6e 2c 20 69 66 20   only. Then, if 
14d60 74 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f  this is a non-co
14d70 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 61 64  vering index, ad
14d80 64 20 74 68 65 20 63 6f 73 74 20 6f 66 0a 20 20  d the cost of.  
14d90 20 20 2a 2a 20 76 69 73 69 74 69 6e 67 20 74 68    ** visiting th
14da0 65 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61  e rows in the ma
14db0 69 6e 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  in table.  */.  
14dc0 20 20 72 43 6f 73 74 49 64 78 20 3d 20 70 4e 65    rCostIdx = pNe
14dd0 77 2d 3e 6e 4f 75 74 20 2b 20 31 20 2b 20 28 31  w->nOut + 1 + (1
14de0 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52  5*pProbe->szIdxR
14df0 6f 77 29 2f 70 53 72 63 2d 3e 70 54 61 62 2d 3e  ow)/pSrc->pTab->
14e00 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 70 4e  szTabRow;.    pN
14e10 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74  ew->rRun = sqlit
14e20 65 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f 67  e3LogEstAdd(rLog
14e30 53 69 7a 65 2c 20 72 43 6f 73 74 49 64 78 29 3b  Size, rCostIdx);
14e40 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e  .    if( (pNew->
14e50 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
14e60 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f  _IDX_ONLY|WHERE_
14e70 49 50 4b 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  IPK))==0 ){.    
14e80 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
14e90 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
14ea0 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65 77  pNew->rRun, pNew
14eb0 2d 3e 6e 4f 75 74 20 2b 20 31 36 29 3b 0a 20 20  ->nOut + 16);.  
14ec0 20 20 7d 0a 20 20 20 20 41 70 70 6c 79 43 6f 73    }.    ApplyCos
14ed0 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77  tMultiplier(pNew
14ee0 2d 3e 72 52 75 6e 2c 20 70 50 72 6f 62 65 2d 3e  ->rRun, pProbe->
14ef0 70 54 61 62 6c 65 2d 3e 63 6f 73 74 4d 75 6c 74  pTable->costMult
14f00 29 3b 0a 0a 20 20 20 20 6e 4f 75 74 55 6e 61 64  );..    nOutUnad
14f10 6a 75 73 74 65 64 20 3d 20 70 4e 65 77 2d 3e 6e  justed = pNew->n
14f20 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72  Out;.    pNew->r
14f30 52 75 6e 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20  Run += nInMul + 
14f40 6e 49 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  nIn;.    pNew->n
14f50 4f 75 74 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20  Out += nInMul + 
14f60 6e 49 6e 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f  nIn;.    whereLo
14f70 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70  opOutputAdjust(p
14f80 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 4e  Builder->pWC, pN
14f90 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20  ew, rSize);.    
14fa0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
14fb0 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
14fc0 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  New);..    if( p
14fd0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
14fe0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
14ff0 45 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  E ){.      pNew-
15000 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
15010 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ut;.    }else{. 
15020 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
15030 3d 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64  = nOutUnadjusted
15040 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
15050 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
15060 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
15070 54 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 4e  T)==0.     && pN
15080 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c  ew->u.btree.nEq<
15090 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a  pProbe->nColumn.
150a0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 77 68 65      ){.      whe
150b0 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e  reLoopAddBtreeIn
150c0 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53  dex(pBuilder, pS
150d0 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e 4d  rc, pProbe, nInM
150e0 75 6c 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a 20  ul+nIn);.    }. 
150f0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
15100 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 23 69 66 64  saved_nOut;.#ifd
15110 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
15120 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
15130 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52      pBuilder->nR
15140 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61  ecValid = nRecVa
15150 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  lid;.#endif.  }.
15160 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
15170 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 0a 20   saved_prereq;. 
15180 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
15190 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a  Eq = saved_nEq;.
151a0 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20    pNew->nSkip = 
151b0 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 70  saved_nSkip;.  p
151c0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73  New->wsFlags = s
151d0 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20  aved_wsFlags;.  
151e0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
151f0 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d  ed_nOut;.  pNew-
15200 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f  >nLTerm = saved_
15210 6e 4c 54 65 72 6d 3b 0a 0a 20 20 2f 2a 20 43 6f  nLTerm;..  /* Co
15220 6e 73 69 64 65 72 20 75 73 69 6e 67 20 61 20 73  nsider using a s
15230 6b 69 70 2d 73 63 61 6e 20 69 66 20 74 68 65 72  kip-scan if ther
15240 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63  e are no WHERE c
15250 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  lause constraint
15260 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65  s.  ** available
15270 20 66 6f 72 20 74 68 65 20 6c 65 66 74 2d 6d 6f   for the left-mo
15280 73 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  st terms of the 
15290 69 6e 64 65 78 2c 20 61 6e 64 20 69 66 20 74 68  index, and if th
152a0 65 20 61 76 65 72 61 67 65 0a 20 20 2a 2a 20 6e  e average.  ** n
152b0 75 6d 62 65 72 20 6f 66 20 72 65 70 65 61 74 73  umber of repeats
152c0 20 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   in the left-mos
152d0 74 20 74 65 72 6d 73 20 69 73 20 61 74 20 6c 65  t terms is at le
152e0 61 73 74 20 31 38 2e 20 0a 20 20 2a 2a 0a 20 20  ast 18. .  **.  
152f0 2a 2a 20 54 68 65 20 6d 61 67 69 63 20 6e 75 6d  ** The magic num
15300 62 65 72 20 31 38 20 69 73 20 73 65 6c 65 63 74  ber 18 is select
15310 65 64 20 6f 6e 20 74 68 65 20 62 61 73 69 73 20  ed on the basis 
15320 74 68 61 74 20 73 63 61 6e 6e 69 6e 67 20 31 37  that scanning 17
15330 20 72 6f 77 73 0a 20 20 2a 2a 20 69 73 20 61 6c   rows.  ** is al
15340 6d 6f 73 74 20 61 6c 77 61 79 73 20 71 75 69 63  most always quic
15350 6b 65 72 20 74 68 61 6e 20 61 6e 20 69 6e 64 65  ker than an inde
15360 78 20 73 65 65 6b 20 28 65 76 65 6e 20 74 68 6f  x seek (even tho
15370 75 67 68 20 69 66 20 74 68 65 20 69 6e 64 65 78  ugh if the index
15380 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 66  .  ** contains f
15390 65 77 65 72 20 74 68 61 6e 20 32 5e 31 37 20 72  ewer than 2^17 r
153a0 6f 77 73 20 77 65 20 61 73 73 75 6d 65 20 6f 74  ows we assume ot
153b0 68 65 72 77 69 73 65 20 69 6e 20 6f 74 68 65 72  herwise in other
153c0 20 70 61 72 74 73 20 6f 66 0a 20 20 2a 2a 20 74   parts of.  ** t
153d0 68 65 20 63 6f 64 65 29 2e 20 41 6e 64 2c 20 65  he code). And, e
153e0 76 65 6e 20 69 66 20 69 74 20 69 73 20 6e 6f 74  ven if it is not
153f0 2c 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  , it should not 
15400 62 65 20 74 6f 6f 20 6d 75 63 68 20 73 6c 6f 77  be too much slow
15410 65 72 2e 20 0a 20 20 2a 2a 20 4f 6e 20 74 68 65  er. .  ** On the
15420 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68 65   other hand, the
15430 20 65 78 74 72 61 20 73 65 65 6b 73 20 63 6f 75   extra seeks cou
15440 6c 64 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20  ld end up being 
15450 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20  significantly.  
15460 2a 2a 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76  ** more expensiv
15470 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
15480 20 34 32 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   42==sqlite3LogE
15490 73 74 28 31 38 29 20 29 3b 0a 20 20 69 66 28 20  st(18) );.  if( 
154a0 73 61 76 65 64 5f 6e 45 71 3d 3d 73 61 76 65 64  saved_nEq==saved
154b0 5f 6e 53 6b 69 70 0a 20 20 20 26 26 20 73 61 76  _nSkip.   && sav
154c0 65 64 5f 6e 45 71 2b 31 3c 70 50 72 6f 62 65 2d  ed_nEq+1<pProbe-
154d0 3e 6e 4b 65 79 43 6f 6c 0a 20 20 20 26 26 20 70  >nKeyCol.   && p
154e0 50 72 6f 62 65 2d 3e 6e 6f 53 6b 69 70 53 63 61  Probe->noSkipSca
154f0 6e 3d 3d 30 0a 20 20 20 26 26 20 70 50 72 6f 62  n==0.   && pProb
15500 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73  e->aiRowLogEst[s
15510 61 76 65 64 5f 6e 45 71 2b 31 5d 3e 3d 34 32 20  aved_nEq+1]>=42 
15520 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 69 6e 69   /* TUNING: Mini
15530 6d 75 6d 20 66 6f 72 20 73 6b 69 70 2d 73 63 61  mum for skip-sca
15540 6e 20 2a 2f 0a 20 20 20 26 26 20 28 72 63 20 3d  n */.   && (rc =
15550 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
15560 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d  (db, pNew, pNew-
15570 3e 6e 4c 54 65 72 6d 2b 31 29 29 3d 3d 53 51 4c  >nLTerm+1))==SQL
15580 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20  ITE_OK.  ){.    
15590 4c 6f 67 45 73 74 20 6e 49 74 65 72 3b 0a 20 20  LogEst nIter;.  
155a0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
155b0 6e 45 71 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d  nEq++;.    pNew-
155c0 3e 6e 53 6b 69 70 2b 2b 3b 0a 20 20 20 20 70 4e  >nSkip++;.    pN
155d0 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d  ew->aLTerm[pNew-
155e0 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 30 3b 0a  >nLTerm++] = 0;.
155f0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
15600 73 20 7c 3d 20 57 48 45 52 45 5f 53 4b 49 50 53  s |= WHERE_SKIPS
15610 43 41 4e 3b 0a 20 20 20 20 6e 49 74 65 72 20 3d  CAN;.    nIter =
15620 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f   pProbe->aiRowLo
15630 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 5d 20  gEst[saved_nEq] 
15640 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c  - pProbe->aiRowL
15650 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b  ogEst[saved_nEq+
15660 31 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  1];.    pNew->nO
15670 75 74 20 2d 3d 20 6e 49 74 65 72 3b 0a 20 20 20  ut -= nIter;.   
15680 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 42 65 63   /* TUNING:  Bec
15690 61 75 73 65 20 75 6e 63 65 72 74 61 69 6e 74 69  ause uncertainti
156a0 65 73 20 69 6e 20 74 68 65 20 65 73 74 69 6d 61  es in the estima
156b0 74 65 73 20 66 6f 72 20 73 6b 69 70 2d 73 63 61  tes for skip-sca
156c0 6e 20 71 75 65 72 69 65 73 2c 0a 20 20 20 20 2a  n queries,.    *
156d0 2a 20 61 64 64 20 61 20 31 2e 33 37 35 20 66 75  * add a 1.375 fu
156e0 64 67 65 20 66 61 63 74 6f 72 20 74 6f 20 6d 61  dge factor to ma
156f0 6b 65 20 73 6b 69 70 2d 73 63 61 6e 20 73 6c 69  ke skip-scan sli
15700 67 68 74 6c 79 20 6c 65 73 73 20 6c 69 6b 65 6c  ghtly less likel
15710 79 2e 20 2a 2f 0a 20 20 20 20 6e 49 74 65 72 20  y. */.    nIter 
15720 2b 3d 20 35 3b 0a 20 20 20 20 77 68 65 72 65 4c  += 5;.    whereL
15730 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78  oopAddBtreeIndex
15740 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c  (pBuilder, pSrc,
15750 20 70 50 72 6f 62 65 2c 20 6e 49 74 65 72 20 2b   pProbe, nIter +
15760 20 6e 49 6e 4d 75 6c 29 3b 0a 20 20 20 20 70 4e   nInMul);.    pN
15770 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64  ew->nOut = saved
15780 5f 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d  _nOut;.    pNew-
15790 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73  >u.btree.nEq = s
157a0 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e  aved_nEq;.    pN
157b0 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65  ew->nSkip = save
157c0 64 5f 6e 53 6b 69 70 3b 0a 20 20 20 20 70 4e 65  d_nSkip;.    pNe
157d0 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76  w->wsFlags = sav
157e0 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 7d 0a  ed_wsFlags;.  }.
157f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15800 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 72  ./*.** Return Tr
15810 75 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ue if it is poss
15820 69 62 6c 65 20 74 68 61 74 20 70 49 6e 64 65 78  ible that pIndex
15830 20 6d 69 67 68 74 20 62 65 20 75 73 65 66 75 6c   might be useful
15840 20 69 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74   in.** implement
15850 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59  ing the ORDER BY
15860 20 63 6c 61 75 73 65 20 69 6e 20 70 42 75 69 6c   clause in pBuil
15870 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  der..**.** Retur
15880 6e 20 46 61 6c 73 65 20 69 66 20 70 42 75 69 6c  n False if pBuil
15890 64 65 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  der does not con
158a0 74 61 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59  tain an ORDER BY
158b0 20 63 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69 66   clause or.** if
158c0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79   there is no way
158d0 20 66 6f 72 20 70 49 6e 64 65 78 20 74 6f 20 62   for pIndex to b
158e0 65 20 75 73 65 66 75 6c 20 69 6e 20 69 6d 70 6c  e useful in impl
158f0 65 6d 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a 2a  ementing that.**
15900 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
15910 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15920 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69  indexMightHelpWi
15930 74 68 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65  thOrderBy(.  Whe
15940 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
15950 42 75 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65 78  Builder,.  Index
15960 20 2a 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74 20   *pIndex,.  int 
15970 69 43 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78 70  iCursor.){.  Exp
15980 72 4c 69 73 74 20 2a 70 4f 42 3b 0a 20 20 69 6e  rList *pOB;.  in
15990 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28  t ii, jj;..  if(
159a0 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65   pIndex->bUnorde
159b0 72 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  red ) return 0;.
159c0 20 20 69 66 28 20 28 70 4f 42 20 3d 20 70 42 75    if( (pOB = pBu
159d0 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70  ilder->pWInfo->p
159e0 4f 72 64 65 72 42 79 29 3d 3d 30 20 29 20 72 65  OrderBy)==0 ) re
159f0 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 69  turn 0;.  for(ii
15a00 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45 78 70  =0; ii<pOB->nExp
15a10 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 45 78  r; ii++){.    Ex
15a20 70 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c 69  pr *pExpr = sqli
15a30 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
15a40 74 65 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45  te(pOB->a[ii].pE
15a50 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 45  xpr);.    if( pE
15a60 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
15a70 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  MN ) return 0;. 
15a80 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
15a90 61 62 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29 7b  able==iCursor ){
15aa0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
15ab0 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65  ->iColumn<0 ) re
15ac0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 66 6f  turn 1;.      fo
15ad0 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65  r(jj=0; jj<pInde
15ae0 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b  x->nKeyCol; jj++
15af0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
15b00 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  Expr->iColumn==p
15b10 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
15b20 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  jj] ) return 1;.
15b30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15b40 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
15b50 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
15b60 62 69 74 6d 61 73 6b 20 77 68 65 72 65 20 31 73  bitmask where 1s
15b70 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
15b80 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
15b90 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68   column of.** th
15ba0 65 20 74 61 62 6c 65 20 69 73 20 75 73 65 64 20  e table is used 
15bb0 62 79 20 61 6e 20 69 6e 64 65 78 2e 20 20 4f 6e  by an index.  On
15bc0 6c 79 20 74 68 65 20 66 69 72 73 74 20 36 33 20  ly the first 63 
15bd0 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f 6e 73  columns are cons
15be0 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  idered..*/.stati
15bf0 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c 75 6d 6e  c Bitmask column
15c00 73 49 6e 49 6e 64 65 78 28 49 6e 64 65 78 20 2a  sInIndex(Index *
15c10 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b  pIdx){.  Bitmask
15c20 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b   m = 0;.  int j;
15c30 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e  .  for(j=pIdx->n
15c40 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20  Column-1; j>=0; 
15c50 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78 20  j--){.    int x 
15c60 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
15c70 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d  [j];.    if( x>=
15c80 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  0 ){.      testc
15c90 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b  ase( x==BMS-1 );
15ca0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15cb0 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20   x==BMS-2 );.   
15cc0 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29     if( x<BMS-1 )
15cd0 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29   m |= MASKBIT(x)
15ce0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
15cf0 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43 68  turn m;.}../* Ch
15d00 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20  eck to see if a 
15d10 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 77 69  partial index wi
15d20 74 68 20 70 50 61 72 74 49 6e 64 65 78 57 68 65  th pPartIndexWhe
15d30 72 65 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a  re can be used.*
15d40 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  * in the current
15d50 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e 20   query.  Return 
15d60 74 72 75 65 20 69 66 20 69 74 20 63 61 6e 20 62  true if it can b
15d70 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e  e and false if n
15d80 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
15d90 74 20 77 68 65 72 65 55 73 61 62 6c 65 50 61 72  t whereUsablePar
15da0 74 69 61 6c 49 6e 64 65 78 28 69 6e 74 20 69 54  tialIndex(int iT
15db0 61 62 2c 20 57 68 65 72 65 43 6c 61 75 73 65 20  ab, WhereClause 
15dc0 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 57 68 65  *pWC, Expr *pWhe
15dd0 72 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  re){.  int i;.  
15de0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
15df0 3b 0a 20 20 77 68 69 6c 65 28 20 70 57 68 65 72  ;.  while( pWher
15e00 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b  e->op==TK_AND ){
15e10 0a 20 20 20 20 69 66 28 20 21 77 68 65 72 65 55  .    if( !whereU
15e20 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65  sablePartialInde
15e30 78 28 69 54 61 62 2c 70 57 43 2c 70 57 68 65 72  x(iTab,pWC,pWher
15e40 65 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75  e->pLeft) ) retu
15e50 72 6e 20 30 3b 0a 20 20 20 20 70 57 68 65 72 65  rn 0;.    pWhere
15e60 20 3d 20 70 57 68 65 72 65 2d 3e 70 52 69 67 68   = pWhere->pRigh
15e70 74 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  t;.  }.  for(i=0
15e80 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  , pTerm=pWC->a; 
15e90 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b  i<pWC->nTerm; i+
15ea0 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
15eb0 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
15ec0 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
15ed0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
15ee0 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45 78 70  ImpliesExpr(pExp
15ef0 72 2c 20 70 57 68 65 72 65 2c 20 69 54 61 62 29  r, pWhere, iTab)
15f00 20 0a 20 20 20 20 20 26 26 20 28 21 45 78 70 72   .     && (!Expr
15f10 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
15f20 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
15f30 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74  || pExpr->iRight
15f40 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69 54 61 62 29  JoinTable==iTab)
15f50 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
15f60 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
15f70 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
15f80 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57  ./*.** Add all W
15f90 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
15fa0 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 61   for a single ta
15fb0 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ble of the join 
15fc0 77 68 65 72 65 20 74 68 65 20 74 61 62 6c 65 0a  where the table.
15fd0 2a 2a 20 69 73 20 69 64 65 6e 66 69 65 64 20 62  ** is idenfied b
15fe0 79 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  y pBuilder->pNew
15ff0 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74 61  ->iTab.  That ta
16000 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65 65  ble is guarantee
16010 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 62 2d 74  d to be.** a b-t
16020 72 65 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61  ree table, not a
16030 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
16040 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 73 74 73 20  **.** The costs 
16050 28 57 68 65 72 65 4c 6f 6f 70 2e 72 52 75 6e 29  (WhereLoop.rRun)
16060 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6c   of the b-tree l
16070 6f 6f 70 73 20 61 64 64 65 64 20 62 79 20 74 68  oops added by th
16080 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  is function.** a
16090 72 65 20 63 61 6c 63 75 6c 61 74 65 64 20 61 73  re calculated as
160a0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
160b0 46 6f 72 20 61 20 66 75 6c 6c 20 73 63 61 6e 2c  For a full scan,
160c0 20 61 73 73 75 6d 69 6e 67 20 74 68 65 20 74 61   assuming the ta
160d0 62 6c 65 20 28 6f 72 20 69 6e 64 65 78 29 20 63  ble (or index) c
160e0 6f 6e 74 61 69 6e 73 20 6e 52 6f 77 20 72 6f 77  ontains nRow row
160f0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73  s:.**.**     cos
16100 74 20 3d 20 6e 52 6f 77 20 2a 20 33 2e 30 20 20  t = nRow * 3.0  
16110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16120 20 20 2f 2f 20 66 75 6c 6c 2d 74 61 62 6c 65 20    // full-table 
16130 73 63 61 6e 0a 2a 2a 20 20 20 20 20 63 6f 73 74  scan.**     cost
16140 20 3d 20 6e 52 6f 77 20 2a 20 4b 20 20 20 20 20   = nRow * K     
16150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16160 20 2f 2f 20 73 63 61 6e 20 6f 66 20 63 6f 76 65   // scan of cove
16170 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20 20  ring index.**   
16180 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20    cost = nRow * 
16190 28 4b 2b 33 2e 30 29 20 20 20 20 20 20 20 20 20  (K+3.0)         
161a0 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f         // scan o
161b0 66 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69  f non-covering i
161c0 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  ndex.**.** where
161d0 20 4b 20 69 73 20 61 20 76 61 6c 75 65 20 62 65   K is a value be
161e0 74 77 65 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e  tween 1.1 and 3.
161f0 30 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20 74  0 set based on t
16200 68 65 20 72 65 6c 61 74 69 76 65 20 0a 2a 2a 20  he relative .** 
16210 65 73 74 69 6d 61 74 65 64 20 61 76 65 72 61 67  estimated averag
16220 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e  e size of the in
16230 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 72 65  dex and table re
16240 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  cords..**.** For
16250 20 61 6e 20 69 6e 64 65 78 20 73 63 61 6e 2c 20   an index scan, 
16260 77 68 65 72 65 20 6e 56 69 73 69 74 20 69 73 20  where nVisit is 
16270 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  the number of in
16280 64 65 78 20 72 6f 77 73 20 76 69 73 69 74 65 64  dex rows visited
16290 0a 2a 2a 20 62 79 20 74 68 65 20 73 63 61 6e 2c  .** by the scan,
162a0 20 61 6e 64 20 6e 53 65 65 6b 20 69 73 20 74 68   and nSeek is th
162b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 65 6b  e number of seek
162c0 20 6f 70 65 72 61 74 69 6f 6e 73 20 72 65 71 75   operations requ
162d0 69 72 65 64 20 6f 6e 20 0a 2a 2a 20 74 68 65 20  ired on .** the 
162e0 69 6e 64 65 78 20 62 2d 74 72 65 65 3a 0a 2a 2a  index b-tree:.**
162f0 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e  .**     cost = n
16300 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77  Seek * (log(nRow
16310 29 20 2b 20 4b 20 2a 20 6e 56 69 73 69 74 29 20  ) + K * nVisit) 
16320 20 20 20 20 20 20 20 20 20 2f 2f 20 63 6f 76 65           // cove
16330 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20 20  ring index.**   
16340 20 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a    cost = nSeek *
16350 20 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 28 4b   (log(nRow) + (K
16360 2b 33 2e 30 29 20 2a 20 6e 56 69 73 69 74 29 20  +3.0) * nVisit) 
16370 20 20 20 2f 2f 20 6e 6f 6e 2d 63 6f 76 65 72 69     // non-coveri
16380 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 4e  ng index.**.** N
16390 6f 72 6d 61 6c 6c 79 2c 20 6e 53 65 65 6b 20 69  ormally, nSeek i
163a0 73 20 31 2e 20 6e 53 65 65 6b 20 76 61 6c 75 65  s 1. nSeek value
163b0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 31  s greater than 1
163c0 20 63 6f 6d 65 20 61 62 6f 75 74 20 69 66 20 74   come about if t
163d0 68 65 20 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  he .** WHERE cla
163e0 75 73 65 20 69 6e 63 6c 75 64 65 73 20 22 78 20  use includes "x 
163f0 49 4e 20 28 2e 2e 2e 2e 29 22 20 74 65 72 6d 73  IN (....)" terms
16400 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f   used in place o
16410 66 20 22 78 3d 3f 22 2e 20 4f 72 20 77 68 65 6e  f "x=?". Or when
16420 20 0a 2a 2a 20 69 6d 70 6c 69 63 69 74 20 22 78   .** implicit "x
16430 20 49 4e 20 28 53 45 4c 45 43 54 20 78 20 46 52   IN (SELECT x FR
16440 4f 4d 20 74 62 6c 29 22 20 74 65 72 6d 73 20 61  OM tbl)" terms a
16450 72 65 20 61 64 64 65 64 20 66 6f 72 20 73 6b 69  re added for ski
16460 70 2d 73 63 61 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54  p-scans..**.** T
16470 68 65 20 65 73 74 69 6d 61 74 65 64 20 76 61 6c  he estimated val
16480 75 65 73 20 28 6e 52 6f 77 2c 20 6e 56 69 73 69  ues (nRow, nVisi
16490 74 2c 20 6e 53 65 65 6b 29 20 6f 66 74 65 6e 20  t, nSeek) often 
164a0 63 6f 6e 74 61 69 6e 20 61 20 6c 61 72 67 65 20  contain a large 
164b0 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 75 6e 63  amount.** of unc
164c0 65 72 74 61 69 6e 74 79 2e 20 20 46 6f 72 20 74  ertainty.  For t
164d0 68 69 73 20 72 65 61 73 6f 6e 2c 20 73 63 6f 72  his reason, scor
164e0 69 6e 67 20 69 73 20 64 65 73 69 67 6e 65 64 20  ing is designed 
164f0 74 6f 20 70 69 63 6b 20 70 6c 61 6e 73 20 74 68  to pick plans th
16500 61 74 0a 2a 2a 20 22 64 6f 20 74 68 65 20 6c 65  at.** "do the le
16510 61 73 74 20 68 61 72 6d 22 20 69 66 20 74 68 65  ast harm" if the
16520 20 65 73 74 69 6d 61 74 65 73 20 61 72 65 20 69   estimates are i
16530 6e 61 63 63 75 72 61 74 65 2e 20 20 46 6f 72 20  naccurate.  For 
16540 65 78 61 6d 70 6c 65 2c 20 61 0a 2a 2a 20 6c 6f  example, a.** lo
16550 67 28 6e 52 6f 77 29 20 66 61 63 74 6f 72 20 69  g(nRow) factor i
16560 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 61  s omitted from a
16570 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e   non-covering in
16580 64 65 78 20 73 63 61 6e 20 69 6e 20 6f 72 64 65  dex scan in orde
16590 72 20 74 6f 0a 2a 2a 20 62 69 61 73 20 74 68 65  r to.** bias the
165a0 20 73 63 6f 72 69 6e 67 20 69 6e 20 66 61 76 6f   scoring in favo
165b0 72 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69 6e  r of using an in
165c0 64 65 78 2c 20 73 69 6e 63 65 20 74 68 65 20 77  dex, since the w
165d0 6f 72 73 74 2d 63 61 73 65 0a 2a 2a 20 70 65 72  orst-case.** per
165e0 66 6f 72 6d 61 6e 63 65 20 6f 66 20 75 73 69 6e  formance of usin
165f0 67 20 61 6e 20 69 6e 64 65 78 20 69 73 20 66 61  g an index is fa
16600 72 20 62 65 74 74 65 72 20 74 68 61 6e 20 74 68  r better than th
16610 65 20 77 6f 72 73 74 2d 63 61 73 65 20 70 65 72  e worst-case per
16620 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 6f 66 20 61  formance.** of a
16630 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   full table scan
16640 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16650 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
16660 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  e(.  WhereLoopBu
16670 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
16680 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
16690 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
166a0 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61    Bitmask mExtra
166b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
166c0 20 45 78 74 72 61 20 70 72 65 72 65 71 75 65 73   Extra prereques
166d0 69 74 65 73 20 66 6f 72 20 75 73 69 6e 67 20 74  ites for using t
166e0 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a  his table */.){.
166f0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
16700 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  nfo;          /*
16710 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20   WHERE analysis 
16720 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64  context */.  Ind
16730 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20  ex *pProbe;     
16740 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
16750 6e 64 65 78 20 77 65 20 61 72 65 20 65 76 61 6c  ndex we are eval
16760 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65  uating */.  Inde
16770 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20 20  x sPk;          
16780 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61 6b          /* A fak
16790 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 66  e index object f
167a0 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  or the primary k
167b0 65 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61  ey */.  LogEst a
167c0 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20 20  iRowEstPk[2];   
167d0 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f 77      /* The aiRow
167e0 4c 6f 67 45 73 74 5b 5d 20 76 61 6c 75 65 20 66  LogEst[] value f
167f0 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78  or the sPk index
16800 20 2a 2f 0a 20 20 69 31 36 20 61 69 43 6f 6c 75   */.  i16 aiColu
16810 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20  mnPk = -1;      
16820 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e    /* The aColumn
16830 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  [] value for the
16840 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20   sPk index */.  
16850 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
16860 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
16870 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
16880 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
16890 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20  st_item *pSrc;  
168a0 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
168b0 73 65 20 62 74 72 65 65 20 74 65 72 6d 20 74 6f  se btree term to
168c0 20 61 64 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c   add */.  WhereL
168d0 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  oop *pNew;      
168e0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74        /* Templat
168f0 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
16900 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ct */.  int rc =
16910 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
16920 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
16930 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72  de */.  int iSor
16940 74 49 64 78 20 3d 20 31 3b 20 20 20 20 20 20 20  tIdx = 1;       
16950 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d      /* Index num
16960 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b 20  ber */.  int b; 
16970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16980 20 20 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65 61       /* A boolea
16990 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4c 6f 67  n value */.  Log
169a0 45 73 74 20 72 53 69 7a 65 3b 20 20 20 20 20 20  Est rSize;      
169b0 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62           /* numb
169c0 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
169d0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67  e table */.  Log
169e0 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20  Est rLogSize;   
169f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61           /* Loga
16a00 72 69 74 68 6d 20 6f 66 20 74 68 65 20 6e 75 6d  rithm of the num
16a10 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
16a20 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68  he table */.  Wh
16a30 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
16a40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16a50 20 70 61 72 73 65 64 20 57 48 45 52 45 20 63 6c   parsed WHERE cl
16a60 61 75 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  ause */.  Table 
16a70 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
16a80 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62        /* Table b
16a90 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a  eing queried */.
16aa0 20 20 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69    .  pNew = pBui
16ab0 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 57  lder->pNew;.  pW
16ac0 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
16ad0 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 54 61 62 4c  >pWInfo;.  pTabL
16ae0 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  ist = pWInfo->pT
16af0 61 62 4c 69 73 74 3b 0a 20 20 70 53 72 63 20 3d  abList;.  pSrc =
16b00 20 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70   pTabList->a + p
16b10 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 70 54 61  New->iTab;.  pTa
16b20 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a  b = pSrc->pTab;.
16b30 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72    pWC = pBuilder
16b40 2d 3e 70 57 43 3b 0a 20 20 61 73 73 65 72 74 28  ->pWC;.  assert(
16b50 20 21 49 73 56 69 72 74 75 61 6c 28 70 53 72 63   !IsVirtual(pSrc
16b60 2d 3e 70 54 61 62 29 20 29 3b 0a 0a 20 20 69 66  ->pTab) );..  if
16b70 28 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78  ( pSrc->pIBIndex
16b80 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49 4e   ){.    /* An IN
16b90 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20  DEXED BY clause 
16ba0 73 70 65 63 69 66 69 65 73 20 61 20 70 61 72 74  specifies a part
16bb0 69 63 75 6c 61 72 20 69 6e 64 65 78 20 74 6f 20  icular index to 
16bc0 75 73 65 20 2a 2f 0a 20 20 20 20 70 50 72 6f 62  use */.    pProb
16bd0 65 20 3d 20 70 53 72 63 2d 3e 70 49 42 49 6e 64  e = pSrc->pIBInd
16be0 65 78 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ex;.  }else if( 
16bf0 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
16c00 29 7b 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20  ){.    pProbe = 
16c10 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
16c20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
16c30 65 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58 45  ere is no INDEXE
16c40 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43 72  D BY clause.  Cr
16c50 65 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64 65  eate a fake Inde
16c60 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63 61  x object in loca
16c70 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  l.    ** variabl
16c80 65 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73 65  e sPk to represe
16c90 6e 74 20 74 68 65 20 72 6f 77 69 64 20 70 72 69  nt the rowid pri
16ca0 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e 20  mary key index. 
16cb0 20 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20 2a   Make this.    *
16cc0 2a 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68 65  * fake index the
16cd0 20 66 69 72 73 74 20 69 6e 20 61 20 63 68 61 69   first in a chai
16ce0 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65 63  n of Index objec
16cf0 74 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20 74  ts with all of t
16d00 68 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20 69  he real.    ** i
16d10 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f 77  ndices to follow
16d20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
16d30 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
16d40 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
16d50 20 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65 73   of real indices
16d60 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   on the table */
16d70 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50 6b  .    memset(&sPk
16d80 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64 65  , 0, sizeof(Inde
16d90 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 4b 65  x));.    sPk.nKe
16da0 79 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 73 50  yCol = 1;.    sP
16db0 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20  k.nColumn = 1;. 
16dc0 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20     sPk.aiColumn 
16dd0 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20  = &aiColumnPk;. 
16de0 20 20 20 73 50 6b 2e 61 69 52 6f 77 4c 6f 67 45     sPk.aiRowLogE
16df0 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b  st = aiRowEstPk;
16e00 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72  .    sPk.onError
16e10 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20   = OE_Replace;. 
16e20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20     sPk.pTable = 
16e30 70 54 61 62 3b 0a 20 20 20 20 73 50 6b 2e 73 7a  pTab;.    sPk.sz
16e40 49 64 78 52 6f 77 20 3d 20 70 54 61 62 2d 3e 73  IdxRow = pTab->s
16e50 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 61 69 52  zTabRow;.    aiR
16e60 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 54 61  owEstPk[0] = pTa
16e70 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20  b->nRowLogEst;. 
16e80 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d     aiRowEstPk[1]
16e90 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 72 73 74   = 0;.    pFirst
16ea0 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70   = pSrc->pTab->p
16eb0 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70  Index;.    if( p
16ec0 53 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78  Src->fg.notIndex
16ed0 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ed==0 ){.      /
16ee0 2a 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69 63  * The real indic
16ef0 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  es of the table 
16f00 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65  are only conside
16f10 72 65 64 20 69 66 20 74 68 65 0a 20 20 20 20 20  red if the.     
16f20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44 20   ** NOT INDEXED 
16f30 71 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d 69  qualifier is omi
16f40 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46 52  tted from the FR
16f50 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
16f60 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70     sPk.pNext = p
16f70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20  First;.    }.   
16f80 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a   pProbe = &sPk;.
16f90 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20 70 54    }.  rSize = pT
16fa0 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a  ab->nRowLogEst;.
16fb0 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74    rLogSize = est
16fc0 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 23 69 66  Log(rSize);..#if
16fd0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16fe0 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
16ff0 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20  .  /* Automatic 
17000 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 66 28  indexes */.  if(
17010 20 21 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53   !pBuilder->pOrS
17020 65 74 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70  et      /* Not p
17030 61 72 74 20 6f 66 20 61 6e 20 4f 52 20 6f 70 74  art of an OR opt
17040 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  imization */.   
17050 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
17060 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e  lFlags & WHERE_N
17070 4f 5f 41 55 54 4f 49 4e 44 45 58 29 3d 3d 30 0a  O_AUTOINDEX)==0.
17080 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 70     && (pWInfo->p
17090 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
170a0 20 26 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e   & SQLITE_AutoIn
170b0 64 65 78 29 21 3d 30 0a 20 20 20 26 26 20 70 53  dex)!=0.   && pS
170c0 72 63 2d 3e 70 49 42 49 6e 64 65 78 3d 3d 30 20  rc->pIBIndex==0 
170d0 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 49       /* Has no I
170e0 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
170f0 20 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d   */.   && !pSrc-
17100 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 20 20  >fg.notIndexed  
17110 20 2f 2a 20 48 61 73 20 6e 6f 20 4e 4f 54 20 49   /* Has no NOT I
17120 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 2a 2f  NDEXED clause */
17130 0a 20 20 20 26 26 20 48 61 73 52 6f 77 69 64 28  .   && HasRowid(
17140 70 54 61 62 29 20 20 20 20 20 20 20 20 20 2f 2a  pTab)         /*
17150 20 49 73 20 6e 6f 74 20 61 20 57 49 54 48 4f 55   Is not a WITHOU
17160 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 28  T ROWID table. (
17170 46 49 58 4d 45 3a 20 57 68 79 20 6e 6f 74 3f 29  FIXME: Why not?)
17180 20 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d   */.   && !pSrc-
17190 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61 74 65 64  >fg.isCorrelated
171a0 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c   /* Not a correl
171b0 61 74 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f  ated subquery */
171c0 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 66 67  .   && !pSrc->fg
171d0 2e 69 73 52 65 63 75 72 73 69 76 65 20 20 2f 2a  .isRecursive  /*
171e0 20 4e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65   Not a recursive
171f0 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78   common table ex
17200 70 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20 29  pression. */.  )
17210 7b 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  {.    /* Generat
17220 65 20 61 75 74 6f 2d 69 6e 64 65 78 20 57 68 65  e auto-index Whe
17230 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 57  reLoops */.    W
17240 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
17250 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
17260 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20  pWCEnd = pWC->a 
17270 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20  + pWC->nTerm;.  
17280 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
17290 3e 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  >a; rc==SQLITE_O
172a0 4b 20 26 26 20 70 54 65 72 6d 3c 70 57 43 45 6e  K && pTerm<pWCEn
172b0 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
172c0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72     if( pTerm->pr
172d0 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77  ereqRight & pNew
172e0 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e  ->maskSelf ) con
172f0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
17300 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64   termCanDriveInd
17310 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20  ex(pTerm, pSrc, 
17320 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e  0) ){.        pN
17330 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
17340 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  = 1;.        pNe
17350 77 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20  w->nSkip = 0;.  
17360 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74        pNew->u.bt
17370 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a  ree.pIndex = 0;.
17380 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c          pNew->nL
17390 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
173a0 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30    pNew->aLTerm[0
173b0 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  ] = pTerm;.     
173c0 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e     /* TUNING: On
173d0 65 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f 72 20  e-time cost for 
173e0 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 20 61 75  computing the au
173f0 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73  tomatic index is
17400 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 73 74 69  .        ** esti
17410 6d 61 74 65 64 20 74 6f 20 62 65 20 58 2a 4e 2a  mated to be X*N*
17420 6c 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20  log2(N) where N 
17430 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
17440 20 72 6f 77 73 20 69 6e 0a 20 20 20 20 20 20 20   rows in.       
17450 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65   ** the table be
17460 69 6e 67 20 69 6e 64 65 78 65 64 20 61 6e 64 20  ing indexed and 
17470 77 68 65 72 65 20 58 20 69 73 20 37 20 28 4c 6f  where X is 7 (Lo
17480 67 45 73 74 3d 32 38 29 20 66 6f 72 20 6e 6f 72  gEst=28) for nor
17490 6d 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  mal.        ** t
174a0 61 62 6c 65 73 20 6f 72 20 31 2e 33 37 35 20 28  ables or 1.375 (
174b0 4c 6f 67 45 73 74 3d 34 29 20 66 6f 72 20 76 69  LogEst=4) for vi
174c0 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69  ews and subqueri
174d0 65 73 2e 20 20 54 68 65 20 76 61 6c 75 65 0a 20  es.  The value. 
174e0 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 58 20 69         ** of X i
174f0 73 20 73 6d 61 6c 6c 65 72 20 66 6f 72 20 76 69  s smaller for vi
17500 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69  ews and subqueri
17510 65 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 71  es so that the q
17520 75 65 72 79 20 70 6c 61 6e 6e 65 72 0a 20 20 20  uery planner.   
17530 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20       ** will be 
17540 6d 6f 72 65 20 61 67 67 72 65 73 73 69 76 65 20  more aggressive 
17550 61 62 6f 75 74 20 67 65 6e 65 72 61 74 69 6e 67  about generating
17560 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
17570 65 73 20 66 6f 72 0a 20 20 20 20 20 20 20 20 2a  es for.        *
17580 2a 20 74 68 6f 73 65 20 6f 62 6a 65 63 74 73 2c  * those objects,
17590 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20   since there is 
175a0 6e 6f 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  no opportunity t
175b0 6f 20 61 64 64 20 73 63 68 65 6d 61 0a 20 20 20  o add schema.   
175c0 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 65 73 20       ** indexes 
175d0 6f 6e 20 73 75 62 71 75 65 72 69 65 73 20 61 6e  on subqueries an
175e0 64 20 76 69 65 77 73 2e 20 2a 2f 0a 20 20 20 20  d views. */.    
175f0 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
17600 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72 53   = rLogSize + rS
17610 69 7a 65 20 2b 20 34 3b 0a 20 20 20 20 20 20 20  ize + 4;.       
17620 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
17630 63 74 3d 3d 30 20 26 26 20 28 70 54 61 62 2d 3e  ct==0 && (pTab->
17640 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
17650 68 65 6d 65 72 61 6c 29 3d 3d 30 20 29 7b 0a 20  hemeral)==0 ){. 
17660 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72           pNew->r
17670 53 65 74 75 70 20 2b 3d 20 32 34 3b 0a 20 20 20  Setup += 24;.   
17680 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 41       }.        A
17690 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
176a0 65 72 28 70 4e 65 77 2d 3e 72 53 65 74 75 70 2c  er(pNew->rSetup,
176b0 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29   pTab->costMult)
176c0 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e  ;.        /* TUN
176d0 49 4e 47 3a 20 45 61 63 68 20 69 6e 64 65 78 20  ING: Each index 
176e0 6c 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20 32 30  lookup yields 20
176f0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
17700 6c 65 2e 20 20 54 68 69 73 0a 20 20 20 20 20 20  le.  This.      
17710 20 20 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68 61    ** is more tha
17720 6e 20 74 68 65 20 75 73 75 61 6c 20 67 75 65 73  n the usual gues
17730 73 20 6f 66 20 31 30 20 72 6f 77 73 2c 20 73 69  s of 10 rows, si
17740 6e 63 65 20 77 65 20 68 61 76 65 20 6e 6f 20 77  nce we have no w
17750 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ay.        ** of
17760 20 6b 6e 6f 77 69 6e 67 20 68 6f 77 20 73 65 6c   knowing how sel
17770 65 63 74 69 76 65 20 74 68 65 20 69 6e 64 65 78  ective the index
17780 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79   will ultimately
17790 20 62 65 2e 20 20 49 74 20 77 6f 75 6c 64 0a 20   be.  It would. 
177a0 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65         ** not be
177b0 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 74 6f   unreasonable to
177c0 20 6d 61 6b 65 20 74 68 69 73 20 76 61 6c 75 65   make this value
177d0 20 6d 75 63 68 20 6c 61 72 67 65 72 2e 20 2a 2f   much larger. */
177e0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
177f0 4f 75 74 20 3d 20 34 33 3b 20 20 61 73 73 65 72  Out = 43;  asser
17800 74 28 20 34 33 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 43==sqlite3Lo
17810 67 45 73 74 28 32 30 29 20 29 3b 0a 20 20 20 20  gEst(20) );.    
17820 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
17830 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
17840 64 28 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77 2d  d(rLogSize,pNew-
17850 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  >nOut);.        
17860 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
17870 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
17880 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
17890 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61 20  prereq = mExtra 
178a0 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  | pTerm->prereqR
178b0 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63  ight;.        rc
178c0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
178d0 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
178e0 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  w);.      }.    
178f0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
17900 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
17910 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a  MATIC_INDEX */..
17920 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61    /* Loop over a
17930 6c 6c 20 69 6e 64 69 63 65 73 0a 20 20 2a 2f 0a  ll indices.  */.
17940 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49    for(; rc==SQLI
17950 54 45 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65 3b  TE_OK && pProbe;
17960 20 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e   pProbe=pProbe->
17970 70 4e 65 78 74 2c 20 69 53 6f 72 74 49 64 78 2b  pNext, iSortIdx+
17980 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 72 6f  +){.    if( pPro
17990 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  be->pPartIdxWher
179a0 65 21 3d 30 0a 20 20 20 20 20 26 26 20 21 77 68  e!=0.     && !wh
179b0 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c  ereUsablePartial
179c0 49 6e 64 65 78 28 70 53 72 63 2d 3e 69 43 75 72  Index(pSrc->iCur
179d0 73 6f 72 2c 20 70 57 43 2c 20 70 50 72 6f 62 65  sor, pWC, pProbe
179e0 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 29  ->pPartIdxWhere)
179f0 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
17a00 73 65 28 20 70 4e 65 77 2d 3e 69 54 61 62 21 3d  se( pNew->iTab!=
17a10 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 3b  pSrc->iCursor );
17a20 20 20 2f 2a 20 53 65 65 20 74 69 63 6b 65 74 20    /* See ticket 
17a30 5b 39 38 64 39 37 33 62 38 66 35 5d 20 2a 2f 0a  [98d973b8f5] */.
17a40 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
17a50 20 2f 2a 20 50 61 72 74 69 61 6c 20 69 6e 64 65   /* Partial inde
17a60 78 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 20  x inappropriate 
17a70 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 20 2a  for this query *
17a80 2f 0a 20 20 20 20 7d 0a 20 20 20 20 72 53 69 7a  /.    }.    rSiz
17a90 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f  e = pProbe->aiRo
17aa0 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 20 20  wLogEst[0];.    
17ab0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
17ac0 71 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  q = 0;.    pNew-
17ad0 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20  >nSkip = 0;.    
17ae0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30  pNew->nLTerm = 0
17af0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72  ;.    pNew->iSor
17b00 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e  tIdx = 0;.    pN
17b10 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
17b20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
17b30 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 70   = mExtra;.    p
17b40 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a  New->nOut = rSiz
17b50 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  e;.    pNew->u.b
17b60 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 50  tree.pIndex = pP
17b70 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e  robe;.    b = in
17b80 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68  dexMightHelpWith
17b90 4f 72 64 65 72 42 79 28 70 42 75 69 6c 64 65 72  OrderBy(pBuilder
17ba0 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e  , pProbe, pSrc->
17bb0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a  iCursor);.    /*
17bc0 20 54 68 65 20 4f 4e 45 50 41 53 53 5f 44 45 53   The ONEPASS_DES
17bd0 49 52 45 44 20 66 6c 61 67 73 20 6e 65 76 65 72  IRED flags never
17be0 20 6f 63 63 75 72 73 20 74 6f 67 65 74 68 65 72   occurs together
17bf0 20 77 69 74 68 20 4f 52 44 45 52 20 42 59 20 2a   with ORDER BY *
17c00 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  /.    assert( (p
17c10 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
17c20 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
17c30 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c  S_DESIRED)==0 ||
17c40 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28   b==0 );.    if(
17c50 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30   pProbe->tnum<=0
17c60 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74   ){.      /* Int
17c70 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79  eger primary key
17c80 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
17c90 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
17ca0 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20  WHERE_IPK;..    
17cb0 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20    /* Full table 
17cc0 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e  scan */.      pN
17cd0 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62  ew->iSortIdx = b
17ce0 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b   ? iSortIdx : 0;
17cf0 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  .      /* TUNING
17d00 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74  : Cost of full t
17d10 61 62 6c 65 20 73 63 61 6e 20 69 73 20 28 4e 2a  able scan is (N*
17d20 33 2e 30 29 2e 20 2a 2f 0a 20 20 20 20 20 20 70  3.0). */.      p
17d30 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a  New->rRun = rSiz
17d40 65 20 2b 20 31 36 3b 0a 20 20 20 20 20 20 41 70  e + 16;.      Ap
17d50 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65  plyCostMultiplie
17d60 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54  r(pNew->rRun, pT
17d70 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20  ab->costMult);. 
17d80 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75       whereLoopOu
17d90 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20  tputAdjust(pWC, 
17da0 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20  pNew, rSize);.  
17db0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
17dc0 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
17dd0 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
17de0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69  pNew->nOut = rSi
17df0 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ze;.      if( rc
17e00 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65   ) break;.    }e
17e10 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61  lse{.      Bitma
17e20 73 6b 20 6d 3b 0a 20 20 20 20 20 20 69 66 28 20  sk m;.      if( 
17e30 70 50 72 6f 62 65 2d 3e 69 73 43 6f 76 65 72 69  pProbe->isCoveri
17e40 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e  ng ){.        pN
17e50 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
17e60 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57  ERE_IDX_ONLY | W
17e70 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20  HERE_INDEXED;.  
17e80 20 20 20 20 20 20 6d 20 3d 20 30 3b 0a 20 20 20        m = 0;.   
17e90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17ea0 20 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55    m = pSrc->colU
17eb0 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e  sed & ~columnsIn
17ec0 49 6e 64 65 78 28 70 50 72 6f 62 65 29 3b 0a 20  Index(pProbe);. 
17ed0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
17ee0 6c 61 67 73 20 3d 20 28 6d 3d 3d 30 29 20 3f 20  lags = (m==0) ? 
17ef0 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c  (WHERE_IDX_ONLY|
17f00 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 20 3a  WHERE_INDEXED) :
17f10 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a   WHERE_INDEXED;.
17f20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
17f30 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76 69 61 20  * Full scan via 
17f40 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69  index */.      i
17f50 66 28 20 62 0a 20 20 20 20 20 20 20 7c 7c 20 21  f( b.       || !
17f60 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 0a 20  HasRowid(pTab). 
17f70 20 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a        || ( m==0.
17f80 20 20 20 20 20 20 20 20 20 26 26 20 70 50 72 6f           && pPro
17f90 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d  be->bUnordered==
17fa0 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  0.         && (p
17fb0 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 3c  Probe->szIdxRow<
17fc0 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 29 0a  pTab->szTabRow).
17fd0 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
17fe0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
17ff0 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
18000 44 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20 20  DESIRED)==0.    
18010 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 47       && sqlite3G
18020 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65  lobalConfig.bUse
18030 43 69 73 0a 20 20 20 20 20 20 20 20 20 26 26 20  Cis.         && 
18040 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
18050 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  led(pWInfo->pPar
18060 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43  se->db, SQLITE_C
18070 6f 76 65 72 49 64 78 53 63 61 6e 29 0a 20 20 20  overIdxScan).   
18080 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20 29         ).      )
18090 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
180a0 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69  iSortIdx = b ? i
180b0 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 0a 20 20  SortIdx : 0;..  
180c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73        /* The cos
180d0 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20 74 68  t of visiting th
180e0 65 20 69 6e 64 65 78 20 72 6f 77 73 20 69 73 20  e index rows is 
180f0 4e 2a 4b 2c 20 77 68 65 72 65 20 4b 20 69 73 0a  N*K, where K is.
18100 20 20 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65          ** betwe
18110 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30 2c 20  en 1.1 and 3.0, 
18120 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
18130 20 72 65 6c 61 74 69 76 65 20 73 69 7a 65 73 20   relative sizes 
18140 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
18150 2a 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c  * index and tabl
18160 65 20 72 6f 77 73 2e 20 49 66 20 74 68 69 73 20  e rows. If this 
18170 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e  is a non-coverin
18180 67 20 69 6e 64 65 78 20 73 63 61 6e 2c 0a 20 20  g index scan,.  
18190 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20 61 64        ** also ad
181a0 64 20 74 68 65 20 63 6f 73 74 20 6f 66 20 76 69  d the cost of vi
181b0 73 69 74 69 6e 67 20 74 61 62 6c 65 20 72 6f 77  siting table row
181c0 73 20 28 4e 2a 33 2e 30 29 2e 20 20 2a 2f 0a 20  s (N*3.0).  */. 
181d0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75         pNew->rRu
181e0 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31 20 2b 20  n = rSize + 1 + 
181f0 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64  (15*pProbe->szId
18200 78 52 6f 77 29 2f 70 54 61 62 2d 3e 73 7a 54 61  xRow)/pTab->szTa
18210 62 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66  bRow;.        if
18220 28 20 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( m!=0 ){.      
18230 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
18240 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
18250 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 72 53  d(pNew->rRun, rS
18260 69 7a 65 2b 31 36 29 3b 0a 20 20 20 20 20 20 20  ize+16);.       
18270 20 7d 0a 20 20 20 20 20 20 20 20 41 70 70 6c 79   }.        Apply
18280 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70  CostMultiplier(p
18290 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d  New->rRun, pTab-
182a0 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20  >costMult);.    
182b0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74      whereLoopOut
182c0 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70  putAdjust(pWC, p
182d0 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20  New, rSize);.   
182e0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
182f0 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
18300 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
18310 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
18320 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  rSize;.        i
18330 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
18340 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
18350 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
18360 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42  AddBtreeIndex(pB
18370 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50  uilder, pSrc, pP
18380 72 6f 62 65 2c 20 30 29 3b 0a 23 69 66 64 65 66  robe, 0);.#ifdef
18390 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
183a0 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
183b0 20 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72    sqlite3Stat4Pr
183c0 6f 62 65 46 72 65 65 28 70 42 75 69 6c 64 65 72  obeFree(pBuilder
183d0 2d 3e 70 52 65 63 29 3b 0a 20 20 20 20 70 42 75  ->pRec);.    pBu
183e0 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
183f0 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 69 6c 64   = 0;.    pBuild
18400 65 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23 65  er->pRec = 0;.#e
18410 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ndif..    /* If 
18420 74 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44  there was an IND
18430 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
18440 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f  then only that o
18450 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20  ne index is.    
18460 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a  ** considered. *
18470 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e  /.    if( pSrc->
18480 70 49 42 49 6e 64 65 78 20 29 20 62 72 65 61 6b  pIBIndex ) break
18490 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
184a0 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
184b0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
184c0 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 64 64  LTABLE./*.** Add
184d0 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f   all WhereLoop o
184e0 62 6a 65 63 74 73 20 66 6f 72 20 61 20 74 61 62  bjects for a tab
184f0 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69  le of the join i
18500 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20  dentified by.** 
18510 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
18520 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c  iTab.  That tabl
18530 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
18540 74 6f 20 62 65 20 61 20 76 69 72 74 75 61 6c 20  to be a virtual 
18550 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  table..**.** If 
18560 74 68 65 72 65 20 61 72 65 20 6e 6f 20 4c 45 46  there are no LEF
18570 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e 20  T or CROSS JOIN 
18580 6a 6f 69 6e 73 20 69 6e 20 74 68 65 20 71 75 65  joins in the que
18590 72 79 2c 20 62 6f 74 68 20 6d 45 78 74 72 61 20  ry, both mExtra 
185a0 61 6e 64 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65  and.** mUnusable
185b0 20 61 72 65 20 73 65 74 20 74 6f 20 30 2e 20 4f   are set to 0. O
185c0 74 68 65 72 77 69 73 65 2c 20 6d 45 78 74 72 61  therwise, mExtra
185d0 20 69 73 20 61 20 6d 61 73 6b 20 6f 66 20 61 6c   is a mask of al
185e0 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a  l FROM clause.**
185f0 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6f 63   entries that oc
18600 63 75 72 20 62 65 66 6f 72 65 20 74 68 65 20 76  cur before the v
18610 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 20  irtual table in 
18620 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
18630 61 6e 64 20 61 72 65 0a 2a 2a 20 73 65 70 61 72  and are.** separ
18640 61 74 65 64 20 66 72 6f 6d 20 69 74 20 62 79 20  ated from it by 
18650 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 4c 45 46  at least one LEF
18660 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e 2e  T or CROSS JOIN.
18670 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65 0a   Similarly, the.
18680 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 6d 61 73  ** mUnusable mas
18690 6b 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 46  k contains all F
186a0 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 69  ROM clause entri
186b0 65 73 20 74 68 61 74 20 6f 63 63 75 72 20 61 66  es that occur af
186c0 74 65 72 20 74 68 65 0a 2a 2a 20 76 69 72 74 75  ter the.** virtu
186d0 61 6c 20 74 61 62 6c 65 20 61 6e 64 20 61 72 65  al table and are
186e0 20 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20   separated from 
186f0 69 74 20 62 79 20 61 74 20 6c 65 61 73 74 20 6f  it by at least o
18700 6e 65 20 4c 45 46 54 20 6f 72 20 0a 2a 2a 20 43  ne LEFT or .** C
18710 52 4f 53 53 20 4a 4f 49 4e 2e 20 0a 2a 2a 0a 2a  ROSS JOIN. .**.*
18720 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  * For example, i
18730 66 20 74 68 65 20 71 75 65 72 79 20 77 65 72 65  f the query were
18740 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52  :.**.**   ... FR
18750 4f 4d 20 74 31 2c 20 74 32 20 4c 45 46 54 20 4a  OM t1, t2 LEFT J
18760 4f 49 4e 20 74 33 2c 20 74 34 2c 20 76 74 20 43  OIN t3, t4, vt C
18770 52 4f 53 53 20 4a 4f 49 4e 20 74 35 2c 20 74 36  ROSS JOIN t5, t6
18780 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6d 45 78  ;.**.** then mEx
18790 74 72 61 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  tra corresponds 
187a0 74 6f 20 28 74 31 2c 20 74 32 29 20 61 6e 64 20  to (t1, t2) and 
187b0 6d 55 6e 75 73 61 62 6c 65 20 74 6f 20 28 74 35  mUnusable to (t5
187c0 2c 20 74 36 29 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  , t6)..**.** All
187d0 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 6d   the tables in m
187e0 45 78 74 72 61 20 6d 75 73 74 20 62 65 20 73 63  Extra must be sc
187f0 61 6e 6e 65 64 20 62 65 66 6f 72 65 20 74 68 65  anned before the
18800 20 63 75 72 72 65 6e 74 20 76 69 72 74 75 61 6c   current virtual
18810 20 0a 2a 2a 20 74 61 62 6c 65 2e 20 53 6f 20 61   .** table. So a
18820 6e 79 20 74 65 72 6d 73 20 66 6f 72 20 77 68 69  ny terms for whi
18830 63 68 20 61 6c 6c 20 70 72 65 72 65 71 75 69 73  ch all prerequis
18840 69 74 65 73 20 61 72 65 20 73 61 74 69 73 66 69  ites are satisfi
18850 65 64 20 62 79 20 0a 2a 2a 20 6d 45 78 74 72 61  ed by .** mExtra
18860 20 6d 61 79 20 62 65 20 73 70 65 63 69 66 69 65   may be specifie
18870 64 20 61 73 20 22 75 73 61 62 6c 65 22 20 69 6e  d as "usable" in
18880 20 61 6c 6c 20 63 61 6c 6c 73 20 74 6f 20 78 42   all calls to xB
18890 65 73 74 49 6e 64 65 78 2e 20 0a 2a 2a 20 43 6f  estIndex. .** Co
188a0 6e 76 65 72 73 65 6c 79 2c 20 61 6c 6c 20 74 61  nversely, all ta
188b0 62 6c 65 73 20 69 6e 20 6d 55 6e 75 73 61 62 6c  bles in mUnusabl
188c0 65 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65  e must be scanne
188d0 64 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72  d after the curr
188e0 65 6e 74 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74  ent.** virtual t
188f0 61 62 6c 65 2c 20 73 6f 20 61 6e 79 20 74 65 72  able, so any ter
18900 6d 73 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  ms for which the
18910 20 70 72 65 72 65 71 75 69 73 69 74 65 73 20 6f   prerequisites o
18920 76 65 72 6c 61 70 20 77 69 74 68 0a 2a 2a 20 6d  verlap with.** m
18930 55 6e 75 73 61 62 6c 65 20 73 68 6f 75 6c 64 20  Unusable should 
18940 61 6c 77 61 79 73 20 62 65 20 63 6f 6e 66 69 67  always be config
18950 75 72 65 64 20 61 73 20 22 6e 6f 74 2d 75 73 61  ured as "not-usa
18960 62 6c 65 22 20 66 6f 72 20 78 42 65 73 74 49 6e  ble" for xBestIn
18970 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dex..*/.static i
18980 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56  nt whereLoopAddV
18990 69 72 74 75 61 6c 28 0a 20 20 57 68 65 72 65 4c  irtual(.  WhereL
189a0 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
189b0 6c 64 65 72 2c 20 20 2f 2a 20 57 48 45 52 45 20  lder,  /* WHERE 
189c0 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69  clause informati
189d0 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  on */.  Bitmask 
189e0 6d 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20  mExtra,         
189f0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74       /* Tables t
18a00 68 61 74 20 6d 75 73 74 20 62 65 20 73 63 61 6e  hat must be scan
18a10 6e 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20  ned before this 
18a20 6f 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  one */.  Bitmask
18a30 20 6d 55 6e 75 73 61 62 6c 65 20 20 20 20 20 20   mUnusable      
18a40 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
18a50 74 68 61 74 20 6d 75 73 74 20 62 65 20 73 63 61  that must be sca
18a60 6e 6e 65 64 20 61 66 74 65 72 20 74 68 69 73 20  nned after this 
18a70 6f 6e 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  one */.){.  Wher
18a80 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
18a90 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52           /* WHER
18aa0 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65  E analysis conte
18ab0 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  xt */.  Parse *p
18ac0 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
18ad0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
18ae0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
18af0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
18b00 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  C;            /*
18b10 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
18b20 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
18b30 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
18b40 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  ;   /* The FROM 
18b50 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73  clause term to s
18b60 65 61 72 63 68 20 2a 2f 0a 20 20 54 61 62 6c 65  earch */.  Table
18b70 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65   *pTab;.  sqlite
18b80 33 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65 33  3 *db;.  sqlite3
18b90 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64  _index_info *pId
18ba0 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  xInfo;.  struct 
18bb0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
18bc0 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f  nstraint *pIdxCo
18bd0 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  ns;.  struct sql
18be0 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
18bf0 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73  raint_usage *pUs
18c00 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  age;.  WhereTerm
18c10 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69   *pTerm;.  int i
18c20 2c 20 6a 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d  , j;.  int iTerm
18c30 2c 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74 20  , mxTerm;.  int 
18c40 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69  nConstraint;.  i
18c50 6e 74 20 73 65 65 6e 49 6e 20 3d 20 30 3b 20 20  nt seenIn = 0;  
18c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18c70 72 75 65 20 69 66 20 61 6e 20 49 4e 20 6f 70 65  rue if an IN ope
18c80 72 61 74 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f  rator is seen */
18c90 0a 20 20 69 6e 74 20 73 65 65 6e 56 61 72 20 3d  .  int seenVar =
18ca0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
18cb0 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6e 6f 6e  /* True if a non
18cc0 2d 63 6f 6e 73 74 61 6e 74 20 63 6f 6e 73 74 72  -constant constr
18cd0 61 69 6e 74 20 69 73 20 73 65 65 6e 20 2a 2f 0a  aint is seen */.
18ce0 20 20 69 6e 74 20 69 50 68 61 73 65 3b 20 20 20    int iPhase;   
18cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18d00 2a 20 30 3a 20 63 6f 6e 73 74 20 77 2f 6f 20 49  * 0: const w/o I
18d10 4e 2c 20 31 3a 20 63 6f 6e 73 74 2c 20 32 3a 20  N, 1: const, 2: 
18d20 6e 6f 20 49 4e 2c 20 20 32 3a 20 49 4e 20 2a 2f  no IN,  2: IN */
18d30 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
18d40 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ew;.  int rc = S
18d50 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
18d60 65 72 74 28 20 28 6d 45 78 74 72 61 20 26 20 6d  ert( (mExtra & m
18d70 55 6e 75 73 61 62 6c 65 29 3d 3d 30 20 29 3b 0a  Unusable)==0 );.
18d80 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
18d90 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70  der->pWInfo;.  p
18da0 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
18db0 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70  pParse;.  db = p
18dc0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 57 43  Parse->db;.  pWC
18dd0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43   = pBuilder->pWC
18de0 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  ;.  pNew = pBuil
18df0 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53 72  der->pNew;.  pSr
18e00 63 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61  c = &pWInfo->pTa
18e10 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69  bList->a[pNew->i
18e20 54 61 62 5d 3b 0a 20 20 70 54 61 62 20 3d 20 70  Tab];.  pTab = p
18e30 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 61 73 73  Src->pTab;.  ass
18e40 65 72 74 28 20 49 73 56 69 72 74 75 61 6c 28 70  ert( IsVirtual(p
18e50 54 61 62 29 20 29 3b 0a 20 20 70 49 64 78 49 6e  Tab) );.  pIdxIn
18e60 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64  fo = allocateInd
18e70 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  exInfo(pParse, p
18e80 57 43 2c 20 6d 55 6e 75 73 61 62 6c 65 2c 20 70  WC, mUnusable, p
18e90 53 72 63 2c 70 42 75 69 6c 64 65 72 2d 3e 70 4f  Src,pBuilder->pO
18ea0 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 70  rderBy);.  if( p
18eb0 49 64 78 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74  IdxInfo==0 ) ret
18ec0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
18ed0 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71  ;.  pNew->prereq
18ee0 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72 53   = 0;.  pNew->rS
18ef0 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77  etup = 0;.  pNew
18f00 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
18f10 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a  E_VIRTUALTABLE;.
18f20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
18f30 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74   0;.  pNew->u.vt
18f40 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
18f50 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49 64 78  .  pUsage = pIdx
18f60 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
18f70 74 55 73 61 67 65 3b 0a 20 20 6e 43 6f 6e 73 74  tUsage;.  nConst
18f80 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f  raint = pIdxInfo
18f90 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->nConstraint;. 
18fa0 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
18fb0 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 6e  size(db, pNew, n
18fc0 43 6f 6e 73 74 72 61 69 6e 74 29 20 29 7b 0a 20  Constraint) ){. 
18fd0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
18fe0 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a  (db, pIdxInfo);.
18ff0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19000 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
19010 66 6f 72 28 69 50 68 61 73 65 3d 30 3b 20 69 50  for(iPhase=0; iP
19020 68 61 73 65 3c 3d 33 3b 20 69 50 68 61 73 65 2b  hase<=3; iPhase+
19030 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73 65 65  +){.    if( !see
19040 6e 49 6e 20 26 26 20 28 69 50 68 61 73 65 26 31  nIn && (iPhase&1
19050 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50  )!=0 ){.      iP
19060 68 61 73 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  hase++;.      if
19070 28 20 69 50 68 61 73 65 3e 33 20 29 20 62 72 65  ( iPhase>3 ) bre
19080 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
19090 28 20 21 73 65 65 6e 56 61 72 20 26 26 20 69 50  ( !seenVar && iP
190a0 68 61 73 65 3e 31 20 29 20 62 72 65 61 6b 3b 0a  hase>1 ) break;.
190b0 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a      pIdxCons = *
190c0 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
190d0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
190e0 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
190f0 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 66  onstraint;.    f
19100 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e  or(i=0; i<pIdxIn
19110 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->nConstraint;
19120 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b   i++, pIdxCons++
19130 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70 49 64  ){.      j = pId
19140 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73  xCons->iTermOffs
19150 65 74 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  et;.      pTerm 
19160 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20  = &pWC->a[j];.  
19170 20 20 20 20 73 77 69 74 63 68 28 20 69 50 68 61      switch( iPha
19180 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61  se ){.        ca
19190 73 65 20 30 3a 20 20 20 20 2f 2a 20 43 6f 6e 73  se 0:    /* Cons
191a0 74 61 6e 74 73 20 77 69 74 68 6f 75 74 20 49 4e  tants without IN
191b0 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
191c0 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
191d0 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  >usable = 0;.   
191e0 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
191f0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
19200 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20  O_IN)!=0 ){.    
19210 20 20 20 20 20 20 20 20 73 65 65 6e 49 6e 20 3d          seenIn =
19220 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
19230 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
19240 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
19250 74 20 26 20 7e 6d 45 78 74 72 61 29 21 3d 30 20  t & ~mExtra)!=0 
19260 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
19270 65 65 6e 56 61 72 20 3d 20 31 3b 0a 20 20 20 20  eenVar = 1;.    
19280 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
19290 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
192a0 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 29 7b  r & WO_IN)==0 ){
192b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64  .            pId
192c0 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
192d0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
192e0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
192f0 20 20 20 20 20 20 20 20 63 61 73 65 20 31 3a 20          case 1: 
19300 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20     /* Constants 
19310 77 69 74 68 20 49 4e 20 6f 70 65 72 61 74 6f 72  with IN operator
19320 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  s */.          a
19330 73 73 65 72 74 28 20 73 65 65 6e 49 6e 20 29 3b  ssert( seenIn );
19340 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43  .          pIdxC
19350 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70  ons->usable = (p
19360 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
19370 74 20 26 20 7e 6d 45 78 74 72 61 29 3d 3d 30 3b  t & ~mExtra)==0;
19380 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
19390 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 32  ;.        case 2
193a0 3a 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65  :    /* Variable
193b0 73 20 77 69 74 68 6f 75 74 20 49 4e 20 2a 2f 0a  s without IN */.
193c0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
193d0 28 20 73 65 65 6e 56 61 72 20 29 3b 0a 20 20 20  ( seenVar );.   
193e0 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
193f0 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d  >usable = (pTerm
19400 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
19410 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  _IN)==0;.       
19420 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
19430 20 20 64 65 66 61 75 6c 74 3a 20 20 20 2f 2a 20    default:   /* 
19440 56 61 72 69 61 62 6c 65 73 20 77 69 74 68 20 49  Variables with I
19450 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  N */.          a
19460 73 73 65 72 74 28 20 73 65 65 6e 56 61 72 20 26  ssert( seenVar &
19470 26 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20  & seenIn );.    
19480 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e        pIdxCons->
19490 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  usable = 1;.    
194a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
194b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6d     }.    }.    m
194c0 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30 2c  emset(pUsage, 0,
194d0 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b 30   sizeof(pUsage[0
194e0 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f  ])*pIdxInfo->nCo
194f0 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 69  nstraint);.    i
19500 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65  f( pIdxInfo->nee
19510 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 20  dToFreeIdxStr ) 
19520 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64  sqlite3_free(pId
19530 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a  xInfo->idxStr);.
19540 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64      pIdxInfo->id
19550 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49  xStr = 0;.    pI
19560 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d  dxInfo->idxNum =
19570 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   0;.    pIdxInfo
19580 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
19590 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78  tr = 0;.    pIdx
195a0 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
195b0 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 70  sumed = 0;.    p
195c0 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
195d0 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f  edCost = SQLITE_
195e0 42 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75 62 6c  BIG_DBL / (doubl
195f0 65 29 32 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  e)2;.    pIdxInf
19600 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73  o->estimatedRows
19610 20 3d 20 32 35 3b 0a 20 20 20 20 72 63 20 3d 20   = 25;.    rc = 
19620 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 70 50  vtabBestIndex(pP
19630 61 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64 78  arse, pTab, pIdx
19640 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  Info);.    if( r
19650 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f  c ) goto whereLo
19660 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a  opAddVtab_exit;.
19670 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a      pIdxCons = *
19680 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
19690 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
196a0 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
196b0 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 70  onstraint;.    p
196c0 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45  New->prereq = mE
196d0 78 74 72 61 3b 0a 20 20 20 20 6d 78 54 65 72 6d  xtra;.    mxTerm
196e0 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72   = -1;.    asser
196f0 74 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e  t( pNew->nLSlot>
19700 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 3b 0a  =nConstraint );.
19710 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
19720 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
19730 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d   pNew->aLTerm[i]
19740 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
19750 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20  u.vtab.omitMask 
19760 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
19770 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; i<nConstraint;
19780 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b   i++, pIdxCons++
19790 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 54  ){.      if( (iT
197a0 65 72 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e  erm = pUsage[i].
197b0 61 72 67 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d  argvIndex - 1)>=
197c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d  0 ){.        j =
197d0 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d   pIdxCons->iTerm
197e0 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
197f0 69 66 28 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73  if( iTerm>=nCons
19800 74 72 61 69 6e 74 0a 20 20 20 20 20 20 20 20 20  traint.         
19810 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20 20 20  || j<0.         
19820 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d  || j>=pWC->nTerm
19830 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4e 65  .         || pNe
19840 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d  w->aLTerm[iTerm]
19850 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  !=0.        ){. 
19860 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
19870 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
19880 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
19890 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
198a0 73 2e 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d  s.xBestIndex() m
198b0 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 20 70 54 61  alfunction", pTa
198c0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
198d0 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4c       goto whereL
198e0 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b  oopAddVtab_exit;
198f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
19900 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65     testcase( iTe
19910 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d  rm==nConstraint-
19920 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  1 );.        tes
19930 74 63 61 73 65 28 20 6a 3d 3d 30 20 29 3b 0a 20  tcase( j==0 );. 
19940 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
19950 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31   j==pWC->nTerm-1
19960 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72   );.        pTer
19970 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a  m = &pWC->a[j];.
19980 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72          pNew->pr
19990 65 72 65 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70  ereq |= pTerm->p
199a0 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20  rereqRight;.    
199b0 20 20 20 20 61 73 73 65 72 74 28 20 69 54 65 72      assert( iTer
199c0 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29  m<pNew->nLSlot )
199d0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
199e0 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20  aLTerm[iTerm] = 
199f0 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69  pTerm;.        i
19a00 66 28 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20  f( iTerm>mxTerm 
19a10 29 20 6d 78 54 65 72 6d 20 3d 20 69 54 65 72 6d  ) mxTerm = iTerm
19a20 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
19a30 73 65 28 20 69 54 65 72 6d 3d 3d 31 35 20 29 3b  se( iTerm==15 );
19a40 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
19a50 65 28 20 69 54 65 72 6d 3d 3d 31 36 20 29 3b 0a  e( iTerm==16 );.
19a60 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72          if( iTer
19a70 6d 3c 31 36 20 26 26 20 70 55 73 61 67 65 5b 69  m<16 && pUsage[i
19a80 5d 2e 6f 6d 69 74 20 29 20 70 4e 65 77 2d 3e 75  ].omit ) pNew->u
19a90 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c  .vtab.omitMask |
19aa0 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a 20 20 20 20  = 1<<iTerm;.    
19ab0 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
19ac0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
19ad0 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  N)!=0 ){.       
19ae0 20 20 20 69 66 28 20 70 55 73 61 67 65 5b 69 5d     if( pUsage[i]
19af0 2e 6f 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  .omit==0 ){.    
19b00 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
19b10 74 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  t attempt to use
19b20 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   an IN constrain
19b30 74 20 69 66 20 74 68 65 20 76 69 72 74 75 61 6c  t if the virtual
19b40 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20   table.         
19b50 20 20 20 2a 2a 20 73 61 79 73 20 74 68 61 74 20     ** says that 
19b60 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 45  the equivalent E
19b70 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e  Q constraint can
19b80 6e 6f 74 20 62 65 20 73 61 66 65 6c 79 20 6f 6d  not be safely om
19b90 69 74 74 65 64 2e 0a 20 20 20 20 20 20 20 20 20  itted..         
19ba0 20 20 20 2a 2a 20 49 66 20 77 65 20 64 6f 20 61     ** If we do a
19bb0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 73 75  ttempt to use su
19bc0 63 68 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c  ch a constraint,
19bd0 20 73 6f 6d 65 20 72 6f 77 73 20 6d 69 67 68 74   some rows might
19be0 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 20 20   be.            
19bf0 2a 2a 20 72 65 70 65 61 74 65 64 20 69 6e 20 74  ** repeated in t
19c00 68 65 20 6f 75 74 70 75 74 2e 20 2a 2f 0a 20 20  he output. */.  
19c10 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
19c20 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
19c30 20 20 20 20 20 20 20 2f 2a 20 41 20 76 69 72 74         /* A virt
19c40 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 69  ual table that i
19c50 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79  s constrained by
19c60 20 61 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d 61   an IN clause ma
19c70 79 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 20 20  y not.          
19c80 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f  ** consume the O
19c90 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 62  RDER BY clause b
19ca0 65 63 61 75 73 65 20 28 31 29 20 74 68 65 20 6f  ecause (1) the o
19cb0 72 64 65 72 20 6f 66 20 49 4e 20 74 65 72 6d 73  rder of IN terms
19cc0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73  .          ** is
19cd0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
19ce0 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20   related to the 
19cf0 6f 72 64 65 72 20 6f 66 20 6f 75 74 70 75 74 20  order of output 
19d00 74 65 72 6d 73 20 61 6e 64 0a 20 20 20 20 20 20  terms and.      
19d10 20 20 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69      ** (2) Multi
19d20 70 6c 65 20 6f 75 74 70 75 74 73 20 66 72 6f 6d  ple outputs from
19d30 20 61 20 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c   a single IN val
19d40 75 65 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67  ue will not merg
19d50 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  e.          ** t
19d60 6f 67 65 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20  ogether.  */.   
19d70 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d         pIdxInfo-
19d80 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
19d90 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
19da0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19db0 20 20 69 66 28 20 69 3e 3d 6e 43 6f 6e 73 74 72    if( i>=nConstr
19dc0 61 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 70 4e  aint ){.      pN
19dd0 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78 54  ew->nLTerm = mxT
19de0 65 72 6d 2b 31 3b 0a 20 20 20 20 20 20 61 73 73  erm+1;.      ass
19df0 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  ert( pNew->nLTer
19e00 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20  m<=pNew->nLSlot 
19e10 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  );.      pNew->u
19e20 2e 76 74 61 62 2e 69 64 78 4e 75 6d 20 3d 20 70  .vtab.idxNum = p
19e30 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b  IdxInfo->idxNum;
19e40 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76  .      pNew->u.v
19e50 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 70  tab.needFree = p
19e60 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
19e70 72 65 65 49 64 78 53 74 72 3b 0a 20 20 20 20 20  reeIdxStr;.     
19e80 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
19e90 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b  oFreeIdxStr = 0;
19ea0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76  .      pNew->u.v
19eb0 74 61 62 2e 69 64 78 53 74 72 20 3d 20 70 49 64  tab.idxStr = pId
19ec0 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 3b 0a 20  xInfo->idxStr;. 
19ed0 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61       pNew->u.vta
19ee0 62 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 28 69  b.isOrdered = (i
19ef0 38 29 28 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64  8)(pIdxInfo->ord
19f00 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3f 0a 20  erByConsumed ?. 
19f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f30 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e       pIdxInfo->n
19f40 4f 72 64 65 72 42 79 20 3a 20 30 29 3b 0a 20 20  OrderBy : 0);.  
19f50 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
19f60 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 0;.      pNew
19f70 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33  ->rRun = sqlite3
19f80 4c 6f 67 45 73 74 46 72 6f 6d 44 6f 75 62 6c 65  LogEstFromDouble
19f90 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d  (pIdxInfo->estim
19fa0 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 20 20 20  atedCost);.     
19fb0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71   pNew->nOut = sq
19fc0 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 49 64 78  lite3LogEst(pIdx
19fd0 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52  Info->estimatedR
19fe0 6f 77 73 29 3b 0a 20 20 20 20 20 20 77 68 65 72  ows);.      wher
19ff0 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
1a000 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
1a010 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76     if( pNew->u.v
1a020 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a  tab.needFree ){.
1a030 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1a040 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61  free(pNew->u.vta
1a050 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20  b.idxStr);.     
1a060 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
1a070 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
1a080 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
1a090 20 0a 0a 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   ..whereLoopAddV
1a0a0 74 61 62 5f 65 78 69 74 3a 0a 20 20 69 66 28 20  tab_exit:.  if( 
1a0b0 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
1a0c0 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71 6c  FreeIdxStr ) sql
1a0d0 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e  ite3_free(pIdxIn
1a0e0 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73  fo->idxStr);.  s
1a0f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1a100 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72 65   pIdxInfo);.  re
1a110 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
1a120 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1a130 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
1a140 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72  ../*.** Add Wher
1a150 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20 74 6f  eLoop entries to
1a160 20 68 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73   handle OR terms
1a170 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 66 6f  .  This works fo
1a180 72 20 65 69 74 68 65 72 0a 2a 2a 20 62 74 72 65  r either.** btre
1a190 65 73 20 6f 72 20 76 69 72 74 75 61 6c 20 74 61  es or virtual ta
1a1a0 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bles..*/.static 
1a1b0 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
1a1c0 4f 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  Or(.  WhereLoopB
1a1d0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
1a1e0 2c 20 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78  , .  Bitmask mEx
1a1f0 74 72 61 2c 20 0a 20 20 42 69 74 6d 61 73 6b 20  tra, .  Bitmask 
1a200 6d 55 6e 75 73 61 62 6c 65 0a 29 7b 0a 20 20 57  mUnusable.){.  W
1a210 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
1a220 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
1a230 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43 6c 61 75  nfo;.  WhereClau
1a240 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65  se *pWC;.  Where
1a250 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68  Loop *pNew;.  Wh
1a260 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
1a270 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72  *pWCEnd;.  int r
1a280 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1a290 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 57 68 65   int iCur;.  Whe
1a2a0 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43 3b  reClause tempWC;
1a2b0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
1a2c0 64 65 72 20 73 53 75 62 42 75 69 6c 64 3b 0a 20  der sSubBuild;. 
1a2d0 20 57 68 65 72 65 4f 72 53 65 74 20 73 53 75 6d   WhereOrSet sSum
1a2e0 2c 20 73 43 75 72 3b 0a 20 20 73 74 72 75 63 74  , sCur;.  struct
1a2f0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1a300 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57 43 20 3d  Item;.  .  pWC =
1a310 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
1a320 20 20 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e    pWCEnd = pWC->
1a330 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a  a + pWC->nTerm;.
1a340 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65    pNew = pBuilde
1a350 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65 6d 73 65  r->pNew;.  memse
1a360 74 28 26 73 53 75 6d 2c 20 30 2c 20 73 69 7a 65  t(&sSum, 0, size
1a370 6f 66 28 73 53 75 6d 29 29 3b 0a 20 20 70 49 74  of(sSum));.  pIt
1a380 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  em = pWInfo->pTa
1a390 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d  bList->a + pNew-
1a3a0 3e 69 54 61 62 3b 0a 20 20 69 43 75 72 20 3d 20  >iTab;.  iCur = 
1a3b0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  pItem->iCursor;.
1a3c0 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
1a3d0 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
1a3e0 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
1a3f0 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  OK; pTerm++){.  
1a400 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
1a410 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29  perator & WO_OR)
1a420 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65  !=0.     && (pTe
1a430 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69  rm->u.pOrInfo->i
1a440 6e 64 65 78 61 62 6c 65 20 26 20 70 4e 65 77 2d  ndexable & pNew-
1a450 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20  >maskSelf)!=0 . 
1a460 20 20 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72     ){.      Wher
1a470 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20  eClause * const 
1a480 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e  pOrWC = &pTerm->
1a490 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20  u.pOrInfo->wc;. 
1a4a0 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
1a4b0 20 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20   const pOrWCEnd 
1a4c0 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57  = &pOrWC->a[pOrW
1a4d0 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20  C->nTerm];.     
1a4e0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54   WhereTerm *pOrT
1a4f0 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f  erm;.      int o
1a500 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  nce = 1;.      i
1a510 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 0a 20 20  nt i, j;.    .  
1a520 20 20 20 20 73 53 75 62 42 75 69 6c 64 20 3d 20      sSubBuild = 
1a530 2a 70 42 75 69 6c 64 65 72 3b 0a 20 20 20 20 20  *pBuilder;.     
1a540 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 64 65   sSubBuild.pOrde
1a550 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  rBy = 0;.      s
1a560 53 75 62 42 75 69 6c 64 2e 70 4f 72 53 65 74 20  SubBuild.pOrSet 
1a570 3d 20 26 73 43 75 72 3b 0a 0a 20 20 20 20 20 20  = &sCur;..      
1a580 57 48 45 52 45 54 52 41 43 45 28 30 78 32 30 30  WHERETRACE(0x200
1a590 2c 20 28 22 42 65 67 69 6e 20 70 72 6f 63 65 73  , ("Begin proces
1a5a0 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 25  sing OR-clause %
1a5b0 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20  p\n", pTerm));. 
1a5c0 20 20 20 20 20 66 6f 72 28 70 4f 72 54 65 72 6d       for(pOrTerm
1a5d0 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65  =pOrWC->a; pOrTe
1a5e0 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72  rm<pOrWCEnd; pOr
1a5f0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
1a600 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65   if( (pOrTerm->e
1a610 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e  Operator & WO_AN
1a620 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  D)!=0 ){.       
1a630 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43     sSubBuild.pWC
1a640 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70   = &pOrTerm->u.p
1a650 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  AndInfo->wc;.   
1a660 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1a670 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
1a680 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20 20  or==iCur ){.    
1a690 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 57 49        tempWC.pWI
1a6a0 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66  nfo = pWC->pWInf
1a6b0 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  o;.          tem
1a6c0 70 57 43 2e 70 4f 75 74 65 72 20 3d 20 70 57 43  pWC.pOuter = pWC
1a6d0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
1a6e0 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a  WC.op = TK_AND;.
1a6f0 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
1a700 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  .nTerm = 1;.    
1a710 20 20 20 20 20 20 74 65 6d 70 57 43 2e 61 20 3d        tempWC.a =
1a720 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20   pOrTerm;.      
1a730 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57      sSubBuild.pW
1a740 43 20 3d 20 26 74 65 6d 70 57 43 3b 0a 20 20 20  C = &tempWC;.   
1a750 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1a760 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1a770 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a780 20 20 73 43 75 72 2e 6e 20 3d 20 30 3b 0a 23 69    sCur.n = 0;.#i
1a790 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
1a7a0 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20  ENABLED.        
1a7b0 57 48 45 52 45 54 52 41 43 45 28 30 78 32 30 30  WHERETRACE(0x200
1a7c0 2c 20 28 22 4f 52 2d 74 65 72 6d 20 25 64 20 6f  , ("OR-term %d o
1a7d0 66 20 25 70 20 68 61 73 20 25 64 20 73 75 62 74  f %p has %d subt
1a7e0 65 72 6d 73 3a 5c 6e 22 2c 20 0a 20 20 20 20 20  erms:\n", .     
1a7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
1a800 6e 74 29 28 70 4f 72 54 65 72 6d 2d 70 4f 72 57  nt)(pOrTerm-pOrW
1a810 43 2d 3e 61 29 2c 20 70 54 65 72 6d 2c 20 73 53  C->a), pTerm, sS
1a820 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e 6e 54 65  ubBuild.pWC->nTe
1a830 72 6d 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  rm));.        if
1a840 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
1a850 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20  ace & 0x400 ){. 
1a860 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
1a870 3b 20 69 3c 73 53 75 62 42 75 69 6c 64 2e 70 57  ; i<sSubBuild.pW
1a880 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a  C->nTerm; i++){.
1a890 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
1a8a0 65 54 65 72 6d 50 72 69 6e 74 28 26 73 53 75 62  eTermPrint(&sSub
1a8b0 42 75 69 6c 64 2e 70 57 43 2d 3e 61 5b 69 5d 2c  Build.pWC->a[i],
1a8c0 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   i);.          }
1a8d0 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
1a8e0 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
1a8f0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1a900 4c 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  LE.        if( I
1a910 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e  sVirtual(pItem->
1a920 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
1a930 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
1a940 70 41 64 64 56 69 72 74 75 61 6c 28 26 73 53 75  pAddVirtual(&sSu
1a950 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 2c 20  bBuild, mExtra, 
1a960 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20  mUnusable);.    
1a970 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
1a980 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
1a990 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1a9a0 6f 6f 70 41 64 64 42 74 72 65 65 28 26 73 53 75  oopAddBtree(&sSu
1a9b0 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b  bBuild, mExtra);
1a9c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a9d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1a9e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1a9f0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1aa00 41 64 64 4f 72 28 26 73 53 75 62 42 75 69 6c 64  AddOr(&sSubBuild
1aa10 2c 20 6d 45 78 74 72 61 2c 20 6d 55 6e 75 73 61  , mExtra, mUnusa
1aa20 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ble);.        }.
1aa30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1aa40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
1aa50 20 73 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20   sCur.n==0 );.  
1aa60 20 20 20 20 20 20 69 66 28 20 73 43 75 72 2e 6e        if( sCur.n
1aa70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1aa80 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20   sSum.n = 0;.   
1aa90 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1aaa0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1aab0 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  once ){.        
1aac0 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73    whereOrMove(&s
1aad0 53 75 6d 2c 20 26 73 43 75 72 29 3b 0a 20 20 20  Sum, &sCur);.   
1aae0 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b         once = 0;
1aaf0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1ab00 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 4f            WhereO
1ab10 72 53 65 74 20 73 50 72 65 76 3b 0a 20 20 20 20  rSet sPrev;.    
1ab20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76        whereOrMov
1ab30 65 28 26 73 50 72 65 76 2c 20 26 73 53 75 6d 29  e(&sPrev, &sSum)
1ab40 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 6d  ;.          sSum
1ab50 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  .n = 0;.        
1ab60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72    for(i=0; i<sPr
1ab70 65 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ev.n; i++){.    
1ab80 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
1ab90 20 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b   j<sCur.n; j++){
1aba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  .              w
1abb0 68 65 72 65 4f 72 49 6e 73 65 72 74 28 26 73 53  hereOrInsert(&sS
1abc0 75 6d 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70  um, sPrev.a[i].p
1abd0 72 65 72 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a  rereq | sCur.a[j
1abe0 5d 2e 70 72 65 72 65 71 2c 0a 20 20 20 20 20 20  ].prereq,.      
1abf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac00 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67        sqlite3Log
1ac10 45 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69  EstAdd(sPrev.a[i
1ac20 5d 2e 72 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a  ].rRun, sCur.a[j
1ac30 5d 2e 72 52 75 6e 29 2c 0a 20 20 20 20 20 20 20  ].rRun),.       
1ac40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac50 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45       sqlite3LogE
1ac60 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d  stAdd(sPrev.a[i]
1ac70 2e 6e 4f 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d  .nOut, sCur.a[j]
1ac80 2e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 20  .nOut));.       
1ac90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1aca0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1acb0 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d     }.      pNew-
1acc0 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  >nLTerm = 1;.   
1acd0 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
1ace0 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
1acf0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
1ad00 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  = WHERE_MULTI_OR
1ad10 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53  ;.      pNew->rS
1ad20 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  etup = 0;.      
1ad30 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
1ad40 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   0;.      memset
1ad50 28 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69  (&pNew->u, 0, si
1ad60 7a 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a  zeof(pNew->u));.
1ad70 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72        for(i=0; r
1ad80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1ad90 69 3c 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a  i<sSum.n; i++){.
1ada0 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
1adb0 47 3a 20 43 75 72 72 65 6e 74 6c 79 20 73 53 75  G: Currently sSu
1adc0 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 69 73 20 73  m.a[i].rRun is s
1add0 65 74 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66  et to the sum of
1ade0 20 74 68 65 20 63 6f 73 74 73 0a 20 20 20 20 20   the costs.     
1adf0 20 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 73 75 62     ** of all sub
1ae00 2d 73 63 61 6e 73 20 72 65 71 75 69 72 65 64 20  -scans required 
1ae10 62 79 20 74 68 65 20 4f 52 2d 73 63 61 6e 2e 20  by the OR-scan. 
1ae20 48 6f 77 65 76 65 72 2c 20 64 75 65 20 74 6f 20  However, due to 
1ae30 72 6f 75 6e 64 69 6e 67 0a 20 20 20 20 20 20 20  rounding.       
1ae40 20 2a 2a 20 65 72 72 6f 72 73 2c 20 69 74 20 6d   ** errors, it m
1ae50 61 79 20 62 65 20 74 68 61 74 20 74 68 65 20 63  ay be that the c
1ae60 6f 73 74 20 6f 66 20 74 68 65 20 4f 52 2d 73 63  ost of the OR-sc
1ae70 61 6e 20 69 73 20 65 71 75 61 6c 20 74 6f 20 69  an is equal to i
1ae80 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f  ts.        ** mo
1ae90 73 74 20 65 78 70 65 6e 73 69 76 65 20 73 75 62  st expensive sub
1aea0 2d 73 63 61 6e 2e 20 41 64 64 20 74 68 65 20 73  -scan. Add the s
1aeb0 6d 61 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c 65  mallest possible
1aec0 20 70 65 6e 61 6c 74 79 20 0a 20 20 20 20 20 20   penalty .      
1aed0 20 20 2a 2a 20 28 65 71 75 69 76 61 6c 65 6e 74    ** (equivalent
1aee0 20 74 6f 20 6d 75 6c 74 69 70 6c 79 69 6e 67 20   to multiplying 
1aef0 74 68 65 20 63 6f 73 74 20 62 79 20 31 2e 30 37  the cost by 1.07
1af00 29 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  ) to ensure that
1af10 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69   .        ** thi
1af20 73 20 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65  s does not happe
1af30 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f  n. Otherwise, fo
1af40 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 20  r WHERE clauses 
1af50 73 75 63 68 20 61 73 20 74 68 65 0a 20 20 20 20  such as the.    
1af60 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
1af70 20 77 68 65 72 65 20 74 68 65 72 65 20 69 73 20   where there is 
1af80 61 6e 20 69 6e 64 65 78 20 6f 6e 20 22 79 22 3a  an index on "y":
1af90 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1afa0 20 20 20 20 2a 2a 20 20 20 20 20 57 48 45 52 45      **     WHERE
1afb0 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c   likelihood(x=?,
1afc0 20 30 2e 39 39 29 20 4f 52 20 79 3d 3f 0a 20 20   0.99) OR y=?.  
1afd0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
1afe0 20 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20   ** the planner 
1aff0 6d 61 79 20 65 6c 65 63 74 20 74 6f 20 22 4f 52  may elect to "OR
1b000 22 20 74 6f 67 65 74 68 65 72 20 61 20 66 75 6c  " together a ful
1b010 6c 2d 74 61 62 6c 65 20 73 63 61 6e 20 61 6e 64  l-table scan and
1b020 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69   an.        ** i
1b030 6e 64 65 78 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64  ndex lookup. And
1b040 20 6f 74 68 65 72 20 73 69 6d 69 6c 61 72 6c 79   other similarly
1b050 20 6f 64 64 20 72 65 73 75 6c 74 73 2e 20 20 2a   odd results.  *
1b060 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
1b070 72 52 75 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d  rRun = sSum.a[i]
1b080 2e 72 52 75 6e 20 2b 20 31 3b 0a 20 20 20 20 20  .rRun + 1;.     
1b090 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
1b0a0 73 53 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a  sSum.a[i].nOut;.
1b0b0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72          pNew->pr
1b0c0 65 72 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d  ereq = sSum.a[i]
1b0d0 2e 70 72 65 72 65 71 3b 0a 20 20 20 20 20 20 20  .prereq;.       
1b0e0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
1b0f0 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
1b100 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pNew);.      }. 
1b110 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
1b120 30 78 32 30 30 2c 20 28 22 45 6e 64 20 70 72 6f  0x200, ("End pro
1b130 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73  cessing OR-claus
1b140 65 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29  e %p\n", pTerm))
1b150 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1b160 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1b170 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c  * Add all WhereL
1b180 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  oop objects for 
1b190 61 6c 6c 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73  all tables .*/.s
1b1a0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
1b1b0 6f 6f 70 41 64 64 41 6c 6c 28 57 68 65 72 65 4c  oopAddAll(WhereL
1b1c0 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
1b1d0 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e  lder){.  WhereIn
1b1e0 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75  fo *pWInfo = pBu
1b1f0 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
1b200 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 20   Bitmask mExtra 
1b210 3d 20 30 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  = 0;.  Bitmask m
1b220 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74  Prior = 0;.  int
1b230 20 69 54 61 62 3b 0a 20 20 53 72 63 4c 69 73 74   iTab;.  SrcList
1b240 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49   *pTabList = pWI
1b250 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  nfo->pTabList;. 
1b260 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1b270 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73  item *pItem;.  s
1b280 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1b290 65 6d 20 2a 70 45 6e 64 20 3d 20 26 70 54 61 62  em *pEnd = &pTab
1b2a0 4c 69 73 74 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e  List->a[pWInfo->
1b2b0 6e 4c 65 76 65 6c 5d 3b 0a 20 20 73 71 6c 69 74  nLevel];.  sqlit
1b2c0 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d  e3 *db = pWInfo-
1b2d0 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69  >pParse->db;.  i
1b2e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1b2f0 4b 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  K;.  WhereLoop *
1b300 70 4e 65 77 3b 0a 20 20 75 38 20 70 72 69 6f 72  pNew;.  u8 prior
1b310 4a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 0a 20  Jointype = 0;.. 
1b320 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68   /* Loop over th
1b330 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  e tables in the 
1b340 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20  join, from left 
1b350 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e  to right */.  pN
1b360 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
1b370 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  New;.  whereLoop
1b380 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f  Init(pNew);.  fo
1b390 72 28 69 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d  r(iTab=0, pItem=
1b3a0 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74  pTabList->a; pIt
1b3b0 65 6d 3c 70 45 6e 64 3b 20 69 54 61 62 2b 2b 2c  em<pEnd; iTab++,
1b3c0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 42   pItem++){.    B
1b3d0 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65  itmask mUnusable
1b3e0 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
1b3f0 69 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20  iTab = iTab;.   
1b400 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20   pNew->maskSelf 
1b410 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65  = sqlite3WhereGe
1b420 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
1b430 4d 61 73 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e  MaskSet, pItem->
1b440 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66  iCursor);.    if
1b450 28 20 28 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f  ( ((pItem->fg.jo
1b460 69 6e 74 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e  intype|priorJoin
1b470 74 79 70 65 29 20 26 20 28 4a 54 5f 4c 45 46 54  type) & (JT_LEFT
1b480 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 20 29  |JT_CROSS))!=0 )
1b490 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
1b4a0 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75  condition is tru
1b4b0 65 20 77 68 65 6e 20 70 49 74 65 6d 20 69 73 20  e when pItem is 
1b4c0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1b4d0 74 65 72 6d 20 6f 6e 20 74 68 65 0a 20 20 20 20  term on the.    
1b4e0 20 20 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 2d    ** right-hand-
1b4f0 73 69 64 65 20 6f 66 20 61 20 4c 45 46 54 20 6f  side of a LEFT o
1b500 72 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 20 2a  r CROSS JOIN.  *
1b510 2f 0a 20 20 20 20 20 20 6d 45 78 74 72 61 20 3d  /.      mExtra =
1b520 20 6d 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20   mPrior;.    }. 
1b530 20 20 20 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65     priorJointype
1b540 20 3d 20 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69   = pItem->fg.joi
1b550 6e 74 79 70 65 3b 0a 20 20 20 20 69 66 28 20 49  ntype;.    if( I
1b560 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e  sVirtual(pItem->
1b570 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 73  pTab) ){.      s
1b580 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1b590 65 6d 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72  em *p;.      for
1b5a0 28 70 3d 26 70 49 74 65 6d 5b 31 5d 3b 20 70 3c  (p=&pItem[1]; p<
1b5b0 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20  pEnd; p++){.    
1b5c0 20 20 20 20 69 66 28 20 6d 55 6e 75 73 61 62 6c      if( mUnusabl
1b5d0 65 20 7c 7c 20 28 70 2d 3e 66 67 2e 6a 6f 69 6e  e || (p->fg.join
1b5e0 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c  type & (JT_LEFT|
1b5f0 4a 54 5f 43 52 4f 53 53 29 29 20 29 7b 0a 20 20  JT_CROSS)) ){.  
1b600 20 20 20 20 20 20 20 20 6d 55 6e 75 73 61 62 6c          mUnusabl
1b610 65 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72  e |= sqlite3Wher
1b620 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f  eGetMask(&pWInfo
1b630 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69  ->sMaskSet, p->i
1b640 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20  Cursor);.       
1b650 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1b660 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1b670 64 64 56 69 72 74 75 61 6c 28 70 42 75 69 6c 64  ddVirtual(pBuild
1b680 65 72 2c 20 6d 45 78 74 72 61 2c 20 6d 55 6e 75  er, mExtra, mUnu
1b690 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d 65 6c 73  sable);.    }els
1b6a0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  e{.      rc = wh
1b6b0 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
1b6c0 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61  pBuilder, mExtra
1b6d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1b6e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1b6f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  {.      rc = whe
1b700 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75 69  reLoopAddOr(pBui
1b710 6c 64 65 72 2c 20 6d 45 78 74 72 61 2c 20 6d 55  lder, mExtra, mU
1b720 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a  nusable);.    }.
1b730 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e      mPrior |= pN
1b740 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  ew->maskSelf;.  
1b750 20 20 69 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e    if( rc || db->
1b760 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62  mallocFailed ) b
1b770 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 65  reak;.  }..  whe
1b780 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20  reLoopClear(db, 
1b790 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20  pNew);.  return 
1b7a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61  rc;.}../*.** Exa
1b7b0 6d 69 6e 65 20 61 20 57 68 65 72 65 50 61 74 68  mine a WherePath
1b7c0 20 28 77 69 74 68 20 74 68 65 20 61 64 64 69 74   (with the addit
1b7d0 69 6f 6e 20 6f 66 20 74 68 65 20 65 78 74 72 61  ion of the extra
1b7e0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68   WhereLoop of th
1b7f0 65 20 35 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74  e 5th.** paramet
1b800 65 72 73 29 20 74 6f 20 73 65 65 20 69 66 20 69  ers) to see if i
1b810 74 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69  t outputs rows i
1b820 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
1b830 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20  ORDER BY.** (or 
1b840 47 52 4f 55 50 20 42 59 29 20 77 69 74 68 6f 75  GROUP BY) withou
1b850 74 20 72 65 71 75 69 72 69 6e 67 20 61 20 73 65  t requiring a se
1b860 70 61 72 61 74 65 20 73 6f 72 74 20 6f 70 65 72  parate sort oper
1b870 61 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 4e  ation.  Return N
1b880 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20  :.** .**   N>0: 
1b890 20 20 4e 20 74 65 72 6d 73 20 6f 66 20 74 68 65    N terms of the
1b8a0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1b8b0 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a   are satisfied.*
1b8c0 2a 20 20 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65  *   N==0:  No te
1b8d0 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
1b8e0 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 73   BY clause are s
1b8f0 61 74 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3c  atisfied.**   N<
1b900 30 3a 20 20 20 55 6e 6b 6e 6f 77 6e 20 79 65 74  0:   Unknown yet
1b910 20 68 6f 77 20 6d 61 6e 79 20 74 65 72 6d 73 20   how many terms 
1b920 6f 66 20 4f 52 44 45 52 20 42 59 20 6d 69 67 68  of ORDER BY migh
1b930 74 20 62 65 20 73 61 74 69 73 66 69 65 64 2e 20  t be satisfied. 
1b940 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68    .**.** Note th
1b950 61 74 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  at processing fo
1b960 72 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  r WHERE_GROUPBY 
1b970 61 6e 64 20 57 48 45 52 45 5f 44 49 53 54 49 4e  and WHERE_DISTIN
1b980 43 54 42 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a  CTBY is not as.*
1b990 2a 20 73 74 72 69 63 74 2e 20 20 57 69 74 68 20  * strict.  With 
1b9a0 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53  GROUP BY and DIS
1b9b0 54 49 4e 43 54 20 74 68 65 20 6f 6e 6c 79 20 72  TINCT the only r
1b9c0 65 71 75 69 72 65 6d 65 6e 74 20 69 73 20 74 68  equirement is th
1b9d0 61 74 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74  at.** equivalent
1b9e0 20 72 6f 77 73 20 61 70 70 65 61 72 20 69 6d 6d   rows appear imm
1b9f0 65 64 69 61 74 65 6c 79 20 61 64 6a 61 63 65 6e  ediately adjacen
1ba00 74 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72  t to one another
1ba10 2e 20 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61  .  GROUP BY.** a
1ba20 6e 64 20 44 49 53 54 49 4e 43 54 20 64 6f 20 6e  nd DISTINCT do n
1ba30 6f 74 20 72 65 71 75 69 72 65 20 72 6f 77 73 20  ot require rows 
1ba40 74 6f 20 61 70 70 65 61 72 20 69 6e 20 61 6e 79  to appear in any
1ba50 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65   particular orde
1ba60 72 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20  r as long.** as 
1ba70 65 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73 20  equivalent rows 
1ba80 61 72 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65  are grouped toge
1ba90 74 68 65 72 2e 20 20 54 68 75 73 20 66 6f 72 20  ther.  Thus for 
1baa0 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53  GROUP BY and DIS
1bab0 54 49 4e 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72  TINCT.** the pOr
1bac0 64 65 72 42 79 20 74 65 72 6d 73 20 63 61 6e 20  derBy terms can 
1bad0 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20 61 6e  be matched in an
1bae0 79 20 6f 72 64 65 72 2e 20 20 57 69 74 68 20 4f  y order.  With O
1baf0 52 44 45 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a  RDER BY, the .**
1bb00 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20   pOrderBy terms 
1bb10 6d 75 73 74 20 62 65 20 6d 61 74 63 68 65 64 20  must be matched 
1bb20 69 6e 20 73 74 72 69 63 74 20 6c 65 66 74 2d 74  in strict left-t
1bb30 6f 2d 72 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a  o-right order..*
1bb40 2f 0a 73 74 61 74 69 63 20 69 38 20 77 68 65 72  /.static i8 wher
1bb50 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
1bb60 64 65 72 42 79 28 0a 20 20 57 68 65 72 65 49 6e  derBy(.  WhereIn
1bb70 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f  fo *pWInfo,    /
1bb80 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
1bb90 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
1bba0 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a   *pOrderBy,   /*
1bbb0 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
1bbc0 55 50 20 42 59 20 6f 72 20 44 49 53 54 49 4e 43  UP BY or DISTINC
1bbd0 54 20 63 6c 61 75 73 65 20 74 6f 20 63 68 65 63  T clause to chec
1bbe0 6b 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  k */.  WherePath
1bbf0 20 2a 70 50 61 74 68 2c 20 20 20 20 20 2f 2a 20   *pPath,     /* 
1bc00 54 68 65 20 57 68 65 72 65 50 61 74 68 20 74 6f  The WherePath to
1bc10 20 63 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20   check */.  u16 
1bc20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20  wctrlFlags,     
1bc30 20 20 2f 2a 20 4d 69 67 68 74 20 63 6f 6e 74 61    /* Might conta
1bc40 69 6e 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59  in WHERE_GROUPBY
1bc50 20 6f 72 20 57 48 45 52 45 5f 44 49 53 54 49 4e   or WHERE_DISTIN
1bc60 43 54 42 59 20 2a 2f 0a 20 20 75 31 36 20 6e 4c  CTBY */.  u16 nL
1bc70 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  oop,            
1bc80 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
1bc90 72 69 65 73 20 69 6e 20 70 50 61 74 68 2d 3e 61  ries in pPath->a
1bca0 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  Loop[] */.  Wher
1bcb0 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20  eLoop *pLast,   
1bcc0 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 57 68    /* Add this Wh
1bcd0 65 72 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65  ereLoop to the e
1bce0 6e 64 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f  nd of pPath->aLo
1bcf0 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73  op[] */.  Bitmas
1bd00 6b 20 2a 70 52 65 76 4d 61 73 6b 20 20 20 20 20  k *pRevMask     
1bd10 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20  /* OUT: Mask of 
1bd20 57 68 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75  WhereLoops to ru
1bd30 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
1bd40 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65  er */.){.  u8 re
1bd50 76 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  vSet;           
1bd60 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 76 20   /* True if rev 
1bd70 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38  is known */.  u8
1bd80 20 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20   rev;           
1bd90 20 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65      /* Composite
1bda0 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20   sort order */. 
1bdb0 20 75 38 20 72 65 76 49 64 78 3b 20 20 20 20 20   u8 revIdx;     
1bdc0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1bdd0 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20  sort order */.  
1bde0 75 38 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  u8 isOrderDistin
1bdf0 63 74 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69  ct;   /* All pri
1be00 6f 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 61 72  or WhereLoops ar
1be10 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  e order-distinct
1be20 20 2a 2f 0a 20 20 75 38 20 64 69 73 74 69 6e 63   */.  u8 distinc
1be30 74 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54  tColumns;   /* T
1be40 72 75 65 20 69 66 20 74 68 65 20 6c 6f 6f 70 20  rue if the loop 
1be50 68 61 73 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e  has UNIQUE NOT N
1be60 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ULL columns */. 
1be70 20 75 38 20 69 73 4d 61 74 63 68 3b 20 20 20 20   u8 isMatch;    
1be80 20 20 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d         /* iColum
1be90 6e 20 6d 61 74 63 68 65 73 20 61 20 74 65 72 6d  n matches a term
1bea0 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
1beb0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36   clause */.  u16
1bec0 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20   nKeyCol;       
1bed0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1bee0 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70  key columns in p
1bef0 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e  Index */.  u16 n
1bf00 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
1bf10 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
1bf20 20 6f 66 20 6f 72 64 65 72 65 64 20 63 6f 6c 75   of ordered colu
1bf30 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
1bf40 20 2a 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65 72   */.  u16 nOrder
1bf50 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  By;         /* N
1bf60 75 6d 62 65 72 20 74 65 72 6d 73 20 69 6e 20 74  umber terms in t
1bf70 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1bf80 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f  se */.  int iLoo
1bf90 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
1bfa0 20 49 6e 64 65 78 20 6f 66 20 57 68 65 72 65 4c   Index of WhereL
1bfb0 6f 6f 70 20 69 6e 20 70 50 61 74 68 20 62 65 69  oop in pPath bei
1bfc0 6e 67 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  ng processed */.
1bfd0 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
1bfe0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1bff0 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
1c000 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20  t iCur;         
1c010 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
1c020 6d 62 65 72 20 66 6f 72 20 63 75 72 72 65 6e 74  mber for current
1c030 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20   WhereLoop */.  
1c040 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20  int iColumn;    
1c050 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d        /* A colum
1c060 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20  n number within 
1c070 74 61 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20  table iCur */.  
1c080 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
1c090 20 3d 20 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74   = 0; /* Current
1c0a0 20 57 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67   WhereLoop being
1c0b0 20 70 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20   processed. */. 
1c0c0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
1c0d0 6d 3b 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67  m;     /* A sing
1c0e0 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  le term of the W
1c0f0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
1c100 20 45 78 70 72 20 2a 70 4f 42 45 78 70 72 3b 20   Expr *pOBExpr; 
1c110 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70         /* An exp
1c120 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65  ression from the
1c130 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1c140 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70   */.  CollSeq *p
1c150 43 6f 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43  Coll;       /* C
1c160 4f 4c 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e 20  OLLATE function 
1c170 66 72 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42 59  from an ORDER BY
1c180 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a   clause term */.
1c190 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
1c1a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
1c1b0 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
1c1c0 77 69 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20  with pLoop */.  
1c1d0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
1c1e0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
1c1f0 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63  ;  /* Database c
1c200 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42  onnection */.  B
1c210 69 74 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20 30  itmask obSat = 0
1c220 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  ;    /* Mask of 
1c230 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 73  ORDER BY terms s
1c240 61 74 69 73 66 69 65 64 20 73 6f 20 66 61 72 20  atisfied so far 
1c250 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 44  */.  Bitmask obD
1c260 6f 6e 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61  one;       /* Ma
1c270 73 6b 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20  sk of all ORDER 
1c280 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69  BY terms */.  Bi
1c290 74 6d 61 73 6b 20 6f 72 64 65 72 44 69 73 74 69  tmask orderDisti
1c2a0 6e 63 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73  nctMask;  /* Mas
1c2b0 6b 20 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72  k of all well-or
1c2c0 64 65 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20  dered loops */. 
1c2d0 20 42 69 74 6d 61 73 6b 20 72 65 61 64 79 3b 20   Bitmask ready; 
1c2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c2f0 4d 61 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f  Mask of inner lo
1c300 6f 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  ops */..  /*.  *
1c310 2a 20 57 65 20 73 61 79 20 74 68 65 20 57 68 65  * We say the Whe
1c320 72 65 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72  reLoop is "one-r
1c330 6f 77 22 20 69 66 20 69 74 20 67 65 6e 65 72 61  ow" if it genera
1c340 74 65 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  tes no more than
1c350 20 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66   one.  ** row of
1c360 20 6f 75 74 70 75 74 2e 20 20 41 20 57 68 65 72   output.  A Wher
1c370 65 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77  eLoop is one-row
1c380 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
1c390 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
1c3a0 65 3a 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c  e:.  **  (a) All
1c3b0 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d   index columns m
1c3c0 61 74 63 68 20 77 69 74 68 20 57 48 45 52 45 5f  atch with WHERE_
1c3d0 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20  COLUMN_EQ..  ** 
1c3e0 20 28 62 29 20 54 68 65 20 69 6e 64 65 78 20 69   (b) The index i
1c3f0 73 20 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e  s unique.  ** An
1c400 79 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68  y WhereLoop with
1c410 20 61 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   an WHERE_COLUMN
1c420 5f 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  _EQ constraint o
1c430 6e 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 6f  n the rowid is o
1c440 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65  ne-row..  ** Eve
1c450 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65  ry one-row Where
1c460 4c 6f 6f 70 20 77 69 6c 6c 20 68 61 76 65 20 74  Loop will have t
1c470 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20  he WHERE_ONEROW 
1c480 62 69 74 20 73 65 74 20 69 6e 20 77 73 46 6c 61  bit set in wsFla
1c490 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65  gs..  **.  ** We
1c4a0 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f   say the WhereLo
1c4b0 6f 70 20 69 73 20 22 6f 72 64 65 72 2d 64 69 73  op is "order-dis
1c4c0 74 69 6e 63 74 22 20 69 66 20 74 68 65 20 73 65  tinct" if the se
1c4d0 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  t of columns fro
1c4e0 6d 0a 20 20 2a 2a 20 74 68 61 74 20 57 68 65 72  m.  ** that Wher
1c4f0 65 4c 6f 6f 70 20 74 68 61 74 20 61 72 65 20 69  eLoop that are i
1c500 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
1c510 6c 61 75 73 65 20 61 72 65 20 64 69 66 66 65 72  lause are differ
1c520 65 6e 74 20 66 6f 72 20 65 76 65 72 79 0a 20 20  ent for every.  
1c530 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 57 68  ** row of the Wh
1c540 65 72 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20  ereLoop.  Every 
1c550 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f  one-row WhereLoo
1c560 70 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  p is automatical
1c570 6c 79 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69  ly.  ** order-di
1c580 73 74 69 6e 63 74 2e 20 20 20 41 20 57 68 65 72  stinct.   A Wher
1c590 65 4c 6f 6f 70 20 74 68 61 74 20 68 61 73 20 6e  eLoop that has n
1c5a0 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  o columns in the
1c5b0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1c5c0 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64  .  ** is not ord
1c5d0 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f 20  er-distinct. To 
1c5e0 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  be order-distinc
1c5f0 74 20 69 73 20 6e 6f 74 20 71 75 69 74 65 20 74  t is not quite t
1c600 68 65 20 73 61 6d 65 20 61 73 20 62 65 69 6e 67  he same as being
1c610 0a 20 20 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e  .  ** UNIQUE sin
1c620 63 65 20 61 20 55 4e 49 51 55 45 20 63 6f 6c 75  ce a UNIQUE colu
1c630 6d 6e 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20  mn or index can 
1c640 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f  have multiple ro
1c650 77 73 20 74 68 61 74 20 0a 20 20 2a 2a 20 61 72  ws that .  ** ar
1c660 65 20 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20  e NULL and NULL 
1c670 76 61 6c 75 65 73 20 61 72 65 20 65 71 75 69 76  values are equiv
1c680 61 6c 65 6e 74 20 66 6f 72 20 74 68 65 20 70 75  alent for the pu
1c690 72 70 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d 64  rpose of order-d
1c6a0 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f  istinct..  ** To
1c6b0 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e   be order-distin
1c6c0 63 74 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  ct, the columns 
1c6d0 6d 75 73 74 20 62 65 20 55 4e 49 51 55 45 20 61  must be UNIQUE a
1c6e0 6e 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a  nd NOT NULL..  *
1c6f0 2a 0a 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64  *.  ** The rowid
1c700 20 66 6f 72 20 61 20 74 61 62 6c 65 20 69 73 20   for a table is 
1c710 61 6c 77 61 79 73 20 55 4e 49 51 55 45 20 61 6e  always UNIQUE an
1c720 64 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68  d NOT NULL so wh
1c730 65 6e 65 76 65 72 20 74 68 65 0a 20 20 2a 2a 20  enever the.  ** 
1c740 72 6f 77 69 64 20 61 70 70 65 61 72 73 20 69 6e  rowid appears in
1c750 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1c760 61 75 73 65 2c 20 74 68 65 20 63 6f 72 72 65 73  ause, the corres
1c770 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f  ponding WhereLoo
1c780 70 20 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61  p is.  ** automa
1c790 74 69 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69  tically order-di
1c7a0 73 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20  stinct..  */..  
1c7b0 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
1c7c0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 4c 6f  !=0 );.  if( nLo
1c7d0 6f 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69  op && Optimizati
1c7e0 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53  onDisabled(db, S
1c7f0 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78  QLITE_OrderByIdx
1c800 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30  Join) ) return 0
1c810 3b 0a 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  ;..  nOrderBy = 
1c820 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
1c830 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 4f 72  .  testcase( nOr
1c840 64 65 72 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a  derBy==BMS-1 );.
1c850 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 3e 42    if( nOrderBy>B
1c860 4d 53 2d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  MS-1 ) return 0;
1c870 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69    /* Cannot opti
1c880 6d 69 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72 67  mize overly larg
1c890 65 20 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a 20  e ORDER BYs */. 
1c8a0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
1c8b0 20 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d   = 1;.  obDone =
1c8c0 20 4d 41 53 4b 42 49 54 28 6e 4f 72 64 65 72 42   MASKBIT(nOrderB
1c8d0 79 29 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69 73  y)-1;.  orderDis
1c8e0 74 69 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20  tinctMask = 0;. 
1c8f0 20 72 65 61 64 79 20 3d 20 30 3b 0a 20 20 66 6f   ready = 0;.  fo
1c900 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64  r(iLoop=0; isOrd
1c910 65 72 44 69 73 74 69 6e 63 74 20 26 26 20 6f 62  erDistinct && ob
1c920 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c  Sat<obDone && iL
1c930 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f  oop<=nLoop; iLoo
1c940 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 4c  p++){.    if( iL
1c950 6f 6f 70 3e 30 20 29 20 72 65 61 64 79 20 7c 3d  oop>0 ) ready |=
1c960 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
1c970 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 69 4c  ;.    pLoop = iL
1c980 6f 6f 70 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61 74  oop<nLoop ? pPat
1c990 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20  h->aLoop[iLoop] 
1c9a0 3a 20 70 4c 61 73 74 3b 0a 20 20 20 20 69 66 28  : pLast;.    if(
1c9b0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1c9c0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
1c9d0 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 69 66  ABLE ){.      if
1c9e0 28 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e  ( pLoop->u.vtab.
1c9f0 69 73 4f 72 64 65 72 65 64 20 29 20 6f 62 53 61  isOrdered ) obSa
1ca00 74 20 3d 20 6f 62 44 6f 6e 65 3b 0a 20 20 20 20  t = obDone;.    
1ca10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1ca20 20 20 20 69 43 75 72 20 3d 20 70 57 49 6e 66 6f     iCur = pWInfo
1ca30 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
1ca40 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73  oop->iTab].iCurs
1ca50 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b  or;..    /* Mark
1ca60 20 6f 66 66 20 61 6e 79 20 4f 52 44 45 52 20 42   off any ORDER B
1ca70 59 20 74 65 72 6d 20 58 20 74 68 61 74 20 69 73  Y term X that is
1ca80 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65   a column in the
1ca90 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a   table of.    **
1caa0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
1cab0 70 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 72  p for which ther
1cac0 65 20 69 73 20 74 65 72 6d 20 69 6e 20 74 68 65  e is term in the
1cad0 20 57 48 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c   WHERE.    ** cl
1cae0 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  ause of the form
1caf0 20 58 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d   X IS NULL or X=
1cb00 3f 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  ? that reference
1cb10 20 6f 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20 20   only outer.    
1cb20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f  ** loops..    */
1cb30 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1cb40 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
1cb50 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49        if( MASKBI
1cb60 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63  T(i) & obSat ) c
1cb70 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
1cb80 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  OBExpr = sqlite3
1cb90 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
1cba0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
1cbb0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Expr);.      if(
1cbc0 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b   pOBExpr->op!=TK
1cbd0 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e  _COLUMN ) contin
1cbe0 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  ue;.      if( pO
1cbf0 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69  BExpr->iTable!=i
1cc00 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Cur ) continue;.
1cc10 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 73 71        pTerm = sq
1cc20 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64 54 65  lite3WhereFindTe
1cc30 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  rm(&pWInfo->sWC,
1cc40 20 69 43 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e   iCur, pOBExpr->
1cc50 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  iColumn,.       
1cc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc70 7e 72 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f  ~ready, WO_EQ|WO
1cc80 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 2c 20 30  _ISNULL|WO_IS, 0
1cc90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
1cca0 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  rm==0 ) continue
1ccb0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65  ;.      if( (pTe
1ccc0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 57  rm->eOperator&(W
1ccd0 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30 20  O_EQ|WO_IS))!=0 
1cce0 26 26 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c  && pOBExpr->iCol
1ccf0 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn>=0 ){.      
1cd00 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31    const char *z1
1cd10 2c 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20 70  , *z2;.        p
1cd20 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1cd30 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f  prCollSeq(pWInfo
1cd40 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  ->pParse, pOrder
1cd50 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
1cd60 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43  .        if( !pC
1cd70 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  oll ) pColl = db
1cd80 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
1cd90 20 20 20 20 20 7a 31 20 3d 20 70 43 6f 6c 6c 2d       z1 = pColl-
1cda0 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
1cdb0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
1cdc0 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66  xprCollSeq(pWInf
1cdd0 6f 2d 3e 70 50 61 72 73 65 2c 20 70 54 65 72 6d  o->pParse, pTerm
1cde0 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
1cdf0 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
1ce00 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
1ce10 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 32  Coll;.        z2
1ce20 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b   = pColl->zName;
1ce30 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
1ce40 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20  ite3StrICmp(z1, 
1ce50 7a 32 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  z2)!=0 ) continu
1ce60 65 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  e;.        testc
1ce70 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70  ase( pTerm->pExp
1ce80 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  r->op==TK_IS );.
1ce90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6f 62        }.      ob
1cea0 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69  Sat |= MASKBIT(i
1ceb0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
1cec0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
1ced0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  s & WHERE_ONEROW
1cee0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
1cef0 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
1cf00 20 26 20 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a   & WHERE_IPK ){.
1cf10 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d          pIndex =
1cf20 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79   0;.        nKey
1cf30 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Col = 0;.       
1cf40 20 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20   nColumn = 1;.  
1cf50 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
1cf60 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75  Index = pLoop->u
1cf70 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d  .btree.pIndex)==
1cf80 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e  0 || pIndex->bUn
1cf90 6f 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20 20  ordered ){.     
1cfa0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1cfb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cfc0 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 70 49 6e 64    nKeyCol = pInd
1cfd0 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20  ex->nKeyCol;.   
1cfe0 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70       nColumn = p
1cff0 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a  Index->nColumn;.
1d000 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1d010 6e 43 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c  nColumn==nKeyCol
1d020 2b 31 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28  +1 || !HasRowid(
1d030 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 20  pIndex->pTable) 
1d040 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1d050 74 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  t( pIndex->aiCol
1d060 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d  umn[nColumn-1]==
1d070 28 2d 31 29 20 7c 7c 20 21 48 61 73 52 6f 77 69  (-1) || !HasRowi
1d080 64 28 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  d(pIndex->pTable
1d090 29 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72  ));.        isOr
1d0a0 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 49 73  derDistinct = Is
1d0b0 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64  UniqueIndex(pInd
1d0c0 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ex);.      }..  
1d0d0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
1d0e0 75 67 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  ugh all columns 
1d0f0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  of the index and
1d100 20 64 65 61 6c 20 77 69 74 68 20 74 68 65 20 6f   deal with the o
1d110 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  nes.      ** tha
1d120 74 20 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74 72  t are not constr
1d130 61 69 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20 49  ained by == or I
1d140 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  N..      */.    
1d150 20 20 72 65 76 20 3d 20 72 65 76 53 65 74 20 3d    rev = revSet =
1d160 20 30 3b 0a 20 20 20 20 20 20 64 69 73 74 69 6e   0;.      distin
1d170 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20  ctColumns = 0;. 
1d180 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
1d190 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20  nColumn; j++){. 
1d1a0 20 20 20 20 20 20 20 75 38 20 62 4f 6e 63 65 3b         u8 bOnce;
1d1b0 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 75     /* True to ru
1d1c0 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 73  n the ORDER BY s
1d1d0 65 61 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20  earch loop */.. 
1d1e0 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f         /* Skip o
1d1f0 76 65 72 20 3d 3d 20 61 6e 64 20 49 53 20 4e 55  ver == and IS NU
1d200 4c 4c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  LL terms */.    
1d210 20 20 20 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d      if( j<pLoop-
1d220 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20  >u.btree.nEq.   
1d230 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e        && pLoop->
1d240 6e 53 6b 69 70 3d 3d 30 0a 20 20 20 20 20 20 20  nSkip==0.       
1d250 20 20 26 26 20 28 28 69 20 3d 20 70 4c 6f 6f 70    && ((i = pLoop
1d260 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70  ->aLTerm[j]->eOp
1d270 65 72 61 74 6f 72 29 20 26 20 28 57 4f 5f 45 51  erator) & (WO_EQ
1d280 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53  |WO_ISNULL|WO_IS
1d290 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b  ))!=0.        ){
1d2a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
1d2b0 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a   & WO_ISNULL ){.
1d2c0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
1d2d0 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73  case( isOrderDis
1d2e0 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20  tinct );.       
1d2f0 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
1d300 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  inct = 0;.      
1d310 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1d320 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20  continue;  .    
1d330 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
1d340 2a 20 47 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e  * Get the column
1d350 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 74   number in the t
1d360 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e 29 20 61  able (iColumn) a
1d370 6e 64 20 73 6f 72 74 20 6f 72 64 65 72 0a 20 20  nd sort order.  
1d380 20 20 20 20 20 20 2a 2a 20 28 72 65 76 49 64 78        ** (revIdx
1d390 29 20 66 6f 72 20 74 68 65 20 6a 2d 74 68 20 63  ) for the j-th c
1d3a0 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
1d3b0 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ex..        */. 
1d3c0 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 64 65         if( pInde
1d3d0 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  x ){.          i
1d3e0 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d  Column = pIndex-
1d3f0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
1d400 20 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d          revIdx =
1d410 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72   pIndex->aSortOr
1d420 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  der[j];.        
1d430 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70    if( iColumn==p
1d440 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69  Index->pTable->i
1d450 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d  PKey ) iColumn =
1d460 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   -1;.        }el
1d470 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43  se{.          iC
1d480 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
1d490 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20 30        revIdx = 0
1d4a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
1d4b0 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e       /* An uncon
1d4c0 73 74 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e 20  strained column 
1d4d0 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 4e 55  that might be NU
1d4e0 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  LL means that th
1d4f0 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 68  is.        ** Wh
1d500 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20 77  ereLoop is not w
1d510 65 6c 6c 2d 6f 72 64 65 72 65 64 0a 20 20 20 20  ell-ordered.    
1d520 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
1d530 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  f( isOrderDistin
1d540 63 74 0a 20 20 20 20 20 20 20 20 20 26 26 20 69  ct.         && i
1d550 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20 20  Column>=0.      
1d560 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e     && j>=pLoop->
1d570 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20  u.btree.nEq.    
1d580 20 20 20 20 20 26 26 20 70 49 6e 64 65 78 2d 3e       && pIndex->
1d590 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f  pTable->aCol[iCo
1d5a0 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30  lumn].notNull==0
1d5b0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
1d5c0 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
1d5d0 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20  tinct = 0;.     
1d5e0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
1d5f0 20 46 69 6e 64 20 74 68 65 20 4f 52 44 45 52 20   Find the ORDER 
1d600 42 59 20 74 65 72 6d 20 74 68 61 74 20 63 6f 72  BY term that cor
1d610 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20  responds to the 
1d620 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20 20  j-th column.    
1d630 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e      ** of the in
1d640 64 65 78 20 61 6e 64 20 6d 61 72 6b 20 74 68 61  dex and mark tha
1d650 74 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  t ORDER BY term 
1d660 6f 66 66 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a  off .        */.
1d670 20 20 20 20 20 20 20 20 62 4f 6e 63 65 20 3d 20          bOnce = 
1d680 31 3b 0a 20 20 20 20 20 20 20 20 69 73 4d 61 74  1;.        isMat
1d690 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ch = 0;.        
1d6a0 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20 26  for(i=0; bOnce &
1d6b0 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  & i<nOrderBy; i+
1d6c0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
1d6d0 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f  ( MASKBIT(i) & o
1d6e0 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bSat ) continue;
1d6f0 0a 20 20 20 20 20 20 20 20 20 20 70 4f 42 45 78  .          pOBEx
1d700 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
1d710 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64  SkipCollate(pOrd
1d720 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
1d730 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
1d740 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67  tcase( wctrlFlag
1d750 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42  s & WHERE_GROUPB
1d760 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  Y );.          t
1d770 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c  estcase( wctrlFl
1d780 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54  ags & WHERE_DIST
1d790 49 4e 43 54 42 59 20 29 3b 0a 20 20 20 20 20 20  INCTBY );.      
1d7a0 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c      if( (wctrlFl
1d7b0 61 67 73 20 26 20 28 57 48 45 52 45 5f 47 52 4f  ags & (WHERE_GRO
1d7c0 55 50 42 59 7c 57 48 45 52 45 5f 44 49 53 54 49  UPBY|WHERE_DISTI
1d7d0 4e 43 54 42 59 29 29 3d 3d 30 20 29 20 62 4f 6e  NCTBY))==0 ) bOn
1d7e0 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ce = 0;.        
1d7f0 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f    if( pOBExpr->o
1d800 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63  p!=TK_COLUMN ) c
1d810 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1d820 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
1d830 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63  iTable!=iCur ) c
1d840 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1d850 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
1d860 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e  iColumn!=iColumn
1d870 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1d880 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75         if( iColu
1d890 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  mn>=0 ){.       
1d8a0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
1d8b0 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
1d8c0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20  pWInfo->pParse, 
1d8d0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
1d8e0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
1d8f0 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
1d900 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
1d910 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20  tColl;.         
1d920 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
1d930 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
1d940 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f  me, pIndex->azCo
1d950 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74  ll[j])!=0 ) cont
1d960 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
1d970 7d 0a 20 20 20 20 20 20 20 20 20 20 69 73 4d 61  }.          isMa
1d980 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  tch = 1;.       
1d990 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1d9a0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1d9b0 69 73 4d 61 74 63 68 20 26 26 20 28 77 63 74 72  isMatch && (wctr
1d9c0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47  lFlags & WHERE_G
1d9d0 52 4f 55 50 42 59 29 3d 3d 30 20 29 7b 0a 20 20  ROUPBY)==0 ){.  
1d9e0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
1d9f0 73 75 72 65 20 74 68 65 20 73 6f 72 74 20 6f 72  sure the sort or
1da00 64 65 72 20 69 73 20 63 6f 6d 70 61 74 69 62 6c  der is compatibl
1da10 65 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59  e in an ORDER BY
1da20 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 20   clause..       
1da30 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65 72     ** Sort order
1da40 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74 20 66   is irrelevant f
1da50 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c  or a GROUP BY cl
1da60 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ause. */.       
1da70 20 20 20 69 66 28 20 72 65 76 53 65 74 20 29 7b     if( revSet ){
1da80 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1da90 20 28 72 65 76 20 5e 20 72 65 76 49 64 78 29 21   (rev ^ revIdx)!
1daa0 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e  =pOrderBy->a[i].
1dab0 73 6f 72 74 4f 72 64 65 72 20 29 20 69 73 4d 61  sortOrder ) isMa
1dac0 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tch = 0;.       
1dad0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1dae0 20 20 20 20 20 20 72 65 76 20 3d 20 72 65 76 49        rev = revI
1daf0 64 78 20 5e 20 70 4f 72 64 65 72 42 79 2d 3e 61  dx ^ pOrderBy->a
1db00 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [i].sortOrder;. 
1db10 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
1db20 65 76 20 29 20 2a 70 52 65 76 4d 61 73 6b 20 7c  ev ) *pRevMask |
1db30 3d 20 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70 29  = MASKBIT(iLoop)
1db40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
1db50 76 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  vSet = 1;.      
1db60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1db70 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4d 61          if( isMa
1db80 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tch ){.         
1db90 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29   if( iColumn<0 )
1dba0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
1dbb0 73 74 63 61 73 65 28 20 64 69 73 74 69 6e 63 74  stcase( distinct
1dbc0 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20  Columns==0 );.  
1dbd0 20 20 20 20 20 20 20 20 20 20 64 69 73 74 69 6e            distin
1dbe0 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20  ctColumns = 1;. 
1dbf0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1dc00 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41       obSat |= MA
1dc10 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20  SKBIT(i);.      
1dc20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1dc30 20 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 66     /* No match f
1dc40 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ound */.        
1dc50 20 20 69 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c    if( j==0 || j<
1dc60 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20  nKeyCol ){.     
1dc70 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1dc80 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
1dc90 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
1dca0 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
1dcb0 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ct = 0;.        
1dcc0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
1dcd0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
1dce0 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f       } /* end Lo
1dcf0 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 65  op over all inde
1dd00 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  x columns */.   
1dd10 20 20 20 69 66 28 20 64 69 73 74 69 6e 63 74 43     if( distinctC
1dd20 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20 20 20 20 20  olumns ){.      
1dd30 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72    testcase( isOr
1dd40 64 65 72 44 69 73 74 69 6e 63 74 3d 3d 30 20 29  derDistinct==0 )
1dd50 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64 65  ;.        isOrde
1dd60 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20  rDistinct = 1;. 
1dd70 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20       }.    } /* 
1dd80 65 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d 72  end-if not one-r
1dd90 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61  ow */..    /* Ma
1dda0 72 6b 20 6f 66 66 20 61 6e 79 20 6f 74 68 65 72  rk off any other
1ddb0 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
1ddc0 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 70  that reference p
1ddd0 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20  Loop */.    if( 
1dde0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
1ddf0 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 44 69  ){.      orderDi
1de00 73 74 69 6e 63 74 4d 61 73 6b 20 7c 3d 20 70 4c  stinctMask |= pL
1de10 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
1de20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1de30 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
1de40 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 3b          Expr *p;
1de50 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
1de60 20 6d 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   mTerm;.        
1de70 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26  if( MASKBIT(i) &
1de80 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75   obSat ) continu
1de90 65 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70  e;.        p = p
1dea0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
1deb0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6d 54 65  xpr;.        mTe
1dec0 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  rm = sqlite3Wher
1ded0 65 45 78 70 72 55 73 61 67 65 28 26 70 57 49 6e  eExprUsage(&pWIn
1dee0 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 70 29 3b  fo->sMaskSet,p);
1def0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 54 65  .        if( mTe
1df00 72 6d 3d 3d 30 20 26 26 20 21 73 71 6c 69 74 65  rm==0 && !sqlite
1df10 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
1df20 70 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  p) ) continue;. 
1df30 20 20 20 20 20 20 20 69 66 28 20 28 6d 54 65 72         if( (mTer
1df40 6d 26 7e 6f 72 64 65 72 44 69 73 74 69 6e 63 74  m&~orderDistinct
1df50 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
1df60 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d        obSat |= M
1df70 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20  ASKBIT(i);.     
1df80 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1df90 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 74 68   }.  } /* End th
1dfa0 65 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20  e loop over all 
1dfb0 57 68 65 72 65 4c 6f 6f 70 73 20 66 72 6f 6d 20  WhereLoops from 
1dfc0 6f 75 74 65 72 2d 6d 6f 73 74 20 64 6f 77 6e 20  outer-most down 
1dfd0 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f  to inner-most */
1dfe0 0a 20 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62  .  if( obSat==ob
1dff0 44 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 28 69  Done ) return (i
1e000 38 29 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 66  8)nOrderBy;.  if
1e010 28 20 21 69 73 4f 72 64 65 72 44 69 73 74 69 6e  ( !isOrderDistin
1e020 63 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ct ){.    for(i=
1e030 6e 4f 72 64 65 72 42 79 2d 31 3b 20 69 3e 30 3b  nOrderBy-1; i>0;
1e040 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69 74   i--){.      Bit
1e050 6d 61 73 6b 20 6d 20 3d 20 4d 41 53 4b 42 49 54  mask m = MASKBIT
1e060 28 69 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 69  (i) - 1;.      i
1e070 66 28 20 28 6f 62 53 61 74 26 6d 29 3d 3d 6d 20  f( (obSat&m)==m 
1e080 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20  ) return i;.    
1e090 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  }.    return 0;.
1e0a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
1e0b0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
1e0c0 65 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  e WHERE_GROUPBY 
1e0d0 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 74  flag is set in t
1e0e0 68 65 20 6d 61 73 6b 20 70 61 73 73 65 64 20 74  he mask passed t
1e0f0 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
1e100 67 69 6e 28 29 2c 0a 2a 2a 20 74 68 65 20 70 6c  gin(),.** the pl
1e110 61 6e 6e 65 72 20 61 73 73 75 6d 65 73 20 74 68  anner assumes th
1e120 61 74 20 74 68 65 20 73 70 65 63 69 66 69 65 64  at the specified
1e130 20 70 4f 72 64 65 72 42 79 20 6c 69 73 74 20 69   pOrderBy list i
1e140 73 20 61 63 74 75 61 6c 6c 79 20 61 20 47 52 4f  s actually a GRO
1e150 55 50 0a 2a 2a 20 42 59 20 63 6c 61 75 73 65 20  UP.** BY clause 
1e160 2d 20 61 6e 64 20 73 6f 20 61 6e 79 20 6f 72 64  - and so any ord
1e170 65 72 20 74 68 61 74 20 67 72 6f 75 70 73 20 72  er that groups r
1e180 6f 77 73 20 61 73 20 72 65 71 75 69 72 65 64 20  ows as required 
1e190 73 61 74 69 73 66 69 65 73 20 74 68 65 0a 2a 2a  satisfies the.**
1e1a0 20 72 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20   request..**.** 
1e1b0 4e 6f 72 6d 61 6c 6c 79 2c 20 69 6e 20 74 68 69  Normally, in thi
1e1c0 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74  s case it is not
1e1d0 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68   possible for th
1e1e0 65 20 63 61 6c 6c 65 72 20 74 6f 20 64 65 74 65  e caller to dete
1e1f0 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72  rmine.** whether
1e200 20 6f 72 20 6e 6f 74 20 74 68 65 20 72 6f 77 73   or not the rows
1e210 20 61 72 65 20 72 65 61 6c 6c 79 20 62 65 69 6e   are really bein
1e220 67 20 64 65 6c 69 76 65 72 65 64 20 69 6e 20 73  g delivered in s
1e230 6f 72 74 65 64 20 6f 72 64 65 72 2c 20 6f 72 0a  orted order, or.
1e240 2a 2a 20 6a 75 73 74 20 69 6e 20 73 6f 6d 65 20  ** just in some 
1e250 6f 74 68 65 72 20 6f 72 64 65 72 20 74 68 61 74  other order that
1e260 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 72 65   provides the re
1e270 71 75 69 72 65 64 20 67 72 6f 75 70 69 6e 67 2e  quired grouping.
1e280 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20   However,.** if 
1e290 74 68 65 20 57 48 45 52 45 5f 53 4f 52 54 42 59  the WHERE_SORTBY
1e2a0 47 52 4f 55 50 20 66 6c 61 67 20 69 73 20 61 6c  GROUP flag is al
1e2b0 73 6f 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  so passed to sql
1e2c0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
1e2d0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66  , then.** this f
1e2e0 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63  unction may be c
1e2f0 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 72 65 74  alled on the ret
1e300 75 72 6e 65 64 20 57 68 65 72 65 49 6e 66 6f 20  urned WhereInfo 
1e310 6f 62 6a 65 63 74 2e 20 49 74 20 72 65 74 75 72  object. It retur
1e320 6e 73 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68  ns.** true if th
1e330 65 20 72 6f 77 73 20 72 65 61 6c 6c 79 20 77 69  e rows really wi
1e340 6c 6c 20 62 65 20 73 6f 72 74 65 64 20 69 6e 20  ll be sorted in 
1e350 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 72  the specified or
1e360 64 65 72 2c 20 6f 72 20 66 61 6c 73 65 0a 2a 2a  der, or false.**
1e370 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a   otherwise..**.*
1e380 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61  * For example, a
1e390 73 73 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  ssuming:.**.**  
1e3a0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
1e3b0 20 4f 4e 20 74 31 28 78 2c 20 59 29 3b 0a 2a 2a   ON t1(x, Y);.**
1e3c0 0a 2a 2a 20 74 68 65 6e 0a 2a 2a 0a 2a 2a 20 20  .** then.**.**  
1e3d0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1e3e0 31 20 47 52 4f 55 50 20 42 59 20 78 2c 79 20 4f  1 GROUP BY x,y O
1e3f0 52 44 45 52 20 42 59 20 78 2c 79 3b 20 20 20 2d  RDER BY x,y;   -
1e400 2d 20 49 73 53 6f 72 74 65 64 28 29 3d 3d 31 0a  - IsSorted()==1.
1e410 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
1e420 4f 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20 79  OM t1 GROUP BY y
1e430 2c 78 20 4f 52 44 45 52 20 42 59 20 79 2c 78 3b  ,x ORDER BY y,x;
1e440 20 20 20 2d 2d 20 49 73 53 6f 72 74 65 64 28 29     -- IsSorted()
1e450 3d 3d 30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ==0.*/.int sqlit
1e460 65 33 57 68 65 72 65 49 73 53 6f 72 74 65 64 28  e3WhereIsSorted(
1e470 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
1e480 6f 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 57  o){.  assert( pW
1e490 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
1e4a0 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59   & WHERE_GROUPBY
1e4b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57   );.  assert( pW
1e4c0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
1e4d0 20 26 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47   & WHERE_SORTBYG
1e4e0 52 4f 55 50 20 29 3b 0a 20 20 72 65 74 75 72 6e  ROUP );.  return
1e4f0 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3b   pWInfo->sorted;
1e500 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45  .}..#ifdef WHERE
1e510 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a  TRACE_ENABLED./*
1e520 20 46 6f 72 20 64 65 62 75 67 67 69 6e 67 20 75   For debugging u
1e530 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74  se only: */.stat
1e540 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77  ic const char *w
1e550 68 65 72 65 50 61 74 68 4e 61 6d 65 28 57 68 65  herePathName(Whe
1e560 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 69  rePath *pPath, i
1e570 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c  nt nLoop, WhereL
1e580 6f 6f 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73  oop *pLast){.  s
1e590 74 61 74 69 63 20 63 68 61 72 20 7a 4e 61 6d 65  tatic char zName
1e5a0 5b 36 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  [65];.  int i;. 
1e5b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f   for(i=0; i<nLoo
1e5c0 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69  p; i++){ zName[i
1e5d0 5d 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70  ] = pPath->aLoop
1e5e0 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66  [i]->cId; }.  if
1e5f0 28 20 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b  ( pLast ) zName[
1e600 69 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49  i++] = pLast->cI
1e610 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20  d;.  zName[i] = 
1e620 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d  0;.  return zNam
1e630 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e;.}.#endif../*.
1e640 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
1e650 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52  st of sorting nR
1e660 6f 77 20 72 6f 77 73 2c 20 61 73 73 75 6d 69 6e  ow rows, assumin
1e670 67 20 74 68 61 74 20 74 68 65 20 6b 65 79 73 20  g that the keys 
1e680 68 61 76 65 20 0a 2a 2a 20 6e 4f 72 64 65 72 62  have .** nOrderb
1e690 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68  y columns and th
1e6a0 61 74 20 74 68 65 20 66 69 72 73 74 20 6e 53 6f  at the first nSo
1e6b0 72 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65  rted columns are
1e6c0 20 61 6c 72 65 61 64 79 20 69 6e 0a 2a 2a 20 6f   already in.** o
1e6d0 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
1e6e0 4c 6f 67 45 73 74 20 77 68 65 72 65 53 6f 72 74  LogEst whereSort
1e6f0 69 6e 67 43 6f 73 74 28 0a 20 20 57 68 65 72 65  ingCost(.  Where
1e700 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20  Info *pWInfo,.  
1e710 4c 6f 67 45 73 74 20 6e 52 6f 77 2c 0a 20 20 69  LogEst nRow,.  i
1e720 6e 74 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 69  nt nOrderBy,.  i
1e730 6e 74 20 6e 53 6f 72 74 65 64 0a 29 7b 0a 20 20  nt nSorted.){.  
1e740 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 73 74 69 6d  /* TUNING: Estim
1e750 61 74 65 64 20 63 6f 73 74 20 6f 66 20 61 20 66  ated cost of a f
1e760 75 6c 6c 20 65 78 74 65 72 6e 61 6c 20 73 6f 72  ull external sor
1e770 74 2c 20 77 68 65 72 65 20 4e 20 69 73 20 0a 20  t, where N is . 
1e780 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   ** the number o
1e790 66 20 72 6f 77 73 20 74 6f 20 73 6f 72 74 20 69  f rows to sort i
1e7a0 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63  s:.  **.  **   c
1e7b0 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a  ost = (3.0 * N *
1e7c0 20 6c 6f 67 28 4e 29 29 2e 0a 20 20 2a 2a 20 0a   log(N))..  ** .
1e7d0 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20    ** Or, if the 
1e7e0 6f 72 64 65 72 2d 62 79 20 63 6c 61 75 73 65 20  order-by clause 
1e7f0 68 61 73 20 58 20 74 65 72 6d 73 20 62 75 74 20  has X terms but 
1e800 6f 6e 6c 79 20 74 68 65 20 6c 61 73 74 20 59 20  only the last Y 
1e810 0a 20 20 2a 2a 20 74 65 72 6d 73 20 61 72 65 20  .  ** terms are 
1e820 6f 75 74 20 6f 66 20 6f 72 64 65 72 2c 20 74 68  out of order, th
1e830 65 6e 20 62 6c 6f 63 6b 2d 73 6f 72 74 69 6e 67  en block-sorting
1e840 20 77 69 6c 6c 20 72 65 64 75 63 65 20 74 68 65   will reduce the
1e850 20 0a 20 20 2a 2a 20 73 6f 72 74 69 6e 67 20 63   .  ** sorting c
1e860 6f 73 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  ost to:.  **.  *
1e870 2a 20 20 20 63 6f 73 74 20 3d 20 28 33 2e 30 20  *   cost = (3.0 
1e880 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 20 2a 20  * N * log(N)) * 
1e890 28 59 2f 58 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  (Y/X).  **.  ** 
1e8a0 54 68 65 20 28 59 2f 58 29 20 74 65 72 6d 20 69  The (Y/X) term i
1e8b0 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73  s implemented us
1e8c0 69 6e 67 20 73 74 61 63 6b 20 76 61 72 69 61 62  ing stack variab
1e8d0 6c 65 20 72 53 63 61 6c 65 0a 20 20 2a 2a 20 62  le rScale.  ** b
1e8e0 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 4c 6f 67 45  elow.  */.  LogE
1e8f0 73 74 20 72 53 63 61 6c 65 2c 20 72 53 6f 72 74  st rScale, rSort
1e900 43 6f 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20  Cost;.  assert( 
1e910 6e 4f 72 64 65 72 42 79 3e 30 20 26 26 20 36 36  nOrderBy>0 && 66
1e920 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
1e930 31 30 30 29 20 29 3b 0a 20 20 72 53 63 61 6c 65  100) );.  rScale
1e940 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
1e950 28 28 6e 4f 72 64 65 72 42 79 2d 6e 53 6f 72 74  ((nOrderBy-nSort
1e960 65 64 29 2a 31 30 30 2f 6e 4f 72 64 65 72 42 79  ed)*100/nOrderBy
1e970 29 20 2d 20 36 36 3b 0a 20 20 72 53 6f 72 74 43  ) - 66;.  rSortC
1e980 6f 73 74 20 3d 20 6e 52 6f 77 20 2b 20 65 73 74  ost = nRow + est
1e990 4c 6f 67 28 6e 52 6f 77 29 20 2b 20 72 53 63 61  Log(nRow) + rSca
1e9a0 6c 65 20 2b 20 31 36 3b 0a 0a 20 20 2f 2a 20 54  le + 16;..  /* T
1e9b0 55 4e 49 4e 47 3a 20 54 68 65 20 63 6f 73 74 20  UNING: The cost 
1e9c0 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  of implementing 
1e9d0 44 49 53 54 49 4e 43 54 20 75 73 69 6e 67 20 61  DISTINCT using a
1e9e0 20 42 2d 54 52 45 45 20 69 73 0a 20 20 2a 2a 20   B-TREE is.  ** 
1e9f0 73 69 6d 69 6c 61 72 20 62 75 74 20 77 69 74 68  similar but with
1ea00 20 61 20 6c 61 72 67 65 72 20 63 6f 6e 73 74 61   a larger consta
1ea10 6e 74 20 6f 66 20 70 72 6f 70 6f 72 74 69 6f 6e  nt of proportion
1ea20 61 6c 69 74 79 2e 20 0a 20 20 2a 2a 20 4d 75 6c  ality. .  ** Mul
1ea30 74 69 70 6c 79 20 62 79 20 61 6e 20 61 64 64 69  tiply by an addi
1ea40 74 69 6f 6e 61 6c 20 66 61 63 74 6f 72 20 6f 66  tional factor of
1ea50 20 33 2e 30 2e 20 20 2a 2f 0a 20 20 69 66 28 20   3.0.  */.  if( 
1ea60 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
1ea70 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
1ea80 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20  DISTINCT ){.    
1ea90 72 53 6f 72 74 43 6f 73 74 20 2b 3d 20 31 36 3b  rSortCost += 16;
1eaa0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1eab0 53 6f 72 74 43 6f 73 74 3b 0a 7d 0a 0a 2f 2a 0a  SortCost;.}../*.
1eac0 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6c 69 73  ** Given the lis
1ead0 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f  t of WhereLoop o
1eae0 62 6a 65 63 74 73 20 61 74 20 70 57 49 6e 66 6f  bjects at pWInfo
1eaf0 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72  ->pLoops, this r
1eb00 6f 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70  outine.** attemp
1eb10 74 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c  ts to find the l
1eb20 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20  owest cost path 
1eb30 74 68 61 74 20 76 69 73 69 74 73 20 65 61 63 68  that visits each
1eb40 20 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e   WhereLoop.** on
1eb50 63 65 2e 20 20 54 68 69 73 20 70 61 74 68 20 69  ce.  This path i
1eb60 73 20 74 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e  s then loaded in
1eb70 74 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61  to the pWInfo->a
1eb80 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73  [].pWLoop fields
1eb90 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65 20 74  ..**.** Assume t
1eba0 68 61 74 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  hat the total nu
1ebb0 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72  mber of output r
1ebc0 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 65  ows that will ne
1ebd0 65 64 20 74 6f 20 62 65 20 73 6f 72 74 65 64 0a  ed to be sorted.
1ebe0 2a 2a 20 77 69 6c 6c 20 62 65 20 6e 52 6f 77 45  ** will be nRowE
1ebf0 73 74 20 28 69 6e 20 74 68 65 20 31 30 2a 6c 6f  st (in the 10*lo
1ec00 67 32 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  g2 representatio
1ec10 6e 29 2e 20 20 4f 72 2c 20 69 67 6e 6f 72 65 20  n).  Or, ignore 
1ec20 73 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f 73 74 73  sorting.** costs
1ec30 20 69 66 20 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a   if nRowEst==0..
1ec40 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
1ec50 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
1ec60 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  s or SQLITE_NOME
1ec70 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  M of a memory al
1ec80 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f  location.** erro
1ec90 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61  r occurs..*/.sta
1eca0 74 69 63 20 69 6e 74 20 77 68 65 72 65 50 61 74  tic int wherePat
1ecb0 68 53 6f 6c 76 65 72 28 57 68 65 72 65 49 6e 66  hSolver(WhereInf
1ecc0 6f 20 2a 70 57 49 6e 66 6f 2c 20 4c 6f 67 45 73  o *pWInfo, LogEs
1ecd0 74 20 6e 52 6f 77 45 73 74 29 7b 0a 20 20 69 6e  t nRowEst){.  in
1ece0 74 20 6d 78 43 68 6f 69 63 65 3b 20 20 20 20 20  t mxChoice;     
1ecf0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
1ed00 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d  um number of sim
1ed10 75 6c 74 61 6e 65 6f 75 73 20 70 61 74 68 73 20  ultaneous paths 
1ed20 74 72 61 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74  tracked */.  int
1ed30 20 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20   nLoop;         
1ed40 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1ed50 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65   of terms in the
1ed60 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61 72 73 65   join */.  Parse
1ed70 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20   *pParse;       
1ed80 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
1ed90 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
1eda0 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
1edb0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
1edc0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1edd0 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70  n */.  int iLoop
1ede0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1edf0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1ee00 20 6f 76 65 72 20 74 68 65 20 74 65 72 6d 73 20   over the terms 
1ee10 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20  of the join */. 
1ee20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 20 20 20 20   int ii, jj;    
1ee30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1ee40 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
1ee50 20 69 6e 74 20 6d 78 49 20 3d 20 30 3b 20 20 20   int mxI = 0;   
1ee60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1ee70 64 65 78 20 6f 66 20 6e 65 78 74 20 65 6e 74 72  dex of next entr
1ee80 79 20 74 6f 20 72 65 70 6c 61 63 65 20 2a 2f 0a  y to replace */.
1ee90 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20    int nOrderBy; 
1eea0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1eeb0 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42  umber of ORDER B
1eec0 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 2a  Y clause terms *
1eed0 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 43 6f 73  /.  LogEst mxCos
1eee0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  t = 0;        /*
1eef0 20 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66   Maximum cost of
1ef00 20 61 20 73 65 74 20 6f 66 20 70 61 74 68 73 20   a set of paths 
1ef10 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 55 6e  */.  LogEst mxUn
1ef20 73 6f 72 74 65 64 20 3d 20 30 3b 20 20 20 20 2f  sorted = 0;    /
1ef30 2a 20 4d 61 78 69 6d 75 6d 20 75 6e 73 6f 72 74  * Maximum unsort
1ef40 65 64 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74  ed cost of a set
1ef50 20 6f 66 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e   of path */.  in
1ef60 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20  t nTo, nFrom;   
1ef70 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1ef80 72 20 6f 66 20 76 61 6c 69 64 20 65 6e 74 72 69  r of valid entri
1ef90 65 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e 64 20  es in aTo[] and 
1efa0 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65  aFrom[] */.  Whe
1efb0 72 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b 20 20  rePath *aFrom;  
1efc0 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6e 46         /* All nF
1efd0 72 6f 6d 20 70 61 74 68 73 20 61 74 20 74 68 65  rom paths at the
1efe0 20 70 72 65 76 69 6f 75 73 20 6c 65 76 65 6c 20   previous level 
1eff0 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a  */.  WherePath *
1f000 61 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  aTo;           /
1f010 2a 20 54 68 65 20 6e 54 6f 20 62 65 73 74 20 70  * The nTo best p
1f020 61 74 68 73 20 61 74 20 74 68 65 20 63 75 72 72  aths at the curr
1f030 65 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57  ent level */.  W
1f040 68 65 72 65 50 61 74 68 20 2a 70 46 72 6f 6d 3b  herePath *pFrom;
1f050 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
1f060 6c 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f 6d 5b  lement of aFrom[
1f070 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77 6f  ] that we are wo
1f080 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68  rking on */.  Wh
1f090 65 72 65 50 61 74 68 20 2a 70 54 6f 3b 20 20 20  erePath *pTo;   
1f0a0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c          /* An el
1f0b0 65 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d 20 74  ement of aTo[] t
1f0c0 68 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69  hat we are worki
1f0d0 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65  ng on */.  Where
1f0e0 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 20  Loop *pWLoop;   
1f0f0 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
1f100 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  he WhereLoop obj
1f110 65 63 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 4c  ects */.  WhereL
1f120 6f 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20 20 20  oop **pX;       
1f130 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 64      /* Used to d
1f140 69 76 79 20 75 70 20 74 68 65 20 70 53 70 61 63  ivy up the pSpac
1f150 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 4c 6f  e memory */.  Lo
1f160 67 45 73 74 20 2a 61 53 6f 72 74 43 6f 73 74 20  gEst *aSortCost 
1f170 3d 20 30 3b 20 20 20 20 2f 2a 20 53 6f 72 74 69  = 0;    /* Sorti
1f180 6e 67 20 61 6e 64 20 70 61 72 74 69 61 6c 20 73  ng and partial s
1f190 6f 72 74 69 6e 67 20 63 6f 73 74 73 20 2a 2f 0a  orting costs */.
1f1a0 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 3b 20    char *pSpace; 
1f1b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1f1c0 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20  emporary memory 
1f1d0 75 73 65 64 20 62 79 20 74 68 69 73 20 72 6f 75  used by this rou
1f1e0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  tine */.  int nS
1f1f0 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
1f200 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
1f210 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
1f220 61 74 20 70 53 70 61 63 65 20 2a 2f 0a 0a 20 20  at pSpace */..  
1f230 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
1f240 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20  >pParse;.  db = 
1f250 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c  pParse->db;.  nL
1f260 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c  oop = pWInfo->nL
1f270 65 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e  evel;.  /* TUNIN
1f280 47 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20 71 75  G: For simple qu
1f290 65 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20  eries, only the 
1f2a0 62 65 73 74 20 70 61 74 68 20 69 73 20 74 72 61  best path is tra
1f2b0 63 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 32  cked..  ** For 2
1f2c0 2d 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68 65 20  -way joins, the 
1f2d0 35 20 62 65 73 74 20 70 61 74 68 73 20 61 72 65  5 best paths are
1f2e0 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20   followed..  ** 
1f2f0 46 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33 20 6f  For joins of 3 o
1f300 72 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c 20 74  r more tables, t
1f310 72 61 63 6b 20 74 68 65 20 31 30 20 62 65 73 74  rack the 10 best
1f320 20 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78 43 68   paths */.  mxCh
1f330 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3c 3d 31  oice = (nLoop<=1
1f340 29 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d  ) ? 1 : (nLoop==
1f350 32 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20 20 61  2 ? 5 : 10);.  a
1f360 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57  ssert( nLoop<=pW
1f370 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
1f380 6e 53 72 63 20 29 3b 0a 20 20 57 48 45 52 45 54  nSrc );.  WHERET
1f390 52 41 43 45 28 30 78 30 30 32 2c 20 28 22 2d 2d  RACE(0x002, ("--
1f3a0 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65 72 2e  -- begin solver.
1f3b0 20 20 28 6e 52 6f 77 45 73 74 3d 25 64 29 5c 6e    (nRowEst=%d)\n
1f3c0 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 0a 20  ", nRowEst));.. 
1f3d0 20 2f 2a 20 49 66 20 6e 52 6f 77 45 73 74 20 69   /* If nRowEst i
1f3e0 73 20 7a 65 72 6f 20 61 6e 64 20 74 68 65 72 65  s zero and there
1f3f0 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
1f400 63 6c 61 75 73 65 2c 20 69 67 6e 6f 72 65 20 69  clause, ignore i
1f410 74 2e 20 49 6e 20 74 68 69 73 0a 20 20 2a 2a 20  t. In this.  ** 
1f420 63 61 73 65 20 74 68 65 20 70 75 72 70 6f 73 65  case the purpose
1f430 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73   of this call is
1f440 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
1f450 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
1f460 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 62 79  returned.  ** by
1f470 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 71 75 65   the overall que
1f480 72 79 2e 20 4f 6e 63 65 20 74 68 69 73 20 65 73  ry. Once this es
1f490 74 69 6d 61 74 65 20 68 61 73 20 62 65 65 6e 20  timate has been 
1f4a0 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 20 63 61  obtained, the ca
1f4b0 6c 6c 65 72 0a 20 20 2a 2a 20 77 69 6c 6c 20 69  ller.  ** will i
1f4c0 6e 76 6f 6b 65 20 74 68 69 73 20 66 75 6e 63 74  nvoke this funct
1f4d0 69 6f 6e 20 61 20 73 65 63 6f 6e 64 20 74 69 6d  ion a second tim
1f4e0 65 2c 20 70 61 73 73 69 6e 67 20 74 68 65 20 65  e, passing the e
1f4f0 73 74 69 6d 61 74 65 20 61 73 20 74 68 65 0a 20  stimate as the. 
1f500 20 2a 2a 20 6e 52 6f 77 45 73 74 20 70 61 72 61   ** nRowEst para
1f510 6d 65 74 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28  meter.  */.  if(
1f520 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
1f530 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73 74 3d  y==0 || nRowEst=
1f540 3d 30 20 29 7b 0a 20 20 20 20 6e 4f 72 64 65 72  =0 ){.    nOrder
1f550 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  By = 0;.  }else{
1f560 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  .    nOrderBy = 
1f570 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
1f580 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 0a 20 20  ->nExpr;.  }..  
1f590 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  /* Allocate and 
1f5a0 69 6e 69 74 69 61 6c 69 7a 65 20 73 70 61 63 65  initialize space
1f5b0 20 66 6f 72 20 61 54 6f 2c 20 61 46 72 6f 6d 20   for aTo, aFrom 
1f5c0 61 6e 64 20 61 53 6f 72 74 43 6f 73 74 5b 5d 20  and aSortCost[] 
1f5d0 2a 2f 0a 20 20 6e 53 70 61 63 65 20 3d 20 28 73  */.  nSpace = (s
1f5e0 69 7a 65 6f 66 28 57 68 65 72 65 50 61 74 68 29  izeof(WherePath)
1f5f0 2b 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f  +sizeof(WhereLoo
1f600 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f  p*)*nLoop)*mxCho
1f610 69 63 65 2a 32 3b 0a 20 20 6e 53 70 61 63 65 20  ice*2;.  nSpace 
1f620 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74  += sizeof(LogEst
1f630 29 20 2a 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  ) * nOrderBy;.  
1f640 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33  pSpace = sqlite3
1f650 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
1f660 6e 53 70 61 63 65 29 3b 0a 20 20 69 66 28 20 70  nSpace);.  if( p
1f670 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72  Space==0 ) retur
1f680 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
1f690 20 20 61 54 6f 20 3d 20 28 57 68 65 72 65 50 61    aTo = (WherePa
1f6a0 74 68 2a 29 70 53 70 61 63 65 3b 0a 20 20 61 46  th*)pSpace;.  aF
1f6b0 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f 69  rom = aTo+mxChoi
1f6c0 63 65 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46 72  ce;.  memset(aFr
1f6d0 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 46  om, 0, sizeof(aF
1f6e0 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20 3d  rom[0]));.  pX =
1f6f0 20 28 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28 61   (WhereLoop**)(a
1f700 46 72 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b 0a  From+mxChoice);.
1f710 20 20 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69 63    for(ii=mxChoic
1f720 65 2a 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b 20  e*2, pFrom=aTo; 
1f730 69 69 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72 6f  ii>0; ii--, pFro
1f740 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70  m++, pX += nLoop
1f750 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61 4c  ){.    pFrom->aL
1f760 6f 6f 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 20 20  oop = pX;.  }.  
1f770 69 66 28 20 6e 4f 72 64 65 72 42 79 20 29 7b 0a  if( nOrderBy ){.
1f780 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1f790 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
1f7a0 6c 61 75 73 65 20 61 6e 64 20 69 74 20 69 73 20  lause and it is 
1f7b0 6e 6f 74 20 62 65 69 6e 67 20 69 67 6e 6f 72 65  not being ignore
1f7c0 64 2c 20 73 65 74 20 75 70 0a 20 20 20 20 2a 2a  d, set up.    **
1f7d0 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 61   space for the a
1f7e0 53 6f 72 74 43 6f 73 74 5b 5d 20 61 72 72 61 79  SortCost[] array
1f7f0 2e 20 45 61 63 68 20 65 6c 65 6d 65 6e 74 20 6f  . Each element o
1f800 66 20 74 68 65 20 61 53 6f 72 74 43 6f 73 74 20  f the aSortCost 
1f810 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 69 73 20  array.    ** is 
1f820 65 69 74 68 65 72 20 7a 65 72 6f 20 2d 20 6d 65  either zero - me
1f830 61 6e 69 6e 67 20 69 74 20 68 61 73 20 6e 6f 74  aning it has not
1f840 20 79 65 74 20 62 65 65 6e 20 69 6e 69 74 69 61   yet been initia
1f850 6c 69 7a 65 64 20 2d 20 6f 72 20 74 68 65 0a 20  lized - or the. 
1f860 20 20 20 2a 2a 20 63 6f 73 74 20 6f 66 20 73 6f     ** cost of so
1f870 72 74 69 6e 67 20 6e 52 6f 77 45 73 74 20 72 6f  rting nRowEst ro
1f880 77 73 20 6f 66 20 64 61 74 61 20 77 68 65 72 65  ws of data where
1f890 20 74 68 65 20 66 69 72 73 74 20 58 20 74 65 72   the first X ter
1f8a0 6d 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  ms of.    ** the
1f8b0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1f8c0 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20   are already in 
1f8d0 6f 72 64 65 72 2c 20 77 68 65 72 65 20 58 20 69  order, where X i
1f8e0 73 20 74 68 65 20 61 72 72 61 79 20 0a 20 20 20  s the array .   
1f8f0 20 2a 2a 20 69 6e 64 65 78 2e 20 20 2a 2f 0a 20   ** index.  */. 
1f900 20 20 20 61 53 6f 72 74 43 6f 73 74 20 3d 20 28     aSortCost = (
1f910 4c 6f 67 45 73 74 2a 29 70 58 3b 0a 20 20 20 20  LogEst*)pX;.    
1f920 6d 65 6d 73 65 74 28 61 53 6f 72 74 43 6f 73 74  memset(aSortCost
1f930 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4c 6f 67 45  , 0, sizeof(LogE
1f940 73 74 29 20 2a 20 6e 4f 72 64 65 72 42 79 29 3b  st) * nOrderBy);
1f950 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 61  .  }.  assert( a
1f960 53 6f 72 74 43 6f 73 74 3d 3d 30 20 7c 7c 20 26  SortCost==0 || &
1f970 70 53 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d 3d  pSpace[nSpace]==
1f980 28 63 68 61 72 2a 29 26 61 53 6f 72 74 43 6f 73  (char*)&aSortCos
1f990 74 5b 6e 4f 72 64 65 72 42 79 5d 20 29 3b 0a 20  t[nOrderBy] );. 
1f9a0 20 61 73 73 65 72 74 28 20 61 53 6f 72 74 43 6f   assert( aSortCo
1f9b0 73 74 21 3d 30 20 7c 7c 20 26 70 53 70 61 63 65  st!=0 || &pSpace
1f9c0 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72 2a  [nSpace]==(char*
1f9d0 29 70 58 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 65  )pX );..  /* See
1f9e0 64 20 74 68 65 20 73 65 61 72 63 68 20 77 69 74  d the search wit
1f9f0 68 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65  h a single Where
1fa00 50 61 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Path containing 
1fa10 7a 65 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73 2e  zero WhereLoops.
1fa20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e  .  **.  ** TUNIN
1fa30 47 3a 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74 68  G: Do not let th
1fa40 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 74 65 72  e number of iter
1fa50 61 74 69 6f 6e 73 20 67 6f 20 61 62 6f 76 65 20  ations go above 
1fa60 32 38 2e 20 20 49 66 20 74 68 65 20 63 6f 73 74  28.  If the cost
1fa70 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d 70 75 74 69  .  ** of computi
1fa80 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  ng an automatic 
1fa90 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 70 61 69  index is not pai
1faa0 64 20 62 61 63 6b 20 77 69 74 68 69 6e 20 74 68  d back within th
1fab0 65 20 66 69 72 73 74 20 32 38 0a 20 20 2a 2a 20  e first 28.  ** 
1fac0 72 6f 77 73 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  rows, then do no
1fad0 74 20 75 73 65 20 74 68 65 20 61 75 74 6f 6d 61  t use the automa
1fae0 74 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20  tic index. */.  
1faf0 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20  aFrom[0].nRow = 
1fb00 4d 49 4e 28 70 50 61 72 73 65 2d 3e 6e 51 75 65  MIN(pParse->nQue
1fb10 72 79 4c 6f 6f 70 2c 20 34 38 29 3b 20 20 61 73  ryLoop, 48);  as
1fb20 73 65 72 74 28 20 34 38 3d 3d 73 71 6c 69 74 65  sert( 48==sqlite
1fb30 33 4c 6f 67 45 73 74 28 32 38 29 20 29 3b 0a 20  3LogEst(28) );. 
1fb40 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 20 20 61 73   nFrom = 1;.  as
1fb50 73 65 72 74 28 20 61 46 72 6f 6d 5b 30 5d 2e 69  sert( aFrom[0].i
1fb60 73 4f 72 64 65 72 65 64 3d 3d 30 20 29 3b 0a 20  sOrdered==0 );. 
1fb70 20 69 66 28 20 6e 4f 72 64 65 72 42 79 20 29 7b   if( nOrderBy ){
1fb80 0a 20 20 20 20 2f 2a 20 49 66 20 6e 4c 6f 6f 70  .    /* If nLoop
1fb90 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   is zero, then t
1fba0 68 65 72 65 20 61 72 65 20 6e 6f 20 46 52 4f 4d  here are no FROM
1fbb0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 71 75   terms in the qu
1fbc0 65 72 79 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a  ery. Since.    *
1fbd0 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 74  * in this case t
1fbe0 68 65 20 71 75 65 72 79 20 6d 61 79 20 72 65 74  he query may ret
1fbf0 75 72 6e 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66  urn a maximum of
1fc00 20 6f 6e 65 20 72 6f 77 2c 20 74 68 65 20 72 65   one row, the re
1fc10 73 75 6c 74 73 0a 20 20 20 20 2a 2a 20 61 72 65  sults.    ** are
1fc20 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
1fc30 72 65 71 75 65 73 74 65 64 20 6f 72 64 65 72 2e  requested order.
1fc40 20 53 65 74 20 69 73 4f 72 64 65 72 65 64 20 74   Set isOrdered t
1fc50 6f 20 6e 4f 72 64 65 72 42 79 20 74 6f 0a 20 20  o nOrderBy to.  
1fc60 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 20 74 68    ** indicate th
1fc70 69 73 2e 20 4f 72 2c 20 69 66 20 6e 4c 6f 6f 70  is. Or, if nLoop
1fc80 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1fc90 20 7a 65 72 6f 2c 20 73 65 74 20 69 73 4f 72 64   zero, set isOrd
1fca0 65 72 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 2d  ered to.    ** -
1fcb0 31 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  1, indicating th
1fcc0 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  at the result se
1fcd0 74 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  t may or may not
1fce0 20 62 65 20 6f 72 64 65 72 65 64 2c 20 0a 20 20   be ordered, .  
1fcf0 20 20 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f    ** depending o
1fd00 6e 20 74 68 65 20 6c 6f 6f 70 73 20 61 64 64 65  n the loops adde
1fd10 64 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  d to the current
1fd20 20 70 6c 61 6e 2e 20 20 2a 2f 0a 20 20 20 20 61   plan.  */.    a
1fd30 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65  From[0].isOrdere
1fd40 64 20 3d 20 6e 4c 6f 6f 70 3e 30 20 3f 20 2d 31  d = nLoop>0 ? -1
1fd50 20 3a 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 7d   : nOrderBy;.  }
1fd60 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 73  ..  /* Compute s
1fd70 75 63 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e 67  uccessively long
1fd80 65 72 20 57 68 65 72 65 50 61 74 68 73 20 75 73  er WherePaths us
1fd90 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75 73  ing the previous
1fda0 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a 2a   generation.  **
1fdb0 20 6f 66 20 57 68 65 72 65 50 61 74 68 73 20 61   of WherePaths a
1fdc0 73 20 74 68 65 20 62 61 73 69 73 20 66 6f 72 20  s the basis for 
1fdd0 74 68 65 20 6e 65 78 74 2e 20 20 4b 65 65 70 20  the next.  Keep 
1fde0 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6d 78 43  track of the mxC
1fdf0 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73 74 20  hoice.  ** best 
1fe00 70 61 74 68 73 20 61 74 20 65 61 63 68 20 67 65  paths at each ge
1fe10 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f  neration */.  fo
1fe20 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70  r(iLoop=0; iLoop
1fe30 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29  <nLoop; iLoop++)
1fe40 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a 20  {.    nTo = 0;. 
1fe50 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 46 72     for(ii=0, pFr
1fe60 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46 72  om=aFrom; ii<nFr
1fe70 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b  om; ii++, pFrom+
1fe80 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 57  +){.      for(pW
1fe90 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f  Loop=pWInfo->pLo
1fea0 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57 4c  ops; pWLoop; pWL
1feb0 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78  oop=pWLoop->pNex
1fec0 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20 20  tLoop){.        
1fed0 4c 6f 67 45 73 74 20 6e 4f 75 74 3b 20 20 20 20  LogEst nOut;    
1fee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fef0 20 20 2f 2a 20 52 6f 77 73 20 76 69 73 69 74 65    /* Rows visite
1ff00 64 20 62 79 20 28 70 46 72 6f 6d 2b 70 57 4c 6f  d by (pFrom+pWLo
1ff10 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 4c  op) */.        L
1ff20 6f 67 45 73 74 20 72 43 6f 73 74 3b 20 20 20 20  ogEst rCost;    
1ff30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff40 20 2f 2a 20 43 6f 73 74 20 6f 66 20 70 61 74 68   /* Cost of path
1ff50 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20   (pFrom+pWLoop) 
1ff60 2a 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73  */.        LogEs
1ff70 74 20 72 55 6e 73 6f 72 74 65 64 3b 20 20 20 20  t rUnsorted;    
1ff80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ff90 55 6e 73 6f 72 74 65 64 20 63 6f 73 74 20 6f 66  Unsorted cost of
1ffa0 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20   (pFrom+pWLoop) 
1ffb0 2a 2f 0a 20 20 20 20 20 20 20 20 69 38 20 69 73  */.        i8 is
1ffc0 4f 72 64 65 72 65 64 20 3d 20 70 46 72 6f 6d 2d  Ordered = pFrom-
1ffd0 3e 69 73 4f 72 64 65 72 65 64 3b 20 20 2f 2a 20  >isOrdered;  /* 
1ffe0 69 73 4f 72 64 65 72 65 64 20 66 6f 72 20 28 70  isOrdered for (p
1fff0 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a  From+pWLoop) */.
20000 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
20010 6d 61 73 6b 4e 65 77 3b 20 20 20 20 20 20 20 20  maskNew;        
20020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
20030 6b 20 6f 66 20 73 72 63 20 76 69 73 69 74 65 64  k of src visited
20040 20 62 79 20 28 2e 2e 29 20 2a 2f 0a 20 20 20 20   by (..) */.    
20050 20 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4d      Bitmask revM
20060 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ask = 0;        
20070 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
20080 20 72 65 76 2d 6f 72 64 65 72 20 6c 6f 6f 70 73   rev-order loops
20090 20 66 6f 72 20 28 2e 2e 29 20 2a 2f 0a 0a 20 20   for (..) */..  
200a0 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f        if( (pWLoo
200b0 70 2d 3e 70 72 65 72 65 71 20 26 20 7e 70 46 72  p->prereq & ~pFr
200c0 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30  om->maskLoop)!=0
200d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
200e0 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70       if( (pWLoop
200f0 2d 3e 6d 61 73 6b 53 65 6c 66 20 26 20 70 46 72  ->maskSelf & pFr
20100 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30  om->maskLoop)!=0
20110 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
20120 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20       /* At this 
20130 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69 73  point, pWLoop is
20140 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20   a candidate to 
20150 62 65 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f 70  be the next loop
20160 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 6f  . .        ** Co
20170 6d 70 75 74 65 20 69 74 73 20 63 6f 73 74 20 2a  mpute its cost *
20180 2f 0a 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72  /.        rUnsor
20190 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  ted = sqlite3Log
201a0 45 73 74 41 64 64 28 70 57 4c 6f 6f 70 2d 3e 72  EstAdd(pWLoop->r
201b0 53 65 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52  Setup,pWLoop->rR
201c0 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77  un + pFrom->nRow
201d0 29 3b 0a 20 20 20 20 20 20 20 20 72 55 6e 73 6f  );.        rUnso
201e0 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rted = sqlite3Lo
201f0 67 45 73 74 41 64 64 28 72 55 6e 73 6f 72 74 65  gEstAdd(rUnsorte
20200 64 2c 20 70 46 72 6f 6d 2d 3e 72 55 6e 73 6f 72  d, pFrom->rUnsor
20210 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 6e 4f  ted);.        nO
20220 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77  ut = pFrom->nRow
20230 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b   + pWLoop->nOut;
20240 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 4e 65 77  .        maskNew
20250 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f   = pFrom->maskLo
20260 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73  op | pWLoop->mas
20270 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 69  kSelf;.        i
20280 66 28 20 69 73 4f 72 64 65 72 65 64 3c 30 20 29  f( isOrdered<0 )
20290 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f 72  {.          isOr
202a0 64 65 72 65 64 20 3d 20 77 68 65 72 65 50 61 74  dered = wherePat
202b0 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42  hSatisfiesOrderB
202c0 79 28 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20 20  y(pWInfo,.      
202d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202e0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
202f0 79 2c 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66 6f  y, pFrom, pWInfo
20300 2d 3e 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20 20  ->wctrlFlags,.  
20310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20320 20 20 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f       iLoop, pWLo
20330 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29 3b 0a 20  op, &revMask);. 
20340 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
20350 20 20 20 20 20 20 20 20 72 65 76 4d 61 73 6b 20          revMask 
20360 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70  = pFrom->revLoop
20370 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
20380 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 65      if( isOrdere
20390 64 3e 3d 30 20 26 26 20 69 73 4f 72 64 65 72 65  d>=0 && isOrdere
203a0 64 3c 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  d<nOrderBy ){.  
203b0 20 20 20 20 20 20 20 20 69 66 28 20 61 53 6f 72          if( aSor
203c0 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d  tCost[isOrdered]
203d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
203e0 20 20 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f     aSortCost[isO
203f0 72 64 65 72 65 64 5d 20 3d 20 77 68 65 72 65 53  rdered] = whereS
20400 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20 20 20 20  ortingCost(.    
20410 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e              pWIn
20420 66 6f 2c 20 6e 52 6f 77 45 73 74 2c 20 6e 4f 72  fo, nRowEst, nOr
20430 64 65 72 42 79 2c 20 69 73 4f 72 64 65 72 65 64  derBy, isOrdered
20440 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a  .            );.
20450 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
20460 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 73 71        rCost = sq
20470 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72  lite3LogEstAdd(r
20480 55 6e 73 6f 72 74 65 64 2c 20 61 53 6f 72 74 43  Unsorted, aSortC
20490 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 29 3b  ost[isOrdered]);
204a0 0a 0a 20 20 20 20 20 20 20 20 20 20 57 48 45 52  ..          WHER
204b0 45 54 52 41 43 45 28 30 78 30 30 32 2c 0a 20 20  ETRACE(0x002,.  
204c0 20 20 20 20 20 20 20 20 20 20 20 20 28 22 2d 2d              ("--
204d0 2d 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25 2d 33  -- sort cost=%-3
204e0 64 20 28 25 64 2f 25 64 29 20 69 6e 63 72 65 61  d (%d/%d) increa
204f0 73 65 73 20 63 6f 73 74 20 25 33 64 20 74 6f 20  ses cost %3d to 
20500 25 2d 33 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %-3d\n",.       
20510 20 20 20 20 20 20 20 20 61 53 6f 72 74 43 6f 73          aSortCos
20520 74 5b 69 73 4f 72 64 65 72 65 64 5d 2c 20 28 6e  t[isOrdered], (n
20530 4f 72 64 65 72 42 79 2d 69 73 4f 72 64 65 72 65  OrderBy-isOrdere
20540 64 29 2c 20 6e 4f 72 64 65 72 42 79 2c 20 0a 20  d), nOrderBy, . 
20550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 55                rU
20560 6e 73 6f 72 74 65 64 2c 20 72 43 6f 73 74 29 29  nsorted, rCost))
20570 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
20580 0a 20 20 20 20 20 20 20 20 20 20 72 43 6f 73 74  .          rCost
20590 20 3d 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20   = rUnsorted;.  
205a0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
205b0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
205c0 20 69 66 20 70 57 4c 6f 6f 70 20 73 68 6f 75 6c   if pWLoop shoul
205d0 64 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  d be added to th
205e0 65 20 73 65 74 20 6f 66 0a 20 20 20 20 20 20 20  e set of.       
205f0 20 2a 2a 20 6d 78 43 68 6f 69 63 65 20 62 65 73   ** mxChoice bes
20600 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 2e 0a  t-so-far paths..
20610 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
20620 20 20 20 2a 2a 20 46 69 72 73 74 20 6c 6f 6f 6b     ** First look
20630 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67   for an existing
20640 20 70 61 74 68 20 61 6d 6f 6e 67 20 62 65 73 74   path among best
20650 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 0a 20 20  -so-far paths.  
20660 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f        ** that co
20670 76 65 72 73 20 74 68 65 20 73 61 6d 65 20 73 65  vers the same se
20680 74 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20 68  t of loops and h
20690 61 73 20 74 68 65 20 73 61 6d 65 20 69 73 4f 72  as the same isOr
206a0 64 65 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  dered.        **
206b0 20 73 65 74 74 69 6e 67 20 61 73 20 74 68 65 20   setting as the 
206c0 63 75 72 72 65 6e 74 20 70 61 74 68 20 63 61 6e  current path can
206d0 64 69 64 61 74 65 2e 0a 20 20 20 20 20 20 20 20  didate..        
206e0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
206f0 65 20 74 65 72 6d 20 22 28 28 70 54 6f 2d 3e 69  e term "((pTo->i
20700 73 4f 72 64 65 72 65 64 5e 69 73 4f 72 64 65 72  sOrdered^isOrder
20710 65 64 29 26 30 78 38 30 29 3d 3d 30 22 20 69 73  ed)&0x80)==0" is
20720 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20   equivalent.    
20730 20 20 20 20 2a 2a 20 74 6f 20 28 70 54 6f 2d 3e      ** to (pTo->
20740 69 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29 29  isOrdered==(-1))
20750 3d 3d 28 69 73 4f 72 64 65 72 65 64 3d 3d 28 2d  ==(isOrdered==(-
20760 31 29 29 22 20 66 6f 72 20 74 68 65 20 72 61 6e  1))" for the ran
20770 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ge.        ** of
20780 20 6c 65 67 61 6c 20 76 61 6c 75 65 73 20 66 6f   legal values fo
20790 72 20 69 73 4f 72 64 65 72 65 64 2c 20 2d 31 2e  r isOrdered, -1.
207a0 2e 36 34 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  .64..        */.
207b0 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30          for(jj=0
207c0 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54  , pTo=aTo; jj<nT
207d0 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b  o; jj++, pTo++){
207e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
207f0 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61  To->maskLoop==ma
20800 73 6b 4e 65 77 0a 20 20 20 20 20 20 20 20 20 20  skNew.          
20810 20 26 26 20 28 28 70 54 6f 2d 3e 69 73 4f 72 64   && ((pTo->isOrd
20820 65 72 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26  ered^isOrdered)&
20830 30 78 38 30 29 3d 3d 30 0a 20 20 20 20 20 20 20  0x80)==0.       
20840 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
20850 20 20 74 65 73 74 63 61 73 65 28 20 6a 6a 3d 3d    testcase( jj==
20860 6e 54 6f 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  nTo-1 );.       
20870 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20880 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
20890 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a  }.        if( jj
208a0 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20 20  >=nTo ){.       
208b0 20 20 20 2f 2a 20 4e 6f 6e 65 20 6f 66 20 74 68     /* None of th
208c0 65 20 65 78 69 73 74 69 6e 67 20 62 65 73 74 2d  e existing best-
208d0 73 6f 2d 66 61 72 20 70 61 74 68 73 20 6d 61 74  so-far paths mat
208e0 63 68 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  ch the candidate
208f0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  . */.          i
20900 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65  f( nTo>=mxChoice
20910 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
20920 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 7c 7c 20  rCost>mxCost || 
20930 28 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26  (rCost==mxCost &
20940 26 20 72 55 6e 73 6f 72 74 65 64 3e 3d 6d 78 55  & rUnsorted>=mxU
20950 6e 73 6f 72 74 65 64 29 29 0a 20 20 20 20 20 20  nsorted)).      
20960 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
20970 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e     /* The curren
20980 74 20 63 61 6e 64 69 64 61 74 65 20 69 73 20 6e  t candidate is n
20990 6f 20 62 65 74 74 65 72 20 74 68 61 6e 20 61 6e  o better than an
209a0 79 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63  y of the mxChoic
209b0 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
209c0 20 70 61 74 68 73 20 63 75 72 72 65 6e 74 6c 79   paths currently
209d0 20 69 6e 20 74 68 65 20 62 65 73 74 2d 73 6f 2d   in the best-so-
209e0 66 61 72 20 62 75 66 66 65 72 2e 20 20 53 6f 20  far buffer.  So 
209f0 64 69 73 63 61 72 64 0a 20 20 20 20 20 20 20 20  discard.        
20a00 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 6e 64      ** this cand
20a10 69 64 61 74 65 20 61 73 20 6e 6f 74 20 76 69 61  idate as not via
20a20 62 6c 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20 57  ble. */.#ifdef W
20a30 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
20a40 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20  D /* 0x4 */.    
20a50 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
20a60 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78  te3WhereTrace&0x
20a70 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
20a80 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
20a90 72 69 6e 74 66 28 22 53 6b 69 70 20 20 20 25 73  rintf("Skip   %s
20aa0 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f   cost=%-3d,%3d o
20ab0 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20  rder=%c\n",.    
20ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
20ad0 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f  erePathName(pFro
20ae0 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70  m, iLoop, pWLoop
20af0 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a  ), rCost, nOut,.
20b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b10 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f    isOrdered>=0 ?
20b20 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a   isOrdered+'0' :
20b30 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
20b40 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
20b50 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
20b60 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
20b70 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
20b80 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
20b90 74 73 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  ts it means that
20ba0 20 74 68 65 20 6e 65 77 20 63 61 6e 64 69 64 61   the new candida
20bb0 74 65 20 70 61 74 68 0a 20 20 20 20 20 20 20 20  te path.        
20bc0 20 20 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65    ** needs to be
20bd0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 65   added to the se
20be0 74 20 6f 66 20 62 65 73 74 2d 73 6f 2d 66 61 72  t of best-so-far
20bf0 20 70 61 74 68 73 2e 20 2a 2f 0a 20 20 20 20 20   paths. */.     
20c00 20 20 20 20 20 69 66 28 20 6e 54 6f 3c 6d 78 43       if( nTo<mxC
20c10 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20  hoice ){.       
20c20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65       /* Increase
20c30 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
20c40 20 61 54 6f 20 73 65 74 20 62 79 20 6f 6e 65 20   aTo set by one 
20c50 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  */.            j
20c60 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20  j = nTo++;.     
20c70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20c80 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 70          /* New p
20c90 61 74 68 20 72 65 70 6c 61 63 65 73 20 74 68 65  ath replaces the
20ca0 20 70 72 69 6f 72 20 77 6f 72 73 74 20 74 6f 20   prior worst to 
20cb0 6b 65 65 70 20 63 6f 75 6e 74 20 62 65 6c 6f 77  keep count below
20cc0 20 6d 78 43 68 6f 69 63 65 20 2a 2f 0a 20 20 20   mxChoice */.   
20cd0 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6d 78           jj = mx
20ce0 49 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  I;.          }. 
20cf0 20 20 20 20 20 20 20 20 20 70 54 6f 20 3d 20 26           pTo = &
20d00 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65 66 20  aTo[jj];.#ifdef 
20d10 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
20d20 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20  ED /* 0x4 */.   
20d30 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
20d40 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
20d50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
20d60 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
20d70 74 66 28 22 4e 65 77 20 20 20 20 25 73 20 63 6f  tf("New    %s co
20d80 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65  st=%-3d,%3d orde
20d90 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20  r=%c\n",.       
20da0 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
20db0 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c  thName(pFrom, iL
20dc0 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43  oop, pWLoop), rC
20dd0 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20  ost, nOut,.     
20de0 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
20df0 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65  ered>=0 ? isOrde
20e00 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
20e10 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
20e20 69 66 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  if.        }else
20e30 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  {.          /* C
20e40 6f 6e 74 72 6f 6c 20 72 65 61 63 68 65 73 20 68  ontrol reaches h
20e50 65 72 65 20 69 66 20 62 65 73 74 2d 73 6f 2d 66  ere if best-so-f
20e60 61 72 20 70 61 74 68 20 70 54 6f 3d 61 54 6f 5b  ar path pTo=aTo[
20e70 6a 6a 5d 20 63 6f 76 65 72 73 20 74 68 65 0a 20  jj] covers the. 
20e80 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 65           ** same
20e90 20 73 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61 6e   set of loops an
20ea0 64 20 68 61 73 20 74 68 65 20 73 61 6d 20 69 73  d has the sam is
20eb0 4f 72 64 65 72 65 64 20 73 65 74 74 69 6e 67 20  Ordered setting 
20ec0 61 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  as the.         
20ed0 20 2a 2a 20 63 61 6e 64 69 64 61 74 65 20 70 61   ** candidate pa
20ee0 74 68 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65  th.  Check to se
20ef0 65 20 69 66 20 74 68 65 20 63 61 6e 64 69 64 61  e if the candida
20f00 74 65 20 73 68 6f 75 6c 64 20 72 65 70 6c 61 63  te should replac
20f10 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  e.          ** p
20f20 54 6f 20 6f 72 20 69 66 20 74 68 65 20 63 61 6e  To or if the can
20f30 64 69 64 61 74 65 20 73 68 6f 75 6c 64 20 62 65  didate should be
20f40 20 73 6b 69 70 70 65 64 20 2a 2f 0a 20 20 20 20   skipped */.    
20f50 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72        if( pTo->r
20f60 43 6f 73 74 3c 72 43 6f 73 74 20 7c 7c 20 28 70  Cost<rCost || (p
20f70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74  To->rCost==rCost
20f80 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c 3d 6e   && pTo->nRow<=n
20f90 4f 75 74 29 20 29 7b 0a 23 69 66 64 65 66 20 57  Out) ){.#ifdef W
20fa0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
20fb0 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20  D /* 0x4 */.    
20fc0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
20fd0 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78  te3WhereTrace&0x
20fe0 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
20ff0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
21000 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
21010 20 20 20 20 20 20 20 20 20 22 53 6b 69 70 20 20           "Skip  
21020 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33   %s cost=%-3d,%3
21030 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20  d order=%c",.   
21040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
21050 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72  herePathName(pFr
21060 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f  om, iLoop, pWLoo
21070 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c  p), rCost, nOut,
21080 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21090 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20     isOrdered>=0 
210a0 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20  ? isOrdered+'0' 
210b0 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
210c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
210d0 75 67 50 72 69 6e 74 66 28 22 20 20 20 76 73 20  ugPrintf("   vs 
210e0 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 64 20  %s cost=%-3d,%d 
210f0 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20  order=%c\n",.   
21100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
21110 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f  herePathName(pTo
21120 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70  , iLoop+1, 0), p
21130 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e  To->rCost, pTo->
21140 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  nRow,.          
21150 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f          pTo->isO
21160 72 64 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d  rdered>=0 ? pTo-
21170 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a  >isOrdered+'0' :
21180 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
21190 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
211a0 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 63 61          /* Disca
211b0 72 64 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  rd the candidate
211c0 20 70 61 74 68 20 66 72 6f 6d 20 66 75 72 74 68   path from furth
211d0 65 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e  er consideration
211e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
211f0 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72  testcase( pTo->r
21200 43 6f 73 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20  Cost==rCost );. 
21210 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
21220 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
21230 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
21240 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d  ase( pTo->rCost=
21250 3d 72 43 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20  =rCost+1 );.    
21260 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c        /* Control
21270 20 72 65 61 63 68 65 73 20 68 65 72 65 20 69 66   reaches here if
21280 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 70   the candidate p
21290 61 74 68 20 69 73 20 62 65 74 74 65 72 20 74 68  ath is better th
212a0 61 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  an the.         
212b0 20 2a 2a 20 70 54 6f 20 70 61 74 68 2e 20 20 52   ** pTo path.  R
212c0 65 70 6c 61 63 65 20 70 54 6f 20 77 69 74 68 20  eplace pTo with 
212d0 74 68 65 20 63 61 6e 64 69 64 61 74 65 2e 20 2a  the candidate. *
212e0 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  /.#ifdef WHERETR
212f0 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
21300 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  x4 */.          
21310 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
21320 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
21330 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21340 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20  DebugPrintf(.   
21350 20 20 20 20 20 20 20 20 20 20 20 20 20 22 55 70               "Up
21360 64 61 74 65 20 25 73 20 63 6f 73 74 3d 25 2d 33  date %s cost=%-3
21370 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c  d,%3d order=%c",
21380 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21390 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
213a0 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c  From, iLoop, pWL
213b0 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75  oop), rCost, nOu
213c0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
213d0 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20     isOrdered>=0 
213e0 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20  ? isOrdered+'0' 
213f0 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
21400 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
21410 50 72 69 6e 74 66 28 22 20 20 77 61 73 20 25 73  Printf("  was %s
21420 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f   cost=%-3d,%3d o
21430 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20  rder=%c\n",.    
21440 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
21450 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69  ePathName(pTo, i
21460 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d  Loop+1, 0), pTo-
21470 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f  >rCost, pTo->nRo
21480 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  w,.             
21490 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65     pTo->isOrdere
214a0 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72  d>=0 ? pTo->isOr
214b0 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
214c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65  ;.          }.#e
214d0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20  ndif.        }. 
214e0 20 20 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70         /* pWLoop
214f0 20 69 73 20 61 20 77 69 6e 6e 65 72 2e 20 20 41   is a winner.  A
21500 64 64 20 69 74 20 74 6f 20 74 68 65 20 73 65 74  dd it to the set
21510 20 6f 66 20 62 65 73 74 20 73 6f 20 66 61 72 20   of best so far 
21520 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  */.        pTo->
21530 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d  maskLoop = pFrom
21540 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c  ->maskLoop | pWL
21550 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
21560 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 65 76 4c         pTo->revL
21570 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20  oop = revMask;. 
21580 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77         pTo->nRow
21590 20 3d 20 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20   = nOut;.       
215a0 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43   pTo->rCost = rC
215b0 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  ost;.        pTo
215c0 2d 3e 72 55 6e 73 6f 72 74 65 64 20 3d 20 72 55  ->rUnsorted = rU
215d0 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20  nsorted;.       
215e0 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20   pTo->isOrdered 
215f0 3d 20 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20  = isOrdered;.   
21600 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d       memcpy(pTo-
21610 3e 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61  >aLoop, pFrom->a
21620 4c 6f 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68 65  Loop, sizeof(Whe
21630 72 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b  reLoop*)*iLoop);
21640 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c  .        pTo->aL
21650 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c  oop[iLoop] = pWL
21660 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28  oop;.        if(
21670 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29   nTo>=mxChoice )
21680 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 49 20  {.          mxI 
21690 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  = 0;.          m
216a0 78 43 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e 72  xCost = aTo[0].r
216b0 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Cost;.          
216c0 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 61 54 6f  mxUnsorted = aTo
216d0 5b 30 5d 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20  [0].nRow;.      
216e0 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70 54      for(jj=1, pT
216f0 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78  o=&aTo[1]; jj<mx
21700 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54  Choice; jj++, pT
21710 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o++){.          
21720 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74    if( pTo->rCost
21730 3e 6d 78 43 6f 73 74 20 0a 20 20 20 20 20 20 20  >mxCost .       
21740 20 20 20 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 72        || (pTo->r
21750 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20  Cost==mxCost && 
21760 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3e 6d  pTo->rUnsorted>m
21770 78 55 6e 73 6f 72 74 65 64 29 20 0a 20 20 20 20  xUnsorted) .    
21780 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
21790 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20           mxCost 
217a0 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20  = pTo->rCost;.  
217b0 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 55 6e              mxUn
217c0 73 6f 72 74 65 64 20 3d 20 70 54 6f 2d 3e 72 55  sorted = pTo->rU
217d0 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20  nsorted;.       
217e0 20 20 20 20 20 20 20 6d 78 49 20 3d 20 6a 6a 3b         mxI = jj;
217f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
21800 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21810 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
21820 20 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45   }..#ifdef WHERE
21830 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 20 2f  TRACE_ENABLED  /
21840 2a 20 3e 3d 32 20 2a 2f 0a 20 20 20 20 69 66 28  * >=2 */.    if(
21850 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
21860 63 65 20 26 20 30 78 30 32 20 29 7b 0a 20 20 20  ce & 0x02 ){.   
21870 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
21880 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 61 66 74 65  rintf("---- afte
21890 72 20 72 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c  r round %d ----\
218a0 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20  n", iLoop);.    
218b0 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 54 6f 3d    for(ii=0, pTo=
218c0 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b  aTo; ii<nTo; ii+
218d0 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20  +, pTo++){.     
218e0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
218f0 72 69 6e 74 66 28 22 20 25 73 20 63 6f 73 74 3d  rintf(" %s cost=
21900 25 2d 33 64 20 6e 72 6f 77 3d 25 2d 33 64 20 6f  %-3d nrow=%-3d o
21910 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20  rder=%c",.      
21920 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
21930 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c  me(pTo, iLoop+1,
21940 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c   0), pTo->rCost,
21950 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20   pTo->nRow,.    
21960 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72         pTo->isOr
21970 64 65 72 65 64 3e 3d 30 20 3f 20 28 70 54 6f 2d  dered>=0 ? (pTo-
21980 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27 29 20  >isOrdered+'0') 
21990 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
219a0 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72  if( pTo->isOrder
219b0 65 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ed>0 ){.        
219c0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
219d0 69 6e 74 66 28 22 20 72 65 76 3d 30 78 25 6c 6c  intf(" rev=0x%ll
219e0 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f  x\n", pTo->revLo
219f0 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  op);.        }el
21a00 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
21a10 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
21a20 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  ("\n");.        
21a30 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
21a40 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53  #endif..    /* S
21a50 77 61 70 20 74 68 65 20 72 6f 6c 65 73 20 6f 66  wap the roles of
21a60 20 61 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20 66   aFrom and aTo f
21a70 6f 72 20 74 68 65 20 6e 65 78 74 20 67 65 6e 65  or the next gene
21a80 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 46  ration */.    pF
21a90 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20 61  rom = aTo;.    a
21aa0 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20 20  To = aFrom;.    
21ab0 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20  aFrom = pFrom;. 
21ac0 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a     nFrom = nTo;.
21ad0 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f 6d    }..  if( nFrom
21ae0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
21af0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
21b00 65 2c 20 22 6e 6f 20 71 75 65 72 79 20 73 6f 6c  e, "no query sol
21b10 75 74 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71 6c  ution");.    sql
21b20 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
21b30 53 70 61 63 65 29 3b 0a 20 20 20 20 72 65 74 75  Space);.    retu
21b40 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
21b50 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6e  .  }.  .  /* Fin
21b60 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  d the lowest cos
21b70 74 20 70 61 74 68 2e 20 20 70 46 72 6f 6d 20 77  t path.  pFrom w
21b80 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e  ill be left poin
21b90 74 69 6e 67 20 74 6f 20 74 68 61 74 20 70 61 74  ting to that pat
21ba0 68 20 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20 61  h */.  pFrom = a
21bb0 46 72 6f 6d 3b 0a 20 20 66 6f 72 28 69 69 3d 31  From;.  for(ii=1
21bc0 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b  ; ii<nFrom; ii++
21bd0 29 7b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d  ){.    if( pFrom
21be0 2d 3e 72 43 6f 73 74 3e 61 46 72 6f 6d 5b 69 69  ->rCost>aFrom[ii
21bf0 5d 2e 72 43 6f 73 74 20 29 20 70 46 72 6f 6d 20  ].rCost ) pFrom 
21c00 3d 20 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20  = &aFrom[ii];.  
21c10 7d 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  }.  assert( pWIn
21c20 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f  fo->nLevel==nLoo
21c30 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20 74  p );.  /* Load t
21c40 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70  he lowest cost p
21c50 61 74 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f 20  ath into pWInfo 
21c60 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30  */.  for(iLoop=0
21c70 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69  ; iLoop<nLoop; i
21c80 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68 65  Loop++){.    Whe
21c90 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20  reLevel *pLevel 
21ca0 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c  = pWInfo->a + iL
21cb0 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  oop;.    pLevel-
21cc0 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70  >pWLoop = pWLoop
21cd0 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b   = pFrom->aLoop[
21ce0 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65 76  iLoop];.    pLev
21cf0 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c 6f  el->iFrom = pWLo
21d00 6f 70 2d 3e 69 54 61 62 3b 0a 20 20 20 20 70 4c  op->iTab;.    pL
21d10 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20  evel->iTabCur = 
21d20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
21d30 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
21d40 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d 0a  m].iCursor;.  }.
21d50 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
21d60 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
21d70 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29  E_WANT_DISTINCT)
21d80 21 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66  !=0.   && (pWInf
21d90 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
21da0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
21db0 29 3d 3d 30 0a 20 20 20 26 26 20 70 57 49 6e 66  )==0.   && pWInf
21dc0 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57 48  o->eDistinct==WH
21dd0 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f  ERE_DISTINCT_NOO
21de0 50 0a 20 20 20 26 26 20 6e 52 6f 77 45 73 74 0a  P.   && nRowEst.
21df0 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b    ){.    Bitmask
21e00 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 69 6e   notUsed;.    in
21e10 74 20 72 63 20 3d 20 77 68 65 72 65 50 61 74 68  t rc = wherePath
21e20 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
21e30 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d  (pWInfo, pWInfo-
21e40 3e 70 52 65 73 75 6c 74 53 65 74 2c 20 70 46 72  >pResultSet, pFr
21e50 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  om,.            
21e60 20 20 20 20 20 57 48 45 52 45 5f 44 49 53 54 49       WHERE_DISTI
21e70 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20  NCTBY, nLoop-1, 
21e80 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f  pFrom->aLoop[nLo
21e90 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64 29  op-1], &notUsed)
21ea0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 70 57  ;.    if( rc==pW
21eb0 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74  Info->pResultSet
21ec0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
21ed0 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
21ee0 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
21ef0 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20  NCT_ORDERED;.   
21f00 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49   }.  }.  if( pWI
21f10 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  nfo->pOrderBy ){
21f20 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
21f30 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
21f40 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29  ERE_DISTINCTBY )
21f50 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 6f  {.      if( pFro
21f60 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d 70 57  m->isOrdered==pW
21f70 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Info->pOrderBy->
21f80 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
21f90 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
21fa0 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
21fb0 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20  NCT_ORDERED;.   
21fc0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
21fd0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f        pWInfo->nO
21fe0 42 53 61 74 20 3d 20 70 46 72 6f 6d 2d 3e 69 73  BSat = pFrom->is
21ff0 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 69  Ordered;.      i
22000 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61  f( pWInfo->nOBSa
22010 74 3c 30 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f  t<0 ) pWInfo->nO
22020 42 53 61 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  BSat = 0;.      
22030 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20  pWInfo->revMask 
22040 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70  = pFrom->revLoop
22050 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
22060 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
22070 61 67 73 20 26 20 57 48 45 52 45 5f 53 4f 52 54  ags & WHERE_SORT
22080 42 59 47 52 4f 55 50 29 0a 20 20 20 20 20 20 20  BYGROUP).       
22090 20 26 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53   && pWInfo->nOBS
220a0 61 74 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  at==pWInfo->pOrd
220b0 65 72 42 79 2d 3e 6e 45 78 70 72 20 26 26 20 6e  erBy->nExpr && n
220c0 4c 6f 6f 70 3e 30 0a 20 20 20 20 29 7b 0a 20 20  Loop>0.    ){.  
220d0 20 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4d      Bitmask revM
220e0 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ask = 0;.      i
220f0 6e 74 20 6e 4f 72 64 65 72 20 3d 20 77 68 65 72  nt nOrder = wher
22100 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
22110 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57  derBy(pWInfo, pW
22120 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20  Info->pOrderBy, 
22130 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d  .          pFrom
22140 2c 20 30 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46  , 0, nLoop-1, pF
22150 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70  rom->aLoop[nLoop
22160 2d 31 5d 2c 20 26 72 65 76 4d 61 73 6b 0a 20 20  -1], &revMask.  
22170 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
22180 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 73 6f 72  ert( pWInfo->sor
22190 74 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ted==0 );.      
221a0 69 66 28 20 6e 4f 72 64 65 72 3d 3d 70 57 49 6e  if( nOrder==pWIn
221b0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  fo->pOrderBy->nE
221c0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  xpr ){.        p
221d0 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 20 3d 20  WInfo->sorted = 
221e0 31 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  1;.        pWInf
221f0 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 72 65 76  o->revMask = rev
22200 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Mask;.      }.  
22210 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 70 57 49 6e    }.  }...  pWIn
22220 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 70 46  fo->nRowOut = pF
22230 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a  rom->nRow;..  /*
22240 20 46 72 65 65 20 74 65 6d 70 6f 72 61 72 79 20   Free temporary 
22250 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65 74 75 72  memory and retur
22260 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 73  n success */.  s
22270 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
22280 20 70 53 70 61 63 65 29 3b 0a 20 20 72 65 74 75   pSpace);.  retu
22290 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
222a0 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75 65 72  ./*.** Most quer
222b0 69 65 73 20 75 73 65 20 6f 6e 6c 79 20 61 20 73  ies use only a s
222c0 69 6e 67 6c 65 20 74 61 62 6c 65 20 28 74 68 65  ingle table (the
222d0 79 20 61 72 65 20 6e 6f 74 20 6a 6f 69 6e 73 29  y are not joins)
222e0 20 61 6e 64 20 68 61 76 65 0a 2a 2a 20 73 69 6d   and have.** sim
222f0 70 6c 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e  ple == constrain
22300 74 73 20 61 67 61 69 6e 73 74 20 69 6e 64 65 78  ts against index
22310 65 64 20 66 69 65 6c 64 73 2e 20 20 54 68 69 73  ed fields.  This
22320 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
22330 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20 74 68 6f  s.** to plan tho
22340 73 65 20 73 69 6d 70 6c 65 20 63 61 73 65 73 20  se simple cases 
22350 75 73 69 6e 67 20 6d 75 63 68 20 6c 65 73 73 20  using much less 
22360 63 65 72 65 6d 6f 6e 79 20 74 68 61 6e 20 74 68  ceremony than th
22370 65 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72  e.** general-pur
22380 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e  pose query plann
22390 65 72 2c 20 61 6e 64 20 74 68 65 72 65 62 79 20  er, and thereby 
223a0 79 69 65 6c 64 20 66 61 73 74 65 72 20 73 71 6c  yield faster sql
223b0 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 0a 2a  ite3_prepare().*
223c0 2a 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65 20  * times for the 
223d0 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a  common case..**.
223e0 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ** Return non-ze
223f0 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 69  ro on success, i
22400 66 20 74 68 69 73 20 71 75 65 72 79 20 63 61 6e  f this query can
22410 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74   be handled by t
22420 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73  his.** no-frills
22430 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20   query planner. 
22440 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 69 66 20   Return zero if 
22450 74 68 69 73 20 71 75 65 72 79 20 6e 65 65 64 73  this query needs
22460 20 74 68 65 20 0a 2a 2a 20 67 65 6e 65 72 61 6c   the .** general
22470 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79 20 70  -purpose query p
22480 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  lanner..*/.stati
22490 63 20 69 6e 74 20 77 68 65 72 65 53 68 6f 72 74  c int whereShort
224a0 43 75 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69  Cut(WhereLoopBui
224b0 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b  lder *pBuilder){
224c0 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
224d0 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 53  Info;.  struct S
224e0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
224f0 65 6d 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73  em;.  WhereClaus
22500 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 54  e *pWC;.  WhereT
22510 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 57 68  erm *pTerm;.  Wh
22520 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a  ereLoop *pLoop;.
22530 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e    int iCur;.  in
22540 74 20 6a 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  t j;.  Table *pT
22550 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  ab;.  Index *pId
22560 78 3b 0a 20 20 0a 20 20 70 57 49 6e 66 6f 20 3d  x;.  .  pWInfo =
22570 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
22580 6f 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  o;.  if( pWInfo-
22590 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
225a0 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20  ERE_FORCE_TABLE 
225b0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73  ) return 0;.  as
225c0 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70 54  sert( pWInfo->pT
225d0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 31 20  abList->nSrc>=1 
225e0 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49  );.  pItem = pWI
225f0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
22600 3b 0a 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d  ;.  pTab = pItem
22610 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28 20 49 73  ->pTab;.  if( Is
22620 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20  Virtual(pTab) ) 
22630 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
22640 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65  pItem->fg.isInde
22650 78 65 64 42 79 20 29 20 72 65 74 75 72 6e 20 30  xedBy ) return 0
22660 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d  ;.  iCur = pItem
22670 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 57 43  ->iCursor;.  pWC
22680 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b   = &pWInfo->sWC;
22690 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 42 75 69 6c  .  pLoop = pBuil
226a0 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c 6f  der->pNew;.  pLo
226b0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b  op->wsFlags = 0;
226c0 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20  .  pLoop->nSkip 
226d0 3d 20 30 3b 0a 20 20 70 54 65 72 6d 20 3d 20 73  = 0;.  pTerm = s
226e0 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64 54  qlite3WhereFindT
226f0 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d  erm(pWC, iCur, -
22700 31 2c 20 30 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49  1, 0, WO_EQ|WO_I
22710 53 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65  S, 0);.  if( pTe
22720 72 6d 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61  rm ){.    testca
22730 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
22740 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a  ator & WO_IS );.
22750 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61      pLoop->wsFla
22760 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs = WHERE_COLUM
22770 4e 5f 45 51 7c 57 48 45 52 45 5f 49 50 4b 7c 57  N_EQ|WHERE_IPK|W
22780 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20  HERE_ONEROW;.   
22790 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30   pLoop->aLTerm[0
227a0 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70  ] = pTerm;.    p
227b0 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31  Loop->nLTerm = 1
227c0 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62  ;.    pLoop->u.b
227d0 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20  tree.nEq = 1;.  
227e0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73    /* TUNING: Cos
227f0 74 20 6f 66 20 61 20 72 6f 77 69 64 20 6c 6f 6f  t of a rowid loo
22800 6b 75 70 20 69 73 20 31 30 20 2a 2f 0a 20 20 20  kup is 10 */.   
22810 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33   pLoop->rRun = 3
22820 33 3b 20 20 2f 2a 20 33 33 3d 3d 73 71 6c 69 74  3;  /* 33==sqlit
22830 65 33 4c 6f 67 45 73 74 28 31 30 29 20 2a 2f 0a  e3LogEst(10) */.
22840 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
22850 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
22860 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
22870 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
22880 20 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 0a 20     int opMask;. 
22890 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
228a0 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3d  op->aLTermSpace=
228b0 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 20 29  =pLoop->aLTerm )
228c0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 49 73 55  ;.      if( !IsU
228d0 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29  niqueIndex(pIdx)
228e0 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d  .       || pIdx-
228f0 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d  >pPartIdxWhere!=
22900 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64  0 .       || pId
22910 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 41 72 72 61 79  x->nKeyCol>Array
22920 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65  Size(pLoop->aLTe
22930 72 6d 53 70 61 63 65 29 20 0a 20 20 20 20 20 20  rmSpace) .      
22940 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
22950 20 20 6f 70 4d 61 73 6b 20 3d 20 70 49 64 78 2d    opMask = pIdx-
22960 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3f 20 28  >uniqNotNull ? (
22970 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 3a 20 57  WO_EQ|WO_IS) : W
22980 4f 5f 45 51 3b 0a 20 20 20 20 20 20 66 6f 72 28  O_EQ;.      for(
22990 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65  j=0; j<pIdx->nKe
229a0 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  yCol; j++){.    
229b0 20 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69      pTerm = sqli
229c0 74 65 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d  te3WhereFindTerm
229d0 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 30  (pWC, iCur, j, 0
229e0 2c 20 6f 70 4d 61 73 6b 2c 20 70 49 64 78 29 3b  , opMask, pIdx);
229f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65  .        if( pTe
22a00 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rm==0 ) break;. 
22a10 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
22a20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
22a30 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20  r & WO_IS );.   
22a40 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65       pLoop->aLTe
22a50 72 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  rm[j] = pTerm;. 
22a60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
22a70 20 6a 21 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f   j!=pIdx->nKeyCo
22a80 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  l ) continue;.  
22a90 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61      pLoop->wsFla
22aa0 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs = WHERE_COLUM
22ab0 4e 5f 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52 4f  N_EQ|WHERE_ONERO
22ac0 57 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b  W|WHERE_INDEXED;
22ad0 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
22ae0 3e 69 73 43 6f 76 65 72 69 6e 67 20 7c 7c 20 28  >isCovering || (
22af0 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26  pItem->colUsed &
22b00 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78   ~columnsInIndex
22b10 28 70 49 64 78 29 29 3d 3d 30 20 29 7b 0a 20 20  (pIdx))==0 ){.  
22b20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46        pLoop->wsF
22b30 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44  lags |= WHERE_ID
22b40 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a  X_ONLY;.      }.
22b50 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54        pLoop->nLT
22b60 65 72 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70  erm = j;.      p
22b70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
22b80 71 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f  q = j;.      pLo
22b90 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
22ba0 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20  ex = pIdx;.     
22bb0 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74   /* TUNING: Cost
22bc0 20 6f 66 20 61 20 75 6e 69 71 75 65 20 69 6e 64   of a unique ind
22bd0 65 78 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35 20  ex lookup is 15 
22be0 2a 2f 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  */.      pLoop->
22bf0 72 52 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20 33  rRun = 39;  /* 3
22c00 39 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  9==sqlite3LogEst
22c10 28 31 35 29 20 2a 2f 0a 20 20 20 20 20 20 62 72  (15) */.      br
22c20 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
22c30 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
22c40 61 67 73 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70  ags ){.    pLoop
22c50 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74  ->nOut = (LogEst
22c60 29 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e  )1;.    pWInfo->
22c70 61 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c  a[0].pWLoop = pL
22c80 6f 6f 70 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  oop;.    pLoop->
22c90 6d 61 73 6b 53 65 6c 66 20 3d 20 73 71 6c 69 74  maskSelf = sqlit
22ca0 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26  e3WhereGetMask(&
22cb0 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
22cc0 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 70 57 49  , iCur);.    pWI
22cd0 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62 43 75  nfo->a[0].iTabCu
22ce0 72 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 57  r = iCur;.    pW
22cf0 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20  Info->nRowOut = 
22d00 31 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  1;.    if( pWInf
22d10 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 70 57  o->pOrderBy ) pW
22d20 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 20  Info->nOBSat =  
22d30 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
22d40 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ->nExpr;.    if(
22d50 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
22d60 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
22d70 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20  _DISTINCT ){.   
22d80 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74     pWInfo->eDist
22d90 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
22da0 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20  TINCT_UNIQUE;.  
22db0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
22dc0 45 5f 44 45 42 55 47 0a 20 20 20 20 70 4c 6f 6f  E_DEBUG.    pLoo
22dd0 70 2d 3e 63 49 64 20 3d 20 27 30 27 3b 0a 23 65  p->cId = '0';.#e
22de0 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
22df0 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
22e00 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  0;.}../*.** Gene
22e10 72 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69  rate the beginni
22e20 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75  ng of the loop u
22e30 73 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c  sed for WHERE cl
22e40 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
22e50 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
22e60 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65  alue is a pointe
22e70 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73  r to an opaque s
22e80 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f  tructure that co
22e90 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d  ntains.** inform
22ea0 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20  ation needed to 
22eb0 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
22ec0 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20  op.  Later, the 
22ed0 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a  calling routine.
22ee0 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65  ** should invoke
22ef0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
22f00 28 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75  () with the retu
22f10 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  rn value of this
22f20 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
22f30 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74  order to complet
22f40 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
22f50 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
22f60 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
22f70 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f   occurs, this ro
22f80 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55  utine returns NU
22f90 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61  LL..**.** The ba
22fa0 73 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64  sic idea is to d
22fb0 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c  o a nested loop,
22fc0 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61   one loop for ea
22fd0 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74  ch table in.** t
22fe0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
22ff0 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e  f a select.  (IN
23000 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20  SERT and UPDATE 
23010 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74  statements are t
23020 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20  he.** same as a 
23030 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79  SELECT with only
23040 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
23050 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
23060 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61  se.)  For.** exa
23070 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c  mple, if the SQL
23080 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20   is this:.**.** 
23090 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
230a0 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57  ROM t1, t2, t3 W
230b0 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20  HERE ...;.**.** 
230c0 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65  Then the code ge
230d0 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65  nerated is conce
230e0 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65  ptually like the
230f0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
23100 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72  *      foreach r
23110 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20  ow1 in t1 do    
23120 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
23130 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
23140 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e   foreach row2 in
23150 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20   t2 do      |-- 
23160 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
23170 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20  egin().**       
23180 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20     foreach row3 
23190 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20  in t3 do   /.** 
231a0 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a             ....*
231b0 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20  *          end  
231c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231d0 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
231e0 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
231f0 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
23200 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20              |-- 
23210 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  by sqlite3WhereE
23220 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64  nd().**      end
23230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23240 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a           /.**.**
23250 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c   Note that the l
23260 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62  oops might not b
23270 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20  e nested in the 
23280 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74  order in which t
23290 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e  hey.** appear in
232a0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
232b0 20 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20   if a different 
232c0 6f 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20  order is better 
232d0 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20  able to make.** 
232e0 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20  use of indices. 
232f0 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20   Note also that 
23300 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72  when the IN oper
23310 61 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a  ator appears in.
23320 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ** the WHERE cla
23330 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65  use, it might re
23340 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e  sult in addition
23350 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20  al nested loops 
23360 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20  for.** scanning 
23370 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75  through all valu
23380 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d  es on the right-
23390 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
233a0 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65   IN..**.** There
233b0 20 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f   are Btree curso
233c0 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
233d0 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20  th each table.  
233e0 74 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a  t1 uses cursor.*
233f0 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73  * number pTabLis
23400 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e  t->a[0].iCursor.
23410 20 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75    t2 uses the cu
23420 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61  rsor pTabList->a
23430 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20  [1].iCursor..** 
23440 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54  And so forth.  T
23450 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
23460 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70  rates code to op
23470 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75  en those VDBE cu
23480 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c  rsors.** and sql
23490 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67  ite3WhereEnd() g
234a0 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
234b0 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e  e to close them.
234c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
234d0 74 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72  that sqlite3Wher
234e0 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74  eBegin() generat
234f0 65 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75  es leaves the cu
23500 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69  rsors named.** i
23510 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74  n pTabList point
23520 69 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70  ing at their app
23530 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73  ropriate entries
23540 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64  .  The [...] cod
23550 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f  e.** can use OP_
23560 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f  Column and OP_Ro
23570 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74  wid opcodes on t
23580 68 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20  hese cursors to 
23590 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20  extract.** data 
235a0 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73  from the various
235b0 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c   tables of the l
235c0 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  oop..**.** If th
235d0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
235e0 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72  s empty, the for
235f0 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20  each loops must 
23600 65 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a  each scan their.
23610 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73  ** entire tables
23620 2e 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d  .  Thus a three-
23630 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f  way join is an O
23640 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e  (N^3) operation.
23650 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20    But if.** the 
23660 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69  tables have indi
23670 63 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72  ces and there ar
23680 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57  e terms in the W
23690 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
236a0 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f  .** refer to tho
236b0 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f  se indices, a co
236c0 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61  mplete table sca
236d0 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64  n can be avoided
236e0 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65   and the.** code
236f0 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66   will run much f
23700 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20  aster.  Most of 
23710 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73  the work of this
23720 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63   routine is chec
23730 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69  king.** to see i
23740 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69  f there are indi
23750 63 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20  ces that can be 
23760 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70  used to speed up
23770 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a   the loop..**.**
23780 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   Terms of the WH
23790 45 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61  ERE clause are a
237a0 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69  lso used to limi
237b0 74 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74  t which rows act
237c0 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74  ually.** make it
237d0 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e   to the "..." in
237e0 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74   the middle of t
237f0 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20  he loop.  After 
23800 65 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a  each "foreach",.
23810 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ** terms of the 
23820 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
23830 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73  t use only terms
23840 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e   in that loop an
23850 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73  d outer.** loops
23860 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61   are evaluated a
23870 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75  nd if false a ju
23880 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e  mp is made aroun
23890 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  d all subsequent
238a0 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20  .** inner loops 
238b0 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22  (or around the "
238c0 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74  ..." if the test
238d0 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
238e0 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73  he inner-.** mos
238f0 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55  t loop).**.** OU
23900 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20  TER JOINS.**.** 
23910 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66  An outer join of
23920 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74   tables t1 and t
23930 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79  2 is conceptally
23940 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77   coded as follow
23950 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65  s:.**.**    fore
23960 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64  ach row1 in t1 d
23970 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d  o.**      flag =
23980 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61   0.**      forea
23990 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
239a0 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74  .**        start
239b0 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e  :.**          ..
239c0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c  ..**          fl
239d0 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65  ag = 1.**      e
239e0 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c  nd.**      if fl
239f0 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20  ag==0 then.**   
23a00 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f       move the ro
23a10 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e  w2 cursor to a n
23a20 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20  ull row.**      
23a30 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20    goto start.** 
23a40 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e       fi.**    en
23a50 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59  d.**.** ORDER BY
23a60 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49   CLAUSE PROCESSI
23a70 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42  NG.**.** pOrderB
23a80 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  y is a pointer t
23a90 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
23aa0 6c 61 75 73 65 20 28 6f 72 20 74 68 65 20 47 52  lause (or the GR
23ab0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a  OUP BY clause.**
23ac0 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 47 52   if the WHERE_GR
23ad0 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20 73 65  OUPBY flag is se
23ae0 74 20 69 6e 20 77 63 74 72 6c 46 6c 61 67 73 29  t in wctrlFlags)
23af0 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61   of a SELECT sta
23b00 74 65 6d 65 6e 74 0a 2a 2a 20 69 66 20 74 68 65  tement.** if the
23b10 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74  re is one.  If t
23b20 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
23b30 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66   BY clause or if
23b40 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
23b50 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   is called from 
23b60 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  an UPDATE or DEL
23b70 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ETE statement, t
23b80 68 65 6e 20 70 4f 72 64 65 72 42 79 20 69 73 20  hen pOrderBy is 
23b90 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
23ba0 69 49 64 78 43 75 72 20 70 61 72 61 6d 65 74 65  iIdxCur paramete
23bb0 72 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20  r is the cursor 
23bc0 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64  number of an ind
23bd0 65 78 2e 20 20 49 66 20 0a 2a 2a 20 57 48 45 52  ex.  If .** WHER
23be0 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20  E_ONETABLE_ONLY 
23bf0 69 73 20 73 65 74 2c 20 69 49 64 78 43 75 72 20  is set, iIdxCur 
23c00 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  is the cursor nu
23c10 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78  mber of an index
23c20 0a 2a 2a 20 74 6f 20 75 73 65 20 66 6f 72 20 4f  .** to use for O
23c30 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  R clause process
23c40 69 6e 67 2e 20 20 54 68 65 20 57 48 45 52 45 20  ing.  The WHERE 
23c50 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 75 73  clause should us
23c60 65 20 74 68 69 73 0a 2a 2a 20 73 70 65 63 69 66  e this.** specif
23c70 69 63 20 63 75 72 73 6f 72 2e 20 20 49 66 20 57  ic cursor.  If W
23c80 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
23c90 49 52 45 44 20 69 73 20 73 65 74 2c 20 74 68 65  IRED is set, the
23ca0 6e 20 69 49 64 78 43 75 72 20 69 73 0a 2a 2a 20  n iIdxCur is.** 
23cb0 74 68 65 20 66 69 72 73 74 20 63 75 72 73 6f 72  the first cursor
23cc0 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
23cd0 63 75 72 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20  cursors for all 
23ce0 69 6e 64 69 63 65 73 2e 20 20 69 49 64 78 43 75  indices.  iIdxCu
23cf0 72 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 75  r should.** be u
23d00 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  sed to compute t
23d10 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  he appropriate c
23d20 75 72 73 6f 72 20 64 65 70 65 6e 64 69 6e 67 20  ursor depending 
23d30 6f 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20 69  on which index i
23d40 73 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 57 68  s.** used..*/.Wh
23d50 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  ereInfo *sqlite3
23d60 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61  WhereBegin(.  Pa
23d70 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
23d80 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
23d90 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
23da0 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
23db0 2c 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61  ,    /* FROM cla
23dc0 75 73 65 3a 20 41 20 6c 69 73 74 20 6f 66 20 61  use: A list of a
23dd0 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  ll tables to be 
23de0 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70  scanned */.  Exp
23df0 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20  r *pWhere,      
23e00 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
23e10 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
23e20 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
23e30 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59    /* An ORDER BY
23e40 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 63   (or GROUP BY) c
23e50 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a  lause, or NULL *
23e60 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 52  /.  ExprList *pR
23e70 65 73 75 6c 74 53 65 74 2c 20 2f 2a 20 52 65 73  esultSet, /* Res
23e80 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 71  ult set of the q
23e90 75 65 72 79 20 2a 2f 0a 20 20 75 31 36 20 77 63  uery */.  u16 wc
23ea0 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20  trlFlags,       
23eb0 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
23ec0 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69  ERE_* flags defi
23ed0 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74  ned in sqliteInt
23ee0 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  .h */.  int iIdx
23ef0 43 75 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Cur           /*
23f00 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 54 41 42   If WHERE_ONETAB
23f10 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20  LE_ONLY is set, 
23f20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 6e 75 6d  index cursor num
23f30 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ber */.){.  int 
23f40 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20 20 20 20  nByteWInfo;     
23f50 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62         /* Num. b
23f60 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  ytes allocated f
23f70 6f 72 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72  or WhereInfo str
23f80 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61  uct */.  int nTa
23f90 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  bList;          
23fa0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
23fb0 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54 61   elements in pTa
23fc0 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65  bList */.  Where
23fd0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
23fe0 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65        /* Will be
23ff0 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20  come the return 
24000 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
24010 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65  nction */.  Vdbe
24020 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
24030 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69  dbe;   /* The vi
24040 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65  rtual database e
24050 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61  ngine */.  Bitma
24060 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20  sk notReady;    
24070 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73        /* Cursors
24080 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65   that are not ye
24090 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a  t positioned */.
240a0 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
240b0 65 72 20 73 57 4c 42 3b 20 20 20 20 20 2f 2a 20  er sWLB;     /* 
240c0 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 62 75  The WhereLoop bu
240d0 69 6c 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65  ilder */.  Where
240e0 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
240f0 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  t;    /* The exp
24100 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74  ression mask set
24110 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
24120 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20   *pLevel;       
24130 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76   /* A single lev
24140 65 6c 20 69 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b  el in pWInfo->a[
24150 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ] */.  WhereLoop
24160 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
24170 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
24180 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4c 6f  a single WhereLo
24190 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  op object */.  i
241a0 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
241b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
241c0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73  p counter */.  s
241d0 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
241e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
241f0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
24200 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
24210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24220 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
24230 2a 2f 0a 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62  */...  /* Variab
24240 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  le initializatio
24250 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72  n */.  db = pPar
24260 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73 65 74  se->db;.  memset
24270 28 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a 65 6f  (&sWLB, 0, sizeo
24280 66 28 73 57 4c 42 29 29 3b 0a 0a 20 20 2f 2a 20  f(sWLB));..  /* 
24290 41 6e 20 4f 52 44 45 52 2f 47 52 4f 55 50 20 42  An ORDER/GROUP B
242a0 59 20 63 6c 61 75 73 65 20 6f 66 20 6d 6f 72 65  Y clause of more
242b0 20 74 68 61 6e 20 36 33 20 74 65 72 6d 73 20 63   than 63 terms c
242c0 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a  annot be optimiz
242d0 65 64 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  ed */.  testcase
242e0 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 70 4f  ( pOrderBy && pO
242f0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 42  rderBy->nExpr==B
24300 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 70 4f  MS-1 );.  if( pO
24310 72 64 65 72 42 79 20 26 26 20 70 4f 72 64 65 72  rderBy && pOrder
24320 42 79 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53 20 29  By->nExpr>=BMS )
24330 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   pOrderBy = 0;. 
24340 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d   sWLB.pOrderBy =
24350 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a   pOrderBy;..  /*
24360 20 44 69 73 61 62 6c 65 20 74 68 65 20 44 49 53   Disable the DIS
24370 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74 69  TINCT optimizati
24380 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69 73  on if SQLITE_Dis
24390 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74 20  tinctOpt is set 
243a0 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  via.  ** sqlite3
243b0 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49 54  _test_ctrl(SQLIT
243c0 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
243d0 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f  IZATIONS,...) */
243e0 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74  .  if( Optimizat
243f0 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20  ionDisabled(db, 
24400 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f  SQLITE_DistinctO
24410 70 74 29 20 29 7b 0a 20 20 20 20 77 63 74 72 6c  pt) ){.    wctrl
24420 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f  Flags &= ~WHERE_
24430 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b 0a 20  WANT_DISTINCT;. 
24440 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d   }..  /* The num
24450 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ber of tables in
24460 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
24470 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74   is limited by t
24480 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a  he number of.  *
24490 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d  * bits in a Bitm
244a0 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74  ask .  */.  test
244b0 63 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d 3e  case( pTabList->
244c0 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69  nSrc==BMS );.  i
244d0 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
244e0 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c  c>BMS ){.    sql
244f0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
24500 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64  rse, "at most %d
24510 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69   tables in a joi
24520 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65  n", BMS);.    re
24530 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
24540 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
24550 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74  normally generat
24560 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70  es a nested loop
24570 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
24580 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73  in .  ** pTabLis
24590 74 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 57  t.  But if the W
245a0 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
245b0 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  LY flag is set, 
245c0 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20  then we should. 
245d0 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74   ** only generat
245e0 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66  e code for the f
245f0 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54  irst table in pT
24600 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d  abList and assum
24610 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20  e that.  ** any 
24620 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74  cursors associat
24630 65 64 20 77 69 74 68 20 73 75 62 73 65 71 75 65  ed with subseque
24640 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e  nt tables are un
24650 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
24660 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28  /.  nTabList = (
24670 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
24680 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
24690 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74  ) ? 1 : pTabList
246a0 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c  ->nSrc;..  /* Al
246b0 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
246c0 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49  alize the WhereI
246d0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
246e0 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
246f0 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76  he.  ** return v
24700 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61  alue. A single a
24710 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65  llocation is use
24720 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57  d to store the W
24730 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74  hereInfo.  ** st
24740 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e  ruct, the conten
24750 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e  ts of WhereInfo.
24760 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c  a[], the WhereCl
24770 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 20  ause structure. 
24780 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72   ** and the Wher
24790 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75  eMaskSet structu
247a0 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43  re. Since WhereC
247b0 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61  lause contains a
247c0 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69  n 8-byte.  ** fi
247d0 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61 73  eld (type Bitmas
247e0 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c  k) it must be al
247f0 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79  igned on an 8-by
24800 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20  te boundary on. 
24810 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65   ** some archite
24820 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68  ctures. Hence th
24830 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77  e ROUND8() below
24840 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49  ..  */.  nByteWI
24850 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a  nfo = ROUND8(siz
24860 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28  eof(WhereInfo)+(
24870 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65  nTabList-1)*size
24880 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b  of(WhereLevel));
24890 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69  .  pWInfo = sqli
248a0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
248b0 64 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b  db, nByteWInfo +
248c0 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f   sizeof(WhereLoo
248d0 70 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  p));.  if( db->m
248e0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
248f0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
24900 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
24910 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20    pWInfo = 0;.  
24920 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
24930 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57  nError;.  }.  pW
24940 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
24950 73 73 5b 30 5d 20 3d 20 70 57 49 6e 66 6f 2d 3e  ss[0] = pWInfo->
24960 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20  aiCurOnePass[1] 
24970 3d 20 2d 31 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  = -1;.  pWInfo->
24980 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73  nLevel = nTabLis
24990 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61  t;.  pWInfo->pPa
249a0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
249b0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
249c0 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70   = pTabList;.  p
249d0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
249e0 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 57  = pOrderBy;.  pW
249f0 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74  Info->pResultSet
24a00 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20   = pResultSet;. 
24a10 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20   pWInfo->iBreak 
24a20 3d 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69  = pWInfo->iConti
24a30 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nue = sqlite3Vdb
24a40 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
24a50 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
24a60 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67 73  ags = wctrlFlags
24a70 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65  ;.  pWInfo->save
24a80 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50  dNQueryLoop = pP
24a90 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
24aa0 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26  ;.  pMaskSet = &
24ab0 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
24ac0 3b 0a 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20  ;.  sWLB.pWInfo 
24ad0 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42  = pWInfo;.  sWLB
24ae0 2e 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  .pWC = &pWInfo->
24af0 73 57 43 3b 0a 20 20 73 57 4c 42 2e 70 4e 65 77  sWC;.  sWLB.pNew
24b00 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 29 28   = (WhereLoop*)(
24b10 28 28 63 68 61 72 2a 29 70 57 49 6e 66 6f 29 2b  ((char*)pWInfo)+
24b20 6e 42 79 74 65 57 49 6e 66 6f 29 3b 0a 20 20 61  nByteWInfo);.  a
24b30 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
24b40 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 73 57 4c 42  E_ALIGNMENT(sWLB
24b50 2e 70 4e 65 77 29 20 29 3b 0a 20 20 77 68 65 72  .pNew) );.  wher
24b60 65 4c 6f 6f 70 49 6e 69 74 28 73 57 4c 42 2e 70  eLoopInit(sWLB.p
24b70 4e 65 77 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  New);.#ifdef SQL
24b80 49 54 45 5f 44 45 42 55 47 0a 20 20 73 57 4c 42  ITE_DEBUG.  sWLB
24b90 2e 70 4e 65 77 2d 3e 63 49 64 20 3d 20 27 2a 27  .pNew->cId = '*'
24ba0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53  ;.#endif..  /* S
24bb0 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20 63  plit the WHERE c
24bc0 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72  lause into separ
24bd0 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  ate subexpressio
24be0 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20 20  ns where each.  
24bf0 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
24c00 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79   is separated by
24c10 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
24c20 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73  ..  */.  initMas
24c30 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a  kSet(pMaskSet);.
24c40 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c    sqlite3WhereCl
24c50 61 75 73 65 49 6e 69 74 28 26 70 57 49 6e 66 6f  auseInit(&pWInfo
24c60 2d 3e 73 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a  ->sWC, pWInfo);.
24c70 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 53 70    sqlite3WhereSp
24c80 6c 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  lit(&pWInfo->sWC
24c90 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44  , pWhere, TK_AND
24ca0 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70 65  );.    .  /* Spe
24cb0 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48 45  cial case: a WHE
24cc0 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69  RE clause that i
24cd0 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61  s constant.  Eva
24ce0 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 65  luate the.  ** e
24cf0 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65 69  xpression and ei
24d00 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20 61  ther jump over a
24d10 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 6f  ll of the code o
24d20 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a  r fall thru..  *
24d30 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
24d40 3c 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d  <sWLB.pWC->nTerm
24d50 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
24d60 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20   nTabList==0 || 
24d70 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
24d80 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 73 57 4c  stantNotJoin(sWL
24d90 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 70 45 78  B.pWC->a[ii].pEx
24da0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  pr) ){.      sql
24db0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
24dc0 70 50 61 72 73 65 2c 20 73 57 4c 42 2e 70 57 43  pParse, sWLB.pWC
24dd0 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 70  ->a[ii].pExpr, p
24de0 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 0a 20  WInfo->iBreak,. 
24df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e00 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4a          SQLITE_J
24e10 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
24e20 20 20 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69    sWLB.pWC->a[ii
24e30 5d 2e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ].wtFlags |= TER
24e40 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20  M_CODED;.    }. 
24e50 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c   }..  /* Special
24e60 20 63 61 73 65 3a 20 4e 6f 20 46 52 4f 4d 20 63   case: No FROM c
24e70 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28  lause.  */.  if(
24e80 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 29 7b 0a   nTabList==0 ){.
24e90 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
24ea0 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61   ) pWInfo->nOBSa
24eb0 74 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  t = pOrderBy->nE
24ec0 78 70 72 3b 0a 20 20 20 20 69 66 28 20 77 63 74  xpr;.    if( wct
24ed0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
24ee0 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b  WANT_DISTINCT ){
24ef0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
24f00 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
24f10 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
24f20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
24f30 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74 20 66  * Assign a bit f
24f40 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20  rom the bitmask 
24f50 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  to every term in
24f60 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
24f70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
24f80 20 61 73 73 69 67 6e 69 6e 67 20 62 69 74 6d 61   assigning bitma
24f90 73 6b 20 76 61 6c 75 65 73 20 74 6f 20 46 52 4f  sk values to FRO
24fa0 4d 20 63 6c 61 75 73 65 20 63 75 72 73 6f 72 73  M clause cursors
24fb0 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 20 20 2a  , it must be.  *
24fc0 2a 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20  * the case that 
24fd0 69 66 20 58 20 69 73 20 74 68 65 20 62 69 74 6d  if X is the bitm
24fe0 61 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74 68  ask for the N-th
24ff0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
25000 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  m then.  ** the 
25010 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20  bitmask for all 
25020 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
25030 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
25040 20 74 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a 20   the N-th term. 
25050 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20 20 20   ** is (X-1).   
25060 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72  An expression fr
25070 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  om the ON clause
25080 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
25090 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74 73  can use.  ** its
250a0 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e   Expr.iRightJoin
250b0 54 61 62 6c 65 20 76 61 6c 75 65 20 74 6f 20 66  Table value to f
250c0 69 6e 64 20 74 68 65 20 62 69 74 6d 61 73 6b 20  ind the bitmask 
250d0 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
250e0 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6a  le.  ** of the j
250f0 6f 69 6e 2e 20 20 53 75 62 74 72 61 63 74 69 6e  oin.  Subtractin
25100 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20 72  g one from the r
25110 69 67 68 74 20 74 61 62 6c 65 20 62 69 74 6d 61  ight table bitma
25120 73 6b 20 67 69 76 65 73 20 61 0a 20 20 2a 2a 20  sk gives a.  ** 
25130 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20  bitmask for all 
25140 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65  tables to the le
25150 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  ft of the join. 
25160 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74   Knowing the bit
25170 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61 6c  mask.  ** for al
25180 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  l tables to the 
25190 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a  left of a left j
251a0 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  oin is important
251b0 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e  .  Ticket #3015.
251c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20  .  **.  ** Note 
251d0 74 68 61 74 20 62 69 74 6d 61 73 6b 73 20 61 72  that bitmasks ar
251e0 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c  e created for al
251f0 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  l pTabList->nSrc
25200 20 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a 2a 20   tables in.  ** 
25210 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75  pTabList, not ju
25220 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 54 61  st the first nTa
25230 62 4c 69 73 74 20 74 61 62 6c 65 73 2e 20 20 6e  bList tables.  n
25240 54 61 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61  TabList is norma
25250 6c 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74  lly.  ** equal t
25260 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  o pTabList->nSrc
25270 20 62 75 74 20 6d 69 67 68 74 20 62 65 20 73 68   but might be sh
25280 6f 72 74 65 6e 65 64 20 74 6f 20 31 20 69 66 20  ortened to 1 if 
25290 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45 5f 4f  the.  ** WHERE_O
252a0 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61  NETABLE_ONLY fla
252b0 67 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  g is set..  */. 
252c0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54   for(ii=0; ii<pT
252d0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69  abList->nSrc; ii
252e0 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d  ++){.    createM
252f0 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54  ask(pMaskSet, pT
25300 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43  abList->a[ii].iC
25310 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69  ursor);.    sqli
25320 74 65 33 57 68 65 72 65 54 61 62 46 75 6e 63 41  te3WhereTabFuncA
25330 72 67 73 28 70 50 61 72 73 65 2c 20 26 70 54 61  rgs(pParse, &pTa
25340 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2c 20 26 70  bList->a[ii], &p
25350 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 7d  WInfo->sWC);.  }
25360 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
25370 20 20 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20    {.    Bitmask 
25380 74 6f 54 68 65 4c 65 66 74 20 3d 20 30 3b 0a 20  toTheLeft = 0;. 
25390 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
253a0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
253b0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 69 74  ii++){.      Bit
253c0 6d 61 73 6b 20 6d 20 3d 20 73 71 6c 69 74 65 33  mask m = sqlite3
253d0 57 68 65 72 65 47 65 74 4d 61 73 6b 28 70 4d 61  WhereGetMask(pMa
253e0 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d  skSet, pTabList-
253f0 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b  >a[ii].iCursor);
25400 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
25410 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c 65 66 74 20  m-1)==toTheLeft 
25420 29 3b 0a 20 20 20 20 20 20 74 6f 54 68 65 4c 65  );.      toTheLe
25430 66 74 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20  ft |= m;.    }. 
25440 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
25450 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74  Analyze all of t
25460 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
25470 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57  s. */.  sqlite3W
25480 68 65 72 65 45 78 70 72 41 6e 61 6c 79 7a 65 28  hereExprAnalyze(
25490 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66  pTabList, &pWInf
254a0 6f 2d 3e 73 57 43 29 3b 0a 20 20 69 66 28 20 64  o->sWC);.  if( d
254b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
254c0 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
254d0 6e 45 72 72 6f 72 3b 0a 0a 20 20 69 66 28 20 77  nError;..  if( w
254e0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
254f0 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
25500 29 7b 0a 20 20 20 20 69 66 28 20 69 73 44 69 73  ){.    if( isDis
25510 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 70  tinctRedundant(p
25520 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
25530 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70   &pWInfo->sWC, p
25540 52 65 73 75 6c 74 53 65 74 29 20 29 7b 0a 20 20  ResultSet) ){.  
25550 20 20 20 20 2f 2a 20 54 68 65 20 44 49 53 54 49      /* The DISTI
25560 4e 43 54 20 6d 61 72 6b 69 6e 67 20 69 73 20 70  NCT marking is p
25570 6f 69 6e 74 6c 65 73 73 2e 20 20 49 67 6e 6f 72  ointless.  Ignor
25580 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70  e it. */.      p
25590 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
255a0 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
255b0 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 65  T_UNIQUE;.    }e
255c0 6c 73 65 20 69 66 28 20 70 4f 72 64 65 72 42 79  lse if( pOrderBy
255d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
255e0 54 72 79 20 74 6f 20 4f 52 44 45 52 20 42 59 20  Try to ORDER BY 
255f0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 74  the result set t
25600 6f 20 6d 61 6b 65 20 64 69 73 74 69 6e 63 74 20  o make distinct 
25610 70 72 6f 63 65 73 73 69 6e 67 20 65 61 73 69 65  processing easie
25620 72 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66  r */.      pWInf
25630 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d  o->wctrlFlags |=
25640 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
25650 59 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  Y;.      pWInfo-
25660 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 52 65 73  >pOrderBy = pRes
25670 75 6c 74 53 65 74 3b 0a 20 20 20 20 7d 0a 20 20  ultSet;.    }.  
25680 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63  }..  /* Construc
25690 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  t the WhereLoop 
256a0 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 48 45  objects */.  WHE
256b0 52 45 54 52 41 43 45 28 30 78 66 66 66 66 2c 28  RETRACE(0xffff,(
256c0 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53  "*** Optimizer S
256d0 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 23  tart ***\n"));.#
256e0 69 66 20 64 65 66 69 6e 65 64 28 57 48 45 52 45  if defined(WHERE
256f0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 20  TRACE_ENABLED). 
25700 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
25710 65 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29  eTrace & 0x100 )
25720 7b 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c  { /* Display all
25730 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
25740 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
25750 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
25760 28 69 3d 30 3b 20 69 3c 73 57 4c 42 2e 70 57 43  (i=0; i<sWLB.pWC
25770 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20  ->nTerm; i++){. 
25780 20 20 20 20 20 77 68 65 72 65 54 65 72 6d 50 72       whereTermPr
25790 69 6e 74 28 26 73 57 4c 42 2e 70 57 43 2d 3e 61  int(&sWLB.pWC->a
257a0 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  [i], i);.    }. 
257b0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
257c0 20 6e 54 61 62 4c 69 73 74 21 3d 31 20 7c 7c 20   nTabList!=1 || 
257d0 77 68 65 72 65 53 68 6f 72 74 43 75 74 28 26 73  whereShortCut(&s
257e0 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  WLB)==0 ){.    r
257f0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
25800 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20 20 20  All(&sWLB);.    
25810 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68  if( rc ) goto wh
25820 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
25830 20 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52   .#ifdef WHERETR
25840 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
25850 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
25860 54 72 61 63 65 20 29 7b 20 20 20 20 2f 2a 20 44  Trace ){    /* D
25870 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66 20 74 68  isplay all of th
25880 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
25890 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 57 68 65  cts */.      Whe
258a0 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20 20 20  reLoop *p;.     
258b0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 74   int i;.      st
258c0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
258d0 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31 32 33  zLabel[] = "0123
258e0 34 35 36 37 38 39 61 62 63 64 65 66 67 68 69 6a  456789abcdefghij
258f0 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79 78 7a  klmnopqrstuvwyxz
25900 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
25910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
25930 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
25940 51 52 53 54 55 56 57 59 58 5a 22 3b 0a 20 20 20  QRSTUVWYXZ";.   
25950 20 20 20 66 6f 72 28 70 3d 70 57 49 6e 66 6f 2d     for(p=pWInfo-
25960 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20 70 3b  >pLoops, i=0; p;
25970 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c   p=p->pNextLoop,
25980 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
25990 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65 6c 5b 69  ->cId = zLabel[i
259a0 25 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 5d  %sizeof(zLabel)]
259b0 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c  ;.        whereL
259c0 6f 6f 70 50 72 69 6e 74 28 70 2c 20 73 57 4c 42  oopPrint(p, sWLB
259d0 2e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20  .pWC);.      }. 
259e0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20     }.#endif.  . 
259f0 20 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76     wherePathSolv
25a00 65 72 28 70 57 49 6e 66 6f 2c 20 30 29 3b 0a 20  er(pWInfo, 0);. 
25a10 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
25a20 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
25a30 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
25a40 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
25a50 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
25a60 20 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76     wherePathSolv
25a70 65 72 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66  er(pWInfo, pWInf
25a80 6f 2d 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b 0a 20  o->nRowOut+1);. 
25a90 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
25aa0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
25ab0 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
25ac0 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  r;.    }.  }.  i
25ad0 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
25ae0 72 42 79 3d 3d 30 20 26 26 20 28 64 62 2d 3e 66  rBy==0 && (db->f
25af0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
25b00 76 65 72 73 65 4f 72 64 65 72 29 21 3d 30 20 29  verseOrder)!=0 )
25b10 7b 0a 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72  {.     pWInfo->r
25b20 65 76 4d 61 73 6b 20 3d 20 28 42 69 74 6d 61 73  evMask = (Bitmas
25b30 6b 29 28 2d 31 29 3b 0a 20 20 7d 0a 20 20 69 66  k)(-1);.  }.  if
25b40 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
25b50 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c 6c  | NEVER(db->mall
25b60 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a 20 20 20  ocFailed) ){.   
25b70 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
25b80 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64 65  Error;.  }.#ifde
25b90 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
25ba0 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
25bb0 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a  e3WhereTrace ){.
25bc0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
25bd0 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c  Printf("---- Sol
25be0 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c 20  ution nRow=%d", 
25bf0 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29  pWInfo->nRowOut)
25c00 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
25c10 2d 3e 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20  ->nOBSat>0 ){.  
25c20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
25c30 50 72 69 6e 74 66 28 22 20 4f 52 44 45 52 42 59  Printf(" ORDERBY
25c40 3d 25 64 2c 30 78 25 6c 6c 78 22 2c 20 70 57 49  =%d,0x%llx", pWI
25c50 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 70 57 49  nfo->nOBSat, pWI
25c60 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a 20  nfo->revMask);. 
25c70 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28     }.    switch(
25c80 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
25c90 63 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  ct ){.      case
25ca0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
25cb0 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20  UNIQUE: {.      
25cc0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
25cd0 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54  intf("  DISTINCT
25ce0 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20 20 20 20  =unique");.     
25cf0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
25d00 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  }.      case WHE
25d10 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
25d20 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  RED: {.        s
25d30 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
25d40 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 6f 72  f("  DISTINCT=or
25d50 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20  dered");.       
25d60 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
25d70 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45        case WHERE
25d80 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45  _DISTINCT_UNORDE
25d90 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  RED: {.        s
25da0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
25db0 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e  f("  DISTINCT=un
25dc0 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20  ordered");.     
25dd0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
25de0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
25df0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
25e00 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 69  \n");.    for(ii
25e10 3d 30 3b 20 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e  =0; ii<pWInfo->n
25e20 4c 65 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20  Level; ii++){.  
25e30 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
25e40 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d  nt(pWInfo->a[ii]
25e50 2e 70 57 4c 6f 6f 70 2c 20 73 57 4c 42 2e 70 57  .pWLoop, sWLB.pW
25e60 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  C);.    }.  }.#e
25e70 6e 64 69 66 0a 20 20 2f 2a 20 41 74 74 65 6d 70  ndif.  /* Attemp
25e80 74 20 74 6f 20 6f 6d 69 74 20 74 61 62 6c 65 73  t to omit tables
25e90 20 66 72 6f 6d 20 74 68 65 20 6a 6f 69 6e 20 74   from the join t
25ea0 68 61 74 20 64 6f 20 6e 6f 74 20 65 66 66 65 63  hat do not effec
25eb0 74 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a  t the result */.
25ec0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c    if( pWInfo->nL
25ed0 65 76 65 6c 3e 3d 32 0a 20 20 20 26 26 20 70 52  evel>=2.   && pR
25ee0 65 73 75 6c 74 53 65 74 21 3d 30 0a 20 20 20 26  esultSet!=0.   &
25ef0 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
25f00 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
25f10 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 29 0a 20  _OmitNoopJoin). 
25f20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   ){.    Bitmask 
25f30 74 61 62 55 73 65 64 20 3d 20 73 71 6c 69 74 65  tabUsed = sqlite
25f40 33 57 68 65 72 65 45 78 70 72 4c 69 73 74 55 73  3WhereExprListUs
25f50 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52  age(pMaskSet, pR
25f60 65 73 75 6c 74 53 65 74 29 3b 0a 20 20 20 20 69  esultSet);.    i
25f70 66 28 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79  f( sWLB.pOrderBy
25f80 20 29 7b 0a 20 20 20 20 20 20 74 61 62 55 73 65   ){.      tabUse
25f90 64 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72  d |= sqlite3Wher
25fa0 65 45 78 70 72 4c 69 73 74 55 73 61 67 65 28 70  eExprListUsage(p
25fb0 4d 61 73 6b 53 65 74 2c 20 73 57 4c 42 2e 70 4f  MaskSet, sWLB.pO
25fc0 72 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 0a 20  rderBy);.    }. 
25fd0 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f     while( pWInfo
25fe0 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29 7b 0a 20  ->nLevel>=2 ){. 
25ff0 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
26000 70 54 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20  pTerm, *pEnd;.  
26010 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 57 49 6e      pLoop = pWIn
26020 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c  fo->a[pWInfo->nL
26030 65 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f 70 3b 0a  evel-1].pWLoop;.
26040 20 20 20 20 20 20 69 66 28 20 28 70 57 49 6e 66        if( (pWInf
26050 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
26060 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 66 67 2e 6a  Loop->iTab].fg.j
26070 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
26080 54 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  T)==0 ) break;. 
26090 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46       if( (wctrlF
260a0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
260b0 54 5f 44 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20  T_DISTINCT)==0. 
260c0 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d        && (pLoop-
260d0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
260e0 5f 4f 4e 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20  _ONEROW)==0.    
260f0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65    ){.        bre
26100 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
26110 20 20 69 66 28 20 28 74 61 62 55 73 65 64 20 26    if( (tabUsed &
26120 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
26130 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )!=0 ) break;.  
26140 20 20 20 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e      pEnd = sWLB.
26150 70 57 43 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57  pWC->a + sWLB.pW
26160 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20  C->nTerm;.      
26170 66 6f 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70  for(pTerm=sWLB.p
26180 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e  WC->a; pTerm<pEn
26190 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
261a0 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
261b0 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f  >prereqAll & pLo
261c0 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30  op->maskSelf)!=0
261d0 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 45 78  .         && !Ex
261e0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
261f0 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
26200 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20  romJoin).       
26210 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72   ){.          br
26220 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
26230 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
26240 20 70 54 65 72 6d 3c 70 45 6e 64 20 29 20 62 72   pTerm<pEnd ) br
26250 65 61 6b 3b 0a 20 20 20 20 20 20 57 48 45 52 45  eak;.      WHERE
26260 54 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22  TRACE(0xffff, ("
26270 2d 3e 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20  -> drop loop %c 
26280 6e 6f 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f  not used\n", pLo
26290 6f 70 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20 20  op->cId));.     
262a0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d   pWInfo->nLevel-
262b0 2d 3b 0a 20 20 20 20 20 20 6e 54 61 62 4c 69 73  -;.      nTabLis
262c0 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t--;.    }.  }. 
262d0 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66   WHERETRACE(0xff
262e0 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  ff,("*** Optimiz
262f0 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c  er Finished ***\
26300 6e 22 29 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  n"));.  pWInfo->
26310 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
26320 6f 70 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52  op += pWInfo->nR
26330 6f 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20  owOut;..  /* If 
26340 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e  the caller is an
26350 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
26360 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  E statement that
26370 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20   is requesting. 
26380 20 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65   ** to use a one
26390 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c  -pass algorithm,
263a0 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
263b0 69 73 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  is is appropriat
263c0 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d  e..  ** The one-
263d0 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f  pass algorithm o
263e0 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 74 68 65  nly works if the
263f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
26400 6e 73 74 72 61 69 6e 73 0a 20 20 2a 2a 20 74 68  nstrains.  ** th
26410 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 75  e statement to u
26420 70 64 61 74 65 20 6f 72 20 64 65 6c 65 74 65 20  pdate or delete 
26430 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20  a single row..  
26440 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 63  */.  assert( (wc
26450 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
26460 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
26470 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e  )==0 || pWInfo->
26480 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69  nLevel==1 );.  i
26490 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
264a0 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
264b0 45 53 49 52 45 44 29 21 3d 30 20 0a 20 20 20 26  ESIRED)!=0 .   &
264c0 26 20 28 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e  & (pWInfo->a[0].
264d0 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  pWLoop->wsFlags 
264e0 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 21  & WHERE_ONEROW)!
264f0 3d 30 20 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f  =0 ){.    pWInfo
26500 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20 31 3b  ->okOnePass = 1;
26510 0a 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69  .    if( HasRowi
26520 64 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  d(pTabList->a[0]
26530 2e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  .pTab) ){.      
26540 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c  pWInfo->a[0].pWL
26550 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 3d 20  oop->wsFlags &= 
26560 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b  ~WHERE_IDX_ONLY;
26570 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
26580 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73   Open all tables
26590 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74   in the pTabList
265a0 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73   and any indices
265b0 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20   selected for.  
265c0 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f  ** searching tho
265d0 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  se tables..  */.
265e0 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76    for(ii=0, pLev
265f0 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69  el=pWInfo->a; ii
26600 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c  <nTabList; ii++,
26610 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
26620 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
26630 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65   /* Table to ope
26640 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62  n */.    int iDb
26650 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ;         /* Ind
26660 65 78 20 6f 66 20 64 61 74 61 62 61 73 65 20 63  ex of database c
26670 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f  ontaining table/
26680 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73 74 72  index */.    str
26690 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
266a0 20 2a 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20   *pTabItem;..   
266b0 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61   pTabItem = &pTa
266c0 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
266d0 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61  >iFrom];.    pTa
266e0 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  b = pTabItem->pT
266f0 61 62 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  ab;.    iDb = sq
26700 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
26710 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
26720 68 65 6d 61 29 3b 0a 20 20 20 20 70 4c 6f 6f 70  hema);.    pLoop
26730 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
26740 70 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62  p;.    if( (pTab
26750 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
26760 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c  Ephemeral)!=0 ||
26770 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
26780 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
26790 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c  thing */.    }el
267a0 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  se.#ifndef SQLIT
267b0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
267c0 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70 4c 6f  BLE.    if( (pLo
267d0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
267e0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
267f0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  )!=0 ){.      co
26800 6e 73 74 20 63 68 61 72 20 2a 70 56 54 61 62 20  nst char *pVTab 
26810 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
26820 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
26830 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
26840 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61    int iCur = pTa
26850 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bItem->iCursor;.
26860 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
26870 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f  eAddOp4(v, OP_VO
26880 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c  pen, iCur, 0, 0,
26890 20 70 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29   pVTab, P4_VTAB)
268a0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
268b0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
268c0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 6f 70  ){.      /* noop
268d0 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65   */.    }else.#e
268e0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c  ndif.    if( (pL
268f0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
26900 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
26910 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 77  0.         && (w
26920 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
26930 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53  E_OMIT_OPEN_CLOS
26940 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  E)==0 ){.      i
26950 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52  nt op = OP_OpenR
26960 65 61 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ead;.      if( p
26970 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
26980 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d   ){.        op =
26990 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20   OP_OpenWrite;. 
269a0 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61         pWInfo->a
269b0 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d  iCurOnePass[0] =
269c0 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
269d0 6f 72 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  or;.      };.   
269e0 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
269f0 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
26a00 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69  Item->iCursor, i
26a10 44 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20  Db, pTab, op);. 
26a20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
26a30 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3d 3d  bItem->iCursor==
26a40 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20  pLevel->iTabCur 
26a50 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
26a60 65 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  e( !pWInfo->okOn
26a70 65 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e  ePass && pTab->n
26a80 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  Col==BMS-1 );.  
26a90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21 70      testcase( !p
26aa0 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
26ab0 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d   && pTab->nCol==
26ac0 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28  BMS );.      if(
26ad0 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50   !pWInfo->okOneP
26ae0 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f  ass && pTab->nCo
26af0 6c 3c 42 4d 53 20 26 26 20 48 61 73 52 6f 77 69  l<BMS && HasRowi
26b00 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  d(pTab) ){.     
26b10 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70     Bitmask b = p
26b20 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  TabItem->colUsed
26b30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20  ;.        int n 
26b40 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  = 0;.        for
26b50 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b  (; b; b=b>>1, n+
26b60 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c  +){}.        sql
26b70 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
26b80 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
26b90 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c  urrentAddr(v)-1,
26ba0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
26bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
26bc0 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
26bd0 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20  n), P4_INT32);. 
26be0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
26bf0 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  <=pTab->nCol );.
26c00 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
26c10 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
26c20 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20  UMN_USED_MASK.  
26c30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
26c40 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
26c50 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 70 54 61  ColumnsUsed, pTa
26c60 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20  bItem->iCursor, 
26c70 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
26c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c90 20 20 28 63 6f 6e 73 74 20 75 38 2a 29 26 70 54    (const u8*)&pT
26ca0 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 2c  abItem->colUsed,
26cb0 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23 65 6e 64   P4_INT64);.#end
26cc0 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
26cd0 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
26ce0 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
26cf0 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
26d00 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
26d10 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f     }.    if( pLo
26d20 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
26d30 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20  ERE_INDEXED ){. 
26d40 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78 20       Index *pIx 
26d50 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
26d60 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 69  .pIndex;.      i
26d70 6e 74 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20  nt iIndexCur;.  
26d80 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f      int op = OP_
26d90 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20  OpenRead;.      
26da0 2f 2a 20 69 49 64 78 43 75 72 20 69 73 20 61 6c  /* iIdxCur is al
26db0 77 61 79 73 20 73 65 74 20 69 66 20 74 6f 20 61  ways set if to a
26dc0 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20   positive value 
26dd0 69 66 20 4f 4e 45 50 41 53 53 20 69 73 20 70 6f  if ONEPASS is po
26de0 73 73 69 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  ssible */.      
26df0 61 73 73 65 72 74 28 20 69 49 64 78 43 75 72 21  assert( iIdxCur!
26e00 3d 30 20 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77  =0 || (pWInfo->w
26e10 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
26e20 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
26e30 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  D)==0 );.      i
26e40 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
26e50 62 29 20 26 26 20 49 73 50 72 69 6d 61 72 79 4b  b) && IsPrimaryK
26e60 65 79 49 6e 64 65 78 28 70 49 78 29 0a 20 20 20  eyIndex(pIx).   
26e70 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61      && (wctrlFla
26e80 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41  gs & WHERE_ONETA
26e90 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30 0a 20 20 20  BLE_ONLY)!=0.   
26ea0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
26eb0 20 54 68 69 73 20 69 73 20 6f 6e 65 20 74 65 72   This is one ter
26ec0 6d 20 6f 66 20 61 6e 20 4f 52 2d 6f 70 74 69 6d  m of an OR-optim
26ed0 69 7a 61 74 69 6f 6e 20 75 73 69 6e 67 20 74 68  ization using th
26ee0 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 66  e PRIMARY KEY of
26ef0 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 49   a.        ** WI
26f00 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
26f10 65 2e 20 20 4e 6f 20 6e 65 65 64 20 66 6f 72 20  e.  No need for 
26f20 61 20 73 65 70 61 72 61 74 65 20 69 6e 64 65 78  a separate index
26f30 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 49 6e 64   */.        iInd
26f40 65 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e  exCur = pLevel->
26f50 69 54 61 62 43 75 72 3b 0a 20 20 20 20 20 20 20  iTabCur;.       
26f60 20 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d   op = 0;.      }
26f70 65 6c 73 65 20 69 66 28 20 70 57 49 6e 66 6f 2d  else if( pWInfo-
26f80 3e 6f 6b 4f 6e 65 50 61 73 73 20 29 7b 0a 20 20  >okOnePass ){.  
26f90 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4a 20        Index *pJ 
26fa0 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
26fb0 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  ->pIndex;.      
26fc0 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69 49    iIndexCur = iI
26fd0 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 61  dxCur;.        a
26fe0 73 73 65 72 74 28 20 77 63 74 72 6c 46 6c 61 67  ssert( wctrlFlag
26ff0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
27000 53 5f 44 45 53 49 52 45 44 20 29 3b 0a 20 20 20  S_DESIRED );.   
27010 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41       while( ALWA
27020 59 53 28 70 4a 29 20 26 26 20 70 4a 21 3d 70 49  YS(pJ) && pJ!=pI
27030 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  x ){.          i
27040 49 6e 64 65 78 43 75 72 2b 2b 3b 0a 20 20 20 20  IndexCur++;.    
27050 20 20 20 20 20 20 70 4a 20 3d 20 70 4a 2d 3e 70        pJ = pJ->p
27060 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Next;.        }.
27070 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f          op = OP_
27080 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20  OpenWrite;.     
27090 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72     pWInfo->aiCur
270a0 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20 69 49 6e  OnePass[1] = iIn
270b0 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20 7d 65  dexCur;.      }e
270c0 6c 73 65 20 69 66 28 20 69 49 64 78 43 75 72 20  lse if( iIdxCur 
270d0 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  && (wctrlFlags &
270e0 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
270f0 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  ONLY)!=0 ){.    
27100 20 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20      iIndexCur = 
27110 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20  iIdxCur;.       
27120 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20   if( wctrlFlags 
27130 26 20 57 48 45 52 45 5f 52 45 4f 50 45 4e 5f 49  & WHERE_REOPEN_I
27140 44 58 20 29 20 6f 70 20 3d 20 4f 50 5f 52 65 6f  DX ) op = OP_Reo
27150 70 65 6e 49 64 78 3b 0a 20 20 20 20 20 20 7d 65  penIdx;.      }e
27160 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 49 6e  lse{.        iIn
27170 64 65 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d  dexCur = pParse-
27180 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 7d  >nTab++;.      }
27190 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  .      pLevel->i
271a0 49 64 78 43 75 72 20 3d 20 69 49 6e 64 65 78 43  IdxCur = iIndexC
271b0 75 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ur;.      assert
271c0 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d  ( pIx->pSchema==
271d0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
271e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
271f0 49 6e 64 65 78 43 75 72 3e 3d 30 20 29 3b 0a 20  IndexCur>=0 );. 
27200 20 20 20 20 20 69 66 28 20 6f 70 20 29 7b 0a 20       if( op ){. 
27210 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
27220 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20  beAddOp3(v, op, 
27230 69 49 6e 64 65 78 43 75 72 2c 20 70 49 78 2d 3e  iIndexCur, pIx->
27240 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20  tnum, iDb);.    
27250 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
27260 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72  etP4KeyInfo(pPar
27270 73 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20  se, pIx);.      
27280 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
27290 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
272a0 4e 53 54 52 41 49 4e 54 29 21 3d 30 0a 20 20 20  NSTRAINT)!=0.   
272b0 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d        && (pLoop-
272c0 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
272d0 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57  E_COLUMN_RANGE|W
272e0 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 29 29 3d  HERE_SKIPSCAN))=
272f0 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
27300 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
27310 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59  gs&WHERE_ORDERBY
27320 5f 4d 49 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20  _MIN)==0.       
27330 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
27340 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
27350 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53 45 45 4b  5(v, OPFLAG_SEEK
27360 45 51 29 3b 20 2f 2a 20 48 69 6e 74 20 74 6f 20  EQ); /* Hint to 
27370 43 4f 4d 44 42 32 20 2a 2f 0a 20 20 20 20 20 20  COMDB2 */.      
27380 20 20 7d 0a 20 20 20 20 20 20 20 20 56 64 62 65    }.        Vdbe
27390 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
273a0 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  , pIx->zName));.
273b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
273c0 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44  ABLE_COLUMN_USED
273d0 5f 4d 41 53 4b 0a 20 20 20 20 20 20 20 20 7b 0a  _MASK.        {.
273e0 20 20 20 20 20 20 20 20 20 20 75 36 34 20 63 6f            u64 co
273f0 6c 55 73 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  lUsed = 0;.     
27400 20 20 20 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b       int ii, jj;
27410 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
27420 69 3d 30 3b 20 69 69 3c 70 49 78 2d 3e 6e 43 6f  i=0; ii<pIx->nCo
27430 6c 75 6d 6e 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  lumn; ii++){.   
27440 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 70 49           jj = pI
27450 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 69 5d 3b  x->aiColumn[ii];
27460 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
27470 20 6a 6a 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65   jj<0 ) continue
27480 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
27490 28 20 6a 6a 3e 36 33 20 29 20 6a 6a 20 3d 20 36  ( jj>63 ) jj = 6
274a0 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  3;.            i
274b0 66 28 20 28 70 54 61 62 49 74 65 6d 2d 3e 63 6f  f( (pTabItem->co
274c0 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28  lUsed & MASKBIT(
274d0 6a 6a 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  jj))==0 ) contin
274e0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
274f0 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28 75 36 34  colUsed |= ((u64
27500 29 31 29 3c 3c 28 69 69 3c 36 33 20 3f 20 69 69  )1)<<(ii<63 ? ii
27510 20 3a 20 36 33 29 3b 0a 20 20 20 20 20 20 20 20   : 63);.        
27520 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
27530 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44  lite3VdbeAddOp4D
27540 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  up8(v, OP_Column
27550 73 55 73 65 64 2c 20 69 49 6e 64 65 78 43 75 72  sUsed, iIndexCur
27560 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
27570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27580 20 20 20 20 20 20 20 20 28 75 38 2a 29 26 63 6f          (u8*)&co
27590 6c 55 73 65 64 2c 20 50 34 5f 49 4e 54 36 34 29  lUsed, P4_INT64)
275a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  ;.        }.#end
275b0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
275c0 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f  BLE_COLUMN_USED_
275d0 4d 41 53 4b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  MASK */.      }.
275e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 44      }.    if( iD
275f0 62 3e 3d 30 20 29 20 73 71 6c 69 74 65 33 43 6f  b>=0 ) sqlite3Co
27600 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
27610 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d  Parse, iDb);.  }
27620 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20  .  pWInfo->iTop 
27630 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
27640 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
27650 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
27660 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65  led ) goto where
27670 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f  BeginError;..  /
27680 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 63  * Generate the c
27690 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65  ode to do the se
276a0 61 72 63 68 2e 20 20 45 61 63 68 20 69 74 65 72  arch.  Each iter
276b0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72  ation of the for
276c0 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77  .  ** loop below
276d0 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
276e0 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73  for a single nes
276f0 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
27700 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e  VM.  ** program.
27710 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79  .  */.  notReady
27720 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
27730 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
27740 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 29 7b 0a  TabList; ii++){.
27750 20 20 20 20 69 6e 74 20 61 64 64 72 45 78 70 6c      int addrExpl
27760 61 69 6e 3b 0a 20 20 20 20 69 6e 74 20 77 73 46  ain;.    int wsF
27770 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c  lags;.    pLevel
27780 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69   = &pWInfo->a[ii
27790 5d 3b 0a 20 20 20 20 77 73 46 6c 61 67 73 20 3d  ];.    wsFlags =
277a0 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d   pLevel->pWLoop-
277b0 3e 77 73 46 6c 61 67 73 3b 0a 23 69 66 6e 64 65  >wsFlags;.#ifnde
277c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
277d0 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20  TOMATIC_INDEX.  
277e0 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70    if( (pLevel->p
277f0 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  WLoop->wsFlags &
27800 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
27810 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  X)!=0 ){.      c
27820 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69  onstructAutomati
27830 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26  cIndex(pParse, &
27840 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 0a 20 20 20  pWInfo->sWC,.   
27850 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 54               &pT
27860 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
27870 2d 3e 69 46 72 6f 6d 5d 2c 20 6e 6f 74 52 65 61  ->iFrom], notRea
27880 64 79 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20  dy, pLevel);.   
27890 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
278a0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
278b0 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
278c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
278d0 20 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 73   addrExplain = s
278e0 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 6c 61  qlite3WhereExpla
278f0 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20 20  inOneScan(.     
27900 20 20 20 70 50 61 72 73 65 2c 20 70 54 61 62 4c     pParse, pTabL
27910 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 69 69 2c  ist, pLevel, ii,
27920 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20   pLevel->iFrom, 
27930 77 63 74 72 6c 46 6c 61 67 73 0a 20 20 20 20 29  wctrlFlags.    )
27940 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64  ;.    pLevel->ad
27950 64 72 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33  drBody = sqlite3
27960 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
27970 76 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79  v);.    notReady
27980 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 43   = sqlite3WhereC
27990 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28  odeOneLoopStart(
279a0 70 57 49 6e 66 6f 2c 20 69 69 2c 20 6e 6f 74 52  pWInfo, ii, notR
279b0 65 61 64 79 29 3b 0a 20 20 20 20 70 57 49 6e 66  eady);.    pWInf
279c0 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70  o->iContinue = p
279d0 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b  Level->addrCont;
279e0 0a 20 20 20 20 69 66 28 20 28 77 73 46 6c 61 67  .    if( (wsFlag
279f0 73 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  s&WHERE_MULTI_OR
27a00 29 3d 3d 30 20 26 26 20 28 77 63 74 72 6c 46 6c  )==0 && (wctrlFl
27a10 61 67 73 26 57 48 45 52 45 5f 4f 4e 45 54 41 42  ags&WHERE_ONETAB
27a20 4c 45 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20  LE_ONLY)==0 ){. 
27a30 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
27a40 65 41 64 64 53 63 61 6e 53 74 61 74 75 73 28 76  eAddScanStatus(v
27a50 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76  , pTabList, pLev
27a60 65 6c 2c 20 61 64 64 72 45 78 70 6c 61 69 6e 29  el, addrExplain)
27a70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
27a80 2a 20 44 6f 6e 65 2e 20 2a 2f 0a 20 20 56 64 62  * Done. */.  Vdb
27a90 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28  eModuleComment((
27aa0 76 2c 20 22 42 65 67 69 6e 20 57 48 45 52 45 2d  v, "Begin WHERE-
27ab0 63 6f 72 65 22 29 29 3b 0a 20 20 72 65 74 75 72  core"));.  retur
27ac0 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20  n pWInfo;..  /* 
27ad0 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c  Jump here if mal
27ae0 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65  loc fails */.whe
27af0 72 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20  reBeginError:.  
27b00 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20  if( pWInfo ){.  
27b10 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
27b20 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73  Loop = pWInfo->s
27b30 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a  avedNQueryLoop;.
27b40 20 20 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65      whereInfoFre
27b50 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
27b60 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
27b70 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
27b80 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
27b90 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65  WHERE loop.  See
27ba0 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a   comments on .**
27bb0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
27bc0 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f  in() for additio
27bd0 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
27be0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
27bf0 57 68 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e  WhereEnd(WhereIn
27c00 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50  fo *pWInfo){.  P
27c10 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
27c20 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
27c30 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
27c40 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
27c50 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  i;.  WhereLevel 
27c60 2a 70 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72 65  *pLevel;.  Where
27c70 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53  Loop *pLoop;.  S
27c80 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
27c90 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
27ca0 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ist;.  sqlite3 *
27cb0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
27cc0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
27cd0 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e  loop termination
27ce0 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 56 64   code..  */.  Vd
27cf0 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28  beModuleComment(
27d00 28 76 2c 20 22 45 6e 64 20 57 48 45 52 45 2d 63  (v, "End WHERE-c
27d10 6f 72 65 22 29 29 3b 0a 20 20 73 71 6c 69 74 65  ore"));.  sqlite
27d20 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
27d30 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69  pParse);.  for(i
27d40 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d  =pWInfo->nLevel-
27d50 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
27d60 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
27d70 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
27d80 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f  o->a[i];.    pLo
27d90 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
27da0 6f 6f 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  oop;.    sqlite3
27db0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
27dc0 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
27dd0 43 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70  Cont);.    if( p
27de0 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f  Level->op!=OP_No
27df0 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  op ){.      sqli
27e00 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
27e10 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65   pLevel->op, pLe
27e20 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d  vel->p1, pLevel-
27e30 3e 70 32 2c 20 70 4c 65 76 65 6c 2d 3e 70 33 29  >p2, pLevel->p3)
27e40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
27e50 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70  dbeChangeP5(v, p
27e60 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20  Level->p5);.    
27e70 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
27e80 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
27e90 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65  erageIf(v, pLeve
27ea0 6c 2d 3e 6f 70 3d 3d 4f 50 5f 4e 65 78 74 29 3b  l->op==OP_Next);
27eb0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
27ec0 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d  ageIf(v, pLevel-
27ed0 3e 6f 70 3d 3d 4f 50 5f 50 72 65 76 29 3b 0a 20  >op==OP_Prev);. 
27ee0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
27ef0 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f  eIf(v, pLevel->o
27f00 70 3d 3d 4f 50 5f 56 4e 65 78 74 29 3b 0a 20 20  p==OP_VNext);.  
27f10 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f    }.    if( pLoo
27f20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
27f30 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c  RE_IN_ABLE && pL
27f40 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30  evel->u.in.nIn>0
27f50 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
27f60 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20   InLoop *pIn;.  
27f70 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
27f80 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
27f90 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76  lveLabel(v, pLev
27fa0 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20  el->addrNxt);.  
27fb0 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c      for(j=pLevel
27fc0 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d  ->u.in.nIn, pIn=
27fd0 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49  &pLevel->u.in.aI
27fe0 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b  nLoop[j-1]; j>0;
27ff0 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20   j--, pIn--){.  
28000 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
28010 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e  eJumpHere(v, pIn
28020 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a  ->addrInTop+1);.
28030 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
28040 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 49 6e  dbeAddOp2(v, pIn
28050 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49  ->eEndLoopOp, pI
28060 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64  n->iCur, pIn->ad
28070 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20  drInTop);.      
28080 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
28090 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
280a0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 49 6e  overageIf(v, pIn
280b0 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50  ->eEndLoopOp==OP
280c0 5f 50 72 65 76 49 66 4f 70 65 6e 29 3b 0a 20 20  _PrevIfOpen);.  
280d0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
280e0 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e  geIf(v, pIn->eEn
280f0 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 4e 65 78 74  dLoopOp==OP_Next
28100 49 66 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20  IfOpen);.       
28110 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
28120 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64  Here(v, pIn->add
28130 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20  rInTop-1);.     
28140 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
28150 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
28160 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
28170 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 69 66  addrBrk);.    if
28180 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b  ( pLevel->addrSk
28190 69 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ip ){.      sqli
281a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
281b0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65   OP_Goto, 0, pLe
281c0 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a  vel->addrSkip);.
281d0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
281e0 74 28 28 76 2c 20 22 6e 65 78 74 20 73 6b 69 70  t((v, "next skip
281f0 2d 73 63 61 6e 20 6f 6e 20 25 73 22 2c 20 70 4c  -scan on %s", pL
28200 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
28210 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  dex->zName));.  
28220 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
28230 75 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65  umpHere(v, pLeve
28240 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20 20  l->addrSkip);.  
28250 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
28260 75 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65  umpHere(v, pLeve
28270 6c 2d 3e 61 64 64 72 53 6b 69 70 2d 32 29 3b 0a  l->addrSkip-2);.
28280 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
28290 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65  evel->addrLikeRe
282a0 70 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  p ){.      int o
282b0 70 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  p;.      if( sql
282c0 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
282d0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b   pLevel->addrLik
282e0 65 52 65 70 2d 31 29 2d 3e 70 31 20 29 7b 0a 20  eRep-1)->p1 ){. 
282f0 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 44         op = OP_D
28300 65 63 72 4a 75 6d 70 5a 65 72 6f 3b 0a 20 20 20  ecrJumpZero;.   
28310 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28320 20 20 6f 70 20 3d 20 4f 50 5f 4a 75 6d 70 5a 65    op = OP_JumpZe
28330 72 6f 49 6e 63 72 3b 0a 20 20 20 20 20 20 7d 0a  roIncr;.      }.
28340 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
28350 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 70  eAddOp2(v, op, p
28360 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43  Level->iLikeRepC
28370 6e 74 72 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  ntr, pLevel->add
28380 72 4c 69 6b 65 52 65 70 29 3b 0a 20 20 20 20 20  rLikeRep);.     
28390 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
283a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
283b0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
283c0 6e 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 20  n ){.      addr 
283d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
283e0 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op1(v, OP_IfPos,
283f0 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
28400 69 6e 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  in); VdbeCoverag
28410 65 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e(v);.      asse
28420 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
28430 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
28440 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20  ONLY)==0.       
28450 20 20 20 20 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 77      || (pLoop->w
28460 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
28470 4e 44 45 58 45 44 29 21 3d 30 20 29 3b 0a 20 20  NDEXED)!=0 );.  
28480 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
28490 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
284a0 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a  IDX_ONLY)==0 ){.
284b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
284c0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
284d0 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73  NullRow, pTabLis
284e0 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29  t->a[i].iCursor)
284f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28500 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
28510 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
28520 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ED ){.        sq
28530 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
28540 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70  v, OP_NullRow, p
28550 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b  Level->iIdxCur);
28560 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
28570 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f  f( pLevel->op==O
28580 50 5f 52 65 74 75 72 6e 20 29 7b 0a 20 20 20 20  P_Return ){.    
28590 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
285a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
285b0 62 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70  b, pLevel->p1, p
285c0 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74  Level->addrFirst
285d0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
285e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
285f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
28600 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d  Goto, 0, pLevel-
28610 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20  >addrFirst);.   
28620 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
28630 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
28640 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20  , addr);.    }. 
28650 20 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d     VdbeModuleCom
28660 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 57 48  ment((v, "End WH
28670 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c  ERE-loop%d: %s",
28680 20 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   i,.            
28690 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d           pWInfo-
286a0 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  >pTabList->a[pLe
286b0 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 70 54 61 62  vel->iFrom].pTab
286c0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a  ->zName));.  }..
286d0 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22    /* The "break"
286e0 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20   point is here, 
286f0 6a 75 73 74 20 70 61 73 74 20 74 68 65 20 65 6e  just past the en
28700 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c  d of the outer l
28710 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74  oop..  ** Set it
28720 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
28730 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
28740 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  (v, pWInfo->iBre
28750 61 6b 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ak);..  assert( 
28760 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d  pWInfo->nLevel<=
28770 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
28780 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65  ;.  for(i=0, pLe
28790 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69  vel=pWInfo->a; i
287a0 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b  <pWInfo->nLevel;
287b0 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b   i++, pLevel++){
287c0 0a 20 20 20 20 69 6e 74 20 6b 2c 20 6c 61 73 74  .    int k, last
287d0 3b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f  ;.    VdbeOp *pO
287e0 70 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  p;.    Index *pI
287f0 64 78 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75  dx = 0;.    stru
28800 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
28810 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61  *pTabItem = &pTa
28820 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
28830 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62  >iFrom];.    Tab
28840 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49  le *pTab = pTabI
28850 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61  tem->pTab;.    a
28860 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
28870 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  ;.    pLoop = pL
28880 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20  evel->pWLoop;.. 
28890 20 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f 2d 72     /* For a co-r
288a0 6f 75 74 69 6e 65 2c 20 63 68 61 6e 67 65 20 61  outine, change a
288b0 6c 6c 20 4f 50 5f 43 6f 6c 75 6d 6e 20 72 65 66  ll OP_Column ref
288c0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 74  erences to the t
288d0 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74  able of.    ** t
288e0 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 6e  he co-routine in
288f0 74 6f 20 4f 50 5f 43 6f 70 79 20 6f 66 20 72 65  to OP_Copy of re
28900 73 75 6c 74 20 63 6f 6e 74 61 69 6e 65 64 20 69  sult contained i
28910 6e 20 61 20 72 65 67 69 73 74 65 72 2e 0a 20 20  n a register..  
28920 20 20 2a 2a 20 4f 50 5f 52 6f 77 69 64 20 62 65    ** OP_Rowid be
28930 63 6f 6d 65 73 20 4f 50 5f 4e 75 6c 6c 2e 0a 20  comes OP_Null.. 
28940 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
28950 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f  abItem->fg.viaCo
28960 72 6f 75 74 69 6e 65 20 26 26 20 21 64 62 2d 3e  routine && !db->
28970 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
28980 20 20 20 20 20 20 74 72 61 6e 73 6c 61 74 65 43        translateC
28990 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 76 2c 20 70  olumnToCopy(v, p
289a0 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 2c  Level->addrBody,
289b0 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
289c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
289d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
289e0 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c  abItem->regResul
289f0 74 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  t);.      contin
28a00 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ue;.    }..    /
28a10 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74  * Close all of t
28a20 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  he cursors that 
28a30 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20 73  were opened by s
28a40 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
28a50 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65 70 74 2c  ..    ** Except,
28a60 20 64 6f 20 6e 6f 74 20 63 6c 6f 73 65 20 63 75   do not close cu
28a70 72 73 6f 72 73 20 74 68 61 74 20 77 69 6c 6c 20  rsors that will 
28a80 62 65 20 72 65 75 73 65 64 20 62 79 20 74 68 65  be reused by the
28a90 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   OR optimization
28aa0 0a 20 20 20 20 2a 2a 20 28 57 48 45 52 45 5f 4f  .    ** (WHERE_O
28ab0 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 2e  MIT_OPEN_CLOSE).
28ac0 20 20 41 6e 64 20 64 6f 20 6e 6f 74 20 63 6c 6f    And do not clo
28ad0 73 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 57 72  se the OP_OpenWr
28ae0 69 74 65 20 63 75 72 73 6f 72 73 0a 20 20 20 20  ite cursors.    
28af0 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72 20 74  ** created for t
28b00 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d  he ONEPASS optim
28b10 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ization..    */.
28b20 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74      if( (pTab->t
28b30 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
28b40 65 6d 65 72 61 6c 29 3d 3d 30 0a 20 20 20 20 20  emeral)==0.     
28b50 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  && pTab->pSelect
28b60 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 57 49  ==0.     && (pWI
28b70 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
28b80 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45  & WHERE_OMIT_OPE
28b90 4e 5f 43 4c 4f 53 45 29 3d 3d 30 0a 20 20 20 20  N_CLOSE)==0.    
28ba0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 73 20  ){.      int ws 
28bb0 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  = pLoop->wsFlags
28bc0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 57 49  ;.      if( !pWI
28bd0 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26  nfo->okOnePass &
28be0 26 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 44  & (ws & WHERE_ID
28bf0 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20  X_ONLY)==0 ){.  
28c00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
28c10 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
28c20 6f 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  ose, pTabItem->i
28c30 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d  Cursor);.      }
28c40 0a 20 20 20 20 20 20 69 66 28 20 28 77 73 20 26  .      if( (ws &
28c50 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
28c60 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 77 73  =0.       && (ws
28c70 20 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57 48   & (WHERE_IPK|WH
28c80 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 29  ERE_AUTO_INDEX))
28c90 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70  ==0 .       && p
28ca0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 21 3d  Level->iIdxCur!=
28cb0 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65  pWInfo->aiCurOne
28cc0 50 61 73 73 5b 31 5d 0a 20 20 20 20 20 20 29 7b  Pass[1].      ){
28cd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28ce0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
28cf0 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e  _Close, pLevel->
28d00 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20  iIdxCur);.      
28d10 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
28d20 49 66 20 74 68 69 73 20 73 63 61 6e 20 75 73 65  If this scan use
28d30 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65  s an index, make
28d40 20 56 44 42 45 20 63 6f 64 65 20 73 75 62 73 74   VDBE code subst
28d50 69 74 75 74 69 6f 6e 73 20 74 6f 20 72 65 61 64  itutions to read
28d60 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f   data.    ** fro
28d70 6d 20 74 68 65 20 69 6e 64 65 78 20 69 6e 73 74  m the index inst
28d80 65 61 64 20 6f 66 20 66 72 6f 6d 20 74 68 65 20  ead of from the 
28d90 74 61 62 6c 65 20 77 68 65 72 65 20 70 6f 73 73  table where poss
28da0 69 62 6c 65 2e 20 20 49 6e 20 73 6f 6d 65 20 63  ible.  In some c
28db0 61 73 65 73 0a 20 20 20 20 2a 2a 20 74 68 69 73  ases.    ** this
28dc0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 70 72   optimization pr
28dd0 65 76 65 6e 74 73 20 74 68 65 20 74 61 62 6c 65  events the table
28de0 20 66 72 6f 6d 20 65 76 65 72 20 62 65 69 6e 67   from ever being
28df0 20 72 65 61 64 2c 20 77 68 69 63 68 20 63 61 6e   read, which can
28e00 0a 20 20 20 20 2a 2a 20 79 69 65 6c 64 20 61 20  .    ** yield a 
28e10 73 69 67 6e 69 66 69 63 61 6e 74 20 70 65 72 66  significant perf
28e20 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e 0a 20  ormance boost.. 
28e30 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61     ** .    ** Ca
28e40 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20  lls to the code 
28e50 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65 74  generator in bet
28e60 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65 72  ween sqlite3Wher
28e70 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a  eBegin and.    *
28e80 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  * sqlite3WhereEn
28e90 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65 61  d will have crea
28ea0 74 65 64 20 63 6f 64 65 20 74 68 61 74 20 72 65  ted code that re
28eb0 66 65 72 65 6e 63 65 73 20 74 68 65 20 74 61 62  ferences the tab
28ec0 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  le.    ** direct
28ed0 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20 73  ly.  This loop s
28ee0 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63 6f  cans all that co
28ef0 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f  de looking for o
28f00 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74 68  pcodes.    ** th
28f10 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  at reference the
28f20 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65   table and conve
28f30 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70  rts them into op
28f40 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20 2a  codes that.    *
28f50 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  * reference the 
28f60 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20  index..    */.  
28f70 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
28f80 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 4e  lags & (WHERE_IN
28f90 44 45 58 45 44 7c 57 48 45 52 45 5f 49 44 58 5f  DEXED|WHERE_IDX_
28fa0 4f 4e 4c 59 29 20 29 7b 0a 20 20 20 20 20 20 70  ONLY) ){.      p
28fb0 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Idx = pLoop->u.b
28fc0 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
28fd0 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70   }else if( pLoop
28fe0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
28ff0 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20  E_MULTI_OR ){.  
29000 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65      pIdx = pLeve
29010 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 3b 0a 20 20  l->u.pCovidx;.  
29020 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78    }.    if( pIdx
29030 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
29040 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 6c  ailed ){.      l
29050 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ast = sqlite3Vdb
29060 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
29070 0a 20 20 20 20 20 20 6b 20 3d 20 70 4c 65 76 65  .      k = pLeve
29080 6c 2d 3e 61 64 64 72 42 6f 64 79 3b 0a 20 20 20  l->addrBody;.   
29090 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
290a0 56 64 62 65 47 65 74 4f 70 28 76 2c 20 6b 29 3b  VdbeGetOp(v, k);
290b0 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 6b 3c 6c  .      for(; k<l
290c0 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29  ast; k++, pOp++)
290d0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  {.        if( pO
290e0 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69  p->p1!=pLevel->i
290f0 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  TabCur ) continu
29100 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
29110 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43  Op->opcode==OP_C
29120 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
29130 20 20 20 69 6e 74 20 78 20 3d 20 70 4f 70 2d 3e     int x = pOp->
29140 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  p2;.          as
29150 73 65 72 74 28 20 70 49 64 78 2d 3e 70 54 61 62  sert( pIdx->pTab
29160 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20  le==pTab );.    
29170 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f        if( !HasRo
29180 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20  wid(pTab) ){.   
29190 20 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a           Index *
291a0 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
291b0 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
291c0 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  b);.            
291d0 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  x = pPk->aiColum
291e0 6e 5b 78 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  n[x];.          
291f0 7d 0a 20 20 20 20 20 20 20 20 20 20 78 20 3d 20  }.          x = 
29200 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49  sqlite3ColumnOfI
29210 6e 64 65 78 28 70 49 64 78 2c 20 78 29 3b 0a 20  ndex(pIdx, x);. 
29220 20 20 20 20 20 20 20 20 20 69 66 28 20 78 3e 3d           if( x>=
29230 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
29240 20 70 4f 70 2d 3e 70 32 20 3d 20 78 3b 0a 20 20   pOp->p2 = x;.  
29250 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
29260 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  1 = pLevel->iIdx
29270 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  Cur;.          }
29280 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
29290 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  t( (pLoop->wsFla
292a0 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
292b0 4e 4c 59 29 3d 3d 30 20 7c 7c 20 78 3e 3d 30 20  NLY)==0 || x>=0 
292c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
292d0 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
292e0 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20  ==OP_Rowid ){.  
292f0 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
29300 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  = pLevel->iIdxCu
29310 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  r;.          pOp
29320 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64  ->opcode = OP_Id
29330 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20  xRowid;.        
29340 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
29350 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20    }..  /* Final 
29360 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 70  cleanup.  */.  p
29370 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
29380 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65  p = pWInfo->save
29390 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 77  dNQueryLoop;.  w
293a0 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c  hereInfoFree(db,
293b0 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75   pWInfo);.  retu
293c0 72 6e 3b 0a 7d 0a                                rn;.}.