/ Hex Artifact Content
Login

Artifact fea270aeef23f978edac94b5591c74b0bf3ce884:


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 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0360: 22 76 64 62 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a  "vdbeInt.h"../*.
0370: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 65 73  ** Return the es
0380: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
0390: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 66 72  f output rows fr
03a0: 6f 6d 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  om a WHERE claus
03b0: 65 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33  e.*/.u64 sqlite3
03c0: 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f  WhereOutputRowCo
03d0: 75 6e 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  unt(WhereInfo *p
03e0: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
03f0: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f   sqlite3LogEstTo
0400: 49 6e 74 28 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  Int(pWInfo->nRow
0410: 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Out);.}../*.** R
0420: 65 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65  eturn one of the
0430: 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
0440: 78 78 78 78 78 20 76 61 6c 75 65 73 20 74 6f 20  xxxxx values to 
0450: 69 6e 64 69 63 61 74 65 20 68 6f 77 20 74 68 69  indicate how thi
0460: 73 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  s.** WHERE claus
0470: 65 20 72 65 74 75 72 6e 73 20 6f 75 74 70 75 74  e returns output
0480: 73 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70  s for DISTINCT p
0490: 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e  rocessing..*/.in
04a0: 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  t sqlite3WhereIs
04b0: 44 69 73 74 69 6e 63 74 28 57 68 65 72 65 49 6e  Distinct(WhereIn
04c0: 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72  fo *pWInfo){.  r
04d0: 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65 44  eturn pWInfo->eD
04e0: 69 73 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  istinct;.}../*.*
04f0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
0500: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
0510: 65 20 72 65 74 75 72 6e 73 20 72 6f 77 73 20 69  e returns rows i
0520: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72  n ORDER BY order
0530: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53  ..** Return FALS
0540: 45 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  E if the output 
0550: 6e 65 65 64 73 20 74 6f 20 62 65 20 73 6f 72 74  needs to be sort
0560: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
0570: 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64  e3WhereIsOrdered
0580: 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
0590: 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57  fo){.  return pW
05a0: 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3b 0a 7d 0a  Info->nOBSat;.}.
05b0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
05c0: 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20 6f  e VDBE address o
05d0: 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20  r label to jump 
05e0: 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  to in order to c
05f0: 6f 6e 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65 64  ontinue.** immed
0600: 69 61 74 65 6c 79 20 77 69 74 68 20 74 68 65 20  iately with the 
0610: 6e 65 78 74 20 72 6f 77 20 6f 66 20 61 20 57 48  next row of a WH
0620: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69  ERE clause..*/.i
0630: 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 43  nt sqlite3WhereC
0640: 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 57 68 65  ontinueLabel(Whe
0650: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
0660: 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
0670: 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20  o->iContinue!=0 
0680: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  );.  return pWIn
0690: 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a 7d  fo->iContinue;.}
06a0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
06b0: 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20  he VDBE address 
06c0: 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70  or label to jump
06d0: 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20   to in order to 
06e0: 62 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66 20  break.** out of 
06f0: 61 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a 2f  a WHERE loop..*/
0700: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72  .int sqlite3Wher
0710: 65 42 72 65 61 6b 4c 61 62 65 6c 28 57 68 65 72  eBreakLabel(Wher
0720: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0730: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
0740: 3e 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a  >iBreak;.}../*.*
0750: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
0760: 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
0770: 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 63  LETE statement c
0780: 61 6e 20 6f 70 65 72 61 74 65 20 64 69 72 65 63  an operate direc
0790: 74 6c 79 20 6f 6e 0a 2a 2a 20 74 68 65 20 72 6f  tly on.** the ro
07a0: 77 69 64 73 20 72 65 74 75 72 6e 65 64 20 62 79  wids returned by
07b0: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
07c0: 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69    Return FALSE i
07d0: 66 20 64 6f 69 6e 67 20 61 6e 0a 2a 2a 20 55 50  f doing an.** UP
07e0: 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 6d  DATE or DELETE m
07f0: 69 67 68 74 20 63 68 61 6e 67 65 20 73 75 62 73  ight change subs
0800: 65 71 75 65 6e 74 20 57 48 45 52 45 20 63 6c 61  equent WHERE cla
0810: 75 73 65 20 72 65 73 75 6c 74 73 2e 0a 2a 2a 0a  use results..**.
0820: 2a 2a 20 49 66 20 74 68 65 20 4f 4e 45 50 41 53  ** If the ONEPAS
0830: 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  S optimization i
0840: 73 20 75 73 65 64 20 28 69 66 20 74 68 69 73 20  s used (if this 
0850: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
0860: 74 72 75 65 29 0a 2a 2a 20 74 68 65 6e 20 61 6c  true).** then al
0870: 73 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 64  so write the ind
0880: 69 63 65 73 20 6f 66 20 6f 70 65 6e 20 63 75 72  ices of open cur
0890: 73 6f 72 73 20 75 73 65 64 20 62 79 20 4f 4e 45  sors used by ONE
08a0: 50 41 53 53 0a 2a 2a 20 69 6e 74 6f 20 61 69 43  PASS.** into aiC
08b0: 75 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b  ur[0] and aiCur[
08c0: 31 5d 2e 20 20 69 61 43 75 72 5b 30 5d 20 67 65  1].  iaCur[0] ge
08d0: 74 73 20 74 68 65 20 63 75 72 73 6f 72 20 6f 66  ts the cursor of
08e0: 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 74 61 62   the data.** tab
08f0: 6c 65 20 61 6e 64 20 69 61 43 75 72 5b 31 5d 20  le and iaCur[1] 
0900: 67 65 74 73 20 74 68 65 20 63 75 72 73 6f 72 20  gets the cursor 
0910: 75 73 65 64 20 62 79 20 61 6e 20 61 75 78 69 6c  used by an auxil
0920: 69 61 72 79 20 69 6e 64 65 78 2e 0a 2a 2a 20 45  iary index..** E
0930: 69 74 68 65 72 20 76 61 6c 75 65 20 6d 61 79 20  ither value may 
0940: 62 65 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e  be -1, indicatin
0950: 67 20 74 68 61 74 20 63 75 72 73 6f 72 20 69 73  g that cursor is
0960: 20 6e 6f 74 20 75 73 65 64 2e 0a 2a 2a 20 41 6e   not used..** An
0970: 79 20 63 75 72 73 6f 72 73 20 72 65 74 75 72 6e  y cursors return
0980: 65 64 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  ed will have bee
0990: 6e 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69  n opened for wri
09a0: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75  ting..**.** aiCu
09b0: 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31  r[0] and aiCur[1
09c0: 5d 20 62 6f 74 68 20 67 65 74 20 2d 31 20 69 66  ] both get -1 if
09d0: 20 74 68 65 20 77 68 65 72 65 2d 63 6c 61 75 73   the where-claus
09e0: 65 20 6c 6f 67 69 63 20 69 73 0a 2a 2a 20 75 6e  e logic is.** un
09f0: 61 62 6c 65 20 74 6f 20 75 73 65 20 74 68 65 20  able to use the 
0a00: 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61  ONEPASS optimiza
0a10: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
0a20: 69 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61  ite3WhereOkOnePa
0a30: 73 73 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ss(WhereInfo *pW
0a40: 49 6e 66 6f 2c 20 69 6e 74 20 2a 61 69 43 75 72  Info, int *aiCur
0a50: 29 7b 0a 20 20 6d 65 6d 63 70 79 28 61 69 43 75  ){.  memcpy(aiCu
0a60: 72 2c 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72  r, pWInfo->aiCur
0a70: 4f 6e 65 50 61 73 73 2c 20 73 69 7a 65 6f 66 28  OnePass, sizeof(
0a80: 69 6e 74 29 2a 32 29 3b 0a 20 20 72 65 74 75 72  int)*2);.  retur
0a90: 6e 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50  n pWInfo->okOneP
0aa0: 61 73 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  ass;.}../*.** Mo
0ab0: 76 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ve the content o
0ac0: 66 20 70 53 72 63 20 69 6e 74 6f 20 70 44 65 73  f pSrc into pDes
0ad0: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
0ae0: 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 57 68 65   whereOrMove(Whe
0af0: 72 65 4f 72 53 65 74 20 2a 70 44 65 73 74 2c 20  reOrSet *pDest, 
0b00: 57 68 65 72 65 4f 72 53 65 74 20 2a 70 53 72 63  WhereOrSet *pSrc
0b10: 29 7b 0a 20 20 70 44 65 73 74 2d 3e 6e 20 3d 20  ){.  pDest->n = 
0b20: 70 53 72 63 2d 3e 6e 3b 0a 20 20 6d 65 6d 63 70  pSrc->n;.  memcp
0b30: 79 28 70 44 65 73 74 2d 3e 61 2c 20 70 53 72 63  y(pDest->a, pSrc
0b40: 2d 3e 61 2c 20 70 44 65 73 74 2d 3e 6e 2a 73 69  ->a, pDest->n*si
0b50: 7a 65 6f 66 28 70 44 65 73 74 2d 3e 61 5b 30 5d  zeof(pDest->a[0]
0b60: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  ));.}../*.** Try
0b70: 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77   to insert a new
0b80: 20 70 72 65 72 65 71 75 69 73 69 74 65 2f 63 6f   prerequisite/co
0b90: 73 74 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  st entry into th
0ba0: 65 20 57 68 65 72 65 4f 72 53 65 74 20 70 53 65  e WhereOrSet pSe
0bb0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  t..**.** The new
0bc0: 20 65 6e 74 72 79 20 6d 69 67 68 74 20 6f 76 65   entry might ove
0bd0: 72 77 72 69 74 65 20 61 6e 20 65 78 69 73 74 69  rwrite an existi
0be0: 6e 67 20 65 6e 74 72 79 2c 20 6f 72 20 69 74 20  ng entry, or it 
0bf0: 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 70 70 65  might be.** appe
0c00: 6e 64 65 64 2c 20 6f 72 20 69 74 20 6d 69 67 68  nded, or it migh
0c10: 74 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 20  t be discarded. 
0c20: 20 44 6f 20 77 68 61 74 65 76 65 72 20 69 73 20   Do whatever is 
0c30: 74 68 65 20 72 69 67 68 74 20 74 68 69 6e 67 0a  the right thing.
0c40: 2a 2a 20 73 6f 20 74 68 61 74 20 70 53 65 74 20  ** so that pSet 
0c50: 6b 65 65 70 73 20 74 68 65 20 4e 5f 4f 52 5f 43  keeps the N_OR_C
0c60: 4f 53 54 20 62 65 73 74 20 65 6e 74 72 69 65 73  OST best entries
0c70: 20 73 65 65 6e 20 73 6f 20 66 61 72 2e 0a 2a 2f   seen so far..*/
0c80: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
0c90: 65 4f 72 49 6e 73 65 72 74 28 0a 20 20 57 68 65  eOrInsert(.  Whe
0ca0: 72 65 4f 72 53 65 74 20 2a 70 53 65 74 2c 20 20  reOrSet *pSet,  
0cb0: 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
0cc0: 4f 72 53 65 74 20 74 6f 20 62 65 20 75 70 64 61  OrSet to be upda
0cd0: 74 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ted */.  Bitmask
0ce0: 20 70 72 65 72 65 71 2c 20 20 20 20 20 20 20 20   prereq,        
0cf0: 2f 2a 20 50 72 65 72 65 71 75 69 73 69 74 65 73  /* Prerequisites
0d00: 20 6f 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72   of the new entr
0d10: 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 52  y */.  LogEst rR
0d20: 75 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  un,           /*
0d30: 20 52 75 6e 2d 63 6f 73 74 20 6f 66 20 74 68 65   Run-cost of the
0d40: 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20 20   new entry */.  
0d50: 4c 6f 67 45 73 74 20 6e 4f 75 74 20 20 20 20 20  LogEst nOut     
0d60: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
0d70: 20 6f 66 20 6f 75 74 70 75 74 73 20 66 6f 72 20   of outputs for 
0d80: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f  the new entry */
0d90: 0a 29 7b 0a 20 20 75 31 36 20 69 3b 0a 20 20 57  .){.  u16 i;.  W
0da0: 68 65 72 65 4f 72 43 6f 73 74 20 2a 70 3b 0a 20  hereOrCost *p;. 
0db0: 20 66 6f 72 28 69 3d 70 53 65 74 2d 3e 6e 2c 20   for(i=pSet->n, 
0dc0: 70 3d 70 53 65 74 2d 3e 61 3b 20 69 3e 30 3b 20  p=pSet->a; i>0; 
0dd0: 69 2d 2d 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i--, p++){.    i
0de0: 66 28 20 72 52 75 6e 3c 3d 70 2d 3e 72 52 75 6e  f( rRun<=p->rRun
0df0: 20 26 26 20 28 70 72 65 72 65 71 20 26 20 70 2d   && (prereq & p-
0e00: 3e 70 72 65 72 65 71 29 3d 3d 70 72 65 72 65 71  >prereq)==prereq
0e10: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 77   ){.      goto w
0e20: 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e  hereOrInsert_don
0e30: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
0e40: 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 26   p->rRun<=rRun &
0e50: 26 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  & (p->prereq & p
0e60: 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65  rereq)==p->prere
0e70: 71 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  q ){.      retur
0e80: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 0;.    }.  }. 
0e90: 20 69 66 28 20 70 53 65 74 2d 3e 6e 3c 4e 5f 4f   if( pSet->n<N_O
0ea0: 52 5f 43 4f 53 54 20 29 7b 0a 20 20 20 20 70 20  R_COST ){.    p 
0eb0: 3d 20 26 70 53 65 74 2d 3e 61 5b 70 53 65 74 2d  = &pSet->a[pSet-
0ec0: 3e 6e 2b 2b 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4f  >n++];.    p->nO
0ed0: 75 74 20 3d 20 6e 4f 75 74 3b 0a 20 20 7d 65 6c  ut = nOut;.  }el
0ee0: 73 65 7b 0a 20 20 20 20 70 20 3d 20 70 53 65 74  se{.    p = pSet
0ef0: 2d 3e 61 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  ->a;.    for(i=1
0f00: 3b 20 69 3c 70 53 65 74 2d 3e 6e 3b 20 69 2b 2b  ; i<pSet->n; i++
0f10: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
0f20: 72 52 75 6e 3e 70 53 65 74 2d 3e 61 5b 69 5d 2e  rRun>pSet->a[i].
0f30: 72 52 75 6e 20 29 20 70 20 3d 20 70 53 65 74 2d  rRun ) p = pSet-
0f40: 3e 61 20 2b 20 69 3b 0a 20 20 20 20 7d 0a 20 20  >a + i;.    }.  
0f50: 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3c 3d 72    if( p->rRun<=r
0f60: 52 75 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Run ) return 0;.
0f70: 20 20 7d 0a 77 68 65 72 65 4f 72 49 6e 73 65 72    }.whereOrInser
0f80: 74 5f 64 6f 6e 65 3a 0a 20 20 70 2d 3e 70 72 65  t_done:.  p->pre
0f90: 72 65 71 20 3d 20 70 72 65 72 65 71 3b 0a 20 20  req = prereq;.  
0fa0: 70 2d 3e 72 52 75 6e 20 3d 20 72 52 75 6e 3b 0a  p->rRun = rRun;.
0fb0: 20 20 69 66 28 20 70 2d 3e 6e 4f 75 74 3e 6e 4f    if( p->nOut>nO
0fc0: 75 74 20 29 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e  ut ) p->nOut = n
0fd0: 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  Out;.  return 1;
0fe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
0ff0: 6c 69 7a 65 20 61 20 70 72 65 61 6c 6c 6f 63 61  lize a prealloca
1000: 74 65 64 20 57 68 65 72 65 43 6c 61 75 73 65 20  ted WhereClause 
1010: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
1020: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43  atic void whereC
1030: 6c 61 75 73 65 49 6e 69 74 28 0a 20 20 57 68 65  lauseInit(.  Whe
1040: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
1050: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65        /* The Whe
1060: 72 65 43 6c 61 75 73 65 20 74 6f 20 62 65 20 69  reClause to be i
1070: 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
1080: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
1090: 6f 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  o        /* The 
10a0: 57 48 45 52 45 20 70 72 6f 63 65 73 73 69 6e 67  WHERE processing
10b0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20   context */.){. 
10c0: 20 70 57 43 2d 3e 70 57 49 6e 66 6f 20 3d 20 70   pWC->pWInfo = p
10d0: 57 49 6e 66 6f 3b 0a 20 20 70 57 43 2d 3e 70 4f  WInfo;.  pWC->pO
10e0: 75 74 65 72 20 3d 20 30 3b 0a 20 20 70 57 43 2d  uter = 0;.  pWC-
10f0: 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 57  >nTerm = 0;.  pW
1100: 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41 72 72 61 79  C->nSlot = Array
1110: 53 69 7a 65 28 70 57 43 2d 3e 61 53 74 61 74 69  Size(pWC->aStati
1120: 63 29 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20 70  c);.  pWC->a = p
1130: 57 43 2d 3e 61 53 74 61 74 69 63 3b 0a 7d 0a 0a  WC->aStatic;.}..
1140: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
1150: 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76  ence */.static v
1160: 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 43  oid whereClauseC
1170: 6c 65 61 72 28 57 68 65 72 65 43 6c 61 75 73 65  lear(WhereClause
1180: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  *);../*.** Deall
1190: 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f 72 79  ocate all memory
11a0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
11b0: 20 61 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 6f   a WhereOrInfo o
11c0: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
11d0: 20 76 6f 69 64 20 77 68 65 72 65 4f 72 49 6e 66   void whereOrInf
11e0: 6f 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  oDelete(sqlite3 
11f0: 2a 64 62 2c 20 57 68 65 72 65 4f 72 49 6e 66 6f  *db, WhereOrInfo
1200: 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 43 6c 61   *p){.  whereCla
1210: 75 73 65 43 6c 65 61 72 28 26 70 2d 3e 77 63 29  useClear(&p->wc)
1220: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1230: 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
1240: 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 6c  ** Deallocate al
1250: 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  l memory associa
1260: 74 65 64 20 77 69 74 68 20 61 20 57 68 65 72 65  ted with a Where
1270: 41 6e 64 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a  AndInfo object..
1280: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
1290: 68 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74  hereAndInfoDelet
12a0: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
12b0: 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70 29 7b  hereAndInfo *p){
12c0: 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
12d0: 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73  ear(&p->wc);.  s
12e0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
12f0: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   p);.}../*.** De
1300: 61 6c 6c 6f 63 61 74 65 20 61 20 57 68 65 72 65  allocate a Where
1310: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
1320: 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61 75  .  The WhereClau
1330: 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  se structure.** 
1340: 69 74 73 65 6c 66 20 69 73 20 6e 6f 74 20 66 72  itself is not fr
1350: 65 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  eed.  This routi
1360: 6e 65 20 69 73 20 74 68 65 20 69 6e 76 65 72 73  ne is the invers
1370: 65 20 6f 66 20 77 68 65 72 65 43 6c 61 75 73 65  e of whereClause
1380: 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Init()..*/.stati
1390: 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75  c void whereClau
13a0: 73 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61  seClear(WhereCla
13b0: 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 69 6e 74  use *pWC){.  int
13c0: 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20   i;.  WhereTerm 
13d0: 2a 61 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *a;.  sqlite3 *d
13e0: 62 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d  b = pWC->pWInfo-
13f0: 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 66  >pParse->db;.  f
1400: 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d  or(i=pWC->nTerm-
1410: 31 2c 20 61 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d  1, a=pWC->a; i>=
1420: 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20  0; i--, a++){.  
1430: 20 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73    if( a->wtFlags
1440: 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20   & TERM_DYNAMIC 
1450: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1460: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 61  ExprDelete(db, a
1470: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ->pExpr);.    }.
1480: 20 20 20 20 69 66 28 20 61 2d 3e 77 74 46 6c 61      if( a->wtFla
1490: 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f  gs & TERM_ORINFO
14a0: 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4f   ){.      whereO
14b0: 72 49 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c 20  rInfoDelete(db, 
14c0: 61 2d 3e 75 2e 70 4f 72 49 6e 66 6f 29 3b 0a 20  a->u.pOrInfo);. 
14d0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 2d 3e     }else if( a->
14e0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 41  wtFlags & TERM_A
14f0: 4e 44 49 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20  NDINFO ){.      
1500: 77 68 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65  whereAndInfoDele
1510: 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70 41 6e 64  te(db, a->u.pAnd
1520: 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Info);.    }.  }
1530: 0a 20 20 69 66 28 20 70 57 43 2d 3e 61 21 3d 70  .  if( pWC->a!=p
1540: 57 43 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20  WC->aStatic ){. 
1550: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1560: 28 64 62 2c 20 70 57 43 2d 3e 61 29 3b 0a 20 20  (db, pWC->a);.  
1570: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  }.}../*.** Add a
1580: 20 73 69 6e 67 6c 65 20 6e 65 77 20 57 68 65 72   single new Wher
1590: 65 54 65 72 6d 20 65 6e 74 72 79 20 74 6f 20 74  eTerm entry to t
15a0: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f  he WhereClause o
15b0: 62 6a 65 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68  bject pWC..** Th
15c0: 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20  e new WhereTerm 
15d0: 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e 73 74 72  object is constr
15e0: 75 63 74 65 64 20 66 72 6f 6d 20 45 78 70 72 20  ucted from Expr 
15f0: 70 20 61 6e 64 20 77 69 74 68 20 77 74 46 6c 61  p and with wtFla
1600: 67 73 2e 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78  gs..** The index
1610: 20 69 6e 20 70 57 43 2d 3e 61 5b 5d 20 6f 66 20   in pWC->a[] of 
1620: 74 68 65 20 6e 65 77 20 57 68 65 72 65 54 65 72  the new WhereTer
1630: 6d 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  m is returned on
1640: 20 73 75 63 63 65 73 73 2e 0a 2a 2a 20 30 20 69   success..** 0 i
1650: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
1660: 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20  e new WhereTerm 
1670: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 64 64  could not be add
1680: 65 64 20 64 75 65 20 74 6f 20 61 20 6d 65 6d 6f  ed due to a memo
1690: 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  ry.** allocation
16a0: 20 65 72 72 6f 72 2e 20 20 54 68 65 20 6d 65 6d   error.  The mem
16b0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
16c0: 61 69 6c 75 72 65 20 77 69 6c 6c 20 62 65 20 72  ailure will be r
16d0: 65 63 6f 72 64 65 64 20 69 6e 0a 2a 2a 20 74 68  ecorded in.** th
16e0: 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  e db->mallocFail
16f0: 65 64 20 66 6c 61 67 20 73 6f 20 74 68 61 74 20  ed flag so that 
1700: 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 66 75 6e  higher-level fun
1710: 63 74 69 6f 6e 73 20 63 61 6e 20 64 65 74 65 63  ctions can detec
1720: 74 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  t it..**.** This
1730: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 69 6e   routine will in
1740: 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65 20  crease the size 
1750: 6f 66 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20  of the pWC->a[] 
1760: 61 72 72 61 79 20 61 73 20 6e 65 63 65 73 73 61  array as necessa
1770: 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ry..**.** If the
1780: 20 77 74 46 6c 61 67 73 20 61 72 67 75 6d 65 6e   wtFlags argumen
1790: 74 20 69 6e 63 6c 75 64 65 73 20 54 45 52 4d 5f  t includes TERM_
17a0: 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 72 65  DYNAMIC, then re
17b0: 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20  sponsibility.** 
17c0: 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65 20  for freeing the 
17d0: 65 78 70 72 65 73 73 69 6f 6e 20 70 20 69 73 20  expression p is 
17e0: 61 73 73 75 6d 65 64 20 62 79 20 74 68 65 20 57  assumed by the W
17f0: 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63  hereClause objec
1800: 74 20 70 57 43 2e 0a 2a 2a 20 54 68 69 73 20 69  t pWC..** This i
1810: 73 20 74 72 75 65 20 65 76 65 6e 20 69 66 20 74  s true even if t
1820: 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
1830: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20  s to allocate a 
1840: 6e 65 77 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a  new WhereTerm..*
1850: 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 20 54  *.** WARNING:  T
1860: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
1870: 74 20 72 65 61 6c 6c 6f 63 61 74 65 20 74 68 65  t reallocate the
1880: 20 73 70 61 63 65 20 75 73 65 64 20 74 6f 20 73   space used to s
1890: 74 6f 72 65 0a 2a 2a 20 57 68 65 72 65 54 65 72  tore.** WhereTer
18a0: 6d 73 2e 20 20 41 6c 6c 20 70 6f 69 6e 74 65 72  ms.  All pointer
18b0: 73 20 74 6f 20 57 68 65 72 65 54 65 72 6d 73 20  s to WhereTerms 
18c0: 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 61 6c 69  should be invali
18d0: 64 61 74 65 64 20 61 66 74 65 72 0a 2a 2a 20 63  dated after.** c
18e0: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
18f0: 69 6e 65 2e 20 20 53 75 63 68 20 70 6f 69 6e 74  ine.  Such point
1900: 65 72 73 20 6d 61 79 20 62 65 20 72 65 69 6e 69  ers may be reini
1910: 74 69 61 6c 69 7a 65 64 20 62 79 20 72 65 66 65  tialized by refe
1920: 72 65 6e 63 69 6e 67 0a 2a 2a 20 74 68 65 20 70  rencing.** the p
1930: 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79 2e 0a 2a  WC->a[] array..*
1940: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
1950: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 57  reClauseInsert(W
1960: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
1970: 20 45 78 70 72 20 2a 70 2c 20 75 38 20 77 74 46   Expr *p, u8 wtF
1980: 6c 61 67 73 29 7b 0a 20 20 57 68 65 72 65 54 65  lags){.  WhereTe
1990: 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74  rm *pTerm;.  int
19a0: 20 69 64 78 3b 0a 20 20 74 65 73 74 63 61 73 65   idx;.  testcase
19b0: 28 20 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ( wtFlags & TERM
19c0: 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 69 66  _VIRTUAL );.  if
19d0: 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57  ( pWC->nTerm>=pW
19e0: 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a 20 20 20 20  C->nSlot ){.    
19f0: 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 6c 64 20  WhereTerm *pOld 
1a00: 3d 20 70 57 43 2d 3e 61 3b 0a 20 20 20 20 73 71  = pWC->a;.    sq
1a10: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 43 2d  lite3 *db = pWC-
1a20: 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d  >pWInfo->pParse-
1a30: 3e 64 62 3b 0a 20 20 20 20 70 57 43 2d 3e 61 20  >db;.    pWC->a 
1a40: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
1a50: 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
1a60: 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e  pWC->a[0])*pWC->
1a70: 6e 53 6c 6f 74 2a 32 20 29 3b 0a 20 20 20 20 69  nSlot*2 );.    i
1a80: 66 28 20 70 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a  f( pWC->a==0 ){.
1a90: 20 20 20 20 20 20 69 66 28 20 77 74 46 6c 61 67        if( wtFlag
1aa0: 73 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43  s & TERM_DYNAMIC
1ab0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1ac0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
1ad0: 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , p);.      }.  
1ae0: 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 70 4f 6c      pWC->a = pOl
1af0: 64 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  d;.      return 
1b00: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  0;.    }.    mem
1b10: 63 70 79 28 70 57 43 2d 3e 61 2c 20 70 4f 6c 64  cpy(pWC->a, pOld
1b20: 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b  , sizeof(pWC->a[
1b30: 30 5d 29 2a 70 57 43 2d 3e 6e 54 65 72 6d 29 3b  0])*pWC->nTerm);
1b40: 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 21 3d 70  .    if( pOld!=p
1b50: 57 43 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20  WC->aStatic ){. 
1b60: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
1b70: 65 65 28 64 62 2c 20 70 4f 6c 64 29 3b 0a 20 20  ee(db, pOld);.  
1b80: 20 20 7d 0a 20 20 20 20 70 57 43 2d 3e 6e 53 6c    }.    pWC->nSl
1b90: 6f 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ot = sqlite3DbMa
1ba0: 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 57 43  llocSize(db, pWC
1bb0: 2d 3e 61 29 2f 73 69 7a 65 6f 66 28 70 57 43 2d  ->a)/sizeof(pWC-
1bc0: 3e 61 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 70 54  >a[0]);.  }.  pT
1bd0: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
1be0: 78 20 3d 20 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b  x = pWC->nTerm++
1bf0: 5d 3b 0a 20 20 69 66 28 20 70 20 26 26 20 45 78  ];.  if( p && Ex
1c00: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
1c10: 20 45 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b   EP_Unlikely) ){
1c20: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 74 72 75 74  .    pTerm->trut
1c30: 68 50 72 6f 62 20 3d 20 73 71 6c 69 74 65 33 4c  hProb = sqlite3L
1c40: 6f 67 45 73 74 28 70 2d 3e 69 54 61 62 6c 65 29  ogEst(p->iTable)
1c50: 20 2d 20 39 39 3b 0a 20 20 7d 65 6c 73 65 7b 0a   - 99;.  }else{.
1c60: 20 20 20 20 70 54 65 72 6d 2d 3e 74 72 75 74 68      pTerm->truth
1c70: 50 72 6f 62 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Prob = 1;.  }.  
1c80: 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 3d 20 73  pTerm->pExpr = s
1c90: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
1ca0: 6c 6c 61 74 65 28 70 29 3b 0a 20 20 70 54 65 72  llate(p);.  pTer
1cb0: 6d 2d 3e 77 74 46 6c 61 67 73 20 3d 20 77 74 46  m->wtFlags = wtF
1cc0: 6c 61 67 73 3b 0a 20 20 70 54 65 72 6d 2d 3e 70  lags;.  pTerm->p
1cd0: 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 54 65 72  WC = pWC;.  pTer
1ce0: 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b  m->iParent = -1;
1cf0: 0a 20 20 72 65 74 75 72 6e 20 69 64 78 3b 0a 7d  .  return idx;.}
1d00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1d10: 74 69 6e 65 20 69 64 65 6e 74 69 66 69 65 73 20  tine identifies 
1d20: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 69  subexpressions i
1d30: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
1d40: 73 65 20 77 68 65 72 65 0a 2a 2a 20 65 61 63 68  se where.** each
1d50: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69   subexpression i
1d60: 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20 74  s separated by t
1d70: 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20  he AND operator 
1d80: 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  or some other.**
1d90: 20 6f 70 65 72 61 74 6f 72 20 73 70 65 63 69 66   operator specif
1da0: 69 65 64 20 69 6e 20 74 68 65 20 6f 70 20 70 61  ied in the op pa
1db0: 72 61 6d 65 74 65 72 2e 20 20 54 68 65 20 57 68  rameter.  The Wh
1dc0: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
1dd0: 75 72 65 0a 2a 2a 20 69 73 20 66 69 6c 6c 65 64  ure.** is filled
1de0: 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74   with pointers t
1df0: 6f 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73  o subexpressions
1e00: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  .  For example:.
1e10: 2a 2a 0a 2a 2a 20 20 20 20 57 48 45 52 45 20 20  **.**    WHERE  
1e20: 61 3d 3d 27 68 65 6c 6c 6f 27 20 41 4e 44 20 63  a=='hello' AND c
1e30: 6f 61 6c 65 73 63 65 28 62 2c 31 31 29 3c 31 30  oalesce(b,11)<10
1e40: 20 41 4e 44 20 28 63 2b 31 32 21 3d 64 20 4f 52   AND (c+12!=d OR
1e50: 20 63 3d 3d 32 32 29 0a 2a 2a 20 20 20 20 20 20   c==22).**      
1e60: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20       \________/ 
1e70: 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
1e80: 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f  ____/     \_____
1e90: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20  ___________/.** 
1ea0: 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b             slot[
1eb0: 30 5d 20 20 20 20 20 20 20 20 20 20 20 20 73 6c  0]            sl
1ec0: 6f 74 5b 31 5d 20 20 20 20 20 20 20 20 20 20 20  ot[1]           
1ed0: 20 20 20 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a      slot[2].**.*
1ee0: 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 57  * The original W
1ef0: 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 70  HERE clause in p
1f00: 45 78 70 72 20 69 73 20 75 6e 61 6c 74 65 72 65  Expr is unaltere
1f10: 64 2e 20 20 41 6c 6c 20 74 68 69 73 20 72 6f 75  d.  All this rou
1f20: 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 69 73 20  tine.** does is 
1f30: 6d 61 6b 65 20 73 6c 6f 74 5b 5d 20 65 6e 74 72  make slot[] entr
1f40: 69 65 73 20 70 6f 69 6e 74 20 74 6f 20 73 75 62  ies point to sub
1f50: 73 74 72 75 63 74 75 72 65 20 77 69 74 68 69 6e  structure within
1f60: 20 70 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e   pExpr..**.** In
1f70: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65   the previous se
1f80: 6e 74 65 6e 63 65 20 61 6e 64 20 69 6e 20 74 68  ntence and in th
1f90: 65 20 64 69 61 67 72 61 6d 2c 20 22 73 6c 6f 74  e diagram, "slot
1fa0: 5b 5d 22 20 72 65 66 65 72 73 20 74 6f 0a 2a 2a  []" refers to.**
1fb0: 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
1fc0: 2e 61 5b 5d 20 61 72 72 61 79 2e 20 20 54 68 65  .a[] array.  The
1fd0: 20 73 6c 6f 74 5b 5d 20 61 72 72 61 79 20 67 72   slot[] array gr
1fe0: 6f 77 73 20 61 73 20 6e 65 65 64 65 64 20 74 6f  ows as needed to
1ff0: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20   contain.** all 
2000: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
2010: 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74  RE clause..*/.st
2020: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 53  atic void whereS
2030: 70 6c 69 74 28 57 68 65 72 65 43 6c 61 75 73 65  plit(WhereClause
2040: 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 45 78   *pWC, Expr *pEx
2050: 70 72 2c 20 75 38 20 6f 70 29 7b 0a 20 20 70 57  pr, u8 op){.  pW
2060: 43 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 69 66  C->op = op;.  if
2070: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
2080: 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72  urn;.  if( pExpr
2090: 2d 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20  ->op!=op ){.    
20a0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
20b0: 74 28 70 57 43 2c 20 70 45 78 70 72 2c 20 30 29  t(pWC, pExpr, 0)
20c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
20d0: 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70  hereSplit(pWC, p
20e0: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 6f 70 29  Expr->pLeft, op)
20f0: 3b 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69 74  ;.    whereSplit
2100: 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 52 69  (pWC, pExpr->pRi
2110: 67 68 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a  ght, op);.  }.}.
2120: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
2130: 65 20 61 20 57 68 65 72 65 4d 61 73 6b 53 65 74  e a WhereMaskSet
2140: 20 6f 62 6a 65 63 74 0a 2a 2f 0a 23 64 65 66 69   object.*/.#defi
2150: 6e 65 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 50  ne initMaskSet(P
2160: 29 20 20 28 50 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a  )  (P)->n=0../*.
2170: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62 69  ** Return the bi
2180: 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 67 69  tmask for the gi
2190: 76 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ven cursor numbe
21a0: 72 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 0a  r.  Return 0 if.
21b0: 2a 2a 20 69 43 75 72 73 6f 72 20 69 73 20 6e 6f  ** iCursor is no
21c0: 74 20 69 6e 20 74 68 65 20 73 65 74 2e 0a 2a 2f  t in the set..*/
21d0: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
21e0: 67 65 74 4d 61 73 6b 28 57 68 65 72 65 4d 61 73  getMask(WhereMas
21f0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
2200: 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20  int iCursor){.  
2210: 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
2220: 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69   pMaskSet->n<=(i
2230: 6e 74 29 73 69 7a 65 6f 66 28 42 69 74 6d 61 73  nt)sizeof(Bitmas
2240: 6b 29 2a 38 20 29 3b 0a 20 20 66 6f 72 28 69 3d  k)*8 );.  for(i=
2250: 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e  0; i<pMaskSet->n
2260: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
2270: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d  pMaskSet->ix[i]=
2280: 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  =iCursor ){.    
2290: 20 20 72 65 74 75 72 6e 20 4d 41 53 4b 42 49 54    return MASKBIT
22a0: 28 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  (i);.    }.  }. 
22b0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
22c0: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
22d0: 20 6d 61 73 6b 20 66 6f 72 20 63 75 72 73 6f 72   mask for cursor
22e0: 20 69 43 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20   iCursor..**.** 
22f0: 54 68 65 72 65 20 69 73 20 6f 6e 65 20 63 75 72  There is one cur
2300: 73 6f 72 20 70 65 72 20 74 61 62 6c 65 20 69 6e  sor per table in
2310: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2320: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  .  The number of
2330: 0a 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68  .** tables in th
2340: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
2350: 20 6c 69 6d 69 74 65 64 20 62 79 20 61 20 74 65   limited by a te
2360: 73 74 20 65 61 72 6c 79 20 69 6e 20 74 68 65 0a  st early in the.
2370: 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  ** sqlite3WhereB
2380: 65 67 69 6e 28 29 20 72 6f 75 74 69 6e 65 2e 20  egin() routine. 
2390: 20 53 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74   So we know that
23a0: 20 74 68 65 20 70 4d 61 73 6b 53 65 74 2d 3e 69   the pMaskSet->i
23b0: 78 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 77 69 6c  x[].** array wil
23c0: 6c 20 6e 65 76 65 72 20 6f 76 65 72 66 6c 6f 77  l never overflow
23d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
23e0: 20 63 72 65 61 74 65 4d 61 73 6b 28 57 68 65 72   createMask(Wher
23f0: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
2400: 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29  et, int iCursor)
2410: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61 73  {.  assert( pMas
2420: 6b 53 65 74 2d 3e 6e 20 3c 20 41 72 72 61 79 53  kSet->n < ArrayS
2430: 69 7a 65 28 70 4d 61 73 6b 53 65 74 2d 3e 69 78  ize(pMaskSet->ix
2440: 29 20 29 3b 0a 20 20 70 4d 61 73 6b 53 65 74 2d  ) );.  pMaskSet-
2450: 3e 69 78 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b  >ix[pMaskSet->n+
2460: 2b 5d 20 3d 20 69 43 75 72 73 6f 72 3b 0a 7d 0a  +] = iCursor;.}.
2470: 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  ./*.** These rou
2480: 74 69 6e 65 73 20 77 61 6c 6b 20 28 72 65 63 75  tines walk (recu
2490: 72 73 69 76 65 6c 79 29 20 61 6e 20 65 78 70 72  rsively) an expr
24a0: 65 73 73 69 6f 6e 20 74 72 65 65 20 61 6e 64 20  ession tree and 
24b0: 67 65 6e 65 72 61 74 65 0a 2a 2a 20 61 20 62 69  generate.** a bi
24c0: 74 6d 61 73 6b 20 69 6e 64 69 63 61 74 69 6e 67  tmask indicating
24d0: 20 77 68 69 63 68 20 74 61 62 6c 65 73 20 61 72   which tables ar
24e0: 65 20 75 73 65 64 20 69 6e 20 74 68 61 74 20 65  e used in that e
24f0: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65  xpression.** tre
2500: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74  e..*/.static Bit
2510: 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54 61 62  mask exprListTab
2520: 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  leUsage(WhereMas
2530: 6b 53 65 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a  kSet*, ExprList*
2540: 29 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  );.static Bitmas
2550: 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  k exprSelectTabl
2560: 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b  eUsage(WhereMask
2570: 53 65 74 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a  Set*, Select*);.
2580: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
2590: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 57 68  xprTableUsage(Wh
25a0: 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
25b0: 6b 53 65 74 2c 20 45 78 70 72 20 2a 70 29 7b 0a  kSet, Expr *p){.
25c0: 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d    Bitmask mask =
25d0: 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   0;.  if( p==0 )
25e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
25f0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
2600: 4e 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 3d 20  N ){.    mask = 
2610: 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
2620: 2c 20 70 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  , p->iTable);.  
2630: 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 20    return mask;. 
2640: 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 65 78 70 72   }.  mask = expr
2650: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
2660: 53 65 74 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b  Set, p->pRight);
2670: 0a 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54  .  mask |= exprT
2680: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2690: 65 74 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  et, p->pLeft);. 
26a0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
26b0: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
26c0: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6d 61 73  lect) ){.    mas
26d0: 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54  k |= exprSelectT
26e0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
26f0: 65 74 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74  et, p->x.pSelect
2700: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2710: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74  mask |= exprList
2720: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
2730: 53 65 74 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29  Set, p->x.pList)
2740: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d  ;.  }.  return m
2750: 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69  ask;.}.static Bi
2760: 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54 61  tmask exprListTa
2770: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
2780: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
2790: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
27a0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42 69  ){.  int i;.  Bi
27b0: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
27c0: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
27d0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
27e0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
27f0: 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20  {.      mask |= 
2800: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
2810: 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e  MaskSet, pList->
2820: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
2830: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2840: 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42  mask;.}.static B
2850: 69 74 6d 61 73 6b 20 65 78 70 72 53 65 6c 65 63  itmask exprSelec
2860: 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72  tTableUsage(Wher
2870: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
2880: 65 74 2c 20 53 65 6c 65 63 74 20 2a 70 53 29 7b  et, Select *pS){
2890: 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20  .  Bitmask mask 
28a0: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53  = 0;.  while( pS
28b0: 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20   ){.    SrcList 
28c0: 2a 70 53 72 63 20 3d 20 70 53 2d 3e 70 53 72 63  *pSrc = pS->pSrc
28d0: 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  ;.    mask |= ex
28e0: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
28f0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
2900: 45 4c 69 73 74 29 3b 0a 20 20 20 20 6d 61 73 6b  EList);.    mask
2910: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
2920: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
2930: 20 70 53 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a   pS->pGroupBy);.
2940: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
2950: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
2960: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 4f 72  MaskSet, pS->pOr
2970: 64 65 72 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b  derBy);.    mask
2980: 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61   |= exprTableUsa
2990: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
29a0: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 6d 61  >pWhere);.    ma
29b0: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
29c0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
29d0: 53 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  S->pHaving);.   
29e0: 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 72 63   if( ALWAYS(pSrc
29f0: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  !=0) ){.      in
2a00: 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t i;.      for(i
2a10: 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  =0; i<pSrc->nSrc
2a20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2a30: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65  mask |= exprSele
2a40: 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  ctTableUsage(pMa
2a50: 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e 61 5b 69  skSet, pSrc->a[i
2a60: 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ].pSelect);.    
2a70: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
2a80: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
2a90: 53 65 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e  Set, pSrc->a[i].
2aa0: 70 4f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pOn);.      }.  
2ab0: 20 20 7d 0a 20 20 20 20 70 53 20 3d 20 70 53 2d    }.    pS = pS-
2ac0: 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 72  >pPrior;.  }.  r
2ad0: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f  eturn mask;.}../
2ae0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
2af0: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 6f 70   if the given op
2b00: 65 72 61 74 6f 72 20 69 73 20 6f 6e 65 20 6f 66  erator is one of
2b10: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 74   the operators t
2b20: 68 61 74 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65  hat is.** allowe
2b30: 64 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 61 62  d for an indexab
2b40: 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  le WHERE clause 
2b50: 74 65 72 6d 2e 20 20 54 68 65 20 61 6c 6c 6f 77  term.  The allow
2b60: 65 64 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65  ed operators are
2b70: 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3e  .** "=", "<", ">
2b80: 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20 22  ", "<=", ">=", "
2b90: 49 4e 22 2c 20 61 6e 64 20 22 49 53 20 4e 55 4c  IN", and "IS NUL
2ba0: 4c 22 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  L".*/.static int
2bb0: 20 61 6c 6c 6f 77 65 64 4f 70 28 69 6e 74 20 6f   allowedOp(int o
2bc0: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 54 4b  p){.  assert( TK
2bd0: 5f 47 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f  _GT>TK_EQ && TK_
2be0: 47 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73  GT<TK_GE );.  as
2bf0: 73 65 72 74 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45  sert( TK_LT>TK_E
2c00: 51 20 26 26 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45  Q && TK_LT<TK_GE
2c10: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b   );.  assert( TK
2c20: 5f 4c 45 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f  _LE>TK_EQ && TK_
2c30: 4c 45 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73  LE<TK_GE );.  as
2c40: 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f  sert( TK_GE==TK_
2c50: 45 51 2b 34 20 29 3b 0a 20 20 72 65 74 75 72 6e  EQ+4 );.  return
2c60: 20 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f   op==TK_IN || (o
2c70: 70 3e 3d 54 4b 5f 45 51 20 26 26 20 6f 70 3c 3d  p>=TK_EQ && op<=
2c80: 54 4b 5f 47 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b  TK_GE) || op==TK
2c90: 5f 49 53 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a  _ISNULL;.}../*.*
2ca0: 2a 20 53 77 61 70 20 74 77 6f 20 6f 62 6a 65 63  * Swap two objec
2cb0: 74 73 20 6f 66 20 74 79 70 65 20 54 59 50 45 2e  ts of type TYPE.
2cc0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 57 41 50  .*/.#define SWAP
2cd0: 28 54 59 50 45 2c 41 2c 42 29 20 7b 54 59 50 45  (TYPE,A,B) {TYPE
2ce0: 20 74 3d 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d   t=A; A=B; B=t;}
2cf0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20  ../*.** Commute 
2d00: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
2d10: 72 61 74 6f 72 2e 20 20 45 78 70 72 65 73 73 69  rator.  Expressi
2d20: 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ons of the form 
2d30: 22 58 20 6f 70 20 59 22 0a 2a 2a 20 61 72 65 20  "X op Y".** are 
2d40: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 22  converted into "
2d50: 59 20 6f 70 20 58 22 2e 0a 2a 2a 0a 2a 2a 20 49  Y op X"..**.** I
2d60: 66 20 6c 65 66 74 2f 72 69 67 68 74 20 70 72 65  f left/right pre
2d70: 63 65 64 65 6e 63 65 20 72 75 6c 65 73 20 63 6f  cedence rules co
2d80: 6d 65 20 69 6e 74 6f 20 70 6c 61 79 20 77 68 65  me into play whe
2d90: 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 74 68  n determining th
2da0: 65 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73  e.** collating s
2db0: 65 71 75 65 6e 63 65 2c 20 74 68 65 6e 20 43 4f  equence, then CO
2dc0: 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73 20  LLATE operators 
2dd0: 61 72 65 20 61 64 6a 75 73 74 65 64 20 74 6f 20  are adjusted to 
2de0: 65 6e 73 75 72 65 0a 2a 2a 20 74 68 61 74 20 74  ensure.** that t
2df0: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
2e00: 75 65 6e 63 65 20 64 6f 65 73 20 6e 6f 74 20 63  uence does not c
2e10: 68 61 6e 67 65 2e 20 20 46 6f 72 20 65 78 61 6d  hange.  For exam
2e20: 70 6c 65 3a 0a 2a 2a 20 22 59 20 63 6f 6c 6c 61  ple:.** "Y colla
2e30: 74 65 20 4e 4f 43 41 53 45 20 6f 70 20 58 22 20  te NOCASE op X" 
2e40: 62 65 63 6f 6d 65 73 20 22 58 20 6f 70 20 59 22  becomes "X op Y"
2e50: 20 62 65 63 61 75 73 65 20 61 6e 79 20 63 6f 6c   because any col
2e60: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
2e70: 6f 6e 0a 2a 2a 20 74 68 65 20 6c 65 66 74 20 68  on.** the left h
2e80: 61 6e 64 20 73 69 64 65 20 6f 66 20 61 20 63 6f  and side of a co
2e90: 6d 70 61 72 69 73 6f 6e 20 6f 76 65 72 72 69 64  mparison overrid
2ea0: 65 73 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e  es any collation
2eb0: 20 73 65 71 75 65 6e 63 65 20 0a 2a 2a 20 61 74   sequence .** at
2ec0: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 72 69  tached to the ri
2ed0: 67 68 74 2e 20 46 6f 72 20 74 68 65 20 73 61 6d  ght. For the sam
2ee0: 65 20 72 65 61 73 6f 6e 20 74 68 65 20 45 50 5f  e reason the EP_
2ef0: 43 6f 6c 6c 61 74 65 20 66 6c 61 67 0a 2a 2a 20  Collate flag.** 
2f00: 69 73 20 6e 6f 74 20 63 6f 6d 6d 75 74 65 64 2e  is not commuted.
2f10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2f20: 65 78 70 72 43 6f 6d 6d 75 74 65 28 50 61 72 73  exprCommute(Pars
2f30: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
2f40: 2a 70 45 78 70 72 29 7b 0a 20 20 75 31 36 20 65  *pExpr){.  u16 e
2f50: 78 70 52 69 67 68 74 20 3d 20 28 70 45 78 70 72  xpRight = (pExpr
2f60: 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20  ->pRight->flags 
2f70: 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20  & EP_Collate);. 
2f80: 20 75 31 36 20 65 78 70 4c 65 66 74 20 3d 20 28   u16 expLeft = (
2f90: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c  pExpr->pLeft->fl
2fa0: 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
2fb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c  );.  assert( all
2fc0: 6f 77 65 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70  owedOp(pExpr->op
2fd0: 29 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ) && pExpr->op!=
2fe0: 54 4b 5f 49 4e 20 29 3b 0a 20 20 69 66 28 20 65  TK_IN );.  if( e
2ff0: 78 70 52 69 67 68 74 3d 3d 65 78 70 4c 65 66 74  xpRight==expLeft
3000: 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65   ){.    /* Eithe
3010: 72 20 58 20 61 6e 64 20 59 20 62 6f 74 68 20 68  r X and Y both h
3020: 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  ave COLLATE oper
3030: 61 74 6f 72 20 6f 72 20 6e 65 69 74 68 65 72 20  ator or neither 
3040: 64 6f 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 78  do */.    if( ex
3050: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  pRight ){.      
3060: 2f 2a 20 42 6f 74 68 20 58 20 61 6e 64 20 59 20  /* Both X and Y 
3070: 68 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65  have COLLATE ope
3080: 72 61 74 6f 72 73 2e 20 20 4d 61 6b 65 20 73 75  rators.  Make su
3090: 72 65 20 58 20 69 73 20 61 6c 77 61 79 73 0a 20  re X is always. 
30a0: 20 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79 20       ** used by 
30b0: 63 6c 65 61 72 69 6e 67 20 74 68 65 20 45 50 5f  clearing the EP_
30c0: 43 6f 6c 6c 61 74 65 20 66 6c 61 67 20 66 72 6f  Collate flag fro
30d0: 6d 20 59 2e 20 2a 2f 0a 20 20 20 20 20 20 70 45  m Y. */.      pE
30e0: 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61  xpr->pRight->fla
30f0: 67 73 20 26 3d 20 7e 45 50 5f 43 6f 6c 6c 61 74  gs &= ~EP_Collat
3100: 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  e;.    }else if(
3110: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
3120: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
3130: 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a  r->pLeft)!=0 ){.
3140: 20 20 20 20 20 20 2f 2a 20 4e 65 69 74 68 65 72        /* Neither
3150: 20 58 20 6e 6f 72 20 59 20 68 61 76 65 20 43 4f   X nor Y have CO
3160: 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73 2c  LLATE operators,
3170: 20 62 75 74 20 58 20 68 61 73 20 61 20 6e 6f 6e   but X has a non
3180: 2d 64 65 66 61 75 6c 74 0a 20 20 20 20 20 20 2a  -default.      *
3190: 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * collating sequ
31a0: 65 6e 63 65 2e 20 20 53 6f 20 61 64 64 20 74 68  ence.  So add th
31b0: 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 6d 61 72  e EP_Collate mar
31c0: 6b 65 72 20 6f 6e 20 58 20 74 6f 20 63 61 75 73  ker on X to caus
31d0: 65 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 74 6f  e.      ** it to
31e0: 20 62 65 20 73 65 61 72 63 68 65 64 20 66 69 72   be searched fir
31f0: 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70 45 78  st. */.      pEx
3200: 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73  pr->pLeft->flags
3210: 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a   |= EP_Collate;.
3220: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 53 57 41 50      }.  }.  SWAP
3230: 28 45 78 70 72 2a 2c 70 45 78 70 72 2d 3e 70 52  (Expr*,pExpr->pR
3240: 69 67 68 74 2c 70 45 78 70 72 2d 3e 70 4c 65 66  ight,pExpr->pLef
3250: 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  t);.  if( pExpr-
3260: 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20 20  >op>=TK_GT ){.  
3270: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d    assert( TK_LT=
3280: 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20 20 20 20  =TK_GT+2 );.    
3290: 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54  assert( TK_GE==T
32a0: 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20 20 61 73  K_LE+2 );.    as
32b0: 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45  sert( TK_GT>TK_E
32c0: 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Q );.    assert(
32d0: 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a   TK_GT<TK_LE );.
32e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
32f0: 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 26 26 20  r->op>=TK_GT && 
3300: 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45  pExpr->op<=TK_GE
3310: 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f   );.    pExpr->o
3320: 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2d  p = ((pExpr->op-
3330: 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f 47 54 3b  TK_GT)^2)+TK_GT;
3340: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  .  }.}../*.** Tr
3350: 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20 54 4b 5f  anslate from TK_
3360: 78 78 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 57  xx operator to W
3370: 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f  O_xx bitmask..*/
3380: 0a 73 74 61 74 69 63 20 75 31 36 20 6f 70 65 72  .static u16 oper
3390: 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20 6f 70 29  atorMask(int op)
33a0: 7b 0a 20 20 75 31 36 20 63 3b 0a 20 20 61 73 73  {.  u16 c;.  ass
33b0: 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f  ert( allowedOp(o
33c0: 70 29 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  p) );.  if( op==
33d0: 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 63 20 3d  TK_IN ){.    c =
33e0: 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 20   WO_IN;.  }else 
33f0: 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  if( op==TK_ISNUL
3400: 4c 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f  L ){.    c = WO_
3410: 49 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b  ISNULL;.  }else{
3420: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 57 4f  .    assert( (WO
3430: 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29  _EQ<<(op-TK_EQ))
3440: 20 3c 20 30 78 37 66 66 66 20 29 3b 0a 20 20 20   < 0x7fff );.   
3450: 20 63 20 3d 20 28 75 31 36 29 28 57 4f 5f 45 51   c = (u16)(WO_EQ
3460: 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 3b 0a 20  <<(op-TK_EQ));. 
3470: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21   }.  assert( op!
3480: 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 63 3d  =TK_ISNULL || c=
3490: 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20  =WO_ISNULL );.  
34a0: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49  assert( op!=TK_I
34b0: 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e 20 29 3b  N || c==WO_IN );
34c0: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
34d0: 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f 5f 45 51  K_EQ || c==WO_EQ
34e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
34f0: 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d 3d 57 4f  !=TK_LT || c==WO
3500: 5f 4c 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _LT );.  assert(
3510: 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 63 3d   op!=TK_LE || c=
3520: 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 61 73 73 65  =WO_LE );.  asse
3530: 72 74 28 20 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c  rt( op!=TK_GT ||
3540: 20 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a 20 20 61   c==WO_GT );.  a
3550: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 45  ssert( op!=TK_GE
3560: 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20 29 3b 0a   || c==WO_GE );.
3570: 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f    return c;.}../
3580: 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 6f 20  *.** Advance to 
3590: 74 68 65 20 6e 65 78 74 20 57 68 65 72 65 54 65  the next WhereTe
35a0: 72 6d 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  rm that matches 
35b0: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
35c0: 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 65 73 74   criteria.** est
35d0: 61 62 6c 69 73 68 65 64 20 77 68 65 6e 20 74 68  ablished when th
35e0: 65 20 70 53 63 61 6e 20 6f 62 6a 65 63 74 20 77  e pScan object w
35f0: 61 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62  as initialized b
3600: 79 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28  y whereScanInit(
3610: 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c  )..** Return NUL
3620: 4c 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  L if there are n
3630: 6f 20 6d 6f 72 65 20 6d 61 74 63 68 69 6e 67 20  o more matching 
3640: 57 68 65 72 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73  WhereTerms..*/.s
3650: 74 61 74 69 63 20 57 68 65 72 65 54 65 72 6d 20  tatic WhereTerm 
3660: 2a 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 57  *whereScanNext(W
3670: 68 65 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 29  hereScan *pScan)
3680: 7b 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20  {.  int iCur;   
3690: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
36a0: 63 75 72 73 6f 72 20 6f 6e 20 74 68 65 20 4c 48  cursor on the LH
36b0: 53 20 6f 66 20 74 68 65 20 74 65 72 6d 20 2a 2f  S of the term */
36c0: 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20  .  int iColumn; 
36d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
36e0: 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 4c 48 53  olumn on the LHS
36f0: 20 6f 66 20 74 68 65 20 74 65 72 6d 2e 20 20 2d   of the term.  -
3700: 31 20 66 6f 72 20 49 50 4b 20 2a 2f 0a 20 20 45  1 for IPK */.  E
3710: 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20  xpr *pX;        
3720: 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73      /* An expres
3730: 73 69 6f 6e 20 62 65 69 6e 67 20 74 65 73 74 65  sion being teste
3740: 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  d */.  WhereClau
3750: 73 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 53  se *pWC;    /* S
3760: 68 6f 72 74 68 61 6e 64 20 66 6f 72 20 70 53 63  horthand for pSc
3770: 61 6e 2d 3e 70 57 43 20 2a 2f 0a 20 20 57 68 65  an->pWC */.  Whe
3780: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
3790: 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 62 65    /* The term be
37a0: 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a 20 20  ing tested */.  
37b0: 69 6e 74 20 6b 20 3d 20 70 53 63 61 6e 2d 3e 6b  int k = pScan->k
37c0: 3b 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f  ;    /* Where to
37d0: 20 73 74 61 72 74 20 73 63 61 6e 6e 69 6e 67 20   start scanning 
37e0: 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20 70 53 63  */..  while( pSc
37f0: 61 6e 2d 3e 69 45 71 75 69 76 3c 3d 70 53 63 61  an->iEquiv<=pSca
3800: 6e 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20 20  n->nEquiv ){.   
3810: 20 69 43 75 72 20 3d 20 70 53 63 61 6e 2d 3e 61   iCur = pScan->a
3820: 45 71 75 69 76 5b 70 53 63 61 6e 2d 3e 69 45 71  Equiv[pScan->iEq
3830: 75 69 76 2d 32 5d 3b 0a 20 20 20 20 69 43 6f 6c  uiv-2];.    iCol
3840: 75 6d 6e 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71  umn = pScan->aEq
3850: 75 69 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69  uiv[pScan->iEqui
3860: 76 2d 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  v-1];.    while(
3870: 20 28 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70   (pWC = pScan->p
3880: 57 43 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  WC)!=0 ){.      
3890: 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
38a0: 2b 6b 3b 20 6b 3c 70 57 43 2d 3e 6e 54 65 72 6d  +k; k<pWC->nTerm
38b0: 3b 20 6b 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; k++, pTerm++){
38c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65  .        if( pTe
38d0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
38e0: 69 43 75 72 0a 20 20 20 20 20 20 20 20 20 26 26  iCur.         &&
38f0: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
3900: 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20  lumn==iColumn.  
3910: 20 20 20 20 20 20 20 26 26 20 28 70 53 63 61 6e         && (pScan
3920: 2d 3e 69 45 71 75 69 76 3c 3d 32 20 7c 7c 20 21  ->iEquiv<=2 || !
3930: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
3940: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pTerm->pExpr, EP
3950: 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20 20  _FromJoin)).    
3960: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
3970: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
3980: 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49  erator & WO_EQUI
3990: 56 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  V)!=0.          
39a0: 20 26 26 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69   && pScan->nEqui
39b0: 76 3c 41 72 72 61 79 53 69 7a 65 28 70 53 63 61  v<ArraySize(pSca
39c0: 6e 2d 3e 61 45 71 75 69 76 29 0a 20 20 20 20 20  n->aEquiv).     
39d0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
39e0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
39f0: 20 20 20 20 20 20 20 70 58 20 3d 20 73 71 6c 69         pX = sqli
3a00: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
3a10: 74 65 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  te(pTerm->pExpr-
3a20: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
3a30: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58        assert( pX
3a40: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
3a50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
3a60: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d  or(j=0; j<pScan-
3a70: 3e 6e 45 71 75 69 76 3b 20 6a 2b 3d 32 29 7b 0a  >nEquiv; j+=2){.
3a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
3a90: 28 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b  ( pScan->aEquiv[
3aa0: 6a 5d 3d 3d 70 58 2d 3e 69 54 61 62 6c 65 0a 20  j]==pX->iTable. 
3ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
3ac0: 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a   pScan->aEquiv[j
3ad0: 2b 31 5d 3d 3d 70 58 2d 3e 69 43 6f 6c 75 6d 6e  +1]==pX->iColumn
3ae0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3af0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3b00: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
3b10: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3b20: 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 53         if( j==pS
3b30: 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20  can->nEquiv ){. 
3b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63               pSc
3b50: 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d 20 3d 20  an->aEquiv[j] = 
3b60: 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pX->iTable;.    
3b70: 20 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d            pScan-
3b80: 3e 61 45 71 75 69 76 5b 6a 2b 31 5d 20 3d 20 70  >aEquiv[j+1] = p
3b90: 58 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  X->iColumn;.    
3ba0: 20 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d            pScan-
3bb0: 3e 6e 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20  >nEquiv += 2;.  
3bc0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3bd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3be0: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
3bf0: 70 65 72 61 74 6f 72 20 26 20 70 53 63 61 6e 2d  perator & pScan-
3c00: 3e 6f 70 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20  >opMask)!=0 ){. 
3c10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65             /* Ve
3c20: 72 69 66 79 20 74 68 65 20 61 66 66 69 6e 69 74  rify the affinit
3c30: 79 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20  y and collating 
3c40: 73 65 71 75 65 6e 63 65 20 6d 61 74 63 68 20 2a  sequence match *
3c50: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
3c60: 28 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61  ( pScan->zCollNa
3c70: 6d 65 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f  me && (pTerm->eO
3c80: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
3c90: 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ULL)==0 ){.     
3ca0: 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71           CollSeq
3cb0: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20   *pColl;.       
3cc0: 20 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 50         Parse *pP
3cd0: 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 57 49 6e  arse = pWC->pWIn
3ce0: 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  fo->pParse;.    
3cf0: 20 20 20 20 20 20 20 20 20 20 70 58 20 3d 20 70            pX = p
3d00: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
3d10: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
3d20: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
3d30: 6e 69 74 79 4f 6b 28 70 58 2c 20 70 53 63 61 6e  nityOk(pX, pScan
3d40: 2d 3e 69 64 78 61 66 66 29 20 29 7b 0a 20 20 20  ->idxaff) ){.   
3d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
3d60: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
3d70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3d80: 20 20 20 20 20 61 73 73 65 72 74 28 70 58 2d 3e       assert(pX->
3d90: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20  pLeft);.        
3da0: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
3db0: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
3dc0: 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
3dd0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e00: 20 20 20 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70      pX->pLeft, p
3e10: 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  X->pRight);.    
3e20: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
3e30: 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d  oll==0 ) pColl =
3e40: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
3e50: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
3e60: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
3e70: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
3e80: 7a 4e 61 6d 65 2c 20 70 53 63 61 6e 2d 3e 7a 43  zName, pScan->zC
3e90: 6f 6c 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  ollName) ){.    
3ea0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
3eb0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
3ec0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
3ed0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
3ee0: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
3ef0: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 21 3d  rator & WO_EQ)!=
3f00: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  0.             &
3f10: 26 20 28 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70  & (pX = pTerm->p
3f20: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f  Expr->pRight)->o
3f30: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20  p==TK_COLUMN.   
3f40: 20 20 20 20 20 20 20 20 20 20 26 26 20 70 58 2d            && pX-
3f50: 3e 69 54 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e  >iTable==pScan->
3f60: 61 45 71 75 69 76 5b 30 5d 0a 20 20 20 20 20 20  aEquiv[0].      
3f70: 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e 69 43         && pX->iC
3f80: 6f 6c 75 6d 6e 3d 3d 70 53 63 61 6e 2d 3e 61 45  olumn==pScan->aE
3f90: 71 75 69 76 5b 31 5d 0a 20 20 20 20 20 20 20 20  quiv[1].        
3fa0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
3fb0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
3fc0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
3fd0: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
3fe0: 6b 20 3d 20 6b 2b 31 3b 0a 20 20 20 20 20 20 20  k = k+1;.       
3ff0: 20 20 20 20 20 72 65 74 75 72 6e 20 70 54 65 72       return pTer
4000: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  m;.          }. 
4010: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4020: 0a 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 70 57  .      pScan->pW
4030: 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43 2d 3e  C = pScan->pWC->
4040: 70 4f 75 74 65 72 3b 0a 20 20 20 20 20 20 6b 20  pOuter;.      k 
4050: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
4060: 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61  Scan->pWC = pSca
4070: 6e 2d 3e 70 4f 72 69 67 57 43 3b 0a 20 20 20 20  n->pOrigWC;.    
4080: 6b 20 3d 20 30 3b 0a 20 20 20 20 70 53 63 61 6e  k = 0;.    pScan
4090: 2d 3e 69 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20  ->iEquiv += 2;. 
40a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
40b0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
40c0: 7a 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  ze a WHERE claus
40d0: 65 20 73 63 61 6e 6e 65 72 20 6f 62 6a 65 63 74  e scanner object
40e0: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
40f0: 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69  ter to the.** fi
4100: 72 73 74 20 6d 61 74 63 68 2e 20 20 52 65 74 75  rst match.  Retu
4110: 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65  rn NULL if there
4120: 20 61 72 65 20 6e 6f 20 6d 61 74 63 68 65 73 2e   are no matches.
4130: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6e 6e  .**.** The scann
4140: 65 72 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63  er will be searc
4150: 68 69 6e 67 20 74 68 65 20 57 48 45 52 45 20 63  hing the WHERE c
4160: 6c 61 75 73 65 20 70 57 43 2e 20 20 49 74 20 77  lause pWC.  It w
4170: 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72 20  ill look.** for 
4180: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72  terms of the for
4190: 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  m "X <op> <expr>
41a0: 22 20 77 68 65 72 65 20 58 20 69 73 20 63 6f 6c  " where X is col
41b0: 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74  umn iColumn of t
41c0: 61 62 6c 65 0a 2a 2a 20 69 43 75 72 2e 20 20 54  able.** iCur.  T
41d0: 68 65 20 3c 6f 70 3e 20 6d 75 73 74 20 62 65 20  he <op> must be 
41e0: 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61  one of the opera
41f0: 74 6f 72 73 20 64 65 73 63 72 69 62 65 64 20 62  tors described b
4200: 79 20 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20  y opMask..**.** 
4210: 49 66 20 74 68 65 20 73 65 61 72 63 68 20 69 73  If the search is
4220: 20 66 6f 72 20 58 20 61 6e 64 20 74 68 65 20 57   for X and the W
4230: 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74  HERE clause cont
4240: 61 69 6e 73 20 74 65 72 6d 73 20 6f 66 20 74 68  ains terms of th
4250: 65 0a 2a 2a 20 66 6f 72 6d 20 58 3d 59 20 74 68  e.** form X=Y th
4260: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
4270: 6d 69 67 68 74 20 61 6c 73 6f 20 72 65 74 75 72  might also retur
4280: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  n terms of the f
4290: 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 3c  orm.** "Y <op> <
42a0: 65 78 70 72 3e 22 2e 20 20 54 68 65 20 6e 75 6d  expr>".  The num
42b0: 62 65 72 20 6f 66 20 6c 65 76 65 6c 73 20 6f 66  ber of levels of
42c0: 20 74 72 61 6e 73 69 74 69 76 69 74 79 20 69 73   transitivity is
42d0: 20 6c 69 6d 69 74 65 64 2c 0a 2a 2a 20 62 75 74   limited,.** but
42e0: 20 69 73 20 65 6e 6f 75 67 68 20 74 6f 20 68 61   is enough to ha
42f0: 6e 64 6c 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e  ndle most common
4300: 6c 79 20 6f 63 63 75 72 72 69 6e 67 20 53 51 4c  ly occurring SQL
4310: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a   statements..**.
4320: 2a 2a 20 49 66 20 58 20 69 73 20 6e 6f 74 20 74  ** If X is not t
4330: 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  he INTEGER PRIMA
4340: 52 59 20 4b 45 59 20 74 68 65 6e 20 58 20 6d 75  RY KEY then X mu
4350: 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  st be compatible
4360: 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20 70   with.** index p
4370: 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57  Idx..*/.static W
4380: 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53  hereTerm *whereS
4390: 63 61 6e 49 6e 69 74 28 0a 20 20 57 68 65 72 65  canInit(.  Where
43a0: 53 63 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20  Scan *pScan,    
43b0: 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 53     /* The WhereS
43c0: 63 61 6e 20 6f 62 6a 65 63 74 20 62 65 69 6e 67  can object being
43d0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a   initialized */.
43e0: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
43f0: 57 43 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  WC,       /* The
4400: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
4410: 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20   be scanned */. 
4420: 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20   int iCur,      
4430: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
4440: 6f 72 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a  or to scan for *
4450: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c  /.  int iColumn,
4460: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4470: 6f 6c 75 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f  olumn to scan fo
4480: 72 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73  r */.  u32 opMas
4490: 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k,             /
44a0: 2a 20 4f 70 65 72 61 74 6f 72 28 73 29 20 74 6f  * Operator(s) to
44b0: 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49   scan for */.  I
44c0: 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20  ndex *pIdx      
44d0: 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62         /* Must b
44e0: 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  e compatible wit
44f0: 68 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a  h this index */.
4500: 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f  ){.  int j;..  /
4510: 2a 20 6d 65 6d 73 65 74 28 70 53 63 61 6e 2c 20  * memset(pScan, 
4520: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53 63 61 6e  0, sizeof(*pScan
4530: 29 29 3b 20 2a 2f 0a 20 20 70 53 63 61 6e 2d 3e  )); */.  pScan->
4540: 70 4f 72 69 67 57 43 20 3d 20 70 57 43 3b 0a 20  pOrigWC = pWC;. 
4550: 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 57   pScan->pWC = pW
4560: 43 3b 0a 20 20 69 66 28 20 70 49 64 78 20 26 26  C;.  if( pIdx &&
4570: 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20   iColumn>=0 ){. 
4580: 20 20 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66     pScan->idxaff
4590: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
45a0: 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61  >aCol[iColumn].a
45b0: 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 66 6f 72  ffinity;.    for
45c0: 28 6a 3d 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f  (j=0; pIdx->aiCo
45d0: 6c 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e  lumn[j]!=iColumn
45e0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
45f0: 28 20 4e 45 56 45 52 28 6a 3e 3d 70 49 64 78 2d  ( NEVER(j>=pIdx-
4600: 3e 6e 4b 65 79 43 6f 6c 29 20 29 20 72 65 74 75  >nKeyCol) ) retu
4610: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
4620: 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65  pScan->zCollName
4630: 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b   = pIdx->azColl[
4640: 6a 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  j];.  }else{.   
4650: 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d   pScan->idxaff =
4660: 20 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a   0;.    pScan->z
4670: 43 6f 6c 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  CollName = 0;.  
4680: 7d 0a 20 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73  }.  pScan->opMas
4690: 6b 20 3d 20 6f 70 4d 61 73 6b 3b 0a 20 20 70 53  k = opMask;.  pS
46a0: 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70 53  can->k = 0;.  pS
46b0: 63 61 6e 2d 3e 61 45 71 75 69 76 5b 30 5d 20 3d  can->aEquiv[0] =
46c0: 20 69 43 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e   iCur;.  pScan->
46d0: 61 45 71 75 69 76 5b 31 5d 20 3d 20 69 43 6f 6c  aEquiv[1] = iCol
46e0: 75 6d 6e 3b 0a 20 20 70 53 63 61 6e 2d 3e 6e 45  umn;.  pScan->nE
46f0: 71 75 69 76 20 3d 20 32 3b 0a 20 20 70 53 63 61  quiv = 2;.  pSca
4700: 6e 2d 3e 69 45 71 75 69 76 20 3d 20 32 3b 0a 20  n->iEquiv = 2;. 
4710: 20 72 65 74 75 72 6e 20 77 68 65 72 65 53 63 61   return whereSca
4720: 6e 4e 65 78 74 28 70 53 63 61 6e 29 3b 0a 7d 0a  nNext(pScan);.}.
4730: 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f  ./*.** Search fo
4740: 72 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20  r a term in the 
4750: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
4760: 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
4770: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
4780: 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61  .** where X is a
4790: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
47a0: 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  e iColumn of tab
47b0: 6c 65 20 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e  le iCur and <op>
47c0: 20 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68   is one of.** th
47d0: 65 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72  e WO_xx operator
47e0: 20 63 6f 64 65 73 20 73 70 65 63 69 66 69 65 64   codes specified
47f0: 20 62 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d   by the op param
4800: 65 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  eter..** Return 
4810: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
4820: 20 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30   term.  Return 0
4830: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
4840: 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 72 65  *.** The term re
4850: 74 75 72 6e 65 64 20 6d 69 67 68 74 20 62 79 20  turned might by 
4860: 59 3d 3c 65 78 70 72 3e 20 69 66 20 74 68 65 72  Y=<expr> if ther
4870: 65 20 69 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e  e is another con
4880: 73 74 72 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68  straint in.** th
4890: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
48a0: 68 61 74 20 73 70 65 63 69 66 69 65 73 20 74 68  hat specifies th
48b0: 61 74 20 58 3d 59 2e 20 20 41 6e 79 20 73 75 63  at X=Y.  Any suc
48c0: 68 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69  h constraints wi
48d0: 6c 6c 20 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66  ll be.** identif
48e0: 69 65 64 20 62 79 20 74 68 65 20 57 4f 5f 45 51  ied by the WO_EQ
48f0: 55 49 56 20 62 69 74 20 69 6e 20 74 68 65 20 70  UIV bit in the p
4900: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
4910: 66 69 65 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61  field.  The.** a
4920: 45 71 75 69 76 5b 5d 20 61 72 72 61 79 20 68 6f  Equiv[] array ho
4930: 6c 64 73 20 58 20 61 6e 64 20 61 6c 6c 20 69 74  lds X and all it
4940: 73 20 65 71 75 69 76 61 6c 65 6e 74 73 2c 20 77  s equivalents, w
4950: 69 74 68 20 65 61 63 68 20 53 51 4c 20 76 61 72  ith each SQL var
4960: 69 61 62 6c 65 0a 2a 2a 20 74 61 6b 69 6e 67 20  iable.** taking 
4970: 75 70 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20  up two slots in 
4980: 61 45 71 75 69 76 5b 5d 2e 20 20 54 68 65 20 66  aEquiv[].  The f
4990: 69 72 73 74 20 73 6c 6f 74 20 69 73 20 66 6f 72  irst slot is for
49a0: 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
49b0: 65 72 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65  er.** and the se
49c0: 63 6f 6e 64 20 69 73 20 66 6f 72 20 74 68 65 20  cond is for the 
49d0: 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 20 20  column number.  
49e0: 54 68 65 72 65 20 61 72 65 20 32 32 20 73 6c 6f  There are 22 slo
49f0: 74 73 20 69 6e 20 61 45 71 75 69 76 5b 5d 0a 2a  ts in aEquiv[].*
4a00: 2a 20 73 6f 20 74 68 61 74 20 6d 65 61 6e 73 20  * so that means 
4a10: 77 65 20 63 61 6e 20 6c 6f 6f 6b 20 66 6f 72 20  we can look for 
4a20: 58 20 70 6c 75 73 20 75 70 20 74 6f 20 31 30 20  X plus up to 10 
4a30: 6f 74 68 65 72 20 65 71 75 69 76 61 6c 65 6e 74  other equivalent
4a40: 20 76 61 6c 75 65 73 2e 0a 2a 2a 20 48 65 6e 63   values..** Henc
4a50: 65 20 61 20 73 65 61 72 63 68 20 66 6f 72 20 58  e a search for X
4a60: 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 3c 65 78   will return <ex
4a70: 70 72 3e 20 69 66 20 58 3d 41 31 20 61 6e 64 20  pr> if X=A1 and 
4a80: 41 31 3d 41 32 20 61 6e 64 20 41 32 3d 41 33 0a  A1=A2 and A2=A3.
4a90: 2a 2a 20 61 6e 64 20 2e 2e 2e 20 61 6e 64 20 41  ** and ... and A
4aa0: 39 3d 41 31 30 20 61 6e 64 20 41 31 30 3d 3c 65  9=A10 and A10=<e
4ab0: 78 70 72 3e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  xpr>..**.** If t
4ac0: 68 65 72 65 20 61 72 65 20 6d 75 6c 74 69 70 6c  here are multipl
4ad0: 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57  e terms in the W
4ae0: 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74  HERE clause of t
4af0: 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20  he form "X <op> 
4b00: 3c 65 78 70 72 3e 22 0a 2a 2a 20 74 68 65 6e 20  <expr>".** then 
4b10: 74 72 79 20 66 6f 72 20 74 68 65 20 6f 6e 65 20  try for the one 
4b20: 77 69 74 68 20 6e 6f 20 64 65 70 65 6e 64 65 6e  with no dependen
4b30: 63 69 65 73 20 6f 6e 20 3c 65 78 70 72 3e 20 2d  cies on <expr> -
4b40: 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20   in other words 
4b50: 77 68 65 72 65 0a 2a 2a 20 3c 65 78 70 72 3e 20  where.** <expr> 
4b60: 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78  is a constant ex
4b70: 70 72 65 73 73 69 6f 6e 20 6f 66 20 73 6f 6d 65  pression of some
4b80: 20 6b 69 6e 64 2e 20 20 4f 6e 6c 79 20 72 65 74   kind.  Only ret
4b90: 75 72 6e 20 65 6e 74 72 69 65 73 20 6f 66 0a 2a  urn entries of.*
4ba0: 2a 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f  * the form "X <o
4bb0: 70 3e 20 59 22 20 77 68 65 72 65 20 59 20 69 73  p> Y" where Y is
4bc0: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e 6f   a column in ano
4bd0: 74 68 65 72 20 74 61 62 6c 65 20 69 66 20 6e 6f  ther table if no
4be0: 20 74 65 72 6d 73 20 6f 66 0a 2a 2a 20 74 68 65   terms of.** the
4bf0: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 63   form "X <op> <c
4c00: 6f 6e 73 74 2d 65 78 70 72 3e 22 20 65 78 69 73  onst-expr>" exis
4c10: 74 2e 20 20 20 49 66 20 6e 6f 20 74 65 72 6d 73  t.   If no terms
4c20: 20 77 69 74 68 20 61 20 63 6f 6e 73 74 61 6e 74   with a constant
4c30: 20 52 48 53 0a 2a 2a 20 65 78 69 73 74 2c 20 74   RHS.** exist, t
4c40: 72 79 20 74 6f 20 72 65 74 75 72 6e 20 61 20 74  ry to return a t
4c50: 65 72 6d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  erm that does no
4c60: 74 20 75 73 65 20 57 4f 5f 45 51 55 49 56 2e 0a  t use WO_EQUIV..
4c70: 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54  */.static WhereT
4c80: 65 72 6d 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20  erm *findTerm(. 
4c90: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
4ca0: 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48  C,     /* The WH
4cb0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
4cc0: 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69   searched */.  i
4cd0: 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20  nt iCur,        
4ce0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
4cf0: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
4d00: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
4d10: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
4d20: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20  n number of LHS 
4d30: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
4d40: 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48  Ready,     /* RH
4d50: 53 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c  S must not overl
4d60: 61 70 20 77 69 74 68 20 74 68 69 73 20 6d 61 73  ap with this mas
4d70: 6b 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20  k */.  u32 op,  
4d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4d90: 4d 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61  Mask of WO_xx va
4da0: 6c 75 65 73 20 64 65 73 63 72 69 62 69 6e 67 20  lues describing 
4db0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e  operator */.  In
4dc0: 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
4dd0: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63      /* Must be c
4de0: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
4df0: 68 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f  his index, if no
4e00: 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57  t NULL */.){.  W
4e10: 68 65 72 65 54 65 72 6d 20 2a 70 52 65 73 75 6c  hereTerm *pResul
4e20: 74 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 54 65  t = 0;.  WhereTe
4e30: 72 6d 20 2a 70 3b 0a 20 20 57 68 65 72 65 53 63  rm *p;.  WhereSc
4e40: 61 6e 20 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20  an scan;..  p = 
4e50: 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73  whereScanInit(&s
4e60: 63 61 6e 2c 20 70 57 43 2c 20 69 43 75 72 2c 20  can, pWC, iCur, 
4e70: 69 43 6f 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64  iColumn, op, pId
4e80: 78 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  x);.  while( p )
4e90: 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72  {.    if( (p->pr
4ea0: 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52  ereqRight & notR
4eb0: 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20  eady)==0 ){.    
4ec0: 20 20 69 66 28 20 70 2d 3e 70 72 65 72 65 71 52    if( p->prereqR
4ed0: 69 67 68 74 3d 3d 30 20 26 26 20 28 70 2d 3e 65  ight==0 && (p->e
4ee0: 4f 70 65 72 61 74 6f 72 26 57 4f 5f 45 51 29 21  Operator&WO_EQ)!
4ef0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
4f00: 74 75 72 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a  turn p;.      }.
4f10: 20 20 20 20 20 20 69 66 28 20 70 52 65 73 75 6c        if( pResul
4f20: 74 3d 3d 30 20 29 20 70 52 65 73 75 6c 74 20 3d  t==0 ) pResult =
4f30: 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20   p;.    }.    p 
4f40: 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28  = whereScanNext(
4f50: 26 73 63 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 65  &scan);.  }.  re
4f60: 74 75 72 6e 20 70 52 65 73 75 6c 74 3b 0a 7d 0a  turn pResult;.}.
4f70: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
4f80: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
4f90: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
4fa0: 28 53 72 63 4c 69 73 74 2a 2c 20 57 68 65 72 65  (SrcList*, Where
4fb0: 43 6c 61 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a  Clause*, int);..
4fc0: 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41  /*.** Call exprA
4fd0: 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65  nalyze on all te
4fe0: 72 6d 73 20 69 6e 20 61 20 57 48 45 52 45 20 63  rms in a WHERE c
4ff0: 6c 61 75 73 65 2e 20 20 0a 2a 2f 0a 73 74 61 74  lause.  .*/.stat
5000: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
5010: 79 7a 65 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73  yzeAll(.  SrcLis
5020: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
5030: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
5040: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
5050: 43 6c 61 75 73 65 20 2a 70 57 43 20 20 20 20 20  Clause *pWC     
5060: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45      /* the WHERE
5070: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 61 6e   clause to be an
5080: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69  alyzed */.){.  i
5090: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57  nt i;.  for(i=pW
50a0: 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30  C->nTerm-1; i>=0
50b0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72  ; i--){.    expr
50c0: 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74  Analyze(pTabList
50d0: 2c 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d  , pWC, i);.  }.}
50e0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
50f0: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
5100: 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68  IZATION./*.** Ch
5110: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
5120: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
5130: 6f 6e 20 69 73 20 61 20 4c 49 4b 45 20 6f 72 20  on is a LIKE or 
5140: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 74 68  GLOB operator th
5150: 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74  at.** can be opt
5160: 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 69 6e 65  imized using ine
5170: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
5180: 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55  nts.  Return TRU
5190: 45 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f  E if it is.** so
51a0: 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f   and false if no
51b0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65  t..**.** In orde
51c0: 72 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74  r for the operat
51d0: 6f 72 20 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a  or to be optimiz
51e0: 69 62 6c 65 2c 20 74 68 65 20 52 48 53 20 6d 75  ible, the RHS mu
51f0: 73 74 20 62 65 20 61 20 73 74 72 69 6e 67 0a 2a  st be a string.*
5200: 2a 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 64  * literal that d
5210: 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69  oes not begin wi
5220: 74 68 20 61 20 77 69 6c 64 63 61 72 64 2e 20 20  th a wildcard.  
5230: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
5240: 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50  sLikeOrGlob(.  P
5250: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
5260: 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
5270: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
5280: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
5290: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f  r *pExpr,      /
52a0: 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72  * Test this expr
52b0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ession */.  Expr
52c0: 20 2a 2a 70 70 50 72 65 66 69 78 2c 20 20 2f 2a   **ppPrefix,  /*
52d0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53   Pointer to TK_S
52e0: 54 52 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e  TRING expression
52f0: 20 77 69 74 68 20 70 61 74 74 65 72 6e 20 70 72   with pattern pr
5300: 65 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  efix */.  int *p
5310: 69 73 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54  isComplete, /* T
5320: 72 75 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20  rue if the only 
5330: 77 69 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e  wildcard is % in
5340: 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63   the last charac
5350: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ter */.  int *pn
5360: 6f 43 61 73 65 20 20 20 20 20 20 2f 2a 20 54 72  oCase      /* Tr
5370: 75 65 20 69 66 20 75 70 70 65 72 63 61 73 65 20  ue if uppercase 
5380: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
5390: 20 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b   lowercase */.){
53a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
53b0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
53c0: 20 53 74 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f   String on RHS o
53d0: 66 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20  f LIKE operator 
53e0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  */.  Expr *pRigh
53f0: 74 2c 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  t, *pLeft;      
5400: 2f 2a 20 52 69 67 68 74 20 61 6e 64 20 6c 65 66  /* Right and lef
5410: 74 20 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f  t size of LIKE o
5420: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70  perator */.  Exp
5430: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20  rList *pList;   
5440: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
5450: 6f 66 20 6f 70 65 72 61 6e 64 73 20 74 6f 20 74  of operands to t
5460: 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  he LIKE operator
5470: 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20   */.  int c;    
5480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5490: 20 2f 2a 20 4f 6e 65 20 63 68 61 72 61 63 74 65   /* One characte
54a0: 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e  r in z[] */.  in
54b0: 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20  t cnt;          
54c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
54d0: 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61  er of non-wildca
54e0: 72 64 20 70 72 65 66 69 78 20 63 68 61 72 61 63  rd prefix charac
54f0: 74 65 72 73 20 2a 2f 0a 20 20 63 68 61 72 20 77  ters */.  char w
5500: 63 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20  c[3];           
5510: 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64       /* Wildcard
5520: 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20   characters */. 
5530: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
5540: 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44  Parse->db;  /* D
5550: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
5560: 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  on */.  sqlite3_
5570: 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b  value *pVal = 0;
5580: 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
5590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
55a0: 20 4f 70 63 6f 64 65 20 6f 66 20 70 52 69 67 68   Opcode of pRigh
55b0: 74 20 2a 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c  t */..  if( !sql
55c0: 69 74 65 33 49 73 4c 69 6b 65 46 75 6e 63 74 69  ite3IsLikeFuncti
55d0: 6f 6e 28 64 62 2c 20 70 45 78 70 72 2c 20 70 6e  on(db, pExpr, pn
55e0: 6f 43 61 73 65 2c 20 77 63 29 20 29 7b 0a 20 20  oCase, wc) ){.  
55f0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
5600: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 42  #ifdef SQLITE_EB
5610: 43 44 49 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43  CDIC.  if( *pnoC
5620: 61 73 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ase ) return 0;.
5630: 23 65 6e 64 69 66 0a 20 20 70 4c 69 73 74 20 3d  #endif.  pList =
5640: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
5650: 0a 20 20 70 4c 65 66 74 20 3d 20 70 4c 69 73 74  .  pLeft = pList
5660: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
5670: 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54  if( pLeft->op!=T
5680: 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20 7c 7c 20  K_COLUMN .   || 
5690: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
56a0: 69 74 79 28 70 4c 65 66 74 29 21 3d 53 51 4c 49  ity(pLeft)!=SQLI
56b0: 54 45 5f 41 46 46 5f 54 45 58 54 20 0a 20 20 20  TE_AFF_TEXT .   
56c0: 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 4c 65  || IsVirtual(pLe
56d0: 66 74 2d 3e 70 54 61 62 29 0a 20 20 29 7b 0a 20  ft->pTab).  ){. 
56e0: 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 32 30     /* IMP: R-020
56f0: 36 35 2d 34 39 34 36 35 20 54 68 65 20 6c 65 66  65-49465 The lef
5700: 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
5710: 68 65 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20  he LIKE or GLOB 
5720: 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 0a 20 20  operator must.  
5730: 20 20 2a 2a 20 62 65 20 74 68 65 20 6e 61 6d 65    ** be the name
5740: 20 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63   of an indexed c
5750: 6f 6c 75 6d 6e 20 77 69 74 68 20 54 45 58 54 20  olumn with TEXT 
5760: 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20  affinity. */.   
5770: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
5780: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e   assert( pLeft->
5790: 69 43 6f 6c 75 6d 6e 21 3d 28 2d 31 29 20 29 3b  iColumn!=(-1) );
57a0: 20 2f 2a 20 42 65 63 61 75 73 65 20 49 50 4b 20   /* Because IPK 
57b0: 6e 65 76 65 72 20 68 61 73 20 41 46 46 5f 54 45  never has AFF_TE
57c0: 58 54 20 2a 2f 0a 0a 20 20 70 52 69 67 68 74 20  XT */..  pRight 
57d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
57e0: 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e  pCollate(pList->
57f0: 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 6f  a[0].pExpr);.  o
5800: 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70 3b 0a  p = pRight->op;.
5810: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52    if( op==TK_VAR
5820: 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 56 64 62  IABLE ){.    Vdb
5830: 65 20 2a 70 52 65 70 72 65 70 61 72 65 20 3d 20  e *pReprepare = 
5840: 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61  pParse->pReprepa
5850: 72 65 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c  re;.    int iCol
5860: 20 3d 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75   = pRight->iColu
5870: 6d 6e 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 73  mn;.    pVal = s
5880: 71 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75  qlite3VdbeGetBou
5890: 6e 64 56 61 6c 75 65 28 70 52 65 70 72 65 70 61  ndValue(pReprepa
58a0: 72 65 2c 20 69 43 6f 6c 2c 20 53 51 4c 49 54 45  re, iCol, SQLITE
58b0: 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20  _AFF_NONE);.    
58c0: 69 66 28 20 70 56 61 6c 20 26 26 20 73 71 6c 69  if( pVal && sqli
58d0: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70  te3_value_type(p
58e0: 56 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 54 45 58  Val)==SQLITE_TEX
58f0: 54 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 28  T ){.      z = (
5900: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76  char *)sqlite3_v
5910: 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 3b  alue_text(pVal);
5920: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5930: 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b  e3VdbeSetVarmask
5940: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
5950: 69 43 6f 6c 29 3b 0a 20 20 20 20 61 73 73 65 72  iCol);.    asser
5960: 74 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  t( pRight->op==T
5970: 4b 5f 56 41 52 49 41 42 4c 45 20 7c 7c 20 70 52  K_VARIABLE || pR
5980: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47  ight->op==TK_REG
5990: 49 53 54 45 52 20 29 3b 0a 20 20 7d 65 6c 73 65  ISTER );.  }else
59a0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 54 52 49   if( op==TK_STRI
59b0: 4e 47 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 52  NG ){.    z = pR
59c0: 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  ight->u.zToken;.
59d0: 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20    }.  if( z ){. 
59e0: 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20     cnt = 0;.    
59f0: 77 68 69 6c 65 28 20 28 63 3d 7a 5b 63 6e 74 5d  while( (c=z[cnt]
5a00: 29 21 3d 30 20 26 26 20 63 21 3d 77 63 5b 30 5d  )!=0 && c!=wc[0]
5a10: 20 26 26 20 63 21 3d 77 63 5b 31 5d 20 26 26 20   && c!=wc[1] && 
5a20: 63 21 3d 77 63 5b 32 5d 20 29 7b 0a 20 20 20 20  c!=wc[2] ){.    
5a30: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20    cnt++;.    }. 
5a40: 20 20 20 69 66 28 20 63 6e 74 21 3d 30 20 26 26     if( cnt!=0 &&
5a50: 20 32 35 35 21 3d 28 75 38 29 7a 5b 63 6e 74 2d   255!=(u8)z[cnt-
5a60: 31 5d 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  1] ){.      Expr
5a70: 20 2a 70 50 72 65 66 69 78 3b 0a 20 20 20 20 20   *pPrefix;.     
5a80: 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20   *pisComplete = 
5a90: 63 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63 6e  c==wc[0] && z[cn
5aa0: 74 2b 31 5d 3d 3d 30 3b 0a 20 20 20 20 20 20 70  t+1]==0;.      p
5ab0: 50 72 65 66 69 78 20 3d 20 73 71 6c 69 74 65 33  Prefix = sqlite3
5ac0: 45 78 70 72 28 64 62 2c 20 54 4b 5f 53 54 52 49  Expr(db, TK_STRI
5ad0: 4e 47 2c 20 7a 29 3b 0a 20 20 20 20 20 20 69 66  NG, z);.      if
5ae0: 28 20 70 50 72 65 66 69 78 20 29 20 70 50 72 65  ( pPrefix ) pPre
5af0: 66 69 78 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 63 6e  fix->u.zToken[cn
5b00: 74 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a 70  t] = 0;.      *p
5b10: 70 50 72 65 66 69 78 20 3d 20 70 50 72 65 66 69  pPrefix = pPrefi
5b20: 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d  x;.      if( op=
5b30: 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a  =TK_VARIABLE ){.
5b40: 20 20 20 20 20 20 20 20 56 64 62 65 20 2a 76 20          Vdbe *v 
5b50: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
5b60: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5b70: 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 76  VdbeSetVarmask(v
5b80: 2c 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d  , pRight->iColum
5b90: 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  n);.        if( 
5ba0: 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 26 26 20  *pisComplete && 
5bb0: 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e  pRight->u.zToken
5bc0: 5b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  [1] ){.         
5bd0: 20 2f 2a 20 49 66 20 74 68 65 20 72 68 73 20 6f   /* If the rhs o
5be0: 66 20 74 68 65 20 4c 49 4b 45 20 65 78 70 72 65  f the LIKE expre
5bf0: 73 73 69 6f 6e 20 69 73 20 61 20 76 61 72 69 61  ssion is a varia
5c00: 62 6c 65 2c 20 61 6e 64 20 74 68 65 20 63 75 72  ble, and the cur
5c10: 72 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a  rent.          *
5c20: 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 76  * value of the v
5c30: 61 72 69 61 62 6c 65 20 6d 65 61 6e 73 20 74 68  ariable means th
5c40: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
5c50: 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 4c 49 4b  o invoke the LIK
5c60: 45 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  E.          ** f
5c70: 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6e 6f  unction, then no
5c80: 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 77 69 6c   OP_Variable wil
5c90: 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  l be added to th
5ca0: 65 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20 20  e program..     
5cb0: 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61 75       ** This cau
5cc0: 73 65 73 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72  ses problems for
5cd0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e   the sqlite3_bin
5ce0: 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65  d_parameter_name
5cf0: 28 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ().          ** 
5d00: 41 50 49 2e 20 54 6f 20 77 6f 72 6b 61 72 6f 75  API. To workarou
5d10: 6e 64 20 74 68 65 6d 2c 20 61 64 64 20 61 20 64  nd them, add a d
5d20: 75 6d 6d 79 20 4f 50 5f 56 61 72 69 61 62 6c 65  ummy OP_Variable
5d30: 20 68 65 72 65 2e 0a 20 20 20 20 20 20 20 20 20   here..         
5d40: 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 69   */ .          i
5d50: 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
5d60: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
5d70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
5d80: 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
5d90: 65 74 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  et(pParse, pRigh
5da0: 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  t, r1);.        
5db0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
5dc0: 6e 67 65 50 33 28 76 2c 20 73 71 6c 69 74 65 33  ngeP3(v, sqlite3
5dd0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
5de0: 76 29 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  v)-1, 0);.      
5df0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
5e00: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
5e10: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  , r1);.        }
5e20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
5e30: 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 30 3b  se{.      z = 0;
5e40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
5e50: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
5e60: 56 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  Val);.  return (
5e70: 7a 21 3d 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  z!=0);.}.#endif 
5e80: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  /* SQLITE_OMIT_L
5e90: 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IKE_OPTIMIZATION
5ea0: 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51   */...#ifndef SQ
5eb0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
5ec0: 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68 65  LTABLE./*.** Che
5ed0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
5ee0: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
5ef0: 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  n is of the form
5f00: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 63  .**.**         c
5f10: 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72  olumn MATCH expr
5f20: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  .**.** If it is 
5f30: 74 68 65 6e 20 72 65 74 75 72 6e 20 54 52 55 45  then return TRUE
5f40: 2e 20 20 49 66 20 6e 6f 74 2c 20 72 65 74 75 72  .  If not, retur
5f50: 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74  n FALSE..*/.stat
5f60: 69 63 20 69 6e 74 20 69 73 4d 61 74 63 68 4f 66  ic int isMatchOf
5f70: 43 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72 20 2a  Column(.  Expr *
5f80: 70 45 78 70 72 20 20 20 20 20 20 2f 2a 20 54 65  pExpr      /* Te
5f90: 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73 69  st this expressi
5fa0: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c  on */.){.  ExprL
5fb0: 69 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20 20 69  ist *pList;..  i
5fc0: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
5fd0: 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20  _FUNCTION ){.   
5fe0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
5ff0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
6000: 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  Cmp(pExpr->u.zTo
6010: 6b 65 6e 2c 22 6d 61 74 63 68 22 29 21 3d 30 20  ken,"match")!=0 
6020: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
6030: 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 70  .  }.  pList = p
6040: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
6050: 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70   if( pList->nExp
6060: 72 21 3d 32 20 29 7b 0a 20 20 20 20 72 65 74 75  r!=2 ){.    retu
6070: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
6080: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
6090: 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c 55  r->op != TK_COLU
60a0: 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  MN ){.    return
60b0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
60c0: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
60d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
60e0: 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a  UALTABLE */../*.
60f0: 2a 2a 20 49 66 20 74 68 65 20 70 42 61 73 65 20  ** If the pBase 
6100: 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69  expression origi
6110: 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  nated in the ON 
6120: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
6130: 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74 68  of.** a join, th
6140: 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20  en transfer the 
6150: 61 70 70 72 6f 70 72 69 61 74 65 20 6d 61 72 6b  appropriate mark
6160: 69 6e 67 73 20 6f 76 65 72 20 74 6f 20 64 65 72  ings over to der
6170: 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ived..*/.static 
6180: 76 6f 69 64 20 74 72 61 6e 73 66 65 72 4a 6f 69  void transferJoi
6190: 6e 4d 61 72 6b 69 6e 67 73 28 45 78 70 72 20 2a  nMarkings(Expr *
61a0: 70 44 65 72 69 76 65 64 2c 20 45 78 70 72 20 2a  pDerived, Expr *
61b0: 70 42 61 73 65 29 7b 0a 20 20 69 66 28 20 70 44  pBase){.  if( pD
61c0: 65 72 69 76 65 64 20 29 7b 0a 20 20 20 20 70 44  erived ){.    pD
61d0: 65 72 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d  erived->flags |=
61e0: 20 70 42 61 73 65 2d 3e 66 6c 61 67 73 20 26 20   pBase->flags & 
61f0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20  EP_FromJoin;.   
6200: 20 70 44 65 72 69 76 65 64 2d 3e 69 52 69 67 68   pDerived->iRigh
6210: 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42 61  tJoinTable = pBa
6220: 73 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  se->iRightJoinTa
6230: 62 6c 65 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20  ble;.  }.}..#if 
6240: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6250: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
6260: 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65  TION) && !define
6270: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
6280: 42 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 41 6e  BQUERY)./*.** An
6290: 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61  alyze a term tha
62a0: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 77  t consists of tw
62b0: 6f 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e  o or more OR-con
62c0: 6e 65 63 74 65 64 0a 2a 2a 20 73 75 62 74 65 72  nected.** subter
62d0: 6d 73 2e 20 20 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a  ms.  So in:.**.*
62e0: 2a 20 20 20 20 20 2e 2e 2e 20 57 48 45 52 45 20  *     ... WHERE 
62f0: 20 28 61 3d 35 29 20 41 4e 44 20 28 62 3d 37 20   (a=5) AND (b=7 
6300: 4f 52 20 63 3d 39 20 4f 52 20 64 3d 31 33 29 20  OR c=9 OR d=13) 
6310: 41 4e 44 20 28 64 3d 31 33 29 0a 2a 2a 20 20 20  AND (d=13).**   
6320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6330: 20 20 20 20 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e         ^^^^^^^^^
6340: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a  ^^^^^^^^^^^.**.*
6350: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
6360: 6e 61 6c 79 7a 65 73 20 74 65 72 6d 73 20 73 75  nalyzes terms su
6370: 63 68 20 61 73 20 74 68 65 20 6d 69 64 64 6c 65  ch as the middle
6380: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 61 62 6f   term in the abo
6390: 76 65 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a 20 41  ve example..** A
63a0: 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a   WhereOrTerm obj
63b0: 65 63 74 20 69 73 20 63 6f 6d 70 75 74 65 64 20  ect is computed 
63c0: 61 6e 64 20 61 74 74 61 63 68 65 64 20 74 6f 20  and attached to 
63d0: 74 68 65 20 74 65 72 6d 20 75 6e 64 65 72 0a 2a  the term under.*
63e0: 2a 20 61 6e 61 6c 79 73 69 73 2c 20 72 65 67 61  * analysis, rega
63f0: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75  rdless of the ou
6400: 74 63 6f 6d 65 20 6f 66 20 74 68 65 20 61 6e 61  tcome of the ana
6410: 6c 79 73 69 73 2e 20 20 48 65 6e 63 65 3a 0a 2a  lysis.  Hence:.*
6420: 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  *.**     WhereTe
6430: 72 6d 2e 77 74 46 6c 61 67 73 20 20 20 7c 3d 20  rm.wtFlags   |= 
6440: 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a 20   TERM_ORINFO.** 
6450: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e      WhereTerm.u.
6460: 70 4f 72 49 6e 66 6f 20 20 3d 20 20 61 20 64 79  pOrInfo  =  a dy
6470: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
6480: 74 65 64 20 57 68 65 72 65 4f 72 54 65 72 6d 20  ted WhereOrTerm 
6490: 6f 62 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65  object.**.** The
64a0: 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c   term being anal
64b0: 79 7a 65 64 20 6d 75 73 74 20 68 61 76 65 20 74  yzed must have t
64c0: 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 66 20 4f 52  wo or more of OR
64d0: 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 74 65  -connected subte
64e0: 72 6d 73 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c 65  rms..** A single
64f0: 20 73 75 62 74 65 72 6d 20 6d 69 67 68 74 20 62   subterm might b
6500: 65 20 61 20 73 65 74 20 6f 66 20 41 4e 44 2d 63  e a set of AND-c
6510: 6f 6e 6e 65 63 74 65 64 20 73 75 62 2d 73 75 62  onnected sub-sub
6520: 74 65 72 6d 73 2e 0a 2a 2a 20 45 78 61 6d 70 6c  terms..** Exampl
6530: 65 73 20 6f 66 20 74 65 72 6d 73 20 75 6e 64 65  es of terms unde
6540: 72 20 61 6e 61 6c 79 73 69 73 3a 0a 2a 2a 0a 2a  r analysis:.**.*
6550: 2a 20 20 20 20 20 28 41 29 20 20 20 20 20 74 31  *     (A)     t1
6560: 2e 78 3d 74 32 2e 79 20 4f 52 20 74 31 2e 78 3d  .x=t2.y OR t1.x=
6570: 74 32 2e 7a 20 4f 52 20 74 31 2e 79 3d 31 35 20  t2.z OR t1.y=15 
6580: 4f 52 20 74 31 2e 7a 3d 74 33 2e 61 2b 35 0a 2a  OR t1.z=t3.a+5.*
6590: 2a 20 20 20 20 20 28 42 29 20 20 20 20 20 78 3d  *     (B)     x=
65a0: 65 78 70 72 31 20 4f 52 20 65 78 70 72 32 3d 78  expr1 OR expr2=x
65b0: 20 4f 52 20 78 3d 65 78 70 72 33 0a 2a 2a 20 20   OR x=expr3.**  
65c0: 20 20 20 28 43 29 20 20 20 20 20 74 31 2e 78 3d     (C)     t1.x=
65d0: 74 32 2e 79 20 4f 52 20 28 74 31 2e 78 3d 74 32  t2.y OR (t1.x=t2
65e0: 2e 7a 20 41 4e 44 20 74 31 2e 79 3d 31 35 29 0a  .z AND t1.y=15).
65f0: 2a 2a 20 20 20 20 20 28 44 29 20 20 20 20 20 78  **     (D)     x
6600: 3d 65 78 70 72 31 20 4f 52 20 28 79 3e 31 31 20  =expr1 OR (y>11 
6610: 41 4e 44 20 79 3c 32 32 20 41 4e 44 20 7a 20 4c  AND y<22 AND z L
6620: 49 4b 45 20 27 2a 68 65 6c 6c 6f 2a 27 29 0a 2a  IKE '*hello*').*
6630: 2a 20 20 20 20 20 28 45 29 20 20 20 20 20 28 70  *     (E)     (p
6640: 2e 61 3d 31 20 41 4e 44 20 71 2e 62 3d 32 20 41  .a=1 AND q.b=2 A
6650: 4e 44 20 72 2e 63 3d 33 29 20 4f 52 20 28 70 2e  ND r.c=3) OR (p.
6660: 78 3d 34 20 41 4e 44 20 71 2e 79 3d 35 20 41 4e  x=4 AND q.y=5 AN
6670: 44 20 72 2e 7a 3d 36 29 0a 2a 2a 0a 2a 2a 20 43  D r.z=6).**.** C
6680: 41 53 45 20 31 3a 0a 2a 2a 0a 2a 2a 20 49 66 20  ASE 1:.**.** If 
6690: 61 6c 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65  all subterms are
66a0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 54 2e 43   of the form T.C
66b0: 3d 65 78 70 72 20 66 6f 72 20 73 6f 6d 65 20 73  =expr for some s
66c0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
66d0: 43 20 61 6e 64 0a 2a 2a 20 61 20 73 69 6e 67 6c  C and.** a singl
66e0: 65 20 74 61 62 6c 65 20 54 20 28 61 73 20 73 68  e table T (as sh
66f0: 6f 77 6e 20 69 6e 20 65 78 61 6d 70 6c 65 20 42  own in example B
6700: 20 61 62 6f 76 65 29 20 74 68 65 6e 20 63 72 65   above) then cre
6710: 61 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61  ate a new virtua
6720: 6c 0a 2a 2a 20 74 65 72 6d 20 74 68 61 74 20 69  l.** term that i
6730: 73 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20  s an equivalent 
6740: 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  IN expression.  
6750: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
6760: 69 66 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 62  if the term.** b
6770: 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 69 73  eing analyzed is
6780: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 3d  :.**.**      x =
6790: 20 65 78 70 72 31 20 20 4f 52 20 20 65 78 70 72   expr1  OR  expr
67a0: 32 20 3d 20 78 20 20 4f 52 20 20 78 20 3d 20 65  2 = x  OR  x = e
67b0: 78 70 72 33 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20  xpr3.**.** then 
67c0: 63 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72  create a new vir
67d0: 74 75 61 6c 20 74 65 72 6d 20 6c 69 6b 65 20 74  tual term like t
67e0: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
67f0: 78 20 49 4e 20 28 65 78 70 72 31 2c 65 78 70 72  x IN (expr1,expr
6800: 32 2c 65 78 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43  2,expr3).**.** C
6810: 41 53 45 20 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20  ASE 2:.**.** If 
6820: 61 6c 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65  all subterms are
6830: 20 69 6e 64 65 78 61 62 6c 65 20 62 79 20 61 20   indexable by a 
6840: 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 2c 20  single table T, 
6850: 74 68 65 6e 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20  then set.**.**  
6860: 20 20 20 57 68 65 72 65 54 65 72 6d 2e 65 4f 70     WhereTerm.eOp
6870: 65 72 61 74 6f 72 20 20 20 20 20 20 20 20 20 20  erator          
6880: 20 20 20 20 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20      =  WO_OR.** 
6890: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e      WhereTerm.u.
68a0: 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62  pOrInfo->indexab
68b0: 6c 65 20 20 7c 3d 20 20 74 68 65 20 63 75 72 73  le  |=  the curs
68c0: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61  or number for ta
68d0: 62 6c 65 20 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75  ble T.**.** A su
68e0: 62 74 65 72 6d 20 69 73 20 22 69 6e 64 65 78 61  bterm is "indexa
68f0: 62 6c 65 22 20 69 66 20 69 74 20 69 73 20 6f 66  ble" if it is of
6900: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e   the form.** "T.
6910: 43 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77  C <op> <expr>" w
6920: 68 65 72 65 20 43 20 69 73 20 61 6e 79 20 63 6f  here C is any co
6930: 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 54 20  lumn of table T 
6940: 61 6e 64 20 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20  and .** <op> is 
6950: 6f 6e 65 20 6f 66 20 22 3d 22 2c 20 22 3c 22 2c  one of "=", "<",
6960: 20 22 3c 3d 22 2c 20 22 3e 22 2c 20 22 3e 3d 22   "<=", ">", ">="
6970: 2c 20 22 49 53 20 4e 55 4c 4c 22 2c 20 6f 72 20  , "IS NULL", or 
6980: 22 49 4e 22 2e 0a 2a 2a 20 41 20 73 75 62 74 65  "IN"..** A subte
6990: 72 6d 20 69 73 20 61 6c 73 6f 20 69 6e 64 65 78  rm is also index
69a0: 61 62 6c 65 20 69 66 20 69 74 20 69 73 20 61 6e  able if it is an
69b0: 20 41 4e 44 20 6f 66 20 74 77 6f 20 6f 72 20 6d   AND of two or m
69c0: 6f 72 65 0a 2a 2a 20 73 75 62 73 75 62 74 65 72  ore.** subsubter
69d0: 6d 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ms at least one 
69e0: 6f 66 20 77 68 69 63 68 20 69 73 20 69 6e 64 65  of which is inde
69f0: 78 61 62 6c 65 2e 20 20 49 6e 64 65 78 61 62 6c  xable.  Indexabl
6a00: 65 20 41 4e 44 20 0a 2a 2a 20 73 75 62 74 65 72  e AND .** subter
6a10: 6d 73 20 68 61 76 65 20 74 68 65 69 72 20 65 4f  ms have their eO
6a20: 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f 20 57  perator set to W
6a30: 4f 5f 41 4e 44 20 61 6e 64 20 74 68 65 79 20 68  O_AND and they h
6a40: 61 76 65 0a 2a 2a 20 75 2e 70 41 6e 64 49 6e 66  ave.** u.pAndInf
6a50: 6f 20 73 65 74 20 74 6f 20 61 20 64 79 6e 61 6d  o set to a dynam
6a60: 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
6a70: 20 57 68 65 72 65 41 6e 64 54 65 72 6d 20 6f 62   WhereAndTerm ob
6a80: 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d  ject..**.** From
6a90: 20 61 6e 6f 74 68 65 72 20 70 6f 69 6e 74 20 6f   another point o
6aa0: 66 20 76 69 65 77 2c 20 22 69 6e 64 65 78 61 62  f view, "indexab
6ab0: 6c 65 22 20 6d 65 61 6e 73 20 74 68 61 74 20 74  le" means that t
6ac0: 68 65 20 73 75 62 74 65 72 6d 20 63 6f 75 6c 64  he subterm could
6ad0: 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20  .** potentially 
6ae0: 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20  be used with an 
6af0: 69 6e 64 65 78 20 69 66 20 61 6e 20 61 70 70 72  index if an appr
6b00: 6f 70 72 69 61 74 65 20 69 6e 64 65 78 20 65 78  opriate index ex
6b10: 69 73 74 73 2e 0a 2a 2a 20 54 68 69 73 20 61 6e  ists..** This an
6b20: 61 6c 79 73 69 73 20 64 6f 65 73 20 6e 6f 74 20  alysis does not 
6b30: 63 6f 6e 73 69 64 65 72 20 77 68 65 74 68 65 72  consider whether
6b40: 20 6f 72 20 6e 6f 74 20 74 68 65 20 69 6e 64 65   or not the inde
6b50: 78 20 65 78 69 73 74 73 3b 20 74 68 61 74 0a 2a  x exists; that.*
6b60: 2a 20 69 73 20 64 65 63 69 64 65 64 20 65 6c 73  * is decided els
6b70: 65 77 68 65 72 65 2e 20 20 54 68 69 73 20 61 6e  ewhere.  This an
6b80: 61 6c 79 73 69 73 20 6f 6e 6c 79 20 6c 6f 6f 6b  alysis only look
6b90: 73 20 61 74 20 77 68 65 74 68 65 72 20 73 75 62  s at whether sub
6ba0: 74 65 72 6d 73 0a 2a 2a 20 61 70 70 72 6f 70 72  terms.** appropr
6bb0: 69 61 74 65 20 66 6f 72 20 69 6e 64 65 78 69 6e  iate for indexin
6bc0: 67 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41  g exist..**.** A
6bd0: 6c 6c 20 65 78 61 6d 70 6c 65 73 20 41 20 74 68  ll examples A th
6be0: 72 6f 75 67 68 20 45 20 61 62 6f 76 65 20 73 61  rough E above sa
6bf0: 74 69 73 66 79 20 63 61 73 65 20 32 2e 20 20 42  tisfy case 2.  B
6c00: 75 74 20 69 66 20 61 20 74 65 72 6d 0a 2a 2a 20  ut if a term.** 
6c10: 61 6c 73 6f 20 73 74 61 74 69 73 66 69 65 73 20  also statisfies 
6c20: 63 61 73 65 20 31 20 28 73 75 63 68 20 61 73 20  case 1 (such as 
6c30: 42 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  B) we know that 
6c40: 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 77 69  the optimizer wi
6c50: 6c 6c 0a 2a 2a 20 61 6c 77 61 79 73 20 70 72 65  ll.** always pre
6c60: 66 65 72 20 63 61 73 65 20 31 2c 20 73 6f 20 69  fer case 1, so i
6c70: 6e 20 74 68 61 74 20 63 61 73 65 20 77 65 20 70  n that case we p
6c80: 72 65 74 65 6e 64 20 74 68 61 74 20 63 61 73 65  retend that case
6c90: 20 32 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 61 74   2 is not.** sat
6ca0: 69 73 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74  isfied..**.** It
6cb0: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
6cc0: 73 65 20 74 68 61 74 20 6d 75 6c 74 69 70 6c 65  se that multiple
6cd0: 20 74 61 62 6c 65 73 20 61 72 65 20 69 6e 64 65   tables are inde
6ce0: 78 61 62 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d  xable.  For exam
6cf0: 70 6c 65 2c 0a 2a 2a 20 28 45 29 20 61 62 6f 76  ple,.** (E) abov
6d00: 65 20 69 73 20 69 6e 64 65 78 61 62 6c 65 20 6f  e is indexable o
6d10: 6e 20 74 61 62 6c 65 73 20 50 2c 20 51 2c 20 61  n tables P, Q, a
6d20: 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d  nd R..**.** Term
6d30: 73 20 74 68 61 74 20 73 61 74 69 73 66 79 20 63  s that satisfy c
6d40: 61 73 65 20 32 20 61 72 65 20 63 61 6e 64 69 64  ase 2 are candid
6d50: 61 74 65 73 20 66 6f 72 20 6c 6f 6f 6b 75 70 20  ates for lookup 
6d60: 62 79 20 75 73 69 6e 67 0a 2a 2a 20 73 65 70 61  by using.** sepa
6d70: 72 61 74 65 20 69 6e 64 69 63 65 73 20 74 6f 20  rate indices to 
6d80: 66 69 6e 64 20 72 6f 77 69 64 73 20 66 6f 72 20  find rowids for 
6d90: 65 61 63 68 20 73 75 62 74 65 72 6d 20 61 6e 64  each subterm and
6da0: 20 63 6f 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74 68   composing.** th
6db0: 65 20 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 72  e union of all r
6dc0: 6f 77 69 64 73 20 75 73 69 6e 67 20 61 20 52 6f  owids using a Ro
6dd0: 77 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68  wSet object.  Th
6de0: 69 73 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a  is is similar.**
6df0: 20 74 6f 20 22 62 69 74 6d 61 70 20 69 6e 64 69   to "bitmap indi
6e00: 63 65 73 22 20 69 6e 20 6f 74 68 65 72 20 64 61  ces" in other da
6e10: 74 61 62 61 73 65 20 65 6e 67 69 6e 65 73 2e 0a  tabase engines..
6e20: 2a 2a 0a 2a 2a 20 4f 54 48 45 52 57 49 53 45 3a  **.** OTHERWISE:
6e30: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65  .**.** If neithe
6e40: 72 20 63 61 73 65 20 31 20 6e 6f 72 20 63 61 73  r case 1 nor cas
6e50: 65 20 32 20 61 70 70 6c 79 2c 20 74 68 65 6e 20  e 2 apply, then 
6e60: 6c 65 61 76 65 20 74 68 65 20 65 4f 70 65 72 61  leave the eOpera
6e70: 74 6f 72 20 73 65 74 20 74 6f 0a 2a 2a 20 7a 65  tor set to.** ze
6e80: 72 6f 2e 20 20 54 68 69 73 20 74 65 72 6d 20 69  ro.  This term i
6e90: 73 20 6e 6f 74 20 75 73 65 66 75 6c 20 66 6f 72  s not useful for
6ea0: 20 73 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74   search..*/.stat
6eb0: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
6ec0: 79 7a 65 4f 72 54 65 72 6d 28 0a 20 20 53 72 63  yzeOrTerm(.  Src
6ed0: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
6ee0: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52         /* the FR
6ef0: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  OM clause */.  W
6f00: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
6f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
6f20: 63 6f 6d 70 6c 65 74 65 20 57 48 45 52 45 20 63  complete WHERE c
6f30: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
6f40: 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20 20  dxTerm          
6f50: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
6f60: 20 74 68 65 20 4f 52 2d 74 65 72 6d 20 74 6f 20   the OR-term to 
6f70: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29  be analyzed */.)
6f80: 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
6f90: 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49  WInfo = pWC->pWI
6fa0: 6e 66 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20 57  nfo;        /* W
6fb0: 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
6fc0: 65 73 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  essing context *
6fd0: 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
6fe0: 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
6ff0: 73 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50  se;         /* P
7000: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
7010: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
7020: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
7030: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
7040: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
7050: 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  n */.  WhereTerm
7060: 20 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e   *pTerm = &pWC->
7070: 61 5b 69 64 78 54 65 72 6d 5d 3b 20 20 20 20 2f  a[idxTerm];    /
7080: 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65  * The term to be
7090: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 45   analyzed */.  E
70a0: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
70b0: 72 6d 2d 3e 70 45 78 70 72 3b 20 20 20 20 20 20  rm->pExpr;      
70c0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
70d0: 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20  pression of the 
70e0: 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  term */.  int i;
70f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7110: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
7120: 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  rs */.  WhereCla
7130: 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 20  use *pOrWc;     
7140: 20 20 2f 2a 20 42 72 65 61 6b 75 70 20 6f 66 20    /* Breakup of 
7150: 70 54 65 72 6d 20 69 6e 74 6f 20 73 75 62 74 65  pTerm into subte
7160: 72 6d 73 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  rms */.  WhereTe
7170: 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 20 20 20 20  rm *pOrTerm;    
7180: 20 20 20 2f 2a 20 41 20 53 75 62 2d 74 65 72 6d     /* A Sub-term
7190: 20 77 69 74 68 69 6e 20 74 68 65 20 70 4f 72 57   within the pOrW
71a0: 63 20 2a 2f 0a 20 20 57 68 65 72 65 4f 72 49 6e  c */.  WhereOrIn
71b0: 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 20  fo *pOrInfo;    
71c0: 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 69   /* Additional i
71d0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 73 73 6f 63  nformation assoc
71e0: 69 61 74 65 64 20 77 69 74 68 20 70 54 65 72 6d  iated with pTerm
71f0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 63 68   */.  Bitmask ch
7200: 6e 67 54 6f 49 4e 3b 20 20 20 20 20 20 20 20 20  ngToIN;         
7210: 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d  /* Tables that m
7220: 69 67 68 74 20 73 61 74 69 73 66 79 20 63 61 73  ight satisfy cas
7230: 65 20 31 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  e 1 */.  Bitmask
7240: 20 69 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20   indexable;     
7250: 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61     /* Tables tha
7260: 74 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2c  t are indexable,
7270: 20 73 61 74 69 73 66 79 69 6e 67 20 63 61 73 65   satisfying case
7280: 20 32 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a   2 */..  /*.  **
7290: 20 42 72 65 61 6b 20 74 68 65 20 4f 52 20 63 6c   Break the OR cl
72a0: 61 75 73 65 20 69 6e 74 6f 20 69 74 73 20 73 65  ause into its se
72b0: 70 61 72 61 74 65 20 73 75 62 74 65 72 6d 73 2e  parate subterms.
72c0: 20 20 54 68 65 20 73 75 62 74 65 72 6d 73 20 61    The subterms a
72d0: 72 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69  re.  ** stored i
72e0: 6e 20 61 20 57 68 65 72 65 43 6c 61 75 73 65 20  n a WhereClause 
72f0: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
7300: 6e 69 6e 67 20 77 69 74 68 69 6e 20 74 68 65 20  ning within the 
7310: 57 68 65 72 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a  WhereOrInfo.  **
7320: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20   object that is 
7330: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
7340: 6f 72 69 67 69 6e 61 6c 20 4f 52 20 63 6c 61 75  original OR clau
7350: 73 65 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20  se term..  */.  
7360: 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
7370: 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
7380: 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 4f 52 49  DYNAMIC|TERM_ORI
7390: 4e 46 4f 7c 54 45 52 4d 5f 41 4e 44 49 4e 46 4f  NFO|TERM_ANDINFO
73a0: 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ))==0 );.  asser
73b0: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
73c0: 5f 4f 52 20 29 3b 0a 20 20 70 54 65 72 6d 2d 3e  _OR );.  pTerm->
73d0: 75 2e 70 4f 72 49 6e 66 6f 20 3d 20 70 4f 72 49  u.pOrInfo = pOrI
73e0: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
73f0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
7400: 7a 65 6f 66 28 2a 70 4f 72 49 6e 66 6f 29 29 3b  zeof(*pOrInfo));
7410: 0a 20 20 69 66 28 20 70 4f 72 49 6e 66 6f 3d 3d  .  if( pOrInfo==
7420: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54  0 ) return;.  pT
7430: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
7440: 54 45 52 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70  TERM_ORINFO;.  p
7450: 4f 72 57 63 20 3d 20 26 70 4f 72 49 6e 66 6f 2d  OrWc = &pOrInfo-
7460: 3e 77 63 3b 0a 20 20 77 68 65 72 65 43 6c 61 75  >wc;.  whereClau
7470: 73 65 49 6e 69 74 28 70 4f 72 57 63 2c 20 70 57  seInit(pOrWc, pW
7480: 49 6e 66 6f 29 3b 0a 20 20 77 68 65 72 65 53 70  Info);.  whereSp
7490: 6c 69 74 28 70 4f 72 57 63 2c 20 70 45 78 70 72  lit(pOrWc, pExpr
74a0: 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20 65 78 70 72  , TK_OR);.  expr
74b0: 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c  AnalyzeAll(pSrc,
74c0: 20 70 4f 72 57 63 29 3b 0a 20 20 69 66 28 20 64   pOrWc);.  if( d
74d0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
74e0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
74f0: 72 74 28 20 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  rt( pOrWc->nTerm
7500: 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  >=2 );..  /*.  *
7510: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 73 65  * Compute the se
7520: 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74  t of tables that
7530: 20 6d 69 67 68 74 20 73 61 74 69 73 66 79 20 63   might satisfy c
7540: 61 73 65 73 20 31 20 6f 72 20 32 2e 0a 20 20 2a  ases 1 or 2..  *
7550: 2f 0a 20 20 69 6e 64 65 78 61 62 6c 65 20 3d 20  /.  indexable = 
7560: 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 63  ~(Bitmask)0;.  c
7570: 68 6e 67 54 6f 49 4e 20 3d 20 7e 28 42 69 74 6d  hngToIN = ~(Bitm
7580: 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d 70  ask)0;.  for(i=p
7590: 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70  OrWc->nTerm-1, p
75a0: 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b  OrTerm=pOrWc->a;
75b0: 20 69 3e 3d 30 20 26 26 20 69 6e 64 65 78 61 62   i>=0 && indexab
75c0: 6c 65 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  le; i--, pOrTerm
75d0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 4f  ++){.    if( (pO
75e0: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
75f0: 20 26 20 57 4f 5f 53 49 4e 47 4c 45 29 3d 3d 30   & WO_SINGLE)==0
7600: 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 41   ){.      WhereA
7610: 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66 6f  ndInfo *pAndInfo
7620: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
7630: 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67  (pOrTerm->wtFlag
7640: 73 20 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46  s & (TERM_ANDINF
7650: 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d  O|TERM_ORINFO))=
7660: 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 68 6e 67  =0 );.      chng
7670: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
7680: 70 41 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pAndInfo = sqlit
7690: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
76a0: 2c 20 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e  , sizeof(*pAndIn
76b0: 66 6f 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  fo));.      if( 
76c0: 70 41 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pAndInfo ){.    
76d0: 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
76e0: 2a 70 41 6e 64 57 43 3b 0a 20 20 20 20 20 20 20  *pAndWC;.       
76f0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6e 64   WhereTerm *pAnd
7700: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e  Term;.        in
7710: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 42 69 74  t j;.        Bit
7720: 6d 61 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20  mask b = 0;.    
7730: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70      pOrTerm->u.p
7740: 41 6e 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e  AndInfo = pAndIn
7750: 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54  fo;.        pOrT
7760: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
7770: 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20  TERM_ANDINFO;.  
7780: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65        pOrTerm->e
7790: 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e  Operator = WO_AN
77a0: 44 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57  D;.        pAndW
77b0: 43 20 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77  C = &pAndInfo->w
77c0: 63 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  c;.        where
77d0: 43 6c 61 75 73 65 49 6e 69 74 28 70 41 6e 64 57  ClauseInit(pAndW
77e0: 43 2c 20 70 57 43 2d 3e 70 57 49 6e 66 6f 29 3b  C, pWC->pWInfo);
77f0: 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 53 70  .        whereSp
7800: 6c 69 74 28 70 41 6e 64 57 43 2c 20 70 4f 72 54  lit(pAndWC, pOrT
7810: 65 72 6d 2d 3e 70 45 78 70 72 2c 20 54 4b 5f 41  erm->pExpr, TK_A
7820: 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  ND);.        exp
7830: 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63  rAnalyzeAll(pSrc
7840: 2c 20 70 41 6e 64 57 43 29 3b 0a 20 20 20 20 20  , pAndWC);.     
7850: 20 20 20 70 41 6e 64 57 43 2d 3e 70 4f 75 74 65     pAndWC->pOute
7860: 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20  r = pWC;.       
7870: 20 74 65 73 74 63 61 73 65 28 20 64 62 2d 3e 6d   testcase( db->m
7880: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
7890: 20 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e         if( !db->
78a0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
78b0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
78c0: 30 2c 20 70 41 6e 64 54 65 72 6d 3d 70 41 6e 64  0, pAndTerm=pAnd
78d0: 57 43 2d 3e 61 3b 20 6a 3c 70 41 6e 64 57 43 2d  WC->a; j<pAndWC-
78e0: 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e  >nTerm; j++, pAn
78f0: 64 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  dTerm++){.      
7900: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 41        assert( pA
7910: 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b  ndTerm->pExpr );
7920: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
7930: 20 61 6c 6c 6f 77 65 64 4f 70 28 70 41 6e 64 54   allowedOp(pAndT
7940: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 29 20  erm->pExpr->op) 
7950: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
7960: 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70   b |= getMask(&p
7970: 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
7980: 20 70 41 6e 64 54 65 72 6d 2d 3e 6c 65 66 74 43   pAndTerm->leftC
7990: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  ursor);.        
79a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
79b0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
79c0: 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d      indexable &=
79d0: 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   b;.      }.    
79e0: 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72  }else if( pOrTer
79f0: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
7a00: 4d 5f 43 4f 50 49 45 44 20 29 7b 0a 20 20 20 20  M_COPIED ){.    
7a10: 20 20 2f 2a 20 53 6b 69 70 20 74 68 69 73 20 74    /* Skip this t
7a20: 65 72 6d 20 66 6f 72 20 6e 6f 77 2e 20 20 57 65  erm for now.  We
7a30: 20 72 65 76 69 73 69 74 20 69 74 20 77 68 65 6e   revisit it when
7a40: 20 77 65 20 70 72 6f 63 65 73 73 20 74 68 65 0a   we process the.
7a50: 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 73 70        ** corresp
7a60: 6f 6e 64 69 6e 67 20 54 45 52 4d 5f 56 49 52 54  onding TERM_VIRT
7a70: 55 41 4c 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20  UAL term */.    
7a80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74  }else{.      Bit
7a90: 6d 61 73 6b 20 62 3b 0a 20 20 20 20 20 20 62 20  mask b;.      b 
7aa0: 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66  = getMask(&pWInf
7ab0: 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 72  o->sMaskSet, pOr
7ac0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
7ad0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
7ae0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
7af0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 7b 0a  TERM_VIRTUAL ){.
7b00: 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72          WhereTer
7b10: 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 4f 72  m *pOther = &pOr
7b20: 57 63 2d 3e 61 5b 70 4f 72 54 65 72 6d 2d 3e 69  Wc->a[pOrTerm->i
7b30: 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 20  Parent];.       
7b40: 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70   b |= getMask(&p
7b50: 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
7b60: 20 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72   pOther->leftCur
7b70: 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  sor);.      }.  
7b80: 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d      indexable &=
7b90: 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   b;.      if( (p
7ba0: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
7bb0: 72 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 7b  r & WO_EQ)==0 ){
7bc0: 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49  .        chngToI
7bd0: 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  N = 0;.      }el
7be0: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67  se{.        chng
7bf0: 54 6f 49 4e 20 26 3d 20 62 3b 0a 20 20 20 20 20  ToIN &= b;.     
7c00: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
7c10: 2f 2a 0a 20 20 2a 2a 20 52 65 63 6f 72 64 20 74  /*.  ** Record t
7c20: 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  he set of tables
7c30: 20 74 68 61 74 20 73 61 74 69 73 66 79 20 63 61   that satisfy ca
7c40: 73 65 20 32 2e 20 20 54 68 65 20 73 65 74 20 6d  se 2.  The set m
7c50: 69 67 68 74 20 62 65 0a 20 20 2a 2a 20 65 6d 70  ight be.  ** emp
7c60: 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 49 6e  ty..  */.  pOrIn
7c70: 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20  fo->indexable = 
7c80: 69 6e 64 65 78 61 62 6c 65 3b 0a 20 20 70 54 65  indexable;.  pTe
7c90: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
7ca0: 69 6e 64 65 78 61 62 6c 65 3d 3d 30 20 3f 20 30  indexable==0 ? 0
7cb0: 20 3a 20 57 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a   : WO_OR;..  /*.
7cc0: 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 68 6f    ** chngToIN ho
7cd0: 6c 64 73 20 61 20 73 65 74 20 6f 66 20 74 61 62  lds a set of tab
7ce0: 6c 65 73 20 74 68 61 74 20 2a 6d 69 67 68 74 2a  les that *might*
7cf0: 20 73 61 74 69 73 66 79 20 63 61 73 65 20 31 2e   satisfy case 1.
7d00: 20 20 42 75 74 0a 20 20 2a 2a 20 77 65 20 68 61    But.  ** we ha
7d10: 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 61 64  ve to do some ad
7d20: 64 69 74 69 6f 6e 61 6c 20 63 68 65 63 6b 69 6e  ditional checkin
7d30: 67 20 74 6f 20 73 65 65 20 69 66 20 63 61 73 65  g to see if case
7d40: 20 31 20 72 65 61 6c 6c 79 0a 20 20 2a 2a 20 69   1 really.  ** i
7d50: 73 20 73 61 74 69 73 66 69 65 64 2e 0a 20 20 2a  s satisfied..  *
7d60: 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20  *.  ** chngToIN 
7d70: 77 69 6c 6c 20 68 6f 6c 64 20 65 69 74 68 65 72  will hold either
7d80: 20 30 2c 20 31 2c 20 6f 72 20 32 20 62 69 74 73   0, 1, or 2 bits
7d90: 2e 20 20 54 68 65 20 30 2d 62 69 74 20 63 61 73  .  The 0-bit cas
7da0: 65 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61  e means.  ** tha
7db0: 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f  t there is no po
7dc0: 73 73 69 62 69 6c 69 74 79 20 6f 66 20 74 72 61  ssibility of tra
7dd0: 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 20 4f 52  nsforming the OR
7de0: 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 61 6e 0a   clause into an.
7df0: 20 20 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72    ** IN operator
7e00: 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 72 20   because one or 
7e10: 6d 6f 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68  more terms in th
7e20: 65 20 4f 52 20 63 6c 61 75 73 65 20 63 6f 6e 74  e OR clause cont
7e30: 61 69 6e 0a 20 20 2a 2a 20 73 6f 6d 65 74 68 69  ain.  ** somethi
7e40: 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 3d 3d  ng other than ==
7e50: 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   on a column in 
7e60: 74 68 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  the single table
7e70: 2e 20 20 54 68 65 20 31 2d 62 69 74 0a 20 20 2a  .  The 1-bit.  *
7e80: 2a 20 63 61 73 65 20 6d 65 61 6e 73 20 74 68 61  * case means tha
7e90: 74 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20  t every term of 
7ea0: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69 73  the OR clause is
7eb0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 20 20 2a   of the form.  *
7ec0: 2a 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d  * "table.column=
7ed0: 65 78 70 72 22 20 66 6f 72 20 73 6f 6d 65 20 73  expr" for some s
7ee0: 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68  ingle table.  Th
7ef0: 65 20 6f 6e 65 20 62 69 74 20 74 68 61 74 20 69  e one bit that i
7f00: 73 20 73 65 74 0a 20 20 2a 2a 20 77 69 6c 6c 20  s set.  ** will 
7f10: 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68  correspond to th
7f20: 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20  e common table. 
7f30: 20 57 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74   We still need t
7f40: 6f 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 0a  o check to make.
7f50: 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 73 61    ** sure the sa
7f60: 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65  me column is use
7f70: 64 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 2e 20  d on all terms. 
7f80: 20 54 68 65 20 32 2d 62 69 74 20 63 61 73 65 20   The 2-bit case 
7f90: 69 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65  is when.  ** the
7fa0: 20 61 6c 6c 20 74 65 72 6d 73 20 61 72 65 20 6f   all terms are o
7fb0: 66 20 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c  f the form "tabl
7fc0: 65 31 2e 63 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32  e1.column=table2
7fd0: 2e 63 6f 6c 75 6d 6e 22 2e 20 20 49 74 0a 20 20  .column".  It.  
7fe0: 2a 2a 20 6d 69 67 68 74 20 62 65 20 70 6f 73 73  ** might be poss
7ff0: 69 62 6c 65 20 74 6f 20 66 6f 72 6d 20 61 6e 20  ible to form an 
8000: 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
8010: 20 65 69 74 68 65 72 20 74 61 62 6c 65 31 2e 63   either table1.c
8020: 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 72 20 74 61  olumn.  ** or ta
8030: 62 6c 65 32 2e 63 6f 6c 75 6d 6e 20 61 73 20 74  ble2.column as t
8040: 68 65 20 4c 48 53 20 69 66 20 65 69 74 68 65 72  he LHS if either
8050: 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76   is common to ev
8060: 65 72 79 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a  ery term of.  **
8070: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 2e 0a   the OR clause..
8080: 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74    **.  ** Note t
8090: 68 61 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65  hat terms of the
80a0: 20 66 6f 72 6d 20 22 74 61 62 6c 65 2e 63 6f 6c   form "table.col
80b0: 75 6d 6e 31 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d  umn1=table.colum
80c0: 6e 32 22 20 28 74 68 65 0a 20 20 2a 2a 20 73 61  n2" (the.  ** sa
80d0: 6d 65 20 74 61 62 6c 65 20 6f 6e 20 62 6f 74 68  me table on both
80e0: 20 73 69 7a 65 73 20 6f 66 20 74 68 65 20 3d 3d   sizes of the ==
80f0: 29 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69  ) cannot be opti
8100: 6d 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  mized..  */.  if
8110: 28 20 63 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20  ( chngToIN ){.  
8120: 20 20 69 6e 74 20 6f 6b 54 6f 43 68 6e 67 54 6f    int okToChngTo
8130: 49 4e 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54  IN = 0;     /* T
8140: 72 75 65 20 69 66 20 74 68 65 20 63 6f 6e 76 65  rue if the conve
8150: 72 73 69 6f 6e 20 74 6f 20 49 4e 20 69 73 20 76  rsion to IN is v
8160: 61 6c 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  alid */.    int 
8170: 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20  iColumn = -1;   
8180: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
8190: 69 6e 64 65 78 20 6f 6e 20 6c 68 73 20 6f 66 20  index on lhs of 
81a0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
81b0: 20 20 20 69 6e 74 20 69 43 75 72 73 6f 72 20 3d     int iCursor =
81c0: 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   -1;         /* 
81d0: 54 61 62 6c 65 20 63 75 72 73 6f 72 20 63 6f 6d  Table cursor com
81e0: 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74 65 72 6d 73  mon to all terms
81f0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20   */.    int j = 
8200: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
8210: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
8220: 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61  r */..    /* Sea
8230: 72 63 68 20 66 6f 72 20 61 20 74 61 62 6c 65 20  rch for a table 
8240: 61 6e 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  and column that 
8250: 61 70 70 65 61 72 73 20 6f 6e 20 6f 6e 65 20 73  appears on one s
8260: 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  ide or the.    *
8270: 2a 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 3d  * other of the =
8280: 3d 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 65 76  = operator in ev
8290: 65 72 79 20 73 75 62 74 65 72 6d 2e 20 20 54 68  ery subterm.  Th
82a0: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  at table and col
82b0: 75 6d 6e 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  umn.    ** will 
82c0: 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e 20 69  be recorded in i
82d0: 43 75 72 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75  Cursor and iColu
82e0: 6d 6e 2e 20 20 54 68 65 72 65 20 6d 69 67 68 74  mn.  There might
82f0: 20 6e 6f 74 20 62 65 20 61 6e 79 0a 20 20 20 20   not be any.    
8300: 2a 2a 20 73 75 63 68 20 74 61 62 6c 65 20 61 6e  ** such table an
8310: 64 20 63 6f 6c 75 6d 6e 2e 20 20 53 65 74 20 6f  d column.  Set o
8320: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 66 20 61  kToChngToIN if a
8330: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 61  n appropriate ta
8340: 62 6c 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 63  ble.    ** and c
8350: 6f 6c 75 6d 6e 20 69 73 20 66 6f 75 6e 64 20 62  olumn is found b
8360: 75 74 20 6c 65 61 76 65 20 6f 6b 54 6f 43 68 6e  ut leave okToChn
8370: 67 54 6f 49 4e 20 66 61 6c 73 65 20 69 66 20 6e  gToIN false if n
8380: 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f  ot found..    */
8390: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
83a0: 32 20 26 26 20 21 6f 6b 54 6f 43 68 6e 67 54 6f  2 && !okToChngTo
83b0: 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  IN; j++){.      
83c0: 70 4f 72 54 65 72 6d 20 3d 20 70 4f 72 57 63 2d  pOrTerm = pOrWc-
83d0: 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  >a;.      for(i=
83e0: 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20  pOrWc->nTerm-1; 
83f0: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65  i>=0; i--, pOrTe
8400: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61  rm++){.        a
8410: 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e  ssert( pOrTerm->
8420: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
8430: 51 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  Q );.        pOr
8440: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d  Term->wtFlags &=
8450: 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20   ~TERM_OR_OK;.  
8460: 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
8470: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
8480: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
8490: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
84a0: 68 65 20 32 2d 62 69 74 20 63 61 73 65 20 61 6e  he 2-bit case an
84b0: 64 20 77 65 20 61 72 65 20 6f 6e 20 74 68 65 20  d we are on the 
84c0: 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e  second iteration
84d0: 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a   and.          *
84e0: 2a 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69  * current term i
84f0: 73 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74  s from the first
8500: 20 69 74 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20   iteration.  So 
8510: 73 6b 69 70 20 74 68 69 73 20 74 65 72 6d 2e 20  skip this term. 
8520: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
8530: 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20  ert( j==1 );.   
8540: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
8550: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8560: 20 20 20 69 66 28 20 28 63 68 6e 67 54 6f 49 4e     if( (chngToIN
8570: 20 26 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e   & getMask(&pWIn
8580: 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f  fo->sMaskSet, pO
8590: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
85a0: 72 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r))==0 ){.      
85b0: 20 20 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d      /* This term
85c0: 20 6d 75 73 74 20 62 65 20 6f 66 20 74 68 65 20   must be of the 
85d0: 66 6f 72 6d 20 74 31 2e 61 3d 3d 74 32 2e 62 20  form t1.a==t2.b 
85e0: 77 68 65 72 65 20 74 32 20 69 73 20 69 6e 20 74  where t2 is in t
85f0: 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
8600: 63 68 6e 67 54 6f 49 4e 20 73 65 74 20 62 75 74  chngToIN set but
8610: 20 74 31 20 69 73 20 6e 6f 74 2e 20 20 54 68 69   t1 is not.  Thi
8620: 73 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 65  s term will be e
8630: 69 74 68 65 72 20 70 72 65 63 65 65 64 65 64 0a  ither preceeded.
8640: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
8650: 66 6f 6c 6c 77 65 64 20 62 79 20 61 6e 20 69 6e  follwed by an in
8660: 76 65 72 74 65 64 20 63 6f 70 79 20 28 74 32 2e  verted copy (t2.
8670: 62 3d 3d 74 31 2e 61 29 2e 20 20 53 6b 69 70 20  b==t1.a).  Skip 
8680: 74 68 69 73 20 74 65 72 6d 20 0a 20 20 20 20 20  this term .     
8690: 20 20 20 20 20 2a 2a 20 61 6e 64 20 75 73 65 20       ** and use 
86a0: 69 74 73 20 69 6e 76 65 72 73 69 6f 6e 2e 20 2a  its inversion. *
86b0: 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
86c0: 63 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77  case( pOrTerm->w
86d0: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
86e0: 50 49 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20  PIED );.        
86f0: 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 54    testcase( pOrT
8700: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
8710: 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20  ERM_VIRTUAL );. 
8720: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
8730: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
8740: 73 20 26 20 28 54 45 52 4d 5f 43 4f 50 49 45 44  s & (TERM_COPIED
8750: 7c 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 20 29  |TERM_VIRTUAL) )
8760: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
8770: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
8780: 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20          iColumn 
8790: 3d 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66  = pOrTerm->u.lef
87a0: 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  tColumn;.       
87b0: 20 69 43 75 72 73 6f 72 20 3d 20 70 4f 72 54 65   iCursor = pOrTe
87c0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a  rm->leftCursor;.
87d0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
87e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
87f0: 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   i<0 ){.        
8800: 2f 2a 20 4e 6f 20 63 61 6e 64 69 64 61 74 65 20  /* No candidate 
8810: 74 61 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61 73  table+column was
8820: 20 66 6f 75 6e 64 2e 20 20 54 68 69 73 20 63 61   found.  This ca
8830: 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 0a 20 20 20  n only occur.   
8840: 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73       ** on the s
8850: 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20  econd iteration 
8860: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
8870: 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20  t( j==1 );.     
8880: 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77     assert( IsPow
8890: 65 72 4f 66 54 77 6f 28 63 68 6e 67 54 6f 49 4e  erOfTwo(chngToIN
88a0: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ) );.        ass
88b0: 65 72 74 28 20 63 68 6e 67 54 6f 49 4e 3d 3d 67  ert( chngToIN==g
88c0: 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e  etMask(&pWInfo->
88d0: 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 73 6f  sMaskSet, iCurso
88e0: 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72  r) );.        br
88f0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
8900: 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
8910: 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  1 );..      /* W
8920: 65 20 68 61 76 65 20 66 6f 75 6e 64 20 61 20 63  e have found a c
8930: 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65 20 61  andidate table a
8940: 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 43 68 65 63  nd column.  Chec
8950: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 61 74  k to see if that
8960: 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  .      ** table 
8970: 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20 63 6f  and column is co
8980: 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65  mmon to every te
8990: 72 6d 20 69 6e 20 74 68 65 20 4f 52 20 63 6c 61  rm in the OR cla
89a0: 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 6f 6b 54  use */.      okT
89b0: 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a 20  oChngToIN = 1;. 
89c0: 20 20 20 20 20 66 6f 72 28 3b 20 69 3e 3d 30 20       for(; i>=0 
89d0: 26 26 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b  && okToChngToIN;
89e0: 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29   i--, pOrTerm++)
89f0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
8a00: 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  ( pOrTerm->eOper
8a10: 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a  ator & WO_EQ );.
8a20: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 54          if( pOrT
8a30: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21  erm->leftCursor!
8a40: 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  =iCursor ){.    
8a50: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77        pOrTerm->w
8a60: 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f  tFlags &= ~TERM_
8a70: 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  OR_OK;.        }
8a80: 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d  else if( pOrTerm
8a90: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d  ->u.leftColumn!=
8aa0: 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
8ab0: 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49       okToChngToI
8ac0: 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  N = 0;.        }
8ad0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
8ae0: 69 6e 74 20 61 66 66 4c 65 66 74 2c 20 61 66 66  int affLeft, aff
8af0: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20  Right;.         
8b00: 20 2f 2a 20 49 66 20 74 68 65 20 72 69 67 68 74   /* If the right
8b10: 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6c  -hand side is al
8b20: 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  so a column, the
8b30: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 69 65 73  n the affinities
8b40: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  .          ** of
8b50: 20 62 6f 74 68 20 72 69 67 68 74 20 61 6e 64 20   both right and 
8b60: 6c 65 66 74 20 73 69 64 65 73 20 6d 75 73 74 20  left sides must 
8b70: 62 65 20 73 75 63 68 20 74 68 61 74 20 6e 6f 20  be such that no 
8b80: 74 79 70 65 0a 20 20 20 20 20 20 20 20 20 20 2a  type.          *
8b90: 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72  * conversions ar
8ba0: 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20 74 68  e required on th
8bb0: 65 20 72 69 67 68 74 2e 20 20 28 54 69 63 6b 65  e right.  (Ticke
8bc0: 74 20 23 32 32 34 39 29 0a 20 20 20 20 20 20 20  t #2249).       
8bd0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
8be0: 61 66 66 52 69 67 68 74 20 3d 20 73 71 6c 69 74  affRight = sqlit
8bf0: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
8c00: 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  OrTerm->pExpr->p
8c10: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
8c20: 20 20 61 66 66 4c 65 66 74 20 3d 20 73 71 6c 69    affLeft = sqli
8c30: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
8c40: 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  pOrTerm->pExpr->
8c50: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20  pLeft);.        
8c60: 20 20 69 66 28 20 61 66 66 52 69 67 68 74 21 3d    if( affRight!=
8c70: 30 20 26 26 20 61 66 66 52 69 67 68 74 21 3d 61  0 && affRight!=a
8c80: 66 66 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  ffLeft ){.      
8c90: 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f        okToChngTo
8ca0: 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  IN = 0;.        
8cb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8cc0: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74       pOrTerm->wt
8cd0: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52  Flags |= TERM_OR
8ce0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  _OK;.          }
8cf0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8d00: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
8d10: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
8d20: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 73 20  okToChngToIN is 
8d30: 74 72 75 65 20 69 66 20 6f 72 69 67 69 6e 61 6c  true if original
8d40: 20 70 54 65 72 6d 20 73 61 74 69 73 66 69 65 73   pTerm satisfies
8d50: 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 31 2e 20  .    ** case 1. 
8d60: 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 63   In that case, c
8d70: 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 76  onstruct a new v
8d80: 69 72 74 75 61 6c 20 74 65 72 6d 20 74 68 61 74  irtual term that
8d90: 20 69 73 20 0a 20 20 20 20 2a 2a 20 70 54 65 72   is .    ** pTer
8da0: 6d 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  m converted into
8db0: 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e   an IN operator.
8dc0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
8dd0: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 29 7b 0a  okToChngToIN ){.
8de0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 44 75 70        Expr *pDup
8df0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
8e00: 41 20 74 72 61 6e 73 69 65 6e 74 20 64 75 70 6c  A transient dupl
8e10: 69 63 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  icate expression
8e20: 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69   */.      ExprLi
8e30: 73 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b 20 20  st *pList = 0;  
8e40: 20 2f 2a 20 54 68 65 20 52 48 53 20 6f 66 20 74   /* The RHS of t
8e50: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  he IN operator *
8e60: 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  /.      Expr *pL
8e70: 65 66 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  eft = 0;       /
8e80: 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65  * The LHS of the
8e90: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
8ea0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
8eb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
8ec0: 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 49 4e 20  The complete IN 
8ed0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20  operator */..   
8ee0: 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e     for(i=pOrWc->
8ef0: 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d  nTerm-1, pOrTerm
8f00: 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 3b  =pOrWc->a; i>=0;
8f10: 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29   i--, pOrTerm++)
8f20: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
8f30: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
8f40: 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30  & TERM_OR_OK)==0
8f50: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
8f60: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
8f70: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
8f80: 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20  & WO_EQ );.     
8f90: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
8fa0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
8fb0: 69 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 20  iCursor );.     
8fc0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
8fd0: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
8fe0: 3d 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20  ==iColumn );.   
8ff0: 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69       pDup = sqli
9000: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
9010: 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  OrTerm->pExpr->p
9020: 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
9030: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
9040: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
9050: 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c  (pWInfo->pParse,
9060: 20 70 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a 20   pList, pDup);. 
9070: 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70         pLeft = p
9080: 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  OrTerm->pExpr->p
9090: 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Left;.      }.  
90a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66      assert( pLef
90b0: 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44  t!=0 );.      pD
90c0: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
90d0: 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30  Dup(db, pLeft, 0
90e0: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  );.      pNew = 
90f0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
9100: 72 73 65 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70  rse, TK_IN, pDup
9110: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
9120: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
9130: 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20     int idxNew;. 
9140: 20 20 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a         transferJ
9150: 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77  oinMarkings(pNew
9160: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
9170: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
9180: 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c  asProperty(pNew,
9190: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
91a0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
91b0: 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b  x.pList = pList;
91c0: 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20  .        idxNew 
91d0: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
91e0: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54  ert(pWC, pNew, T
91f0: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
9200: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
9210: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78     testcase( idx
9220: 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  New==0 );.      
9230: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
9240: 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29  rc, pWC, idxNew)
9250: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20  ;.        pTerm 
9260: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
9270: 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 57 43 2d  m];.        pWC-
9280: 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65  >a[idxNew].iPare
9290: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
92a0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68        pTerm->nCh
92b0: 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ild = 1;.      }
92c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
92d0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
92e0: 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
92f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
9300: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
9310: 20 57 4f 5f 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61   WO_NOOP;  /* ca
9320: 73 65 20 31 20 74 72 75 6d 70 73 20 63 61 73 65  se 1 trumps case
9330: 20 32 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a   2 */.    }.  }.
9340: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
9350: 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
9360: 4d 49 5a 41 54 49 4f 4e 20 26 26 20 21 53 51 4c  MIZATION && !SQL
9370: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
9380: 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  Y */../*.** The 
9390: 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f  input to this ro
93a0: 75 74 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72  utine is an Wher
93b0: 65 54 65 72 6d 20 73 74 72 75 63 74 75 72 65 20  eTerm structure 
93c0: 77 69 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a  with only the.**
93d0: 20 22 70 45 78 70 72 22 20 66 69 65 6c 64 20 66   "pExpr" field f
93e0: 69 6c 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a  illed in.  The j
93f0: 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ob of this routi
9400: 6e 65 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65  ne is to analyze
9410: 20 74 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65   the.** subexpre
9420: 73 73 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61  ssion and popula
9430: 74 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72  te all the other
9440: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57   fields of the W
9450: 68 65 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75  hereTerm.** stru
9460: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
9470: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
9480: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c  s of the form "<
9490: 65 78 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74  expr> <op> X" it
94a0: 20 67 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a   gets commuted.*
94b0: 2a 20 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72  * to the standar
94c0: 64 20 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70  d form of "X <op
94d0: 3e 20 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a  > <expr>"..**.**
94e0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
94f0: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
9500: 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65  m "X <op> Y" whe
9510: 72 65 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20  re both X and Y 
9520: 61 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20  are.** columns, 
9530: 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  then the origina
9540: 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  l expression is 
9550: 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20  unchanged and a 
9560: 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74  new virtual.** t
9570: 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  erm of the form 
9580: 22 59 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64  "Y <op> X" is ad
9590: 64 65 64 20 74 6f 20 74 68 65 20 57 48 45 52 45  ded to the WHERE
95a0: 20 63 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61   clause and.** a
95b0: 6e 61 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65  nalyzed separate
95c0: 6c 79 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61  ly.  The origina
95d0: 6c 20 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64  l term is marked
95e0: 20 77 69 74 68 20 54 45 52 4d 5f 43 4f 50 49 45   with TERM_COPIE
95f0: 44 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77  D.** and the new
9600: 20 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20   term is marked 
9610: 77 69 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49  with TERM_DYNAMI
9620: 43 20 28 62 65 63 61 75 73 65 20 69 74 27 73 20  C (because it's 
9630: 70 45 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74  pExpr.** needs t
9640: 6f 20 62 65 20 66 72 65 65 64 20 77 69 74 68 20  o be freed with 
9650: 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 29  the WhereClause)
9660: 20 61 6e 64 20 54 45 52 4d 5f 56 49 52 54 55 41   and TERM_VIRTUA
9670: 4c 20 28 62 65 63 61 75 73 65 20 69 74 0a 2a 2a  L (because it.**
9680: 20 69 73 20 61 20 63 6f 6d 6d 75 74 65 64 20 63   is a commuted c
9690: 6f 70 79 20 6f 66 20 61 20 70 72 69 6f 72 20 74  opy of a prior t
96a0: 65 72 6d 2e 29 20 20 54 68 65 20 6f 72 69 67 69  erm.)  The origi
96b0: 6e 61 6c 20 74 65 72 6d 20 68 61 73 20 6e 43 68  nal term has nCh
96c0: 69 6c 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65  ild=1.** and the
96d0: 20 63 6f 70 79 20 68 61 73 20 69 64 78 50 61 72   copy has idxPar
96e0: 65 6e 74 20 73 65 74 20 74 6f 20 74 68 65 20 69  ent set to the i
96f0: 6e 64 65 78 20 6f 66 20 74 68 65 20 6f 72 69 67  ndex of the orig
9700: 69 6e 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74  inal term..*/.st
9710: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e  atic void exprAn
9720: 61 6c 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74  alyze(.  SrcList
9730: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20   *pSrc,         
9740: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
9750: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
9760: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
9770: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
9780: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  E clause */.  in
9790: 74 20 69 64 78 54 65 72 6d 20 20 20 20 20 20 20  t idxTerm       
97a0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
97b0: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20   of the term to 
97c0: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29  be analyzed */.)
97d0: 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
97e0: 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49  WInfo = pWC->pWI
97f0: 6e 66 6f 3b 20 2f 2a 20 57 48 45 52 45 20 63 6c  nfo; /* WHERE cl
9800: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20  ause processing 
9810: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
9820: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
9830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9840: 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   The term to be 
9850: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 57 68  analyzed */.  Wh
9860: 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
9870: 6b 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f  kSet;          /
9880: 2a 20 53 65 74 20 6f 66 20 74 61 62 6c 65 20 69  * Set of table i
9890: 6e 64 65 78 20 6d 61 73 6b 73 20 2a 2f 0a 20 20  ndex masks */.  
98a0: 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20  Expr *pExpr;    
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98c0: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
98d0: 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  on to be analyze
98e0: 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70  d */.  Bitmask p
98f0: 72 65 72 65 71 4c 65 66 74 3b 20 20 20 20 20 20  rereqLeft;      
9900: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65          /* Prere
9910: 71 75 65 73 69 74 65 73 20 6f 66 20 74 68 65 20  quesites of the 
9920: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a  pExpr->pLeft */.
9930: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
9940: 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  All;            
9950: 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69     /* Prerequesi
9960: 74 65 73 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a  tes of pExpr */.
9970: 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61 52    Bitmask extraR
9980: 69 67 68 74 20 3d 20 30 3b 20 20 20 20 20 20 20  ight = 0;       
9990: 20 20 20 2f 2a 20 45 78 74 72 61 20 64 65 70 65     /* Extra depe
99a0: 6e 64 65 6e 63 69 65 73 20 6f 6e 20 4c 45 46 54  ndencies on LEFT
99b0: 20 4a 4f 49 4e 20 2a 2f 0a 20 20 45 78 70 72 20   JOIN */.  Expr 
99c0: 2a 70 53 74 72 31 20 3d 20 30 3b 20 20 20 20 20  *pStr1 = 0;     
99d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
99e0: 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20  HS of LIKE/GLOB 
99f0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  operator */.  in
9a00: 74 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30  t isComplete = 0
9a10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
9a20: 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c  * RHS of LIKE/GL
9a30: 4f 42 20 65 6e 64 73 20 77 69 74 68 20 77 69 6c  OB ends with wil
9a40: 64 63 61 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  dcard */.  int n
9a50: 6f 43 61 73 65 20 3d 20 30 3b 20 20 20 20 20 20  oCase = 0;      
9a60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
9a70: 49 4b 45 2f 47 4c 4f 42 20 64 69 73 74 69 6e 67  IKE/GLOB disting
9a80: 75 69 73 68 65 73 20 63 61 73 65 20 2a 2f 0a 20  uishes case */. 
9a90: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
9aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ab0: 20 20 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f    /* Top-level o
9ac0: 70 65 72 61 74 6f 72 2e 20 20 70 45 78 70 72 2d  perator.  pExpr-
9ad0: 3e 6f 70 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  >op */.  Parse *
9ae0: 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
9af0: 3e 70 50 61 72 73 65 3b 20 20 2f 2a 20 50 61 72  >pParse;  /* Par
9b00: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
9b10: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
9b20: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
9b30: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
9b40: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  onnection */..  
9b50: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
9b60: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
9b70: 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20  rn;.  }.  pTerm 
9b80: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
9b90: 6d 5d 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d  m];.  pMaskSet =
9ba0: 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53   &pWInfo->sMaskS
9bb0: 65 74 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 54  et;.  pExpr = pT
9bc0: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 61 73  erm->pExpr;.  as
9bd0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
9be0: 3d 54 4b 5f 41 53 20 26 26 20 70 45 78 70 72 2d  =TK_AS && pExpr-
9bf0: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op!=TK_COLLATE 
9c00: 29 3b 0a 20 20 70 72 65 72 65 71 4c 65 66 74 20  );.  prereqLeft 
9c10: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
9c20: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
9c30: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6f 70 20 3d  ->pLeft);.  op =
9c40: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
9c50: 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20  ( op==TK_IN ){. 
9c60: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
9c70: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
9c80: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
9c90: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
9ca0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
9cb0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72       pTerm->prer
9cc0: 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 53 65  eqRight = exprSe
9cd0: 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 70  lectTableUsage(p
9ce0: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
9cf0: 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  x.pSelect);.    
9d00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 65  }else{.      pTe
9d10: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
9d20: 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  = exprListTableU
9d30: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
9d40: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  Expr->x.pList);.
9d50: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
9d60: 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op==TK_ISNULL 
9d70: 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72  ){.    pTerm->pr
9d80: 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b 0a 20  ereqRight = 0;. 
9d90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 72   }else{.    pTer
9da0: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
9db0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
9dc0: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
9dd0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20  >pRight);.  }.  
9de0: 70 72 65 72 65 71 41 6c 6c 20 3d 20 65 78 70 72  prereqAll = expr
9df0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
9e00: 53 65 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 69  Set, pExpr);.  i
9e10: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
9e20: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
9e30: 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 42 69  mJoin) ){.    Bi
9e40: 74 6d 61 73 6b 20 78 20 3d 20 67 65 74 4d 61 73  tmask x = getMas
9e50: 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  k(pMaskSet, pExp
9e60: 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  r->iRightJoinTab
9e70: 6c 65 29 3b 0a 20 20 20 20 70 72 65 72 65 71 41  le);.    prereqA
9e80: 6c 6c 20 7c 3d 20 78 3b 0a 20 20 20 20 65 78 74  ll |= x;.    ext
9e90: 72 61 52 69 67 68 74 20 3d 20 78 2d 31 3b 20 20  raRight = x-1;  
9ea0: 2f 2a 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72  /* ON clause ter
9eb0: 6d 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73  ms may not be us
9ec0: 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
9ed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9ee0: 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 6c 65          ** on le
9ef0: 66 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45  ft table of a LE
9f00: 46 54 20 4a 4f 49 4e 2e 20 20 54 69 63 6b 65 74  FT JOIN.  Ticket
9f10: 20 23 33 30 31 35 20 2a 2f 0a 20 20 7d 0a 20 20   #3015 */.  }.  
9f20: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
9f30: 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20   = prereqAll;.  
9f40: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
9f50: 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d  r = -1;.  pTerm-
9f60: 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20  >iParent = -1;. 
9f70: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
9f80: 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c  r = 0;.  if( all
9f90: 6f 77 65 64 4f 70 28 6f 70 29 20 29 7b 0a 20 20  owedOp(op) ){.  
9fa0: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
9fb0: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
9fc0: 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d 3e 70 4c  ollate(pExpr->pL
9fd0: 65 66 74 29 3b 0a 20 20 20 20 45 78 70 72 20 2a  eft);.    Expr *
9fe0: 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
9ff0: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
a000: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
a010: 20 20 20 20 75 31 36 20 6f 70 4d 61 73 6b 20 3d      u16 opMask =
a020: 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
a030: 69 67 68 74 20 26 20 70 72 65 72 65 71 4c 65 66  ight & prereqLef
a040: 74 29 3d 3d 30 20 3f 20 57 4f 5f 41 4c 4c 20 3a  t)==0 ? WO_ALL :
a050: 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 69   WO_EQUIV;.    i
a060: 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
a070: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
a080: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
a090: 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62  or = pLeft->iTab
a0a0: 6c 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  le;.      pTerm-
a0b0: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20  >u.leftColumn = 
a0c0: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pLeft->iColumn;.
a0d0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70        pTerm->eOp
a0e0: 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f  erator = operato
a0f0: 72 4d 61 73 6b 28 6f 70 29 20 26 20 6f 70 4d 61  rMask(op) & opMa
a100: 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  sk;.    }.    if
a110: 28 20 70 52 69 67 68 74 20 26 26 20 70 52 69 67  ( pRight && pRig
a120: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ht->op==TK_COLUM
a130: 4e 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  N ){.      Where
a140: 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Term *pNew;.    
a150: 20 20 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20    Expr *pDup;.  
a160: 20 20 20 20 75 31 36 20 65 45 78 74 72 61 4f 70      u16 eExtraOp
a170: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
a180: 45 78 74 72 61 20 62 69 74 73 20 66 6f 72 20 70  Extra bits for p
a190: 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a  New->eOperator *
a1a0: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  /.      if( pTer
a1b0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30  m->leftCursor>=0
a1c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
a1d0: 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  idxNew;.        
a1e0: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78  pDup = sqlite3Ex
a1f0: 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c  prDup(db, pExpr,
a200: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
a210: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
a220: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  d ){.          s
a230: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
a240: 28 64 62 2c 20 70 44 75 70 29 3b 0a 20 20 20 20  (db, pDup);.    
a250: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
a260: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a270: 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c  idxNew = whereCl
a280: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
a290: 70 44 75 70 2c 20 54 45 52 4d 5f 56 49 52 54 55  pDup, TERM_VIRTU
a2a0: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29  AL|TERM_DYNAMIC)
a2b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 64  ;.        if( id
a2c0: 78 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  xNew==0 ) return
a2d0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  ;.        pNew =
a2e0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d   &pWC->a[idxNew]
a2f0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
a300: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
a310: 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  m;.        pTerm
a320: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
a330: 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65  rm];.        pTe
a340: 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a  rm->nChild = 1;.
a350: 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77          pTerm->w
a360: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
a370: 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 20 20 69  OPIED;.        i
a380: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
a390: 5f 45 51 0a 20 20 20 20 20 20 20 20 20 26 26 20  _EQ.         && 
a3a0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
a3b0: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
a3c0: 6f 69 6e 29 0a 20 20 20 20 20 20 20 20 20 26 26  oin).         &&
a3d0: 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
a3e0: 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
a3f0: 54 72 61 6e 73 69 74 69 76 65 29 0a 20 20 20 20  Transitive).    
a400: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
a410: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
a420: 72 20 7c 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20  r |= WO_EQUIV;. 
a430: 20 20 20 20 20 20 20 20 20 65 45 78 74 72 61 4f           eExtraO
a440: 70 20 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20  p = WO_EQUIV;.  
a450: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
a460: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 75  lse{.        pDu
a470: 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  p = pExpr;.     
a480: 20 20 20 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b     pNew = pTerm;
a490: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65  .      }.      e
a4a0: 78 70 72 43 6f 6d 6d 75 74 65 28 70 50 61 72 73  xprCommute(pPars
a4b0: 65 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  e, pDup);.      
a4c0: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
a4d0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
a4e0: 44 75 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  Dup->pLeft);.   
a4f0: 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72     pNew->leftCur
a500: 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61  sor = pLeft->iTa
a510: 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ble;.      pNew-
a520: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20  >u.leftColumn = 
a530: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pLeft->iColumn;.
a540: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
a550: 28 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78  (prereqLeft | ex
a560: 74 72 61 52 69 67 68 74 29 20 21 3d 20 70 72 65  traRight) != pre
a570: 72 65 71 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  reqLeft );.     
a580: 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 52 69 67   pNew->prereqRig
a590: 68 74 20 3d 20 70 72 65 72 65 71 4c 65 66 74 20  ht = prereqLeft 
a5a0: 7c 20 65 78 74 72 61 52 69 67 68 74 3b 0a 20 20  | extraRight;.  
a5b0: 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
a5c0: 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b  All = prereqAll;
a5d0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70  .      pNew->eOp
a5e0: 65 72 61 74 6f 72 20 3d 20 28 6f 70 65 72 61 74  erator = (operat
a5f0: 6f 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29  orMask(pDup->op)
a600: 20 2b 20 65 45 78 74 72 61 4f 70 29 20 26 20 6f   + eExtraOp) & o
a610: 70 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  pMask;.    }.  }
a620: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
a630: 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50  _OMIT_BETWEEN_OP
a640: 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20  TIMIZATION.  /* 
a650: 49 66 20 61 20 74 65 72 6d 20 69 73 20 74 68 65  If a term is the
a660: 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f   BETWEEN operato
a670: 72 2c 20 63 72 65 61 74 65 20 74 77 6f 20 6e 65  r, create two ne
a680: 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 0a  w virtual terms.
a690: 20 20 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65    ** that define
a6a0: 20 74 68 65 20 72 61 6e 67 65 20 74 68 61 74 20   the range that 
a6b0: 74 68 65 20 42 45 54 57 45 45 4e 20 69 6d 70 6c  the BETWEEN impl
a6c0: 65 6d 65 6e 74 73 2e 20 20 46 6f 72 20 65 78 61  ements.  For exa
a6d0: 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mple:.  **.  ** 
a6e0: 20 20 20 20 20 61 20 42 45 54 57 45 45 4e 20 62       a BETWEEN b
a6f0: 20 41 4e 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a   AND c.  **.  **
a700: 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   is converted in
a710: 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
a720: 20 20 20 28 61 20 42 45 54 57 45 45 4e 20 62 20     (a BETWEEN b 
a730: 41 4e 44 20 63 29 20 41 4e 44 20 28 61 3e 3d 62  AND c) AND (a>=b
a740: 29 20 41 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a  ) AND (a<=c).  *
a750: 2a 0a 20 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e  *.  ** The two n
a760: 65 77 20 74 65 72 6d 73 20 61 72 65 20 61 64 64  ew terms are add
a770: 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  ed onto the end 
a780: 6f 66 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  of the WhereClau
a790: 73 65 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20  se object..  ** 
a7a0: 54 68 65 20 6e 65 77 20 74 65 72 6d 73 20 61 72  The new terms ar
a7b0: 65 20 22 64 79 6e 61 6d 69 63 22 20 61 6e 64 20  e "dynamic" and 
a7c0: 61 72 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  are children of 
a7d0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 42 45 54  the original BET
a7e0: 57 45 45 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20  WEEN.  ** term. 
a7f0: 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   That means that
a800: 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20   if the BETWEEN 
a810: 74 65 72 6d 20 69 73 20 63 6f 64 65 64 2c 20 74  term is coded, t
a820: 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65 0a  he children are.
a830: 20 20 2a 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f    ** skipped.  O
a840: 72 2c 20 69 66 20 74 68 65 20 63 68 69 6c 64 72  r, if the childr
a850: 65 6e 20 61 72 65 20 73 61 74 69 73 66 69 65 64  en are satisfied
a860: 20 62 79 20 61 6e 20 69 6e 64 65 78 2c 20 74 68   by an index, th
a870: 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  e original.  ** 
a880: 42 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20  BETWEEN term is 
a890: 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20  skipped..  */.  
a8a0: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
a8b0: 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26  op==TK_BETWEEN &
a8c0: 26 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e  & pWC->op==TK_AN
a8d0: 44 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  D ){.    ExprLis
a8e0: 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
a8f0: 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69  ->x.pList;.    i
a900: 6e 74 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63  nt i;.    static
a910: 20 63 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20   const u8 ops[] 
a920: 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d  = {TK_GE, TK_LE}
a930: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
a940: 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  ist!=0 );.    as
a950: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
a960: 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72  pr==2 );.    for
a970: 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b  (i=0; i<2; i++){
a980: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
a990: 77 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74  wExpr;.      int
a9a0: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 70   idxNew;.      p
a9b0: 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
a9c0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 6f  3PExpr(pParse, o
a9d0: 70 73 5b 69 5d 2c 20 0a 20 20 20 20 20 20 20 20  ps[i], .        
a9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9f0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
aa00: 44 75 70 28 64 62 2c 20 70 45 78 70 72 2d 3e 70  Dup(db, pExpr->p
aa10: 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20  Left, 0),.      
aa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
aa40: 70 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d  prDup(db, pList-
aa50: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c  >a[i].pExpr, 0),
aa60: 20 30 29 3b 0a 20 20 20 20 20 20 74 72 61 6e 73   0);.      trans
aa70: 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28  ferJoinMarkings(
aa80: 70 4e 65 77 45 78 70 72 2c 20 70 45 78 70 72 29  pNewExpr, pExpr)
aa90: 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d  ;.      idxNew =
aaa0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
aab0: 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
aac0: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
aad0: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
aae0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64      testcase( id
aaf0: 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20  xNew==0 );.     
ab00: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
ab10: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b  c, pWC, idxNew);
ab20: 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26  .      pTerm = &
ab30: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
ab40: 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64  .      pWC->a[id
ab50: 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20  xNew].iParent = 
ab60: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20  idxTerm;.    }. 
ab70: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
ab80: 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 2;.  }.#endif
ab90: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
aba0: 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41  BETWEEN_OPTIMIZA
abb0: 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64 65  TION */..#if !de
abc0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
abd0: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
abe0: 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  N) && !defined(S
abf0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
ac00: 45 52 59 29 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a  ERY).  /* Analyz
ac10: 65 20 61 20 74 65 72 6d 20 74 68 61 74 20 69 73  e a term that is
ac20: 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20 74 77 6f   composed of two
ac30: 20 6f 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d   or more subterm
ac40: 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20  s connected by. 
ac50: 20 2a 2a 20 61 6e 20 4f 52 20 6f 70 65 72 61 74   ** an OR operat
ac60: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  or..  */.  else 
ac70: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
ac80: 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 61 73 73 65  K_OR ){.    asse
ac90: 72 74 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f  rt( pWC->op==TK_
aca0: 41 4e 44 20 29 3b 0a 20 20 20 20 65 78 70 72 41  AND );.    exprA
acb0: 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 70 53 72  nalyzeOrTerm(pSr
acc0: 63 2c 20 70 57 43 2c 20 69 64 78 54 65 72 6d 29  c, pWC, idxTerm)
acd0: 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70  ;.    pTerm = &p
ace0: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
acf0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
ad00: 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
ad10: 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69  IMIZATION */..#i
ad20: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ad30: 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54  T_LIKE_OPTIMIZAT
ad40: 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e  ION.  /* Add con
ad50: 73 74 72 61 69 6e 74 73 20 74 6f 20 72 65 64 75  straints to redu
ad60: 63 65 20 74 68 65 20 73 65 61 72 63 68 20 73 70  ce the search sp
ad70: 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72  ace on a LIKE or
ad80: 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61   GLOB.  ** opera
ad90: 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  tor..  **.  ** A
ada0: 20 6c 69 6b 65 20 70 61 74 74 65 72 6e 20 6f 66   like pattern of
adb0: 20 74 68 65 20 66 6f 72 6d 20 22 78 20 4c 49 4b   the form "x LIK
adc0: 45 20 27 61 62 63 25 27 22 20 69 73 20 63 68 61  E 'abc%'" is cha
add0: 6e 67 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74 72  nged into constr
ade0: 61 69 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20  aints.  **.  ** 
adf0: 20 20 20 20 20 20 20 20 20 78 3e 3d 27 61 62 63           x>='abc
ae00: 27 20 41 4e 44 20 78 3c 27 61 62 64 27 20 41 4e  ' AND x<'abd' AN
ae10: 44 20 78 20 4c 49 4b 45 20 27 61 62 63 25 27 0a  D x LIKE 'abc%'.
ae20: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 61    **.  ** The la
ae30: 73 74 20 63 68 61 72 61 63 74 65 72 20 6f 66 20  st character of 
ae40: 74 68 65 20 70 72 65 66 69 78 20 22 61 62 63 22  the prefix "abc"
ae50: 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
ae60: 74 6f 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a 2a  to form the.  **
ae70: 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e   termination con
ae80: 64 69 74 69 6f 6e 20 22 61 62 64 22 2e 0a 20 20  dition "abd"..  
ae90: 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f 70  */.  if( pWC->op
aea0: 3d 3d 54 4b 5f 41 4e 44 20 0a 20 20 20 26 26 20  ==TK_AND .   && 
aeb0: 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 50 61  isLikeOrGlob(pPa
aec0: 72 73 65 2c 20 70 45 78 70 72 2c 20 26 70 53 74  rse, pExpr, &pSt
aed0: 72 31 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c  r1, &isComplete,
aee0: 20 26 6e 6f 43 61 73 65 29 0a 20 20 29 7b 0a 20   &noCase).  ){. 
aef0: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20     Expr *pLeft; 
af00: 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66 20        /* LHS of 
af10: 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74  LIKE/GLOB operat
af20: 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a  or */.    Expr *
af30: 70 53 74 72 32 3b 20 20 20 20 20 20 20 2f 2a 20  pStr2;       /* 
af40: 43 6f 70 79 20 6f 66 20 70 53 74 72 31 20 2d 20  Copy of pStr1 - 
af50: 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42  RHS of LIKE/GLOB
af60: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
af70: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 31   Expr *pNewExpr1
af80: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  ;.    Expr *pNew
af90: 45 78 70 72 32 3b 0a 20 20 20 20 69 6e 74 20 69  Expr2;.    int i
afa0: 64 78 4e 65 77 31 3b 0a 20 20 20 20 69 6e 74 20  dxNew1;.    int 
afb0: 69 64 78 4e 65 77 32 3b 0a 20 20 20 20 54 6f 6b  idxNew2;.    Tok
afc0: 65 6e 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 3b  en sCollSeqName;
afd0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c    /* Name of col
afe0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
aff0: 2a 2f 0a 0a 20 20 20 20 70 4c 65 66 74 20 3d 20  */..    pLeft = 
b000: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
b010: 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[1].pExpr;.    
b020: 70 53 74 72 32 20 3d 20 73 71 6c 69 74 65 33 45  pStr2 = sqlite3E
b030: 78 70 72 44 75 70 28 64 62 2c 20 70 53 74 72 31  xprDup(db, pStr1
b040: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21 64  , 0);.    if( !d
b050: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
b060: 29 7b 0a 20 20 20 20 20 20 75 38 20 63 2c 20 2a  ){.      u8 c, *
b070: 70 43 3b 20 20 20 20 20 20 20 2f 2a 20 4c 61 73  pC;       /* Las
b080: 74 20 63 68 61 72 61 63 74 65 72 20 62 65 66 6f  t character befo
b090: 72 65 20 74 68 65 20 66 69 72 73 74 20 77 69 6c  re the first wil
b0a0: 64 63 61 72 64 20 2a 2f 0a 20 20 20 20 20 20 70  dcard */.      p
b0b0: 43 20 3d 20 28 75 38 2a 29 26 70 53 74 72 32 2d  C = (u8*)&pStr2-
b0c0: 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71 6c 69 74 65  >u.zToken[sqlite
b0d0: 33 53 74 72 6c 65 6e 33 30 28 70 53 74 72 32 2d  3Strlen30(pStr2-
b0e0: 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31 5d 3b 0a 20  >u.zToken)-1];. 
b0f0: 20 20 20 20 20 63 20 3d 20 2a 70 43 3b 0a 20 20       c = *pC;.  
b100: 20 20 20 20 69 66 28 20 6e 6f 43 61 73 65 20 29      if( noCase )
b110: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
b120: 20 70 6f 69 6e 74 20 69 73 20 74 6f 20 69 6e 63   point is to inc
b130: 72 65 6d 65 6e 74 20 74 68 65 20 6c 61 73 74 20  rement the last 
b140: 63 68 61 72 61 63 74 65 72 20 62 65 66 6f 72 65  character before
b150: 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20   the first.     
b160: 20 20 20 2a 2a 20 77 69 6c 64 63 61 72 64 2e 20     ** wildcard. 
b170: 20 42 75 74 20 69 66 20 77 65 20 69 6e 63 72 65   But if we incre
b180: 6d 65 6e 74 20 27 40 27 2c 20 74 68 61 74 20 77  ment '@', that w
b190: 69 6c 6c 20 70 75 73 68 20 69 74 20 69 6e 74 6f  ill push it into
b1a0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
b1b0: 61 6c 70 68 61 62 65 74 69 63 20 72 61 6e 67 65  alphabetic range
b1c0: 20 77 68 65 72 65 20 63 61 73 65 20 63 6f 6e 76   where case conv
b1d0: 65 72 73 69 6f 6e 73 20 77 69 6c 6c 20 6d 65 73  ersions will mes
b1e0: 73 20 75 70 20 74 68 65 20 0a 20 20 20 20 20 20  s up the .      
b1f0: 20 20 2a 2a 20 69 6e 65 71 75 61 6c 69 74 79 2e    ** inequality.
b200: 20 20 54 6f 20 61 76 6f 69 64 20 74 68 69 73 2c    To avoid this,
b210: 20 6d 61 6b 65 20 73 75 72 65 20 74 6f 20 61 6c   make sure to al
b220: 73 6f 20 72 75 6e 20 74 68 65 20 66 75 6c 6c 0a  so run the full.
b230: 20 20 20 20 20 20 20 20 2a 2a 20 4c 49 4b 45 20          ** LIKE 
b240: 6f 6e 20 61 6c 6c 20 63 61 6e 64 69 64 61 74 65  on all candidate
b250: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 62 79 20   expressions by 
b260: 63 6c 65 61 72 69 6e 67 20 74 68 65 20 69 73 43  clearing the isC
b270: 6f 6d 70 6c 65 74 65 20 66 6c 61 67 0a 20 20 20  omplete flag.   
b280: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
b290: 69 66 28 20 63 3d 3d 27 41 27 2d 31 20 29 20 69  if( c=='A'-1 ) i
b2a0: 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 0a 20  sComplete = 0;. 
b2b0: 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
b2c0: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63  e3UpperToLower[c
b2d0: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
b2e0: 20 2a 70 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20   *pC = c + 1;.  
b2f0: 20 20 7d 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71    }.    sCollSeq
b300: 4e 61 6d 65 2e 7a 20 3d 20 6e 6f 43 61 73 65 20  Name.z = noCase 
b310: 3f 20 22 4e 4f 43 41 53 45 22 20 3a 20 22 42 49  ? "NOCASE" : "BI
b320: 4e 41 52 59 22 3b 0a 20 20 20 20 73 43 6f 6c 6c  NARY";.    sColl
b330: 53 65 71 4e 61 6d 65 2e 6e 20 3d 20 36 3b 0a 20  SeqName.n = 6;. 
b340: 20 20 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73     pNewExpr1 = s
b350: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
b360: 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20  , pLeft, 0);.   
b370: 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c   pNewExpr1 = sql
b380: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
b390: 2c 20 54 4b 5f 47 45 2c 20 0a 20 20 20 20 20 20  , TK_GE, .      
b3a0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
b3b0: 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28  AddCollateToken(
b3c0: 70 50 61 72 73 65 2c 70 4e 65 77 45 78 70 72 31  pParse,pNewExpr1
b3d0: 2c 26 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c  ,&sCollSeqName),
b3e0: 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 74 72  .           pStr
b3f0: 31 2c 20 30 29 3b 0a 20 20 20 20 74 72 61 6e 73  1, 0);.    trans
b400: 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28  ferJoinMarkings(
b410: 70 4e 65 77 45 78 70 72 31 2c 20 70 45 78 70 72  pNewExpr1, pExpr
b420: 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 31 20 3d  );.    idxNew1 =
b430: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
b440: 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
b450: 31 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  1, TERM_VIRTUAL|
b460: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
b470: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78     testcase( idx
b480: 4e 65 77 31 3d 3d 30 20 29 3b 0a 20 20 20 20 65  New1==0 );.    e
b490: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
b4a0: 20 70 57 43 2c 20 69 64 78 4e 65 77 31 29 3b 0a   pWC, idxNew1);.
b4b0: 20 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20      pNewExpr2 = 
b4c0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
b4d0: 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20  b, pLeft, 0);.  
b4e0: 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71    pNewExpr2 = sq
b4f0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
b500: 65 2c 20 54 4b 5f 4c 54 2c 0a 20 20 20 20 20 20  e, TK_LT,.      
b510: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
b520: 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28  AddCollateToken(
b530: 70 50 61 72 73 65 2c 70 4e 65 77 45 78 70 72 32  pParse,pNewExpr2
b540: 2c 26 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c  ,&sCollSeqName),
b550: 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 74 72  .           pStr
b560: 32 2c 20 30 29 3b 0a 20 20 20 20 74 72 61 6e 73  2, 0);.    trans
b570: 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28  ferJoinMarkings(
b580: 70 4e 65 77 45 78 70 72 32 2c 20 70 45 78 70 72  pNewExpr2, pExpr
b590: 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 32 20 3d  );.    idxNew2 =
b5a0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
b5b0: 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
b5c0: 32 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  2, TERM_VIRTUAL|
b5d0: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
b5e0: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78     testcase( idx
b5f0: 4e 65 77 32 3d 3d 30 20 29 3b 0a 20 20 20 20 65  New2==0 );.    e
b600: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
b610: 20 70 57 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a   pWC, idxNew2);.
b620: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
b630: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
b640: 20 20 69 66 28 20 69 73 43 6f 6d 70 6c 65 74 65    if( isComplete
b650: 20 29 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61   ){.      pWC->a
b660: 5b 69 64 78 4e 65 77 31 5d 2e 69 50 61 72 65 6e  [idxNew1].iParen
b670: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
b680: 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77     pWC->a[idxNew
b690: 32 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  2].iParent = idx
b6a0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72  Term;.      pTer
b6b0: 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20  m->nChild = 2;. 
b6c0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
b6d0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  /* SQLITE_OMIT_L
b6e0: 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IKE_OPTIMIZATION
b6f0: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
b700: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
b710: 54 41 42 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61  TABLE.  /* Add a
b720: 20 57 4f 5f 4d 41 54 43 48 20 61 75 78 69 6c 69   WO_MATCH auxili
b730: 61 72 79 20 74 65 72 6d 20 74 6f 20 74 68 65 20  ary term to the 
b740: 63 6f 6e 73 74 72 61 69 6e 74 20 73 65 74 20 69  constraint set i
b750: 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  f the.  ** curre
b760: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  nt expression is
b770: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 63   of the form:  c
b780: 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72  olumn MATCH expr
b790: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f  ..  ** This info
b7a0: 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
b7b0: 62 79 20 74 68 65 20 78 42 65 73 74 49 6e 64 65  by the xBestInde
b7c0: 78 20 6d 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a  x methods of.  *
b7d0: 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  * virtual tables
b7e0: 2e 20 20 54 68 65 20 6e 61 74 69 76 65 20 71 75  .  The native qu
b7f0: 65 72 79 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f  ery optimizer do
b800: 65 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20  es not attempt. 
b810: 20 2a 2a 20 74 6f 20 64 6f 20 61 6e 79 74 68 69   ** to do anythi
b820: 6e 67 20 77 69 74 68 20 4d 41 54 43 48 20 66 75  ng with MATCH fu
b830: 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  nctions..  */.  
b840: 69 66 28 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c  if( isMatchOfCol
b850: 75 6d 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20  umn(pExpr) ){.  
b860: 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20    int idxNew;.  
b870: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
b880: 2a 70 4c 65 66 74 3b 0a 20 20 20 20 57 68 65 72  *pLeft;.    Wher
b890: 65 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b  eTerm *pNewTerm;
b8a0: 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 70 72 65  .    Bitmask pre
b8b0: 72 65 71 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65  reqColumn, prere
b8c0: 71 45 78 70 72 3b 0a 0a 20 20 20 20 70 52 69 67  qExpr;..    pRig
b8d0: 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ht = pExpr->x.pL
b8e0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
b8f0: 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78  .    pLeft = pEx
b900: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31  pr->x.pList->a[1
b910: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 72 65  ].pExpr;.    pre
b920: 72 65 71 45 78 70 72 20 3d 20 65 78 70 72 54 61  reqExpr = exprTa
b930: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
b940: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  t, pRight);.    
b950: 70 72 65 72 65 71 43 6f 6c 75 6d 6e 20 3d 20 65  prereqColumn = e
b960: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
b970: 61 73 6b 53 65 74 2c 20 70 4c 65 66 74 29 3b 0a  askSet, pLeft);.
b980: 20 20 20 20 69 66 28 20 28 70 72 65 72 65 71 45      if( (prereqE
b990: 78 70 72 20 26 20 70 72 65 72 65 71 43 6f 6c 75  xpr & prereqColu
b9a0: 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mn)==0 ){.      
b9b0: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a  Expr *pNewExpr;.
b9c0: 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d        pNewExpr =
b9d0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
b9e0: 61 72 73 65 2c 20 54 4b 5f 4d 41 54 43 48 2c 20  arse, TK_MATCH, 
b9f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ba00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
ba10: 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  , sqlite3ExprDup
ba20: 28 64 62 2c 20 70 52 69 67 68 74 2c 20 30 29 2c  (db, pRight, 0),
ba30: 20 30 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65   0);.      idxNe
ba40: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
ba50: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45  nsert(pWC, pNewE
ba60: 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  xpr, TERM_VIRTUA
ba70: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
ba80: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
ba90: 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20   idxNew==0 );.  
baa0: 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26      pNewTerm = &
bab0: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
bac0: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
bad0: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72  prereqRight = pr
bae0: 65 72 65 71 45 78 70 72 3b 0a 20 20 20 20 20 20  ereqExpr;.      
baf0: 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75  pNewTerm->leftCu
bb00: 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54  rsor = pLeft->iT
bb10: 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77  able;.      pNew
bb20: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
bb30: 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  mn = pLeft->iCol
bb40: 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  umn;.      pNewT
bb50: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
bb60: 20 57 4f 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20   WO_MATCH;.     
bb70: 20 70 4e 65 77 54 65 72 6d 2d 3e 69 50 61 72 65   pNewTerm->iPare
bb80: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
bb90: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
bba0: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
bbb0: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
bbc0: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 65  d = 1;.      pTe
bbd0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
bbe0: 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20  ERM_COPIED;.    
bbf0: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72    pNewTerm->prer
bc00: 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70  eqAll = pTerm->p
bc10: 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a  rereqAll;.    }.
bc20: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
bc30: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
bc40: 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65  LTABLE */..#ifde
bc50: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
bc60: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
bc70: 20 2f 2a 20 57 68 65 6e 20 73 71 6c 69 74 65 5f   /* When sqlite_
bc80: 73 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20  stat3 histogram 
bc90: 64 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c  data is availabl
bca0: 65 20 61 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66  e an operator of
bcb0: 20 74 68 65 0a 20 20 2a 2a 20 66 6f 72 6d 20 22   the.  ** form "
bcc0: 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 63  x IS NOT NULL" c
bcd0: 61 6e 20 73 6f 6d 65 74 69 6d 65 73 20 62 65 20  an sometimes be 
bce0: 65 76 61 6c 75 61 74 65 64 20 6d 6f 72 65 20 65  evaluated more e
bcf0: 66 66 69 63 69 65 6e 74 6c 79 0a 20 20 2a 2a 20  fficiently.  ** 
bd00: 61 73 20 22 78 3e 4e 55 4c 4c 22 20 69 66 20 78  as "x>NULL" if x
bd10: 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47   is not an INTEG
bd20: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20  ER PRIMARY KEY. 
bd30: 20 53 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 0a   So construct a.
bd40: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 65 72    ** virtual ter
bd50: 6d 20 6f 66 20 74 68 61 74 20 66 6f 72 6d 2e 0a  m of that form..
bd60: 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74    **.  ** Note t
bd70: 68 61 74 20 74 68 65 20 76 69 72 74 75 61 6c 20  hat the virtual 
bd80: 74 65 72 6d 20 6d 75 73 74 20 62 65 20 74 61 67  term must be tag
bd90: 67 65 64 20 77 69 74 68 20 54 45 52 4d 5f 56 4e  ged with TERM_VN
bda0: 55 4c 4c 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  ULL.  This.  ** 
bdb0: 54 45 52 4d 5f 56 4e 55 4c 4c 20 74 61 67 20 77  TERM_VNULL tag w
bdc0: 69 6c 6c 20 73 75 70 70 72 65 73 73 20 74 68 65  ill suppress the
bdd0: 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20   not-null check 
bde0: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
bdf0: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f  .  ** of the loo
be00: 70 2e 20 20 57 69 74 68 6f 75 74 20 74 68 65 20  p.  Without the 
be10: 54 45 52 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c  TERM_VNULL flag,
be20: 20 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68   the not-null ch
be30: 65 63 6b 20 61 74 0a 20 20 2a 2a 20 74 68 65 20  eck at.  ** the 
be40: 73 74 61 72 74 20 6f 66 20 74 68 65 20 6c 6f 6f  start of the loo
be50: 70 20 77 69 6c 6c 20 70 72 65 76 65 6e 74 20 61  p will prevent a
be60: 6e 79 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  ny results from 
be70: 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a  being returned..
be80: 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72    */.  if( pExpr
be90: 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ->op==TK_NOTNULL
bea0: 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c  .   && pExpr->pL
beb0: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  eft->op==TK_COLU
bec0: 4d 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e  MN.   && pExpr->
bed0: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pLeft->iColumn>=
bee0: 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61  0.   && Optimiza
bef0: 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
bf00: 53 51 4c 49 54 45 5f 53 74 61 74 33 29 0a 20 20  SQLITE_Stat3).  
bf10: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  ){.    Expr *pNe
bf20: 77 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20  wExpr;.    Expr 
bf30: 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
bf40: 70 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74 20 69  pLeft;.    int i
bf50: 64 78 4e 65 77 3b 0a 20 20 20 20 57 68 65 72 65  dxNew;.    Where
bf60: 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a  Term *pNewTerm;.
bf70: 0a 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20  .    pNewExpr = 
bf80: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
bf90: 72 73 65 2c 20 54 4b 5f 47 54 2c 0a 20 20 20 20  rse, TK_GT,.    
bfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
bfc0: 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74  xprDup(db, pLeft
bfd0: 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  , 0),.          
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bff0: 20 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70    sqlite3PExpr(p
c000: 50 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20  Parse, TK_NULL, 
c010: 30 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a 0a 20  0, 0, 0), 0);.. 
c020: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
c030: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
c040: 43 2c 20 70 4e 65 77 45 78 70 72 2c 0a 20 20 20  C, pNewExpr,.   
c050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c060: 20 20 20 20 20 20 20 20 20 20 20 54 45 52 4d 5f             TERM_
c070: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
c080: 41 4d 49 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29  AMIC|TERM_VNULL)
c090: 3b 0a 20 20 20 20 69 66 28 20 69 64 78 4e 65 77  ;.    if( idxNew
c0a0: 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 54 65   ){.      pNewTe
c0b0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
c0c0: 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  New];.      pNew
c0d0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
c0e0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65  t = 0;.      pNe
c0f0: 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  wTerm->leftCurso
c100: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
c110: 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  e;.      pNewTer
c120: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20  m->u.leftColumn 
c130: 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  = pLeft->iColumn
c140: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
c150: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f  ->eOperator = WO
c160: 5f 47 54 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  _GT;.      pNewT
c170: 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69  erm->iParent = i
c180: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54  dxTerm;.      pT
c190: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
c1a0: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54  xTerm];.      pT
c1b0: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
c1c0: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  .      pTerm->wt
c1d0: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
c1e0: 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77  PIED;.      pNew
c1f0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
c200: 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  = pTerm->prereqA
c210: 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ll;.    }.  }.#e
c220: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
c230: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
c240: 54 41 54 34 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72  TAT4 */..  /* Pr
c250: 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75 73 65 20  event ON clause 
c260: 74 65 72 6d 73 20 6f 66 20 61 20 4c 45 46 54 20  terms of a LEFT 
c270: 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69 6e 67 20  JOIN from being 
c280: 75 73 65 64 20 74 6f 20 64 72 69 76 65 0a 20 20  used to drive.  
c290: 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20  ** an index for 
c2a0: 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65  tables to the le
c2b0: 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a  ft of the join..
c2c0: 20 20 2a 2f 0a 20 20 70 54 65 72 6d 2d 3e 70 72    */.  pTerm->pr
c2d0: 65 72 65 71 52 69 67 68 74 20 7c 3d 20 65 78 74  ereqRight |= ext
c2e0: 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  raRight;.}../*.*
c2f0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
c300: 73 65 61 72 63 68 65 73 20 70 4c 69 73 74 20 66  searches pList f
c310: 6f 72 20 61 20 65 6e 74 72 79 20 74 68 61 74 20  or a entry that 
c320: 6d 61 74 63 68 65 73 20 74 68 65 20 69 43 6f 6c  matches the iCol
c330: 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66  -th column.** of
c340: 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a   index pIdx..**.
c350: 2a 2a 20 49 66 20 73 75 63 68 20 61 6e 20 65 78  ** If such an ex
c360: 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e  pression is foun
c370: 64 2c 20 69 74 73 20 69 6e 64 65 78 20 69 6e 20  d, its index in 
c380: 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65  pList->a[] is re
c390: 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f  turned. If.** no
c3a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
c3b0: 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72 65 74 75  ound, -1 is retu
c3c0: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
c3d0: 69 6e 74 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c  int findIndexCol
c3e0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
c3f0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
c400: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
c410: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
c420: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
c430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
c440: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20  ression list to 
c450: 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20  search */.  int 
c460: 69 42 61 73 65 2c 20 20 20 20 20 20 20 20 20 20  iBase,          
c470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
c480: 75 72 73 6f 72 20 66 6f 72 20 74 61 62 6c 65 20  ursor for table 
c490: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
c4a0: 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20  pIdx */.  Index 
c4b0: 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  *pIdx,          
c4c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
c4d0: 65 78 20 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75  ex to match colu
c4e0: 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69  mn of */.  int i
c4f0: 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  Col             
c500: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
c510: 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f  lumn of index to
c520: 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69   match */.){.  i
c530: 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt i;.  const ch
c540: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78  ar *zColl = pIdx
c550: 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a  ->azColl[iCol];.
c560: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
c570: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
c580: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
c590: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
c5a0: 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b  ollate(pList->a[
c5b0: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  i].pExpr);.    i
c5c0: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  f( p->op==TK_COL
c5d0: 55 4d 4e 0a 20 20 20 20 20 26 26 20 70 2d 3e 69  UMN.     && p->i
c5e0: 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69  Column==pIdx->ai
c5f0: 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20  Column[iCol].   
c600: 20 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d    && p->iTable==
c610: 69 42 61 73 65 0a 20 20 20 20 29 7b 0a 20 20 20  iBase.    ){.   
c620: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
c630: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
c640: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
c650: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
c660: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  );.      if( ALW
c670: 41 59 53 28 70 43 6f 6c 6c 29 20 26 26 20 30 3d  AYS(pColl) && 0=
c680: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
c690: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43  pColl->zName, zC
c6a0: 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  oll) ){.        
c6b0: 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 20 20  return i;.      
c6c0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
c6d0: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
c6e0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
c6f0: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 65  f the DISTINCT e
c700: 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70  xpression-list p
c710: 61 73 73 65 64 20 61 73 20 74 68 65 20 74 68 69  assed as the thi
c720: 72 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  rd argument.** i
c730: 73 20 72 65 64 75 6e 64 61 6e 74 2e 0a 2a 2a 0a  s redundant..**.
c740: 2a 2a 20 41 20 44 49 53 54 49 4e 43 54 20 6c 69  ** A DISTINCT li
c750: 73 74 20 69 73 20 72 65 64 75 6e 64 61 6e 74 20  st is redundant 
c760: 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
c770: 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 73 75  contains some su
c780: 62 73 65 74 20 6f 66 0a 2a 2a 20 63 6f 6c 75 6d  bset of.** colum
c790: 6e 73 20 74 68 61 74 20 61 72 65 20 75 6e 69 71  ns that are uniq
c7a0: 75 65 20 61 6e 64 20 6e 6f 6e 2d 6e 75 6c 6c 2e  ue and non-null.
c7b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
c7c0: 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61  sDistinctRedunda
c7d0: 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
c7e0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
c7f0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
c800: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
c810: 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
c820: 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
c830: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
c840: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
c850: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
c860: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
c870: 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74  rList *pDistinct
c880: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
c890: 73 75 6c 74 20 73 65 74 20 74 68 61 74 20 6e 65  sult set that ne
c8a0: 65 64 73 20 74 6f 20 62 65 20 44 49 53 54 49 4e  eds to be DISTIN
c8b0: 43 54 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  CT */.){.  Table
c8c0: 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20   *pTab;.  Index 
c8d0: 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20  *pIdx;.  int i; 
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8f0: 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20           .  int 
c900: 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  iBase;..  /* If 
c910: 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74 68  there is more th
c920: 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20  an one table or 
c930: 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 20 74 68  sub-select in th
c940: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
c950: 0a 20 20 2a 2a 20 74 68 69 73 20 71 75 65 72 79  .  ** this query
c960: 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e  , then it will n
c970: 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ot be possible t
c980: 6f 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20  o show that the 
c990: 44 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63  DISTINCT .  ** c
c9a0: 6c 61 75 73 65 20 69 73 20 72 65 64 75 6e 64 61  lause is redunda
c9b0: 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  nt. */.  if( pTa
c9c0: 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29  bList->nSrc!=1 )
c9d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 42 61   return 0;.  iBa
c9e0: 73 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  se = pTabList->a
c9f0: 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70  [0].iCursor;.  p
ca00: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
ca10: 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a  a[0].pTab;..  /*
ca20: 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65   If any of the e
ca30: 78 70 72 65 73 73 69 6f 6e 73 20 69 73 20 61 6e  xpressions is an
ca40: 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74   IPK column on t
ca50: 61 62 6c 65 20 69 42 61 73 65 2c 20 74 68 65 6e  able iBase, then
ca60: 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72   return .  ** tr
ca70: 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28 70  ue. Note: The (p
ca80: 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 29  ->iTable==iBase)
ca90: 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 65   part of this te
caa0: 73 74 20 6d 61 79 20 62 65 20 66 61 6c 73 65 20  st may be false 
cab0: 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  if the.  ** curr
cac0: 65 6e 74 20 53 45 4c 45 43 54 20 69 73 20 61 20  ent SELECT is a 
cad0: 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d 71  correlated sub-q
cae0: 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
caf0: 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e 63  (i=0; i<pDistinc
cb00: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
cb10: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
cb20: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
cb30: 6c 61 74 65 28 70 44 69 73 74 69 6e 63 74 2d 3e  late(pDistinct->
cb40: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
cb50: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
cb60: 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62  OLUMN && p->iTab
cb70: 6c 65 3d 3d 69 42 61 73 65 20 26 26 20 70 2d 3e  le==iBase && p->
cb80: 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75  iColumn<0 ) retu
cb90: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
cba0: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
cbb0: 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20   indices on the 
cbc0: 74 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e 67 20  table, checking 
cbd0: 65 61 63 68 20 74 6f 20 73 65 65 20 69 66 20 69  each to see if i
cbe0: 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74 68 65  t makes.  ** the
cbf0: 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66   DISTINCT qualif
cc00: 69 65 72 20 72 65 64 75 6e 64 61 6e 74 2e 20 49  ier redundant. I
cc10: 74 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a 20 20  t does so if:.  
cc20: 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54 68 65  **.  **   1. The
cc30: 20 69 6e 64 65 78 20 69 73 20 69 74 73 65 6c 66   index is itself
cc40: 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20 20 2a   UNIQUE, and.  *
cc50: 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c 6c 20  *.  **   2. All 
cc60: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69  of the columns i
cc70: 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72 65 20  n the index are 
cc80: 65 69 74 68 65 72 20 70 61 72 74 20 6f 66 20 74  either part of t
cc90: 68 65 20 70 44 69 73 74 69 6e 63 74 0a 20 20 2a  he pDistinct.  *
cca0: 2a 20 20 20 20 20 20 6c 69 73 74 2c 20 6f 72 20  *      list, or 
ccb0: 65 6c 73 65 20 74 68 65 20 57 48 45 52 45 20 63  else the WHERE c
ccc0: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61  lause contains a
ccd0: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72   term of the for
cce0: 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20  m "col=X",.  ** 
ccf0: 20 20 20 20 20 77 68 65 72 65 20 58 20 69 73 20       where X is 
cd00: 61 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65  a constant value
cd10: 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  . The collation 
cd20: 73 65 71 75 65 6e 63 65 73 20 6f 66 20 74 68 65  sequences of the
cd30: 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d 70 61  .  **      compa
cd40: 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74  rison and select
cd50: 2d 6c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e  -list expression
cd60: 73 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 6f  s must match tho
cd70: 73 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  se of the index.
cd80: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e 20  .  **.  **   3. 
cd90: 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69 6e 64  All of those ind
cda0: 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77  ex columns for w
cdb0: 68 69 63 68 20 74 68 65 20 57 48 45 52 45 20 63  hich the WHERE c
cdc0: 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 0a 20  lause does not. 
cdd0: 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e   **      contain
cde0: 20 61 20 22 63 6f 6c 3d 58 22 20 74 65 72 6d 20   a "col=X" term 
cdf0: 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20 61  are subject to a
ce00: 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72   NOT NULL constr
ce10: 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  aint..  */.  for
ce20: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
ce30: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
ce40: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
ce50: 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72   if( pIdx->onErr
ce60: 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20 63 6f  or==OE_None ) co
ce70: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28  ntinue;.    for(
ce80: 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65  i=0; i<pIdx->nKe
ce90: 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  yCol; i++){.    
cea0: 20 20 69 31 36 20 69 43 6f 6c 20 3d 20 70 49 64    i16 iCol = pId
ceb0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  x->aiColumn[i];.
cec0: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 66 69 6e        if( 0==fin
ced0: 64 54 65 72 6d 28 70 57 43 2c 20 69 42 61 73 65  dTerm(pWC, iBase
cee0: 2c 20 69 43 6f 6c 2c 20 7e 28 42 69 74 6d 61 73  , iCol, ~(Bitmas
cef0: 6b 29 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78  k)0, WO_EQ, pIdx
cf00: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ) ){.        int
cf10: 20 69 49 64 78 43 6f 6c 20 3d 20 66 69 6e 64 49   iIdxCol = findI
cf20: 6e 64 65 78 43 6f 6c 28 70 50 61 72 73 65 2c 20  ndexCol(pParse, 
cf30: 70 44 69 73 74 69 6e 63 74 2c 20 69 42 61 73 65  pDistinct, iBase
cf40: 2c 20 70 49 64 78 2c 20 69 29 3b 0a 20 20 20 20  , pIdx, i);.    
cf50: 20 20 20 20 69 66 28 20 69 49 64 78 43 6f 6c 3c      if( iIdxCol<
cf60: 30 20 7c 7c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  0 || pTab->aCol[
cf70: 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30  iCol].notNull==0
cf80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72   ){.          br
cf90: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
cfa0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
cfb0: 20 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 4b   if( i==pIdx->nK
cfc0: 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 2f  eyCol ){.      /
cfd0: 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 6d 70  * This index imp
cfe0: 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 44 49  lies that the DI
cff0: 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72  STINCT qualifier
d000: 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a   is redundant. *
d010: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  /.      return 1
d020: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
d030: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
d040: 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
d050: 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65  logarithm of the
d060: 20 69 6e 70 75 74 20 76 61 6c 75 65 20 74 6f 20   input value to 
d070: 62 61 73 65 20 32 2e 0a 2a 2f 0a 73 74 61 74 69  base 2..*/.stati
d080: 63 20 4c 6f 67 45 73 74 20 65 73 74 4c 6f 67 28  c LogEst estLog(
d090: 4c 6f 67 45 73 74 20 4e 29 7b 0a 20 20 72 65 74  LogEst N){.  ret
d0a0: 75 72 6e 20 4e 3c 3d 31 30 20 3f 20 30 20 3a 20  urn N<=10 ? 0 : 
d0b0: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 4e 29  sqlite3LogEst(N)
d0c0: 20 2d 20 33 33 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   - 33;.}../*.** 
d0d0: 54 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72  Two routines for
d0e0: 20 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f   printing the co
d0f0: 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69  ntent of an sqli
d100: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a  te3_index_info.*
d110: 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 55 73  * structure.  Us
d120: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
d130: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
d140: 79 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a  y.  If neither.*
d150: 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72  * SQLITE_TEST or
d160: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72   SQLITE_DEBUG ar
d170: 65 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  e defined, then 
d180: 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a  these routines.*
d190: 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f  * are no-ops..*/
d1a0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
d1b0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
d1c0: 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e  LTABLE) && defin
d1d0: 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ed(WHERETRACE_EN
d1e0: 41 42 4c 45 44 29 0a 73 74 61 74 69 63 20 76 6f  ABLED).static vo
d1f0: 69 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50  id TRACE_IDX_INP
d200: 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65  UTS(sqlite3_inde
d210: 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e  x_info *p){.  in
d220: 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  t i;.  if( !sqli
d230: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20  te3WhereTrace ) 
d240: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
d250: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
d260: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  int; i++){.    s
d270: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
d280: 66 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b  f("  constraint[
d290: 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d  %d]: col=%d term
d2a0: 69 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62  id=%d op=%d usab
d2b0: 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  led=%d\n",.     
d2c0: 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61    i,.       p->a
d2d0: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43  Constraint[i].iC
d2e0: 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d  olumn,.       p-
d2f0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
d300: 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20  iTermOffset,.   
d310: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
d320: 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20  nt[i].op,.      
d330: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
d340: 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a  i].usable);.  }.
d350: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
d360: 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
d370: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
d380: 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62  Printf("  orderb
d390: 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65  y[%d]: col=%d de
d3a0: 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  sc=%d\n",.      
d3b0: 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f   i,.       p->aO
d3c0: 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d  rderBy[i].iColum
d3d0: 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72  n,.       p->aOr
d3e0: 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a  derBy[i].desc);.
d3f0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
d400: 64 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50  d TRACE_IDX_OUTP
d410: 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65  UTS(sqlite3_inde
d420: 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e  x_info *p){.  in
d430: 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  t i;.  if( !sqli
d440: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20  te3WhereTrace ) 
d450: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
d460: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
d470: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  int; i++){.    s
d480: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
d490: 66 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20  f("  usage[%d]: 
d4a0: 61 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d  argvIdx=%d omit=
d4b0: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c  %d\n",.       i,
d4c0: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
d4d0: 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61  traintUsage[i].a
d4e0: 72 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20  rgvIndex,.      
d4f0: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
d500: 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20  sage[i].omit);. 
d510: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75   }.  sqlite3Debu
d520: 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75  gPrintf("  idxNu
d530: 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e  m=%d\n", p->idxN
d540: 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  um);.  sqlite3De
d550: 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78  bugPrintf("  idx
d560: 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64  Str=%s\n", p->id
d570: 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  xStr);.  sqlite3
d580: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f  DebugPrintf("  o
d590: 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25  rderByConsumed=%
d5a0: 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79  d\n", p->orderBy
d5b0: 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c  Consumed);.  sql
d5c0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
d5d0: 22 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74  "  estimatedCost
d5e0: 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d  =%g\n", p->estim
d5f0: 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 73 71 6c  atedCost);.  sql
d600: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
d610: 22 20 20 65 73 74 69 6d 61 74 65 64 52 6f 77 73  "  estimatedRows
d620: 3d 25 6c 6c 64 5c 6e 22 2c 20 70 2d 3e 65 73 74  =%lld\n", p->est
d630: 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a 7d 0a 23  imatedRows);.}.#
d640: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41  else.#define TRA
d650: 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 41 29  CE_IDX_INPUTS(A)
d660: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49  .#define TRACE_I
d670: 44 58 5f 4f 55 54 50 55 54 53 28 41 29 0a 23 65  DX_OUTPUTS(A).#e
d680: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
d690: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
d6a0: 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20  TIC_INDEX./*.** 
d6b0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
d6c0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
d6d0: 74 65 72 6d 20 70 54 65 72 6d 20 69 73 20 6f 66  term pTerm is of
d6e0: 20 61 20 66 6f 72 6d 20 77 68 65 72 65 20 69 74   a form where it
d6f0: 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75 73 65  .** could be use
d700: 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20  d with an index 
d710: 74 6f 20 61 63 63 65 73 73 20 70 53 72 63 2c 20  to access pSrc, 
d720: 61 73 73 75 6d 69 6e 67 20 61 6e 20 61 70 70 72  assuming an appr
d730: 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65 78  opriate.** index
d740: 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74 61   existed..*/.sta
d750: 74 69 63 20 69 6e 74 20 74 65 72 6d 43 61 6e 44  tic int termCanD
d760: 72 69 76 65 49 6e 64 65 78 28 0a 20 20 57 68 65  riveIndex(.  Whe
d770: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20  reTerm *pTerm,  
d780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
d790: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
d7a0: 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 73   to check */.  s
d7b0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
d7c0: 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a  em *pSrc,     /*
d7d0: 20 54 61 62 6c 65 20 77 65 20 61 72 65 20 74 72   Table we are tr
d7e0: 79 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 2a  ying to access *
d7f0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
d800: 65 61 64 79 20 20 20 20 20 20 20 20 20 20 20 20  eady            
d810: 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e 20     /* Tables in 
d820: 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20 74  outer loops of t
d830: 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20  he join */.){.  
d840: 63 68 61 72 20 61 66 66 3b 0a 20 20 69 66 28 20  char aff;.  if( 
d850: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
d860: 72 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  r!=pSrc->iCursor
d870: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
d880: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
d890: 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 3d 3d 30  ator & WO_EQ)==0
d8a0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
d8b0: 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
d8c0: 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64  qRight & notRead
d8d0: 79 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30  y)!=0 ) return 0
d8e0: 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 75  ;.  if( pTerm->u
d8f0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3c 30 20 29 20  .leftColumn<0 ) 
d900: 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 66 66 20  return 0;.  aff 
d910: 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43  = pSrc->pTab->aC
d920: 6f 6c 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74  ol[pTerm->u.left
d930: 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79  Column].affinity
d940: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
d950: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28  IndexAffinityOk(
d960: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 66  pTerm->pExpr, af
d970: 66 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  f) ) return 0;. 
d980: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
d990: 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  dif...#ifndef SQ
d9a0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
d9b0: 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20  TIC_INDEX./*.** 
d9c0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
d9d0: 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49   construct the I
d9e0: 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20  ndex object for 
d9f0: 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
da00: 65 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74  ex.** and to set
da10: 20 75 70 20 74 68 65 20 57 68 65 72 65 4c 65 76   up the WhereLev
da20: 65 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c  el object pLevel
da30: 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 64   so that the cod
da40: 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d  e generator.** m
da50: 61 6b 65 73 20 75 73 65 20 6f 66 20 74 68 65 20  akes use of the 
da60: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e  automatic index.
da70: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
da80: 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74  constructAutomat
da90: 69 63 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  icIndex(.  Parse
daa0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
dab0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
dac0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
dad0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
dae0: 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pWC,           /
daf0: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
db00: 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
db10: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
db20: 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c,  /* The FROM 
db30: 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 67  clause term to g
db40: 65 74 20 74 68 65 20 6e 65 78 74 20 69 6e 64 65  et the next inde
db50: 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  x */.  Bitmask n
db60: 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20  otReady,        
db70: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75     /* Mask of cu
db80: 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
db90: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ot available */.
dba0: 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
dbb0: 65 76 65 6c 20 20 20 20 20 20 20 20 20 20 2f 2a  evel          /*
dbc0: 20 57 72 69 74 65 20 6e 65 77 20 69 6e 64 65 78   Write new index
dbd0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
dbe0: 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20  t nKeyCol;      
dbf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
dc00: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
dc10: 6e 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 65  n the constructe
dc20: 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65  d index */.  Whe
dc30: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
dc40: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
dc50: 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65  ngle term of the
dc60: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
dc70: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57  .  WhereTerm *pW
dc80: 43 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f  CEnd;          /
dc90: 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b  * End of pWC->a[
dca0: 5d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  ] */.  Index *pI
dcb0: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
dcc0: 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73     /* Object des
dcd0: 63 72 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e  cribing the tran
dce0: 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20  sient index */. 
dcf0: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dd10: 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
dd20: 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  nt under constru
dd30: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61  ction */.  int a
dd40: 64 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20  ddrInit;        
dd50: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
dd60: 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c  s of the initial
dd70: 69 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a  ization bypass j
dd80: 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ump */.  Table *
dd90: 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  pTable;         
dda0: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
ddb0: 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20  e being indexed 
ddc0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70  */.  int addrTop
ddd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dde0: 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69   /* Top of the i
ddf0: 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a  ndex fill loop *
de00: 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72  /.  int regRecor
de10: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
de20: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
de30: 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63  ing an index rec
de40: 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ord */.  int n; 
de50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de60: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63       /* Column c
de70: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
de80: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
de90: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
dea0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
deb0: 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20   mxBitCol;      
dec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
ded0: 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53  mum column in pS
dee0: 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20  rc->colUsed */. 
def0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
df00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
df10: 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
df20: 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d  ce to on a colum
df30: 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  n */.  WhereLoop
df40: 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
df50: 20 20 20 2f 2a 20 54 68 65 20 4c 6f 6f 70 20 6f     /* The Loop o
df60: 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20  bject */.  char 
df70: 2a 7a 4e 6f 74 55 73 65 64 3b 20 20 20 20 20 20  *zNotUsed;      
df80: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
df90: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 65 6e 64  space on the end
dfa0: 20 6f 66 20 70 49 64 78 20 2a 2f 0a 20 20 42 69   of pIdx */.  Bi
dfb0: 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20  tmask idxCols;  
dfc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
dfd0: 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75  map of columns u
dfe0: 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69 6e 67  sed for indexing
dff0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78   */.  Bitmask ex
e000: 74 72 61 43 6f 6c 73 3b 20 20 20 20 20 20 20 20  traCols;        
e010: 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 61    /* Bitmap of a
e020: 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
e030: 73 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74 57 61  s */.  u8 sentWa
e040: 72 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20 20 20  rning = 0;      
e050: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
e060: 77 61 72 6e 6e 69 6e 67 20 68 61 73 20 62 65 65  warnning has bee
e070: 6e 20 69 73 73 75 65 64 20 2a 2f 0a 0a 20 20 2f  n issued */..  /
e080: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
e090: 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 74 68 65  to skip over the
e0a0: 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 69 6e   creation and in
e0b0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
e0c0: 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 69 65  the.  ** transie
e0d0: 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e 64 20  nt index on 2nd 
e0e0: 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 69  and subsequent i
e0f0: 74 65 72 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  terations of the
e100: 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d 20   loop. */.  v = 
e110: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
e120: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
e130: 0a 20 20 61 64 64 72 49 6e 69 74 20 3d 20 73 71  .  addrInit = sq
e140: 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50  lite3CodeOnce(pP
e150: 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72  arse); VdbeCover
e160: 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 43 6f  age(v);..  /* Co
e170: 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
e180: 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77  f columns that w
e190: 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20  ill be added to 
e1a0: 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 61  the index.  ** a
e1b0: 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63 68  nd used to match
e1c0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
e1d0: 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6e  nstraints */.  n
e1e0: 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54  KeyCol = 0;.  pT
e1f0: 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61  able = pSrc->pTa
e200: 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26 70  b;.  pWCEnd = &p
e210: 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d  WC->a[pWC->nTerm
e220: 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  ];.  pLoop = pLe
e230: 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 69  vel->pWLoop;.  i
e240: 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f  dxCols = 0;.  fo
e250: 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
e260: 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54  pTerm<pWCEnd; pT
e270: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
e280: 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65  termCanDriveInde
e290: 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e  x(pTerm, pSrc, n
e2a0: 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20  otReady) ){.    
e2b0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65    int iCol = pTe
e2c0: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
e2d0: 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  ;.      Bitmask 
e2e0: 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d  cMask = iCol>=BM
e2f0: 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d  S ? MASKBIT(BMS-
e300: 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f  1) : MASKBIT(iCo
e310: 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  l);.      testca
e320: 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b  se( iCol==BMS );
e330: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
e340: 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a   iCol==BMS-1 );.
e350: 20 20 20 20 20 20 69 66 28 20 21 73 65 6e 74 57        if( !sentW
e360: 61 72 6e 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  arning ){.      
e370: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
e380: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54  LITE_WARNING_AUT
e390: 4f 49 4e 44 45 58 2c 0a 20 20 20 20 20 20 20 20  OINDEX,.        
e3a0: 20 20 20 20 22 61 75 74 6f 6d 61 74 69 63 20 69      "automatic i
e3b0: 6e 64 65 78 20 6f 6e 20 25 73 28 25 73 29 22 2c  ndex on %s(%s)",
e3c0: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a   pTable->zName,.
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
e3e0: 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  le->aCol[iCol].z
e3f0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73  Name);.        s
e400: 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 31 3b 0a  entWarning = 1;.
e410: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
e420: 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61  ( (idxCols & cMa
e430: 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
e440: 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52    if( whereLoopR
e450: 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e 64 62  esize(pParse->db
e460: 2c 20 70 4c 6f 6f 70 2c 20 6e 4b 65 79 43 6f 6c  , pLoop, nKeyCol
e470: 2b 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  +1) ) return;.  
e480: 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54        pLoop->aLT
e490: 65 72 6d 5b 6e 4b 65 79 43 6f 6c 2b 2b 5d 20 3d  erm[nKeyCol++] =
e4a0: 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   pTerm;.        
e4b0: 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b  idxCols |= cMask
e4c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e4d0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 4b    }.  assert( nK
e4e0: 65 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 4c 6f  eyCol>0 );.  pLo
e4f0: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
e500: 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20  = pLoop->nLTerm 
e510: 3d 20 6e 4b 65 79 43 6f 6c 3b 0a 20 20 70 4c 6f  = nKeyCol;.  pLo
e520: 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  op->wsFlags = WH
e530: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20  ERE_COLUMN_EQ | 
e540: 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c  WHERE_IDX_ONLY |
e550: 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 0a 20   WHERE_INDEXED. 
e560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e570: 20 20 20 20 7c 20 57 48 45 52 45 5f 41 55 54 4f      | WHERE_AUTO
e580: 5f 49 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20 43 6f  _INDEX;..  /* Co
e590: 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
e5a0: 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c  f additional col
e5b0: 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 63  umns needed to c
e5c0: 72 65 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f 76  reate a.  ** cov
e5d0: 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 41 20  ering index.  A 
e5e0: 22 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 22  "covering index"
e5f0: 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61   is an index tha
e600: 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 20  t contains all. 
e610: 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74   ** columns that
e620: 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20 74   are needed by t
e630: 68 65 20 71 75 65 72 79 2e 20 20 57 69 74 68 20  he query.  With 
e640: 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
e650: 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69  , the.  ** origi
e660: 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76 65 72 20  nal table never 
e670: 6e 65 65 64 73 20 74 6f 20 62 65 20 61 63 63 65  needs to be acce
e680: 73 73 65 64 2e 20 20 41 75 74 6f 6d 61 74 69 63  ssed.  Automatic
e690: 20 69 6e 64 69 63 65 73 20 6d 75 73 74 0a 20 20   indices must.  
e6a0: 2a 2a 20 62 65 20 61 20 63 6f 76 65 72 69 6e 67  ** be a covering
e6b0: 20 69 6e 64 65 78 20 62 65 63 61 75 73 65 20 74   index because t
e6c0: 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f  he index will no
e6d0: 74 20 62 65 20 75 70 64 61 74 65 64 20 69 66 20  t be updated if 
e6e0: 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61  the.  ** origina
e6f0: 6c 20 74 61 62 6c 65 20 63 68 61 6e 67 65 73 20  l table changes 
e700: 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 61 6e  and the index an
e710: 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62  d table cannot b
e720: 6f 74 68 20 62 65 20 75 73 65 64 0a 20 20 2a 2a  oth be used.  **
e730: 20 69 66 20 74 68 65 79 20 67 6f 20 6f 75 74 20   if they go out 
e740: 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20  of sync..  */.  
e750: 65 78 74 72 61 43 6f 6c 73 20 3d 20 70 53 72 63  extraCols = pSrc
e760: 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e 69 64  ->colUsed & (~id
e770: 78 43 6f 6c 73 20 7c 20 4d 41 53 4b 42 49 54 28  xCols | MASKBIT(
e780: 42 4d 53 2d 31 29 29 3b 0a 20 20 6d 78 42 69 74  BMS-1));.  mxBit
e790: 43 6f 6c 20 3d 20 28 70 54 61 62 6c 65 2d 3e 6e  Col = (pTable->n
e7a0: 43 6f 6c 20 3e 3d 20 42 4d 53 2d 31 29 20 3f 20  Col >= BMS-1) ? 
e7b0: 42 4d 53 2d 31 20 3a 20 70 54 61 62 6c 65 2d 3e  BMS-1 : pTable->
e7c0: 6e 43 6f 6c 3b 0a 20 20 74 65 73 74 63 61 73 65  nCol;.  testcase
e7d0: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d  ( pTable->nCol==
e7e0: 42 4d 53 2d 31 20 29 3b 0a 20 20 74 65 73 74 63  BMS-1 );.  testc
e7f0: 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  ase( pTable->nCo
e800: 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 66 6f  l==BMS-2 );.  fo
e810: 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f  r(i=0; i<mxBitCo
e820: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
e830: 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53   extraCols & MAS
e840: 4b 42 49 54 28 69 29 20 29 20 6e 4b 65 79 43 6f  KBIT(i) ) nKeyCo
e850: 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  l++;.  }.  if( p
e860: 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d  Src->colUsed & M
e870: 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29 7b  ASKBIT(BMS-1) ){
e880: 0a 20 20 20 20 6e 4b 65 79 43 6f 6c 20 2b 3d 20  .    nKeyCol += 
e890: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20 42  pTable->nCol - B
e8a0: 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 70 4c  MS + 1;.  }.  pL
e8b0: 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  oop->wsFlags |= 
e8c0: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
e8d0: 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  | WHERE_IDX_ONLY
e8e0: 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63  ;..  /* Construc
e8f0: 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65  t the Index obje
e900: 63 74 20 74 6f 20 64 65 73 63 72 69 62 65 20 74  ct to describe t
e910: 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70  his index */.  p
e920: 49 64 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c  Idx = sqlite3All
e930: 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74  ocateIndexObject
e940: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65  (pParse->db, nKe
e950: 79 43 6f 6c 2b 31 2c 20 30 2c 20 26 7a 4e 6f 74  yCol+1, 0, &zNot
e960: 55 73 65 64 29 3b 0a 20 20 69 66 28 20 70 49 64  Used);.  if( pId
e970: 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  x==0 ) return;. 
e980: 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
e990: 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20  pIndex = pIdx;. 
e9a0: 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3d 20 22   pIdx->zName = "
e9b0: 61 75 74 6f 2d 69 6e 64 65 78 22 3b 0a 20 20 70  auto-index";.  p
e9c0: 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54  Idx->pTable = pT
e9d0: 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20  able;.  n = 0;. 
e9e0: 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20   idxCols = 0;.  
e9f0: 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
ea00: 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20  ; pTerm<pWCEnd; 
ea10: 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
ea20: 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
ea30: 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
ea40: 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20   notReady) ){.  
ea50: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
ea60: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
ea70: 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  mn;.      Bitmas
ea80: 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d  k cMask = iCol>=
ea90: 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d  BMS ? MASKBIT(BM
eaa0: 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69  S-1) : MASKBIT(i
eab0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Col);.      test
eac0: 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d  case( iCol==BMS-
ead0: 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
eae0: 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29  ase( iCol==BMS )
eaf0: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 64 78  ;.      if( (idx
eb00: 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30  Cols & cMask)==0
eb10: 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
eb20: 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45   *pX = pTerm->pE
eb30: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 64 78  xpr;.        idx
eb40: 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20  Cols |= cMask;. 
eb50: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43         pIdx->aiC
eb60: 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d  olumn[n] = pTerm
eb70: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
eb80: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
eb90: 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
eba0: 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  pareCollSeq(pPar
ebb0: 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70  se, pX->pLeft, p
ebc0: 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  X->pRight);.    
ebd0: 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
ebe0: 5b 6e 5d 20 3d 20 41 4c 57 41 59 53 28 70 43 6f  [n] = ALWAYS(pCo
ebf0: 6c 6c 29 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  ll) ? pColl->zNa
ec00: 6d 65 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a 20  me : "BINARY";. 
ec10: 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20         n++;.    
ec20: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
ec30: 61 73 73 65 72 74 28 20 28 75 33 32 29 6e 3d 3d  assert( (u32)n==
ec40: 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
ec50: 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20  Eq );..  /* Add 
ec60: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
ec70: 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b  ns needed to mak
ec80: 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  e the automatic 
ec90: 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a 2a 20  index into.  ** 
eca0: 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
ecb0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
ecc0: 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b  <mxBitCol; i++){
ecd0: 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f  .    if( extraCo
ece0: 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20  ls & MASKBIT(i) 
ecf0: 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  ){.      pIdx->a
ed00: 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a  iColumn[n] = i;.
ed10: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
ed20: 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22  ll[n] = "BINARY"
ed30: 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  ;.      n++;.   
ed40: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72   }.  }.  if( pSr
ed50: 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53  c->colUsed & MAS
ed60: 4b 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20  KBIT(BMS-1) ){. 
ed70: 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20     for(i=BMS-1; 
ed80: 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
ed90: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 64 78  i++){.      pIdx
eda0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
edb0: 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  i;.      pIdx->a
edc0: 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41  zColl[n] = "BINA
edd0: 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a  RY";.      n++;.
ede0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
edf0: 72 74 28 20 6e 3d 3d 6e 4b 65 79 43 6f 6c 20 29  rt( n==nKeyCol )
ee00: 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  ;.  pIdx->aiColu
ee10: 6d 6e 5b 6e 5d 20 3d 20 2d 31 3b 0a 20 20 70 49  mn[n] = -1;.  pI
ee20: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
ee30: 22 42 49 4e 41 52 59 22 3b 0a 0a 20 20 2f 2a 20  "BINARY";..  /* 
ee40: 43 72 65 61 74 65 20 74 68 65 20 61 75 74 6f 6d  Create the autom
ee50: 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20  atic index */.  
ee60: 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
ee70: 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20  iIdxCur>=0 );.  
ee80: 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20  pLevel->iIdxCur 
ee90: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
eea0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
eeb0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
eec0: 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65  Autoindex, pLeve
eed0: 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 4b 65 79  l->iIdxCur, nKey
eee0: 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65  Col+1);.  sqlite
eef0: 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
ef00: 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b  o(pParse, pIdx);
ef10: 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
ef20: 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70 54 61  v, "for %s", pTa
ef30: 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20  ble->zName));.. 
ef40: 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61 75 74   /* Fill the aut
ef50: 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77 69 74  omatic index wit
ef60: 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 61  h content */.  a
ef70: 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ddrTop = sqlite3
ef80: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
ef90: 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76 65 6c 2d  _Rewind, pLevel-
efa0: 3e 69 54 61 62 43 75 72 29 3b 20 56 64 62 65 43  >iTabCur); VdbeC
efb0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 72 65  overage(v);.  re
efc0: 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65  gRecord = sqlite
efd0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
efe0: 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65  se);.  sqlite3Ge
eff0: 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70  nerateIndexKey(p
f000: 50 61 72 73 65 2c 20 70 49 64 78 2c 20 70 4c 65  Parse, pIdx, pLe
f010: 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72 65  vel->iTabCur, re
f020: 67 52 65 63 6f 72 64 2c 20 30 2c 20 30 2c 20 30  gRecord, 0, 0, 0
f030: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
f040: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f050: 49 64 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65  IdxInsert, pLeve
f060: 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52  l->iIdxCur, regR
f070: 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
f080: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
f090: 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
f0a0: 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65  ESULT);.  sqlite
f0b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f0c0: 50 5f 4e 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e  P_Next, pLevel->
f0d0: 69 54 61 62 43 75 72 2c 20 61 64 64 72 54 6f 70  iTabCur, addrTop
f0e0: 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +1); VdbeCoverag
f0f0: 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
f100: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
f110: 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
f120: 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73  _AUTOINDEX);.  s
f130: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
f140: 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a  re(v, addrTop);.
f150: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
f160: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
f170: 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 0a 20  regRecord);.  . 
f180: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68   /* Jump here wh
f190: 65 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20  en skipping the 
f1a0: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a  initialization *
f1b0: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  /.  sqlite3VdbeJ
f1c0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49  umpHere(v, addrI
f1d0: 6e 69 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  nit);.}.#endif /
f1e0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  * SQLITE_OMIT_AU
f1f0: 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f  TOMATIC_INDEX */
f200: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
f210: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
f220: 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  LE./*.** Allocat
f230: 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61  e and populate a
f240: 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  n sqlite3_index_
f250: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  info structure. 
f260: 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65  It is the .** re
f270: 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
f280: 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  the caller to ev
f290: 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65  entually release
f2a0: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a   the structure.*
f2b0: 2a 20 62 79 20 70 61 73 73 69 6e 67 20 74 68 65  * by passing the
f2c0: 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
f2d0: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
f2e0: 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72  on to sqlite3_fr
f2f0: 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ee()..*/.static 
f300: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
f310: 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65  fo *allocateInde
f320: 78 49 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a  xInfo(.  Parse *
f330: 70 50 61 72 73 65 2c 0a 20 20 57 68 65 72 65 43  pParse,.  WhereC
f340: 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20 20 73 74  lause *pWC,.  st
f350: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
f360: 6d 20 2a 70 53 72 63 2c 0a 20 20 45 78 70 72 4c  m *pSrc,.  ExprL
f370: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 0a 29 7b  ist *pOrderBy.){
f380: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69  .  int i, j;.  i
f390: 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75  nt nTerm;.  stru
f3a0: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
f3b0: 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64  _constraint *pId
f3c0: 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20  xCons;.  struct 
f3d0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
f3e0: 64 65 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72  derby *pIdxOrder
f3f0: 42 79 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  By;.  struct sql
f400: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
f410: 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73  raint_usage *pUs
f420: 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  age;.  WhereTerm
f430: 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e   *pTerm;.  int n
f440: 4f 72 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74  OrderBy;.  sqlit
f450: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
f460: 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 43  IdxInfo;..  /* C
f470: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
f480: 6f 66 20 70 6f 73 73 69 62 6c 65 20 57 48 45 52  of possible WHER
f490: 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61  E clause constra
f4a0: 69 6e 74 73 20 72 65 66 65 72 72 69 6e 67 0a 20  ints referring. 
f4b0: 20 2a 2a 20 74 6f 20 74 68 69 73 20 76 69 72 74   ** to this virt
f4c0: 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66  ual table */.  f
f4d0: 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54  or(i=nTerm=0, pT
f4e0: 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57  erm=pWC->a; i<pW
f4f0: 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70  C->nTerm; i++, p
f500: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
f510: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
f520: 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72  or != pSrc->iCur
f530: 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  sor ) continue;.
f540: 20 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f      assert( IsPo
f550: 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e  werOfTwo(pTerm->
f560: 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f  eOperator & ~WO_
f570: 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65  EQUIV) );.    te
f580: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
f590: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
f5a0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
f5b0: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
f5c0: 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  or & WO_ISNULL )
f5d0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
f5e0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
f5f0: 20 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20   & WO_ALL );.   
f600: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
f610: 65 72 61 74 6f 72 20 26 20 7e 28 57 4f 5f 49 53  erator & ~(WO_IS
f620: 4e 55 4c 4c 7c 57 4f 5f 45 51 55 49 56 29 29 3d  NULL|WO_EQUIV))=
f630: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
f640: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
f650: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
f660: 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  LL ) continue;. 
f670: 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a     nTerm++;.  }.
f680: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44  .  /* If the ORD
f690: 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e  ER BY clause con
f6a0: 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d  tains only colum
f6b0: 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ns in the curren
f6c0: 74 20 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  t .  ** virtual 
f6d0: 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63  table then alloc
f6e0: 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ate space for th
f6f0: 65 20 61 4f 72 64 65 72 42 79 20 70 61 72 74 20  e aOrderBy part 
f700: 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69  of.  ** the sqli
f710: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
f720: 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20  tructure..  */. 
f730: 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   nOrderBy = 0;. 
f740: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
f750: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f 72  .    int n = pOr
f760: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
f770: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
f780: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
f790: 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72   *pExpr = pOrder
f7a0: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
f7b0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
f7c0: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
f7d0: 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  | pExpr->iTable!
f7e0: 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29  =pSrc->iCursor )
f7f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
f800: 20 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20 20    if( i==n){.   
f810: 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e 3b     nOrderBy = n;
f820: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
f830: 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71   Allocate the sq
f840: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
f850: 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a   structure.  */.
f860: 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c    pIdxInfo = sql
f870: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
f880: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a  (pParse->db, siz
f890: 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20  eof(*pIdxInfo). 
f8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8b0: 20 20 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a            + (siz
f8c0: 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b  eof(*pIdxCons) +
f8d0: 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29   sizeof(*pUsage)
f8e0: 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20  )*nTerm.        
f8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f900: 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64     + sizeof(*pId
f910: 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72  xOrderBy)*nOrder
f920: 42 79 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78  By );.  if( pIdx
f930: 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Info==0 ){.    s
f940: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
f950: 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d  Parse, "out of m
f960: 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 72 65 74  emory");.    ret
f970: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
f980: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
f990: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
f9a0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
f9b0: 66 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  fo structure con
f9c0: 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20  tains.  ** many 
f9d0: 66 69 65 6c 64 73 20 74 68 61 74 20 61 72 65 20  fields that are 
f9e0: 64 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22  declared "const"
f9f0: 20 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73   to prevent xBes
fa00: 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a  tIndex from.  **
fa10: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20   changing them. 
fa20: 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73   We have to do s
fa30: 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69 6e  ome funky castin
fa40: 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20  g in order to.  
fa50: 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** initialize th
fa60: 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f  ose fields..  */
fa70: 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73  .  pIdxCons = (s
fa80: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
fa90: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29  dex_constraint*)
faa0: 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20  &pIdxInfo[1];.  
fab0: 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73  pIdxOrderBy = (s
fac0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
fad0: 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49  dex_orderby*)&pI
fae0: 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20  dxCons[nTerm];. 
faf0: 20 70 55 73 61 67 65 20 3d 20 28 73 74 72 75 63   pUsage = (struc
fb00: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
fb10: 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
fb20: 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e  *)&pIdxOrderBy[n
fb30: 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e  OrderBy];.  *(in
fb40: 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  t*)&pIdxInfo->nC
fb50: 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72  onstraint = nTer
fb60: 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64  m;.  *(int*)&pId
fb70: 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20  xInfo->nOrderBy 
fb80: 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28  = nOrderBy;.  *(
fb90: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
fba0: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
fbb0: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
fbc0: 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 43  nstraint = pIdxC
fbd0: 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63 74 20  ons;.  *(struct 
fbe0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
fbf0: 64 65 72 62 79 2a 2a 29 26 70 49 64 78 49 6e 66  derby**)&pIdxInf
fc00: 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20 70 49  o->aOrderBy = pI
fc10: 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73  dxOrderBy;.  *(s
fc20: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
fc30: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
fc40: 73 61 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f  sage**)&pIdxInfo
fc50: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
fc60: 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  ge =.           
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fca0: 20 20 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a          pUsage;.
fcb0: 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54  .  for(i=j=0, pT
fcc0: 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57  erm=pWC->a; i<pW
fcd0: 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70  C->nTerm; i++, p
fce0: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 75 38 20  Term++){.    u8 
fcf0: 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  op;.    if( pTer
fd00: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
fd10: 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
fd20: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
fd30: 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66  ssert( IsPowerOf
fd40: 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  Two(pTerm->eOper
fd50: 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56  ator & ~WO_EQUIV
fd60: 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ) );.    testcas
fd70: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
fd80: 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  tor & WO_IN );. 
fd90: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
fda0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
fdb0: 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
fdc0: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
fdd0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
fde0: 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20  _ALL );.    if( 
fdf0: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
fe00: 72 20 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c  r & ~(WO_ISNULL|
fe10: 57 4f 5f 45 51 55 49 56 29 29 3d 3d 30 20 29 20  WO_EQUIV))==0 ) 
fe20: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
fe30: 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
fe40: 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20   & TERM_VNULL ) 
fe50: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 49  continue;.    pI
fe60: 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d  dxCons[j].iColum
fe70: 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  n = pTerm->u.lef
fe80: 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64  tColumn;.    pId
fe90: 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66  xCons[j].iTermOf
fea0: 66 73 65 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70  fset = i;.    op
feb0: 20 3d 20 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f   = (u8)pTerm->eO
fec0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c  perator & WO_ALL
fed0: 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f  ;.    if( op==WO
fee0: 5f 49 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51  _IN ) op = WO_EQ
fef0: 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a  ;.    pIdxCons[j
ff00: 5d 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 20 20 2f  ].op = op;.    /
ff10: 2a 20 54 68 65 20 64 69 72 65 63 74 20 61 73 73  * The direct ass
ff20: 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70  ignment in the p
ff30: 72 65 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20  revious line is 
ff40: 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65  possible only be
ff50: 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65  cause.    ** the
ff60: 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f   WO_ and SQLITE_
ff70: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
ff80: 5f 20 63 6f 64 65 73 20 61 72 65 20 69 64 65 6e  _ codes are iden
ff90: 74 69 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20  tical.  The.    
ffa0: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  ** following ass
ffb0: 65 72 74 73 20 76 65 72 69 66 79 20 74 68 69 73  erts verify this
ffc0: 20 66 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73   fact. */.    as
ffd0: 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c  sert( WO_EQ==SQL
ffe0: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
fff0: 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 61  AINT_EQ );.    a
10000 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51  ssert( WO_LT==SQ
10010 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
10020 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20  RAINT_LT );.    
10030 61 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53  assert( WO_LE==S
10040 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
10050 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20  TRAINT_LE );.   
10060 20 61 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d   assert( WO_GT==
10070 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
10080 53 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20  STRAINT_GT );.  
10090 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d    assert( WO_GE=
100a0 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
100b0 4e 53 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20  NSTRAINT_GE );. 
100c0 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4d 41     assert( WO_MA
100d0 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  TCH==SQLITE_INDE
100e0 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54  X_CONSTRAINT_MAT
100f0 43 48 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CH );.    assert
10100 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
10110 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 45  or & (WO_IN|WO_E
10120 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f  Q|WO_LT|WO_LE|WO
10130 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54  _GT|WO_GE|WO_MAT
10140 43 48 29 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a  CH) );.    j++;.
10150 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
10160 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
10170 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
10180 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
10190 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64  ].pExpr;.    pId
101a0 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c  xOrderBy[i].iCol
101b0 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  umn = pExpr->iCo
101c0 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72  lumn;.    pIdxOr
101d0 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20  derBy[i].desc = 
101e0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
101f0 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20  ortOrder;.  }.. 
10200 20 72 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f   return pIdxInfo
10210 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  ;.}../*.** The t
10220 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65  able object refe
10230 72 65 6e 63 65 20 70 61 73 73 65 64 20 61 73 20  rence passed as 
10240 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
10250 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
10260 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70  tion.** must rep
10270 72 65 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c  resent a virtual
10280 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e   table. This fun
10290 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68  ction invokes th
102a0 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a  e xBestIndex().*
102b0 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  * method of the 
102c0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69  virtual table wi
102d0 74 68 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  th the sqlite3_i
102e0 6e 64 65 78 5f 69 6e 66 6f 20 6f 62 6a 65 63 74  ndex_info object
102f0 20 74 68 61 74 0a 2a 2a 20 63 6f 6d 65 73 20 69   that.** comes i
10300 6e 20 61 73 20 74 68 65 20 33 72 64 20 61 72 67  n as the 3rd arg
10310 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
10320 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
10330 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
10340 2c 20 70 50 61 72 73 65 20 69 73 20 70 6f 70 75  , pParse is popu
10350 6c 61 74 65 64 20 77 69 74 68 20 61 6e 20 65 72  lated with an er
10360 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20  ror message and 
10370 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  a.** non-zero va
10380 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  lue is returned.
10390 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73   Otherwise, 0 is
103a0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
103b0 65 20 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72 74  e output.** part
103c0 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
103d0 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
103e0 74 75 72 65 20 69 73 20 6c 65 66 74 20 70 6f 70  ture is left pop
103f0 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68  ulated..**.** Wh
10400 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20  ether or not an 
10410 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
10420 64 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73  d, it is the res
10430 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
10440 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20  he.** caller to 
10450 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20  eventually free 
10460 70 2d 3e 69 64 78 53 74 72 20 69 66 20 70 2d 3e  p->idxStr if p->
10470 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
10480 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74 68   indicates.** th
10490 61 74 20 74 68 69 73 20 69 73 20 72 65 71 75 69  at this is requi
104a0 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
104b0 6e 74 20 76 74 61 62 42 65 73 74 49 6e 64 65 78  nt vtabBestIndex
104c0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
104d0 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c  Table *pTab, sql
104e0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
104f0 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  *p){.  sqlite3_v
10500 74 61 62 20 2a 70 56 74 61 62 20 3d 20 73 71 6c  tab *pVtab = sql
10510 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 70 50  ite3GetVTable(pP
10520 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d  arse->db, pTab)-
10530 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 69 3b  >pVtab;.  int i;
10540 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52  .  int rc;..  TR
10550 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70  ACE_IDX_INPUTS(p
10560 29 3b 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d  );.  rc = pVtab-
10570 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49  >pModule->xBestI
10580 6e 64 65 78 28 70 56 74 61 62 2c 20 70 29 3b 0a  ndex(pVtab, p);.
10590 20 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50    TRACE_IDX_OUTP
105a0 55 54 53 28 70 29 3b 0a 0a 20 20 69 66 28 20 72  UTS(p);..  if( r
105b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
105c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
105d0 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
105e0 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61    pParse->db->ma
105f0 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
10600 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70      }else if( !p
10610 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b  Vtab->zErrMsg ){
10620 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
10630 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
10640 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53  %s", sqlite3ErrS
10650 74 72 28 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c  tr(rc));.    }el
10660 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
10670 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
10680 2c 20 22 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a  , "%s", pVtab->z
10690 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20  ErrMsg);.    }. 
106a0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
106b0 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  e(pVtab->zErrMsg
106c0 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72  );.  pVtab->zErr
106d0 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28  Msg = 0;..  for(
106e0 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74  i=0; i<p->nConst
106f0 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  raint; i++){.   
10700 20 69 66 28 20 21 70 2d 3e 61 43 6f 6e 73 74 72   if( !p->aConstr
10710 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26  aint[i].usable &
10720 26 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  & p->aConstraint
10730 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64  Usage[i].argvInd
10740 65 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71  ex>0 ){.      sq
10750 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
10760 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
10770 20 22 74 61 62 6c 65 20 25 73 3a 20 78 42 65 73   "table %s: xBes
10780 74 49 6e 64 65 78 20 72 65 74 75 72 6e 65 64 20  tIndex returned 
10790 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22  an invalid plan"
107a0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
107b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
107c0 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  urn pParse->nErr
107d0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
107e0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
107f0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
10800 20 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c   */...#ifdef SQL
10810 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
10820 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20  _OR_STAT4./*.** 
10830 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c 6f 63  Estimate the loc
10840 61 74 69 6f 6e 20 6f 66 20 61 20 70 61 72 74 69  ation of a parti
10850 63 75 6c 61 72 20 6b 65 79 20 61 6d 6f 6e 67 20  cular key among 
10860 61 6c 6c 20 6b 65 79 73 20 69 6e 20 61 6e 0a 2a  all keys in an.*
10870 2a 20 69 6e 64 65 78 2e 20 20 53 74 6f 72 65 20  * index.  Store 
10880 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61  the results in a
10890 53 74 61 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  Stat as follows:
108a0 0a 2a 2a 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b  .**.**    aStat[
108b0 30 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d  0]      Est. num
108c0 62 65 72 20 6f 66 20 72 6f 77 73 20 6c 65 73 73  ber of rows less
108d0 20 74 68 61 6e 20 70 56 61 6c 0a 2a 2a 20 20 20   than pVal.**   
108e0 20 61 53 74 61 74 5b 31 5d 20 20 20 20 20 20 45   aStat[1]      E
108f0 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  st. number of ro
10900 77 73 20 65 71 75 61 6c 20 74 6f 20 70 56 61 6c  ws equal to pVal
10910 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
10920 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
10930 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ss..*/.static vo
10940 69 64 20 77 68 65 72 65 4b 65 79 53 74 61 74 73  id whereKeyStats
10950 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
10960 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
10970 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
10980 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65  ection */.  Inde
10990 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
109a0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
109b0 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 64 6f 6d   to consider dom
109c0 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 55 6e 70 61  ain of */.  Unpa
109d0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63  ckedRecord *pRec
109e0 2c 20 20 20 20 20 20 20 2f 2a 20 56 65 63 74 6f  ,       /* Vecto
109f0 72 20 6f 66 20 76 61 6c 75 65 73 20 74 6f 20 63  r of values to c
10a00 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20 69 6e 74  onsider */.  int
10a10 20 72 6f 75 6e 64 55 70 2c 20 20 20 20 20 20 20   roundUp,       
10a20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 75 6e           /* Roun
10a30 64 20 75 70 20 69 66 20 74 72 75 65 2e 20 20 52  d up if true.  R
10a40 6f 75 6e 64 20 64 6f 77 6e 20 69 66 20 66 61 6c  ound down if fal
10a50 73 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  se */.  tRowcnt 
10a60 2a 61 53 74 61 74 20 20 20 20 20 20 20 20 20 20  *aStat          
10a70 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 74 61 74      /* OUT: stat
10a80 73 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  s written here *
10a90 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 53 61 6d 70  /.){.  IndexSamp
10aa0 6c 65 20 2a 61 53 61 6d 70 6c 65 20 3d 20 70 49  le *aSample = pI
10ab0 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 69  dx->aSample;.  i
10ac0 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt iCol;        
10ad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
10ae0 64 65 78 20 6f 66 20 72 65 71 75 69 72 65 64 20  dex of required 
10af0 73 74 61 74 73 20 69 6e 20 61 6e 45 71 5b 5d 20  stats in anEq[] 
10b00 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 4d  etc. */.  int iM
10b10 69 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  in = 0;         
10b20 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73        /* Smalles
10b30 74 20 73 61 6d 70 6c 65 20 6e 6f 74 20 79 65 74  t sample not yet
10b40 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74   tested */.  int
10b50 20 69 20 3d 20 70 49 64 78 2d 3e 6e 53 61 6d 70   i = pIdx->nSamp
10b60 6c 65 3b 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c  le;      /* Smal
10b70 6c 65 73 74 20 73 61 6d 70 6c 65 20 6c 61 72 67  lest sample larg
10b80 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
10b90 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20 69 6e   to pRec */.  in
10ba0 74 20 69 54 65 73 74 3b 20 20 20 20 20 20 20 20  t iTest;        
10bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
10bc0 74 20 73 61 6d 70 6c 65 20 74 6f 20 74 65 73 74  t sample to test
10bd0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b 20 20   */.  int res;  
10be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bf0 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 63    /* Result of c
10c00 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
10c10 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ion */..#ifndef 
10c20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 55  SQLITE_DEBUG.  U
10c30 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
10c40 20 70 50 61 72 73 65 20 29 3b 0a 23 65 6e 64 69   pParse );.#endi
10c50 66 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 63  f.  assert( pRec
10c60 21 3d 30 20 29 3b 0a 20 20 69 43 6f 6c 20 3d 20  !=0 );.  iCol = 
10c70 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 2d 20 31  pRec->nField - 1
10c80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ;.  assert( pIdx
10c90 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20  ->nSample>0 );. 
10ca0 20 61 73 73 65 72 74 28 20 70 52 65 63 2d 3e 6e   assert( pRec->n
10cb0 46 69 65 6c 64 3e 30 20 26 26 20 69 43 6f 6c 3c  Field>0 && iCol<
10cc0 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c  pIdx->nSampleCol
10cd0 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 54   );.  do{.    iT
10ce0 65 73 74 20 3d 20 28 69 4d 69 6e 2b 69 29 2f 32  est = (iMin+i)/2
10cf0 3b 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69  ;.    res = sqli
10d00 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
10d10 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 54 65  pare(aSample[iTe
10d20 73 74 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  st].n, aSample[i
10d30 54 65 73 74 5d 2e 70 2c 20 70 52 65 63 2c 20 30  Test].p, pRec, 0
10d40 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30  );.    if( res<0
10d50 20 29 7b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d   ){.      iMin =
10d60 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20 7d 65   iTest+1;.    }e
10d70 6c 73 65 7b 0a 20 20 20 20 20 20 69 20 3d 20 69  lse{.      i = i
10d80 54 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  Test;.    }.  }w
10d90 68 69 6c 65 28 20 72 65 73 20 26 26 20 69 4d 69  hile( res && iMi
10da0 6e 3c 69 20 29 3b 0a 0a 23 69 66 64 65 66 20 53  n<i );..#ifdef S
10db0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
10dc0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
10dd0 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73  ssert statements
10de0 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
10df0 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 63 6f  binary search co
10e00 64 65 0a 20 20 2a 2a 20 61 62 6f 76 65 20 66 6f  de.  ** above fo
10e10 75 6e 64 20 74 68 65 20 72 69 67 68 74 20 61 6e  und the right an
10e20 73 77 65 72 2e 20 54 68 69 73 20 62 6c 6f 63 6b  swer. This block
10e30 20 73 65 72 76 65 73 20 6e 6f 20 70 75 72 70 6f   serves no purpo
10e40 73 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 74 68  se other.  ** th
10e50 61 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  an to invoke the
10e60 20 61 73 73 65 72 74 73 2e 20 20 2a 2f 0a 20 20   asserts.  */.  
10e70 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
10e80 20 20 2f 2a 20 49 66 20 28 72 65 73 3d 3d 30 29    /* If (res==0)
10e90 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 73   is true, then s
10ea0 61 6d 70 6c 65 20 24 69 20 6d 75 73 74 20 62 65  ample $i must be
10eb0 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63 20 2a   equal to pRec *
10ec0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c  /.    assert( i<
10ed0 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b  pIdx->nSample );
10ee0 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d  .    assert( 0==
10ef0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
10f00 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65  dCompare(aSample
10f10 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  [i].n, aSample[i
10f20 5d 2e 70 2c 20 70 52 65 63 2c 20 30 29 0a 20 20  ].p, pRec, 0).  
10f30 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
10f40 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
10f50 65 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ed );.  }else{. 
10f60 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c     /* Otherwise,
10f70 20 70 52 65 63 20 6d 75 73 74 20 62 65 20 73 6d   pRec must be sm
10f80 61 6c 6c 65 72 20 74 68 61 6e 20 73 61 6d 70 6c  aller than sampl
10f90 65 20 24 69 20 61 6e 64 20 6c 61 72 67 65 72 20  e $i and larger 
10fa0 74 68 61 6e 0a 20 20 20 20 2a 2a 20 73 61 6d 70  than.    ** samp
10fb0 6c 65 20 28 24 69 2d 31 29 2e 20 20 2a 2f 0a 20  le ($i-1).  */. 
10fc0 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70 49     assert( i==pI
10fd0 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20  dx->nSample .   
10fe0 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
10ff0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
11000 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20  e(aSample[i].n, 
11010 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52  aSample[i].p, pR
11020 65 63 2c 20 30 29 3e 30 0a 20 20 20 20 20 20 20  ec, 0)>0.       
11030 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d    || pParse->db-
11040 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
11050 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d  .    assert( i==
11060 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71  0.         || sq
11070 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
11080 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69  ompare(aSample[i
11090 2d 31 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  -1].n, aSample[i
110a0 2d 31 5d 2e 70 2c 20 70 52 65 63 2c 20 30 29 3c  -1].p, pRec, 0)<
110b0 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50  0.         || pP
110c0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
110d0 46 61 69 6c 65 64 20 29 3b 0a 20 20 7d 0a 23 65  Failed );.  }.#e
110e0 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51  ndif /* ifdef SQ
110f0 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 20  LITE_DEBUG */.. 
11100 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
11110 74 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73  t, aSample[i] is
11120 20 74 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c   the first sampl
11130 65 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65  e that is greate
11140 72 20 74 68 61 6e 0a 20 20 2a 2a 20 6f 72 20 65  r than.  ** or e
11150 71 75 61 6c 20 74 6f 20 70 56 61 6c 2e 20 20 4f  qual to pVal.  O
11160 72 20 69 66 20 69 3d 3d 70 49 64 78 2d 3e 6e 53  r if i==pIdx->nS
11170 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61 6c 6c 20  ample, then all 
11180 73 61 6d 70 6c 65 73 20 61 72 65 20 6c 65 73 73  samples are less
11190 0a 20 20 2a 2a 20 74 68 61 6e 20 70 56 61 6c 2e  .  ** than pVal.
111a0 20 20 49 66 20 61 53 61 6d 70 6c 65 5b 69 5d 3d    If aSample[i]=
111b0 3d 70 56 61 6c 2c 20 74 68 65 6e 20 72 65 73 3d  =pVal, then res=
111c0 3d 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  =0..  */.  if( r
111d0 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 61 53 74  es==0 ){.    aSt
111e0 61 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b  at[0] = aSample[
111f0 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20  i].anLt[iCol];. 
11200 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 61 53     aStat[1] = aS
11210 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b 69 43  ample[i].anEq[iC
11220 6f 6c 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ol];.  }else{.  
11230 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72    tRowcnt iLower
11240 2c 20 69 55 70 70 65 72 2c 20 69 47 61 70 3b 0a  , iUpper, iGap;.
11250 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a      if( i==0 ){.
11260 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 30        iLower = 0
11270 3b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20 3d  ;.      iUpper =
11280 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 61 6e 4c 74   aSample[0].anLt
11290 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 65 6c 73  [iCol];.    }els
112a0 65 7b 0a 20 20 20 20 20 20 69 36 34 20 6e 52 6f  e{.      i64 nRo
112b0 77 30 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  w0 = sqlite3LogE
112c0 73 74 54 6f 49 6e 74 28 70 49 64 78 2d 3e 61 69  stToInt(pIdx->ai
112d0 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20  RowLogEst[0]);. 
112e0 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 69 3e       iUpper = i>
112f0 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 3f  =pIdx->nSample ?
11300 20 6e 52 6f 77 30 20 3a 20 61 53 61 6d 70 6c 65   nRow0 : aSample
11310 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a  [i].anLt[iCol];.
11320 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61        iLower = a
11330 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 61 6e 45 71  Sample[i-1].anEq
11340 5b 69 43 6f 6c 5d 20 2b 20 61 53 61 6d 70 6c 65  [iCol] + aSample
11350 5b 69 2d 31 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d  [i-1].anLt[iCol]
11360 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53 74 61  ;.    }.    aSta
11370 74 5b 31 5d 20 3d 20 28 70 49 64 78 2d 3e 6e 4b  t[1] = (pIdx->nK
11380 65 79 43 6f 6c 3e 69 43 6f 6c 20 3f 20 70 49 64  eyCol>iCol ? pId
11390 78 2d 3e 61 41 76 67 45 71 5b 69 43 6f 6c 5d 20  x->aAvgEq[iCol] 
113a0 3a 20 31 29 3b 0a 20 20 20 20 69 66 28 20 69 4c  : 1);.    if( iL
113b0 6f 77 65 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a  ower>=iUpper ){.
113c0 20 20 20 20 20 20 69 47 61 70 20 3d 20 30 3b 0a        iGap = 0;.
113d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
113e0 20 69 47 61 70 20 3d 20 69 55 70 70 65 72 20 2d   iGap = iUpper -
113f0 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d 0a 20   iLower;.    }. 
11400 20 20 20 69 66 28 20 72 6f 75 6e 64 55 70 20 29     if( roundUp )
11410 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 28  {.      iGap = (
11420 69 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20 20 7d  iGap*2)/3;.    }
11430 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70  else{.      iGap
11440 20 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20 20 7d   = iGap/3;.    }
11450 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20  .    aStat[0] = 
11460 69 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b 0a 20  iLower + iGap;. 
11470 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
11480 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
11490 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a  T3_OR_STAT4 */..
114a0 2f 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 6e  /*.** If it is n
114b0 6f 74 20 4e 55 4c 4c 2c 20 70 54 65 72 6d 20 69  ot NULL, pTerm i
114c0 73 20 61 20 74 65 72 6d 20 74 68 61 74 20 70 72  s a term that pr
114d0 6f 76 69 64 65 73 20 61 6e 20 75 70 70 65 72 20  ovides an upper 
114e0 6f 72 20 6c 6f 77 65 72 0a 2a 2a 20 62 6f 75 6e  or lower.** boun
114f0 64 20 6f 6e 20 61 20 72 61 6e 67 65 20 73 63 61  d on a range sca
11500 6e 2e 20 57 69 74 68 6f 75 74 20 63 6f 6e 73 69  n. Without consi
11510 64 65 72 69 6e 67 20 70 54 65 72 6d 2c 20 69 74  dering pTerm, it
11520 20 69 73 20 65 73 74 69 6d 61 74 65 64 20 0a 2a   is estimated .*
11530 2a 20 74 68 61 74 20 74 68 65 20 73 63 61 6e 20  * that the scan 
11540 77 69 6c 6c 20 76 69 73 69 74 20 6e 4e 65 77 20  will visit nNew 
11550 72 6f 77 73 2e 20 54 68 69 73 20 66 75 6e 63 74  rows. This funct
11560 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
11570 6e 75 6d 62 65 72 0a 2a 2a 20 65 73 74 69 6d 61  number.** estima
11580 74 65 64 20 74 6f 20 62 65 20 76 69 73 69 74 65  ted to be visite
11590 64 20 61 66 74 65 72 20 74 61 6b 69 6e 67 20 70  d after taking p
115a0 54 65 72 6d 20 69 6e 74 6f 20 61 63 63 6f 75 6e  Term into accoun
115b0 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
115c0 75 73 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20  user explicitly 
115d0 73 70 65 63 69 66 69 65 64 20 61 20 6c 69 6b 65  specified a like
115e0 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75 65 20 66  lihood() value f
115f0 6f 72 20 74 68 69 73 20 74 65 72 6d 2c 0a 2a 2a  or this term,.**
11600 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e   then the return
11610 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6c 69   value is the li
11620 6b 65 6c 69 68 6f 6f 64 20 6d 75 6c 74 69 70 6c  kelihood multipl
11630 69 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65  ied by the numbe
11640 72 20 6f 66 0a 2a 2a 20 69 6e 70 75 74 20 72 6f  r of.** input ro
11650 77 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  ws. Otherwise, t
11660 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73  his function ass
11670 75 6d 65 73 20 74 68 61 74 20 61 6e 20 22 49 53  umes that an "IS
11680 20 4e 4f 54 20 4e 55 4c 4c 22 20 74 65 72 6d 0a   NOT NULL" term.
11690 2a 2a 20 68 61 73 20 61 20 6c 69 6b 65 6c 69 68  ** has a likelih
116a0 6f 6f 64 20 6f 66 20 30 2e 35 30 2c 20 61 6e 64  ood of 0.50, and
116b0 20 61 6e 79 20 6f 74 68 65 72 20 74 65 72 6d 20   any other term 
116c0 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66 20  a likelihood of 
116d0 30 2e 32 35 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  0.25..*/.static 
116e0 4c 6f 67 45 73 74 20 77 68 65 72 65 52 61 6e 67  LogEst whereRang
116f0 65 41 64 6a 75 73 74 28 57 68 65 72 65 54 65 72  eAdjust(WhereTer
11700 6d 20 2a 70 54 65 72 6d 2c 20 4c 6f 67 45 73 74  m *pTerm, LogEst
11710 20 6e 4e 65 77 29 7b 0a 20 20 4c 6f 67 45 73 74   nNew){.  LogEst
11720 20 6e 52 65 74 20 3d 20 6e 4e 65 77 3b 0a 20 20   nRet = nNew;.  
11730 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20  if( pTerm ){.   
11740 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74   if( pTerm->trut
11750 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20  hProb<=0 ){.    
11760 20 20 6e 52 65 74 20 2b 3d 20 70 54 65 72 6d 2d    nRet += pTerm-
11770 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20  >truthProb;.    
11780 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d  }else if( (pTerm
11790 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
117a0 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20  _VNULL)==0 ){.  
117b0 20 20 20 20 6e 52 65 74 20 2d 3d 20 32 30 3b 20      nRet -= 20; 
117c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 32         assert( 2
117d0 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
117e0 28 34 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (4) );.    }.  }
117f0 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 74 3b 0a  .  return nRet;.
11800 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
11810 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
11820 5f 53 54 41 54 34 0a 2f 2a 20 0a 2a 2a 20 54 68  _STAT4./* .** Th
11830 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
11840 61 6c 6c 65 64 20 74 6f 20 65 73 74 69 6d 61 74  alled to estimat
11850 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
11860 72 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20  rows visited by 
11870 61 0a 2a 2a 20 72 61 6e 67 65 2d 73 63 61 6e 20  a.** range-scan 
11880 6f 6e 20 61 20 73 6b 69 70 2d 73 63 61 6e 20 69  on a skip-scan i
11890 6e 64 65 78 2e 20 46 6f 72 20 65 78 61 6d 70 6c  ndex. For exampl
118a0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  e:.**.**   CREAT
118b0 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
118c0 28 61 2c 20 62 2c 20 63 29 3b 0a 2a 2a 20 20 20  (a, b, c);.**   
118d0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
118e0 20 57 48 45 52 45 20 61 3d 3f 20 41 4e 44 20 63   WHERE a=? AND c
118f0 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f   BETWEEN ? AND ?
11900 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c 75 65 20 70 4c  ;.**.** Value pL
11910 6f 6f 70 2d 3e 6e 4f 75 74 20 69 73 20 63 75 72  oop->nOut is cur
11920 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20 74 68  rently set to th
11930 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62  e estimated numb
11940 65 72 20 6f 66 20 72 6f 77 73 20 0a 2a 2a 20 76  er of rows .** v
11950 69 73 69 74 65 64 20 66 6f 72 20 73 63 61 6e 6e  isited for scann
11960 69 6e 67 20 28 61 3d 3f 20 41 4e 44 20 62 3d 3f  ing (a=? AND b=?
11970 29 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ). This function
11980 20 72 65 64 75 63 65 73 20 74 68 61 74 20 65 73   reduces that es
11990 74 69 6d 61 74 65 20 0a 2a 2a 20 62 79 20 73 6f  timate .** by so
119a0 6d 65 20 66 61 63 74 6f 72 20 74 6f 20 61 63 63  me factor to acc
119b0 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 28 63 20  ount for the (c 
119c0 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 29  BETWEEN ? AND ?)
119d0 20 65 78 70 72 65 73 73 69 6f 6e 20 62 61 73 65   expression base
119e0 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 74  d.** on the stat
119f0 34 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 69  4 data for the i
11a00 6e 64 65 78 2e 20 74 68 69 73 20 73 63 61 6e 20  ndex. this scan 
11a10 77 69 6c 6c 20 62 65 20 70 65 66 6f 72 6d 65 64  will be peformed
11a20 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69   multiple .** ti
11a30 6d 65 73 20 28 6f 6e 63 65 20 66 6f 72 20 65 61  mes (once for ea
11a40 63 68 20 28 61 2c 62 29 20 63 6f 6d 62 69 6e 61  ch (a,b) combina
11a50 74 69 6f 6e 20 74 68 61 74 20 6d 61 74 63 68 65  tion that matche
11a60 73 20 61 3d 3f 29 20 69 73 20 64 65 61 6c 74 20  s a=?) is dealt 
11a70 77 69 74 68 20 0a 2a 2a 20 62 79 20 74 68 65 20  with .** by the 
11a80 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 74  caller..**.** It
11a90 20 64 6f 65 73 20 74 68 69 73 20 62 79 20 73 63   does this by sc
11aa0 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61  anning through a
11ab0 6c 6c 20 73 74 61 74 34 20 73 61 6d 70 6c 65 73  ll stat4 samples
11ac0 2c 20 63 6f 6d 70 61 72 69 6e 67 20 76 61 6c 75  , comparing valu
11ad0 65 73 0a 2a 2a 20 65 78 74 72 61 63 74 65 64 20  es.** extracted 
11ae0 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e 64 20  from pLower and 
11af0 70 55 70 70 65 72 20 77 69 74 68 20 74 68 65 20  pUpper with the 
11b00 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f  corresponding co
11b10 6c 75 6d 6e 20 69 6e 20 65 61 63 68 0a 2a 2a 20  lumn in each.** 
11b20 73 61 6d 70 6c 65 2e 20 49 66 20 4c 20 61 6e 64  sample. If L and
11b30 20 55 20 61 72 65 20 74 68 65 20 6e 75 6d 62 65   U are the numbe
11b40 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 66 6f 75  r of samples fou
11b50 6e 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68  nd to be less th
11b60 61 6e 20 6f 72 0a 2a 2a 20 65 71 75 61 6c 20 74  an or.** equal t
11b70 6f 20 74 68 65 20 76 61 6c 75 65 73 20 65 78 74  o the values ext
11b80 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77  racted from pLow
11b90 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 72 65  er and pUpper re
11ba0 73 70 65 63 74 69 76 65 6c 79 2c 20 61 6e 64 0a  spectively, and.
11bb0 2a 2a 20 4e 20 69 73 20 74 68 65 20 74 6f 74 61  ** N is the tota
11bc0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70  l number of samp
11bd0 6c 65 73 2c 20 74 68 65 20 70 4c 6f 6f 70 2d 3e  les, the pLoop->
11be0 6e 4f 75 74 20 76 61 6c 75 65 20 69 73 20 61 64  nOut value is ad
11bf0 6a 75 73 74 65 64 0a 2a 2a 20 61 73 20 66 6f 6c  justed.** as fol
11c00 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e 4f  lows:.**.**   nO
11c10 75 74 20 3d 20 6e 4f 75 74 20 2a 20 28 20 6d 69  ut = nOut * ( mi
11c20 6e 28 55 20 2d 20 4c 2c 20 31 29 20 2f 20 4e 20  n(U - L, 1) / N 
11c30 29 0a 2a 2a 0a 2a 2a 20 49 66 20 70 4c 6f 77 65  ).**.** If pLowe
11c40 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 61 20  r is NULL, or a 
11c50 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20  value cannot be 
11c60 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
11c70 68 65 20 74 65 72 6d 2c 20 4c 20 69 73 0a 2a 2a  he term, L is.**
11c80 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 49 66   set to zero. If
11c90 20 70 55 70 70 65 72 20 69 73 20 4e 55 4c 4c 2c   pUpper is NULL,
11ca0 20 6f 72 20 61 20 76 61 6c 75 65 20 63 61 6e 6e   or a value cann
11cb0 6f 74 20 62 65 20 65 78 74 72 61 63 74 65 64 20  ot be extracted 
11cc0 66 72 6f 6d 20 69 74 2c 0a 2a 2a 20 55 20 69 73  from it,.** U is
11cd0 20 73 65 74 20 74 6f 20 4e 2e 0a 2a 2a 0a 2a 2a   set to N..**.**
11ce0 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20   Normally, this 
11cf0 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 2a 70  function sets *p
11d00 62 44 6f 6e 65 20 74 6f 20 31 20 62 65 66 6f 72  bDone to 1 befor
11d10 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 48 6f 77  e returning. How
11d20 65 76 65 72 2c 0a 2a 2a 20 69 66 20 6e 6f 20 76  ever,.** if no v
11d30 61 6c 75 65 20 63 61 6e 20 62 65 20 65 78 74 72  alue can be extr
11d40 61 63 74 65 64 20 66 72 6f 6d 20 65 69 74 68 65  acted from eithe
11d50 72 20 70 4c 6f 77 65 72 20 6f 72 20 70 55 70 70  r pLower or pUpp
11d60 65 72 20 28 61 6e 64 20 73 6f 20 74 68 65 0a 2a  er (and so the.*
11d70 2a 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  * estimate of th
11d80 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
11d90 20 64 65 6c 69 76 65 72 65 64 20 72 65 6d 61 69   delivered remai
11da0 6e 73 20 75 6e 63 68 61 6e 67 65 64 29 2c 20 2a  ns unchanged), *
11db0 70 62 44 6f 6e 65 0a 2a 2a 20 69 73 20 6c 65 66  pbDone.** is lef
11dc0 74 20 61 73 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 49  t as is..**.** I
11dd0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
11de0 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  s, an SQLite err
11df0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
11e00 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
11e10 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  .** SQLITE_OK..*
11e20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
11e30 72 65 52 61 6e 67 65 53 6b 69 70 53 63 61 6e 45  reRangeSkipScanE
11e40 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
11e50 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
11e60 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
11e70 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
11e80 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
11e90 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77  pLower,   /* Low
11ea0 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20  er bound on the 
11eb0 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32  range. ex: "x>12
11ec0 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  3" Might be NULL
11ed0 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
11ee0 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70  *pUpper,   /* Up
11ef0 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  per bound on the
11f00 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34   range. ex: "x<4
11f10 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  55" Might be NUL
11f20 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  L */.  WhereLoop
11f30 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 2f 2a 20 55   *pLoop,    /* U
11f40 70 64 61 74 65 20 74 68 65 20 2e 6e 4f 75 74 20  pdate the .nOut 
11f50 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 6c 6f  value of this lo
11f60 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 44  op */.  int *pbD
11f70 6f 6e 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20  one          /* 
11f80 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61  Set to true if a
11f90 74 20 6c 65 61 73 74 20 6f 6e 65 20 65 78 70 72  t least one expr
11fa0 2e 20 76 61 6c 75 65 20 65 78 74 72 61 63 74 65  . value extracte
11fb0 64 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20  d */.){.  Index 
11fc0 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  *p = pLoop->u.bt
11fd0 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e  ree.pIndex;.  in
11fe0 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75  t nEq = pLoop->u
11ff0 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73 71  .btree.nEq;.  sq
12000 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
12010 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 4c  se->db;.  int nL
12020 6f 77 65 72 20 3d 20 2d 31 3b 0a 20 20 69 6e 74  ower = -1;.  int
12030 20 6e 55 70 70 65 72 20 3d 20 70 2d 3e 6e 53 61   nUpper = p->nSa
12040 6d 70 6c 65 2b 31 3b 0a 20 20 69 6e 74 20 72 63  mple+1;.  int rc
12050 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12060 75 38 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62  u8 aff = p->pTab
12070 6c 65 2d 3e 61 43 6f 6c 5b 20 70 2d 3e 61 69 43  le->aCol[ p->aiC
12080 6f 6c 75 6d 6e 5b 6e 45 71 5d 20 5d 2e 61 66 66  olumn[nEq] ].aff
12090 69 6e 69 74 79 3b 0a 20 20 43 6f 6c 6c 53 65 71  inity;.  CollSeq
120a0 20 2a 70 43 6f 6c 6c 3b 0a 20 20 0a 20 20 73 71   *pColl;.  .  sq
120b0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 31 20  lite3_value *p1 
120c0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
120d0 20 56 61 6c 75 65 20 65 78 74 72 61 63 74 65 64   Value extracted
120e0 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 2a 2f 0a   from pLower */.
120f0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
12100 2a 70 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  *p2 = 0;        
12110 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61    /* Value extra
12120 63 74 65 64 20 66 72 6f 6d 20 70 55 70 70 65 72  cted from pUpper
12130 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
12140 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 20 20  lue *pVal = 0;  
12150 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65        /* Value e
12160 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65  xtracted from re
12170 63 6f 72 64 20 2a 2f 0a 0a 20 20 70 43 6f 6c 6c  cord */..  pColl
12180 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
12190 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
121a0 70 2d 3e 61 7a 43 6f 6c 6c 5b 6e 45 71 5d 29 3b  p->azColl[nEq]);
121b0 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b  .  if( pLower ){
121c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
121d0 33 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45  3Stat4ValueFromE
121e0 78 70 72 28 70 50 61 72 73 65 2c 20 70 4c 6f 77  xpr(pParse, pLow
121f0 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  er->pExpr->pRigh
12200 74 2c 20 61 66 66 2c 20 26 70 31 29 3b 0a 20 20  t, aff, &p1);.  
12210 20 20 6e 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20    nLower = 0;.  
12220 7d 0a 20 20 69 66 28 20 70 55 70 70 65 72 20 26  }.  if( pUpper &
12230 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
12240 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
12250 74 65 33 53 74 61 74 34 56 61 6c 75 65 46 72 6f  te3Stat4ValueFro
12260 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 55  mExpr(pParse, pU
12270 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69  pper->pExpr->pRi
12280 67 68 74 2c 20 61 66 66 2c 20 26 70 32 29 3b 0a  ght, aff, &p2);.
12290 20 20 20 20 6e 55 70 70 65 72 20 3d 20 70 32 20      nUpper = p2 
122a0 3f 20 30 20 3a 20 70 2d 3e 6e 53 61 6d 70 6c 65  ? 0 : p->nSample
122b0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 31 20  ;.  }..  if( p1 
122c0 7c 7c 20 70 32 20 29 7b 0a 20 20 20 20 69 6e 74  || p2 ){.    int
122d0 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 44 69 66   i;.    int nDif
122e0 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  f;.    for(i=0; 
122f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
12300 20 69 3c 70 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69   i<p->nSample; i
12310 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ++){.      rc = 
12320 73 71 6c 69 74 65 33 53 74 61 74 34 43 6f 6c 75  sqlite3Stat4Colu
12330 6d 6e 28 64 62 2c 20 70 2d 3e 61 53 61 6d 70 6c  mn(db, p->aSampl
12340 65 5b 69 5d 2e 70 2c 20 70 2d 3e 61 53 61 6d 70  e[i].p, p->aSamp
12350 6c 65 5b 69 5d 2e 6e 2c 20 6e 45 71 2c 20 26 70  le[i].n, nEq, &p
12360 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Val);.      if( 
12370 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
12380 20 70 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69   p1 ){.        i
12390 6e 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33  nt res = sqlite3
123a0 4d 65 6d 43 6f 6d 70 61 72 65 28 70 31 2c 20 70  MemCompare(p1, p
123b0 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20  Val, pColl);.   
123c0 20 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20       if( res>=0 
123d0 29 20 6e 4c 6f 77 65 72 2b 2b 3b 0a 20 20 20 20  ) nLower++;.    
123e0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
123f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
12400 32 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  2 ){.        int
12410 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65   res = sqlite3Me
12420 6d 43 6f 6d 70 61 72 65 28 70 32 2c 20 70 56 61  mCompare(p2, pVa
12430 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  l, pColl);.     
12440 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20     if( res>=0 ) 
12450 6e 55 70 70 65 72 2b 2b 3b 0a 20 20 20 20 20 20  nUpper++;.      
12460 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 44 69 66  }.    }.    nDif
12470 66 20 3d 20 28 6e 55 70 70 65 72 20 2d 20 6e 4c  f = (nUpper - nL
12480 6f 77 65 72 29 3b 0a 20 20 20 20 69 66 28 20 6e  ower);.    if( n
12490 44 69 66 66 3c 3d 30 20 29 20 6e 44 69 66 66 20  Diff<=0 ) nDiff 
124a0 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  = 1;..    /* If 
124b0 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 6e  there is both an
124c0 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72   upper and lower
124d0 20 62 6f 75 6e 64 20 73 70 65 63 69 66 69 65 64   bound specified
124e0 2c 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a  , and the .    *
124f0 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 69 6e  * comparisons in
12500 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 79  dicate that they
12510 20 61 72 65 20 63 6c 6f 73 65 20 74 6f 67 65 74   are close toget
12520 68 65 72 2c 20 75 73 65 20 74 68 65 20 66 61 6c  her, use the fal
12530 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6d 65 74  lback.    ** met
12540 68 6f 64 20 28 61 73 73 75 6d 65 20 74 68 61 74  hod (assume that
12550 20 74 68 65 20 73 63 61 6e 20 76 69 73 69 74 73   the scan visits
12560 20 31 2f 36 34 20 6f 66 20 74 68 65 20 72 6f 77   1/64 of the row
12570 73 29 20 66 6f 72 20 65 73 74 69 6d 61 74 69 6e  s) for estimatin
12580 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e 75 6d  g.    ** the num
12590 62 65 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69  ber of rows visi
125a0 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ted. Otherwise, 
125b0 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  estimate the num
125c0 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20  ber of rows.    
125d0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 6d 65 74  ** using the met
125e0 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 69 6e  hod described in
125f0 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
12600 65 6e 74 20 66 6f 72 20 74 68 69 73 20 66 75 6e  ent for this fun
12610 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66  ction. */.    if
12620 28 20 6e 44 69 66 66 21 3d 31 20 7c 7c 20 70 55  ( nDiff!=1 || pU
12630 70 70 65 72 3d 3d 30 20 7c 7c 20 70 4c 6f 77 65  pper==0 || pLowe
12640 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  r==0 ){.      in
12650 74 20 6e 41 64 6a 75 73 74 20 3d 20 28 73 71 6c  t nAdjust = (sql
12660 69 74 65 33 4c 6f 67 45 73 74 28 70 2d 3e 6e 53  ite3LogEst(p->nS
12670 61 6d 70 6c 65 29 20 2d 20 73 71 6c 69 74 65 33  ample) - sqlite3
12680 4c 6f 67 45 73 74 28 6e 44 69 66 66 29 29 3b 0a  LogEst(nDiff));.
12690 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75        pLoop->nOu
126a0 74 20 2d 3d 20 6e 41 64 6a 75 73 74 3b 0a 20 20  t -= nAdjust;.  
126b0 20 20 20 20 2a 70 62 44 6f 6e 65 20 3d 20 31 3b      *pbDone = 1;
126c0 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
126d0 45 28 30 78 31 30 2c 20 28 22 72 61 6e 67 65 20  E(0x10, ("range 
126e0 73 6b 69 70 2d 73 63 61 6e 20 72 65 67 69 6f 6e  skip-scan region
126f0 73 3a 20 25 75 2e 2e 25 75 20 20 61 64 6a 75 73  s: %u..%u  adjus
12700 74 3d 25 64 20 65 73 74 3d 25 64 5c 6e 22 2c 0a  t=%d est=%d\n",.
12710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12720 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32 29             (u32)
12730 6e 4c 6f 77 65 72 2c 20 28 75 33 32 29 6e 55 70  nLower, (u32)nUp
12740 70 65 72 2c 20 6e 41 64 6a 75 73 74 2a 2d 31 2c  per, nAdjust*-1,
12750 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 29 29 3b 0a   pLoop->nOut));.
12760 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a      }..  }else{.
12770 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 62 44      assert( *pbD
12780 6f 6e 65 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  one==0 );.  }.. 
12790 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
127a0 65 28 70 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  e(p1);.  sqlite3
127b0 56 61 6c 75 65 46 72 65 65 28 70 32 29 3b 0a 20  ValueFree(p2);. 
127c0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
127d0 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75  e(pVal);..  retu
127e0 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
127f0 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
12800 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
12810 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  */../*.** This f
12820 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
12830 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
12840 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
12850 68 61 74 20 77 69 6c 6c 20 62 65 20 76 69 73 69  hat will be visi
12860 74 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69  ted.** by scanni
12870 6e 67 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20  ng an index for 
12880 61 20 72 61 6e 67 65 20 6f 66 20 76 61 6c 75 65  a range of value
12890 73 2e 20 54 68 65 20 72 61 6e 67 65 20 6d 61 79  s. The range may
128a0 20 68 61 76 65 20 61 6e 20 75 70 70 65 72 0a 2a   have an upper.*
128b0 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72  * bound, a lower
128c0 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e   bound, or both.
128d0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
128e0 65 20 74 65 72 6d 73 20 74 68 61 74 20 73 65 74  e terms that set
128f0 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e   the upper.** an
12900 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20 61  d lower bounds a
12910 72 65 20 72 65 70 72 65 73 65 6e 74 65 64 20 62  re represented b
12920 79 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  y pLower and pUp
12930 70 65 72 20 72 65 73 70 65 63 74 69 76 65 6c 79  per respectively
12940 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65  . For.** example
12950 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20  , assuming that 
12960 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31  index p is on t1
12970 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e  (a):.**.**   ...
12980 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
12990 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e   > ? AND a < ? .
129a0 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ...**           
129b0 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c           |_____|
129c0 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20     |_____|.**   
129d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129e0 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c 0a      |         |.
129f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
12a00 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20 20 20         pLower   
12a10 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66   pUpper.**.** If
12a20 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 75   either of the u
12a30 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f  pper or lower bo
12a40 75 6e 64 20 69 73 20 6e 6f 74 20 70 72 65 73 65  und is not prese
12a50 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73  nt, then NULL is
12a60 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c   passed in.** pl
12a70 61 63 65 20 6f 66 20 74 68 65 20 63 6f 72 72 65  ace of the corre
12a80 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 54 65  sponding WhereTe
12a90 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  rm..**.** The va
12aa0 6c 75 65 20 69 6e 20 28 70 42 75 69 6c 64 65 72  lue in (pBuilder
12ab0 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ->pNew->u.btree.
12ac0 6e 45 71 29 20 69 73 20 74 68 65 20 69 6e 64 65  nEq) is the inde
12ad0 78 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 2a  x of the index.*
12ae0 2a 20 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63 74  * column subject
12af0 20 74 6f 20 74 68 65 20 72 61 6e 67 65 20 63 6f   to the range co
12b00 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65 71  nstraint. Or, eq
12b10 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65 20  uivalently, the 
12b20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 71 75  number of.** equ
12b30 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
12b40 73 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 74  s optimized by t
12b50 68 65 20 70 72 6f 70 6f 73 65 64 20 69 6e 64 65  he proposed inde
12b60 78 20 73 63 61 6e 2e 20 46 6f 72 20 65 78 61 6d  x scan. For exam
12b70 70 6c 65 2c 0a 2a 2a 20 61 73 73 75 6d 69 6e 67  ple,.** assuming
12b80 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74   index p is on t
12b90 31 28 61 2c 20 62 29 2c 20 61 6e 64 20 74 68 65  1(a, b), and the
12ba0 20 53 51 4c 20 71 75 65 72 79 20 69 73 3a 0a 2a   SQL query is:.*
12bb0 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20  *.**   ... FROM 
12bc0 74 31 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41  t1 WHERE a = ? A
12bd0 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20 62 20 3c  ND b > ? AND b <
12be0 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65   ? ....**.** the
12bf0 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20  n nEq is set to 
12c00 31 20 28 61 73 20 74 68 65 20 72 61 6e 67 65 20  1 (as the range 
12c10 72 65 73 74 72 69 63 74 65 64 20 63 6f 6c 75 6d  restricted colum
12c20 6e 2c 20 62 2c 20 69 73 20 74 68 65 20 73 65 63  n, b, is the sec
12c30 6f 6e 64 20 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73  ond .** left-mos
12c40 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
12c50 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66 20 74  index). Or, if t
12c60 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a  he query is:.**.
12c70 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  **   ... FROM t1
12c80 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44   WHERE a > ? AND
12c90 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a   a < ? ....**.**
12ca0 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65 74   then nEq is set
12cb0 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65   to 0..**.** Whe
12cc0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
12cd0 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 4f 75  is called, *pnOu
12ce0 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
12cf0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 29 20  sqlite3LogEst() 
12d00 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72  of the.** number
12d10 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 74 68   of rows that th
12d20 65 20 69 6e 64 65 78 20 73 63 61 6e 20 69 73 20  e index scan is 
12d30 65 78 70 65 63 74 65 64 20 74 6f 20 76 69 73 69  expected to visi
12d40 74 20 77 69 74 68 6f 75 74 20 0a 2a 2a 20 63 6f  t without .** co
12d50 6e 73 69 64 65 72 69 6e 67 20 74 68 65 20 72 61  nsidering the ra
12d60 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  nge constraints.
12d70 20 49 66 20 6e 45 71 20 69 73 20 30 2c 20 74 68   If nEq is 0, th
12d80 69 73 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  is is the number
12d90 20 6f 66 20 0a 2a 2a 20 72 6f 77 73 20 69 6e 20   of .** rows in 
12da0 74 68 65 20 69 6e 64 65 78 2e 20 41 73 73 75 6d  the index. Assum
12db0 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  ing no error occ
12dc0 75 72 73 2c 20 2a 70 6e 4f 75 74 20 69 73 20 61  urs, *pnOut is a
12dd0 64 6a 75 73 74 65 64 20 28 72 65 64 75 63 65 64  djusted (reduced
12de0 29 0a 2a 2a 20 74 6f 20 61 63 63 6f 75 6e 74 20  ).** to account 
12df0 66 6f 72 20 74 68 65 20 72 61 6e 67 65 20 63 6f  for the range co
12e00 6e 74 72 61 69 6e 74 73 20 70 4c 6f 77 65 72 20  ntraints pLower 
12e10 61 6e 64 20 70 55 70 70 65 72 2e 0a 2a 2a 20 0a  and pUpper..** .
12e20 2a 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63  ** In the absenc
12e30 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74  e of sqlite_stat
12e40 34 20 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20  4 ANALYZE data, 
12e50 6f 72 20 69 66 20 73 75 63 68 20 64 61 74 61 20  or if such data 
12e60 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75 73 65  cannot be.** use
12e70 64 2c 20 61 20 73 69 6e 67 6c 65 20 72 61 6e 67  d, a single rang
12e80 65 20 69 6e 65 71 75 61 6c 69 74 79 20 72 65 64  e inequality red
12e90 75 63 65 73 20 74 68 65 20 73 65 61 72 63 68 20  uces the search 
12ea0 73 70 61 63 65 20 62 79 20 61 20 66 61 63 74 6f  space by a facto
12eb0 72 20 6f 66 20 34 2e 20 0a 2a 2a 20 61 6e 64 20  r of 4. .** and 
12ec0 61 20 70 61 69 72 20 6f 66 20 63 6f 6e 73 74 72  a pair of constr
12ed0 61 69 6e 74 73 20 28 78 3e 3f 20 41 4e 44 20 78  aints (x>? AND x
12ee0 3c 3f 29 20 72 65 64 75 63 65 73 20 74 68 65 20  <?) reduces the 
12ef0 65 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20  expected number 
12f00 6f 66 0a 2a 2a 20 72 6f 77 73 20 76 69 73 69 74  of.** rows visit
12f10 65 64 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f  ed by a factor o
12f20 66 20 36 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  f 64..*/.static 
12f30 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53 63  int whereRangeSc
12f40 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a  anEst(.  Parse *
12f50 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
12f60 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20   Parsing & code 
12f70 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
12f80 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  xt */.  WhereLoo
12f90 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
12fa0 65 72 2c 0a 20 20 57 68 65 72 65 54 65 72 6d 20  er,.  WhereTerm 
12fb0 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f  *pLower,   /* Lo
12fc0 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  wer bound on the
12fd0 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31   range. ex: "x>1
12fe0 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  23" Might be NUL
12ff0 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  L */.  WhereTerm
13000 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55   *pUpper,   /* U
13010 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68  pper bound on th
13020 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c  e range. ex: "x<
13030 34 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55  455" Might be NU
13040 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  LL */.  WhereLoo
13050 70 20 2a 70 4c 6f 6f 70 20 20 20 20 20 2f 2a 20  p *pLoop     /* 
13060 4d 6f 64 69 66 79 20 74 68 65 20 2e 6e 4f 75 74  Modify the .nOut
13070 20 61 6e 64 20 6d 61 79 62 65 20 2e 72 52 75 6e   and maybe .rRun
13080 20 66 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20   fields */.){.  
13090 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
130a0 4f 4b 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 20 3d  OK;.  int nOut =
130b0 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20   pLoop->nOut;.  
130c0 4c 6f 67 45 73 74 20 6e 4e 65 77 3b 0a 0a 23 69  LogEst nNew;..#i
130d0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
130e0 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
130f0 34 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70  4.  Index *p = p
13100 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
13110 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20  ndex;.  int nEq 
13120 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
13130 2e 6e 45 71 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  .nEq;..  if( p->
13140 6e 53 61 6d 70 6c 65 3e 30 0a 20 20 20 26 26 20  nSample>0.   && 
13150 6e 45 71 3c 70 2d 3e 6e 53 61 6d 70 6c 65 43 6f  nEq<p->nSampleCo
13160 6c 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61  l.   && Optimiza
13170 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61 72  tionEnabled(pPar
13180 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 53  se->db, SQLITE_S
13190 74 61 74 33 29 20 0a 20 20 29 7b 0a 20 20 20 20  tat3) .  ){.    
131a0 69 66 28 20 6e 45 71 3d 3d 70 42 75 69 6c 64 65  if( nEq==pBuilde
131b0 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29 7b 0a  r->nRecValid ){.
131c0 20 20 20 20 20 20 55 6e 70 61 63 6b 65 64 52 65        UnpackedRe
131d0 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75  cord *pRec = pBu
131e0 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 20  ilder->pRec;.   
131f0 20 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b     tRowcnt a[2];
13200 0a 20 20 20 20 20 20 75 38 20 61 66 66 3b 0a 0a  .      u8 aff;..
13210 20 20 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c        /* Variabl
13220 65 20 69 4c 6f 77 65 72 20 77 69 6c 6c 20 62 65  e iLower will be
13230 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74 69   set to the esti
13240 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62  mate of the numb
13250 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 0a 20  er of rows in . 
13260 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65       ** the inde
13270 78 20 74 68 61 74 20 61 72 65 20 6c 65 73 73 20  x that are less 
13280 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72 20 62  than the lower b
13290 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67  ound of the rang
132a0 65 20 71 75 65 72 79 2e 20 54 68 65 0a 20 20 20  e query. The.   
132b0 20 20 20 2a 2a 20 6c 6f 77 65 72 20 62 6f 75 6e     ** lower boun
132c0 64 20 62 65 69 6e 67 20 74 68 65 20 63 6f 6e 63  d being the conc
132d0 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 24 50 20  atenation of $P 
132e0 61 6e 64 20 24 4c 2c 20 77 68 65 72 65 20 24 50  and $L, where $P
132f0 20 69 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   is the.      **
13300 20 6b 65 79 2d 70 72 65 66 69 78 20 66 6f 72 6d   key-prefix form
13310 65 64 20 62 79 20 74 68 65 20 6e 45 71 20 76 61  ed by the nEq va
13320 6c 75 65 73 20 6d 61 74 63 68 65 64 20 61 67 61  lues matched aga
13330 69 6e 73 74 20 74 68 65 20 6e 45 71 20 6c 65 66  inst the nEq lef
13340 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a 2a 20  t-most.      ** 
13350 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  columns of the i
13360 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69 73 20  ndex, and $L is 
13370 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70 4c 6f  the value in pLo
13380 77 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  wer..      **.  
13390 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c      ** Or, if pL
133a0 6f 77 65 72 20 69 73 20 4e 55 4c 4c 20 6f 72 20  ower is NULL or 
133b0 24 4c 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74  $L cannot be ext
133c0 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74 20 28  racted from it (
133d0 62 65 63 61 75 73 65 20 69 74 0a 20 20 20 20 20  because it.     
133e0 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73 69 6d   ** is not a sim
133f0 70 6c 65 20 76 61 72 69 61 62 6c 65 20 6f 72 20  ple variable or 
13400 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 29 2c 20  literal value), 
13410 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20  the lower bound 
13420 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  of the.      ** 
13430 72 61 6e 67 65 20 69 73 20 24 50 2e 20 44 75 65  range is $P. Due
13440 20 74 6f 20 61 20 71 75 69 72 6b 20 69 6e 20 74   to a quirk in t
13450 68 65 20 77 61 79 20 77 68 65 72 65 4b 65 79 53  he way whereKeyS
13460 74 61 74 73 28 29 20 77 6f 72 6b 73 2c 20 65 76  tats() works, ev
13470 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 24  en.      ** if $
13480 4c 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  L is available, 
13490 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29 20  whereKeyStats() 
134a0 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 62 6f  is called for bo
134b0 74 68 20 28 24 50 29 20 61 6e 64 20 0a 20 20 20  th ($P) and .   
134c0 20 20 20 2a 2a 20 28 24 50 3a 24 4c 29 20 61 6e     ** ($P:$L) an
134d0 64 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20  d the larger of 
134e0 74 68 65 20 74 77 6f 20 72 65 74 75 72 6e 65 64  the two returned
134f0 20 76 61 6c 75 65 73 20 75 73 65 64 2e 0a 20 20   values used..  
13500 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
13510 53 69 6d 69 6c 61 72 6c 79 2c 20 69 55 70 70 65  Similarly, iUppe
13520 72 20 69 73 20 74 6f 20 62 65 20 73 65 74 20 74  r is to be set t
13530 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f  o the estimate o
13540 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
13550 72 6f 77 73 0a 20 20 20 20 20 20 2a 2a 20 6c 65  rows.      ** le
13560 73 73 20 74 68 61 6e 20 74 68 65 20 75 70 70 65  ss than the uppe
13570 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72  r bound of the r
13580 61 6e 67 65 20 71 75 65 72 79 2e 20 57 68 65 72  ange query. Wher
13590 65 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e  e the upper boun
135a0 64 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69  d.      ** is ei
135b0 74 68 65 72 20 28 24 50 29 20 6f 72 20 28 24 50  ther ($P) or ($P
135c0 3a 24 55 29 2e 20 41 67 61 69 6e 2c 20 65 76 65  :$U). Again, eve
135d0 6e 20 69 66 20 24 55 20 69 73 20 61 76 61 69 6c  n if $U is avail
135e0 61 62 6c 65 2c 20 62 6f 74 68 20 76 61 6c 75 65  able, both value
135f0 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 69 55  s.      ** of iU
13600 70 70 65 72 20 61 72 65 20 72 65 71 75 65 73 74  pper are request
13610 65 64 20 6f 66 20 77 68 65 72 65 4b 65 79 53 74  ed of whereKeySt
13620 61 74 73 28 29 20 61 6e 64 20 74 68 65 20 73 6d  ats() and the sm
13630 61 6c 6c 65 72 20 75 73 65 64 2e 0a 20 20 20 20  aller used..    
13640 20 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77 63    */.      tRowc
13650 6e 74 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 20  nt iLower;.     
13660 20 74 52 6f 77 63 6e 74 20 69 55 70 70 65 72 3b   tRowcnt iUpper;
13670 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 45 71 3d  ..      if( nEq=
13680 3d 70 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20  =p->nKeyCol ){. 
13690 20 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c         aff = SQL
136a0 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b  ITE_AFF_INTEGER;
136b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
136c0 20 20 20 20 20 20 61 66 66 20 3d 20 70 2d 3e 70        aff = p->p
136d0 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61  Table->aCol[p->a
136e0 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 5d 2e 61 66  iColumn[nEq]].af
136f0 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 7d 0a  finity;.      }.
13700 20 20 20 20 20 20 2f 2a 20 44 65 74 65 72 6d 69        /* Determi
13710 6e 65 20 69 4c 6f 77 65 72 20 61 6e 64 20 69 55  ne iLower and iU
13720 70 70 65 72 20 75 73 69 6e 67 20 28 24 50 29 20  pper using ($P) 
13730 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69  only. */.      i
13740 66 28 20 6e 45 71 3d 3d 30 20 29 7b 0a 20 20 20  f( nEq==0 ){.   
13750 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 30 3b       iLower = 0;
13760 0a 20 20 20 20 20 20 20 20 69 55 70 70 65 72 20  .        iUpper 
13770 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54  = sqlite3LogEstT
13780 6f 49 6e 74 28 70 2d 3e 61 69 52 6f 77 4c 6f 67  oInt(p->aiRowLog
13790 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d  Est[0]);.      }
137a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
137b0 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 6c 6c   Note: this call
137c0 20 63 6f 75 6c 64 20 62 65 20 6f 70 74 69 6d 69   could be optimi
137d0 7a 65 64 20 61 77 61 79 20 2d 20 73 69 6e 63 65  zed away - since
137e0 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 73   the same values
137f0 20 6d 75 73 74 20 0a 20 20 20 20 20 20 20 20 2a   must .        *
13800 2a 20 68 61 76 65 20 62 65 65 6e 20 72 65 71 75  * have been requ
13810 65 73 74 65 64 20 77 68 65 6e 20 74 65 73 74 69  ested when testi
13820 6e 67 20 6b 65 79 20 24 50 20 69 6e 20 77 68 65  ng key $P in whe
13830 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 29  reEqualScanEst()
13840 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68  .  */.        wh
13850 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72  ereKeyStats(pPar
13860 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20  se, p, pRec, 0, 
13870 61 29 3b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77  a);.        iLow
13880 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20  er = a[0];.     
13890 20 20 20 69 55 70 70 65 72 20 3d 20 61 5b 30 5d     iUpper = a[0]
138a0 20 2b 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d   + a[1];.      }
138b0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f  ..      /* If po
138c0 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20  ssible, improve 
138d0 6f 6e 20 74 68 65 20 69 4c 6f 77 65 72 20 65 73  on the iLower es
138e0 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50  timate using ($P
138f0 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69  :$L). */.      i
13900 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20  f( pLower ){.   
13910 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20       int bOk;   
13920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13930 20 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75   /* True if valu
13940 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  e is extracted f
13950 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20  rom pExpr */.   
13960 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
13970 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72   = pLower->pExpr
13980 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
13990 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 77 65    assert( (pLowe
139a0 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  r->eOperator & (
139b0 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29 21 3d 30  WO_GT|WO_GE))!=0
139c0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
139d0 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
139e0 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73  beSetValue(pPars
139f0 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78  e, p, &pRec, pEx
13a00 70 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26 62  pr, aff, nEq, &b
13a10 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Ok);.        if(
13a20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
13a30 26 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20 20  & bOk ){.       
13a40 20 20 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b     tRowcnt iNew;
13a50 0a 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65  .          where
13a60 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
13a70 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b   p, pRec, 0, a);
13a80 0a 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20  .          iNew 
13a90 3d 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f 77 65  = a[0] + ((pLowe
13aa0 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  r->eOperator & W
13ab0 4f 5f 47 54 29 20 3f 20 61 5b 31 5d 20 3a 20 30  O_GT) ? a[1] : 0
13ac0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
13ad0 20 69 4e 65 77 3e 69 4c 6f 77 65 72 20 29 20 69   iNew>iLower ) i
13ae0 4c 6f 77 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20  Lower = iNew;.  
13af0 20 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a          nOut--;.
13b00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13b10 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  }..      /* If p
13b20 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65  ossible, improve
13b30 20 6f 6e 20 74 68 65 20 69 55 70 70 65 72 20 65   on the iUpper e
13b40 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24  stimate using ($
13b50 50 3a 24 55 29 2e 20 2a 2f 0a 20 20 20 20 20 20  P:$U). */.      
13b60 69 66 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20  if( pUpper ){.  
13b70 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20        int bOk;  
13b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b90 20 20 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c    /* True if val
13ba0 75 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ue is extracted 
13bb0 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20  from pExpr */.  
13bc0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
13bd0 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70  r = pUpper->pExp
13be0 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
13bf0 20 20 20 61 73 73 65 72 74 28 20 28 70 55 70 70     assert( (pUpp
13c00 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
13c10 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d  (WO_LT|WO_LE))!=
13c20 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
13c30 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72  = sqlite3Stat4Pr
13c40 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72  obeSetValue(pPar
13c50 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45  se, p, &pRec, pE
13c60 78 70 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26  xpr, aff, nEq, &
13c70 62 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  bOk);.        if
13c80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13c90 26 26 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20  && bOk ){.      
13ca0 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4e 65 77      tRowcnt iNew
13cb0 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 65 72  ;.          wher
13cc0 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65  eKeyStats(pParse
13cd0 2c 20 70 2c 20 70 52 65 63 2c 20 31 2c 20 61 29  , p, pRec, 1, a)
13ce0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4e 65 77  ;.          iNew
13cf0 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70 55 70 70   = a[0] + ((pUpp
13d00 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
13d10 57 4f 5f 4c 45 29 20 3f 20 61 5b 31 5d 20 3a 20  WO_LE) ? a[1] : 
13d20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
13d30 28 20 69 4e 65 77 3c 69 55 70 70 65 72 20 29 20  ( iNew<iUpper ) 
13d40 69 55 70 70 65 72 20 3d 20 69 4e 65 77 3b 0a 20  iUpper = iNew;. 
13d50 20 20 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b           nOut--;
13d60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13d70 20 7d 0a 0a 20 20 20 20 20 20 70 42 75 69 6c 64   }..      pBuild
13d80 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b  er->pRec = pRec;
13d90 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
13da0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13db0 20 20 20 20 69 66 28 20 69 55 70 70 65 72 3e 69      if( iUpper>i
13dc0 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20  Lower ){.       
13dd0 20 20 20 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65     nNew = sqlite
13de0 33 4c 6f 67 45 73 74 28 69 55 70 70 65 72 20 2d  3LogEst(iUpper -
13df0 20 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20   iLower);.      
13e00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13e10 20 20 20 6e 4e 65 77 20 3d 20 31 30 3b 20 20 20     nNew = 10;   
13e20 20 20 20 20 20 61 73 73 65 72 74 28 20 31 30 3d       assert( 10=
13e30 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32  =sqlite3LogEst(2
13e40 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ) );.        }. 
13e50 20 20 20 20 20 20 20 69 66 28 20 6e 4e 65 77 3c         if( nNew<
13e60 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20  nOut ){.        
13e70 20 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 20    nOut = nNew;. 
13e80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13e90 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28   pLoop->nOut = (
13ea0 4c 6f 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20 20  LogEst)nOut;.   
13eb0 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
13ec0 30 78 31 30 2c 20 28 22 72 61 6e 67 65 20 73 63  0x10, ("range sc
13ed0 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 75 2e 2e  an regions: %u..
13ee0 25 75 20 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20  %u  est=%d\n",. 
13ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f00 20 20 20 20 20 20 20 20 20 20 28 75 33 32 29 69            (u32)i
13f10 4c 6f 77 65 72 2c 20 28 75 33 32 29 69 55 70 70  Lower, (u32)iUpp
13f20 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 20 20  er, nOut));.    
13f30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13f40 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
13f50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
13f60 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  nt bDone = 0;.  
13f70 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 52 61      rc = whereRa
13f80 6e 67 65 53 6b 69 70 53 63 61 6e 45 73 74 28 70  ngeSkipScanEst(p
13f90 50 61 72 73 65 2c 20 70 4c 6f 77 65 72 2c 20 70  Parse, pLower, p
13fa0 55 70 70 65 72 2c 20 70 4c 6f 6f 70 2c 20 26 62  Upper, pLoop, &b
13fb0 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Done);.      if(
13fc0 20 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e 20   bDone ) return 
13fd0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  rc;.    }.  }.#e
13fe0 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
13ff0 41 4d 45 54 45 52 28 70 50 61 72 73 65 29 3b 0a  AMETER(pParse);.
14000 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
14010 45 52 28 70 42 75 69 6c 64 65 72 29 3b 0a 23 65  ER(pBuilder);.#e
14020 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
14030 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72 20  Lower || pUpper 
14040 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 55 70  );.  assert( pUp
14050 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70 65  per==0 || (pUppe
14060 72 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  r->wtFlags & TER
14070 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20  M_VNULL)==0 );. 
14080 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52 61 6e   nNew = whereRan
14090 67 65 41 64 6a 75 73 74 28 70 4c 6f 77 65 72 2c  geAdjust(pLower,
140a0 20 6e 4f 75 74 29 3b 0a 20 20 6e 4e 65 77 20 3d   nOut);.  nNew =
140b0 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73   whereRangeAdjus
140c0 74 28 70 55 70 70 65 72 2c 20 6e 4e 65 77 29 3b  t(pUpper, nNew);
140d0 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49  ..  /* TUNING: I
140e0 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68 20  f there is both 
140f0 61 6e 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77  an upper and low
14100 65 72 20 6c 69 6d 69 74 2c 20 61 73 73 75 6d 65  er limit, assume
14110 20 74 68 65 20 72 61 6e 67 65 20 69 73 0a 20 20   the range is.  
14120 2a 2a 20 72 65 64 75 63 65 64 20 62 79 20 61 6e  ** reduced by an
14130 20 61 64 64 69 74 69 6f 6e 61 6c 20 37 35 25 2e   additional 75%.
14140 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
14150 2c 20 62 79 20 64 65 66 61 75 6c 74 2c 20 61 6e  , by default, an
14160 20 6f 70 65 6e 2d 65 6e 64 65 64 0a 20 20 2a 2a   open-ended.  **
14170 20 72 61 6e 67 65 20 71 75 65 72 79 20 28 65 2e   range query (e.
14180 67 2e 20 63 6f 6c 20 3e 20 3f 29 20 69 73 20 61  g. col > ?) is a
14190 73 73 75 6d 65 64 20 74 6f 20 6d 61 74 63 68 20  ssumed to match 
141a0 31 2f 34 20 6f 66 20 74 68 65 20 72 6f 77 73 20  1/4 of the rows 
141b0 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65  in the.  ** inde
141c0 78 2e 20 57 68 69 6c 65 20 61 20 63 6c 6f 73 65  x. While a close
141d0 64 20 72 61 6e 67 65 20 28 65 2e 67 2e 20 63 6f  d range (e.g. co
141e0 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20  l BETWEEN ? AND 
141f0 3f 29 20 69 73 20 65 73 74 69 6d 61 74 65 64 20  ?) is estimated 
14200 74 6f 0a 20 20 2a 2a 20 6d 61 74 63 68 20 31 2f  to.  ** match 1/
14210 36 34 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  64 of the index.
14220 20 2a 2f 20 0a 20 20 69 66 28 20 70 4c 6f 77 65   */ .  if( pLowe
14230 72 20 26 26 20 70 55 70 70 65 72 20 29 20 6e 4e  r && pUpper ) nN
14240 65 77 20 2d 3d 20 32 30 3b 0a 0a 20 20 6e 4f 75  ew -= 20;..  nOu
14250 74 20 2d 3d 20 28 70 4c 6f 77 65 72 21 3d 30 29  t -= (pLower!=0)
14260 20 2b 20 28 70 55 70 70 65 72 21 3d 30 29 3b 0a   + (pUpper!=0);.
14270 20 20 69 66 28 20 6e 4e 65 77 3c 31 30 20 29 20    if( nNew<10 ) 
14280 6e 4e 65 77 20 3d 20 31 30 3b 0a 20 20 69 66 28  nNew = 10;.  if(
14290 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 20 6e 4f 75   nNew<nOut ) nOu
142a0 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 70 4c 6f 6f  t = nNew;.  pLoo
142b0 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73  p->nOut = (LogEs
142c0 74 29 6e 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e  t)nOut;.  return
142d0 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
142e0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
142f0 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a  T3_OR_STAT4./*.*
14300 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e  * Estimate the n
14310 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
14320 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
14330 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ned based on.** 
14340 61 6e 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  an equality cons
14350 74 72 61 69 6e 74 20 78 3d 56 41 4c 55 45 20 61  traint x=VALUE a
14360 6e 64 20 77 68 65 72 65 20 74 68 61 74 20 56 41  nd where that VA
14370 4c 55 45 20 6f 63 63 75 72 73 20 69 6e 0a 2a 2a  LUE occurs in.**
14380 20 74 68 65 20 68 69 73 74 6f 67 72 61 6d 20 64   the histogram d
14390 61 74 61 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20  ata.  This only 
143a0 77 6f 72 6b 73 20 77 68 65 6e 20 78 20 69 73 20  works when x is 
143b0 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a  the left-most.**
143c0 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e   column of an in
143d0 64 65 78 20 61 6e 64 20 73 71 6c 69 74 65 5f 73  dex and sqlite_s
143e0 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64  tat3 histogram d
143f0 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ata is available
14400 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20 69 6e 64  .** for that ind
14410 65 78 2e 20 20 57 68 65 6e 20 70 45 78 70 72 3d  ex.  When pExpr=
14420 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
14430 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
14440 69 73 0a 2a 2a 20 22 78 20 49 53 20 4e 55 4c 4c  is.** "x IS NULL
14450 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 78 3d  " instead of "x=
14460 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72  VALUE"..**.** Wr
14470 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65  ite the estimate
14480 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f  d row count into
14490 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75   *pnRow and retu
144a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a  rn SQLITE_OK. .*
144b0 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d  * If unable to m
144c0 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c  ake an estimate,
144d0 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e   leave *pnRow un
144e0 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75  changed and retu
144f0 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  rn.** non-zero..
14500 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
14510 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69  ne can fail if i
14520 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c  t is unable to l
14530 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  oad a collating 
14540 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75  sequence.** requ
14550 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20  ired for string 
14560 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69  comparison, or i
14570 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  f unable to allo
14580 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66  cate memory.** f
14590 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73  or a UTF convers
145a0 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72  ion required for
145b0 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68   comparison.  Th
145c0 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65  e error is store
145d0 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72  d.** in the pPar
145e0 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
145f0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
14600 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 0a 20  eEqualScanEst(. 
14610 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
14620 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
14630 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
14640 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
14650 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
14660 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 45 78   *pBuilder,.  Ex
14670 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
14680 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
14690 20 66 6f 72 20 56 41 4c 55 45 20 69 6e 20 74 68   for VALUE in th
146a0 65 20 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72  e x=VALUE constr
146b0 61 69 6e 74 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  aint */.  tRowcn
146c0 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f  t *pnRow       /
146d0 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76 69  * Write the revi
146e0 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65  sed row estimate
146f0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e   here */.){.  In
14700 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65  dex *p = pBuilde
14710 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
14720 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e  .pIndex;.  int n
14730 45 71 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  Eq = pBuilder->p
14740 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
14750 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  ;.  UnpackedReco
14760 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69 6c  rd *pRec = pBuil
14770 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 75 38 20  der->pRec;.  u8 
14780 61 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  aff;            
14790 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
147a0 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a 20 20 69   affinity */.  i
147b0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
147c0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66           /* Subf
147d0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63  unction return c
147e0 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  ode */.  tRowcnt
147f0 20 61 5b 32 5d 3b 20 20 20 20 20 20 20 20 20 20   a[2];          
14800 20 20 20 2f 2a 20 53 74 61 74 69 73 74 69 63 73     /* Statistics
14810 20 2a 2f 0a 20 20 69 6e 74 20 62 4f 6b 3b 0a 0a   */.  int bOk;..
14820 20 20 61 73 73 65 72 74 28 20 6e 45 71 3e 3d 31    assert( nEq>=1
14830 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45   );.  assert( nE
14840 71 3c 3d 28 70 2d 3e 6e 4b 65 79 43 6f 6c 2b 31  q<=(p->nKeyCol+1
14850 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
14860 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a  ->aSample!=0 );.
14870 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 61    assert( p->nSa
14880 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  mple>0 );.  asse
14890 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  rt( pBuilder->nR
148a0 65 63 56 61 6c 69 64 3c 6e 45 71 20 29 3b 0a 0a  ecValid<nEq );..
148b0 20 20 2f 2a 20 49 66 20 76 61 6c 75 65 73 20 61    /* If values a
148c0 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  re not available
148d0 20 66 6f 72 20 61 6c 6c 20 66 69 65 6c 64 73 20   for all fields 
148e0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20  of the index to 
148f0 74 68 65 20 6c 65 66 74 0a 20 20 2a 2a 20 6f 66  the left.  ** of
14900 20 74 68 69 73 20 6f 6e 65 2c 20 6e 6f 20 65 73   this one, no es
14910 74 69 6d 61 74 65 20 63 61 6e 20 62 65 20 6d 61  timate can be ma
14920 64 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  de. Return SQLIT
14930 45 5f 4e 4f 54 46 4f 55 4e 44 2e 20 2a 2f 0a 20  E_NOTFOUND. */. 
14940 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e   if( pBuilder->n
14950 52 65 63 56 61 6c 69 64 3c 28 6e 45 71 2d 31 29  RecValid<(nEq-1)
14960 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
14970 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
14980 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69    }..  /* This i
14990 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
149a0 6e 20 6f 6e 6c 79 2e 20 54 68 65 20 63 61 6c 6c  n only. The call
149b0 20 74 6f 20 73 71 6c 69 74 65 33 53 74 61 74 34   to sqlite3Stat4
149c0 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 29 0a  ProbeSetValue().
149d0 20 20 2a 2a 20 62 65 6c 6f 77 20 77 6f 75 6c 64    ** below would
149e0 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
149f0 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 69 66   value.  */.  if
14a00 28 20 6e 45 71 3e 70 2d 3e 6e 4b 65 79 43 6f 6c  ( nEq>p->nKeyCol
14a10 20 29 7b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d   ){.    *pnRow =
14a20 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
14a30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
14a40 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65   aff = p->pTable
14a50 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75  ->aCol[p->aiColu
14a60 6d 6e 5b 6e 45 71 2d 31 5d 5d 2e 61 66 66 69 6e  mn[nEq-1]].affin
14a70 69 74 79 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ity;.  rc = sqli
14a80 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74  te3Stat4ProbeSet
14a90 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c  Value(pParse, p,
14aa0 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61   &pRec, pExpr, a
14ab0 66 66 2c 20 6e 45 71 2d 31 2c 20 26 62 4f 6b 29  ff, nEq-1, &bOk)
14ac0 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52  ;.  pBuilder->pR
14ad0 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 69 66 28  ec = pRec;.  if(
14ae0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14af0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66   return rc;.  if
14b00 28 20 62 4f 6b 3d 3d 30 20 29 20 72 65 74 75 72  ( bOk==0 ) retur
14b10 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
14b20 44 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e  D;.  pBuilder->n
14b30 52 65 63 56 61 6c 69 64 20 3d 20 6e 45 71 3b 0a  RecValid = nEq;.
14b40 0a 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73  .  whereKeyStats
14b50 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63  (pParse, p, pRec
14b60 2c 20 30 2c 20 61 29 3b 0a 20 20 57 48 45 52 45  , 0, a);.  WHERE
14b70 54 52 41 43 45 28 30 78 31 30 2c 28 22 65 71 75  TRACE(0x10,("equ
14b80 61 6c 69 74 79 20 73 63 61 6e 20 72 65 67 69 6f  ality scan regio
14b90 6e 73 3a 20 25 64 5c 6e 22 2c 20 28 69 6e 74 29  ns: %d\n", (int)
14ba0 61 5b 31 5d 29 29 3b 0a 20 20 2a 70 6e 52 6f 77  a[1]));.  *pnRow
14bb0 20 3d 20 61 5b 31 5d 3b 0a 20 20 0a 20 20 72 65   = a[1];.  .  re
14bc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
14bd0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
14be0 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
14bf0 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  4 */..#ifdef SQL
14c00 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
14c10 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20  _OR_STAT4./*.** 
14c20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  Estimate the num
14c30 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
14c40 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
14c50 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e  d based on.** an
14c60 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 77   IN constraint w
14c70 68 65 72 65 20 74 68 65 20 72 69 67 68 74 2d 68  here the right-h
14c80 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
14c90 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69  IN operator.** i
14ca0 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75  s a list of valu
14cb0 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a  es.  Example:.**
14cc0 0a 2a 2a 20 20 20 20 20 20 20 20 57 48 45 52 45  .**        WHERE
14cd0 20 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34 29 0a   x IN (1,2,3,4).
14ce0 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
14cf0 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f  estimated row co
14d00 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20  unt into *pnRow 
14d10 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
14d20 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61  E_OK. .** If una
14d30 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65  ble to make an e
14d40 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a  stimate, leave *
14d50 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20  pnRow unchanged 
14d60 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f  and return.** no
14d70 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  n-zero..**.** Th
14d80 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66  is routine can f
14d90 61 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61  ail if it is una
14da0 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f  ble to load a co
14db0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
14dc0 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72  .** required for
14dd0 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73   string comparis
14de0 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65  on, or if unable
14df0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
14e00 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46  ory.** for a UTF
14e10 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75   conversion requ
14e20 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69  ired for compari
14e30 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20  son.  The error 
14e40 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  is stored.** in 
14e50 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
14e60 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
14e70 69 6e 74 20 77 68 65 72 65 49 6e 53 63 61 6e 45  int whereInScanE
14e80 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
14e90 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
14ea0 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
14eb0 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
14ec0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  */.  WhereLoopBu
14ed0 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
14ee0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
14ef0 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 76  st,     /* The v
14f00 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74 68 65  alue list on the
14f10 20 52 48 53 20 6f 66 20 22 78 20 49 4e 20 28 76   RHS of "x IN (v
14f20 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f  1,v2,v3,...)" */
14f30 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f  .  tRowcnt *pnRo
14f40 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  w       /* Write
14f50 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77   the revised row
14f60 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a   estimate here *
14f70 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20  /.){.  Index *p 
14f80 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
14f90 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
14fa0 3b 0a 20 20 69 36 34 20 6e 52 6f 77 30 20 3d 20  ;.  i64 nRow0 = 
14fb0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49  sqlite3LogEstToI
14fc0 6e 74 28 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  nt(p->aiRowLogEs
14fd0 74 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 6e 52 65  t[0]);.  int nRe
14fe0 63 56 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65  cValid = pBuilde
14ff0 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20  r->nRecValid;.  
15000 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
15010 4f 4b 3b 20 20 20 20 20 2f 2a 20 53 75 62 66 75  OK;     /* Subfu
15020 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f  nction return co
15030 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  de */.  tRowcnt 
15040 6e 45 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  nEst;           
15050 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77  /* Number of row
15060 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74  s for a single t
15070 65 72 6d 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  erm */.  tRowcnt
15080 20 6e 52 6f 77 45 73 74 20 3d 20 30 3b 20 20 20   nRowEst = 0;   
15090 20 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65   /* New estimate
150a0 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
150b0 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20  f rows */.  int 
150c0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
150d0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
150e0 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
150f0 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20  ( p->aSample!=0 
15100 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  );.  for(i=0; rc
15110 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
15120 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
15130 2b 2b 29 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20  ++){.    nEst = 
15140 6e 52 6f 77 30 3b 0a 20 20 20 20 72 63 20 3d 20  nRow0;.    rc = 
15150 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73  whereEqualScanEs
15160 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64  t(pParse, pBuild
15170 65 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  er, pList->a[i].
15180 70 45 78 70 72 2c 20 26 6e 45 73 74 29 3b 0a 20  pExpr, &nEst);. 
15190 20 20 20 6e 52 6f 77 45 73 74 20 2b 3d 20 6e 45     nRowEst += nE
151a0 73 74 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72  st;.    pBuilder
151b0 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 52  ->nRecValid = nR
151c0 65 63 56 61 6c 69 64 3b 0a 20 20 7d 0a 0a 20 20  ecValid;.  }..  
151d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
151e0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 6f  K ){.    if( nRo
151f0 77 45 73 74 20 3e 20 6e 52 6f 77 30 20 29 20 6e  wEst > nRow0 ) n
15200 52 6f 77 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a  RowEst = nRow0;.
15210 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f      *pnRow = nRo
15220 77 45 73 74 3b 0a 20 20 20 20 57 48 45 52 45 54  wEst;.    WHERET
15230 52 41 43 45 28 30 78 31 30 2c 28 22 49 4e 20 72  RACE(0x10,("IN r
15240 6f 77 20 65 73 74 69 6d 61 74 65 3a 20 65 73 74  ow estimate: est
15250 3d 25 67 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29  =%g\n", nRowEst)
15260 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
15270 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
15280 61 6c 69 64 3d 3d 6e 52 65 63 56 61 6c 69 64 20  alid==nRecValid 
15290 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
152a0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
152b0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
152c0 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a  OR_STAT4 */../*.
152d0 2a 2a 20 44 69 73 61 62 6c 65 20 61 20 74 65 72  ** Disable a ter
152e0 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  m in the WHERE c
152f0 6c 61 75 73 65 2e 20 20 45 78 63 65 70 74 2c 20  lause.  Except, 
15300 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c 65 20 74  do not disable t
15310 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74  he term.** if it
15320 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54   controls a LEFT
15330 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20   OUTER JOIN and 
15340 69 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69  it did not origi
15350 6e 61 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a  nate in the ON.*
15360 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  * or USING claus
15370 65 20 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a  e of that join..
15380 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74  **.** Consider t
15390 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b  he term t2.z='ok
153a0 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ' in the followi
153b0 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a  ng queries:.**.*
153c0 2a 20 20 20 28 31 29 20 20 53 45 4c 45 43 54 20  *   (1)  SELECT 
153d0 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a  * FROM t1 LEFT J
153e0 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74  OIN t2 ON t1.a=t
153f0 32 2e 78 20 57 48 45 52 45 20 74 32 2e 7a 3d 27  2.x WHERE t2.z='
15400 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20 20 53 45  ok'.**   (2)  SE
15410 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
15420 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
15430 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e  1.a=t2.x AND t2.
15440 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20  z='ok'.**   (3) 
15450 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
15460 31 2c 20 74 32 20 57 48 45 52 45 20 74 31 2e 61  1, t2 WHERE t1.a
15470 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27  =t2.x AND t2.z='
15480 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32  ok'.**.** The t2
15490 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69 73 61 62  .z='ok' is disab
154a0 6c 65 64 20 69 6e 20 74 68 65 20 69 6e 20 28 32  led in the in (2
154b0 29 20 62 65 63 61 75 73 65 20 69 74 20 6f 72 69  ) because it ori
154c0 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68  ginates.** in th
154d0 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54 68  e ON clause.  Th
154e0 65 20 74 65 72 6d 20 69 73 20 64 69 73 61 62 6c  e term is disabl
154f0 65 64 20 69 6e 20 28 33 29 20 62 65 63 61 75 73  ed in (3) becaus
15500 65 20 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74  e it is not part
15510 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f 55  .** of a LEFT OU
15520 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31  TER JOIN.  In (1
15530 29 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e  ), the term is n
15540 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a  ot disabled..**.
15550 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20 61 20 74  ** Disabling a t
15560 65 72 6d 20 63 61 75 73 65 73 20 74 68 61 74 20  erm causes that 
15570 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74  term to not be t
15580 65 73 74 65 64 20 69 6e 20 74 68 65 20 69 6e 6e  ested in the inn
15590 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68  er loop.** of th
155a0 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69  e join.  Disabli
155b0 6e 67 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ng is an optimiz
155c0 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72  ation.  When ter
155d0 6d 73 20 61 72 65 20 73 61 74 69 73 66 69 65 64  ms are satisfied
155e0 0a 2a 2a 20 62 79 20 69 6e 64 69 63 65 73 2c 20  .** by indices, 
155f0 77 65 20 64 69 73 61 62 6c 65 20 74 68 65 6d 20  we disable them 
15600 74 6f 20 70 72 65 76 65 6e 74 20 72 65 64 75 6e  to prevent redun
15610 64 61 6e 74 20 74 65 73 74 73 20 69 6e 20 74 68  dant tests in th
15620 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e  e inner.** loop.
15630 20 20 57 65 20 77 6f 75 6c 64 20 67 65 74 20 74    We would get t
15640 68 65 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c  he correct resul
15650 74 73 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 65  ts if nothing we
15660 72 65 20 65 76 65 72 20 64 69 73 61 62 6c 65 64  re ever disabled
15670 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d  ,.** but joins m
15680 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c  ight run a littl
15690 65 20 73 6c 6f 77 65 72 2e 20 20 54 68 65 20 74  e slower.  The t
156a0 72 69 63 6b 20 69 73 20 74 6f 20 64 69 73 61 62  rick is to disab
156b0 6c 65 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73  le as much.** as
156c0 20 77 65 20 63 61 6e 20 77 69 74 68 6f 75 74 20   we can without 
156d0 64 69 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75  disabling too mu
156e0 63 68 2e 20 20 49 66 20 77 65 20 64 69 73 61 62  ch.  If we disab
156f0 6c 65 64 20 69 6e 20 28 31 29 2c 20 77 65 27 64  led in (1), we'd
15700 20 67 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e   get.** the wron
15710 67 20 61 6e 73 77 65 72 2e 20 20 53 65 65 20 74  g answer.  See t
15720 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73  icket #813..*/.s
15730 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 61 62  tatic void disab
15740 6c 65 54 65 72 6d 28 57 68 65 72 65 4c 65 76 65  leTerm(WhereLeve
15750 6c 20 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72 65  l *pLevel, Where
15760 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20  Term *pTerm){.  
15770 69 66 28 20 70 54 65 72 6d 0a 20 20 20 20 20 20  if( pTerm.      
15780 26 26 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  && (pTerm->wtFla
15790 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29  gs & TERM_CODED)
157a0 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 28 70 4c  ==0.      && (pL
157b0 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d  evel->iLeftJoin=
157c0 3d 30 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f  =0 || ExprHasPro
157d0 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
157e0 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
157f0 29 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65 76  ).      && (pLev
15800 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 20 26 20 70  el->notReady & p
15810 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 29  Term->prereqAll)
15820 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 54 65  ==0.  ){.    pTe
15830 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
15840 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 69  ERM_CODED;.    i
15850 66 28 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  f( pTerm->iParen
15860 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68  t>=0 ){.      Wh
15870 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20  ereTerm *pOther 
15880 3d 20 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61  = &pTerm->pWC->a
15890 5b 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d  [pTerm->iParent]
158a0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2d 2d 70  ;.      if( (--p
158b0 4f 74 68 65 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d  Other->nChild)==
158c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73  0 ){.        dis
158d0 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
158e0 20 70 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20   pOther);.      
158f0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
15900 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f  *.** Code an OP_
15910 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20  Affinity opcode 
15920 74 6f 20 61 70 70 6c 79 20 74 68 65 20 63 6f 6c  to apply the col
15930 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72  umn affinity str
15940 69 6e 67 20 7a 41 66 66 0a 2a 2a 20 74 6f 20 74  ing zAff.** to t
15950 68 65 20 6e 20 72 65 67 69 73 74 65 72 73 20 73  he n registers s
15960 74 61 72 74 69 6e 67 20 61 74 20 62 61 73 65 2e  tarting at base.
15970 20 0a 2a 2a 0a 2a 2a 20 41 73 20 61 6e 20 6f 70   .**.** As an op
15980 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 53 51 4c 49  timization, SQLI
15990 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72  TE_AFF_NONE entr
159a0 69 65 73 20 28 77 68 69 63 68 20 61 72 65 20 6e  ies (which are n
159b0 6f 2d 6f 70 73 29 20 61 74 20 74 68 65 0a 2a 2a  o-ops) at the.**
159c0 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 65   beginning and e
159d0 6e 64 20 6f 66 20 7a 41 66 66 20 61 72 65 20 69  nd of zAff are i
159e0 67 6e 6f 72 65 64 2e 20 20 49 66 20 61 6c 6c 20  gnored.  If all 
159f0 65 6e 74 72 69 65 73 20 69 6e 20 7a 41 66 66 20  entries in zAff 
15a00 61 72 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46  are.** SQLITE_AF
15a10 46 5f 4e 4f 4e 45 2c 20 74 68 65 6e 20 6e 6f 20  F_NONE, then no 
15a20 63 6f 64 65 20 67 65 74 73 20 67 65 6e 65 72 61  code gets genera
15a30 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ted..**.** This 
15a40 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 69 74  routine makes it
15a50 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 7a 41  s own copy of zA
15a60 66 66 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  ff so that the c
15a70 61 6c 6c 65 72 20 69 73 20 66 72 65 65 0a 2a 2a  aller is free.**
15a80 20 74 6f 20 6d 6f 64 69 66 79 20 7a 41 66 66 20   to modify zAff 
15a90 61 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  after this routi
15aa0 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73  ne returns..*/.s
15ab0 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 41  tatic void codeA
15ac0 70 70 6c 79 41 66 66 69 6e 69 74 79 28 50 61 72  pplyAffinity(Par
15ad0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
15ae0 62 61 73 65 2c 20 69 6e 74 20 6e 2c 20 63 68 61  base, int n, cha
15af0 72 20 2a 7a 41 66 66 29 7b 0a 20 20 56 64 62 65  r *zAff){.  Vdbe
15b00 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
15b10 64 62 65 3b 0a 20 20 69 66 28 20 7a 41 66 66 3d  dbe;.  if( zAff=
15b20 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
15b30 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
15b40 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
15b50 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
15b60 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
15b70 0a 20 20 2f 2a 20 41 64 6a 75 73 74 20 62 61 73  .  /* Adjust bas
15b80 65 20 61 6e 64 20 6e 20 74 6f 20 73 6b 69 70 20  e and n to skip 
15b90 6f 76 65 72 20 53 51 4c 49 54 45 5f 41 46 46 5f  over SQLITE_AFF_
15ba0 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 61 74 20  NONE entries at 
15bb0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  the beginning.  
15bc0 2a 2a 20 61 6e 64 20 65 6e 64 20 6f 66 20 74 68  ** and end of th
15bd0 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  e affinity strin
15be0 67 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  g..  */.  while(
15bf0 20 6e 3e 30 20 26 26 20 7a 41 66 66 5b 30 5d 3d   n>0 && zAff[0]=
15c00 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
15c10 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 20   ){.    n--;.   
15c20 20 62 61 73 65 2b 2b 3b 0a 20 20 20 20 7a 41 66   base++;.    zAf
15c30 66 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  f++;.  }.  while
15c40 28 20 6e 3e 31 20 26 26 20 7a 41 66 66 5b 6e 2d  ( n>1 && zAff[n-
15c50 31 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  1]==SQLITE_AFF_N
15c60 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a  ONE ){.    n--;.
15c70 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74    }..  /* Code t
15c80 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f  he OP_Affinity o
15c90 70 63 6f 64 65 20 69 66 20 74 68 65 72 65 20 69  pcode if there i
15ca0 73 20 61 6e 79 74 68 69 6e 67 20 6c 65 66 74 20  s anything left 
15cb0 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20 69 66 28 20  to do. */.  if( 
15cc0 6e 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  n>0 ){.    sqlit
15cd0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15ce0 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 62 61 73  OP_Affinity, bas
15cf0 65 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  e, n);.    sqlit
15d00 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
15d10 2c 20 2d 31 2c 20 7a 41 66 66 2c 20 6e 29 3b 0a  , -1, zAff, n);.
15d20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
15d30 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
15d40 67 65 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c  ge(pParse, base,
15d50 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a   n);.  }.}.../*.
15d60 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
15d70 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 65 71   for a single eq
15d80 75 61 6c 69 74 79 20 74 65 72 6d 20 6f 66 20 74  uality term of t
15d90 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
15da0 20 20 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a 2a    An equality.**
15db0 20 74 65 72 6d 20 63 61 6e 20 62 65 20 65 69 74   term can be eit
15dc0 68 65 72 20 58 3d 65 78 70 72 20 6f 72 20 58 20  her X=expr or X 
15dd0 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65 72  IN (...).   pTer
15de0 6d 20 69 73 20 74 68 65 20 74 65 72 6d 20 74 6f  m is the term to
15df0 20 62 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a   be .** coded..*
15e00 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74  *.** The current
15e10 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63   value for the c
15e20 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6c 65 66  onstraint is lef
15e30 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52  t in register iR
15e40 65 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  eg..**.** For a 
15e50 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 74 68  constraint of th
15e60 65 20 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20 74  e form X=expr, t
15e70 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
15e80 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69   evaluated and i
15e90 74 73 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20  ts.** result is 
15ea0 6c 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63  left on the stac
15eb0 6b 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72 61 69  k.  For constrai
15ec0 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  nts of the form 
15ed0 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68  X IN (...).** th
15ee0 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
15ef0 75 70 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77  up a loop that w
15f00 69 6c 6c 20 69 74 65 72 61 74 65 20 6f 76 65 72  ill iterate over
15f10 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 58   all values of X
15f20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15f30 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
15f40 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
15f50 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  e,      /* The p
15f60 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
15f70 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
15f80 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20 74  Term,   /* The t
15f90 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
15fa0 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 63 6f   clause to be co
15fb0 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  ded */.  WhereLe
15fc0 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20  vel *pLevel, /* 
15fd0 54 68 65 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  The level of the
15fe0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 65 20   FROM clause we 
15ff0 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a  are working on *
16000 2f 0a 20 20 69 6e 74 20 69 45 71 2c 20 20 20 20  /.  int iEq,    
16010 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
16020 20 6f 66 20 74 68 65 20 65 71 75 61 6c 69 74 79   of the equality
16030 20 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 69   term within thi
16040 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 69 6e 74  s level */.  int
16050 20 62 52 65 76 2c 20 20 20 20 20 20 20 20 20 20   bRev,          
16060 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 72 65 76   /* True for rev
16070 65 72 73 65 2d 6f 72 64 65 72 20 49 4e 20 6f 70  erse-order IN op
16080 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  erations */.  in
16090 74 20 69 54 61 72 67 65 74 20 20 20 20 20 20 20  t iTarget       
160a0 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20    /* Attempt to 
160b0 6c 65 61 76 65 20 72 65 73 75 6c 74 73 20 69 6e  leave results in
160c0 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
160d0 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 58 20  /.){.  Expr *pX 
160e0 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
160f0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
16100 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
16110 20 69 52 65 67 3b 20 20 20 20 20 20 20 20 20 20   iReg;          
16120 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
16130 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 65 73 75  ter holding resu
16140 6c 74 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  lts */..  assert
16150 28 20 69 54 61 72 67 65 74 3e 30 20 29 3b 0a 20  ( iTarget>0 );. 
16160 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   if( pX->op==TK_
16170 45 51 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d  EQ ){.    iReg =
16180 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
16190 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
161a0 58 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 72 67  X->pRight, iTarg
161b0 65 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  et);.  }else if(
161c0 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55   pX->op==TK_ISNU
161d0 4c 4c 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d  LL ){.    iReg =
161e0 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20 73 71   iTarget;.    sq
161f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16200 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69  v, OP_Null, 0, i
16210 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Reg);.#ifndef SQ
16220 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
16230 52 59 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  RY.  }else{.    
16240 69 6e 74 20 65 54 79 70 65 3b 0a 20 20 20 20 69  int eType;.    i
16250 6e 74 20 69 54 61 62 3b 0a 20 20 20 20 73 74 72  nt iTab;.    str
16260 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b  uct InLoop *pIn;
16270 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  .    WhereLoop *
16280 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
16290 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20 69 66 28  pWLoop;..    if(
162a0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
162b0 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
162c0 54 41 42 4c 45 29 3d 3d 30 0a 20 20 20 20 20 20  TABLE)==0.      
162d0 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  && pLoop->u.btre
162e0 65 2e 70 49 6e 64 65 78 21 3d 30 0a 20 20 20 20  e.pIndex!=0.    
162f0 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74    && pLoop->u.bt
16300 72 65 65 2e 70 49 6e 64 65 78 2d 3e 61 53 6f 72  ree.pIndex->aSor
16310 74 4f 72 64 65 72 5b 69 45 71 5d 0a 20 20 20 20  tOrder[iEq].    
16320 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
16330 65 28 20 69 45 71 3d 3d 30 20 29 3b 0a 20 20 20  e( iEq==0 );.   
16340 20 20 20 74 65 73 74 63 61 73 65 28 20 62 52 65     testcase( bRe
16350 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20  v );.      bRev 
16360 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20  = !bRev;.    }. 
16370 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f     assert( pX->o
16380 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20  p==TK_IN );.    
16390 69 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a  iReg = iTarget;.
163a0 20 20 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69      eType = sqli
163b0 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70  te3FindInIndex(p
163c0 50 61 72 73 65 2c 20 70 58 2c 20 30 29 3b 0a 20  Parse, pX, 0);. 
163d0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e     if( eType==IN
163e0 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53  _INDEX_INDEX_DES
163f0 43 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  C ){.      testc
16400 61 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20 20  ase( bRev );.   
16410 20 20 20 62 52 65 76 20 3d 20 21 62 52 65 76 3b     bRev = !bRev;
16420 0a 20 20 20 20 7d 0a 20 20 20 20 69 54 61 62 20  .    }.    iTab 
16430 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  = pX->iTable;.  
16440 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16450 4f 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50  Op2(v, bRev ? OP
16460 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e  _Last : OP_Rewin
16470 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20  d, iTab, 0);.   
16480 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
16490 76 2c 20 62 52 65 76 29 3b 0a 20 20 20 20 56 64  v, bRev);.    Vd
164a0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
164b0 21 62 52 65 76 29 3b 0a 20 20 20 20 61 73 73 65  !bRev);.    asse
164c0 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
164d0 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54  ags & WHERE_MULT
164e0 49 5f 4f 52 29 3d 3d 30 20 29 3b 0a 20 20 20 20  I_OR)==0 );.    
164f0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c  pLoop->wsFlags |
16500 3d 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 3b  = WHERE_IN_ABLE;
16510 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
16520 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a  >u.in.nIn==0 ){.
16530 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64        pLevel->ad
16540 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56  drNxt = sqlite3V
16550 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
16560 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65  .    }.    pLeve
16570 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20  l->u.in.nIn++;. 
16580 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e     pLevel->u.in.
16590 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20 20 20  aInLoop =.      
165a0 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
165b0 63 4f 72 46 72 65 65 28 70 50 61 72 73 65 2d 3e  cOrFree(pParse->
165c0 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  db, pLevel->u.in
165d0 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20  .aInLoop,.      
165e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165f0 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70          sizeof(p
16600 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
16610 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e  oop[0])*pLevel->
16620 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20 70  u.in.nIn);.    p
16630 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  In = pLevel->u.i
16640 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69  n.aInLoop;.    i
16650 66 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 20 20  f( pIn ){.      
16660 70 49 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75  pIn += pLevel->u
16670 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a 20 20 20  .in.nIn - 1;.   
16680 20 20 20 70 49 6e 2d 3e 69 43 75 72 20 3d 20 69     pIn->iCur = i
16690 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 65  Tab;.      if( e
166a0 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52  Type==IN_INDEX_R
166b0 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20  OWID ){.        
166c0 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d  pIn->addrInTop =
166d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
166e0 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
166f0 69 54 61 62 2c 20 69 52 65 67 29 3b 0a 20 20 20  iTab, iReg);.   
16700 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16710 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70    pIn->addrInTop
16720 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
16730 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
16740 6e 2c 20 69 54 61 62 2c 20 30 2c 20 69 52 65 67  n, iTab, 0, iReg
16750 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
16760 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70   pIn->eEndLoopOp
16770 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65   = bRev ? OP_Pre
16780 76 49 66 4f 70 65 6e 20 3a 20 4f 50 5f 4e 65 78  vIfOpen : OP_Nex
16790 74 49 66 4f 70 65 6e 3b 0a 20 20 20 20 20 20 73  tIfOpen;.      s
167a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
167b0 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69  (v, OP_IsNull, i
167c0 52 65 67 29 3b 20 56 64 62 65 43 6f 76 65 72 61  Reg); VdbeCovera
167d0 67 65 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ge(v);.    }else
167e0 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
167f0 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20  u.in.nIn = 0;.  
16800 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
16810 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
16820 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 72  vel, pTerm);.  r
16830 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f  eturn iReg;.}../
16840 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
16850 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61  de that will eva
16860 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64  luate all == and
16870 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
16880 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 20  for an.** index 
16890 73 63 61 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  scan..**.** For 
168a0 65 78 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65  example, conside
168b0 72 20 74 61 62 6c 65 20 74 31 28 61 2c 62 2c 63  r table t1(a,b,c
168c0 2c 64 2c 65 2c 66 29 20 77 69 74 68 20 69 6e 64  ,d,e,f) with ind
168d0 65 78 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a  ex i1(a,b,c)..**
168e0 20 53 75 70 70 6f 73 65 20 74 68 65 20 57 48 45   Suppose the WHE
168f0 52 45 20 63 6c 61 75 73 65 20 69 73 20 74 68 69  RE clause is thi
16900 73 3a 20 20 61 3d 3d 35 20 41 4e 44 20 62 20 49  s:  a==5 AND b I
16910 4e 20 28 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e  N (1,2,3) AND c>
16920 35 20 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68  5 AND c<10.** Th
16930 65 20 69 6e 64 65 78 20 68 61 73 20 61 73 20 6d  e index has as m
16940 61 6e 79 20 61 73 20 74 68 72 65 65 20 65 71 75  any as three equ
16950 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
16960 73 2c 20 62 75 74 20 69 6e 20 74 68 69 73 0a 2a  s, but in this.*
16970 2a 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 74  * example, the t
16980 68 69 72 64 20 22 63 22 20 76 61 6c 75 65 20 69  hird "c" value i
16990 73 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e  s an inequality.
169a0 20 20 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a    So only two .*
169b0 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  * constraints ar
169c0 65 20 63 6f 64 65 64 2e 20 20 54 68 69 73 20 72  e coded.  This r
169d0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65  outine will gene
169e0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
169f0 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e  luate.** a==5 an
16a00 64 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20  d b IN (1,2,3). 
16a10 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   The current val
16a20 75 65 73 20 66 6f 72 20 61 20 61 6e 64 20 62 20  ues for a and b 
16a30 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 0a 2a  will be stored.*
16a40 2a 20 69 6e 20 63 6f 6e 73 65 63 75 74 69 76 65  * in consecutive
16a50 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74   registers and t
16a60 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
16a70 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69  first register i
16a80 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
16a90 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65  * In the example
16aa0 20 61 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20 20   above nEq==2.  
16ab0 42 75 74 20 74 68 69 73 20 73 75 62 72 6f 75 74  But this subrout
16ac0 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e  ine works for an
16ad0 79 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45  y value.** of nE
16ae0 71 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20 20  q including 0.  
16af0 49 66 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73 20  If nEq==0, this 
16b00 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 61 72 6c  routine is nearl
16b10 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68  y a no-op..** Th
16b20 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74 20  e only thing it 
16b30 64 6f 65 73 20 69 73 20 61 6c 6c 6f 63 61 74 65  does is allocate
16b40 20 74 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65   the pLevel->iMe
16b50 6d 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  m memory cell an
16b60 64 0a 2a 2a 20 63 6f 6d 70 75 74 65 20 74 68 65  d.** compute the
16b70 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
16b80 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74  ..**.** The nExt
16b90 72 61 52 65 67 20 70 61 72 61 6d 65 74 65 72 20  raReg parameter 
16ba0 69 73 20 30 20 6f 72 20 31 2e 20 20 49 74 20 69  is 0 or 1.  It i
16bb0 73 20 30 20 69 66 20 61 6c 6c 20 57 48 45 52 45  s 0 if all WHERE
16bc0 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
16bd0 6e 74 73 0a 2a 2a 20 61 72 65 20 3d 3d 20 6f 72  nts.** are == or
16be0 20 49 4e 20 61 6e 64 20 61 72 65 20 63 6f 76 65   IN and are cove
16bf0 72 65 64 20 62 79 20 74 68 65 20 6e 45 71 2e 20  red by the nEq. 
16c00 20 6e 45 78 74 72 61 52 65 67 20 69 73 20 31 20   nExtraReg is 1 
16c10 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  if there is.** a
16c20 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  n inequality con
16c30 73 74 72 61 69 6e 74 20 28 73 75 63 68 20 61 73  straint (such as
16c40 20 74 68 65 20 22 63 3e 3d 35 20 41 4e 44 20 63   the "c>=5 AND c
16c50 3c 31 30 22 20 69 6e 20 74 68 65 20 65 78 61 6d  <10" in the exam
16c60 70 6c 65 29 20 74 68 61 74 0a 2a 2a 20 6f 63 63  ple) that.** occ
16c70 75 72 73 20 61 66 74 65 72 20 74 68 65 20 6e 45  urs after the nE
16c80 71 20 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  q quality constr
16c90 61 69 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  aints..**.** Thi
16ca0 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61  s routine alloca
16cb0 74 65 73 20 61 20 72 61 6e 67 65 20 6f 66 20 6e  tes a range of n
16cc0 45 71 2b 6e 45 78 74 72 61 52 65 67 20 6d 65 6d  Eq+nExtraReg mem
16cd0 6f 72 79 20 63 65 6c 6c 73 20 61 6e 64 20 72 65  ory cells and re
16ce0 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 69 6e 64  turns.** the ind
16cf0 65 78 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ex of the first 
16d00 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 74  memory cell in t
16d10 68 61 74 20 72 61 6e 67 65 2e 20 54 68 65 20 63  hat range. The c
16d20 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c  ode that.** call
16d30 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
16d40 69 6c 6c 20 75 73 65 20 74 68 61 74 20 6d 65 6d  ill use that mem
16d50 6f 72 79 20 72 61 6e 67 65 20 74 6f 20 73 74 6f  ory range to sto
16d60 72 65 20 6b 65 79 73 20 66 6f 72 0a 2a 2a 20 73  re keys for.** s
16d70 74 61 72 74 20 61 6e 64 20 74 65 72 6d 69 6e 61  tart and termina
16d80 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e 73 20  tion conditions 
16d90 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 20  of the loop..** 
16da0 6b 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65  key value of the
16db0 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65 20 6f   loop.  If one o
16dc0 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72 61 74  r more IN operat
16dd0 6f 72 73 20 61 70 70 65 61 72 2c 20 74 68 65 6e  ors appear, then
16de0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
16df0 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20 61 64   allocates an ad
16e00 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d  ditional nEq mem
16e10 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 69 6e  ory cells for in
16e20 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a  ternal.** use..*
16e30 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75  *.** Before retu
16e40 72 6e 69 6e 67 2c 20 2a 70 7a 41 66 66 20 69 73  rning, *pzAff is
16e50 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
16e60 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
16e70 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f 70 79 20 6f  ning a.** copy o
16e80 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66  f the column aff
16e90 69 6e 69 74 79 20 73 74 72 69 6e 67 20 6f 66 20  inity string of 
16ea0 74 68 65 20 69 6e 64 65 78 20 61 6c 6c 6f 63 61  the index alloca
16eb0 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c  ted using.** sql
16ec0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20  ite3DbMalloc(). 
16ed0 45 78 63 65 70 74 2c 20 65 6e 74 72 69 65 73 20  Except, entries 
16ee0 69 6e 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74  in the copy of t
16ef0 68 65 20 73 74 72 69 6e 67 20 61 73 73 6f 63 69  he string associ
16f00 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 65 71 75  ated.** with equ
16f10 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
16f20 73 20 74 68 61 74 20 75 73 65 20 4e 4f 4e 45 20  s that use NONE 
16f30 61 66 66 69 6e 69 74 79 20 61 72 65 20 73 65 74  affinity are set
16f40 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46   to.** SQLITE_AF
16f50 46 5f 4e 4f 4e 45 2e 20 54 68 69 73 20 69 73 20  F_NONE. This is 
16f60 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53 51 4c  to deal with SQL
16f70 20 73 75 63 68 20 61 73 20 74 68 65 20 66 6f 6c   such as the fol
16f80 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
16f90 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
16fa0 61 20 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b  a TEXT PRIMARY K
16fb0 45 59 2c 20 62 29 3b 0a 2a 2a 20 20 20 53 45 4c  EY, b);.**   SEL
16fc0 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  ECT ... FROM t1 
16fd0 41 53 20 74 32 2c 20 74 31 20 57 48 45 52 45 20  AS t2, t1 WHERE 
16fe0 74 31 2e 61 20 3d 20 74 32 2e 62 3b 0a 2a 2a 0a  t1.a = t2.b;.**.
16ff0 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c  ** In the exampl
17000 65 20 61 62 6f 76 65 2c 20 74 68 65 20 69 6e 64  e above, the ind
17010 65 78 20 6f 6e 20 74 31 28 61 29 20 68 61 73 20  ex on t1(a) has 
17020 54 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20 42  TEXT affinity. B
17030 75 74 20 73 69 6e 63 65 0a 2a 2a 20 74 68 65 20  ut since.** the 
17040 72 69 67 68 74 20 68 61 6e 64 20 73 69 64 65 20  right hand side 
17050 6f 66 20 74 68 65 20 65 71 75 61 6c 69 74 79 20  of the equality 
17060 63 6f 6e 73 74 72 61 69 6e 74 20 28 74 32 2e 62  constraint (t2.b
17070 29 20 68 61 73 20 4e 4f 4e 45 20 61 66 66 69 6e  ) has NONE affin
17080 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e 76 65  ity,.** no conve
17090 72 73 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20  rsion should be 
170a0 61 74 74 65 6d 70 74 65 64 20 62 65 66 6f 72 65  attempted before
170b0 20 75 73 69 6e 67 20 61 20 74 32 2e 62 20 76 61   using a t2.b va
170c0 6c 75 65 20 61 73 20 70 61 72 74 20 6f 66 0a 2a  lue as part of.*
170d0 2a 20 61 20 6b 65 79 20 74 6f 20 73 65 61 72 63  * a key to searc
170e0 68 20 74 68 65 20 69 6e 64 65 78 2e 20 48 65 6e  h the index. Hen
170f0 63 65 20 74 68 65 20 66 69 72 73 74 20 62 79 74  ce the first byt
17100 65 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65  e in the returne
17110 64 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 73 74  d affinity.** st
17120 72 69 6e 67 20 69 6e 20 74 68 69 73 20 65 78 61  ring in this exa
17130 6d 70 6c 65 20 77 6f 75 6c 64 20 62 65 20 73 65  mple would be se
17140 74 20 74 6f 20 53 51 4c 49 54 45 5f 41 46 46 5f  t to SQLITE_AFF_
17150 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NONE..*/.static 
17160 69 6e 74 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c  int codeAllEqual
17170 69 74 79 54 65 72 6d 73 28 0a 20 20 50 61 72 73  ityTerms(.  Pars
17180 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
17190 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
171a0 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
171b0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20  evel *pLevel,   
171c0 2f 2a 20 57 68 69 63 68 20 6e 65 73 74 65 64 20  /* Which nested 
171d0 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46 52 4f 4d  loop of the FROM
171e0 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20 2a   we are coding *
171f0 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20 20  /.  int bRev,   
17200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 76            /* Rev
17210 65 72 73 65 20 74 68 65 20 6f 72 64 65 72 20 6f  erse the order o
17220 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a  f IN operators *
17230 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65  /.  int nExtraRe
17240 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  g,        /* Num
17250 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65 67  ber of extra reg
17260 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61  isters to alloca
17270 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  te */.  char **p
17280 7a 41 66 66 20 20 20 20 20 20 20 20 20 20 2f 2a  zAff          /*
17290 20 4f 55 54 3a 20 53 65 74 20 74 6f 20 70 6f 69   OUT: Set to poi
172a0 6e 74 20 74 6f 20 61 66 66 69 6e 69 74 79 20 73  nt to affinity s
172b0 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 75 31  tring */.){.  u1
172c0 36 20 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20  6 nEq;          
172d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
172e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20  he number of == 
172f0 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  or IN constraint
17300 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 75  s to code */.  u
17310 31 36 20 6e 53 6b 69 70 3b 20 20 20 20 20 20 20  16 nSkip;       
17320 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17330 4e 75 6d 62 65 72 20 6f 66 20 6c 65 66 74 2d 6d  Number of left-m
17340 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 73  ost columns to s
17350 6b 69 70 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  kip */.  Vdbe *v
17360 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
17370 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 6d  ;      /* The vm
17380 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
17390 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ion */.  Index *
173a0 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
173b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
173c0 64 65 78 20 62 65 69 6e 67 20 75 73 65 64 20 66  dex being used f
173d0 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a  or this loop */.
173e0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
173f0 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
17400 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73  /* A single cons
17410 74 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20  traint term */. 
17420 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
17430 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p;             /
17440 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  * The WhereLoop 
17450 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
17460 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
17470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
17480 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
17490 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20  nt regBase;     
174a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
174b0 42 61 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f  Base register */
174c0 0a 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20 20  .  int nReg;    
174d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
174f0 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63  gisters to alloc
17500 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ate */.  char *z
17510 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Aff;            
17520 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69         /* Affini
17530 74 79 20 73 74 72 69 6e 67 20 74 6f 20 72 65 74  ty string to ret
17540 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69  urn */..  /* Thi
17550 73 20 6d 6f 64 75 6c 65 20 69 73 20 6f 6e 6c 79  s module is only
17560 20 63 61 6c 6c 65 64 20 6f 6e 20 71 75 65 72 79   called on query
17570 20 70 6c 61 6e 73 20 74 68 61 74 20 75 73 65 20   plans that use 
17580 61 6e 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 70  an index. */.  p
17590 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
175a0 57 4c 6f 6f 70 3b 0a 20 20 61 73 73 65 72 74 28  WLoop;.  assert(
175b0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
175c0 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
175d0 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 6e  TABLE)==0 );.  n
175e0 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  Eq = pLoop->u.bt
175f0 72 65 65 2e 6e 45 71 3b 0a 20 20 6e 53 6b 69 70  ree.nEq;.  nSkip
17600 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
17610 65 2e 6e 53 6b 69 70 3b 0a 20 20 70 49 64 78 20  e.nSkip;.  pIdx 
17620 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
17630 2e 70 49 6e 64 65 78 3b 0a 20 20 61 73 73 65 72  .pIndex;.  asser
17640 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 0a 20  t( pIdx!=0 );.. 
17650 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
17660 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63  ow many memory c
17670 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65 65  ells we will nee
17680 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20  d then allocate 
17690 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 72 65 67  them..  */.  reg
176a0 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Base = pParse->n
176b0 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e 52 65 67 20  Mem + 1;.  nReg 
176c0 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
176d0 2e 6e 45 71 20 2b 20 6e 45 78 74 72 61 52 65 67  .nEq + nExtraReg
176e0 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ;.  pParse->nMem
176f0 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20 20 7a 41 66   += nReg;..  zAf
17700 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  f = sqlite3DbStr
17710 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
17720 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
17730 6e 69 74 79 53 74 72 28 76 2c 20 70 49 64 78 29  nityStr(v, pIdx)
17740 29 3b 0a 20 20 69 66 28 20 21 7a 41 66 66 20 29  );.  if( !zAff )
17750 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62  {.    pParse->db
17760 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
17770 20 31 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e   1;.  }..  if( n
17780 53 6b 69 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  Skip ){.    int 
17790 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  iIdxCur = pLevel
177a0 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 73  ->iIdxCur;.    s
177b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
177c0 28 76 2c 20 28 62 52 65 76 3f 4f 50 5f 4c 61 73  (v, (bRev?OP_Las
177d0 74 3a 4f 50 5f 52 65 77 69 6e 64 29 2c 20 69 49  t:OP_Rewind), iI
177e0 64 78 43 75 72 29 3b 0a 20 20 20 20 56 64 62 65  dxCur);.    Vdbe
177f0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52  CoverageIf(v, bR
17800 65 76 3d 3d 30 29 3b 0a 20 20 20 20 56 64 62 65  ev==0);.    Vdbe
17810 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52  CoverageIf(v, bR
17820 65 76 21 3d 30 29 3b 0a 20 20 20 20 56 64 62 65  ev!=0);.    Vdbe
17830 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67  Comment((v, "beg
17840 69 6e 20 73 6b 69 70 2d 73 63 61 6e 20 6f 6e 20  in skip-scan on 
17850 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  %s", pIdx->zName
17860 29 29 3b 0a 20 20 20 20 6a 20 3d 20 73 71 6c 69  ));.    j = sqli
17870 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
17880 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 70   OP_Goto);.    p
17890 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20  Level->addrSkip 
178a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
178b0 4f 70 34 49 6e 74 28 76 2c 20 28 62 52 65 76 3f  Op4Int(v, (bRev?
178c0 4f 50 5f 53 65 65 6b 4c 54 3a 4f 50 5f 53 65 65  OP_SeekLT:OP_See
178d0 6b 47 54 29 2c 0a 20 20 20 20 20 20 20 20 20 20  kGT),.          
178e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178f0 20 20 69 49 64 78 43 75 72 2c 20 30 2c 20 72 65    iIdxCur, 0, re
17900 67 42 61 73 65 2c 20 6e 53 6b 69 70 29 3b 0a 20  gBase, nSkip);. 
17910 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
17920 66 28 76 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20  f(v, bRev==0);. 
17930 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
17940 66 28 76 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20  f(v, bRev!=0);. 
17950 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
17960 6d 70 48 65 72 65 28 76 2c 20 6a 29 3b 0a 20 20  mpHere(v, j);.  
17970 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 6b    for(j=0; j<nSk
17980 69 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ip; j++){.      
17990 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
179a0 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
179b0 69 49 64 78 43 75 72 2c 20 6a 2c 20 72 65 67 42  iIdxCur, j, regB
179c0 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20 61 73  ase+j);.      as
179d0 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f  sert( pIdx->aiCo
179e0 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a 20 20  lumn[j]>=0 );.  
179f0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
17a00 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e  (v, "%s", pIdx->
17a10 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 49 64  pTable->aCol[pId
17a20 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e  x->aiColumn[j]].
17a30 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20  zName));.    }. 
17a40 20 7d 20 20 20 20 0a 0a 20 20 2f 2a 20 45 76 61   }    ..  /* Eva
17a50 6c 75 61 74 65 20 74 68 65 20 65 71 75 61 6c 69  luate the equali
17a60 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  ty constraints. 
17a70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 41   */.  assert( zA
17a80 66 66 3d 3d 30 20 7c 7c 20 28 69 6e 74 29 73 74  ff==0 || (int)st
17a90 72 6c 65 6e 28 7a 41 66 66 29 3e 3d 6e 45 71 20  rlen(zAff)>=nEq 
17aa0 29 3b 0a 20 20 66 6f 72 28 6a 3d 6e 53 6b 69 70  );.  for(j=nSkip
17ab0 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20  ; j<nEq; j++){. 
17ac0 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 70     int r1;.    p
17ad0 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  Term = pLoop->aL
17ae0 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 61 73 73  Term[j];.    ass
17af0 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b  ert( pTerm!=0 );
17b00 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
17b10 6f 77 69 6e 67 20 74 65 73 74 63 61 73 65 20 69  owing testcase i
17b20 73 20 74 72 75 65 20 66 6f 72 20 69 6e 64 69 63  s true for indic
17b30 65 73 20 77 69 74 68 20 72 65 64 75 6e 64 61 6e  es with redundan
17b40 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a 20 20 20 20  t columns. .    
17b50 2a 2a 20 45 78 3a 20 43 52 45 41 54 45 20 49 4e  ** Ex: CREATE IN
17b60 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 62  DEX i1 ON t1(a,b
17b70 2c 61 29 3b 20 53 45 4c 45 43 54 20 2a 20 46 52  ,a); SELECT * FR
17b80 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 30 20  OM t1 WHERE a=0 
17b90 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a 20 20 20 20  AND b=0; */.    
17ba0 74 65 73 74 63 61 73 65 28 20 28 70 54 65 72 6d  testcase( (pTerm
17bb0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
17bc0 5f 43 4f 44 45 44 29 21 3d 30 20 29 3b 0a 20 20  _CODED)!=0 );.  
17bd0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
17be0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
17bf0 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
17c00 20 72 31 20 3d 20 63 6f 64 65 45 71 75 61 6c 69   r1 = codeEquali
17c10 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  tyTerm(pParse, p
17c20 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c  Term, pLevel, j,
17c30 20 62 52 65 76 2c 20 72 65 67 42 61 73 65 2b 6a   bRev, regBase+j
17c40 29 3b 0a 20 20 20 20 69 66 28 20 72 31 21 3d 72  );.    if( r1!=r
17c50 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20 20 20 20  egBase+j ){.    
17c60 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b    if( nReg==1 ){
17c70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17c80 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
17c90 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 29 3b  Parse, regBase);
17ca0 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65  .        regBase
17cb0 20 3d 20 72 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = r1;.      }el
17cc0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
17cd0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17ce0 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20 72   OP_SCopy, r1, r
17cf0 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20  egBase+j);.     
17d00 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73   }.    }.    tes
17d10 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
17d20 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
17d30 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ULL );.    testc
17d40 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
17d50 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b  rator & WO_IN );
17d60 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
17d70 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
17d80 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29 3d  _ISNULL|WO_IN))=
17d90 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  =0 ){.      Expr
17da0 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d   *pRight = pTerm
17db0 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
17dc0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
17dd0 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28  e3ExprCanBeNull(
17de0 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20  pRight) ){.     
17df0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17e00 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
17e10 6c 2c 20 72 65 67 42 61 73 65 2b 6a 2c 20 70 4c  l, regBase+j, pL
17e20 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a  evel->addrBrk);.
17e30 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
17e40 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
17e50 0a 20 20 20 20 20 20 69 66 28 20 7a 41 66 66 20  .      if( zAff 
17e60 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
17e70 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
17e80 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 41  inity(pRight, zA
17e90 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54 45 5f 41  ff[j])==SQLITE_A
17ea0 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  FF_NONE ){.     
17eb0 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53       zAff[j] = S
17ec0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
17ed0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17ee0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
17ef0 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79  rNeedsNoAffinity
17f00 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a  Change(pRight, z
17f10 41 66 66 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20  Aff[j]) ){.     
17f20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53       zAff[j] = S
17f30 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
17f40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17f50 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  }.    }.  }.  *p
17f60 7a 41 66 66 20 3d 20 7a 41 66 66 3b 0a 20 20 72  zAff = zAff;.  r
17f70 65 74 75 72 6e 20 72 65 67 42 61 73 65 3b 0a 7d  eturn regBase;.}
17f80 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
17f90 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a  _OMIT_EXPLAIN./*
17fa0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
17fb0 20 69 73 20 61 20 68 65 6c 70 65 72 20 66 6f 72   is a helper for
17fc0 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e   explainIndexRan
17fd0 67 65 28 29 20 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a  ge() below.**.**
17fe0 20 70 53 74 72 20 68 6f 6c 64 73 20 74 68 65 20   pStr holds the 
17ff0 74 65 78 74 20 6f 66 20 61 6e 20 65 78 70 72 65  text of an expre
18000 73 73 69 6f 6e 20 74 68 61 74 20 77 65 20 61 72  ssion that we ar
18010 65 20 62 75 69 6c 64 69 6e 67 20 75 70 20 6f 6e  e building up on
18020 65 20 74 65 72 6d 0a 2a 2a 20 61 74 20 61 20 74  e term.** at a t
18030 69 6d 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ime.  This routi
18040 6e 65 20 61 64 64 73 20 61 20 6e 65 77 20 74 65  ne adds a new te
18050 72 6d 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  rm to the end of
18060 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
18070 0a 2a 2a 20 54 65 72 6d 73 20 61 72 65 20 73 65  .** Terms are se
18080 70 61 72 61 74 65 64 20 62 79 20 41 4e 44 20 73  parated by AND s
18090 6f 20 61 64 64 20 74 68 65 20 22 41 4e 44 22 20  o add the "AND" 
180a0 74 65 78 74 20 66 6f 72 20 73 65 63 6f 6e 64 20  text for second 
180b0 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 0a 2a  and subsequent.*
180c0 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f  * terms only..*/
180d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
180e0 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 0a  lainAppendTerm(.
180f0 20 20 53 74 72 41 63 63 75 6d 20 2a 70 53 74 72    StrAccum *pStr
18100 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
18110 20 54 68 65 20 74 65 78 74 20 65 78 70 72 65 73   The text expres
18120 73 69 6f 6e 20 62 65 69 6e 67 20 62 75 69 6c 74  sion being built
18130 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c   */.  int iTerm,
18140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18150 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
18160 69 73 20 74 65 72 6d 2e 20 20 46 69 72 73 74 20  is term.  First 
18170 69 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 63 6f 6e  is zero */.  con
18180 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e  st char *zColumn
18190 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ,        /* Name
181a0 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a   of the column *
181b0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
181c0 7a 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20  zOp             
181d0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
181e0 70 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20  perator */.){.  
181f0 69 66 28 20 69 54 65 72 6d 20 29 20 73 71 6c 69  if( iTerm ) sqli
18200 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
18210 64 28 70 53 74 72 2c 20 22 20 41 4e 44 20 22 2c  d(pStr, " AND ",
18220 20 35 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74   5);.  sqlite3St
18230 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28  rAccumAppendAll(
18240 70 53 74 72 2c 20 7a 43 6f 6c 75 6d 6e 29 3b 0a  pStr, zColumn);.
18250 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
18260 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 4f  mAppend(pStr, zO
18270 70 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  p, 1);.  sqlite3
18280 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70  StrAccumAppend(p
18290 53 74 72 2c 20 22 3f 22 2c 20 31 29 3b 0a 7d 0a  Str, "?", 1);.}.
182a0 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
182b0 70 4c 65 76 65 6c 20 64 65 73 63 72 69 62 65 73  pLevel describes
182c0 20 61 20 73 74 72 61 74 65 67 79 20 66 6f 72 20   a strategy for 
182d0 73 63 61 6e 6e 69 6e 67 20 74 61 62 6c 65 20 70  scanning table p
182e0 54 61 62 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75  Tab. This .** fu
182f0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
18300 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
18310 72 69 6e 67 20 62 75 66 66 65 72 20 63 6f 6e 74  ring buffer cont
18320 61 69 6e 69 6e 67 20 61 20 64 65 73 63 72 69 70  aining a descrip
18330 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 73  tion.** of the s
18340 75 62 73 65 74 20 6f 66 20 74 61 62 6c 65 20 72  ubset of table r
18350 6f 77 73 20 73 63 61 6e 6e 65 64 20 62 79 20 74  ows scanned by t
18360 68 65 20 73 74 72 61 74 65 67 79 20 69 6e 20 74  he strategy in t
18370 68 65 20 66 6f 72 6d 20 6f 66 20 61 6e 0a 2a 2a  he form of an.**
18380 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 2e   SQL expression.
18390 20 4f 72 2c 20 69 66 20 61 6c 6c 20 72 6f 77 73   Or, if all rows
183a0 20 61 72 65 20 73 63 61 6e 6e 65 64 2c 20 4e 55   are scanned, NU
183b0 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
183c0 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
183d0 65 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 3a  e, if the query:
183e0 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
183f0 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
18400 61 3d 31 20 41 4e 44 20 62 3e 32 3b 0a 2a 2a 0a  a=1 AND b>2;.**.
18410 2a 2a 20 69 73 20 72 75 6e 20 61 6e 64 20 74 68  ** is run and th
18420 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ere is an index 
18430 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68 65 6e 20  on (a, b), then 
18440 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
18450 74 75 72 6e 73 20 61 0a 2a 2a 20 73 74 72 69 6e  turns a.** strin
18460 67 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a  g similar to:.**
18470 0a 2a 2a 20 20 20 22 61 3d 3f 20 41 4e 44 20 62  .**   "a=? AND b
18480 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  >?".**.** The re
18490 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72 20 70  turned pointer p
184a0 6f 69 6e 74 73 20 74 6f 20 6d 65 6d 6f 72 79 20  oints to memory 
184b0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
184c0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e  lite3DbMalloc().
184d0 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72 65  .** It is the re
184e0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
184f0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 66 72  the caller to fr
18500 65 65 20 74 68 65 20 62 75 66 66 65 72 20 77 68  ee the buffer wh
18510 65 6e 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 20 6c  en it is.** no l
18520 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a  onger required..
18530 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
18540 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67  explainIndexRang
18550 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
18560 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c  hereLoop *pLoop,
18570 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20   Table *pTab){. 
18580 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d   Index *pIndex =
18590 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
185a0 70 49 6e 64 65 78 3b 0a 20 20 75 31 36 20 6e 45  pIndex;.  u16 nE
185b0 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  q = pLoop->u.btr
185c0 65 65 2e 6e 45 71 3b 0a 20 20 75 31 36 20 6e 53  ee.nEq;.  u16 nS
185d0 6b 69 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  kip = pLoop->u.b
185e0 74 72 65 65 2e 6e 53 6b 69 70 3b 0a 20 20 69 6e  tree.nSkip;.  in
185f0 74 20 69 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e  t i, j;.  Column
18600 20 2a 61 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61   *aCol = pTab->a
18610 43 6f 6c 3b 0a 20 20 69 31 36 20 2a 61 69 43 6f  Col;.  i16 *aiCo
18620 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61  lumn = pIndex->a
18630 69 43 6f 6c 75 6d 6e 3b 0a 20 20 53 74 72 41 63  iColumn;.  StrAc
18640 63 75 6d 20 74 78 74 3b 0a 0a 20 20 69 66 28 20  cum txt;..  if( 
18650 6e 45 71 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70  nEq==0 && (pLoop
18660 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
18670 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45  RE_BTM_LIMIT|WHE
18680 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d  RE_TOP_LIMIT))==
18690 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
186a0 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
186b0 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 74 78  StrAccumInit(&tx
186c0 74 2c 20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f  t, 0, 0, SQLITE_
186d0 4d 41 58 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 74  MAX_LENGTH);.  t
186e0 78 74 2e 64 62 20 3d 20 64 62 3b 0a 20 20 73 71  xt.db = db;.  sq
186f0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
18700 65 6e 64 28 26 74 78 74 2c 20 22 20 28 22 2c 20  end(&txt, " (", 
18710 32 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  2);.  for(i=0; i
18720 3c 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nEq; i++){.    
18730 63 68 61 72 20 2a 7a 20 3d 20 28 69 3d 3d 70 49  char *z = (i==pI
18740 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20  ndex->nKeyCol ) 
18750 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c  ? "rowid" : aCol
18760 5b 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e  [aiColumn[i]].zN
18770 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d  ame;.    if( i>=
18780 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 65  nSkip ){.      e
18790 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d  xplainAppendTerm
187a0 28 26 74 78 74 2c 20 69 2c 20 7a 2c 20 22 3d 22  (&txt, i, z, "="
187b0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
187c0 20 20 20 20 69 66 28 20 69 20 29 20 73 71 6c 69      if( i ) sqli
187d0 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
187e0 64 28 26 74 78 74 2c 20 22 20 41 4e 44 20 22 2c  d(&txt, " AND ",
187f0 20 35 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   5);.      sqlit
18800 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
18810 28 26 74 78 74 2c 20 22 41 4e 59 28 22 2c 20 34  (&txt, "ANY(", 4
18820 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18830 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c  StrAccumAppendAl
18840 6c 28 26 74 78 74 2c 20 7a 29 3b 0a 20 20 20 20  l(&txt, z);.    
18850 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
18860 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22 29  mAppend(&txt, ")
18870 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ", 1);.    }.  }
18880 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20 20 69 66 28  ..  j = i;.  if(
18890 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26   pLoop->wsFlags&
188a0 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
188b0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  ){.    char *z =
188c0 20 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65   (j==pIndex->nKe
188d0 79 43 6f 6c 20 29 20 3f 20 22 72 6f 77 69 64 22  yCol ) ? "rowid"
188e0 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e   : aCol[aiColumn
188f0 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  [j]].zName;.    
18900 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72  explainAppendTer
18910 6d 28 26 74 78 74 2c 20 69 2b 2b 2c 20 7a 2c 20  m(&txt, i++, z, 
18920 22 3e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ">");.  }.  if( 
18930 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57  pLoop->wsFlags&W
18940 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29  HERE_TOP_LIMIT )
18950 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20  {.    char *z = 
18960 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65 79  (j==pIndex->nKey
18970 43 6f 6c 20 29 20 3f 20 22 72 6f 77 69 64 22 20  Col ) ? "rowid" 
18980 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b  : aCol[aiColumn[
18990 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65  j]].zName;.    e
189a0 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d  xplainAppendTerm
189b0 28 26 74 78 74 2c 20 69 2c 20 7a 2c 20 22 3c 22  (&txt, i, z, "<"
189c0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
189d0 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26  StrAccumAppend(&
189e0 74 78 74 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20  txt, ")", 1);.  
189f0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 74  return sqlite3St
18a00 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 74 78  rAccumFinish(&tx
18a10 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  t);.}../*.** Thi
18a20 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
18a30 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 63 75 72  no-op unless cur
18a40 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e  rently processin
18a50 67 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45  g an EXPLAIN QUE
18a60 52 59 20 50 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61  RY PLAN.** comma
18a70 6e 64 2e 20 49 66 20 74 68 65 20 71 75 65 72 79  nd. If the query
18a80 20 62 65 69 6e 67 20 63 6f 6d 70 69 6c 65 64 20   being compiled 
18a90 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55  is an EXPLAIN QU
18aa0 45 52 59 20 50 4c 41 4e 2c 20 61 20 73 69 6e 67  ERY PLAN, a sing
18ab0 6c 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69 73 20  le.** record is 
18ac0 61 64 64 65 64 20 74 6f 20 74 68 65 20 6f 75 74  added to the out
18ad0 70 75 74 20 74 6f 20 64 65 73 63 72 69 62 65 20  put to describe 
18ae0 74 68 65 20 74 61 62 6c 65 20 73 63 61 6e 20 73  the table scan s
18af0 74 72 61 74 65 67 79 20 69 6e 20 0a 2a 2a 20 70  trategy in .** p
18b00 4c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  Level..*/.static
18b10 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 4f 6e 65   void explainOne
18b20 53 63 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  Scan(.  Parse *p
18b30 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
18b40 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
18b50 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
18b60 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
18b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18b80 20 54 61 62 6c 65 20 6c 69 73 74 20 74 68 69 73   Table list this
18b90 20 6c 6f 6f 70 20 72 65 66 65 72 73 20 74 6f 20   loop refers to 
18ba0 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
18bb0 2a 70 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20  *pLevel,        
18bc0 20 20 20 20 20 2f 2a 20 53 63 61 6e 20 74 6f 20       /* Scan to 
18bd0 77 72 69 74 65 20 4f 50 5f 45 78 70 6c 61 69 6e  write OP_Explain
18be0 20 6f 70 63 6f 64 65 20 66 6f 72 20 2a 2f 0a 20   opcode for */. 
18bf0 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20   int iLevel,    
18c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c10 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 6c   /* Value for "l
18c20 65 76 65 6c 22 20 63 6f 6c 75 6d 6e 20 6f 66 20  evel" column of 
18c30 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20  output */.  int 
18c40 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20  iFrom,          
18c50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
18c60 61 6c 75 65 20 66 6f 72 20 22 66 72 6f 6d 22 20  alue for "from" 
18c70 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74  column of output
18c80 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46   */.  u16 wctrlF
18c90 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
18ca0 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
18cb0 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
18cc0 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a  WhereBegin() */.
18cd0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
18ce0 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50  E_DEBUG.  if( pP
18cf0 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
18d00 20 29 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20   ).#endif.  {.  
18d10 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
18d20 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
18d30 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
18d40 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
18d50 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
18d60 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a  ->pVdbe;      /*
18d70 20 56 4d 20 62 65 69 6e 67 20 63 6f 6e 73 74 72   VM being constr
18d80 75 63 74 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c  ucted */.    sql
18d90 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
18da0 65 2d 3e 64 62 3b 20 20 20 20 20 2f 2a 20 44 61  e->db;     /* Da
18db0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
18dc0 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b  .    char *zMsg;
18dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18de0 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20 61 64     /* Text to ad
18df0 64 20 74 6f 20 45 51 50 20 6f 75 74 70 75 74 20  d to EQP output 
18e00 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 20 3d  */.    int iId =
18e10 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
18e20 49 64 3b 20 20 2f 2a 20 53 65 6c 65 63 74 20 69  Id;  /* Select i
18e30 64 20 28 6c 65 66 74 2d 6d 6f 73 74 20 6f 75 74  d (left-most out
18e40 70 75 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f 0a 20  put column) */. 
18e50 20 20 20 69 6e 74 20 69 73 53 65 61 72 63 68 3b     int isSearch;
18e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e70 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 53   /* True for a S
18e80 45 41 52 43 48 2e 20 46 61 6c 73 65 20 66 6f 72  EARCH. False for
18e90 20 53 43 41 4e 2e 20 2a 2f 0a 20 20 20 20 57 68   SCAN. */.    Wh
18ea0 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20  ereLoop *pLoop; 
18eb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18ec0 68 65 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 57  he controlling W
18ed0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  hereLoop object 
18ee0 2a 2f 0a 20 20 20 20 75 33 32 20 66 6c 61 67 73  */.    u32 flags
18ef0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18f00 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 68       /* Flags th
18f10 61 74 20 64 65 73 63 72 69 62 65 20 74 68 69 73  at describe this
18f20 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 70 4c   loop */..    pL
18f30 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
18f40 4c 6f 6f 70 3b 0a 20 20 20 20 66 6c 61 67 73 20  Loop;.    flags 
18f50 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  = pLoop->wsFlags
18f60 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  ;.    if( (flags
18f70 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29  &WHERE_MULTI_OR)
18f80 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26   || (wctrlFlags&
18f90 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
18fa0 4e 4c 59 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  NLY) ) return;..
18fb0 20 20 20 20 69 73 53 65 61 72 63 68 20 3d 20 28      isSearch = (
18fc0 66 6c 61 67 73 26 28 57 48 45 52 45 5f 42 54 4d  flags&(WHERE_BTM
18fd0 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50  _LIMIT|WHERE_TOP
18fe0 5f 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20 20 20  _LIMIT))!=0.    
18ff0 20 20 20 20 20 20 20 20 7c 7c 20 28 28 66 6c 61          || ((fla
19000 67 73 26 57 48 45 52 45 5f 56 49 52 54 55 41 4c  gs&WHERE_VIRTUAL
19010 54 41 42 4c 45 29 3d 3d 30 20 26 26 20 28 70 4c  TABLE)==0 && (pL
19020 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
19030 3e 30 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  >0)).           
19040 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26   || (wctrlFlags&
19050 28 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  (WHERE_ORDERBY_M
19060 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59  IN|WHERE_ORDERBY
19070 5f 4d 41 58 29 29 3b 0a 0a 20 20 20 20 7a 4d 73  _MAX));..    zMs
19080 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
19090 74 66 28 64 62 2c 20 22 25 73 22 2c 20 69 73 53  tf(db, "%s", isS
190a0 65 61 72 63 68 3f 22 53 45 41 52 43 48 22 3a 22  earch?"SEARCH":"
190b0 53 43 41 4e 22 29 3b 0a 20 20 20 20 69 66 28 20  SCAN");.    if( 
190c0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pItem->pSelect )
190d0 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  {.      zMsg = s
190e0 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
190f0 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 53 55 42  b, zMsg, "%s SUB
19100 51 55 45 52 59 20 25 64 22 2c 20 7a 4d 73 67 2c  QUERY %d", zMsg,
19110 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64  pItem->iSelectId
19120 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
19130 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
19140 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
19150 4d 73 67 2c 20 22 25 73 20 54 41 42 4c 45 20 25  Msg, "%s TABLE %
19160 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d  s", zMsg, pItem-
19170 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a  >zName);.    }..
19180 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
19190 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 7a  Alias ){.      z
191a0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
191b0 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
191c0 22 25 73 20 41 53 20 25 73 22 2c 20 7a 4d 73 67  "%s AS %s", zMsg
191d0 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  , pItem->zAlias)
191e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
191f0 28 66 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  (flags & (WHERE_
19200 49 50 4b 7c 57 48 45 52 45 5f 56 49 52 54 55 41  IPK|WHERE_VIRTUA
19210 4c 54 41 42 4c 45 29 29 3d 3d 30 0a 20 20 20 20  LTABLE))==0.    
19220 20 26 26 20 41 4c 57 41 59 53 28 70 4c 6f 6f 70   && ALWAYS(pLoop
19230 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
19240 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0).    ){.    
19250 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
19260 6d 74 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  mt;.      Index 
19270 2a 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75  *pIdx = pLoop->u
19280 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
19290 20 20 20 20 20 63 68 61 72 20 2a 7a 57 68 65 72       char *zWher
192a0 65 20 3d 20 65 78 70 6c 61 69 6e 49 6e 64 65 78  e = explainIndex
192b0 52 61 6e 67 65 28 64 62 2c 20 70 4c 6f 6f 70 2c  Range(db, pLoop,
192c0 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20   pItem->pTab);. 
192d0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28 66       assert( !(f
192e0 6c 61 67 73 26 57 48 45 52 45 5f 41 55 54 4f 5f  lags&WHERE_AUTO_
192f0 49 4e 44 45 58 29 20 7c 7c 20 28 66 6c 61 67 73  INDEX) || (flags
19300 26 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29  &WHERE_IDX_ONLY)
19310 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 48   );.      if( !H
19320 61 73 52 6f 77 69 64 28 70 49 74 65 6d 2d 3e 70  asRowid(pItem->p
19330 54 61 62 29 20 26 26 20 49 73 50 72 69 6d 61 72  Tab) && IsPrimar
19340 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 20  yKeyIndex(pIdx) 
19350 29 7b 0a 20 20 20 20 20 20 20 20 7a 46 6d 74 20  ){.        zFmt 
19360 3d 20 7a 57 68 65 72 65 20 3f 20 22 25 73 20 55  = zWhere ? "%s U
19370 53 49 4e 47 20 50 52 49 4d 41 52 59 20 4b 45 59  SING PRIMARY KEY
19380 25 2e 30 73 25 73 22 20 3a 20 22 25 73 25 2e 30  %.0s%s" : "%s%.0
19390 73 25 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  s%s";.      }els
193a0 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 57 48  e if( flags & WH
193b0 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 20 29  ERE_AUTO_INDEX )
193c0 7b 0a 20 20 20 20 20 20 20 20 7a 46 6d 74 20 3d  {.        zFmt =
193d0 20 22 25 73 20 55 53 49 4e 47 20 41 55 54 4f 4d   "%s USING AUTOM
193e0 41 54 49 43 20 43 4f 56 45 52 49 4e 47 20 49 4e  ATIC COVERING IN
193f0 44 45 58 25 2e 30 73 25 73 22 3b 0a 20 20 20 20  DEX%.0s%s";.    
19400 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
19410 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
19420 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 46  LY ){.        zF
19430 6d 74 20 3d 20 22 25 73 20 55 53 49 4e 47 20 43  mt = "%s USING C
19440 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20 25 73  OVERING INDEX %s
19450 25 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  %s";.      }else
19460 7b 0a 20 20 20 20 20 20 20 20 7a 46 6d 74 20 3d  {.        zFmt =
19470 20 22 25 73 20 55 53 49 4e 47 20 49 4e 44 45 58   "%s USING INDEX
19480 20 25 73 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a   %s%s";.      }.
19490 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
194a0 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
194b0 20 7a 4d 73 67 2c 20 7a 46 6d 74 2c 20 7a 4d 73   zMsg, zFmt, zMs
194c0 67 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  g, pIdx->zName, 
194d0 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 73  zWhere);.      s
194e0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
194f0 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 65   zWhere);.    }e
19500 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20 26  lse if( (flags &
19510 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 20 26   WHERE_IPK)!=0 &
19520 26 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45  & (flags & WHERE
19530 5f 43 4f 4e 53 54 52 41 49 4e 54 29 21 3d 30 20  _CONSTRAINT)!=0 
19540 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  ){.      zMsg = 
19550 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
19560 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55 53  db, zMsg, "%s US
19570 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d  ING INTEGER PRIM
19580 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67 29 3b  ARY KEY", zMsg);
19590 0a 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61 67  ..      if( flag
195a0 73 26 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  s&(WHERE_COLUMN_
195b0 45 51 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  EQ|WHERE_COLUMN_
195c0 49 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  IN) ){.        z
195d0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
195e0 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
195f0 22 25 73 20 28 72 6f 77 69 64 3d 3f 29 22 2c 20  "%s (rowid=?)", 
19600 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  zMsg);.      }el
19610 73 65 20 69 66 28 20 28 66 6c 61 67 73 26 57 48  se if( (flags&WH
19620 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 29 3d  ERE_BOTH_LIMIT)=
19630 3d 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49  =WHERE_BOTH_LIMI
19640 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73  T ){.        zMs
19650 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
19660 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
19670 73 20 28 72 6f 77 69 64 3e 3f 20 41 4e 44 20 72  s (rowid>? AND r
19680 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b  owid<?)", zMsg);
19690 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
196a0 20 66 6c 61 67 73 26 57 48 45 52 45 5f 42 54 4d   flags&WHERE_BTM
196b0 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
196c0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
196d0 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
196e0 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3e 3f 29  g, "%s (rowid>?)
196f0 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20  ", zMsg);.      
19700 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53  }else if( ALWAYS
19710 28 66 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50  (flags&WHERE_TOP
19720 5f 4c 49 4d 49 54 29 20 29 7b 0a 20 20 20 20 20  _LIMIT) ){.     
19730 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
19740 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
19750 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3c 3f  sg, "%s (rowid<?
19760 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  )", zMsg);.     
19770 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66   }.    }.#ifndef
19780 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
19790 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 65 6c  TUALTABLE.    el
197a0 73 65 20 69 66 28 20 28 66 6c 61 67 73 20 26 20  se if( (flags & 
197b0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
197c0 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  LE)!=0 ){.      
197d0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
197e0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
197f0 20 22 25 73 20 56 49 52 54 55 41 4c 20 54 41 42   "%s VIRTUAL TAB
19800 4c 45 20 49 4e 44 45 58 20 25 64 3a 25 73 22 2c  LE INDEX %d:%s",
19810 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20   zMsg,.         
19820 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e           pLoop->
19830 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70  u.vtab.idxNum, p
19840 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  Loop->u.vtab.idx
19850 53 74 72 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Str);.    }.#end
19860 69 66 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  if.    zMsg = sq
19870 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
19880 2c 20 7a 4d 73 67 2c 20 22 25 73 22 2c 20 7a 4d  , zMsg, "%s", zM
19890 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sg);.    sqlite3
198a0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
198b0 5f 45 78 70 6c 61 69 6e 2c 20 69 49 64 2c 20 69  _Explain, iId, i
198c0 4c 65 76 65 6c 2c 20 69 46 72 6f 6d 2c 20 7a 4d  Level, iFrom, zM
198d0 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  sg, P4_DYNAMIC);
198e0 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
198f0 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 4f 6e 65  efine explainOne
19900 53 63 61 6e 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a  Scan(u,v,w,x,y,z
19910 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
19920 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
19930 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  */.../*.** Gener
19940 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
19950 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 69 4c   start of the iL
19960 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20  evel-th loop in 
19970 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
19980 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
19990 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62 79 20  on described by 
199a0 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69  pWInfo..*/.stati
199b0 63 20 42 69 74 6d 61 73 6b 20 63 6f 64 65 4f 6e  c Bitmask codeOn
199c0 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20 57 68  eLoopStart(.  Wh
199d0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
199e0 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 69     /* Complete i
199f0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
19a00 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
19a10 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65  e */.  int iLeve
19a20 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  l,          /* W
19a30 68 69 63 68 20 6c 65 76 65 6c 20 6f 66 20 70 57  hich level of pW
19a40 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64  Info->a[] should
19a50 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 42   be coded */.  B
19a60 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20  itmask notReady 
19a70 20 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61 62      /* Which tab
19a80 6c 65 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c  les are currentl
19a90 79 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29  y available */.)
19aa0 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20  {.  int j, k;   
19ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
19ac0 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
19ad0 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
19ae0 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
19af0 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74  cursor for the t
19b00 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  able */.  int ad
19b10 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20 2f  drNxt;         /
19b20 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20  * Where to jump 
19b30 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
19b40 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61 73   the next IN cas
19b50 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54  e */.  int omitT
19b60 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54  able;       /* T
19b70 72 75 65 20 69 66 20 77 65 20 75 73 65 20 74 68  rue if we use th
19b80 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a  e index only */.
19b90 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20    int bRev;     
19ba0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
19bb0 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63 61  f we need to sca
19bc0 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
19bd0 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  er */.  WhereLev
19be0 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20  el *pLevel;  /* 
19bf0 54 68 65 20 77 68 65 72 65 20 6c 65 76 65 6c 20  The where level 
19c00 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
19c10 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
19c20 70 3b 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65  p;    /* The Whe
19c30 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 62 65  reLoop object be
19c40 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57  ing coded */.  W
19c50 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
19c60 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69      /* Decomposi
19c70 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74 69  tion of the enti
19c80 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  re WHERE clause 
19c90 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
19ca0 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
19cb0 20 20 20 20 20 2f 2a 20 41 20 57 48 45 52 45 20       /* A WHERE 
19cc0 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20  clause term */. 
19cd0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
19ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cf0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
19d00 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
19d10 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
19d20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
19d30 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
19d40 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
19d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d60 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70       /* The prep
19d70 61 72 65 64 20 73 74 6d 74 20 75 6e 64 65 72 20  ared stmt under 
19d80 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f  constructions */
19d90 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
19da0 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d  t_item *pTabItem
19db0 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73  ;  /* FROM claus
19dc0 65 20 74 65 72 6d 20 62 65 69 6e 67 20 63 6f 64  e term being cod
19dd0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ed */.  int addr
19de0 42 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  Brk;            
19df0 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
19e00 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75  here to break ou
19e10 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  t of the loop */
19e20 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b  .  int addrCont;
19e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e40 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
19e50 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
19e60 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20   next cycle */. 
19e70 20 69 6e 74 20 69 52 6f 77 69 64 52 65 67 20 3d   int iRowidReg =
19e80 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 6f   0;        /* Ro
19e90 77 69 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e  wid is stored in
19ea0 20 74 68 69 73 20 72 65 67 69 73 74 65 72 2c 20   this register, 
19eb0 69 66 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20  if not zero */. 
19ec0 20 69 6e 74 20 69 52 65 6c 65 61 73 65 52 65 67   int iReleaseReg
19ed0 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 65   = 0;      /* Te
19ee0 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66  mp register to f
19ef0 72 65 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ree before retur
19f00 6e 69 6e 67 20 2a 2f 0a 0a 20 20 70 50 61 72 73  ning */..  pPars
19f10 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
19f20 73 65 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65  se;.  v = pParse
19f30 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57 43 20 3d  ->pVdbe;.  pWC =
19f40 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20   &pWInfo->sWC;. 
19f50 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
19f60 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57  ;.  pLevel = &pW
19f70 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b  Info->a[iLevel];
19f80 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65  .  pLoop = pLeve
19f90 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 70 54 61  l->pWLoop;.  pTa
19fa0 62 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d  bItem = &pWInfo-
19fb0 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  >pTabList->a[pLe
19fc0 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69  vel->iFrom];.  i
19fd0 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
19fe0 69 43 75 72 73 6f 72 3b 0a 20 20 70 4c 65 76 65  iCursor;.  pLeve
19ff0 6c 2d 3e 6e 6f 74 52 65 61 64 79 20 3d 20 6e 6f  l->notReady = no
1a000 74 52 65 61 64 79 20 26 20 7e 67 65 74 4d 61 73  tReady & ~getMas
1a010 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
1a020 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 62 52  Set, iCur);.  bR
1a030 65 76 20 3d 20 28 70 57 49 6e 66 6f 2d 3e 72 65  ev = (pWInfo->re
1a040 76 4d 61 73 6b 3e 3e 69 4c 65 76 65 6c 29 26 31  vMask>>iLevel)&1
1a050 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20  ;.  omitTable = 
1a060 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
1a070 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
1a080 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  )!=0 .          
1a090 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
1a0a0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
1a0b0 46 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30 3b  FORCE_TABLE)==0;
1a0c0 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d  .  VdbeModuleCom
1a0d0 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20  ment((v, "Begin 
1a0e0 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73  WHERE-loop%d: %s
1a0f0 22 2c 69 4c 65 76 65 6c 2c 70 54 61 62 49 74 65  ",iLevel,pTabIte
1a100 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
1a110 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 6c  ;..  /* Create l
1a120 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20 22 62  abels for the "b
1a130 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69  reak" and "conti
1a140 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69 6f 6e  nue" instruction
1a150 73 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63  s.  ** for the c
1a160 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75  urrent loop.  Ju
1a170 6d 70 20 74 6f 20 61 64 64 72 42 72 6b 20 74 6f  mp to addrBrk to
1a180 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61 20   break out of a 
1a190 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20  loop..  ** Jump 
1a1a0 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d  to cont to go im
1a1b0 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74 68 65  mediately to the
1a1c0 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
1a1d0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70  of the.  ** loop
1a1e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
1a1f0 20 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e 20   there is an IN 
1a200 6f 70 65 72 61 74 6f 72 2c 20 77 65 20 61 6c 73  operator, we als
1a210 6f 20 68 61 76 65 20 61 20 22 61 64 64 72 4e 78  o have a "addrNx
1a220 74 22 20 6c 61 62 65 6c 20 74 68 61 74 0a 20 20  t" label that.  
1a230 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74  ** means to cont
1a240 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65  inue with the ne
1a250 78 74 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62  xt IN value comb
1a260 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20  ination.  When. 
1a270 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f   ** there are no
1a280 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 69 6e   IN operators in
1a290 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73   the constraints
1a2a0 2c 20 74 68 65 20 22 61 64 64 72 4e 78 74 22 20  , the "addrNxt" 
1a2b0 6c 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68  label.  ** is th
1a2c0 65 20 73 61 6d 65 20 61 73 20 22 61 64 64 72 42  e same as "addrB
1a2d0 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72  rk"..  */.  addr
1a2e0 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  Brk = pLevel->ad
1a2f0 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e  drBrk = pLevel->
1a300 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65  addrNxt = sqlite
1a310 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1a320 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20  );.  addrCont = 
1a330 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74  pLevel->addrCont
1a340 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1a350 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f  keLabel(v);..  /
1a360 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
1a370 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20   right table of 
1a380 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
1a390 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a  N, allocate and.
1a3a0 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20    ** initialize 
1a3b0 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68  a memory cell th
1a3c0 61 74 20 72 65 63 6f 72 64 73 20 69 66 20 74 68  at records if th
1a3d0 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68 65 73  is table matches
1a3e0 20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66   any.  ** row of
1a3f0 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20   the left table 
1a400 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a  of the join..  *
1a410 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  /.  if( pLevel->
1a420 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 54 61 62  iFrom>0 && (pTab
1a430 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65  Item[0].jointype
1a440 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29   & JT_LEFT)!=0 )
1a450 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c  {.    pLevel->iL
1a460 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72  eftJoin = ++pPar
1a470 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71  se->nMem;.    sq
1a480 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a490 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
1a4a0 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  , pLevel->iLeftJ
1a4b0 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  oin);.    VdbeCo
1a4c0 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69 74 20  mment((v, "init 
1a4d0 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74  LEFT JOIN no-mat
1a4e0 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a  ch flag"));.  }.
1a4f0 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
1a500 73 65 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61  se of a FROM cla
1a510 75 73 65 20 73 75 62 71 75 65 72 79 20 69 6d 70  use subquery imp
1a520 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f  lemented as a co
1a530 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 66  -routine */.  if
1a540 28 20 70 54 61 62 49 74 65 6d 2d 3e 76 69 61 43  ( pTabItem->viaC
1a550 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
1a560 69 6e 74 20 72 65 67 59 69 65 6c 64 20 3d 20 70  int regYield = p
1a570 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  TabItem->regRetu
1a580 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  rn;.    sqlite3V
1a590 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1a5a0 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72  InitCoroutine, r
1a5b0 65 67 59 69 65 6c 64 2c 20 30 2c 20 70 54 61 62  egYield, 0, pTab
1a5c0 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
1a5d0 62 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  b);.    pLevel->
1a5e0 70 32 20 3d 20 20 73 71 6c 69 74 65 33 56 64 62  p2 =  sqlite3Vdb
1a5f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1a600 65 6c 64 2c 20 72 65 67 59 69 65 6c 64 2c 20 61  eld, regYield, a
1a610 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 56 64 62  ddrBrk);.    Vdb
1a620 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1a630 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1a640 2c 20 22 6e 65 78 74 20 72 6f 77 20 6f 66 20 5c  , "next row of \
1a650 22 25 73 5c 22 22 2c 20 70 54 61 62 49 74 65 6d  "%s\"", pTabItem
1a660 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
1a670 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
1a680 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d 65 6c  = OP_Goto;.  }el
1a690 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  se..#ifndef SQLI
1a6a0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1a6b0 41 42 4c 45 0a 20 20 69 66 28 20 20 28 70 4c 6f  ABLE.  if(  (pLo
1a6c0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1a6d0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
1a6e0 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43  )!=0 ){.    /* C
1a6f0 61 73 65 20 31 3a 20 20 54 68 65 20 74 61 62 6c  ase 1:  The tabl
1a700 65 20 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74  e is a virtual-t
1a710 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56  able.  Use the V
1a720 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74  Filter and VNext
1a730 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1a740 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
1a750 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
1a760 69 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50  int iReg;   /* P
1a770 33 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56  3 Value for OP_V
1a780 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  Filter */.    in
1a790 74 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 3b 0a  t addrNotFound;.
1a7a0 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61      int nConstra
1a7b0 69 6e 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54  int = pLoop->nLT
1a7c0 65 72 6d 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  erm;..    sqlite
1a7d0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
1a7e0 50 61 72 73 65 29 3b 0a 20 20 20 20 69 52 65 67  Parse);.    iReg
1a7f0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1a800 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
1a810 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20  Constraint+2);. 
1a820 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20     addrNotFound 
1a830 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  = pLevel->addrBr
1a840 6b 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  k;.    for(j=0; 
1a850 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a  j<nConstraint; j
1a860 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ++){.      int i
1a870 54 61 72 67 65 74 20 3d 20 69 52 65 67 2b 6a 2b  Target = iReg+j+
1a880 32 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  2;.      pTerm =
1a890 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
1a8a0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ];.      if( pTe
1a8b0 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  rm==0 ) continue
1a8c0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
1a8d0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
1a8e0 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  O_IN ){.        
1a8f0 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
1a900 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
1a910 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c  pLevel, j, bRev,
1a920 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20   iTarget);.     
1a930 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20     addrNotFound 
1a940 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
1a950 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
1a960 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1a970 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1a980 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
1a990 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a  ight, iTarget);.
1a9a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a9b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a9c0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1a9d0 72 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62  r, pLoop->u.vtab
1a9e0 2e 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a  .idxNum, iReg);.
1a9f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1aa00 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1aa10 67 65 72 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ger, nConstraint
1aa20 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20 73  , iReg+1);.    s
1aa30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1aa40 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20  (v, OP_VFilter, 
1aa50 69 43 75 72 2c 20 61 64 64 72 4e 6f 74 46 6f 75  iCur, addrNotFou
1aa60 6e 64 2c 20 69 52 65 67 2c 0a 20 20 20 20 20 20  nd, iReg,.      
1aa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa80 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64  pLoop->u.vtab.id
1aa90 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20  xStr,.          
1aaa0 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f              pLoo
1aab0 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  p->u.vtab.needFr
1aac0 65 65 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46 20  ee ? P4_MPRINTF 
1aad0 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  : P4_STATIC);.  
1aae0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1aaf0 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  );.    pLoop->u.
1ab00 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
1ab10 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  0;.    for(j=0; 
1ab20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 20 26 26  j<nConstraint &&
1ab30 20 6a 3c 31 36 3b 20 6a 2b 2b 29 7b 0a 20 20 20   j<16; j++){.   
1ab40 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 75     if( (pLoop->u
1ab50 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 3e 3e  .vtab.omitMask>>
1ab60 6a 29 26 31 20 29 7b 0a 20 20 20 20 20 20 20 20  j)&1 ){.        
1ab70 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
1ab80 65 6c 2c 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  el, pLoop->aLTer
1ab90 6d 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  m[j]);.      }. 
1aba0 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
1abb0 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a  >op = OP_VNext;.
1abc0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
1abd0 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65   iCur;.    pLeve
1abe0 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56  l->p2 = sqlite3V
1abf0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1ac00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
1ac10 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
1ac20 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f  Parse, iReg, nCo
1ac30 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20  nstraint+2);.   
1ac40 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1ac50 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
1ac60 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
1ac70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1ac80 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69  UALTABLE */..  i
1ac90 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
1aca0 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21  gs & WHERE_IPK)!
1acb0 3d 30 0a 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d  =0.   && (pLoop-
1acc0 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
1acd0 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52  E_COLUMN_IN|WHER
1ace0 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 29 21 3d 30  E_COLUMN_EQ))!=0
1acf0 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  .  ){.    /* Cas
1ad00 65 20 32 3a 20 20 57 65 20 63 61 6e 20 64 69 72  e 2:  We can dir
1ad10 65 63 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20  ectly reference 
1ad20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69  a single row usi
1ad30 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20  ng an.    **    
1ad40 20 20 20 20 20 20 65 71 75 61 6c 69 74 79 20 63        equality c
1ad50 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73  omparison agains
1ad60 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c  t the ROWID fiel
1ad70 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20 20  d.  Or.    **   
1ad80 20 20 20 20 20 20 20 77 65 20 72 65 66 65 72 65         we refere
1ad90 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77  nce multiple row
1ada0 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69 64  s using a "rowid
1adb0 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20 2a   IN (...)".    *
1adc0 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  *          const
1add0 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ruct..    */.   
1ade0 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
1adf0 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 31 20 29  u.btree.nEq==1 )
1ae00 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c  ;.    pTerm = pL
1ae10 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a  oop->aLTerm[0];.
1ae20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
1ae30 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  m!=0 );.    asse
1ae40 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  rt( pTerm->pExpr
1ae50 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
1ae60 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20  t( omitTable==0 
1ae70 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1ae80 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
1ae90 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
1aea0 3b 0a 20 20 20 20 69 52 65 6c 65 61 73 65 52 65  ;.    iReleaseRe
1aeb0 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
1aec0 65 6d 3b 0a 20 20 20 20 69 52 6f 77 69 64 52 65  em;.    iRowidRe
1aed0 67 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79  g = codeEquality
1aee0 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65  Term(pParse, pTe
1aef0 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 30 2c 20 62  rm, pLevel, 0, b
1af00 52 65 76 2c 20 69 52 65 6c 65 61 73 65 52 65 67  Rev, iReleaseReg
1af10 29 3b 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69  );.    if( iRowi
1af20 64 52 65 67 21 3d 69 52 65 6c 65 61 73 65 52 65  dReg!=iReleaseRe
1af30 67 20 29 20 73 71 6c 69 74 65 33 52 65 6c 65 61  g ) sqlite3Relea
1af40 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1af50 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a  , iReleaseReg);.
1af60 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c      addrNxt = pL
1af70 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20  evel->addrNxt;. 
1af80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1af90 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp2(v, OP_MustB
1afa0 65 49 6e 74 2c 20 69 52 6f 77 69 64 52 65 67 2c  eInt, iRowidReg,
1afb0 20 61 64 64 72 4e 78 74 29 3b 20 56 64 62 65 43   addrNxt); VdbeC
1afc0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1afd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1afe0 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74  3(v, OP_NotExist
1aff0 73 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 78 74  s, iCur, addrNxt
1b000 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
1b010 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1b020 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1b030 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
1b040 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52  hange(pParse, iR
1b050 6f 77 69 64 52 65 67 2c 20 31 29 3b 0a 20 20 20  owidReg, 1);.   
1b060 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1b070 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
1b080 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52  Cur, -1, iRowidR
1b090 65 67 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  eg);.    VdbeCom
1b0a0 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b  ment((v, "pk"));
1b0b0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
1b0c0 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c  = OP_Noop;.  }el
1b0d0 73 65 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77  se if( (pLoop->w
1b0e0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
1b0f0 50 4b 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  PK)!=0.         
1b100 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  && (pLoop->wsFla
1b110 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
1b120 4e 5f 52 41 4e 47 45 29 21 3d 30 0a 20 20 29 7b  N_RANGE)!=0.  ){
1b130 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20  .    /* Case 3: 
1b140 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65 71   We have an ineq
1b150 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f  uality compariso
1b160 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f  n against the RO
1b170 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20 2a  WID field..    *
1b180 2f 0a 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70  /.    int testOp
1b190 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
1b1a0 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20 69  int start;.    i
1b1b0 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d  nt memEndValue =
1b1c0 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72   0;.    WhereTer
1b1d0 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e 64  m *pStart, *pEnd
1b1e0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  ;..    assert( o
1b1f0 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  mitTable==0 );. 
1b200 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 70 53     j = 0;.    pS
1b210 74 61 72 74 20 3d 20 70 45 6e 64 20 3d 20 30 3b  tart = pEnd = 0;
1b220 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
1b230 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1b240 42 54 4d 5f 4c 49 4d 49 54 20 29 20 70 53 74 61  BTM_LIMIT ) pSta
1b250 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  rt = pLoop->aLTe
1b260 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 69 66 28  rm[j++];.    if(
1b270 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1b280 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
1b290 54 20 29 20 70 45 6e 64 20 3d 20 70 4c 6f 6f 70  T ) pEnd = pLoop
1b2a0 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20  ->aLTerm[j++];. 
1b2b0 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72     assert( pStar
1b2c0 74 21 3d 30 20 7c 7c 20 70 45 6e 64 21 3d 30 20  t!=0 || pEnd!=0 
1b2d0 29 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 20  );.    if( bRev 
1b2e0 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  ){.      pTerm =
1b2f0 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70   pStart;.      p
1b300 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20  Start = pEnd;.  
1b310 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72 6d      pEnd = pTerm
1b320 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1b330 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  pStart ){.      
1b340 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20  Expr *pX;       
1b350 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
1b360 72 65 73 73 69 6f 6e 20 74 68 61 74 20 64 65 66  ression that def
1b370 69 6e 65 73 20 74 68 65 20 73 74 61 72 74 20 62  ines the start b
1b380 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ound */.      in
1b390 74 20 72 31 2c 20 72 54 65 6d 70 3b 20 20 20 20  t r1, rTemp;    
1b3a0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73      /* Registers
1b3b0 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68 65   for holding the
1b3c0 20 73 74 61 72 74 20 62 6f 75 6e 64 61 72 79 20   start boundary 
1b3d0 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  */..      /* The
1b3e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74   following const
1b3f0 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78 20 63  ant maps TK_xx c
1b400 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72 72 65 73  odes into corres
1b410 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20 20 2a  ponding .      *
1b420 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65 73 2e 20  * seek opcodes. 
1b430 20 49 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 61   It depends on a
1b440 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65   particular orde
1b450 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a 20 20  ring of TK_xx.  
1b460 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e      */.      con
1b470 73 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b 5d 20  st u8 aMoveOp[] 
1b480 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 2f  = {.           /
1b490 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f 53  * TK_GT */  OP_S
1b4a0 65 65 6b 47 54 2c 0a 20 20 20 20 20 20 20 20 20  eekGT,.         
1b4b0 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f    /* TK_LE */  O
1b4c0 50 5f 53 65 65 6b 4c 45 2c 0a 20 20 20 20 20 20  P_SeekLE,.      
1b4d0 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f       /* TK_LT */
1b4e0 20 20 4f 50 5f 53 65 65 6b 4c 54 2c 0a 20 20 20    OP_SeekLT,.   
1b4f0 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 45          /* TK_GE
1b500 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 45 0a 20   */  OP_SeekGE. 
1b510 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 61 73       };.      as
1b520 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f  sert( TK_LE==TK_
1b530 47 54 2b 31 20 29 3b 20 20 20 20 20 20 2f 2a 20  GT+1 );      /* 
1b540 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72  Make sure the or
1b550 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20  dering.. */.    
1b560 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d    assert( TK_LT=
1b570 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20 20 20  =TK_GT+2 );     
1b580 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68 65 20   /*  ... of the 
1b590 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e 2e 20  TK_xx values... 
1b5a0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
1b5b0 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33 20   TK_GE==TK_GT+3 
1b5c0 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20  );      /*  ... 
1b5d0 69 73 20 63 6f 72 72 65 63 63 74 2e 20 2a 2f 0a  is correcct. */.
1b5e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
1b5f0 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  pStart->wtFlags 
1b600 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
1b610 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1b620 73 65 28 20 70 53 74 61 72 74 2d 3e 77 74 46 6c  se( pStart->wtFl
1b630 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
1b640 41 4c 20 29 3b 0a 20 20 20 20 20 20 70 58 20 3d  AL );.      pX =
1b650 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a   pStart->pExpr;.
1b660 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58        assert( pX
1b670 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  !=0 );.      tes
1b680 74 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e 6c  tcase( pStart->l
1b690 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 20  eftCursor!=iCur 
1b6a0 29 3b 20 2f 2a 20 74 72 61 6e 73 69 74 69 76 65  ); /* transitive
1b6b0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
1b6c0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1b6d0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1b6e0 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
1b6f0 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20 20 20  t, &rTemp);.    
1b700 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b710 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70 5b 70  Op3(v, aMoveOp[p
1b720 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69 43  X->op-TK_GT], iC
1b730 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 72 31 29  ur, addrBrk, r1)
1b740 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
1b750 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a  ent((v, "pk"));.
1b760 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1b770 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d  geIf(v, pX->op==
1b780 54 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20 56 64  TK_GT);.      Vd
1b790 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1b7a0 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 29 3b 0a  pX->op==TK_LE);.
1b7b0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1b7c0 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d  geIf(v, pX->op==
1b7d0 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20 20 56 64  TK_LT);.      Vd
1b7e0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1b7f0 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 29 3b 0a  pX->op==TK_GE);.
1b800 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b810 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
1b820 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c  ange(pParse, r1,
1b830 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
1b840 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1b850 28 70 50 61 72 73 65 2c 20 72 54 65 6d 70 29 3b  (pParse, rTemp);
1b860 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65  .      disableTe
1b870 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61 72  rm(pLevel, pStar
1b880 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
1b890 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1b8a0 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f  AddOp2(v, bRev ?
1b8b0 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65   OP_Last : OP_Re
1b8c0 77 69 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72  wind, iCur, addr
1b8d0 42 72 6b 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Brk);.      Vdbe
1b8e0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52  CoverageIf(v, bR
1b8f0 65 76 3d 3d 30 29 3b 0a 20 20 20 20 20 20 56 64  ev==0);.      Vd
1b900 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1b910 62 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 7d 0a  bRev!=0);.    }.
1b920 20 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a      if( pEnd ){.
1b930 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a        Expr *pX;.
1b940 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d        pX = pEnd-
1b950 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  >pExpr;.      as
1b960 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20  sert( pX!=0 );. 
1b970 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45       assert( (pE
1b980 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
1b990 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a  RM_VNULL)==0 );.
1b9a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1b9b0 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72  pEnd->leftCursor
1b9c0 21 3d 69 43 75 72 20 29 3b 20 2f 2a 20 54 72 61  !=iCur ); /* Tra
1b9d0 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69  nsitive constrai
1b9e0 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  nts */.      tes
1b9f0 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 77 74 46  tcase( pEnd->wtF
1ba00 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
1ba10 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  UAL );.      mem
1ba20 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61  EndValue = ++pPa
1ba30 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
1ba40 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ba50 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
1ba60 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65  ght, memEndValue
1ba70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d  );.      if( pX-
1ba80 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58  >op==TK_LT || pX
1ba90 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20  ->op==TK_GT ){. 
1baa0 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20         testOp = 
1bab0 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f  bRev ? OP_Le : O
1bac0 50 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  P_Ge;.      }els
1bad0 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f  e{.        testO
1bae0 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74  p = bRev ? OP_Lt
1baf0 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20   : OP_Gt;.      
1bb00 7d 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54  }.      disableT
1bb10 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64  erm(pLevel, pEnd
1bb20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61  );.    }.    sta
1bb30 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
1bb40 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
1bb50 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
1bb60 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20   bRev ? OP_Prev 
1bb70 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70  : OP_Next;.    p
1bb80 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72  Level->p1 = iCur
1bb90 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32  ;.    pLevel->p2
1bba0 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 61 73   = start;.    as
1bbb0 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35  sert( pLevel->p5
1bbc0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 74  ==0 );.    if( t
1bbd0 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  estOp!=OP_Noop )
1bbe0 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65  {.      iRowidRe
1bbf0 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
1bc00 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
1bc10 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1bc20 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 69  P_Rowid, iCur, i
1bc30 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
1bc40 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1bc50 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
1bc60 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52  Cur, -1, iRowidR
1bc70 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
1bc80 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1bc90 74 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56 61  testOp, memEndVa
1bca0 6c 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69 52  lue, addrBrk, iR
1bcb0 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
1bcc0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1bcd0 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 4c 65 29  , testOp==OP_Le)
1bce0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1bcf0 72 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70  rageIf(v, testOp
1bd00 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20  ==OP_Lt);.      
1bd10 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1bd20 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 47 65 29  , testOp==OP_Ge)
1bd30 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1bd40 72 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70  rageIf(v, testOp
1bd50 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20  ==OP_Gt);.      
1bd60 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1bd70 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41 46  eP5(v, SQLITE_AF
1bd80 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c 49  F_NUMERIC | SQLI
1bd90 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
1bda0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
1bdb0 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
1bdc0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
1bdd0 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
1bde0 34 3a 20 41 20 73 63 61 6e 20 75 73 69 6e 67 20  4: A scan using 
1bdf0 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a  an index..    **
1be00 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1be10 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
1be20 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72   may contain zer
1be30 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c 69  o or more equali
1be40 74 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ty .    **      
1be50 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20 6f     terms ("==" o
1be60 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73  r "IN" operators
1be70 29 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  ) that refer to 
1be80 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20 20  the N.    **    
1be90 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20 63       left-most c
1bea0 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
1beb0 64 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73 6f  dex. It may also
1bec0 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20   contain.    ** 
1bed0 20 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c 69          inequali
1bee0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28  ty constraints (
1bef0 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20  >, <, >= or <=) 
1bf00 6f 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a 20  on the indexed. 
1bf10 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f     **         co
1bf20 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64 69  lumn that immedi
1bf30 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68  ately follows th
1bf40 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e 20  e N equalities. 
1bf50 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20 20  Only .    **    
1bf60 20 20 20 20 20 74 68 65 20 72 69 67 68 74 2d 6d       the right-m
1bf70 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62  ost column can b
1bf80 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20  e an inequality 
1bf90 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73 74 0a  - the rest must.
1bfa0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 75      **         u
1bfb0 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64 20  se the "==" and 
1bfc0 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 20  "IN" operators. 
1bfd0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
1bfe0 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  the .    **     
1bff0 20 20 20 20 69 6e 64 65 78 20 69 73 20 6f 6e 20      index is on 
1c000 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74 68  (x,y,z), then th
1c010 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61 75  e following clau
1c020 73 65 73 20 61 72 65 20 61 6c 6c 20 0a 20 20 20  ses are all .   
1c030 20 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74 69   **         opti
1c040 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20 20  mized:.    **.  
1c050 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1c060 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  x=5.    **      
1c070 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d        x=5 AND y=
1c080 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  10.    **       
1c090 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c 31       x=5 AND y<1
1c0a0 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  0.    **        
1c0b0 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35 20      x=5 AND y>5 
1c0c0 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20  AND y<10.    ** 
1c0d0 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
1c0e0 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31 30  ND y=5 AND z<=10
1c0f0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1c100 20 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30 20         The z<10 
1c110 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c  term of the foll
1c120 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20  owing cannot be 
1c130 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a  used, only.    *
1c140 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 78 3d  *         the x=
1c150 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20  5 term:.    **. 
1c160 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1c170 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20   x=5 AND z<10.  
1c180 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1c190 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65 72      N may be zer
1c1a0 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69  o if there are i
1c1b0 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
1c1c0 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20 20  aints..    **   
1c1d0 20 20 20 20 20 20 49 66 20 74 68 65 72 65 20 61        If there a
1c1e0 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74 79  re no inequality
1c1f0 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68   constraints, th
1c200 65 6e 20 4e 20 69 73 20 61 74 0a 20 20 20 20 2a  en N is at.    *
1c210 2a 20 20 20 20 20 20 20 20 20 6c 65 61 73 74 20  *         least 
1c220 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  one..    **.    
1c230 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69 73 20  **         This 
1c240 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73 65  case is also use
1c250 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65  d when there are
1c260 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
1c270 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1c280 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74 20  constraints but 
1c290 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c 65  an index is sele
1c2a0 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e 20  cted anyway, in 
1c2b0 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 20 20 20  order.    **    
1c2c0 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68       to force th
1c2d0 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 74  e output order t
1c2e0 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20  o conform to an 
1c2f0 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a 2f  ORDER BY..    */
1c300 20 20 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f    .    static co
1c310 6e 73 74 20 75 38 20 61 53 74 61 72 74 4f 70 5b  nst u8 aStartOp[
1c320 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a 20  ] = {.      0,. 
1c330 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 4f 50       0,.      OP
1c340 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20 20  _Rewind,        
1c350 20 20 20 2f 2a 20 32 3a 20 28 21 73 74 61 72 74     /* 2: (!start
1c360 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
1c370 73 74 61 72 74 45 71 20 26 26 20 20 21 62 52 65  startEq &&  !bRe
1c380 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 4c  v) */.      OP_L
1c390 61 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ast,            
1c3a0 20 2f 2a 20 33 3a 20 28 21 73 74 61 72 74 5f 63   /* 3: (!start_c
1c3b0 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74  onstraints && st
1c3c0 61 72 74 45 71 20 26 26 20 20 20 62 52 65 76 29  artEq &&   bRev)
1c3d0 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65   */.      OP_See
1c3e0 6b 47 54 2c 20 20 20 20 20 20 20 20 20 20 20 2f  kGT,           /
1c3f0 2a 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 4: (start_cons
1c400 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61  traints  && !sta
1c410 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20 2a  rtEq && !bRev) *
1c420 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c  /.      OP_SeekL
1c430 54 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  T,           /* 
1c440 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  5: (start_constr
1c450 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72 74  aints  && !start
1c460 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a  Eq &&  bRev) */.
1c470 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 45 2c        OP_SeekGE,
1c480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36 3a             /* 6:
1c490 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69   (start_constrai
1c4a0 6e 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71  nts  &&  startEq
1c4b0 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20   && !bRev) */.  
1c4c0 20 20 20 20 4f 50 5f 53 65 65 6b 4c 45 20 20 20      OP_SeekLE   
1c4d0 20 20 20 20 20 20 20 20 20 2f 2a 20 37 3a 20 28           /* 7: (
1c4e0 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
1c4f0 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20 26  s  &&  startEq &
1c500 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  &  bRev) */.    
1c510 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  };.    static co
1c520 6e 73 74 20 75 38 20 61 45 6e 64 4f 70 5b 5d 20  nst u8 aEndOp[] 
1c530 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f 49 64 78  = {.      OP_Idx
1c540 47 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  GE,            /
1c550 2a 20 30 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72  * 0: (end_constr
1c560 61 69 6e 74 73 20 26 26 20 21 62 52 65 76 20 26  aints && !bRev &
1c570 26 20 21 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20  & !endEq) */.   
1c580 20 20 20 4f 50 5f 49 64 78 47 54 2c 20 20 20 20     OP_IdxGT,    
1c590 20 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28 65          /* 1: (e
1c5a0 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  nd_constraints &
1c5b0 26 20 21 62 52 65 76 20 26 26 20 20 65 6e 64 45  & !bRev &&  endE
1c5c0 71 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49  q) */.      OP_I
1c5d0 64 78 4c 45 2c 20 20 20 20 20 20 20 20 20 20 20  dxLE,           
1c5e0 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73   /* 2: (end_cons
1c5f0 74 72 61 69 6e 74 73 20 26 26 20 20 62 52 65 76  traints &&  bRev
1c600 20 26 26 20 21 65 6e 64 45 71 29 20 2a 2f 0a 20   && !endEq) */. 
1c610 20 20 20 20 20 4f 50 5f 49 64 78 4c 54 2c 20 20       OP_IdxLT,  
1c620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20            /* 3: 
1c630 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73  (end_constraints
1c640 20 26 26 20 20 62 52 65 76 20 26 26 20 20 65 6e   &&  bRev &&  en
1c650 64 45 71 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20  dEq) */.    };. 
1c660 20 20 20 75 31 36 20 6e 45 71 20 3d 20 70 4c 6f     u16 nEq = pLo
1c670 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  op->u.btree.nEq;
1c680 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1c690 66 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d 73  f == or IN terms
1c6a0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 42   */.    int regB
1c6b0 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
1c6c0 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67       /* Base reg
1c6d0 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f  ister holding co
1c6e0 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20  nstraint values 
1c6f0 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  */.    WhereTerm
1c700 20 2a 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20   *pRangeStart = 
1c710 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74  0;  /* Inequalit
1c720 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20  y constraint at 
1c730 72 61 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a 20  range start */. 
1c740 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52     WhereTerm *pR
1c750 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20 20 20  angeEnd = 0;    
1c760 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f  /* Inequality co
1c770 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67  nstraint at rang
1c780 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74  e end */.    int
1c790 20 73 74 61 72 74 45 71 3b 20 20 20 20 20 20 20   startEq;       
1c7a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1c7b0 65 20 69 66 20 72 61 6e 67 65 20 73 74 61 72 74  e if range start
1c7c0 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20   uses ==, >= or 
1c7d0 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e  <= */.    int en
1c7e0 64 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  dEq;            
1c7f0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1c800 66 20 72 61 6e 67 65 20 65 6e 64 20 75 73 65 73  f range end uses
1c810 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f   ==, >= or <= */
1c820 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 5f 63  .    int start_c
1c830 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20 20 20 20  onstraints;     
1c840 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 72 61    /* Start of ra
1c850 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61 69 6e  nge is constrain
1c860 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  ed */.    int nC
1c870 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20  onstraint;      
1c880 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1c890 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 74   of constraint t
1c8a0 65 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65  erms */.    Inde
1c8b0 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
1c8c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1c8d0 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65  index we will be
1c8e0 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e   using */.    in
1c8f0 74 20 69 49 64 78 43 75 72 3b 20 20 20 20 20 20  t iIdxCur;      
1c900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1c910 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
1c920 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  r the index */. 
1c930 20 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67     int nExtraReg
1c940 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1c950 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
1c960 72 61 20 72 65 67 69 73 74 65 72 73 20 6e 65 65  ra registers nee
1c970 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f  ded */.    int o
1c980 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1c990 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72          /* Instr
1c9a0 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f  uction opcode */
1c9b0 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 61 72  .    char *zStar
1c9c0 74 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  tAff;           
1c9d0 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f    /* Affinity fo
1c9e0 72 20 73 74 61 72 74 20 6f 66 20 72 61 6e 67 65  r start of range
1c9f0 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
1ca00 20 20 20 63 68 61 72 20 63 45 6e 64 41 66 66 20     char cEndAff 
1ca10 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1ca20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20  /* Affinity for 
1ca30 65 6e 64 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e  end of range con
1ca40 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 75  straint */.    u
1ca50 38 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20  8 bSeekPastNull 
1ca60 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  = 0;        /* T
1ca70 72 75 65 20 74 6f 20 73 65 65 6b 20 70 61 73 74  rue to seek past
1ca80 20 69 6e 69 74 69 61 6c 20 6e 75 6c 6c 73 20 2a   initial nulls *
1ca90 2f 0a 20 20 20 20 75 38 20 62 53 74 6f 70 41 74  /.    u8 bStopAt
1caa0 4e 75 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Null = 0;       
1cab0 20 20 20 2f 2a 20 41 64 64 20 63 6f 6e 64 69 74     /* Add condit
1cac0 69 6f 6e 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  ion to terminate
1cad0 20 61 74 20 4e 55 4c 4c 73 20 2a 2f 0a 0a 20 20   at NULLs */..  
1cae0 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e    pIdx = pLoop->
1caf0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
1cb00 20 20 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c      iIdxCur = pL
1cb10 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
1cb20 20 20 20 61 73 73 65 72 74 28 20 6e 45 71 3e 3d     assert( nEq>=
1cb30 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
1cb40 53 6b 69 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  Skip );..    /* 
1cb50 49 66 20 74 68 69 73 20 6c 6f 6f 70 20 73 61 74  If this loop sat
1cb60 69 73 66 69 65 73 20 61 20 73 6f 72 74 20 6f 72  isfies a sort or
1cb70 64 65 72 20 28 70 4f 72 64 65 72 42 79 29 20 72  der (pOrderBy) r
1cb80 65 71 75 65 73 74 20 74 68 61 74 20 0a 20 20 20  equest that .   
1cb90 20 2a 2a 20 77 61 73 20 70 61 73 73 65 64 20 74   ** was passed t
1cba0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
1cbb0 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 22  to implement a "
1cbc0 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 2e 2e  SELECT min(x) ..
1cbd0 2e 22 20 0a 20 20 20 20 2a 2a 20 71 75 65 72 79  ." .    ** query
1cbe0 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
1cbf0 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f  r will only allo
1cc00 77 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72 75  w the loop to ru
1cc10 6e 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20 73  n for.    ** a s
1cc20 69 6e 67 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e  ingle iteration.
1cc30 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
1cc40 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 72   the first row r
1cc50 65 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a 20 73  eturned.    ** s
1cc60 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 61  hould not have a
1cc70 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72   NULL value stor
1cc80 65 64 20 69 6e 20 27 78 27 2e 20 49 66 20 63 6f  ed in 'x'. If co
1cc90 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20 20 20 20  lumn 'x' is.    
1cca0 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65  ** the first one
1ccb0 20 61 66 74 65 72 20 74 68 65 20 6e 45 71 20 65   after the nEq e
1ccc0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1ccd0 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  nts in the index
1cce0 2c 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 72 65  ,.    ** this re
1ccf0 71 75 69 72 65 73 20 73 6f 6d 65 20 73 70 65 63  quires some spec
1cd00 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20  ial handling..  
1cd10 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1cd20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
1cd30 79 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c  y==0.         ||
1cd40 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
1cd50 79 2d 3e 6e 45 78 70 72 3d 3d 31 0a 20 20 20 20  y->nExpr==1.    
1cd60 20 20 20 20 20 7c 7c 20 28 70 57 49 6e 66 6f 2d       || (pWInfo-
1cd70 3e 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52  >wctrlFlags&WHER
1cd80 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 3d 3d  E_ORDERBY_MIN)==
1cd90 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 57  0 );.    if( (pW
1cda0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
1cdb0 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  &WHERE_ORDERBY_M
1cdc0 49 4e 29 21 3d 30 0a 20 20 20 20 20 26 26 20 70  IN)!=0.     && p
1cdd0 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3e 30 0a  WInfo->nOBSat>0.
1cde0 20 20 20 20 20 26 26 20 28 70 49 64 78 2d 3e 6e       && (pIdx->n
1cdf0 4b 65 79 43 6f 6c 3e 6e 45 71 29 0a 20 20 20 20  KeyCol>nEq).    
1ce00 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1ce10 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
1ce20 6e 53 6b 69 70 3d 3d 30 20 29 3b 0a 20 20 20 20  nSkip==0 );.    
1ce30 20 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20    bSeekPastNull 
1ce40 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45 78 74 72  = 1;.      nExtr
1ce50 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  aReg = 1;.    }.
1ce60 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79  .    /* Find any
1ce70 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
1ce80 74 72 61 69 6e 74 20 74 65 72 6d 73 20 66 6f 72  traint terms for
1ce90 20 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65   the start and e
1cea0 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  nd .    ** of th
1ceb0 65 20 72 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f  e range. .    */
1cec0 0a 20 20 20 20 6a 20 3d 20 6e 45 71 3b 0a 20 20  .    j = nEq;.  
1ced0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
1cee0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
1cef0 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
1cf00 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 70 4c  pRangeStart = pL
1cf10 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d  oop->aLTerm[j++]
1cf20 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65  ;.      nExtraRe
1cf30 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  g = 1;.    }.   
1cf40 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
1cf50 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f  ags & WHERE_TOP_
1cf60 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70  LIMIT ){.      p
1cf70 52 61 6e 67 65 45 6e 64 20 3d 20 70 4c 6f 6f 70  RangeEnd = pLoop
1cf80 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20  ->aLTerm[j++];. 
1cf90 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d       nExtraReg =
1cfa0 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52   1;.      if( pR
1cfb0 61 6e 67 65 53 74 61 72 74 3d 3d 30 0a 20 20 20  angeStart==0.   
1cfc0 20 20 20 20 26 26 20 28 6a 20 3d 20 70 49 64 78      && (j = pIdx
1cfd0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 29  ->aiColumn[nEq])
1cfe0 3e 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70  >=0 .       && p
1cff0 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  Idx->pTable->aCo
1d000 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a  l[j].notNull==0.
1d010 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1d020 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d   bSeekPastNull =
1d030 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1d040 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  }.    assert( pR
1d050 61 6e 67 65 45 6e 64 3d 3d 30 20 7c 7c 20 28 70  angeEnd==0 || (p
1d060 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67  RangeEnd->wtFlag
1d070 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
1d080 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65  =0 );..    /* Ge
1d090 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
1d0a0 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73  valuate all cons
1d0b0 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69  traint terms usi
1d0c0 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20  ng == or IN.    
1d0d0 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ** and store the
1d0e0 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65   values of those
1d0f0 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 61 72 72   terms in an arr
1d100 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a  ay of registers.
1d110 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20      ** starting 
1d120 61 74 20 72 65 67 42 61 73 65 2e 0a 20 20 20 20  at regBase..    
1d130 2a 2f 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d  */.    regBase =
1d140 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79   codeAllEquality
1d150 54 65 72 6d 73 28 70 50 61 72 73 65 2c 70 4c 65  Terms(pParse,pLe
1d160 76 65 6c 2c 62 52 65 76 2c 6e 45 78 74 72 61 52  vel,bRev,nExtraR
1d170 65 67 2c 26 7a 53 74 61 72 74 41 66 66 29 3b 0a  eg,&zStartAff);.
1d180 20 20 20 20 61 73 73 65 72 74 28 20 7a 53 74 61      assert( zSta
1d190 72 74 41 66 66 3d 3d 30 20 7c 7c 20 73 71 6c 69  rtAff==0 || sqli
1d1a0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 61  te3Strlen30(zSta
1d1b0 72 74 41 66 66 29 3e 3d 6e 45 71 20 29 3b 0a 20  rtAff)>=nEq );. 
1d1c0 20 20 20 69 66 28 20 7a 53 74 61 72 74 41 66 66     if( zStartAff
1d1d0 20 29 20 63 45 6e 64 41 66 66 20 3d 20 7a 53 74   ) cEndAff = zSt
1d1e0 61 72 74 41 66 66 5b 6e 45 71 5d 3b 0a 20 20 20  artAff[nEq];.   
1d1f0 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65   addrNxt = pLeve
1d200 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20  l->addrNxt;..   
1d210 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f   /* If we are do
1d220 69 6e 67 20 61 20 72 65 76 65 72 73 65 20 6f 72  ing a reverse or
1d230 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61  der scan on an a
1d240 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20  scending index, 
1d250 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72 77  or.    ** a forw
1d260 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e 20 6f  ard order scan o
1d270 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69  n a descending i
1d280 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61 6e 67  ndex, interchang
1d290 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 74  e the .    ** st
1d2a0 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72 6d  art and end term
1d2b0 73 20 28 70 52 61 6e 67 65 53 74 61 72 74 20 61  s (pRangeStart a
1d2c0 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20  nd pRangeEnd).. 
1d2d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6e     */.    if( (n
1d2e0 45 71 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  Eq<pIdx->nKeyCol
1d2f0 20 26 26 20 62 52 65 76 3d 3d 28 70 49 64 78 2d   && bRev==(pIdx-
1d300 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d  >aSortOrder[nEq]
1d310 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29  ==SQLITE_SO_ASC)
1d320 29 0a 20 20 20 20 20 7c 7c 20 28 62 52 65 76 20  ).     || (bRev 
1d330 26 26 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  && pIdx->nKeyCol
1d340 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20  ==nEq).    ){.  
1d350 20 20 20 20 53 57 41 50 28 57 68 65 72 65 54 65      SWAP(WhereTe
1d360 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c  rm *, pRangeEnd,
1d370 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20   pRangeStart);. 
1d380 20 20 20 20 20 53 57 41 50 28 75 38 2c 20 62 53       SWAP(u8, bS
1d390 65 65 6b 50 61 73 74 4e 75 6c 6c 2c 20 62 53 74  eekPastNull, bSt
1d3a0 6f 70 41 74 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d  opAtNull);.    }
1d3b0 0a 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ..    testcase( 
1d3c0 70 52 61 6e 67 65 53 74 61 72 74 20 26 26 20 28  pRangeStart && (
1d3d0 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70  pRangeStart->eOp
1d3e0 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21  erator & WO_LE)!
1d3f0 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
1d400 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20  se( pRangeStart 
1d410 26 26 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d  && (pRangeStart-
1d420 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1d430 47 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65  GE)!=0 );.    te
1d440 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e  stcase( pRangeEn
1d450 64 20 26 26 20 28 70 52 61 6e 67 65 45 6e 64 2d  d && (pRangeEnd-
1d460 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1d470 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65  LE)!=0 );.    te
1d480 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e  stcase( pRangeEn
1d490 64 20 26 26 20 28 70 52 61 6e 67 65 45 6e 64 2d  d && (pRangeEnd-
1d4a0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1d4b0 47 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 73 74  GE)!=0 );.    st
1d4c0 61 72 74 45 71 20 3d 20 21 70 52 61 6e 67 65 53  artEq = !pRangeS
1d4d0 74 61 72 74 20 7c 7c 20 70 52 61 6e 67 65 53 74  tart || pRangeSt
1d4e0 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  art->eOperator &
1d4f0 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a   (WO_LE|WO_GE);.
1d500 20 20 20 20 65 6e 64 45 71 20 3d 20 20 20 21 70      endEq =   !p
1d510 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61 6e  RangeEnd || pRan
1d520 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72  geEnd->eOperator
1d530 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29   & (WO_LE|WO_GE)
1d540 3b 0a 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73  ;.    start_cons
1d550 74 72 61 69 6e 74 73 20 3d 20 70 52 61 6e 67 65  traints = pRange
1d560 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a  Start || nEq>0;.
1d570 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65  .    /* Seek the
1d580 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 74 6f   index cursor to
1d590 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
1d5a0 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20  e range. */.    
1d5b0 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45  nConstraint = nE
1d5c0 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67  q;.    if( pRang
1d5d0 65 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  eStart ){.      
1d5e0 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
1d5f0 52 61 6e 67 65 53 74 61 72 74 2d 3e 70 45 78 70  RangeStart->pExp
1d600 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
1d610 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1d620 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
1d630 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
1d640 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65       if( (pRange
1d650 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26  Start->wtFlags &
1d660 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 0a   TERM_VNULL)==0.
1d670 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
1d680 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
1d690 52 69 67 68 74 29 0a 20 20 20 20 20 20 29 7b 0a  Right).      ){.
1d6a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1d6b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1d6c0 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b  IsNull, regBase+
1d6d0 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20  nEq, addrNxt);. 
1d6e0 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
1d6f0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a  age(v);.      }.
1d700 20 20 20 20 20 20 69 66 28 20 7a 53 74 61 72 74        if( zStart
1d710 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Aff ){.        i
1d720 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  f( sqlite3Compar
1d730 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74  eAffinity(pRight
1d740 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d  , zStartAff[nEq]
1d750 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  )==SQLITE_AFF_NO
1d760 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  NE){.          /
1d770 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70  * Since the comp
1d780 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20  arison is to be 
1d790 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e  performed with n
1d7a0 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20  o conversions.  
1d7b0 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69          ** appli
1d7c0 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e  ed to the operan
1d7d0 64 73 2c 20 73 65 74 20 74 68 65 20 61 66 66 69  ds, set the affi
1d7e0 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f  nity to apply to
1d7f0 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20   pRight to .    
1d800 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
1d810 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20  AFF_NONE.  */.  
1d820 20 20 20 20 20 20 20 20 7a 53 74 61 72 74 41 66          zStartAf
1d830 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f  f[nEq] = SQLITE_
1d840 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
1d850 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1d860 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73  sqlite3ExprNeeds
1d870 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  NoAffinityChange
1d880 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41  (pRight, zStartA
1d890 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20  ff[nEq]) ){.    
1d8a0 20 20 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b        zStartAff[
1d8b0 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46  nEq] = SQLITE_AF
1d8c0 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
1d8d0 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20  }.      }  .    
1d8e0 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b    nConstraint++;
1d8f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d900 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74   pRangeStart->wt
1d910 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1d920 54 55 41 4c 20 29 3b 0a 20 20 20 20 7d 65 6c 73  TUAL );.    }els
1d930 65 20 69 66 28 20 62 53 65 65 6b 50 61 73 74 4e  e if( bSeekPastN
1d940 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ull ){.      sql
1d950 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1d960 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65  , OP_Null, 0, re
1d970 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20  gBase+nEq);.    
1d980 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b    nConstraint++;
1d990 0a 20 20 20 20 20 20 73 74 61 72 74 45 71 20 3d  .      startEq =
1d9a0 20 30 3b 0a 20 20 20 20 20 20 73 74 61 72 74 5f   0;.      start_
1d9b0 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 31 3b  constraints = 1;
1d9c0 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 64 65 41  .    }.    codeA
1d9d0 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61  pplyAffinity(pPa
1d9e0 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  rse, regBase, nC
1d9f0 6f 6e 73 74 72 61 69 6e 74 20 2d 20 62 53 65 65  onstraint - bSee
1da00 6b 50 61 73 74 4e 75 6c 6c 2c 20 7a 53 74 61 72  kPastNull, zStar
1da10 74 41 66 66 29 3b 0a 20 20 20 20 6f 70 20 3d 20  tAff);.    op = 
1da20 61 53 74 61 72 74 4f 70 5b 28 73 74 61 72 74 5f  aStartOp[(start_
1da30 63 6f 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29 20  constraints<<2) 
1da40 2b 20 28 73 74 61 72 74 45 71 3c 3c 31 29 20 2b  + (startEq<<1) +
1da50 20 62 52 65 76 5d 3b 0a 20 20 20 20 61 73 73 65   bRev];.    asse
1da60 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20  rt( op!=0 );.   
1da70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1da80 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64  p4Int(v, op, iId
1da90 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72  xCur, addrNxt, r
1daa0 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61  egBase, nConstra
1dab0 69 6e 74 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  int);.    VdbeCo
1dac0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56  verage(v);.    V
1dad0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1dae0 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 29 3b   op==OP_Rewind);
1daf0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1db00 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20 20 20  OP_Rewind );.   
1db10 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1db20 76 2c 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 29 3b  v, op==OP_Last);
1db30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1db40 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20  ==OP_Last );.   
1db50 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1db60 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 54  v, op==OP_SeekGT
1db70 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  );  testcase( op
1db80 3d 3d 4f 50 5f 53 65 65 6b 47 54 20 29 3b 0a 20  ==OP_SeekGT );. 
1db90 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1dba0 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  f(v, op==OP_Seek
1dbb0 47 45 29 3b 20 20 74 65 73 74 63 61 73 65 28 20  GE);  testcase( 
1dbc0 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 45 20 29 3b  op==OP_SeekGE );
1dbd0 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
1dbe0 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65  eIf(v, op==OP_Se
1dbf0 65 6b 4c 45 29 3b 20 20 74 65 73 74 63 61 73 65  ekLE);  testcase
1dc00 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 45 20  ( op==OP_SeekLE 
1dc10 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
1dc20 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
1dc30 53 65 65 6b 4c 54 29 3b 20 20 74 65 73 74 63 61  SeekLT);  testca
1dc40 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c  se( op==OP_SeekL
1dc50 54 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61  T );..    /* Loa
1dc60 64 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  d the value for 
1dc70 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  the inequality c
1dc80 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 74 68 65  onstraint at the
1dc90 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20   end of the.    
1dca0 2a 2a 20 72 61 6e 67 65 20 28 69 66 20 61 6e 79  ** range (if any
1dcb0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43  )..    */.    nC
1dcc0 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b  onstraint = nEq;
1dcd0 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 45  .    if( pRangeE
1dce0 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  nd ){.      Expr
1dcf0 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67   *pRight = pRang
1dd00 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69  eEnd->pExpr->pRi
1dd10 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ght;.      sqlit
1dd20 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
1dd30 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
1dd40 65 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20 20  e+nEq, 1);.     
1dd50 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1dd60 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
1dd70 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
1dd80 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65       if( (pRange
1dd90 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
1dda0 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 0a 20 20  ERM_VNULL)==0.  
1ddb0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45       && sqlite3E
1ddc0 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 52 69  xprCanBeNull(pRi
1ddd0 67 68 74 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  ght).      ){.  
1dde0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ddf0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
1de00 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6e 45  Null, regBase+nE
1de10 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20  q, addrNxt);.   
1de20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1de30 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e(v);.      }.  
1de40 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43      if( sqlite3C
1de50 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
1de60 52 69 67 68 74 2c 20 63 45 6e 64 41 66 66 29 21  Right, cEndAff)!
1de70 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
1de80 0a 20 20 20 20 20 20 20 26 26 20 21 73 71 6c 69  .       && !sqli
1de90 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66  te3ExprNeedsNoAf
1dea0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69  finityChange(pRi
1deb0 67 68 74 2c 20 63 45 6e 64 41 66 66 29 0a 20 20  ght, cEndAff).  
1dec0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 63      ){.        c
1ded0 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  odeApplyAffinity
1dee0 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
1def0 2b 6e 45 71 2c 20 31 2c 20 26 63 45 6e 64 41 66  +nEq, 1, &cEndAf
1df00 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  f);.      }.    
1df10 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b    nConstraint++;
1df20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1df30 20 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c   pRangeEnd->wtFl
1df40 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
1df50 41 4c 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  AL );.    }else 
1df60 69 66 28 20 62 53 74 6f 70 41 74 4e 75 6c 6c 20  if( bStopAtNull 
1df70 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1df80 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1df90 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73  _Null, 0, regBas
1dfa0 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 65 6e  e+nEq);.      en
1dfb0 64 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e  dEq = 0;.      n
1dfc0 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
1dfd0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
1dfe0 62 46 72 65 65 28 64 62 2c 20 7a 53 74 61 72 74  bFree(db, zStart
1dff0 41 66 66 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f  Aff);..    /* To
1e000 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f  p of the loop bo
1e010 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c  dy */.    pLevel
1e020 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ->p2 = sqlite3Vd
1e030 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1e040 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
1e050 69 66 20 74 68 65 20 69 6e 64 65 78 20 63 75 72  if the index cur
1e060 73 6f 72 20 69 73 20 70 61 73 74 20 74 68 65 20  sor is past the 
1e070 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65  end of the range
1e080 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 43 6f  . */.    if( nCo
1e090 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20 20  nstraint ){.    
1e0a0 20 20 6f 70 20 3d 20 61 45 6e 64 4f 70 5b 62 52    op = aEndOp[bR
1e0b0 65 76 2a 32 20 2b 20 65 6e 64 45 71 5d 3b 0a 20  ev*2 + endEq];. 
1e0c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e0d0 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c  AddOp4Int(v, op,
1e0e0 20 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78   iIdxCur, addrNx
1e0f0 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e  t, regBase, nCon
1e100 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 20 20  straint);.      
1e110 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
1e120 5f 49 64 78 47 54 20 29 3b 20 20 56 64 62 65 43  _IdxGT );  VdbeC
1e130 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
1e140 3d 4f 50 5f 49 64 78 47 54 20 29 3b 0a 20 20 20  =OP_IdxGT );.   
1e150 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1e160 3d 4f 50 5f 49 64 78 47 45 20 29 3b 20 20 56 64  =OP_IdxGE );  Vd
1e170 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1e180 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a  op==OP_IdxGE );.
1e190 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e1a0 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 20  op==OP_IdxLT ); 
1e1b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1e1c0 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20  v, op==OP_IdxLT 
1e1d0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1e1e0 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 45 20  e( op==OP_IdxLE 
1e1f0 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  );  VdbeCoverage
1e200 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78  If(v, op==OP_Idx
1e210 4c 45 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  LE );.    }..   
1e220 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 74 61 62   /* Seek the tab
1e230 6c 65 20 63 75 72 73 6f 72 2c 20 69 66 20 72 65  le cursor, if re
1e240 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 64 69  quired */.    di
1e250 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
1e260 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a  , pRangeStart);.
1e270 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
1e280 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e  pLevel, pRangeEn
1e290 64 29 3b 0a 20 20 20 20 69 66 28 20 6f 6d 69 74  d);.    if( omit
1e2a0 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 2f  Table ){.      /
1e2b0 2a 20 70 49 64 78 20 69 73 20 61 20 63 6f 76 65  * pIdx is a cove
1e2c0 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 4e 6f 20  ring index.  No 
1e2d0 6e 65 65 64 20 74 6f 20 61 63 63 65 73 73 20 74  need to access t
1e2e0 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20 2a  he main table. *
1e2f0 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  /.    }else if( 
1e300 48 61 73 52 6f 77 69 64 28 70 49 64 78 2d 3e 70  HasRowid(pIdx->p
1e310 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20 20  Table) ){.      
1e320 69 52 6f 77 69 64 52 65 67 20 3d 20 2b 2b 70 50  iRowidReg = ++pP
1e330 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1e340 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e350 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77  Op2(v, OP_IdxRow
1e360 69 64 2c 20 69 49 64 78 43 75 72 2c 20 69 52 6f  id, iIdxCur, iRo
1e370 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73  widReg);.      s
1e380 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53  qlite3ExprCacheS
1e390 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43 75  tore(pParse, iCu
1e3a0 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67  r, -1, iRowidReg
1e3b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e3c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1e3d0 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 69 52 6f  _Seek, iCur, iRo
1e3e0 77 69 64 52 65 67 29 3b 20 20 2f 2a 20 44 65 66  widReg);  /* Def
1e3f0 65 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a 20 20  erred seek */.  
1e400 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 75 72    }else if( iCur
1e410 21 3d 69 49 64 78 43 75 72 20 29 7b 0a 20 20 20  !=iIdxCur ){.   
1e420 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20     Index *pPk = 
1e430 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
1e440 79 49 6e 64 65 78 28 70 49 64 78 2d 3e 70 54 61  yIndex(pIdx->pTa
1e450 62 6c 65 29 3b 0a 20 20 20 20 20 20 69 52 6f 77  ble);.      iRow
1e460 69 64 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  idReg = sqlite3G
1e470 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
1e480 73 65 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  se, pPk->nKeyCol
1e490 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  );.      for(j=0
1e4a0 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  ; j<pPk->nKeyCol
1e4b0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
1e4c0 6b 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  k = sqlite3Colum
1e4d0 6e 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20 70  nOfIndex(pIdx, p
1e4e0 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 29  Pk->aiColumn[j])
1e4f0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1e500 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1e510 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75  P_Column, iIdxCu
1e520 72 2c 20 6b 2c 20 69 52 6f 77 69 64 52 65 67 2b  r, k, iRowidReg+
1e530 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  j);.      }.    
1e540 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e550 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74  Op4Int(v, OP_Not
1e560 46 6f 75 6e 64 2c 20 69 43 75 72 2c 20 61 64 64  Found, iCur, add
1e570 72 43 6f 6e 74 2c 0a 20 20 20 20 20 20 20 20 20  rCont,.         
1e580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e590 20 20 69 52 6f 77 69 64 52 65 67 2c 20 70 50 6b    iRowidReg, pPk
1e5a0 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65  ->nKeyCol); Vdbe
1e5b0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1e5c0 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72   }..    /* Recor
1e5d0 64 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  d the instructio
1e5e0 6e 20 75 73 65 64 20 74 6f 20 74 65 72 6d 69 6e  n used to termin
1e5f0 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 44 69  ate the loop. Di
1e600 73 61 62 6c 65 20 0a 20 20 20 20 2a 2a 20 57 48  sable .    ** WH
1e610 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
1e620 20 6d 61 64 65 20 72 65 64 75 6e 64 61 6e 74 20   made redundant 
1e630 62 79 20 74 68 65 20 69 6e 64 65 78 20 72 61 6e  by the index ran
1e640 67 65 20 73 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a  ge scan..    */.
1e650 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
1e660 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
1e670 4e 45 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 70  NEROW ){.      p
1e680 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e  Level->op = OP_N
1e690 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  oop;.    }else i
1e6a0 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20  f( bRev ){.     
1e6b0 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
1e6c0 5f 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65  _Prev;.    }else
1e6d0 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
1e6e0 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  op = OP_Next;.  
1e6f0 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
1e700 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20  p1 = iIdxCur;.  
1e710 20 20 70 4c 65 76 65 6c 2d 3e 70 33 20 3d 20 28    pLevel->p3 = (
1e720 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57  pLoop->wsFlags&W
1e730 48 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45 44 29  HERE_UNQ_WANTED)
1e740 21 3d 30 20 3f 20 31 3a 30 3b 0a 20 20 20 20 69  !=0 ? 1:0;.    i
1e750 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
1e760 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54  gs & WHERE_CONST
1e770 52 41 49 4e 54 29 3d 3d 30 20 29 7b 0a 20 20 20  RAINT)==0 ){.   
1e780 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20     pLevel->p5 = 
1e790 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
1e7a0 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b  S_FULLSCAN_STEP;
1e7b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e7c0 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c    assert( pLevel
1e7d0 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  ->p5==0 );.    }
1e7e0 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65  .  }else..#ifnde
1e7f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  f SQLITE_OMIT_OR
1e800 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
1e810 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
1e820 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49  gs & WHERE_MULTI
1e830 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  _OR ){.    /* Ca
1e840 73 65 20 35 3a 20 20 54 77 6f 20 6f 72 20 6d 6f  se 5:  Two or mo
1e850 72 65 20 73 65 70 61 72 61 74 65 6c 79 20 69 6e  re separately in
1e860 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e  dexed terms conn
1e870 65 63 74 65 64 20 62 79 20 4f 52 0a 20 20 20 20  ected by OR.    
1e880 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c  **.    ** Exampl
1e890 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
1e8a0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
1e8b0 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20  t1(a,b,c,d);.   
1e8c0 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44   **   CREATE IND
1e8d0 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a  EX i1 ON t1(a);.
1e8e0 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
1e8f0 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 31 28 62  INDEX i2 ON t1(b
1e900 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  );.    **   CREA
1e910 54 45 20 49 4e 44 45 58 20 69 33 20 4f 4e 20 74  TE INDEX i3 ON t
1e920 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  1(c);.    **.   
1e930 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46   **   SELECT * F
1e940 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35  ROM t1 WHERE a=5
1e950 20 4f 52 20 62 3d 37 20 4f 52 20 28 63 3d 31 31   OR b=7 OR (c=11
1e960 20 41 4e 44 20 64 3d 31 33 29 0a 20 20 20 20 2a   AND d=13).    *
1e970 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 65 20  *.    ** In the 
1e980 65 78 61 6d 70 6c 65 2c 20 74 68 65 72 65 20 61  example, there a
1e990 72 65 20 74 68 72 65 65 20 69 6e 64 65 78 65 64  re three indexed
1e9a0 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64   terms connected
1e9b0 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a 2a 20 54   by OR..    ** T
1e9c0 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f  he top of the lo
1e9d0 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68  op looks like th
1e9e0 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  is:.    **.    *
1e9f0 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20  *          Null 
1ea00 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
1ea10 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68         # Zero th
1ea20 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20  e rowset in reg 
1ea30 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  1.    **.    ** 
1ea40 54 68 65 6e 2c 20 66 6f 72 20 65 61 63 68 20 69  Then, for each i
1ea50 6e 64 65 78 65 64 20 74 65 72 6d 2c 20 74 68 65  ndexed term, the
1ea60 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68 65 20   following. The 
1ea70 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20  arguments to.   
1ea80 20 2a 2a 20 52 6f 77 53 65 74 54 65 73 74 20 61   ** RowSetTest a
1ea90 72 65 20 73 75 63 68 20 74 68 61 74 20 74 68 65  re such that the
1eaa0 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 63 75   rowid of the cu
1eab0 72 72 65 6e 74 20 72 6f 77 20 69 73 20 69 6e 73  rrent row is ins
1eac0 65 72 74 65 64 0a 20 20 20 20 2a 2a 20 69 6e 74  erted.    ** int
1ead0 6f 20 74 68 65 20 52 6f 77 53 65 74 2e 20 49 66  o the RowSet. If
1eae0 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 70   it is already p
1eaf0 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c 20  resent, control 
1eb00 73 6b 69 70 73 20 74 68 65 0a 20 20 20 20 2a 2a  skips the.    **
1eb10 20 47 6f 73 75 62 20 6f 70 63 6f 64 65 20 61 6e   Gosub opcode an
1eb20 64 20 6a 75 6d 70 73 20 73 74 72 61 69 67 68 74  d jumps straight
1eb30 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e   to the code gen
1eb40 65 72 61 74 65 64 20 62 79 20 57 68 65 72 65 45  erated by WhereE
1eb50 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  nd()..    **.   
1eb60 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74   **        sqlit
1eb70 65 33 57 68 65 72 65 42 65 67 69 6e 28 3c 74 65  e3WhereBegin(<te
1eb80 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20 20 20 20  rm>).    **     
1eb90 20 20 20 20 20 52 6f 77 53 65 74 54 65 73 74 20       RowSetTest 
1eba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebb0 20 23 20 49 6e 73 65 72 74 20 72 6f 77 69 64 20   # Insert rowid 
1ebc0 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20 20 20 20  into rowset.    
1ebd0 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f 73 75  **          Gosu
1ebe0 62 20 20 20 20 20 20 32 20 41 0a 20 20 20 20 2a  b      2 A.    *
1ebf0 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  *        sqlite3
1ec00 57 68 65 72 65 45 6e 64 28 29 0a 20 20 20 20 2a  WhereEnd().    *
1ec10 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77 69  *.    ** Followi
1ec20 6e 67 20 74 68 65 20 61 62 6f 76 65 2c 20 63 6f  ng the above, co
1ec30 64 65 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  de to terminate 
1ec40 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20  the loop. Label 
1ec50 41 2c 20 74 68 65 20 74 61 72 67 65 74 0a 20 20  A, the target.  
1ec60 20 20 2a 2a 20 6f 66 20 74 68 65 20 47 6f 73 75    ** of the Gosu
1ec70 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70 73 20 74  b above, jumps t
1ec80 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  o the instructio
1ec90 6e 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68  n right after th
1eca0 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20  e Goto..    **. 
1ecb0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e     **          N
1ecc0 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20  ull       1     
1ecd0 20 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72             # Zer
1ece0 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20  o the rowset in 
1ecf0 72 65 67 20 31 0a 20 20 20 20 2a 2a 20 20 20 20  reg 1.    **    
1ed00 20 20 20 20 20 20 47 6f 74 6f 20 20 20 20 20 20        Goto      
1ed10 20 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20   B              
1ed20 20 20 23 20 54 68 65 20 6c 6f 6f 70 20 69 73 20    # The loop is 
1ed30 66 69 6e 69 73 68 65 64 2e 0a 20 20 20 20 2a 2a  finished..    **
1ed40 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41 3a  .    **       A:
1ed50 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20 20 20 20   <loop body>    
1ed60 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 52               # R
1ed70 65 74 75 72 6e 20 64 61 74 61 2c 20 77 68 61 74  eturn data, what
1ed80 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ever..    **.   
1ed90 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 65 74   **          Ret
1eda0 75 72 6e 20 20 20 20 20 32 20 20 20 20 20 20 20  urn     2       
1edb0 20 20 20 20 20 20 20 20 20 23 20 4a 75 6d 70 20           # Jump 
1edc0 62 61 63 6b 20 74 6f 20 74 68 65 20 47 6f 73 75  back to the Gosu
1edd0 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  b.    **.    ** 
1ede0 20 20 20 20 20 20 42 3a 20 3c 61 66 74 65 72 20        B: <after 
1edf0 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a 2a  the loop>.    **
1ee00 0a 20 20 20 20 2a 2a 20 41 64 64 65 64 20 32 30  .    ** Added 20
1ee10 31 34 2d 30 35 2d 32 36 3a 20 49 66 20 74 68 65  14-05-26: If the
1ee20 20 74 61 62 6c 65 20 69 73 20 61 20 57 49 54 48   table is a WITH
1ee30 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2c  OUT ROWID table,
1ee40 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 75 73 65   then.    ** use
1ee50 20 61 6e 20 65 70 68 65 72 6d 65 72 61 6c 20 69   an ephermeral i
1ee60 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20  ndex instead of 
1ee70 61 20 52 6f 77 53 65 74 20 74 6f 20 72 65 63 6f  a RowSet to reco
1ee80 72 64 20 74 68 65 20 70 72 69 6d 61 72 79 0a 20  rd the primary. 
1ee90 20 20 20 2a 2a 20 6b 65 79 73 20 6f 66 20 74 68     ** keys of th
1eea0 65 20 72 6f 77 73 20 77 65 20 68 61 76 65 20 61  e rows we have a
1eeb0 6c 72 65 61 64 79 20 73 65 65 6e 2e 0a 20 20 20  lready seen..   
1eec0 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20 57   **.    */.    W
1eed0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57  hereClause *pOrW
1eee0 63 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 2d  c;    /* The OR-
1eef0 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f 75  clause broken ou
1ef00 74 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20  t into subterms 
1ef10 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  */.    SrcList *
1ef20 70 4f 72 54 61 62 3b 20 20 20 20 20 20 20 2f 2a  pOrTab;       /*
1ef30 20 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c 65   Shortened table
1ef40 20 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61 75   list or OR-clau
1ef50 73 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f  se generation */
1ef60 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f 76  .    Index *pCov
1ef70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1ef80 20 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c 20 63    /* Potential c
1ef90 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 28 6f  overing index (o
1efa0 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20 69  r NULL) */.    i
1efb0 6e 74 20 69 43 6f 76 43 75 72 20 3d 20 70 50 61  nt iCovCur = pPa
1efc0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f 2a  rse->nTab++;  /*
1efd0 20 43 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72   Cursor used for
1efe0 20 69 6e 64 65 78 20 73 63 61 6e 73 20 28 69 66   index scans (if
1eff0 20 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20 69 6e   any) */..    in
1f000 74 20 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  t regReturn = ++
1f010 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20  pParse->nMem;   
1f020 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
1f030 74 65 72 20 75 73 65 64 20 77 69 74 68 20 4f 50  ter used with OP
1f040 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e  _Gosub */.    in
1f050 74 20 72 65 67 52 6f 77 73 65 74 20 3d 20 30 3b  t regRowset = 0;
1f060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f070 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
1f080 74 65 72 20 66 6f 72 20 52 6f 77 53 65 74 20 6f  ter for RowSet o
1f090 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74  bject */.    int
1f0a0 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20 20   regRowid = 0;  
1f0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0c0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
1f0d0 65 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64  er holding rowid
1f0e0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f   */.    int iLoo
1f0f0 70 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56  pBody = sqlite3V
1f100 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1f110 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f    /* Start of lo
1f120 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69  op body */.    i
1f130 6e 74 20 69 52 65 74 49 6e 69 74 3b 20 20 20 20  nt iRetInit;    
1f140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f150 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
1f160 65 73 73 20 6f 66 20 72 65 67 52 65 74 75 72 6e  ess of regReturn
1f170 20 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74   init */.    int
1f180 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d   untestedTerms =
1f190 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1f1a0 2f 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e 6f  /* Some terms no
1f1b0 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65 73  t completely tes
1f1c0 74 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ted */.    int i
1f1d0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
1f1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f1f0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
1f200 0a 20 20 20 20 45 78 70 72 20 2a 70 41 6e 64 45  .    Expr *pAndE
1f210 78 70 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  xpr = 0;        
1f220 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 22 2e          /* An ".
1f230 2e 20 41 4e 44 20 28 2e 2e 2e 29 22 20 65 78 70  . AND (...)" exp
1f240 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 54  ression */.    T
1f250 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61  able *pTab = pTa
1f260 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bItem->pTab;.   
1f270 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f  .    pTerm = pLo
1f280 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20  op->aLTerm[0];. 
1f290 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
1f2a0 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
1f2b0 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  t( pTerm->eOpera
1f2c0 74 6f 72 20 26 20 57 4f 5f 4f 52 20 29 3b 0a 20  tor & WO_OR );. 
1f2d0 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72     assert( (pTer
1f2e0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
1f2f0 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29 3b 0a  M_ORINFO)!=0 );.
1f300 20 20 20 20 70 4f 72 57 63 20 3d 20 26 70 54 65      pOrWc = &pTe
1f310 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77  rm->u.pOrInfo->w
1f320 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  c;.    pLevel->o
1f330 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a 20  p = OP_Return;. 
1f340 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
1f350 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20 20 20 20  regReturn;..    
1f360 2f 2a 20 53 65 74 20 75 70 20 61 20 6e 65 77 20  /* Set up a new 
1f370 53 72 63 4c 69 73 74 20 69 6e 20 70 4f 72 54 61  SrcList in pOrTa
1f380 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  b containing the
1f390 20 74 61 62 6c 65 20 62 65 69 6e 67 20 73 63 61   table being sca
1f3a0 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  nned.    ** by t
1f3b0 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20  his loop in the 
1f3c0 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64 20 61 6c  a[0] slot and al
1f3d0 6c 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65  l notReady table
1f3e0 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74  s in a[1..] slot
1f3f0 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62  s..    ** This b
1f400 65 63 6f 6d 65 73 20 74 68 65 20 53 72 63 4c 69  ecomes the SrcLi
1f410 73 74 20 69 6e 20 74 68 65 20 72 65 63 75 72 73  st in the recurs
1f420 69 76 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ive call to sqli
1f430 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e  te3WhereBegin().
1f440 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1f450 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31  pWInfo->nLevel>1
1f460 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e   ){.      int nN
1f470 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20  otReady;        
1f480 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1f490 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 52 65 61  number of notRea
1f4a0 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  dy tables */.   
1f4b0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
1f4c0 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53 72 63 3b  t_item *origSrc;
1f4d0 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
1f4e0 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   list of tables 
1f4f0 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 52 65 61  */.      nNotRea
1f500 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  dy = pWInfo->nLe
1f510 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20 2d 20 31  vel - iLevel - 1
1f520 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d  ;.      pOrTab =
1f530 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c   sqlite3StackAll
1f540 6f 63 52 61 77 28 64 62 2c 0a 20 20 20 20 20 20  ocRaw(db,.      
1f550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f560 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4f        sizeof(*pO
1f570 72 54 61 62 29 2b 20 6e 4e 6f 74 52 65 61 64 79  rTab)+ nNotReady
1f580 2a 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e  *sizeof(pOrTab->
1f590 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  a[0]));.      if
1f5a0 28 20 70 4f 72 54 61 62 3d 3d 30 20 29 20 72 65  ( pOrTab==0 ) re
1f5b0 74 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 20  turn notReady;. 
1f5c0 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 41 6c       pOrTab->nAl
1f5d0 6c 6f 63 20 3d 20 28 75 38 29 28 6e 4e 6f 74 52  loc = (u8)(nNotR
1f5e0 65 61 64 79 20 2b 20 31 29 3b 0a 20 20 20 20 20  eady + 1);.     
1f5f0 20 70 4f 72 54 61 62 2d 3e 6e 53 72 63 20 3d 20   pOrTab->nSrc = 
1f600 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a  pOrTab->nAlloc;.
1f610 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 72        memcpy(pOr
1f620 54 61 62 2d 3e 61 2c 20 70 54 61 62 49 74 65 6d  Tab->a, pTabItem
1f630 2c 20 73 69 7a 65 6f 66 28 2a 70 54 61 62 49 74  , sizeof(*pTabIt
1f640 65 6d 29 29 3b 0a 20 20 20 20 20 20 6f 72 69 67  em));.      orig
1f650 53 72 63 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  Src = pWInfo->pT
1f660 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  abList->a;.     
1f670 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f   for(k=1; k<=nNo
1f680 74 52 65 61 64 79 3b 20 6b 2b 2b 29 7b 0a 20 20  tReady; k++){.  
1f690 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4f        memcpy(&pO
1f6a0 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26 6f 72 69  rTab->a[k], &ori
1f6b0 67 53 72 63 5b 70 4c 65 76 65 6c 5b 6b 5d 2e 69  gSrc[pLevel[k].i
1f6c0 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66 28 70 4f  From], sizeof(pO
1f6d0 72 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b 0a 20 20  rTab->a[k]));.  
1f6e0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
1f6f0 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20  .      pOrTab = 
1f700 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
1f710 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1f720 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 72  Initialize the r
1f730 6f 77 73 65 74 20 72 65 67 69 73 74 65 72 20 74  owset register t
1f740 6f 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 2e 20  o contain NULL. 
1f750 41 6e 20 53 51 4c 20 4e 55 4c 4c 20 69 73 20 0a  An SQL NULL is .
1f760 20 20 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e      ** equivalen
1f770 74 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 72 6f  t to an empty ro
1f780 77 73 65 74 2e 20 20 4f 72 2c 20 63 72 65 61 74  wset.  Or, creat
1f790 65 20 61 6e 20 65 70 68 65 72 6d 65 72 61 6c 20  e an ephermeral 
1f7a0 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63 61 70  index.    ** cap
1f7b0 61 62 6c 65 20 6f 66 20 68 6f 6c 64 69 6e 67 20  able of holding 
1f7c0 70 72 69 6d 61 72 79 20 6b 65 79 73 20 69 6e 20  primary keys in 
1f7d0 74 68 65 20 63 61 73 65 20 6f 66 20 61 20 57 49  the case of a WI
1f7e0 54 48 4f 55 54 20 52 4f 57 49 44 2e 0a 20 20 20  THOUT ROWID..   
1f7f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 20   **.    ** Also 
1f800 69 6e 69 74 69 61 6c 69 7a 65 20 72 65 67 52 65  initialize regRe
1f810 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61 69 6e 20  turn to contain 
1f820 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
1f830 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a  he instruction .
1f840 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65      ** immediate
1f850 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
1f860 20 4f 50 5f 52 65 74 75 72 6e 20 61 74 20 74 68   OP_Return at th
1f870 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20  e bottom of the 
1f880 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20 20 20 2a  loop. This.    *
1f890 2a 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e  * is required in
1f8a0 20 61 20 66 65 77 20 6f 62 73 63 75 72 65 20 4c   a few obscure L
1f8b0 45 46 54 20 4a 4f 49 4e 20 63 61 73 65 73 20 77  EFT JOIN cases w
1f8c0 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d  here control jum
1f8d0 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 20 74  ps.    ** over t
1f8e0 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f  he top of the lo
1f8f0 6f 70 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79  op into the body
1f900 20 6f 66 20 69 74 2e 20 49 6e 20 74 68 69 73 20   of it. In this 
1f910 63 61 73 65 20 74 68 65 20 0a 20 20 20 20 2a 2a  case the .    **
1f920 20 63 6f 72 72 65 63 74 20 72 65 73 70 6f 6e 73   correct respons
1f930 65 20 66 6f 72 20 74 68 65 20 65 6e 64 2d 6f 66  e for the end-of
1f940 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74 68 65 20  -loop code (the 
1f950 4f 50 5f 52 65 74 75 72 6e 29 20 69 73 20 74 6f  OP_Return) is to
1f960 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c 20 74 68   .    ** fall th
1f970 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78  rough to the nex
1f980 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 6a  t instruction, j
1f990 75 73 74 20 61 73 20 61 6e 20 4f 50 5f 4e 65 78  ust as an OP_Nex
1f9a0 74 20 64 6f 65 73 20 69 66 0a 20 20 20 20 2a 2a  t does if.    **
1f9b0 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 75 6e   called on an un
1f9c0 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 75 72 73  initialized curs
1f9d0 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  or..    */.    i
1f9e0 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  f( (pWInfo->wctr
1f9f0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  lFlags & WHERE_D
1fa00 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30  UPLICATES_OK)==0
1fa10 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 48 61   ){.      if( Ha
1fa20 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a  sRowid(pTab) ){.
1fa30 20 20 20 20 20 20 20 20 72 65 67 52 6f 77 73 65          regRowse
1fa40 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
1fa50 65 6d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  em;.        sqli
1fa60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1fa70 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67   OP_Null, 0, reg
1fa80 52 6f 77 73 65 74 29 3b 0a 20 20 20 20 20 20 7d  Rowset);.      }
1fa90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 49 6e  else{.        In
1faa0 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74  dex *pPk = sqlit
1fab0 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
1fac0 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20  x(pTab);.       
1fad0 20 72 65 67 52 6f 77 73 65 74 20 3d 20 70 50 61   regRowset = pPa
1fae0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
1faf0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1fb00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
1fb10 6e 45 70 68 65 6d 65 72 61 6c 2c 20 72 65 67 52  nEphemeral, regR
1fb20 6f 77 73 65 74 2c 20 70 50 6b 2d 3e 6e 4b 65 79  owset, pPk->nKey
1fb30 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
1fb40 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65  lite3VdbeSetP4Ke
1fb50 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 50  yInfo(pParse, pP
1fb60 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
1fb70 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70    regRowid = ++p
1fb80 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
1fb90 20 7d 0a 20 20 20 20 69 52 65 74 49 6e 69 74 20   }.    iRetInit 
1fba0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1fbb0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1fbc0 72 2c 20 30 2c 20 72 65 67 52 65 74 75 72 6e 29  r, 0, regReturn)
1fbd0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
1fbe0 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20   original WHERE 
1fbf0 63 6c 61 75 73 65 20 69 73 20 7a 20 6f 66 20 74  clause is z of t
1fc00 68 65 20 66 6f 72 6d 3a 20 20 28 78 31 20 4f 52  he form:  (x1 OR
1fc10 20 78 32 20 4f 52 20 2e 2e 2e 29 20 41 4e 44 20   x2 OR ...) AND 
1fc20 79 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 66 6f  y.    ** Then fo
1fc30 72 20 65 76 65 72 79 20 74 65 72 6d 20 78 4e 2c  r every term xN,
1fc40 20 65 76 61 6c 75 61 74 65 20 61 73 20 74 68 65   evaluate as the
1fc50 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 3a 20   subexpression: 
1fc60 78 4e 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 20  xN AND z.    ** 
1fc70 54 68 61 74 20 77 61 79 2c 20 74 65 72 6d 73 20  That way, terms 
1fc80 69 6e 20 79 20 74 68 61 74 20 61 72 65 20 66 61  in y that are fa
1fc90 63 74 6f 72 65 64 20 69 6e 74 6f 20 74 68 65 20  ctored into the 
1fca0 64 69 73 6a 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  disjunction will
1fcb0 0a 20 20 20 20 2a 2a 20 62 65 20 70 69 63 6b 65  .    ** be picke
1fcc0 64 20 75 70 20 62 79 20 74 68 65 20 72 65 63 75  d up by the recu
1fcd0 72 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 73  rsive calls to s
1fce0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
1fcf0 28 29 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a  () below..    **
1fd00 0a 20 20 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79  .    ** Actually
1fd10 2c 20 65 61 63 68 20 73 75 62 65 78 70 72 65 73  , each subexpres
1fd20 73 69 6f 6e 20 69 73 20 63 6f 6e 76 65 72 74 65  sion is converte
1fd30 64 20 74 6f 20 22 78 4e 20 41 4e 44 20 77 22 20  d to "xN AND w" 
1fd40 77 68 65 72 65 20 77 20 69 73 0a 20 20 20 20 2a  where w is.    *
1fd50 2a 20 74 68 65 20 22 69 6e 74 65 72 65 73 74 69  * the "interesti
1fd60 6e 67 22 20 74 65 72 6d 73 20 6f 66 20 7a 20 2d  ng" terms of z -
1fd70 20 74 65 72 6d 73 20 74 68 61 74 20 64 69 64 20   terms that did 
1fd80 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e  not originate in
1fd90 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 4e 20 6f   the.    ** ON o
1fda0 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  r USING clause o
1fdb0 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61  f a LEFT JOIN, a
1fdc0 6e 64 20 74 65 72 6d 73 20 74 68 61 74 20 61 72  nd terms that ar
1fdd0 65 20 75 73 61 62 6c 65 20 61 73 20 0a 20 20 20  e usable as .   
1fde0 20 2a 2a 20 69 6e 64 69 63 65 73 2e 0a 20 20 20   ** indices..   
1fdf0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
1fe00 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61 6c 73  optimization als
1fe10 6f 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 69  o only applies i
1fe20 66 20 74 68 65 20 28 78 31 20 4f 52 20 78 32 20  f the (x1 OR x2 
1fe30 4f 52 20 2e 2e 2e 29 20 74 65 72 6d 0a 20 20 20  OR ...) term.   
1fe40 20 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61   ** is not conta
1fe50 69 6e 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 63  ined in the ON c
1fe60 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20  lause of a LEFT 
1fe70 4a 4f 49 4e 2e 0a 20 20 20 20 2a 2a 20 53 65 65  JOIN..    ** See
1fe80 20 74 69 63 6b 65 74 20 68 74 74 70 3a 2f 2f 77   ticket http://w
1fe90 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72  ww.sqlite.org/sr
1fea0 63 2f 69 6e 66 6f 2f 66 32 33 36 39 33 30 34 65  c/info/f2369304e
1feb0 34 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  4.    */.    if(
1fec0 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 31 20 29 7b   pWC->nTerm>1 ){
1fed0 0a 20 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d  .      int iTerm
1fee0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 54 65 72  ;.      for(iTer
1fef0 6d 3d 30 3b 20 69 54 65 72 6d 3c 70 57 43 2d 3e  m=0; iTerm<pWC->
1ff00 6e 54 65 72 6d 3b 20 69 54 65 72 6d 2b 2b 29 7b  nTerm; iTerm++){
1ff10 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
1ff20 45 78 70 72 20 3d 20 70 57 43 2d 3e 61 5b 69 54  Expr = pWC->a[iT
1ff30 65 72 6d 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  erm].pExpr;.    
1ff40 20 20 20 20 69 66 28 20 26 70 57 43 2d 3e 61 5b      if( &pWC->a[
1ff50 69 54 65 72 6d 5d 20 3d 3d 20 70 54 65 72 6d 20  iTerm] == pTerm 
1ff60 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1ff70 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
1ff80 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1ff90 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 63 6f  P_FromJoin) ) co
1ffa0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1ffb0 74 65 73 74 63 61 73 65 28 20 70 57 43 2d 3e 61  testcase( pWC->a
1ffc0 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20  [iTerm].wtFlags 
1ffd0 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 3b  & TERM_ORINFO );
1ffe0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1fff0 65 28 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  e( pWC->a[iTerm]
20000 2e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  .wtFlags & TERM_
20010 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20  VIRTUAL );.     
20020 20 20 20 69 66 28 20 70 57 43 2d 3e 61 5b 69 54     if( pWC->a[iT
20030 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20 28  erm].wtFlags & (
20040 54 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d  TERM_ORINFO|TERM
20050 5f 56 49 52 54 55 41 4c 29 20 29 20 63 6f 6e 74  _VIRTUAL) ) cont
20060 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
20070 28 20 28 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  ( (pWC->a[iTerm]
20080 2e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  .eOperator & WO_
20090 41 4c 4c 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  ALL)==0 ) contin
200a0 75 65 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  ue;.        pExp
200b0 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
200c0 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29  up(db, pExpr, 0)
200d0 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45 78  ;.        pAndEx
200e0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
200f0 41 6e 64 28 64 62 2c 20 70 41 6e 64 45 78 70 72  And(db, pAndExpr
20100 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
20110 7d 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e 64  }.      if( pAnd
20120 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
20130 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74  pAndExpr = sqlit
20140 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
20150 54 4b 5f 41 4e 44 2c 20 30 2c 20 70 41 6e 64 45  TK_AND, 0, pAndE
20160 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  xpr, 0);.      }
20170 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
20180 75 6e 20 61 20 73 65 70 61 72 61 74 65 20 57 48  un a separate WH
20190 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65  ERE clause for e
201a0 61 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ach term of the 
201b0 4f 52 20 63 6c 61 75 73 65 2e 20 20 41 66 74 65  OR clause.  Afte
201c0 72 0a 20 20 20 20 2a 2a 20 65 6c 69 6d 69 6e 61  r.    ** elimina
201d0 74 69 6e 67 20 64 75 70 6c 69 63 61 74 65 73 20  ting duplicates 
201e0 66 72 6f 6d 20 6f 74 68 65 72 20 57 48 45 52 45  from other WHERE
201f0 20 63 6c 61 75 73 65 73 2c 20 74 68 65 20 61 63   clauses, the ac
20200 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 0a 20 20  tion for each.  
20210 20 20 2a 2a 20 73 75 62 2d 57 48 45 52 45 20 63    ** sub-WHERE c
20220 6c 61 75 73 65 20 69 73 20 74 6f 20 74 6f 20 69  lause is to to i
20230 6e 76 6f 6b 65 20 74 68 65 20 6d 61 69 6e 20 6c  nvoke the main l
20240 6f 6f 70 20 62 6f 64 79 20 61 73 20 61 20 73 75  oop body as a su
20250 62 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f  broutine..    */
20260 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
20270 69 3c 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b 20  i<pOrWc->nTerm; 
20280 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65  ii++){.      Whe
20290 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 20  reTerm *pOrTerm 
202a0 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b  = &pOrWc->a[ii];
202b0 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65  .      if( pOrTe
202c0 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
202d0 69 43 75 72 20 7c 7c 20 28 70 4f 72 54 65 72 6d  iCur || (pOrTerm
202e0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
202f0 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20  _AND)!=0 ){.    
20300 20 20 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70      WhereInfo *p
20310 53 75 62 57 49 6e 66 6f 3b 20 20 20 20 20 20 20  SubWInfo;       
20320 20 20 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20      /* Info for 
20330 73 69 6e 67 6c 65 20 4f 52 2d 74 65 72 6d 20 73  single OR-term s
20340 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 45  can */.        E
20350 78 70 72 20 2a 70 4f 72 45 78 70 72 20 3d 20 70  xpr *pOrExpr = p
20360 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 3b 20 2f  OrTerm->pExpr; /
20370 2a 20 43 75 72 72 65 6e 74 20 4f 52 20 63 6c 61  * Current OR cla
20380 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20  use term */.    
20390 20 20 20 20 69 6e 74 20 6a 31 20 3d 20 30 3b 20      int j1 = 0; 
203a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203b0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
203c0 66 20 6a 75 6d 70 20 6f 70 65 72 61 74 69 6f 6e  f jump operation
203d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
203e0 70 41 6e 64 45 78 70 72 20 26 26 20 21 45 78 70  pAndExpr && !Exp
203f0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4f 72  rHasProperty(pOr
20400 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
20410 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  n) ){.          
20420 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74 20  pAndExpr->pLeft 
20430 3d 20 70 4f 72 45 78 70 72 3b 0a 20 20 20 20 20  = pOrExpr;.     
20440 20 20 20 20 20 70 4f 72 45 78 70 72 20 3d 20 70       pOrExpr = p
20450 41 6e 64 45 78 70 72 3b 0a 20 20 20 20 20 20 20  AndExpr;.       
20460 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f   }.        /* Lo
20470 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65  op through table
20480 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61   entries that ma
20490 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d  tch term pOrTerm
204a0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 53 75  . */.        pSu
204b0 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  bWInfo = sqlite3
204c0 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
204d0 65 2c 20 70 4f 72 54 61 62 2c 20 70 4f 72 45 78  e, pOrTab, pOrEx
204e0 70 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  pr, 0, 0,.      
204f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20500 20 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45    WHERE_OMIT_OPE
20510 4e 5f 43 4c 4f 53 45 20 7c 20 57 48 45 52 45 5f  N_CLOSE | WHERE_
20520 41 4e 44 5f 4f 4e 4c 59 20 7c 0a 20 20 20 20 20  AND_ONLY |.     
20530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20540 20 20 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54     WHERE_FORCE_T
20550 41 42 4c 45 20 7c 20 57 48 45 52 45 5f 4f 4e 45  ABLE | WHERE_ONE
20560 54 41 42 4c 45 5f 4f 4e 4c 59 2c 20 69 43 6f 76  TABLE_ONLY, iCov
20570 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73  Cur);.        as
20580 73 65 72 74 28 20 70 53 75 62 57 49 6e 66 6f 20  sert( pSubWInfo 
20590 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
205a0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
205b0 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 69  led );.        i
205c0 66 28 20 70 53 75 62 57 49 6e 66 6f 20 29 7b 0a  f( pSubWInfo ){.
205d0 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 4c            WhereL
205e0 6f 6f 70 20 2a 70 53 75 62 4c 6f 6f 70 3b 0a 20  oop *pSubLoop;. 
205f0 20 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e           explain
20600 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20 20 20 20  OneScan(.       
20610 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70         pParse, p
20620 4f 72 54 61 62 2c 20 26 70 53 75 62 57 49 6e 66  OrTab, &pSubWInf
20630 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65 76 65 6c 2c  o->a[0], iLevel,
20640 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20   pLevel->iFrom, 
20650 30 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  0.          );. 
20660 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
20670 20 69 73 20 74 68 65 20 73 75 62 2d 57 48 45 52   is the sub-WHER
20680 45 20 63 6c 61 75 73 65 20 62 6f 64 79 2e 20 20  E clause body.  
20690 46 69 72 73 74 20 73 6b 69 70 20 6f 76 65 72 0a  First skip over.
206a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 75 70            ** dup
206b0 6c 69 63 61 74 65 20 72 6f 77 73 20 66 72 6f 6d  licate rows from
206c0 20 70 72 69 6f 72 20 73 75 62 2d 57 48 45 52 45   prior sub-WHERE
206d0 20 63 6c 61 75 73 65 73 2c 20 61 6e 64 20 72 65   clauses, and re
206e0 63 6f 72 64 20 74 68 65 0a 20 20 20 20 20 20 20  cord the.       
206f0 20 20 20 2a 2a 20 72 6f 77 69 64 20 28 6f 72 20     ** rowid (or 
20700 50 52 49 4d 41 52 59 20 4b 45 59 29 20 66 6f 72  PRIMARY KEY) for
20710 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
20720 20 73 6f 20 74 68 61 74 20 74 68 65 20 73 61 6d   so that the sam
20730 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72  e.          ** r
20740 6f 77 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70  ow will be skipp
20750 65 64 20 69 6e 20 73 75 62 73 65 71 75 65 6e 74  ed in subsequent
20760 20 73 75 62 2d 57 48 45 52 45 20 63 6c 61 75 73   sub-WHERE claus
20770 65 73 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  es..          */
20780 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
20790 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
207a0 67 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49  gs & WHERE_DUPLI
207b0 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a  CATES_OK)==0 ){.
207c0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
207d0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  r;.            i
207e0 6e 74 20 69 53 65 74 20 3d 20 28 28 69 69 3d 3d  nt iSet = ((ii==
207f0 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f  pOrWc->nTerm-1)?
20800 2d 31 3a 69 69 29 3b 0a 20 20 20 20 20 20 20 20  -1:ii);.        
20810 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64      if( HasRowid
20820 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
20830 20 20 20 20 20 20 20 20 72 20 3d 20 73 71 6c 69          r = sqli
20840 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
20850 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61  lumn(pParse, pTa
20860 62 2c 20 2d 31 2c 20 69 43 75 72 2c 20 72 65 67  b, -1, iCur, reg
20870 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20 20 20  Rowid, 0);.     
20880 20 20 20 20 20 20 20 20 20 6a 31 20 3d 20 73 71           j1 = sq
20890 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
208a0 6e 74 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 54  nt(v, OP_RowSetT
208b0 65 73 74 2c 20 72 65 67 52 6f 77 73 65 74 2c 20  est, regRowset, 
208c0 30 2c 20 72 2c 69 53 65 74 29 3b 0a 20 20 20 20  0, r,iSet);.    
208d0 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
208e0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
208f0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
20900 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 64 65              Inde
20910 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33  x *pPk = sqlite3
20920 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
20930 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 20  pTab);.         
20940 20 20 20 20 20 69 6e 74 20 6e 50 6b 20 3d 20 70       int nPk = p
20950 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20  Pk->nKeyCol;.   
20960 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
20970 50 6b 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  Pk;..           
20980 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 50     /* Read the P
20990 4b 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20  K into an array 
209a0 6f 66 20 74 65 6d 70 20 72 65 67 69 73 74 65 72  of temp register
209b0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
209c0 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33 47      r = sqlite3G
209d0 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
209e0 73 65 2c 20 6e 50 6b 29 3b 0a 20 20 20 20 20 20  se, nPk);.      
209f0 20 20 20 20 20 20 20 20 66 6f 72 28 69 50 6b 3d          for(iPk=
20a00 30 3b 20 69 50 6b 3c 6e 50 6b 3b 20 69 50 6b 2b  0; iPk<nPk; iPk+
20a10 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
20a20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
20a30 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 50 6b  Pk->aiColumn[iPk
20a40 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
20a50 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
20a60 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
20a70 73 65 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20  se, pTab, iCol, 
20a80 69 43 75 72 2c 20 72 2b 69 50 6b 2c 20 30 29 3b  iCur, r+iPk, 0);
20a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
20aa0 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20ab0 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
20ac0 74 65 6d 70 20 74 61 62 6c 65 20 61 6c 72 65 61  temp table alrea
20ad0 64 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 69 73  dy contains this
20ae0 20 6b 65 79 2e 20 49 66 20 73 6f 2c 0a 20 20 20   key. If so,.   
20af0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
20b00 65 20 72 6f 77 20 68 61 73 20 61 6c 72 65 61 64  e row has alread
20b10 79 20 62 65 65 6e 20 69 6e 63 6c 75 64 65 64 20  y been included 
20b20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
20b30 74 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  t and.          
20b40 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 69 67      ** can be ig
20b50 6e 6f 72 65 64 20 28 62 79 20 6a 75 6d 70 69 6e  nored (by jumpin
20b60 67 20 70 61 73 74 20 74 68 65 20 47 6f 73 75 62  g past the Gosub
20b70 20 62 65 6c 6f 77 29 2e 20 4f 74 68 65 72 77 69   below). Otherwi
20b80 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
20b90 20 20 2a 2a 20 69 6e 73 65 72 74 20 74 68 65 20    ** insert the 
20ba0 6b 65 79 20 69 6e 74 6f 20 74 68 65 20 74 65 6d  key into the tem
20bb0 70 20 74 61 62 6c 65 20 61 6e 64 20 70 72 6f 63  p table and proc
20bc0 65 65 64 20 77 69 74 68 20 70 72 6f 63 65 73 73  eed with process
20bd0 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 20 20  ing.            
20be0 20 20 2a 2a 20 74 68 65 20 72 6f 77 2e 0a 20 20    ** the row..  
20bf0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20              **. 
20c00 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
20c10 55 73 65 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  Use some of the 
20c20 73 61 6d 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  same optimizatio
20c30 6e 73 20 61 73 20 4f 50 5f 52 6f 77 53 65 74 54  ns as OP_RowSetT
20c40 65 73 74 3a 20 49 66 20 69 53 65 74 0a 20 20 20  est: If iSet.   
20c50 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73             ** is
20c60 20 7a 65 72 6f 2c 20 61 73 73 75 6d 65 20 74 68   zero, assume th
20c70 61 74 20 74 68 65 20 6b 65 79 20 63 61 6e 6e 6f  at the key canno
20c80 74 20 61 6c 72 65 61 64 79 20 62 65 20 70 72 65  t already be pre
20c90 73 65 6e 74 20 69 6e 0a 20 20 20 20 20 20 20 20  sent in.        
20ca0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d        ** the tem
20cb0 70 20 74 61 62 6c 65 2e 20 41 6e 64 20 69 66 20  p table. And if 
20cc0 69 53 65 74 20 69 73 20 2d 31 2c 20 61 73 73 75  iSet is -1, assu
20cd0 6d 65 20 74 68 61 74 20 74 68 65 72 65 20 69 73  me that there is
20ce0 20 6e 6f 20 0a 20 20 20 20 20 20 20 20 20 20 20   no .           
20cf0 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 69 6e     ** need to in
20d00 73 65 72 74 20 74 68 65 20 6b 65 79 20 69 6e 74  sert the key int
20d10 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65  o the temp table
20d20 2c 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 65 76  , as it will nev
20d30 65 72 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  er .            
20d40 20 20 2a 2a 20 62 65 20 74 65 73 74 65 64 20 66    ** be tested f
20d50 6f 72 2e 20 20 2a 2f 20 0a 20 20 20 20 20 20 20  or.  */ .       
20d60 20 20 20 20 20 20 20 69 66 28 20 69 53 65 74 20         if( iSet 
20d70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
20d80 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56     j1 = sqlite3V
20d90 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
20da0 4f 50 5f 46 6f 75 6e 64 2c 20 72 65 67 52 6f 77  OP_Found, regRow
20db0 73 65 74 2c 20 30 2c 20 72 2c 20 6e 50 6b 29 3b  set, 0, r, nPk);
20dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20dd0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
20de0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
20df0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
20e00 69 66 28 20 69 53 65 74 3e 3d 30 20 29 7b 0a 20  if( iSet>=0 ){. 
20e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
20e20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
20e30 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
20e40 64 2c 20 72 2c 20 6e 50 6b 2c 20 72 65 67 52 6f  d, r, nPk, regRo
20e50 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wid);.          
20e60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20e70 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64  eAddOp3(v, OP_Id
20e80 78 49 6e 73 65 72 74 2c 20 72 65 67 52 6f 77 73  xInsert, regRows
20e90 65 74 2c 20 72 65 67 52 6f 77 69 64 2c 20 30 29  et, regRowid, 0)
20ea0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
20eb0 20 20 69 66 28 20 69 53 65 74 20 29 20 73 71 6c    if( iSet ) sql
20ec0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
20ed0 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
20ee0 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20  EKRESULT);.     
20ef0 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
20f00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6c            /* Rel
20f10 65 61 73 65 20 74 68 65 20 61 72 72 61 79 20 6f  ease the array o
20f20 66 20 74 65 6d 70 20 72 65 67 69 73 74 65 72 73  f temp registers
20f30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
20f40 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
20f50 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
20f60 2c 20 72 2c 20 6e 50 6b 29 3b 0a 20 20 20 20 20  , r, nPk);.     
20f70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20f80 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
20f90 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 6d 61  /* Invoke the ma
20fa0 69 6e 20 6c 6f 6f 70 20 62 6f 64 79 20 61 73 20  in loop body as 
20fb0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
20fc0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
20fd0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
20fe0 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 74 75  P_Gosub, regRetu
20ff0 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a  rn, iLoopBody);.
21000 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  .          /* Ju
21010 6d 70 20 68 65 72 65 20 28 73 6b 69 70 70 69 6e  mp here (skippin
21020 67 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20  g the main loop 
21030 62 6f 64 79 20 73 75 62 72 6f 75 74 69 6e 65 29  body subroutine)
21040 20 69 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   if the.        
21050 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 73 75 62    ** current sub
21060 2d 57 48 45 52 45 20 72 6f 77 20 69 73 20 61 20  -WHERE row is a 
21070 64 75 70 6c 69 63 61 74 65 20 66 72 6f 6d 20 70  duplicate from p
21080 72 69 6f 72 20 73 75 62 2d 57 48 45 52 45 73 2e  rior sub-WHEREs.
21090 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
210a0 28 20 6a 31 20 29 20 73 71 6c 69 74 65 33 56 64  ( j1 ) sqlite3Vd
210b0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31  beJumpHere(v, j1
210c0 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  );..          /*
210d0 20 54 68 65 20 70 53 75 62 57 49 6e 66 6f 2d 3e   The pSubWInfo->
210e0 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 66 6c  untestedTerms fl
210f0 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ag means that th
21100 69 73 20 4f 52 20 74 65 72 6d 0a 20 20 20 20 20  is OR term.     
21110 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65       ** containe
21120 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 41 4e  d one or more AN
21130 44 20 74 65 72 6d 20 66 72 6f 6d 20 61 20 6e 6f  D term from a no
21140 74 52 65 61 64 79 20 74 61 62 6c 65 2e 20 20 54  tReady table.  T
21150 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
21160 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 6e  terms from the n
21170 6f 74 52 65 61 64 79 20 74 61 62 6c 65 20 63 6f  otReady table co
21180 75 6c 64 20 6e 6f 74 20 62 65 20 74 65 73 74 65  uld not be teste
21190 64 20 61 6e 64 20 77 69 6c 6c 0a 20 20 20 20 20  d and will.     
211a0 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20       ** need to 
211b0 62 65 20 74 65 73 74 65 64 20 6c 61 74 65 72 2e  be tested later.
211c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
211d0 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
211e0 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
211f0 65 72 6d 73 20 29 20 75 6e 74 65 73 74 65 64 54  erms ) untestedT
21200 65 72 6d 73 20 3d 20 31 3b 0a 0a 20 20 20 20 20  erms = 1;..     
21210 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 6f       /* If all o
21220 66 20 74 68 65 20 4f 52 2d 63 6f 6e 6e 65 63 74  f the OR-connect
21230 65 64 20 74 65 72 6d 73 20 61 72 65 20 6f 70 74  ed terms are opt
21240 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 74 68 65  imized using the
21250 20 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20   same.          
21260 2a 2a 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68  ** index, and th
21270 65 20 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65  e index is opene
21280 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  d using the same
21290 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 20   cursor number. 
212a0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20 65           ** by e
212b0 61 63 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ach call to sqli
212c0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
212d0 6d 61 64 65 20 62 79 20 74 68 69 73 20 6c 6f 6f  made by this loo
212e0 70 2c 20 69 74 20 6d 61 79 0a 20 20 20 20 20 20  p, it may.      
212f0 20 20 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62      ** be possib
21300 6c 65 20 74 6f 20 75 73 65 20 74 68 61 74 20 69  le to use that i
21310 6e 64 65 78 20 61 73 20 61 20 63 6f 76 65 72 69  ndex as a coveri
21320 6e 67 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  ng index..      
21330 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
21340 20 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 20   ** If the call 
21350 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
21360 65 67 69 6e 28 29 20 61 62 6f 76 65 20 72 65 73  egin() above res
21370 75 6c 74 65 64 20 69 6e 20 61 20 73 63 61 6e 20  ulted in a scan 
21380 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a  that.          *
21390 2a 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c  * uses an index,
213a0 20 61 6e 64 20 74 68 69 73 20 69 73 20 65 69 74   and this is eit
213b0 68 65 72 20 74 68 65 20 66 69 72 73 74 20 4f 52  her the first OR
213c0 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 0a  -connected term.
213d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
213e0 63 65 73 73 65 64 20 6f 72 20 74 68 65 20 69 6e  cessed or the in
213f0 64 65 78 20 69 73 20 74 68 65 20 73 61 6d 65 20  dex is the same 
21400 61 73 20 74 68 61 74 20 75 73 65 64 20 62 79 20  as that used by 
21410 61 6c 6c 20 70 72 65 76 69 6f 75 73 0a 20 20 20  all previous.   
21420 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 2c         ** terms,
21430 20 73 65 74 20 70 43 6f 76 20 74 6f 20 74 68 65   set pCov to the
21440 20 63 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72   candidate cover
21450 69 6e 67 20 69 6e 64 65 78 2e 20 4f 74 68 65 72  ing index. Other
21460 77 69 73 65 2c 20 73 65 74 20 0a 20 20 20 20 20  wise, set .     
21470 20 20 20 20 20 2a 2a 20 70 43 6f 76 20 74 6f 20       ** pCov to 
21480 4e 55 4c 4c 20 74 6f 20 69 6e 64 69 63 61 74 65  NULL to indicate
21490 20 74 68 61 74 20 6e 6f 20 63 61 6e 64 69 64 61   that no candida
214a0 74 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  te covering inde
214b0 78 20 77 69 6c 6c 20 0a 20 20 20 20 20 20 20 20  x will .        
214c0 20 20 2a 2a 20 62 65 20 61 76 61 69 6c 61 62 6c    ** be availabl
214d0 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
214e0 20 20 20 20 20 20 20 20 20 20 70 53 75 62 4c 6f            pSubLo
214f0 6f 70 20 3d 20 70 53 75 62 57 49 6e 66 6f 2d 3e  op = pSubWInfo->
21500 61 5b 30 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20  a[0].pWLoop;.   
21510 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
21520 70 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  pSubLoop->wsFlag
21530 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49  s & WHERE_AUTO_I
21540 4e 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20 20 20  NDEX)==0 );.    
21550 20 20 20 20 20 20 69 66 28 20 28 70 53 75 62 4c        if( (pSubL
21560 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
21570 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
21580 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
21590 69 69 3d 3d 30 20 7c 7c 20 70 53 75 62 4c 6f 6f  ii==0 || pSubLoo
215a0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
215b0 78 3d 3d 70 43 6f 76 29 0a 20 20 20 20 20 20 20  x==pCov).       
215c0 20 20 20 20 26 26 20 28 48 61 73 52 6f 77 69 64      && (HasRowid
215d0 28 70 54 61 62 29 20 7c 7c 20 21 49 73 50 72 69  (pTab) || !IsPri
215e0 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 53 75  maryKeyIndex(pSu
215f0 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  bLoop->u.btree.p
21600 49 6e 64 65 78 29 29 0a 20 20 20 20 20 20 20 20  Index)).        
21610 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
21620 20 61 73 73 65 72 74 28 20 70 53 75 62 57 49 6e   assert( pSubWIn
21630 66 6f 2d 3e 61 5b 30 5d 2e 69 49 64 78 43 75 72  fo->a[0].iIdxCur
21640 3d 3d 69 43 6f 76 43 75 72 20 29 3b 0a 20 20 20  ==iCovCur );.   
21650 20 20 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20           pCov = 
21660 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  pSubLoop->u.btre
21670 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  e.pIndex;.      
21680 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21690 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20 30 3b         pCov = 0;
216a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
216b0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69 73          /* Finis
216c0 68 20 74 68 65 20 6c 6f 6f 70 20 74 68 72 6f 75  h the loop throu
216d0 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  gh table entries
216e0 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d   that match term
216f0 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20   pOrTerm. */.   
21700 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
21710 65 72 65 45 6e 64 28 70 53 75 62 57 49 6e 66 6f  ereEnd(pSubWInfo
21720 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
21730 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
21740 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78  Level->u.pCovidx
21750 20 3d 20 70 43 6f 76 3b 0a 20 20 20 20 69 66 28   = pCov;.    if(
21760 20 70 43 6f 76 20 29 20 70 4c 65 76 65 6c 2d 3e   pCov ) pLevel->
21770 69 49 64 78 43 75 72 20 3d 20 69 43 6f 76 43 75  iIdxCur = iCovCu
21780 72 3b 0a 20 20 20 20 69 66 28 20 70 41 6e 64 45  r;.    if( pAndE
21790 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 41 6e  xpr ){.      pAn
217a0 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30  dExpr->pLeft = 0
217b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
217c0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 41  xprDelete(db, pA
217d0 6e 64 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  ndExpr);.    }. 
217e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
217f0 61 6e 67 65 50 31 28 76 2c 20 69 52 65 74 49 6e  angeP1(v, iRetIn
21800 69 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  it, sqlite3VdbeC
21810 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a  urrentAddr(v));.
21820 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21830 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
21840 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  , 0, pLevel->add
21850 72 42 72 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74  rBrk);.    sqlit
21860 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
21870 65 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29  el(v, iLoopBody)
21880 3b 0a 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  ;..    if( pWInf
21890 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71  o->nLevel>1 ) sq
218a0 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65 28 64  lite3StackFree(d
218b0 62 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20 20 20  b, pOrTab);.    
218c0 69 66 28 20 21 75 6e 74 65 73 74 65 64 54 65 72  if( !untestedTer
218d0 6d 73 20 29 20 64 69 73 61 62 6c 65 54 65 72 6d  ms ) disableTerm
218e0 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b  (pLevel, pTerm);
218f0 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20  .  }else.#endif 
21900 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  /* SQLITE_OMIT_O
21910 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  R_OPTIMIZATION *
21920 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 43 61  /..  {.    /* Ca
21930 73 65 20 36 3a 20 20 54 68 65 72 65 20 69 73 20  se 6:  There is 
21940 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e  no usable index.
21950 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63    We must do a c
21960 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20 20  omplete.    **  
21970 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66 20          scan of 
21980 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65  the entire table
21990 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61  ..    */.    sta
219a0 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74  tic const u8 aSt
219b0 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78 74  ep[] = { OP_Next
219c0 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20 20 20  , OP_Prev };.   
219d0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
219e0 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20 4f 50   aStart[] = { OP
219f0 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61 73 74  _Rewind, OP_Last
21a00 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   };.    assert( 
21a10 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65 76 3d  bRev==0 || bRev=
21a20 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54  =1 );.    if( pT
21a30 61 62 49 74 65 6d 2d 3e 69 73 52 65 63 75 72 73  abItem->isRecurs
21a40 69 76 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ive ){.      /* 
21a50 54 61 62 6c 65 73 20 6d 61 72 6b 65 64 20 69 73  Tables marked is
21a60 52 65 63 75 72 73 69 76 65 20 68 61 76 65 20 6f  Recursive have o
21a70 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  nly a single row
21a80 20 74 68 61 74 20 69 73 20 73 74 6f 72 65 64 20   that is stored 
21a90 69 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 70 73  in.      ** a ps
21aa0 65 75 64 6f 2d 63 75 72 73 6f 72 2e 20 20 4e 6f  eudo-cursor.  No
21ab0 20 6e 65 65 64 20 74 6f 20 52 65 77 69 6e 64 20   need to Rewind 
21ac0 6f 72 20 4e 65 78 74 20 73 75 63 68 20 63 75 72  or Next such cur
21ad0 73 6f 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70  sors. */.      p
21ae0 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e  Level->op = OP_N
21af0 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  oop;.    }else{.
21b00 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
21b10 20 3d 20 61 53 74 65 70 5b 62 52 65 76 5d 3b 0a   = aStep[bRev];.
21b20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31        pLevel->p1
21b30 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70   = iCur;.      p
21b40 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20  Level->p2 = 1 + 
21b50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21b60 32 28 76 2c 20 61 53 74 61 72 74 5b 62 52 65 76  2(v, aStart[bRev
21b70 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b  ], iCur, addrBrk
21b80 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
21b90 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76 3d  erageIf(v, bRev=
21ba0 3d 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  =0);.      VdbeC
21bb0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65  overageIf(v, bRe
21bc0 76 21 3d 30 29 3b 0a 20 20 20 20 20 20 70 4c 65  v!=0);.      pLe
21bd0 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45  vel->p5 = SQLITE
21be0 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c  _STMTSTATUS_FULL
21bf0 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d  SCAN_STEP;.    }
21c00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65 72  .  }..  /* Inser
21c10 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65  t code to test e
21c20 76 65 72 79 20 73 75 62 65 78 70 72 65 73 73 69  very subexpressi
21c30 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20 63  on that can be c
21c40 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63  ompletely.  ** c
21c50 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74 68  omputed using th
21c60 65 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66  e current set of
21c70 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
21c80 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
21c90 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  , j=pWC->nTerm; 
21ca0 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b  j>0; j--, pTerm+
21cb0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
21cc0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
21cd0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
21ce0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
21cf0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
21d00 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
21d10 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20  TERM_CODED );.  
21d20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
21d30 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
21d40 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
21d50 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
21d60 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
21d70 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d  reqAll & pLevel-
21d80 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b  >notReady)!=0 ){
21d90 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
21da0 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65   pWInfo->unteste
21db0 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20  dTerms==0.      
21dc0 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
21dd0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
21de0 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  & WHERE_ONETABLE
21df0 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20 20  _ONLY)!=0 );.   
21e00 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73     pWInfo->untes
21e10 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20 20  tedTerms = 1;.  
21e20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
21e30 20 20 7d 0a 20 20 20 20 70 45 20 3d 20 70 54 65    }.    pE = pTe
21e40 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61  rm->pExpr;.    a
21e50 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a  ssert( pE!=0 );.
21e60 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
21e70 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45 78  iLeftJoin && !Ex
21e80 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
21e90 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
21ea0 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
21eb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
21ec0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
21ed0 50 61 72 73 65 2c 20 70 45 2c 20 61 64 64 72 43  Parse, pE, addrC
21ee0 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ont, SQLITE_JUMP
21ef0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 54 65  IFNULL);.    pTe
21f00 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
21f10 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a  ERM_CODED;.  }..
21f20 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65    /* Insert code
21f30 20 74 6f 20 74 65 73 74 20 66 6f 72 20 69 6d 70   to test for imp
21f40 6c 69 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 73  lied constraints
21f50 20 62 61 73 65 64 20 6f 6e 20 74 72 61 6e 73 69   based on transi
21f60 74 69 76 69 74 79 0a 20 20 2a 2a 20 6f 66 20 74  tivity.  ** of t
21f70 68 65 20 22 3d 3d 22 20 6f 70 65 72 61 74 6f 72  he "==" operator
21f80 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d  ..  **.  ** Exam
21f90 70 6c 65 3a 20 49 66 20 74 68 65 20 57 48 45 52  ple: If the WHER
21fa0 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
21fb0 73 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 61 6e  s "t1.a=t2.b" an
21fc0 64 20 22 74 32 2e 62 3d 31 32 33 22 0a 20 20 2a  d "t2.b=123".  *
21fd0 2a 20 61 6e 64 20 77 65 20 61 72 65 20 63 6f 64  * and we are cod
21fe0 69 6e 67 20 74 68 65 20 74 31 20 6c 6f 6f 70 20  ing the t1 loop 
21ff0 61 6e 64 20 74 68 65 20 74 32 20 6c 6f 6f 70 20  and the t2 loop 
22000 68 61 73 20 6e 6f 74 20 79 65 74 20 63 6f 64 65  has not yet code
22010 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 65 20  d,.  ** then we 
22020 63 61 6e 6e 6f 74 20 75 73 65 20 74 68 65 20 22  cannot use the "
22030 74 31 2e 61 3d 74 32 2e 62 22 20 63 6f 6e 73 74  t1.a=t2.b" const
22040 72 61 69 6e 74 2c 20 62 75 74 20 77 65 20 63 61  raint, but we ca
22050 6e 20 63 6f 64 65 0a 20 20 2a 2a 20 74 68 65 20  n code.  ** the 
22060 69 6d 70 6c 69 65 64 20 22 74 31 2e 61 3d 31 32  implied "t1.a=12
22070 33 22 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20  3" constraint.. 
22080 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   */.  for(pTerm=
22090 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e  pWC->a, j=pWC->n
220a0 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20  Term; j>0; j--, 
220b0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pTerm++){.    Ex
220c0 70 72 20 2a 70 45 2c 20 2a 70 45 41 6c 74 3b 0a  pr *pE, *pEAlt;.
220d0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
220e0 41 6c 74 3b 0a 20 20 20 20 69 66 28 20 70 54 65  Alt;.    if( pTe
220f0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
22100 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
22110 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
22120 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
22130 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 28 57  m->eOperator!=(W
22140 4f 5f 45 51 55 49 56 7c 57 4f 5f 45 51 29 20 29  O_EQUIV|WO_EQ) )
22150 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
22160 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
22170 72 73 6f 72 21 3d 69 43 75 72 20 29 20 63 6f 6e  rsor!=iCur ) con
22180 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
22190 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
221a0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
221b0 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78   pE = pTerm->pEx
221c0 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
221d0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
221e0 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  (pE, EP_FromJoin
221f0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
22200 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
22210 69 67 68 74 20 26 20 70 4c 65 76 65 6c 2d 3e 6e  ight & pLevel->n
22220 6f 74 52 65 61 64 79 29 21 3d 30 20 29 3b 0a 20  otReady)!=0 );. 
22230 20 20 20 70 41 6c 74 20 3d 20 66 69 6e 64 54 65     pAlt = findTe
22240 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70 54  rm(pWC, iCur, pT
22250 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
22260 6e 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  n, notReady, WO_
22270 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20  EQ|WO_IN, 0);.  
22280 20 20 69 66 28 20 70 41 6c 74 3d 3d 30 20 29 20    if( pAlt==0 ) 
22290 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
222a0 28 20 70 41 6c 74 2d 3e 77 74 46 6c 61 67 73 20  ( pAlt->wtFlags 
222b0 26 20 28 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  & (TERM_CODED) )
222c0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 74   continue;.    t
222d0 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e 65  estcase( pAlt->e
222e0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
222f0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
22300 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f  ( pAlt->eOperato
22310 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  r & WO_IN );.   
22320 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65   VdbeModuleComme
22330 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 74 72  nt((v, "begin tr
22340 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61  ansitive constra
22350 69 6e 74 22 29 29 3b 0a 20 20 20 20 70 45 41 6c  int"));.    pEAl
22360 74 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b  t = sqlite3Stack
22370 41 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  AllocRaw(db, siz
22380 65 6f 66 28 2a 70 45 41 6c 74 29 29 3b 0a 20 20  eof(*pEAlt));.  
22390 20 20 69 66 28 20 70 45 41 6c 74 20 29 7b 0a 20    if( pEAlt ){. 
223a0 20 20 20 20 20 2a 70 45 41 6c 74 20 3d 20 2a 70       *pEAlt = *p
223b0 41 6c 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  Alt->pExpr;.    
223c0 20 20 70 45 41 6c 74 2d 3e 70 4c 65 66 74 20 3d    pEAlt->pLeft =
223d0 20 70 45 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20   pE->pLeft;.    
223e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
223f0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 41  alse(pParse, pEA
22400 6c 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51  lt, addrCont, SQ
22410 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
22420 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
22430 74 61 63 6b 46 72 65 65 28 64 62 2c 20 70 45 41  tackFree(db, pEA
22440 6c 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  lt);.    }.  }..
22450 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54 20    /* For a LEFT 
22460 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65  OUTER JOIN, gene
22470 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
22480 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20 66  ill record the f
22490 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20 61 74  act that.  ** at
224a0 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f   least one row o
224b0 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  f the right tabl
224c0 65 20 68 61 73 20 6d 61 74 63 68 65 64 20 74 68  e has matched th
224d0 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20 20 0a  e left table.  .
224e0 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65    */.  if( pLeve
224f0 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a  l->iLeftJoin ){.
22500 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72      pLevel->addr
22510 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56  First = sqlite3V
22520 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
22530 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
22540 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
22550 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65 76 65  nteger, 1, pLeve
22560 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20  l->iLeftJoin);. 
22570 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
22580 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46 54 20  v, "record LEFT 
22590 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20 20  JOIN hit"));.   
225a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
225b0 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
225c0 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57      for(pTerm=pW
225d0 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57 43  C->a, j=0; j<pWC
225e0 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54  ->nTerm; j++, pT
225f0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 74 65  erm++){.      te
22600 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
22610 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
22620 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 74  RTUAL );.      t
22630 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
22640 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
22650 4f 44 45 44 20 29 3b 0a 20 20 20 20 20 20 69 66  ODED );.      if
22660 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
22670 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c   & (TERM_VIRTUAL
22680 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63  |TERM_CODED) ) c
22690 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
226a0 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
226b0 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d 3e 6e  qAll & pLevel->n
226c0 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20  otReady)!=0 ){. 
226d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
226e0 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
226f0 65 72 6d 73 20 29 3b 0a 20 20 20 20 20 20 20 20  erms );.        
22700 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
22710 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
22720 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a  pTerm->pExpr );.
22730 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
22740 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
22750 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61   pTerm->pExpr, a
22760 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f  ddrCont, SQLITE_
22770 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
22780 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
22790 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
227a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
227b0 74 75 72 6e 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74  turn pLevel->not
227c0 52 65 61 64 79 3b 0a 7d 0a 0a 23 69 66 20 64 65  Ready;.}..#if de
227d0 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45  fined(WHERETRACE
227e0 5f 45 4e 41 42 4c 45 44 29 20 26 26 20 64 65 66  _ENABLED) && def
227f0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
22800 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29  LE_TREE_EXPLAIN)
22810 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
22820 22 45 78 70 6c 61 6e 61 74 69 6f 6e 22 20 74 65  "Explanation" te
22830 78 74 20 66 6f 72 20 61 20 57 68 65 72 65 54 65  xt for a WhereTe
22840 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rm..*/.static vo
22850 69 64 20 77 68 65 72 65 45 78 70 6c 61 69 6e 54  id whereExplainT
22860 65 72 6d 28 56 64 62 65 20 2a 76 2c 20 57 68 65  erm(Vdbe *v, Whe
22870 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a  reTerm *pTerm){.
22880 20 20 63 68 61 72 20 7a 54 79 70 65 5b 34 5d 3b    char zType[4];
22890 0a 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c  .  memcpy(zType,
228a0 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20 69 66   "...", 4);.  if
228b0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
228c0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
228d0 29 20 7a 54 79 70 65 5b 30 5d 20 3d 20 27 56 27  ) zType[0] = 'V'
228e0 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65  ;.  if( pTerm->e
228f0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
22900 55 49 56 20 20 29 20 7a 54 79 70 65 5b 31 5d 20  UIV  ) zType[1] 
22910 3d 20 27 45 27 3b 0a 20 20 69 66 28 20 45 78 70  = 'E';.  if( Exp
22920 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
22930 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72  rm->pExpr, EP_Fr
22940 6f 6d 4a 6f 69 6e 29 20 29 20 7a 54 79 70 65 5b  omJoin) ) zType[
22950 32 5d 20 3d 20 27 4c 27 3b 0a 20 20 73 71 6c 69  2] = 'L';.  sqli
22960 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
22970 28 76 2c 20 22 25 73 20 22 2c 20 7a 54 79 70 65  (v, "%s ", zType
22980 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c  );.  sqlite3Expl
22990 61 69 6e 45 78 70 72 28 76 2c 20 70 54 65 72 6d  ainExpr(v, pTerm
229a0 2d 3e 70 45 78 70 72 29 3b 0a 7d 0a 23 65 6e 64  ->pExpr);.}.#end
229b0 69 66 20 2f 2a 20 57 48 45 52 45 54 52 41 43 45  if /* WHERETRACE
229c0 5f 45 4e 41 42 4c 45 44 20 26 26 20 53 51 4c 49  _ENABLED && SQLI
229d0 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45  TE_ENABLE_TREE_E
229e0 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 23 69 66 64  XPLAIN */...#ifd
229f0 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
22a00 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  ABLED./*.** Prin
22a10 74 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  t a WhereLoop ob
22a20 6a 65 63 74 20 66 6f 72 20 64 65 62 75 67 67 69  ject for debuggi
22a30 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73  ng purposes.*/.s
22a40 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
22a50 4c 6f 6f 70 50 72 69 6e 74 28 57 68 65 72 65 4c  LoopPrint(WhereL
22a60 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65 43 6c 61  oop *p, WhereCla
22a70 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 57 68 65  use *pWC){.  Whe
22a80 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
22a90 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20   pWC->pWInfo;.  
22aa0 69 6e 74 20 6e 62 20 3d 20 31 2b 28 70 57 49 6e  int nb = 1+(pWIn
22ab0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53  fo->pTabList->nS
22ac0 72 63 2b 37 29 2f 38 3b 0a 20 20 73 74 72 75 63  rc+7)/8;.  struc
22ad0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
22ae0 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e  pItem = pWInfo->
22af0 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 2d  pTabList->a + p-
22b00 3e 69 54 61 62 3b 0a 20 20 54 61 62 6c 65 20 2a  >iTab;.  Table *
22b10 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54  pTab = pItem->pT
22b20 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  ab;.  sqlite3Deb
22b30 75 67 50 72 69 6e 74 66 28 22 25 63 25 32 64 2e  ugPrintf("%c%2d.
22b40 25 30 2a 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20  %0*llx.%0*llx", 
22b50 70 2d 3e 63 49 64 2c 0a 20 20 20 20 20 20 20 20  p->cId,.        
22b60 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
22b70 69 54 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73  iTab, nb, p->mas
22b80 6b 53 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72  kSelf, nb, p->pr
22b90 65 72 65 71 29 3b 0a 20 20 73 71 6c 69 74 65 33  ereq);.  sqlite3
22ba0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 31  DebugPrintf(" %1
22bb0 32 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  2s",.           
22bc0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
22bd0 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d  >zAlias ? pItem-
22be0 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e  >zAlias : pTab->
22bf0 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 28 70  zName);.  if( (p
22c00 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
22c10 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
22c20 3d 30 20 29 7b 0a 20 20 20 20 20 63 6f 6e 73 74  =0 ){.     const
22c30 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
22c40 20 20 20 69 66 28 20 70 2d 3e 75 2e 62 74 72 65     if( p->u.btre
22c50 65 2e 70 49 6e 64 65 78 20 26 26 20 28 7a 4e 61  e.pIndex && (zNa
22c60 6d 65 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e  me = p->u.btree.
22c70 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d  pIndex->zName)!=
22c80 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  0 ){.      if( s
22c90 74 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73  trncmp(zName, "s
22ca0 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f  qlite_autoindex_
22cb0 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 17)==0 ){.   
22cc0 20 20 20 20 20 69 6e 74 20 69 20 3d 20 73 71 6c       int i = sql
22cd0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
22ce0 6d 65 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  me) - 1;.       
22cf0 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d   while( zName[i]
22d00 21 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20  !='_' ) i--;.   
22d10 20 20 20 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b       zName += i;
22d20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
22d30 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
22d40 66 28 22 2e 25 2d 31 36 73 20 25 32 64 22 2c 20  f(".%-16s %2d", 
22d50 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65  zName, p->u.btre
22d60 65 2e 6e 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73  e.nEq);.    }els
22d70 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
22d80 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 32 30  DebugPrintf("%20
22d90 73 22 2c 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20  s","");.    }.  
22da0 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
22db0 2a 7a 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75  *z;.    if( p->u
22dc0 2e 76 74 61 62 2e 69 64 78 53 74 72 20 29 7b 0a  .vtab.idxStr ){.
22dd0 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
22de0 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 5c  3_mprintf("(%d,\
22df0 22 25 73 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20  "%s\",%x)",.    
22e00 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75              p->u
22e10 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d  .vtab.idxNum, p-
22e20 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 20  >u.vtab.idxStr, 
22e30 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  p->u.vtab.omitMa
22e40 73 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  sk);.    }else{.
22e50 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
22e60 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 25  3_mprintf("(%d,%
22e70 78 29 22 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69  x)", p->u.vtab.i
22e80 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62  dxNum, p->u.vtab
22e90 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20  .omitMask);.    
22ea0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  }.    sqlite3Deb
22eb0 75 67 50 72 69 6e 74 66 28 22 20 25 2d 31 39 73  ugPrintf(" %-19s
22ec0 22 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74  ", z);.    sqlit
22ed0 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a  e3_free(z);.  }.
22ee0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
22ef0 69 6e 74 66 28 22 20 66 20 25 30 35 78 20 4e 20  intf(" f %05x N 
22f00 25 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c  %d", p->wsFlags,
22f10 20 70 2d 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 73   p->nLTerm);.  s
22f20 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
22f30 66 28 22 20 63 6f 73 74 20 25 64 2c 25 64 2c 25  f(" cost %d,%d,%
22f40 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74 75 70 2c  d\n", p->rSetup,
22f50 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75   p->rRun, p->nOu
22f60 74 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  t);.#ifdef SQLIT
22f70 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58  E_ENABLE_TREE_EX
22f80 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68  PLAIN.  /* If th
22f90 65 20 30 78 31 30 30 20 62 69 74 20 6f 66 20 77  e 0x100 bit of w
22fa0 68 65 72 65 74 72 61 63 69 6e 67 20 69 73 20 73  heretracing is s
22fb0 65 74 2c 20 74 68 65 6e 20 73 68 6f 77 20 61 6c  et, then show al
22fc0 6c 20 6f 66 20 74 68 65 20 63 6f 6e 73 74 72 61  l of the constra
22fd0 69 6e 74 0a 20 20 2a 2a 20 65 78 70 72 65 73 73  int.  ** express
22fe0 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 68 65 72  ions in the Wher
22ff0 65 4c 6f 6f 70 2e 61 4c 54 65 72 6d 5b 5d 20 61  eLoop.aLTerm[] a
23000 72 72 61 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rray..  */.  if(
23010 20 70 2d 3e 6e 4c 54 65 72 6d 20 26 26 20 28 73   p->nLTerm && (s
23020 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
23030 20 26 20 30 78 31 30 30 29 21 3d 30 20 29 7b 20   & 0x100)!=0 ){ 
23040 20 2f 2a 20 57 48 45 52 45 54 52 41 43 45 20 30   /* WHERETRACE 0
23050 78 31 30 30 20 2a 2f 0a 20 20 20 20 69 6e 74 20  x100 */.    int 
23060 69 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  i;.    Vdbe *v =
23070 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
23080 3e 70 56 64 62 65 3b 0a 20 20 20 20 73 71 6c 69  >pVdbe;.    sqli
23090 74 65 33 45 78 70 6c 61 69 6e 42 65 67 69 6e 28  te3ExplainBegin(
230a0 76 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  v);.    for(i=0;
230b0 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d 3b 20 69 2b   i<p->nLTerm; i+
230c0 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54  +){.      WhereT
230d0 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 70 2d 3e  erm *pTerm = p->
230e0 61 4c 54 65 72 6d 5b 69 5d 3b 0a 20 20 20 20 20  aLTerm[i];.     
230f0 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20   if( pTerm==0 ) 
23100 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
23110 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
23120 69 6e 74 66 28 76 2c 20 22 20 20 28 25 64 29 20  intf(v, "  (%d) 
23130 23 25 2d 32 64 20 22 2c 20 69 2b 31 2c 20 28 69  #%-2d ", i+1, (i
23140 6e 74 29 28 70 54 65 72 6d 2d 70 57 43 2d 3e 61  nt)(pTerm-pWC->a
23150 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
23160 33 45 78 70 6c 61 69 6e 50 75 73 68 28 76 29 3b  3ExplainPush(v);
23170 0a 20 20 20 20 20 20 77 68 65 72 65 45 78 70 6c  .      whereExpl
23180 61 69 6e 54 65 72 6d 28 76 2c 20 70 54 65 72 6d  ainTerm(v, pTerm
23190 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
231a0 45 78 70 6c 61 69 6e 50 6f 70 28 76 29 3b 0a 20  ExplainPop(v);. 
231b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
231c0 61 69 6e 4e 4c 28 76 29 3b 0a 20 20 20 20 7d 0a  ainNL(v);.    }.
231d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
231e0 69 6e 46 69 6e 69 73 68 28 76 29 3b 0a 20 20 20  inFinish(v);.   
231f0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
23200 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65  ntf("%s", sqlite
23210 33 56 64 62 65 45 78 70 6c 61 6e 61 74 69 6f 6e  3VdbeExplanation
23220 28 76 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (v));.  }.#endif
23230 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
23240 20 43 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65   Convert bulk me
23250 6d 6f 72 79 20 69 6e 74 6f 20 61 20 76 61 6c 69  mory into a vali
23260 64 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74  d WhereLoop that
23270 20 63 61 6e 20 62 65 20 70 61 73 73 65 64 0a 2a   can be passed.*
23280 2a 20 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c  * to whereLoopCl
23290 65 61 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a  ear harmlessly..
232a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
232b0 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65  hereLoopInit(Whe
232c0 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d  reLoop *p){.  p-
232d0 3e 61 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54  >aLTerm = p->aLT
232e0 65 72 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e  ermSpace;.  p->n
232f0 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e  LTerm = 0;.  p->
23300 6e 4c 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69  nLSlot = ArraySi
23310 7a 65 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  ze(p->aLTermSpac
23320 65 29 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73  e);.  p->wsFlags
23330 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 0;.}../*.** C
23340 6c 65 61 72 20 74 68 65 20 57 68 65 72 65 4c 6f  lear the WhereLo
23350 6f 70 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61  op.u union.  Lea
23360 76 65 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54  ve WhereLoop.pLT
23370 65 72 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73  erm intact..*/.s
23380 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
23390 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73  LoopClearUnion(s
233a0 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
233b0 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28  eLoop *p){.  if(
233c0 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57   p->wsFlags & (W
233d0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
233e0 45 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  E|WHERE_AUTO_IND
233f0 45 58 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28  EX) ){.    if( (
23400 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
23410 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
23420 21 3d 30 20 26 26 20 70 2d 3e 75 2e 76 74 61 62  !=0 && p->u.vtab
23430 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20  .needFree ){.   
23440 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
23450 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
23460 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74  );.      p->u.vt
23470 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
23480 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62  .      p->u.vtab
23490 2e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20  .idxStr = 0;.   
234a0 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 77   }else if( (p->w
234b0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
234c0 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26  UTO_INDEX)!=0 &&
234d0 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
234e0 65 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ex!=0 ){.      s
234f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
23500 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
23510 65 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20  ex->zColAff);.  
23520 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e      sqlite3KeyIn
23530 66 6f 55 6e 72 65 66 28 70 2d 3e 75 2e 62 74 72  foUnref(p->u.btr
23540 65 65 2e 70 49 6e 64 65 78 2d 3e 70 4b 65 79 49  ee.pIndex->pKeyI
23550 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
23560 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
23570 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29  >u.btree.pIndex)
23580 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72  ;.      p->u.btr
23590 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
235a0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
235b0 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74  * Deallocate int
235c0 65 72 6e 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65  ernal memory use
235d0 64 20 62 79 20 61 20 57 68 65 72 65 4c 6f 6f 70  d by a WhereLoop
235e0 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69   object.*/.stati
235f0 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
23600 43 6c 65 61 72 28 73 71 6c 69 74 65 33 20 2a 64  Clear(sqlite3 *d
23610 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  b, WhereLoop *p)
23620 7b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72  {.  if( p->aLTer
23630 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  m!=p->aLTermSpac
23640 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  e ) sqlite3DbFre
23650 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29  e(db, p->aLTerm)
23660 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  ;.  whereLoopCle
23670 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a  arUnion(db, p);.
23680 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
23690 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  p);.}../*.** Inc
236a0 72 65 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79  rease the memory
236b0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20   allocation for 
236c0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20  pLoop->aLTerm[] 
236d0 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 6e  to be at least n
236e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
236f0 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
23700 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
23710 72 65 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e  reLoop *p, int n
23720 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
23730 2a 70 61 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d  *paNew;.  if( p-
23740 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74  >nLSlot>=n ) ret
23750 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
23760 20 6e 20 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20   n = (n+7)&~7;. 
23770 20 70 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   paNew = sqlite3
23780 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
23790 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d  sizeof(p->aLTerm
237a0 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70  [0])*n);.  if( p
237b0 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  aNew==0 ) return
237c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
237d0 20 6d 65 6d 63 70 79 28 70 61 4e 65 77 2c 20 70   memcpy(paNew, p
237e0 2d 3e 61 4c 54 65 72 6d 2c 20 73 69 7a 65 6f 66  ->aLTerm, sizeof
237f0 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 70  (p->aLTerm[0])*p
23800 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a 20 20 69 66 28  ->nLSlot);.  if(
23810 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61   p->aLTerm!=p->a
23820 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c  LTermSpace ) sql
23830 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
23840 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 70 2d 3e  ->aLTerm);.  p->
23850 61 4c 54 65 72 6d 20 3d 20 70 61 4e 65 77 3b 0a  aLTerm = paNew;.
23860 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b    p->nLSlot = n;
23870 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
23880 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  _OK;.}../*.** Tr
23890 61 6e 73 66 65 72 20 63 6f 6e 74 65 6e 74 20 66  ansfer content f
238a0 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 70  rom the second p
238b0 4c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 66 69  Loop into the fi
238c0 72 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rst..*/.static i
238d0 6e 74 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72  nt whereLoopXfer
238e0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
238f0 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 2c 20 57 68  ereLoop *pTo, Wh
23900 65 72 65 4c 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b  ereLoop *pFrom){
23910 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  .  whereLoopClea
23920 72 55 6e 69 6f 6e 28 64 62 2c 20 70 54 6f 29 3b  rUnion(db, pTo);
23930 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70  .  if( whereLoop
23940 52 65 73 69 7a 65 28 64 62 2c 20 70 54 6f 2c 20  Resize(db, pTo, 
23950 70 46 72 6f 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29  pFrom->nLTerm) )
23960 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 54  {.    memset(&pT
23970 6f 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28  o->u, 0, sizeof(
23980 70 54 6f 2d 3e 75 29 29 3b 0a 20 20 20 20 72 65  pTo->u));.    re
23990 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
239a0 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28  M;.  }.  memcpy(
239b0 70 54 6f 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52  pTo, pFrom, WHER
239c0 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b  E_LOOP_XFER_SZ);
239d0 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61  .  memcpy(pTo->a
239e0 4c 54 65 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c  LTerm, pFrom->aL
239f0 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72  Term, pTo->nLTer
23a00 6d 2a 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c  m*sizeof(pTo->aL
23a10 54 65 72 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28  Term[0]));.  if(
23a20 20 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20   pFrom->wsFlags 
23a30 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
23a40 41 42 4c 45 20 29 7b 0a 20 20 20 20 70 46 72 6f  ABLE ){.    pFro
23a50 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  m->u.vtab.needFr
23a60 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  ee = 0;.  }else 
23a70 69 66 28 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c  if( (pFrom->wsFl
23a80 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
23a90 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20  _INDEX)!=0 ){.  
23aa0 20 20 70 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65    pFrom->u.btree
23ab0 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d  .pIndex = 0;.  }
23ac0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
23ad0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
23ae0 6c 65 74 65 20 61 20 57 68 65 72 65 4c 6f 6f 70  lete a WhereLoop
23af0 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69   object.*/.stati
23b00 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
23b10 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
23b20 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
23b30 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c  ){.  whereLoopCl
23b40 65 61 72 28 64 62 2c 20 70 29 3b 0a 20 20 73 71  ear(db, p);.  sq
23b50 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
23b60 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  p);.}../*.** Fre
23b70 65 20 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74  e a WhereInfo st
23b80 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69  ructure.*/.stati
23b90 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f  c void whereInfo
23ba0 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62  Free(sqlite3 *db
23bb0 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  , WhereInfo *pWI
23bc0 6e 66 6f 29 7b 0a 20 20 69 66 28 20 41 4c 57 41  nfo){.  if( ALWA
23bd0 59 53 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20  YS(pWInfo) ){.  
23be0 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65    whereClauseCle
23bf0 61 72 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29  ar(&pWInfo->sWC)
23c00 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 57 49  ;.    while( pWI
23c10 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a 20  nfo->pLoops ){. 
23c20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a       WhereLoop *
23c30 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  p = pWInfo->pLoo
23c40 70 73 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  ps;.      pWInfo
23c50 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e  ->pLoops = p->pN
23c60 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 77  extLoop;.      w
23c70 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64  hereLoopDelete(d
23c80 62 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  b, p);.    }.   
23c90 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
23ca0 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a  b, pWInfo);.  }.
23cb0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
23cc0 54 52 55 45 20 69 66 20 62 6f 74 68 20 6f 66 20  TRUE if both of 
23cd0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
23ce0 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
23cf0 28 31 29 20 20 58 20 68 61 73 20 74 68 65 20 73  (1)  X has the s
23d00 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73  ame or lower cos
23d10 74 20 74 68 61 74 20 59 0a 2a 2a 20 20 20 28 32  t that Y.**   (2
23d20 29 20 20 58 20 69 73 20 61 20 70 72 6f 70 65 72  )  X is a proper
23d30 20 73 75 62 73 65 74 20 6f 66 20 59 0a 2a 2a 0a   subset of Y.**.
23d40 2a 2a 20 42 79 20 22 70 72 6f 70 65 72 20 73 75  ** By "proper su
23d50 62 73 65 74 22 20 77 65 20 6d 65 61 6e 20 74 68  bset" we mean th
23d60 61 74 20 58 20 75 73 65 73 20 66 65 77 65 72 20  at X uses fewer 
23d70 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
23d80 6d 73 0a 2a 2a 20 74 68 61 6e 20 59 20 61 6e 64  ms.** than Y and
23d90 20 74 68 61 74 20 65 76 65 72 79 20 57 48 45 52   that every WHER
23da0 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 75 73  E clause term us
23db0 65 64 20 62 79 20 58 20 69 73 20 61 6c 73 6f 20  ed by X is also 
23dc0 75 73 65 64 0a 2a 2a 20 62 79 20 59 2e 0a 2a 2a  used.** by Y..**
23dd0 0a 2a 2a 20 49 66 20 58 20 69 73 20 61 20 70 72  .** If X is a pr
23de0 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 59  oper subset of Y
23df0 20 74 68 65 6e 20 59 20 69 73 20 61 20 62 65 74   then Y is a bet
23e00 74 65 72 20 63 68 6f 69 63 65 20 61 6e 64 20 6f  ter choice and o
23e10 75 67 68 74 0a 2a 2a 20 74 6f 20 68 61 76 65 20  ught.** to have 
23e20 61 20 6c 6f 77 65 72 20 63 6f 73 74 2e 20 20 54  a lower cost.  T
23e30 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
23e40 72 6e 73 20 54 52 55 45 20 77 68 65 6e 20 74 68  rns TRUE when th
23e50 61 74 20 63 6f 73 74 20 0a 2a 2a 20 72 65 6c 61  at cost .** rela
23e60 74 69 6f 6e 73 68 69 70 20 69 73 20 69 6e 76 65  tionship is inve
23e70 72 74 65 64 20 61 6e 64 20 6e 65 65 64 73 20 74  rted and needs t
23e80 6f 20 62 65 20 61 64 6a 75 73 74 65 64 2e 0a 2a  o be adjusted..*
23e90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
23ea0 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f  reLoopCheaperPro
23eb0 70 65 72 53 75 62 73 65 74 28 0a 20 20 63 6f 6e  perSubset(.  con
23ec0 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 58  st WhereLoop *pX
23ed0 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74  ,       /* First
23ee0 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 63 6f   WhereLoop to co
23ef0 6d 70 61 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  mpare */.  const
23f00 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 59 20 20   WhereLoop *pY  
23f10 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65        /* Compare
23f20 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 57 68   against this Wh
23f30 65 72 65 4c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20  ereLoop */.){.  
23f40 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 66 28 20  int i, j;.  if( 
23f50 70 58 2d 3e 6e 4c 54 65 72 6d 20 3e 3d 20 70 59  pX->nLTerm >= pY
23f60 2d 3e 6e 4c 54 65 72 6d 20 29 20 72 65 74 75 72  ->nLTerm ) retur
23f70 6e 20 30 3b 20 2f 2a 20 58 20 69 73 20 6e 6f 74  n 0; /* X is not
23f80 20 61 20 73 75 62 73 65 74 20 6f 66 20 59 20 2a   a subset of Y *
23f90 2f 0a 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e  /.  if( pX->rRun
23fa0 20 3e 3d 20 70 59 2d 3e 72 52 75 6e 20 29 7b 0a   >= pY->rRun ){.
23fb0 20 20 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e      if( pX->rRun
23fc0 20 3e 20 70 59 2d 3e 72 52 75 6e 20 29 20 72 65   > pY->rRun ) re
23fd0 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20  turn 0;    /* X 
23fe0 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20  costs more than 
23ff0 59 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 58 2d  Y */.    if( pX-
24000 3e 6e 4f 75 74 20 3e 20 70 59 2d 3e 6e 4f 75 74  >nOut > pY->nOut
24010 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
24020 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72 65 20  /* X costs more 
24030 74 68 61 6e 20 59 20 2a 2f 0a 20 20 7d 0a 20 20  than Y */.  }.  
24040 66 6f 72 28 69 3d 70 58 2d 3e 6e 4c 54 65 72 6d  for(i=pX->nLTerm
24050 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
24060 20 20 20 20 66 6f 72 28 6a 3d 70 59 2d 3e 6e 4c      for(j=pY->nL
24070 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d  Term-1; j>=0; j-
24080 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 59  -){.      if( pY
24090 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 70 58 2d  ->aLTerm[j]==pX-
240a0 3e 61 4c 54 65 72 6d 5b 69 5d 20 29 20 62 72 65  >aLTerm[i] ) bre
240b0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
240c0 28 20 6a 3c 30 20 29 20 72 65 74 75 72 6e 20 30  ( j<0 ) return 0
240d0 3b 20 20 2f 2a 20 58 20 6e 6f 74 20 61 20 73 75  ;  /* X not a su
240e0 62 73 65 74 20 6f 66 20 59 20 73 69 6e 63 65 20  bset of Y since 
240f0 74 65 72 6d 20 58 5b 69 5d 20 6e 6f 74 20 75 73  term X[i] not us
24100 65 64 20 62 79 20 59 20 2a 2f 0a 20 20 7d 0a 20  ed by Y */.  }. 
24110 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41   return 1;  /* A
24120 6c 6c 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 65  ll conditions me
24130 65 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  et */.}../*.** T
24140 72 79 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65  ry to adjust the
24150 20 63 6f 73 74 20 6f 66 20 57 68 65 72 65 4c 6f   cost of WhereLo
24160 6f 70 20 70 54 65 6d 70 6c 61 74 65 20 75 70 77  op pTemplate upw
24170 61 72 64 73 20 6f 72 20 64 6f 77 6e 77 61 72 64  ards or downward
24180 73 20 73 6f 0a 2a 2a 20 74 68 61 74 3a 0a 2a 2a  s so.** that:.**
24190 0a 2a 2a 20 20 20 28 31 29 20 70 54 65 6d 70 6c  .**   (1) pTempl
241a0 61 74 65 20 63 6f 73 74 73 20 6c 65 73 73 20 74  ate costs less t
241b0 68 61 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68  han any other Wh
241c0 65 72 65 4c 6f 6f 70 73 20 74 68 61 74 20 61 72  ereLoops that ar
241d0 65 20 61 20 70 72 6f 70 65 72 0a 2a 2a 20 20 20  e a proper.**   
241e0 20 20 20 20 73 75 62 73 65 74 20 6f 66 20 70 54      subset of pT
241f0 65 6d 70 6c 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20  emplate.**.**   
24200 28 32 29 20 70 54 65 6d 70 6c 61 74 65 20 63 6f  (2) pTemplate co
24210 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e  sts more than an
24220 79 20 6f 74 68 65 72 20 57 68 65 72 65 4c 6f 6f  y other WhereLoo
24230 70 73 20 66 6f 72 20 77 68 69 63 68 20 70 54 65  ps for which pTe
24240 6d 70 6c 61 74 65 0a 2a 2a 20 20 20 20 20 20 20  mplate.**       
24250 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73  is a proper subs
24260 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 73 61 79  et..**.** To say
24270 20 22 57 68 65 72 65 4c 6f 6f 70 20 58 20 69 73   "WhereLoop X is
24280 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
24290 20 6f 66 20 59 22 20 6d 65 61 6e 73 20 74 68 61   of Y" means tha
242a0 74 20 58 20 75 73 65 73 20 66 65 77 65 72 0a 2a  t X uses fewer.*
242b0 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  * WHERE clause t
242c0 65 72 6d 73 20 74 68 61 6e 20 59 20 61 6e 64 20  erms than Y and 
242d0 74 68 61 74 20 65 76 65 72 79 20 57 48 45 52 45  that every WHERE
242e0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 75 73 65   clause term use
242f0 64 20 62 79 20 58 20 69 73 0a 2a 2a 20 61 6c 73  d by X is.** als
24300 6f 20 75 73 65 64 20 62 79 20 59 2e 0a 2a 2a 0a  o used by Y..**.
24310 2a 2a 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65  ** This adjustme
24320 6e 74 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f  nt is omitted fo
24330 72 20 53 4b 49 50 53 43 41 4e 20 6c 6f 6f 70 73  r SKIPSCAN loops
24340 2e 20 20 49 6e 20 61 20 53 4b 49 50 53 43 41 4e  .  In a SKIPSCAN
24350 20 6c 6f 6f 70 2c 20 74 68 65 0a 2a 2a 20 57 68   loop, the.** Wh
24360 65 72 65 4c 6f 6f 70 2e 6e 4c 54 65 72 6d 20 66  ereLoop.nLTerm f
24370 69 65 6c 64 20 69 73 20 6e 6f 74 20 61 6e 20 61  ield is not an a
24380 63 63 75 72 61 74 65 20 6d 65 61 73 75 72 65 20  ccurate measure 
24390 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
243a0 20 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65   WHERE.** clause
243b0 20 74 65 72 6d 73 20 63 6f 76 65 72 65 64 2c 20   terms covered, 
243c0 73 69 6e 63 65 20 73 6f 6d 65 20 6f 66 20 74 68  since some of th
243d0 65 20 66 69 72 73 74 20 6e 4c 54 65 72 6d 20 65  e first nLTerm e
243e0 6e 74 72 69 65 73 20 69 6e 20 61 4c 54 65 72 6d  ntries in aLTerm
243f0 5b 5d 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 4e 55  [].** will be NU
24400 4c 4c 20 28 62 65 63 61 75 73 65 20 74 68 65 79  LL (because they
24410 20 61 72 65 20 73 6b 69 70 70 65 64 29 2e 20 20   are skipped).  
24420 54 68 61 74 20 6d 61 6b 65 73 20 69 74 20 6d 6f  That makes it mo
24430 72 65 20 64 69 66 66 69 63 75 6c 74 0a 2a 2a 20  re difficult.** 
24440 74 6f 20 63 6f 6d 70 61 72 65 20 74 68 65 20 6c  to compare the l
24450 6f 6f 70 73 2e 20 20 57 65 20 63 6f 75 6c 64 20  oops.  We could 
24460 61 64 64 20 65 78 74 72 61 20 63 6f 64 65 20 74  add extra code t
24470 6f 20 64 6f 20 74 68 65 20 63 6f 6d 70 61 72 69  o do the compari
24480 73 6f 6e 2c 20 61 6e 64 0a 2a 2a 20 70 65 72 68  son, and.** perh
24490 61 70 73 20 77 65 20 77 69 6c 6c 20 73 6f 6d 65  aps we will some
244a0 64 61 79 2e 20 20 42 75 74 20 53 4b 49 50 53 43  day.  But SKIPSC
244b0 41 4e 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  AN is sufficient
244c0 6c 79 20 75 6e 63 6f 6d 6d 6f 6e 2c 20 61 6e 64  ly uncommon, and
244d0 20 74 68 69 73 0a 2a 2a 20 61 64 6a 75 73 74 6d   this.** adjustm
244e0 65 6e 74 20 69 73 20 73 75 66 66 69 63 69 65 6e  ent is sufficien
244f0 74 20 6d 69 6e 6f 72 2c 20 74 68 61 74 20 69 74  t minor, that it
24500 20 69 73 20 76 65 72 79 20 64 69 66 66 69 63 75   is very difficu
24510 6c 74 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 0a  lt to construct.
24520 2a 2a 20 61 20 74 65 73 74 20 63 61 73 65 20 77  ** a test case w
24530 68 65 72 65 20 74 68 65 20 65 78 74 72 61 20 63  here the extra c
24540 6f 64 65 20 77 6f 75 6c 64 20 69 6d 70 72 6f 76  ode would improv
24550 65 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e  e the query plan
24560 2e 20 20 42 65 74 74 65 72 0a 2a 2a 20 74 6f 20  .  Better.** to 
24570 61 76 6f 69 64 20 74 68 65 20 61 64 64 65 64 20  avoid the added 
24580 63 6f 6d 70 6c 65 78 69 74 79 20 61 6e 64 20 6a  complexity and j
24590 75 73 74 20 6f 6d 69 74 20 63 6f 73 74 20 61 64  ust omit cost ad
245a0 6a 75 73 74 6d 65 6e 74 73 20 74 6f 20 53 4b 49  justments to SKI
245b0 50 53 43 41 4e 0a 2a 2a 20 6c 6f 6f 70 73 2e 0a  PSCAN.** loops..
245c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
245d0 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73 74 43 6f  hereLoopAdjustCo
245e0 73 74 28 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f  st(const WhereLo
245f0 6f 70 20 2a 70 2c 20 57 68 65 72 65 4c 6f 6f 70  op *p, WhereLoop
24600 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20   *pTemplate){.  
24610 69 66 28 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e  if( (pTemplate->
24620 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
24630 49 4e 44 45 58 45 44 29 3d 3d 30 20 29 20 72 65  INDEXED)==0 ) re
24640 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 70 54 65  turn;.  if( (pTe
24650 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20  mplate->wsFlags 
24660 26 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e  & WHERE_SKIPSCAN
24670 29 21 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )!=0 ) return;. 
24680 20 66 6f 72 28 3b 20 70 3b 20 70 3d 70 2d 3e 70   for(; p; p=p->p
24690 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 69  NextLoop){.    i
246a0 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d  f( p->iTab!=pTem
246b0 70 6c 61 74 65 2d 3e 69 54 61 62 20 29 20 63 6f  plate->iTab ) co
246c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
246d0 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
246e0 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20  ERE_INDEXED)==0 
246f0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
24700 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
24710 26 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e  & WHERE_SKIPSCAN
24720 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
24730 0a 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f  .    if( whereLo
24740 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53  opCheaperProperS
24750 75 62 73 65 74 28 70 2c 20 70 54 65 6d 70 6c 61  ubset(p, pTempla
24760 74 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  te) ){.      /* 
24770 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65  Adjust pTemplate
24780 20 63 6f 73 74 20 64 6f 77 6e 77 61 72 64 20 73   cost downward s
24790 6f 20 74 68 61 74 20 69 74 20 69 73 20 63 68 65  o that it is che
247a0 61 70 65 72 20 74 68 61 6e 20 69 74 73 20 0a 20  aper than its . 
247b0 20 20 20 20 20 2a 2a 20 73 75 62 73 65 74 20 70       ** subset p
247c0 20 2a 2f 0a 20 20 20 20 20 20 70 54 65 6d 70 6c   */.      pTempl
247d0 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72  ate->rRun = p->r
247e0 52 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70  Run;.      pTemp
247f0 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e  late->nOut = p->
24800 6e 4f 75 74 20 2d 20 31 3b 0a 20 20 20 20 7d 65  nOut - 1;.    }e
24810 6c 73 65 20 69 66 28 20 77 68 65 72 65 4c 6f 6f  lse if( whereLoo
24820 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75  pCheaperProperSu
24830 62 73 65 74 28 70 54 65 6d 70 6c 61 74 65 2c 20  bset(pTemplate, 
24840 70 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  p) ){.      /* A
24850 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20  djust pTemplate 
24860 63 6f 73 74 20 75 70 77 61 72 64 20 73 6f 20 74  cost upward so t
24870 68 61 74 20 69 74 20 69 73 20 63 6f 73 74 6c 69  hat it is costli
24880 65 72 20 74 68 61 6e 20 70 20 73 69 6e 63 65 0a  er than p since.
24890 20 20 20 20 20 20 2a 2a 20 70 54 65 6d 70 6c 61        ** pTempla
248a0 74 65 20 69 73 20 61 20 70 72 6f 70 65 72 20 73  te is a proper s
248b0 75 62 73 65 74 20 6f 66 20 70 20 2a 2f 0a 20 20  ubset of p */.  
248c0 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72      pTemplate->r
248d0 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20  Run = p->rRun;. 
248e0 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
248f0 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2b  nOut = p->nOut +
24900 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   1;.    }.  }.}.
24910 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68  ./*.** Search th
24920 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c  e list of WhereL
24930 6f 6f 70 73 20 69 6e 20 2a 70 70 50 72 65 76 20  oops in *ppPrev 
24940 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 6e 65 20  looking for one 
24950 74 68 61 74 20 63 61 6e 20 62 65 0a 2a 2a 20 73  that can be.** s
24960 75 70 70 6c 61 6e 74 65 64 20 62 79 20 70 54 65  upplanted by pTe
24970 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  mplate..**.** Re
24980 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65  turn NULL if the
24990 20 57 68 65 72 65 4c 6f 6f 70 20 6c 69 73 74 20   WhereLoop list 
249a0 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65 6e 74 72  contains an entr
249b0 79 20 74 68 61 74 20 63 61 6e 20 73 75 70 70 6c  y that can suppl
249c0 61 6e 74 0a 2a 2a 20 70 54 65 6d 70 6c 61 74 65  ant.** pTemplate
249d0 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  , in other words
249e0 20 69 66 20 70 54 65 6d 70 6c 61 74 65 20 64 6f   if pTemplate do
249f0 65 73 20 6e 6f 74 20 62 65 6c 6f 6e 67 20 6f 6e  es not belong on
24a00 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a   the list..**.**
24a10 20 49 66 20 70 58 20 69 73 20 61 20 57 68 65 72   If pX is a Wher
24a20 65 4c 6f 6f 70 20 74 68 61 74 20 70 54 65 6d 70  eLoop that pTemp
24a30 6c 61 74 65 20 63 61 6e 20 73 75 70 70 6c 61 6e  late can supplan
24a40 74 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  t, then return t
24a50 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74 68 61 74 20  he.** link that 
24a60 70 6f 69 6e 74 73 20 74 6f 20 70 58 2e 0a 2a 2a  points to pX..**
24a70 0a 2a 2a 20 49 66 20 70 54 65 6d 70 6c 61 74 65  .** If pTemplate
24a80 20 63 61 6e 6e 6f 74 20 73 75 70 70 6c 61 6e 74   cannot supplant
24a90 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6c   any existing el
24aa0 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 73  ement of the lis
24ab0 74 20 62 75 74 20 6e 65 65 64 73 0a 2a 2a 20 74  t but needs.** t
24ac0 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  o be added to th
24ad0 65 20 6c 69 73 74 2c 20 74 68 65 6e 20 72 65 74  e list, then ret
24ae0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
24af0 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65   the tail of the
24b00 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
24b10 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 77 68 65   WhereLoop **whe
24b20 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72  reLoopFindLesser
24b30 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  (.  WhereLoop **
24b40 70 70 50 72 65 76 2c 0a 20 20 63 6f 6e 73 74 20  ppPrev,.  const 
24b50 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70  WhereLoop *pTemp
24b60 6c 61 74 65 0a 29 7b 0a 20 20 57 68 65 72 65 4c  late.){.  WhereL
24b70 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  oop *p;.  for(p=
24b80 28 2a 70 70 50 72 65 76 29 3b 20 70 3b 20 70 70  (*ppPrev); p; pp
24b90 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f  Prev=&p->pNextLo
24ba0 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76 29 7b 0a  op, p=*ppPrev){.
24bb0 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21      if( p->iTab!
24bc0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62  =pTemplate->iTab
24bd0 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49 64 78 21   || p->iSortIdx!
24be0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 53 6f 72  =pTemplate->iSor
24bf0 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a  tIdx ){.      /*
24c00 20 49 66 20 65 69 74 68 65 72 20 74 68 65 20 69   If either the i
24c10 54 61 62 20 6f 72 20 69 53 6f 72 74 49 64 78 20  Tab or iSortIdx 
24c20 76 61 6c 75 65 73 20 66 6f 72 20 74 77 6f 20 57  values for two W
24c30 68 65 72 65 4c 6f 6f 70 20 61 72 65 20 64 69 66  hereLoop are dif
24c40 66 65 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  ferent.      ** 
24c50 74 68 65 6e 20 74 68 6f 73 65 20 57 68 65 72 65  then those Where
24c60 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f 20 62 65  Loops need to be
24c70 20 63 6f 6e 73 69 64 65 72 65 64 20 73 65 70 61   considered sepa
24c80 72 61 74 65 6c 79 2e 20 20 4e 65 69 74 68 65 72  rately.  Neither
24c90 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 63   is.      ** a c
24ca0 61 6e 64 69 64 61 74 65 20 74 6f 20 72 65 70 6c  andidate to repl
24cb0 61 63 65 20 74 68 65 20 6f 74 68 65 72 2e 20 2a  ace the other. *
24cc0 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  /.      continue
24cd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49  ;.    }.    /* I
24ce0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d  n the current im
24cf0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68  plementation, th
24d00 65 20 72 53 65 74 75 70 20 76 61 6c 75 65 20 69  e rSetup value i
24d10 73 20 65 69 74 68 65 72 20 7a 65 72 6f 0a 20 20  s either zero.  
24d20 20 20 2a 2a 20 6f 72 20 74 68 65 20 63 6f 73 74    ** or the cost
24d30 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 61 6e 20   of building an 
24d40 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
24d50 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74 68 65 20  (NlogN) and the 
24d60 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20 69 73 20  NlogN.    ** is 
24d70 74 68 65 20 73 61 6d 65 20 66 6f 72 20 63 6f 6d  the same for com
24d80 70 61 74 69 62 6c 65 20 57 68 65 72 65 4c 6f 6f  patible WhereLoo
24d90 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ps. */.    asser
24da0 74 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d 30 20  t( p->rSetup==0 
24db0 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  || pTemplate->rS
24dc0 65 74 75 70 3d 3d 30 20 0a 20 20 20 20 20 20 20  etup==0 .       
24dd0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
24de0 72 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74  rSetup==pTemplat
24df0 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20  e->rSetup );..  
24e00 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f 70 41 64    /* whereLoopAd
24e10 64 42 74 72 65 65 28 29 20 61 6c 77 61 79 73 20  dBtree() always 
24e20 67 65 6e 65 72 61 74 65 73 20 61 6e 64 20 69 6e  generates and in
24e30 73 65 72 74 73 20 74 68 65 20 61 75 74 6f 6d 61  serts the automa
24e40 74 69 63 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a  tic index.    **
24e50 20 63 61 73 65 20 66 69 72 73 74 2e 20 20 48 65   case first.  He
24e60 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 63  nce compatible c
24e70 61 6e 64 69 64 61 74 65 20 57 68 65 72 65 4c 6f  andidate WhereLo
24e80 6f 70 73 20 6e 65 76 65 72 20 68 61 76 65 20 61  ops never have a
24e90 20 6c 61 72 67 65 72 0a 20 20 20 20 2a 2a 20 72   larger.    ** r
24ea0 53 65 74 75 70 2e 20 43 61 6c 6c 20 74 68 69 73  Setup. Call this
24eb0 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54   SETUP-INVARIANT
24ec0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
24ed0 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70  p->rSetup>=pTemp
24ee0 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a  late->rSetup );.
24ef0 0a 20 20 20 20 2f 2a 20 41 6e 79 20 6c 6f 6f 70  .    /* Any loop
24f00 20 75 73 69 6e 67 20 61 6e 20 61 70 70 6c 69 61   using an applia
24f10 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 69 6e 64  tion-defined ind
24f20 65 78 20 28 6f 72 20 50 52 49 4d 41 52 59 20 4b  ex (or PRIMARY K
24f30 45 59 20 6f 72 0a 20 20 20 20 2a 2a 20 55 4e 49  EY or.    ** UNI
24f40 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 29 20  QUE constraint) 
24f50 77 69 74 68 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  with one or more
24f60 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   == constraints 
24f70 69 73 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a  is better.    **
24f80 20 74 68 61 6e 20 61 6e 20 61 75 74 6f 6d 61 74   than an automat
24f90 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 20  ic index. */.   
24fa0 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
24fb0 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
24fc0 44 45 58 29 21 3d 30 0a 20 20 20 20 20 26 26 20  DEX)!=0.     && 
24fd0 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c  (pTemplate->wsFl
24fe0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
24ff0 58 45 44 29 21 3d 30 0a 20 20 20 20 20 26 26 20  XED)!=0.     && 
25000 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c  (pTemplate->wsFl
25010 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
25020 4d 4e 5f 45 51 29 21 3d 30 0a 20 20 20 20 20 26  MN_EQ)!=0.     &
25030 26 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  & (p->prereq & p
25040 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
25050 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72  )==pTemplate->pr
25060 65 72 65 71 0a 20 20 20 20 29 7b 0a 20 20 20 20  ereq.    ){.    
25070 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
25080 20 20 20 20 2f 2a 20 49 66 20 65 78 69 73 74 69      /* If existi
25090 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 70 20 69  ng WhereLoop p i
250a0 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 70 54  s better than pT
250b0 65 6d 70 6c 61 74 65 2c 20 70 54 65 6d 70 6c 61  emplate, pTempla
250c0 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a  te can be.    **
250d0 20 64 69 73 63 61 72 64 65 64 2e 20 20 57 68 65   discarded.  Whe
250e0 72 65 4c 6f 6f 70 20 70 20 69 73 20 62 65 74 74  reLoop p is bett
250f0 65 72 20 69 66 3a 0a 20 20 20 20 2a 2a 20 20 20  er if:.    **   
25100 28 31 29 20 20 70 20 68 61 73 20 6e 6f 20 6d 6f  (1)  p has no mo
25110 72 65 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  re dependencies 
25120 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20  than pTemplate, 
25130 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28 32 29  and.    **   (2)
25140 20 20 70 20 68 61 73 20 61 6e 20 65 71 75 61 6c    p has an equal
25150 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74   or lower cost t
25160 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 0a 20 20  han pTemplate.  
25170 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d    */.    if( (p-
25180 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c  >prereq & pTempl
25190 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 2d  ate->prereq)==p-
251a0 3e 70 72 65 72 65 71 20 20 20 20 2f 2a 20 28 31  >prereq    /* (1
251b0 29 20 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d  )  */.     && p-
251c0 3e 72 53 65 74 75 70 3c 3d 70 54 65 6d 70 6c 61  >rSetup<=pTempla
251d0 74 65 2d 3e 72 53 65 74 75 70 20 20 20 20 20 20  te->rSetup      
251e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
251f0 32 61 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70  2a) */.     && p
25200 2d 3e 72 52 75 6e 3c 3d 70 54 65 6d 70 6c 61 74  ->rRun<=pTemplat
25210 65 2d 3e 72 52 75 6e 20 20 20 20 20 20 20 20 20  e->rRun         
25220 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25230 28 32 62 29 20 2a 2f 0a 20 20 20 20 20 26 26 20  (2b) */.     && 
25240 70 2d 3e 6e 4f 75 74 3c 3d 70 54 65 6d 70 6c 61  p->nOut<=pTempla
25250 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20 20  te->nOut        
25260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25270 20 28 32 63 29 20 2a 2f 0a 20 20 20 20 29 7b 0a   (2c) */.    ){.
25280 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
25290 20 2f 2a 20 44 69 73 63 61 72 64 20 70 54 65 6d   /* Discard pTem
252a0 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 0a  plate */.    }..
252b0 20 20 20 20 2f 2a 20 49 66 20 70 54 65 6d 70 6c      /* If pTempl
252c0 61 74 65 20 69 73 20 61 6c 77 61 79 73 20 62 65  ate is always be
252d0 74 74 65 72 20 74 68 61 6e 20 70 2c 20 74 68 65  tter than p, the
252e0 6e 20 63 61 75 73 65 20 70 20 74 6f 20 62 65 20  n cause p to be 
252f0 6f 76 65 72 77 72 69 74 74 65 6e 0a 20 20 20 20  overwritten.    
25300 2a 2a 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74  ** with pTemplat
25310 65 2e 20 20 70 54 65 6d 70 6c 61 74 65 20 69 73  e.  pTemplate is
25320 20 62 65 74 74 65 72 20 74 68 61 6e 20 70 20 69   better than p i
25330 66 3a 0a 20 20 20 20 2a 2a 20 20 20 28 31 29 20  f:.    **   (1) 
25340 20 70 54 65 6d 70 6c 61 74 65 20 68 61 73 20 6e   pTemplate has n
25350 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64 65 6e 63  o more dependenc
25360 65 73 20 74 68 61 6e 20 70 2c 20 61 6e 64 0a 20  es than p, and. 
25370 20 20 20 2a 2a 20 20 20 28 32 29 20 20 70 54 65     **   (2)  pTe
25380 6d 70 6c 61 74 65 20 68 61 73 20 61 6e 20 65 71  mplate has an eq
25390 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73  ual or lower cos
253a0 74 20 74 68 61 6e 20 70 2e 0a 20 20 20 20 2a 2f  t than p..    */
253b0 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65  .    if( (p->pre
253c0 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d  req & pTemplate-
253d0 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c  >prereq)==pTempl
253e0 61 74 65 2d 3e 70 72 65 72 65 71 20 20 20 2f 2a  ate->prereq   /*
253f0 20 28 31 29 20 20 2a 2f 0a 20 20 20 20 20 26 26   (1)  */.     &&
25400 20 70 2d 3e 72 52 75 6e 3e 3d 70 54 65 6d 70 6c   p->rRun>=pTempl
25410 61 74 65 2d 3e 72 52 75 6e 20 20 20 20 20 20 20  ate->rRun       
25420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25430 20 20 20 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f        /* (2a) */
25440 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74  .     && p->nOut
25450 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75  >=pTemplate->nOu
25460 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
25470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25480 20 28 32 62 29 20 2a 2f 0a 20 20 20 20 29 7b 0a   (2b) */.    ){.
25490 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
254a0 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61  >rSetup>=pTempla
254b0 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 20 2f 2a  te->rSetup ); /*
254c0 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54   SETUP-INVARIANT
254d0 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20 20 20 20   above */.      
254e0 62 72 65 61 6b 3b 20 20 20 2f 2a 20 43 61 75 73  break;   /* Caus
254f0 65 20 70 20 74 6f 20 62 65 20 6f 76 65 72 77 72  e p to be overwr
25500 69 74 74 65 6e 20 62 79 20 70 54 65 6d 70 6c 61  itten by pTempla
25510 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  te */.    }.  }.
25520 20 20 72 65 74 75 72 6e 20 70 70 50 72 65 76 3b    return ppPrev;
25530 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
25540 20 6f 72 20 72 65 70 6c 61 63 65 20 61 20 57 68   or replace a Wh
25550 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20 75 73  ereLoop entry us
25560 69 6e 67 20 74 68 65 20 74 65 6d 70 6c 61 74 65  ing the template
25570 20 73 75 70 70 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a   supplied..**.**
25580 20 41 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65   An existing Whe
25590 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20 6d 69 67  reLoop entry mig
255a0 68 74 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ht be overwritte
255b0 6e 20 69 66 20 74 68 65 20 6e 65 77 20 74 65 6d  n if the new tem
255c0 70 6c 61 74 65 0a 2a 2a 20 69 73 20 62 65 74 74  plate.** is bett
255d0 65 72 20 61 6e 64 20 68 61 73 20 66 65 77 65 72  er and has fewer
255e0 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20 20   dependencies.  
255f0 4f 72 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20  Or the template 
25600 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 0a  will be ignored.
25610 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e 73 65 72 74  ** and no insert
25620 20 77 69 6c 6c 20 6f 63 63 75 72 20 69 66 20 61   will occur if a
25630 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65  n existing Where
25640 4c 6f 6f 70 20 69 73 20 66 61 73 74 65 72 20 61  Loop is faster a
25650 6e 64 20 68 61 73 0a 2a 2a 20 66 65 77 65 72 20  nd has.** fewer 
25660 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61  dependencies tha
25670 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e 20  n the template. 
25680 20 4f 74 68 65 72 77 69 73 65 20 61 20 6e 65 77   Otherwise a new
25690 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 2a 2a   WhereLoop is.**
256a0 20 61 64 64 65 64 20 62 61 73 65 64 20 6f 6e 20   added based on 
256b0 74 68 65 20 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a  the template..**
256c0 0a 2a 2a 20 49 66 20 70 42 75 69 6c 64 65 72 2d  .** If pBuilder-
256d0 3e 70 4f 72 53 65 74 20 69 73 20 6e 6f 74 20 4e  >pOrSet is not N
256e0 55 4c 4c 20 74 68 65 6e 20 77 65 20 63 61 72 65  ULL then we care
256f0 20 61 62 6f 75 74 20 6f 6e 6c 79 20 74 68 65 0a   about only the.
25700 2a 2a 20 70 72 65 72 65 71 75 69 73 69 74 65 73  ** prerequisites
25710 20 61 6e 64 20 72 52 75 6e 20 61 6e 64 20 6e 4f   and rRun and nO
25720 75 74 20 63 6f 73 74 73 20 6f 66 20 74 68 65 20  ut costs of the 
25730 4e 20 62 65 73 74 20 6c 6f 6f 70 73 2e 20 20 54  N best loops.  T
25740 68 61 74 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  hat.** informati
25750 6f 6e 20 69 73 20 67 61 74 68 65 72 65 64 20 69  on is gathered i
25760 6e 20 74 68 65 20 70 42 75 69 6c 64 65 72 2d 3e  n the pBuilder->
25770 70 4f 72 53 65 74 20 6f 62 6a 65 63 74 2e 20 20  pOrSet object.  
25780 54 68 69 73 20 73 70 65 63 69 61 6c 0a 2a 2a 20  This special.** 
25790 70 72 6f 63 65 73 73 69 6e 67 20 6d 6f 64 65 20  processing mode 
257a0 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 66 6f 72  is used only for
257b0 20 4f 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65   OR clause proce
257c0 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ssing..**.** Whe
257d0 6e 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 6d  n accumulating m
257e0 75 6c 74 69 70 6c 65 20 6c 6f 6f 70 73 20 28 77  ultiple loops (w
257f0 68 65 6e 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  hen pBuilder->pO
25800 72 53 65 74 20 69 73 20 4e 55 4c 4c 29 20 77 65  rSet is NULL) we
25810 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69 67 68 74 20  .** still might 
25820 6f 76 65 72 77 72 69 74 65 20 73 69 6d 69 6c 61  overwrite simila
25830 72 20 6c 6f 6f 70 73 20 77 69 74 68 20 74 68 65  r loops with the
25840 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69 66   new template if
25850 20 74 68 65 0a 2a 2a 20 6e 65 77 20 74 65 6d 70   the.** new temp
25860 6c 61 74 65 20 69 73 20 62 65 74 74 65 72 2e 20  late is better. 
25870 20 4c 6f 6f 70 73 20 6d 61 79 20 62 65 20 6f 76   Loops may be ov
25880 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68 65  erwritten if the
25890 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 63   following .** c
258a0 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65 20 6d 65  onditions are me
258b0 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  t:.**.**    (1) 
258c0 20 54 68 65 79 20 68 61 76 65 20 74 68 65 20 73   They have the s
258d0 61 6d 65 20 69 54 61 62 2e 0a 2a 2a 20 20 20 20  ame iTab..**    
258e0 28 32 29 20 20 54 68 65 79 20 68 61 76 65 20 74  (2)  They have t
258f0 68 65 20 73 61 6d 65 20 69 53 6f 72 74 49 64 78  he same iSortIdx
25900 2e 0a 2a 2a 20 20 20 20 28 33 29 20 20 54 68 65  ..**    (3)  The
25910 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20 73 61   template has sa
25920 6d 65 20 6f 72 20 66 65 77 65 72 20 64 65 70 65  me or fewer depe
25930 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68  ndencies than th
25940 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a  e current loop.*
25950 2a 20 20 20 20 28 34 29 20 20 54 68 65 20 74 65  *    (4)  The te
25960 6d 70 6c 61 74 65 20 68 61 73 20 74 68 65 20 73  mplate has the s
25970 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73  ame or lower cos
25980 74 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  t than the curre
25990 6e 74 20 6c 6f 6f 70 0a 2a 2f 0a 73 74 61 74 69  nt loop.*/.stati
259a0 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 49  c int whereLoopI
259b0 6e 73 65 72 74 28 57 68 65 72 65 4c 6f 6f 70 42  nsert(WhereLoopB
259c0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
259d0 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65  , WhereLoop *pTe
259e0 6d 70 6c 61 74 65 29 7b 0a 20 20 57 68 65 72 65  mplate){.  Where
259f0 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c 20 2a  Loop **ppPrev, *
25a00 70 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  p;.  WhereInfo *
25a10 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
25a20 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 73 71 6c  r->pWInfo;.  sql
25a30 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66  ite3 *db = pWInf
25a40 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a  o->pParse->db;..
25a50 20 20 2f 2a 20 49 66 20 70 42 75 69 6c 64 65 72    /* If pBuilder
25a60 2d 3e 70 4f 72 53 65 74 20 69 73 20 64 65 66 69  ->pOrSet is defi
25a70 6e 65 64 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 6b  ned, then only k
25a80 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65  eep track of the
25a90 20 63 6f 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20   costs.  ** and 
25aa0 70 72 65 72 65 71 73 2e 0a 20 20 2a 2f 0a 20 20  prereqs..  */.  
25ab0 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  if( pBuilder->pO
25ac0 72 53 65 74 21 3d 30 20 29 7b 0a 23 69 66 20 57  rSet!=0 ){.#if W
25ad0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
25ae0 44 0a 20 20 20 20 75 31 36 20 6e 20 3d 20 70 42  D.    u16 n = pB
25af0 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2d 3e  uilder->pOrSet->
25b00 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d 0a 23  n;.    int x =.#
25b10 65 6e 64 69 66 0a 20 20 20 20 77 68 65 72 65 4f  endif.    whereO
25b20 72 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  rInsert(pBuilder
25b30 2d 3e 70 4f 72 53 65 74 2c 20 70 54 65 6d 70 6c  ->pOrSet, pTempl
25b40 61 74 65 2d 3e 70 72 65 72 65 71 2c 20 70 54 65  ate->prereq, pTe
25b50 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 0a 20 20  mplate->rRun,.  
25b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b80 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75    pTemplate->nOu
25b90 74 29 3b 0a 23 69 66 20 57 48 45 52 45 54 52 41  t);.#if WHERETRA
25ba0 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
25bb0 38 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  8 */.    if( sql
25bc0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
25bd0 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20 73 71   0x8 ){.      sq
25be0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
25bf0 28 78 3f 22 20 20 20 6f 72 2d 25 64 3a 20 20 22  (x?"   or-%d:  "
25c00 3a 22 20 20 20 6f 72 2d 58 3a 20 20 22 2c 20 6e  :"   or-X:  ", n
25c10 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  );.      whereLo
25c20 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74  opPrint(pTemplat
25c30 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  e, pBuilder->pWC
25c40 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
25c50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
25c60 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
25c70 4c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 78 69 73  Look for an exis
25c80 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 74  ting WhereLoop t
25c90 6f 20 72 65 70 6c 61 63 65 20 77 69 74 68 20 70  o replace with p
25ca0 54 65 6d 70 6c 61 74 65 0a 20 20 2a 2f 0a 20 20  Template.  */.  
25cb0 77 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73 74 43  whereLoopAdjustC
25cc0 6f 73 74 28 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  ost(pWInfo->pLoo
25cd0 70 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a  ps, pTemplate);.
25ce0 20 20 70 70 50 72 65 76 20 3d 20 77 68 65 72 65    ppPrev = where
25cf0 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 26  LoopFindLesser(&
25d00 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20  pWInfo->pLoops, 
25d10 70 54 65 6d 70 6c 61 74 65 29 3b 0a 0a 20 20 69  pTemplate);..  i
25d20 66 28 20 70 70 50 72 65 76 3d 3d 30 20 29 7b 0a  f( ppPrev==0 ){.
25d30 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 6c 72      /* There alr
25d40 65 61 64 79 20 65 78 69 73 74 73 20 61 20 57 68  eady exists a Wh
25d50 65 72 65 4c 6f 6f 70 20 6f 6e 20 74 68 65 20 6c  ereLoop on the l
25d60 69 73 74 20 74 68 61 74 20 69 73 20 62 65 74 74  ist that is bett
25d70 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 70  er.    ** than p
25d80 54 65 6d 70 6c 61 74 65 2c 20 73 6f 20 6a 75 73  Template, so jus
25d90 74 20 69 67 6e 6f 72 65 20 70 54 65 6d 70 6c 61  t ignore pTempla
25da0 74 65 20 2a 2f 0a 23 69 66 20 57 48 45 52 45 54  te */.#if WHERET
25db0 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
25dc0 30 78 38 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  0x8 */.    if( s
25dd0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
25de0 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20   & 0x8 ){.      
25df0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
25e00 74 66 28 22 69 6e 73 2d 6e 6f 6f 70 3a 20 22 29  tf("ins-noop: ")
25e10 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  ;.      whereLoo
25e20 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65  pPrint(pTemplate
25e30 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29  , pBuilder->pWC)
25e40 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
25e50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
25e60 5f 4f 4b 3b 20 20 0a 20 20 7d 65 6c 73 65 7b 0a  _OK;  .  }else{.
25e70 20 20 20 20 70 20 3d 20 2a 70 70 50 72 65 76 3b      p = *ppPrev;
25e80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
25e90 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
25ea0 74 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  t it means that 
25eb0 65 69 74 68 65 72 20 70 5b 5d 20 73 68 6f 75 6c  either p[] shoul
25ec0 64 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  d be overwritten
25ed0 0a 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70  .  ** with pTemp
25ee0 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d 20 65 78  late[] if p[] ex
25ef0 69 73 74 73 2c 20 6f 72 20 69 66 20 70 3d 3d 4e  ists, or if p==N
25f00 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  ULL then allocat
25f10 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20 57 68 65  e a new.  ** Whe
25f20 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e 73 65 72  reLoop and inser
25f30 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 20 57  t it..  */.#if W
25f40 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
25f50 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 69 66  D /* 0x8 */.  if
25f60 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
25f70 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20  ace & 0x8 ){.   
25f80 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20 20   if( p!=0 ){.   
25f90 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
25fa0 72 69 6e 74 66 28 22 69 6e 73 2d 64 65 6c 3a 20  rintf("ins-del: 
25fb0 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65   ");.      where
25fc0 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 70 42 75  LoopPrint(p, pBu
25fd0 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20  ilder->pWC);.   
25fe0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65   }.    sqlite3De
25ff0 62 75 67 50 72 69 6e 74 66 28 22 69 6e 73 2d 6e  bugPrintf("ins-n
26000 65 77 3a 20 20 22 29 3b 0a 20 20 20 20 77 68 65  ew:  ");.    whe
26010 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d  reLoopPrint(pTem
26020 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d  plate, pBuilder-
26030 3e 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  >pWC);.  }.#endi
26040 66 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  f.  if( p==0 ){.
26050 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20      /* Allocate 
26060 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20  a new WhereLoop 
26070 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20 65 6e  to add to the en
26080 64 20 6f 66 20 74 68 65 20 6c 69 73 74 20 2a 2f  d of the list */
26090 0a 20 20 20 20 2a 70 70 50 72 65 76 20 3d 20 70  .    *ppPrev = p
260a0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
260b0 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
260c0 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20  (WhereLoop));.  
260d0 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
260e0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
260f0 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 49  ;.    whereLoopI
26100 6e 69 74 28 70 29 3b 0a 20 20 20 20 70 2d 3e 70  nit(p);.    p->p
26110 4e 65 78 74 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20  NextLoop = 0;.  
26120 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 65  }else{.    /* We
26130 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69   will be overwri
26140 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 70  ting WhereLoop p
26150 5b 5d 2e 20 20 42 75 74 20 62 65 66 6f 72 65 20  [].  But before 
26160 77 65 20 64 6f 2c 20 66 69 72 73 74 0a 20 20 20  we do, first.   
26170 20 2a 2a 20 67 6f 20 74 68 72 6f 75 67 68 20 74   ** go through t
26180 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6c  he rest of the l
26190 69 73 74 20 61 6e 64 20 64 65 6c 65 74 65 20 61  ist and delete a
261a0 6e 79 20 6f 74 68 65 72 20 65 6e 74 72 69 65 73  ny other entries
261b0 20 62 65 73 69 64 65 73 0a 20 20 20 20 2a 2a 20   besides.    ** 
261c0 70 5b 5d 20 74 68 61 74 20 61 72 65 20 61 6c 73  p[] that are als
261d0 6f 20 73 75 70 70 6c 61 74 65 64 20 62 79 20 70  o supplated by p
261e0 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20  Template */.    
261f0 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 54 61  WhereLoop **ppTa
26200 69 6c 20 3d 20 26 70 2d 3e 70 4e 65 78 74 4c 6f  il = &p->pNextLo
26210 6f 70 3b 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f  op;.    WhereLoo
26220 70 20 2a 70 54 6f 44 65 6c 3b 0a 20 20 20 20 77  p *pToDel;.    w
26230 68 69 6c 65 28 20 2a 70 70 54 61 69 6c 20 29 7b  hile( *ppTail ){
26240 0a 20 20 20 20 20 20 70 70 54 61 69 6c 20 3d 20  .      ppTail = 
26250 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73  whereLoopFindLes
26260 73 65 72 28 70 70 54 61 69 6c 2c 20 70 54 65 6d  ser(ppTail, pTem
26270 70 6c 61 74 65 29 3b 0a 20 20 20 20 20 20 69 66  plate);.      if
26280 28 20 70 70 54 61 69 6c 3d 3d 30 20 29 20 62 72  ( ppTail==0 ) br
26290 65 61 6b 3b 0a 20 20 20 20 20 20 70 54 6f 44 65  eak;.      pToDe
262a0 6c 20 3d 20 2a 70 70 54 61 69 6c 3b 0a 20 20 20  l = *ppTail;.   
262b0 20 20 20 69 66 28 20 70 54 6f 44 65 6c 3d 3d 30     if( pToDel==0
262c0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
262d0 2a 70 70 54 61 69 6c 20 3d 20 70 54 6f 44 65 6c  *ppTail = pToDel
262e0 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 23 69 66  ->pNextLoop;.#if
262f0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
26300 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20  LED /* 0x8 */.  
26310 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
26320 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20  hereTrace & 0x8 
26330 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
26340 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 69  e3DebugPrintf("i
26350 6e 73 2d 64 65 6c 3a 20 20 22 29 3b 0a 20 20 20  ns-del:  ");.   
26360 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72       whereLoopPr
26370 69 6e 74 28 70 54 6f 44 65 6c 2c 20 70 42 75 69  int(pToDel, pBui
26380 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20  lder->pWC);.    
26390 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
263a0 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65   whereLoopDelete
263b0 28 64 62 2c 20 70 54 6f 44 65 6c 29 3b 0a 20 20  (db, pToDel);.  
263c0 20 20 7d 0a 20 20 7d 0a 20 20 77 68 65 72 65 4c    }.  }.  whereL
263d0 6f 6f 70 58 66 65 72 28 64 62 2c 20 70 2c 20 70  oopXfer(db, p, p
263e0 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 69 66 28  Template);.  if(
263f0 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
26400 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
26410 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64  E)==0 ){.    Ind
26420 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e  ex *pIndex = p->
26430 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
26440 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 26      if( pIndex &
26450 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d  & pIndex->tnum==
26460 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e  0 ){.      p->u.
26470 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30  btree.pIndex = 0
26480 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
26490 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
264a0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
264b0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f  the WhereLoop.nO
264c0 75 74 20 76 61 6c 75 65 20 64 6f 77 6e 77 61 72  ut value downwar
264d0 64 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72  d to account for
264e0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a   terms of the.**
264f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
26500 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  at reference the
26510 20 6c 6f 6f 70 20 62 75 74 20 77 68 69 63 68 20   loop but which 
26520 61 72 65 20 6e 6f 74 20 75 73 65 64 20 62 79 20  are not used by 
26530 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2a 0a  an.** index..**.
26540 2a 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e  ** In the curren
26550 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
26560 2c 20 74 68 65 20 66 69 72 73 74 20 65 78 74 72  , the first extr
26570 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
26580 65 72 6d 20 72 65 64 75 63 65 73 0a 2a 2a 20 74  erm reduces.** t
26590 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
265a0 70 75 74 20 72 6f 77 73 20 62 79 20 61 20 66 61  put rows by a fa
265b0 63 74 6f 72 20 6f 66 20 31 30 20 61 6e 64 20 65  ctor of 10 and e
265c0 61 63 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 74  ach additional t
265d0 65 72 6d 0a 2a 2a 20 72 65 64 75 63 65 73 20 74  erm.** reduces t
265e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
265f0 70 75 74 20 72 6f 77 73 20 62 79 20 73 71 72 74  put rows by sqrt
26600 28 32 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  (2)..*/.static v
26610 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74  oid whereLoopOut
26620 70 75 74 41 64 6a 75 73 74 28 57 68 65 72 65 43  putAdjust(WhereC
26630 6c 61 75 73 65 20 2a 70 57 43 2c 20 57 68 65 72  lause *pWC, Wher
26640 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 29 7b 0a 20  eLoop *pLoop){. 
26650 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
26660 6d 2c 20 2a 70 58 3b 0a 20 20 42 69 74 6d 61 73  m, *pX;.  Bitmas
26670 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d 20 7e  k notAllowed = ~
26680 28 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 7c 70  (pLoop->prereq|p
26690 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3b  Loop->maskSelf);
266a0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20  .  int i, j;..  
266b0 69 66 28 20 21 4f 70 74 69 6d 69 7a 61 74 69 6f  if( !Optimizatio
266c0 6e 45 6e 61 62 6c 65 64 28 70 57 43 2d 3e 70 57  nEnabled(pWC->pW
266d0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
266e0 2c 20 53 51 4c 49 54 45 5f 41 64 6a 75 73 74 4f  , SQLITE_AdjustO
266f0 75 74 45 73 74 29 20 29 7b 0a 20 20 20 20 72 65  utEst) ){.    re
26700 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  turn;.  }.  for(
26710 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2c 20 70 54  i=pWC->nTerm, pT
26720 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3e 30 3b  erm=pWC->a; i>0;
26730 20 69 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   i--, pTerm++){.
26740 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
26750 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
26760 49 52 54 55 41 4c 29 21 3d 30 20 29 20 62 72 65  IRTUAL)!=0 ) bre
26770 61 6b 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65  ak;.    if( (pTe
26780 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
26790 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29  pLoop->maskSelf)
267a0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
267b0 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
267c0 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 41  prereqAll & notA
267d0 6c 6c 6f 77 65 64 29 21 3d 30 20 29 20 63 6f 6e  llowed)!=0 ) con
267e0 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a  tinue;.    for(j
267f0 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 2d 31  =pLoop->nLTerm-1
26800 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20  ; j>=0; j--){.  
26810 20 20 20 20 70 58 20 3d 20 70 4c 6f 6f 70 2d 3e      pX = pLoop->
26820 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20  aLTerm[j];.     
26830 20 69 66 28 20 70 58 3d 3d 30 20 29 20 63 6f 6e   if( pX==0 ) con
26840 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
26850 20 70 58 3d 3d 70 54 65 72 6d 20 29 20 62 72 65   pX==pTerm ) bre
26860 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58  ak;.      if( pX
26870 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 26 26 20  ->iParent>=0 && 
26880 28 26 70 57 43 2d 3e 61 5b 70 58 2d 3e 69 50 61  (&pWC->a[pX->iPa
26890 72 65 6e 74 5d 29 3d 3d 70 54 65 72 6d 20 29 20  rent])==pTerm ) 
268a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
268b0 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20 20 20   if( j<0 ){.    
268c0 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b 3d    pLoop->nOut +=
268d0 20 28 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72   (pTerm->truthPr
268e0 6f 62 3c 3d 30 20 3f 20 70 54 65 72 6d 2d 3e 74  ob<=0 ? pTerm->t
268f0 72 75 74 68 50 72 6f 62 20 3a 20 2d 31 29 3b 0a  ruthProb : -1);.
26900 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
26910 2a 2a 20 57 65 20 68 61 76 65 20 73 6f 20 66 61  ** We have so fa
26920 72 20 6d 61 74 63 68 65 64 20 70 42 75 69 6c 64  r matched pBuild
26930 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
26940 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f 66 20 74  e.nEq terms of t
26950 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20 70 49 6e  he .** index pIn
26960 64 65 78 2e 20 54 72 79 20 74 6f 20 6d 61 74 63  dex. Try to matc
26970 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a  h one more..**.*
26980 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
26990 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
269a0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
269b0 6e 4f 75 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  nOut contains th
269c0 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  e .** number of 
269d0 72 6f 77 73 20 65 78 70 65 63 74 65 64 20 74 6f  rows expected to
269e0 20 62 65 20 76 69 73 69 74 65 64 20 62 79 20 66   be visited by f
269f0 69 6c 74 65 72 69 6e 67 20 75 73 69 6e 67 20 74  iltering using t
26a00 68 65 20 6e 45 71 20 0a 2a 2a 20 74 65 72 6d 73  he nEq .** terms
26a10 20 6f 6e 6c 79 2e 20 49 66 20 69 74 20 69 73 20   only. If it is 
26a20 6d 6f 64 69 66 69 65 64 2c 20 74 68 69 73 20 76  modified, this v
26a30 61 6c 75 65 20 69 73 20 72 65 73 74 6f 72 65 64  alue is restored
26a40 20 62 65 66 6f 72 65 20 74 68 69 73 20 0a 2a 2a   before this .**
26a50 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
26a60 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f  s..**.** If pPro
26a70 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61  be->tnum==0, tha
26a80 74 20 6d 65 61 6e 73 20 70 49 6e 64 65 78 20 69  t means pIndex i
26a90 73 20 61 20 66 61 6b 65 20 69 6e 64 65 78 20 75  s a fake index u
26aa0 73 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49  sed for the.** I
26ab0 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
26ac0 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EY..*/.static in
26ad0 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  t whereLoopAddBt
26ae0 72 65 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72  reeIndex(.  Wher
26af0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
26b00 75 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20 54  uilder,     /* T
26b10 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 66 61 63  he WhereLoop fac
26b20 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  tory */.  struct
26b30 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
26b40 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f  Src,      /* FRO
26b50 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65  M clause term be
26b60 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a  ing analyzed */.
26b70 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c    Index *pProbe,
26b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b90 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e    /* An index on
26ba0 20 70 53 72 63 20 2a 2f 0a 20 20 4c 6f 67 45 73   pSrc */.  LogEs
26bb0 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20 20  t nInMul        
26bc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f             /* lo
26bd0 67 28 4e 75 6d 62 65 72 20 6f 66 20 69 74 65 72  g(Number of iter
26be0 61 74 69 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e  ations due to IN
26bf0 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  ) */.){.  WhereI
26c00 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
26c10 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20  uilder->pWInfo; 
26c20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
26c30 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  e context */.  P
26c40 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
26c50 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20  WInfo->pParse;  
26c60 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
26c70 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
26c80 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
26c90 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a  se->db;       /*
26ca0 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
26cb0 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74  tion malloc cont
26cc0 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ext */.  WhereLo
26cd0 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  op *pNew;       
26ce0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
26cf0 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 75  late WhereLoop u
26d00 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
26d10 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  n */.  WhereTerm
26d20 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
26d30 20 20 20 20 20 20 20 2f 2a 20 41 20 57 68 65 72         /* A Wher
26d40 65 54 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73  eTerm under cons
26d50 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  ideration */.  i
26d60 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20  nt opMask;      
26d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26d80 2a 20 56 61 6c 69 64 20 6f 70 65 72 61 74 6f 72  * Valid operator
26d90 73 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74  s for constraint
26da0 73 20 2a 2f 0a 20 20 57 68 65 72 65 53 63 61 6e  s */.  WhereScan
26db0 20 73 63 61 6e 3b 20 20 20 20 20 20 20 20 20 20   scan;          
26dc0 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
26dd0 6f 72 20 66 6f 72 20 57 48 45 52 45 20 74 65 72  or for WHERE ter
26de0 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ms */.  Bitmask 
26df0 73 61 76 65 64 5f 70 72 65 72 65 71 3b 20 20 20  saved_prereq;   
26e00 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
26e10 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
26e20 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20 20 75  w->prereq */.  u
26e30 31 36 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b  16 saved_nLTerm;
26e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26e50 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
26e60 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d   of pNew->nLTerm
26e70 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f   */.  u16 saved_
26e80 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  nEq;            
26e90 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
26ea0 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
26eb0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a  >u.btree.nEq */.
26ec0 20 20 75 31 36 20 73 61 76 65 64 5f 6e 53 6b 69    u16 saved_nSki
26ed0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
26ee0 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
26ef0 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62  lue of pNew->u.b
26f00 74 72 65 65 2e 6e 53 6b 69 70 20 2a 2f 0a 20 20  tree.nSkip */.  
26f10 75 33 32 20 73 61 76 65 64 5f 77 73 46 6c 61 67  u32 saved_wsFlag
26f20 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
26f30 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
26f40 65 20 6f 66 20 70 4e 65 77 2d 3e 77 73 46 6c 61  e of pNew->wsFla
26f50 67 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 73  gs */.  LogEst s
26f60 61 76 65 64 5f 6e 4f 75 74 3b 20 20 20 20 20 20  aved_nOut;      
26f70 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
26f80 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
26f90 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e 74  w->nOut */.  int
26fa0 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   iCol;          
26fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26fc0 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c  Index of the col
26fd0 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65  umn in the table
26fe0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
26ff0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
27000 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
27010 63 6f 64 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  code */.  LogEst
27020 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20   rLogSize;      
27030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67            /* Log
27040 61 72 69 74 68 6d 20 6f 66 20 74 61 62 6c 65 20  arithm of table 
27050 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65 72 65 54  size */.  WhereT
27060 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30 2c 20 2a  erm *pTop = 0, *
27070 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20 54 6f 70  pBtm = 0; /* Top
27080 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72 61 6e 67   and bottom rang
27090 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  e constraints */
270a0 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  ..  pNew = pBuil
270b0 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69 66 28  der->pNew;.  if(
270c0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
270d0 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d ) return SQLIT
270e0 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 61 73 73 65  E_NOMEM;..  asse
270f0 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  rt( (pNew->wsFla
27100 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
27110 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20  ALTABLE)==0 );. 
27120 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e   assert( (pNew->
27130 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
27140 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b  TOP_LIMIT)==0 );
27150 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46  .  if( pNew->wsF
27160 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
27170 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70  _LIMIT ){.    op
27180 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f  Mask = WO_LT|WO_
27190 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  LE;.  }else if( 
271a0 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20  pProbe->tnum<=0 
271b0 7c 7c 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74 79  || (pSrc->jointy
271c0 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30  pe & JT_LEFT)!=0
271d0 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d   ){.    opMask =
271e0 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f   WO_EQ|WO_IN|WO_
271f0 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57  GT|WO_GE|WO_LT|W
27200 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  O_LE;.  }else{. 
27210 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45     opMask = WO_E
27220 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c  Q|WO_IN|WO_ISNUL
27230 4c 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f  L|WO_GT|WO_GE|WO
27240 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 0a 20  _LT|WO_LE;.  }. 
27250 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 55 6e   if( pProbe->bUn
27260 6f 72 64 65 72 65 64 20 29 20 6f 70 4d 61 73 6b  ordered ) opMask
27270 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47   &= ~(WO_GT|WO_G
27280 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a  E|WO_LT|WO_LE);.
27290 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
272a0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50  >u.btree.nEq<=pP
272b0 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 20 29 3b  robe->nKeyCol );
272c0 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 62  .  if( pNew->u.b
272d0 74 72 65 65 2e 6e 45 71 20 3c 20 70 50 72 6f 62  tree.nEq < pProb
272e0 65 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20  e->nKeyCol ){.  
272f0 20 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65 2d    iCol = pProbe-
27300 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4e 65 77 2d 3e  >aiColumn[pNew->
27310 75 2e 62 74 72 65 65 2e 6e 45 71 5d 3b 0a 20 20  u.btree.nEq];.  
27320 7d 65 6c 73 65 7b 0a 20 20 20 20 69 43 6f 6c 20  }else{.    iCol 
27330 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 70 54 65 72  = -1;.  }.  pTer
27340 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69  m = whereScanIni
27350 74 28 26 73 63 61 6e 2c 20 70 42 75 69 6c 64 65  t(&scan, pBuilde
27360 72 2d 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69 43  r->pWC, pSrc->iC
27370 75 72 73 6f 72 2c 20 69 43 6f 6c 2c 0a 20 20 20  ursor, iCol,.   
27380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27390 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50 72       opMask, pPr
273a0 6f 62 65 29 3b 0a 20 20 73 61 76 65 64 5f 6e 45  obe);.  saved_nE
273b0 71 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65  q = pNew->u.btre
273c0 65 2e 6e 45 71 3b 0a 20 20 73 61 76 65 64 5f 6e  e.nEq;.  saved_n
273d0 53 6b 69 70 20 3d 20 70 4e 65 77 2d 3e 75 2e 62  Skip = pNew->u.b
273e0 74 72 65 65 2e 6e 53 6b 69 70 3b 0a 20 20 73 61  tree.nSkip;.  sa
273f0 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65  ved_nLTerm = pNe
27400 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76  w->nLTerm;.  sav
27410 65 64 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e 65  ed_wsFlags = pNe
27420 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73 61  w->wsFlags;.  sa
27430 76 65 64 5f 70 72 65 72 65 71 20 3d 20 70 4e 65  ved_prereq = pNe
27440 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73 61 76  w->prereq;.  sav
27450 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e  ed_nOut = pNew->
27460 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 72 53  nOut;.  pNew->rS
27470 65 74 75 70 20 3d 20 30 3b 0a 20 20 72 4c 6f 67  etup = 0;.  rLog
27480 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 70 50  Size = estLog(pP
27490 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  robe->aiRowLogEs
274a0 74 5b 30 5d 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  t[0]);..  /* Con
274b0 73 69 64 65 72 20 75 73 69 6e 67 20 61 20 73 6b  sider using a sk
274c0 69 70 2d 73 63 61 6e 20 69 66 20 74 68 65 72 65  ip-scan if there
274d0 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c   are no WHERE cl
274e0 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ause constraints
274f0 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  .  ** available 
27500 66 6f 72 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  for the left-mos
27510 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69  t terms of the i
27520 6e 64 65 78 2c 20 61 6e 64 20 69 66 20 74 68 65  ndex, and if the
27530 20 61 76 65 72 61 67 65 0a 20 20 2a 2a 20 6e 75   average.  ** nu
27540 6d 62 65 72 20 6f 66 20 72 65 70 65 61 74 73 20  mber of repeats 
27550 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  in the left-most
27560 20 74 65 72 6d 73 20 69 73 20 61 74 20 6c 65 61   terms is at lea
27570 73 74 20 31 38 2e 20 0a 20 20 2a 2a 0a 20 20 2a  st 18. .  **.  *
27580 2a 20 54 68 65 20 6d 61 67 69 63 20 6e 75 6d 62  * The magic numb
27590 65 72 20 31 38 20 69 73 20 73 65 6c 65 63 74 65  er 18 is selecte
275a0 64 20 6f 6e 20 74 68 65 20 62 61 73 69 73 20 74  d on the basis t
275b0 68 61 74 20 73 63 61 6e 6e 69 6e 67 20 31 37 20  hat scanning 17 
275c0 72 6f 77 73 0a 20 20 2a 2a 20 69 73 20 61 6c 6d  rows.  ** is alm
275d0 6f 73 74 20 61 6c 77 61 79 73 20 71 75 69 63 6b  ost always quick
275e0 65 72 20 74 68 61 6e 20 61 6e 20 69 6e 64 65 78  er than an index
275f0 20 73 65 65 6b 20 28 65 76 65 6e 20 74 68 6f 75   seek (even thou
27600 67 68 20 69 66 20 74 68 65 20 69 6e 64 65 78 0a  gh if the index.
27610 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 66 65    ** contains fe
27620 77 65 72 20 74 68 61 6e 20 32 5e 31 37 20 72 6f  wer than 2^17 ro
27630 77 73 20 77 65 20 61 73 73 75 6d 65 20 6f 74 68  ws we assume oth
27640 65 72 77 69 73 65 20 69 6e 20 6f 74 68 65 72 20  erwise in other 
27650 70 61 72 74 73 20 6f 66 0a 20 20 2a 2a 20 74 68  parts of.  ** th
27660 65 20 63 6f 64 65 29 2e 20 41 6e 64 2c 20 65 76  e code). And, ev
27670 65 6e 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2c  en if it is not,
27680 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62   it should not b
27690 65 20 74 6f 6f 20 6d 75 63 68 20 73 6c 6f 77 65  e too much slowe
276a0 72 2e 20 0a 20 20 2a 2a 20 4f 6e 20 74 68 65 20  r. .  ** On the 
276b0 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68 65 20  other hand, the 
276c0 65 78 74 72 61 20 73 65 65 6b 73 20 63 6f 75 6c  extra seeks coul
276d0 64 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 73  d end up being s
276e0 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a  ignificantly.  *
276f0 2a 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65  * more expensive
27700 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
27710 34 32 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  42==sqlite3LogEs
27720 74 28 31 38 29 20 29 3b 0a 20 20 69 66 28 20 70  t(18) );.  if( p
27730 54 65 72 6d 3d 3d 30 0a 20 20 20 26 26 20 73 61  Term==0.   && sa
27740 76 65 64 5f 6e 45 71 3d 3d 73 61 76 65 64 5f 6e  ved_nEq==saved_n
27750 53 6b 69 70 0a 20 20 20 26 26 20 73 61 76 65 64  Skip.   && saved
27760 5f 6e 45 71 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e  _nEq+1<pProbe->n
27770 4b 65 79 43 6f 6c 0a 20 20 20 26 26 20 70 50 72  KeyCol.   && pPr
27780 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
27790 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3e 3d 34  [saved_nEq+1]>=4
277a0 32 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 69  2  /* TUNING: Mi
277b0 6e 69 6d 75 6d 20 66 6f 72 20 73 6b 69 70 2d 73  nimum for skip-s
277c0 63 61 6e 20 2a 2f 0a 20 20 20 26 26 20 28 72 63  can */.   && (rc
277d0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69   = whereLoopResi
277e0 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65  ze(db, pNew, pNe
277f0 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 29 3d 3d 53  w->nLTerm+1))==S
27800 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20  QLITE_OK.  ){.  
27810 20 20 4c 6f 67 45 73 74 20 6e 49 74 65 72 3b 0a    LogEst nIter;.
27820 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
27830 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 70 4e 65  e.nEq++;.    pNe
27840 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70  w->u.btree.nSkip
27850 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c  ++;.    pNew->aL
27860 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72  Term[pNew->nLTer
27870 6d 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e  m++] = 0;.    pN
27880 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
27890 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 3b 0a 20  HERE_SKIPSCAN;. 
278a0 20 20 20 6e 49 74 65 72 20 3d 20 70 50 72 6f 62     nIter = pProb
278b0 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73  e->aiRowLogEst[s
278c0 61 76 65 64 5f 6e 45 71 5d 20 2d 20 70 50 72 6f  aved_nEq] - pPro
278d0 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
278e0 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3b 0a 20 20  saved_nEq+1];.  
278f0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20    pNew->nOut -= 
27900 6e 49 74 65 72 3b 0a 20 20 20 20 77 68 65 72 65  nIter;.    where
27910 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
27920 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63  x(pBuilder, pSrc
27930 2c 20 70 50 72 6f 62 65 2c 20 6e 49 74 65 72 20  , pProbe, nIter 
27940 2b 20 6e 49 6e 4d 75 6c 29 3b 0a 20 20 20 20 70  + nInMul);.    p
27950 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65  New->nOut = save
27960 64 5f 6e 4f 75 74 3b 0a 20 20 7d 0a 20 20 66 6f  d_nOut;.  }.  fo
27970 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  r(; rc==SQLITE_O
27980 4b 20 26 26 20 70 54 65 72 6d 21 3d 30 3b 20 70  K && pTerm!=0; p
27990 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e  Term = whereScan
279a0 4e 65 78 74 28 26 73 63 61 6e 29 29 7b 0a 20 20  Next(&scan)){.  
279b0 20 20 75 31 36 20 65 4f 70 20 3d 20 70 54 65 72    u16 eOp = pTer
279c0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 20 20 20  m->eOperator;   
279d0 2f 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72  /* Shorthand for
279e0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
279f0 72 20 2a 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20  r */.    LogEst 
27a00 72 43 6f 73 74 49 64 78 3b 0a 20 20 20 20 4c 6f  rCostIdx;.    Lo
27a10 67 45 73 74 20 6e 4f 75 74 55 6e 61 64 6a 75 73  gEst nOutUnadjus
27a20 74 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e  ted;        /* n
27a30 4f 75 74 20 62 65 66 6f 72 65 20 49 4e 28 29 20  Out before IN() 
27a40 61 6e 64 20 57 48 45 52 45 20 61 64 6a 75 73 74  and WHERE adjust
27a50 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74  ments */.    int
27a60 20 6e 49 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66   nIn = 0;.#ifdef
27a70 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
27a80 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
27a90 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20    int nRecValid 
27aa0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63  = pBuilder->nRec
27ab0 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20  Valid;.#endif.  
27ac0 20 20 69 66 28 20 28 65 4f 70 3d 3d 57 4f 5f 49    if( (eOp==WO_I
27ad0 53 4e 55 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d  SNULL || (pTerm-
27ae0 3e 77 74 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e  >wtFlags&TERM_VN
27af0 55 4c 4c 29 21 3d 30 29 0a 20 20 20 20 20 26 26  ULL)!=0).     &&
27b00 20 28 69 43 6f 6c 3c 30 20 7c 7c 20 70 53 72 63   (iCol<0 || pSrc
27b10 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  ->pTab->aCol[iCo
27b20 6c 5d 2e 6e 6f 74 4e 75 6c 6c 29 0a 20 20 20 20  l].notNull).    
27b30 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  ){.      continu
27b40 65 3b 20 2f 2a 20 69 67 6e 6f 72 65 20 49 53 20  e; /* ignore IS 
27b50 5b 4e 4f 54 5d 20 4e 55 4c 4c 20 63 6f 6e 73 74  [NOT] NULL const
27b60 72 61 69 6e 74 73 20 6f 6e 20 4e 4f 54 20 4e 55  raints on NOT NU
27b70 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  LL columns */.  
27b80 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 65 72    }.    if( pTer
27b90 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
27ba0 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20   pNew->maskSelf 
27bb0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
27bc0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
27bd0 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a   saved_wsFlags;.
27be0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
27bf0 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45  e.nEq = saved_nE
27c00 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54  q;.    pNew->nLT
27c10 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65  erm = saved_nLTe
27c20 72 6d 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72  rm;.    if( wher
27c30 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20  eLoopResize(db, 
27c40 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65  pNew, pNew->nLTe
27c50 72 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20 2f  rm+1) ) break; /
27c60 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e 65  * OOM */.    pNe
27c70 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e  w->aLTerm[pNew->
27c80 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 65 72  nLTerm++] = pTer
27c90 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  m;.    pNew->pre
27ca0 72 65 71 20 3d 20 28 73 61 76 65 64 5f 70 72 65  req = (saved_pre
27cb0 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65  req | pTerm->pre
27cc0 72 65 71 52 69 67 68 74 29 20 26 20 7e 70 4e 65  reqRight) & ~pNe
27cd0 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 0a 20 20  w->maskSelf;..  
27ce0 20 20 61 73 73 65 72 74 28 20 6e 49 6e 4d 75 6c    assert( nInMul
27cf0 3d 3d 30 0a 20 20 20 20 20 20 20 20 7c 7c 20 28  ==0.        || (
27d00 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
27d10 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
27d20 4c 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 7c  L)!=0 .        |
27d30 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  | (pNew->wsFlags
27d40 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
27d50 49 4e 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20  IN)!=0 .        
27d60 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  || (pNew->wsFlag
27d70 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53 43  s & WHERE_SKIPSC
27d80 41 4e 29 21 3d 30 20 0a 20 20 20 20 29 3b 0a 0a  AN)!=0 .    );..
27d90 20 20 20 20 69 66 28 20 65 4f 70 20 26 20 57 4f      if( eOp & WO
27da0 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70  _IN ){.      Exp
27db0 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
27dc0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70  ->pExpr;.      p
27dd0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
27de0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b  WHERE_COLUMN_IN;
27df0 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
27e00 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
27e10 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
27e20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78  ){.        /* "x
27e30 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
27e40 22 3a 20 20 54 55 4e 49 4e 47 3a 20 74 68 65 20  ":  TUNING: the 
27e50 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20 32  SELECT returns 2
27e60 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20  5 rows */.      
27e70 20 20 6e 49 6e 20 3d 20 34 36 3b 20 20 61 73 73    nIn = 46;  ass
27e80 65 72 74 28 20 34 36 3d 3d 73 71 6c 69 74 65 33  ert( 46==sqlite3
27e90 4c 6f 67 45 73 74 28 32 35 29 20 29 3b 0a 20 20  LogEst(25) );.  
27ea0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c      }else if( AL
27eb0 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c  WAYS(pExpr->x.pL
27ec0 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78 2e  ist && pExpr->x.
27ed0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  pList->nExpr) ){
27ee0 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49  .        /* "x I
27ef0 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c  N (value, value,
27f00 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20   ...)" */.      
27f10 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33 4c    nIn = sqlite3L
27f20 6f 67 45 73 74 28 70 45 78 70 72 2d 3e 78 2e 70  ogEst(pExpr->x.p
27f30 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
27f40 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
27f50 72 74 28 20 6e 49 6e 3e 30 20 29 3b 20 20 2f 2a  rt( nIn>0 );  /*
27f60 20 52 48 53 20 61 6c 77 61 79 73 20 68 61 73 20   RHS always has 
27f70 32 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 2e  2 or more terms.
27f80 2e 2e 20 20 54 68 65 20 70 61 72 73 65 72 0a 20  ..  The parser. 
27f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27fa0 20 20 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65         ** change
27fb0 73 20 22 78 20 49 4e 20 28 3f 29 22 20 69 6e 74  s "x IN (?)" int
27fc0 6f 20 22 78 3d 3f 22 2e 20 2a 2f 0a 0a 20 20 20  o "x=?". */..   
27fd0 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26   }else if( eOp &
27fe0 20 28 57 4f 5f 45 51 29 20 29 7b 0a 20 20 20 20   (WO_EQ) ){.    
27ff0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
28000 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
28010 45 51 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43  EQ;.      if( iC
28020 6f 6c 3c 30 20 7c 7c 20 28 6e 49 6e 4d 75 6c 3d  ol<0 || (nInMul=
28030 3d 30 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74  =0 && pNew->u.bt
28040 72 65 65 2e 6e 45 71 3d 3d 70 50 72 6f 62 65 2d  ree.nEq==pProbe-
28050 3e 6e 4b 65 79 43 6f 6c 2d 31 29 20 29 7b 0a 20  >nKeyCol-1) ){. 
28060 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e         if( iCol>
28070 3d 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 6f 6e  =0 && pProbe->on
28080 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29  Error==OE_None )
28090 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
280a0 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
280b0 52 45 5f 55 4e 51 5f 57 41 4e 54 45 44 3b 0a 20  RE_UNQ_WANTED;. 
280c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
280d0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73          pNew->ws
280e0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f  Flags |= WHERE_O
280f0 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d  NEROW;.        }
28100 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
28110 73 65 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f  se if( eOp & WO_
28120 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  ISNULL ){.      
28130 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
28140 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55   WHERE_COLUMN_NU
28150 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  LL;.    }else if
28160 28 20 65 4f 70 20 26 20 28 57 4f 5f 47 54 7c 57  ( eOp & (WO_GT|W
28170 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20 20 20 74  O_GE) ){.      t
28180 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57  estcase( eOp & W
28190 4f 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65  O_GT );.      te
281a0 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
281b0 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  _GE );.      pNe
281c0 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
281d0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
281e0 7c 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  |WHERE_BTM_LIMIT
281f0 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 70  ;.      pBtm = p
28200 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70  Term;.      pTop
28210 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
28220 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
28230 4f 70 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c  Op & (WO_LT|WO_L
28240 45 29 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  E) );.      test
28250 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 4c  case( eOp & WO_L
28260 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
28270 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 4c 45  ase( eOp & WO_LE
28280 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
28290 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
282a0 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48  _COLUMN_RANGE|WH
282b0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20  ERE_TOP_LIMIT;. 
282c0 20 20 20 20 20 70 54 6f 70 20 3d 20 70 54 65 72       pTop = pTer
282d0 6d 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20  m;.      pBtm = 
282e0 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
282f0 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
28300 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20  )!=0 ?.         
28310 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
28320 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e  ->aLTerm[pNew->n
28330 4c 54 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20  LTerm-2] : 0;.  
28340 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74    }..    /* At t
28350 68 69 73 20 70 6f 69 6e 74 20 70 4e 65 77 2d 3e  his point pNew->
28360 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74  nOut is set to t
28370 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
28380 73 20 65 78 70 65 63 74 65 64 20 74 6f 0a 20 20  s expected to.  
28390 20 20 2a 2a 20 62 65 20 76 69 73 69 74 65 64 20    ** be visited 
283a0 62 79 20 74 68 65 20 69 6e 64 65 78 20 73 63 61  by the index sca
283b0 6e 20 62 65 66 6f 72 65 20 63 6f 6e 73 69 64 65  n before conside
283c0 72 69 6e 67 20 74 65 72 6d 20 70 54 65 72 6d 2c  ring term pTerm,
283d0 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 76   or the.    ** v
283e0 61 6c 75 65 73 20 6f 66 20 6e 49 6e 20 61 6e 64  alues of nIn and
283f0 20 6e 49 6e 4d 75 6c 2e 20 49 6e 20 6f 74 68 65   nInMul. In othe
28400 72 20 77 6f 72 64 73 2c 20 61 73 73 75 6d 69 6e  r words, assumin
28410 67 20 74 68 61 74 20 61 6c 6c 20 0a 20 20 20 20  g that all .    
28420 2a 2a 20 22 78 20 49 4e 28 2e 2e 2e 29 22 20 74  ** "x IN(...)" t
28430 65 72 6d 73 20 61 72 65 20 72 65 70 6c 61 63 65  erms are replace
28440 64 20 77 69 74 68 20 22 78 20 3d 20 3f 22 2e 20  d with "x = ?". 
28450 54 68 69 73 20 62 6c 6f 63 6b 20 75 70 64 61 74  This block updat
28460 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61  es.    ** the va
28470 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75  lue of pNew->nOu
28480 74 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72  t to account for
28490 20 70 54 65 72 6d 20 28 62 75 74 20 6e 6f 74 20   pTerm (but not 
284a0 6e 49 6e 2f 6e 49 6e 4d 75 6c 29 2e 20 20 2a 2f  nIn/nInMul).  */
284b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
284c0 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e  w->nOut==saved_n
284d0 4f 75 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Out );.    if( p
284e0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
284f0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
28500 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64  E ){.      /* Ad
28510 6a 75 73 74 20 6e 4f 75 74 20 75 73 69 6e 67 20  just nOut using 
28520 73 74 61 74 33 2f 73 74 61 74 34 20 64 61 74 61  stat3/stat4 data
28530 2e 20 4f 72 2c 20 69 66 20 74 68 65 72 65 20 69  . Or, if there i
28540 73 20 6e 6f 20 73 74 61 74 33 2f 73 74 61 74 34  s no stat3/stat4
28550 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 2c 20  .      ** data, 
28560 75 73 69 6e 67 20 73 6f 6d 65 20 6f 74 68 65 72  using some other
28570 20 65 73 74 69 6d 61 74 65 2e 20 20 2a 2f 0a 20   estimate.  */. 
28580 20 20 20 20 20 77 68 65 72 65 52 61 6e 67 65 53       whereRangeS
28590 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
285a0 42 75 69 6c 64 65 72 2c 20 70 42 74 6d 2c 20 70  Builder, pBtm, p
285b0 54 6f 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  Top, pNew);.    
285c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
285d0 20 6e 45 71 20 3d 20 2b 2b 70 4e 65 77 2d 3e 75   nEq = ++pNew->u
285e0 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 20 20  .btree.nEq;.    
285f0 20 20 61 73 73 65 72 74 28 20 65 4f 70 20 26 20    assert( eOp & 
28600 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51  (WO_ISNULL|WO_EQ
28610 7c 57 4f 5f 49 4e 29 20 29 3b 0a 0a 20 20 20 20  |WO_IN) );..    
28620 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
28630 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74  nOut==saved_nOut
28640 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   );.      if( pT
28650 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d  erm->truthProb<=
28660 30 20 26 26 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a  0 && iCol>=0 ){.
28670 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
28680 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20 7c 7c  (eOp & WO_IN) ||
28690 20 6e 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20   nIn==0 );.     
286a0 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70     testcase( eOp
286b0 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
286c0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b      pNew->nOut +
286d0 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  = pTerm->truthPr
286e0 6f 62 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ob;.        pNew
286f0 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20  ->nOut -= nIn;. 
28700 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64       }else{.#ifd
28710 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
28720 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
28730 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20          tRowcnt 
28740 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  nOut = 0;.      
28750 20 20 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30 20    if( nInMul==0 
28760 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 72  .         && pPr
28770 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20  obe->nSample .  
28780 20 20 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e         && pNew->
28790 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72  u.btree.nEq<=pPr
287a0 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a  obe->nSampleCol.
287b0 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69           && Opti
287c0 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
287d0 64 62 2c 20 53 51 4c 49 54 45 5f 53 74 61 74 33  db, SQLITE_Stat3
287e0 29 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  ) .         && (
287f0 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 3d 3d 30  (eOp & WO_IN)==0
28800 20 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70   || !ExprHasProp
28810 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
28820 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
28830 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
28840 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
28850 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
28860 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  r;.          if(
28870 20 28 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57   (eOp & (WO_EQ|W
28880 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 20 29 7b  O_ISNULL))!=0 ){
28890 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
288a0 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
288b0 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  EQ );.          
288c0 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
288d0 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  & WO_ISNULL );. 
288e0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
288f0 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73  whereEqualScanEs
28900 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64  t(pParse, pBuild
28910 65 72 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  er, pExpr->pRigh
28920 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20  t, &nOut);.     
28930 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28940 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
28950 72 65 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72  reInScanEst(pPar
28960 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45  se, pBuilder, pE
28970 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e  xpr->x.pList, &n
28980 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Out);.          
28990 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  }.          asse
289a0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
289b0 4b 20 7c 7c 20 6e 4f 75 74 3e 30 20 29 3b 0a 20  K || nOut>0 );. 
289c0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
289d0 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
289e0 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f   ) rc = SQLITE_O
289f0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  K;.          if(
28a00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28a10 20 62 72 65 61 6b 3b 20 20 20 20 20 20 20 20 20   break;         
28a20 20 2f 2a 20 4a 75 6d 70 20 6f 75 74 20 6f 66 20   /* Jump out of 
28a30 74 68 65 20 70 54 65 72 6d 20 6c 6f 6f 70 20 2a  the pTerm loop *
28a40 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
28a50 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20  nOut ){.        
28a60 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
28a70 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e   sqlite3LogEst(n
28a80 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Out);.          
28a90 20 20 69 66 28 20 70 4e 65 77 2d 3e 6e 4f 75 74    if( pNew->nOut
28aa0 3e 73 61 76 65 64 5f 6e 4f 75 74 20 29 20 70 4e  >saved_nOut ) pN
28ab0 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64  ew->nOut = saved
28ac0 5f 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 20  _nOut;.         
28ad0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d     pNew->nOut -=
28ae0 20 6e 49 6e 3b 0a 20 20 20 20 20 20 20 20 20 20   nIn;.          
28af0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
28b00 20 20 20 20 69 66 28 20 6e 4f 75 74 3d 3d 30 20      if( nOut==0 
28b10 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ).#endif.       
28b20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65   {.          pNe
28b30 77 2d 3e 6e 4f 75 74 20 2b 3d 20 28 70 50 72 6f  w->nOut += (pPro
28b40 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
28b50 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61  nEq] - pProbe->a
28b60 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 2d 31  iRowLogEst[nEq-1
28b70 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ]);.          if
28b80 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c  ( eOp & WO_ISNUL
28b90 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  L ){.           
28ba0 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20 74   /* TUNING: If t
28bb0 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6b 65 6c  here is no likel
28bc0 69 68 6f 6f 64 28 29 20 76 61 6c 75 65 2c 20 61  ihood() value, a
28bd0 73 73 75 6d 65 20 74 68 61 74 20 61 20 0a 20 20  ssume that a .  
28be0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 22 63 6f            ** "co
28bf0 6c 20 49 53 20 4e 55 4c 4c 22 20 65 78 70 72 65  l IS NULL" expre
28c00 73 73 69 6f 6e 20 6d 61 74 63 68 65 73 20 74 77  ssion matches tw
28c10 69 63 65 20 61 73 20 6d 61 6e 79 20 72 6f 77 73  ice as many rows
28c20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
28c30 20 61 73 20 28 63 6f 6c 3d 3f 29 2e 20 2a 2f 0a   as (col=?). */.
28c40 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
28c50 2d 3e 6e 4f 75 74 20 2b 3d 20 31 30 3b 0a 20 20  ->nOut += 10;.  
28c60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28c70 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
28c80 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 72 43  }..    /* Set rC
28c90 6f 73 74 49 64 78 20 74 6f 20 74 68 65 20 63 6f  ostIdx to the co
28ca0 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20 73  st of visiting s
28cb0 65 6c 65 63 74 65 64 20 72 6f 77 73 20 69 6e 20  elected rows in 
28cc0 69 6e 64 65 78 2e 20 41 64 64 0a 20 20 20 20 2a  index. Add.    *
28cd0 2a 20 69 74 20 74 6f 20 70 4e 65 77 2d 3e 72 52  * it to pNew->rR
28ce0 75 6e 2c 20 77 68 69 63 68 20 69 73 20 63 75 72  un, which is cur
28cf0 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20 74 68  rently set to th
28d00 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20 69 6e  e cost of the in
28d10 64 65 78 0a 20 20 20 20 2a 2a 20 73 65 65 6b 20  dex.    ** seek 
28d20 6f 6e 6c 79 2e 20 54 68 65 6e 2c 20 69 66 20 74  only. Then, if t
28d30 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76  his is a non-cov
28d40 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 61 64 64  ering index, add
28d50 20 74 68 65 20 63 6f 73 74 20 6f 66 0a 20 20 20   the cost of.   
28d60 20 2a 2a 20 76 69 73 69 74 69 6e 67 20 74 68 65   ** visiting the
28d70 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69   rows in the mai
28d80 6e 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20  n table.  */.   
28d90 20 72 43 6f 73 74 49 64 78 20 3d 20 70 4e 65 77   rCostIdx = pNew
28da0 2d 3e 6e 4f 75 74 20 2b 20 31 20 2b 20 28 31 35  ->nOut + 1 + (15
28db0 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f  *pProbe->szIdxRo
28dc0 77 29 2f 70 53 72 63 2d 3e 70 54 61 62 2d 3e 73  w)/pSrc->pTab->s
28dd0 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 70 4e 65  zTabRow;.    pNe
28de0 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65  w->rRun = sqlite
28df0 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53  3LogEstAdd(rLogS
28e00 69 7a 65 2c 20 72 43 6f 73 74 49 64 78 29 3b 0a  ize, rCostIdx);.
28e10 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77      if( (pNew->w
28e20 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
28e30 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49  IDX_ONLY|WHERE_I
28e40 50 4b 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  PK))==0 ){.     
28e50 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71   pNew->rRun = sq
28e60 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70  lite3LogEstAdd(p
28e70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65 77 2d  New->rRun, pNew-
28e80 3e 6e 4f 75 74 20 2b 20 31 36 29 3b 0a 20 20 20  >nOut + 16);.   
28e90 20 7d 0a 0a 20 20 20 20 6e 4f 75 74 55 6e 61 64   }..    nOutUnad
28ea0 6a 75 73 74 65 64 20 3d 20 70 4e 65 77 2d 3e 6e  justed = pNew->n
28eb0 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72  Out;.    pNew->r
28ec0 52 75 6e 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20  Run += nInMul + 
28ed0 6e 49 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  nIn;.    pNew->n
28ee0 4f 75 74 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20  Out += nInMul + 
28ef0 6e 49 6e 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f  nIn;.    whereLo
28f00 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70  opOutputAdjust(p
28f10 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 4e  Builder->pWC, pN
28f20 65 77 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 68  ew);.    rc = wh
28f30 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
28f40 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 0a  uilder, pNew);..
28f50 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73      if( pNew->ws
28f60 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
28f70 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20  LUMN_RANGE ){.  
28f80 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
28f90 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20   saved_nOut;.   
28fa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e   }else{.      pN
28fb0 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 55  ew->nOut = nOutU
28fc0 6e 61 64 6a 75 73 74 65 64 3b 0a 20 20 20 20 7d  nadjusted;.    }
28fd0 0a 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d  ..    if( (pNew-
28fe0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
28ff0 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20  _TOP_LIMIT)==0. 
29000 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62      && pNew->u.b
29010 74 72 65 65 2e 6e 45 71 3c 28 70 50 72 6f 62 65  tree.nEq<(pProbe
29020 2d 3e 6e 4b 65 79 43 6f 6c 20 2b 20 28 70 50 72  ->nKeyCol + (pPr
29030 6f 62 65 2d 3e 7a 4e 61 6d 65 21 3d 30 29 29 0a  obe->zName!=0)).
29040 20 20 20 20 29 7b 0a 20 20 20 20 20 20 77 68 65      ){.      whe
29050 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e  reLoopAddBtreeIn
29060 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53  dex(pBuilder, pS
29070 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e 4d  rc, pProbe, nInM
29080 75 6c 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a 20  ul+nIn);.    }. 
29090 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
290a0 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 23 69 66 64  saved_nOut;.#ifd
290b0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
290c0 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
290d0 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52      pBuilder->nR
290e0 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61  ecValid = nRecVa
290f0 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  lid;.#endif.  }.
29100 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
29110 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 0a 20   saved_prereq;. 
29120 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
29130 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a  Eq = saved_nEq;.
29140 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
29150 6e 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e 53  nSkip = saved_nS
29160 6b 69 70 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46  kip;.  pNew->wsF
29170 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46  lags = saved_wsF
29180 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f  lags;.  pNew->nO
29190 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
291a0 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20  .  pNew->nLTerm 
291b0 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a  = saved_nLTerm;.
291c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
291d0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 72 75  /*.** Return Tru
291e0 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  e if it is possi
291f0 62 6c 65 20 74 68 61 74 20 70 49 6e 64 65 78 20  ble that pIndex 
29200 6d 69 67 68 74 20 62 65 20 75 73 65 66 75 6c 20  might be useful 
29210 69 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69  in.** implementi
29220 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ng the ORDER BY 
29230 63 6c 61 75 73 65 20 69 6e 20 70 42 75 69 6c 64  clause in pBuild
29240 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
29250 20 46 61 6c 73 65 20 69 66 20 70 42 75 69 6c 64   False if pBuild
29260 65 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  er does not cont
29270 61 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ain an ORDER BY 
29280 63 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69 66 20  clause or.** if 
29290 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  there is no way 
292a0 66 6f 72 20 70 49 6e 64 65 78 20 74 6f 20 62 65  for pIndex to be
292b0 20 75 73 65 66 75 6c 20 69 6e 20 69 6d 70 6c 65   useful in imple
292c0 6d 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20  menting that.** 
292d0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
292e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
292f0 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74  ndexMightHelpWit
29300 68 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65 72  hOrderBy(.  Wher
29310 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
29320 75 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65 78 20  uilder,.  Index 
29330 2a 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74 20 69  *pIndex,.  int i
29340 43 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78 70 72  Cursor.){.  Expr
29350 4c 69 73 74 20 2a 70 4f 42 3b 0a 20 20 69 6e 74  List *pOB;.  int
29360 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28 20   ii, jj;..  if( 
29370 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72  pIndex->bUnorder
29380 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ed ) return 0;. 
29390 20 69 66 28 20 28 70 4f 42 20 3d 20 70 42 75 69   if( (pOB = pBui
293a0 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f  lder->pWInfo->pO
293b0 72 64 65 72 42 79 29 3d 3d 30 20 29 20 72 65 74  rderBy)==0 ) ret
293c0 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 69 3d  urn 0;.  for(ii=
293d0 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45 78 70 72  0; ii<pOB->nExpr
293e0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  ; ii++){.    Exp
293f0 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c 69 74  r *pExpr = sqlit
29400 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
29410 65 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45 78  e(pOB->a[ii].pEx
29420 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78  pr);.    if( pEx
29430 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
29440 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  N ) return 0;.  
29450 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
29460 62 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a  ble==iCursor ){.
29470 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20        for(jj=0; 
29480 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43  jj<pIndex->nKeyC
29490 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20  ol; jj++){.     
294a0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
294b0 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 61  olumn==pIndex->a
294c0 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 20 29 20 72 65  iColumn[jj] ) re
294d0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
294e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
294f0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
29500 65 74 75 72 6e 20 61 20 62 69 74 6d 61 73 6b 20  eturn a bitmask 
29510 77 68 65 72 65 20 31 73 20 69 6e 64 69 63 61 74  where 1s indicat
29520 65 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65  e that the corre
29530 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20  sponding column 
29540 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  of.** the table 
29550 69 73 20 75 73 65 64 20 62 79 20 61 6e 20 69 6e  is used by an in
29560 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66  dex.  Only the f
29570 69 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73 20  irst 63 columns 
29580 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a  are considered..
29590 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
295a0 6b 20 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78  k columnsInIndex
295b0 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20  (Index *pIdx){. 
295c0 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a   Bitmask m = 0;.
295d0 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a    int j;.  for(j
295e0 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31  =pIdx->nColumn-1
295f0 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20  ; j>=0; j--){.  
29600 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e    int x = pIdx->
29610 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
29620 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20   if( x>=0 ){.   
29630 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
29640 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74  BMS-1 );.      t
29650 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d  estcase( x==BMS-
29660 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78  2 );.      if( x
29670 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d 41  <BMS-1 ) m |= MA
29680 53 4b 42 49 54 28 78 29 3b 0a 20 20 20 20 7d 0a  SKBIT(x);.    }.
29690 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a    }.  return m;.
296a0 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  }../* Check to s
296b0 65 65 20 69 66 20 61 20 70 61 72 74 69 61 6c 20  ee if a partial 
296c0 69 6e 64 65 78 20 77 69 74 68 20 70 50 61 72 74  index with pPart
296d0 49 6e 64 65 78 57 68 65 72 65 20 63 61 6e 20 62  IndexWhere can b
296e0 65 20 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68 65  e used.** in the
296f0 20 63 75 72 72 65 6e 74 20 71 75 65 72 79 2e 20   current query. 
29700 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
29710 69 74 20 63 61 6e 20 62 65 20 61 6e 64 20 66 61  it can be and fa
29720 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73  lse if not..*/.s
29730 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 55  tatic int whereU
29740 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65  sablePartialInde
29750 78 28 69 6e 74 20 69 54 61 62 2c 20 57 68 65 72  x(int iTab, Wher
29760 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78  eClause *pWC, Ex
29770 70 72 20 2a 70 57 68 65 72 65 29 7b 0a 20 20 69  pr *pWhere){.  i
29780 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72  nt i;.  WhereTer
29790 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 66 6f 72 28  m *pTerm;.  for(
297a0 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  i=0, pTerm=pWC->
297b0 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  a; i<pWC->nTerm;
297c0 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   i++, pTerm++){.
297d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
297e0 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70  xprImpliesExpr(p
297f0 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 70 57 68  Term->pExpr, pWh
29800 65 72 65 2c 20 69 54 61 62 29 20 29 20 72 65 74  ere, iTab) ) ret
29810 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
29820 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
29830 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f  Add all WhereLoo
29840 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20  p objects for a 
29850 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 6f 66 20  single table of 
29860 74 68 65 20 6a 6f 69 6e 20 77 68 65 72 65 20 74  the join where t
29870 68 65 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20 69  he table.** is i
29880 64 65 6e 66 69 65 64 20 62 79 20 70 42 75 69 6c  denfied by pBuil
29890 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e  der->pNew->iTab.
298a0 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73 20    That table is 
298b0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
298c0 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20 74 61 62  .** a b-tree tab
298d0 6c 65 2c 20 6e 6f 74 20 61 20 76 69 72 74 75 61  le, not a virtua
298e0 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  l table..**.** T
298f0 68 65 20 63 6f 73 74 73 20 28 57 68 65 72 65 4c  he costs (WhereL
29900 6f 6f 70 2e 72 52 75 6e 29 20 6f 66 20 74 68 65  oop.rRun) of the
29910 20 62 2d 74 72 65 65 20 6c 6f 6f 70 73 20 61 64   b-tree loops ad
29920 64 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ded by this func
29930 74 69 6f 6e 0a 2a 2a 20 61 72 65 20 63 61 6c 63  tion.** are calc
29940 75 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77  ulated as follow
29950 73 3a 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 66  s:.**.** For a f
29960 75 6c 6c 20 73 63 61 6e 2c 20 61 73 73 75 6d 69  ull scan, assumi
29970 6e 67 20 74 68 65 20 74 61 62 6c 65 20 28 6f 72  ng the table (or
29980 20 69 6e 64 65 78 29 20 63 6f 6e 74 61 69 6e 73   index) contains
29990 20 6e 52 6f 77 20 72 6f 77 73 3a 0a 2a 2a 0a 2a   nRow rows:.**.*
299a0 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f  *     cost = nRo
299b0 77 20 2a 20 33 2e 30 20 20 20 20 20 20 20 20 20  w * 3.0         
299c0 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 66 75             // fu
299d0 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a  ll-table scan.**
299e0 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77       cost = nRow
299f0 20 2a 20 4b 20 20 20 20 20 20 20 20 20 20 20 20   * K            
29a00 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63 61            // sca
29a10 6e 20 6f 66 20 63 6f 76 65 72 69 6e 67 20 69 6e  n of covering in
29a20 64 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20  dex.**     cost 
29a30 3d 20 6e 52 6f 77 20 2a 20 28 4b 2b 33 2e 30 29  = nRow * (K+3.0)
29a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a50 2f 2f 20 73 63 61 6e 20 6f 66 20 6e 6f 6e 2d 63  // scan of non-c
29a60 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a  overing index.**
29a70 0a 2a 2a 20 77 68 65 72 65 20 4b 20 69 73 20 61  .** where K is a
29a80 20 76 61 6c 75 65 20 62 65 74 77 65 65 6e 20 31   value between 1
29a90 2e 31 20 61 6e 64 20 33 2e 30 20 73 65 74 20 62  .1 and 3.0 set b
29aa0 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6c 61  ased on the rela
29ab0 74 69 76 65 20 0a 2a 2a 20 65 73 74 69 6d 61 74  tive .** estimat
29ac0 65 64 20 61 76 65 72 61 67 65 20 73 69 7a 65 20  ed average size 
29ad0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  of the index and
29ae0 20 74 61 62 6c 65 20 72 65 63 6f 72 64 73 2e 0a   table records..
29af0 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 64  **.** For an ind
29b00 65 78 20 73 63 61 6e 2c 20 77 68 65 72 65 20 6e  ex scan, where n
29b10 56 69 73 69 74 20 69 73 20 74 68 65 20 6e 75 6d  Visit is the num
29b20 62 65 72 20 6f 66 20 69 6e 64 65 78 20 72 6f 77  ber of index row
29b30 73 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20  s visited.** by 
29b40 74 68 65 20 73 63 61 6e 2c 20 61 6e 64 20 6e 53  the scan, and nS
29b50 65 65 6b 20 69 73 20 74 68 65 20 6e 75 6d 62 65  eek is the numbe
29b60 72 20 6f 66 20 73 65 65 6b 20 6f 70 65 72 61 74  r of seek operat
29b70 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 6f 6e  ions required on
29b80 20 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 62   .** the index b
29b90 2d 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  -tree:.**.**    
29ba0 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20   cost = nSeek * 
29bb0 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 4b 20 2a  (log(nRow) + K *
29bc0 20 6e 56 69 73 69 74 29 20 20 20 20 20 20 20 20   nVisit)        
29bd0 20 20 2f 2f 20 63 6f 76 65 72 69 6e 67 20 69 6e    // covering in
29be0 64 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20  dex.**     cost 
29bf0 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e  = nSeek * (log(n
29c00 52 6f 77 29 20 2b 20 28 4b 2b 33 2e 30 29 20 2a  Row) + (K+3.0) *
29c10 20 6e 56 69 73 69 74 29 20 20 20 20 2f 2f 20 6e   nVisit)    // n
29c20 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  on-covering inde
29c30 78 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  x.**.** Normally
29c40 2c 20 6e 53 65 65 6b 20 69 73 20 31 2e 20 6e 53  , nSeek is 1. nS
29c50 65 65 6b 20 76 61 6c 75 65 73 20 67 72 65 61 74  eek values great
29c60 65 72 20 74 68 61 6e 20 31 20 63 6f 6d 65 20 61  er than 1 come a
29c70 62 6f 75 74 20 69 66 20 74 68 65 20 0a 2a 2a 20  bout if the .** 
29c80 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 63  WHERE clause inc
29c90 6c 75 64 65 73 20 22 78 20 49 4e 20 28 2e 2e 2e  ludes "x IN (...
29ca0 2e 29 22 20 74 65 72 6d 73 20 75 73 65 64 20 69  .)" terms used i
29cb0 6e 20 70 6c 61 63 65 20 6f 66 20 22 78 3d 3f 22  n place of "x=?"
29cc0 2e 20 4f 72 20 77 68 65 6e 20 0a 2a 2a 20 69 6d  . Or when .** im
29cd0 70 6c 69 63 69 74 20 22 78 20 49 4e 20 28 53 45  plicit "x IN (SE
29ce0 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 62 6c 29  LECT x FROM tbl)
29cf0 22 20 74 65 72 6d 73 20 61 72 65 20 61 64 64 65  " terms are adde
29d00 64 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 73  d for skip-scans
29d10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29d20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
29d30 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  e(.  WhereLoopBu
29d40 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
29d50 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
29d60 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
29d70 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61    Bitmask mExtra
29d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29d90 20 45 78 74 72 61 20 70 72 65 72 65 71 75 65 73   Extra prereques
29da0 69 74 65 73 20 66 6f 72 20 75 73 69 6e 67 20 74  ites for using t
29db0 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a  his table */.){.
29dc0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
29dd0 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  nfo;          /*
29de0 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20   WHERE analysis 
29df0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64  context */.  Ind
29e00 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20  ex *pProbe;     
29e10 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
29e20 6e 64 65 78 20 77 65 20 61 72 65 20 65 76 61 6c  ndex we are eval
29e30 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65  uating */.  Inde
29e40 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20 20  x sPk;          
29e50 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61 6b          /* A fak
29e60 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 66  e index object f
29e70 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  or the primary k
29e80 65 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61  ey */.  LogEst a
29e90 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20 20  iRowEstPk[2];   
29ea0 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f 77      /* The aiRow
29eb0 4c 6f 67 45 73 74 5b 5d 20 76 61 6c 75 65 20 66  LogEst[] value f
29ec0 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78  or the sPk index
29ed0 20 2a 2f 0a 20 20 69 31 36 20 61 69 43 6f 6c 75   */.  i16 aiColu
29ee0 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20  mnPk = -1;      
29ef0 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e    /* The aColumn
29f00 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  [] value for the
29f10 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20   sPk index */.  
29f20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
29f30 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
29f40 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
29f50 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
29f60 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20  st_item *pSrc;  
29f70 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
29f80 73 65 20 62 74 72 65 65 20 74 65 72 6d 20 74 6f  se btree term to
29f90 20 61 64 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c   add */.  WhereL
29fa0 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  oop *pNew;      
29fb0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74        /* Templat
29fc0 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
29fd0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ct */.  int rc =
29fe0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
29ff0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2a000 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72  de */.  int iSor
2a010 74 49 64 78 20 3d 20 31 3b 20 20 20 20 20 20 20  tIdx = 1;       
2a020 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d      /* Index num
2a030 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b 20  ber */.  int b; 
2a040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a050 20 20 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65 61       /* A boolea
2a060 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4c 6f 67  n value */.  Log
2a070 45 73 74 20 72 53 69 7a 65 3b 20 20 20 20 20 20  Est rSize;      
2a080 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62           /* numb
2a090 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
2a0a0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67  e table */.  Log
2a0b0 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20  Est rLogSize;   
2a0c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61           /* Loga
2a0d0 72 69 74 68 6d 20 6f 66 20 74 68 65 20 6e 75 6d  rithm of the num
2a0e0 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
2a0f0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68  he table */.  Wh
2a100 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
2a110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2a120 20 70 61 72 73 65 64 20 57 48 45 52 45 20 63 6c   parsed WHERE cl
2a130 61 75 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  ause */.  Table 
2a140 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
2a150 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62        /* Table b
2a160 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a  eing queried */.
2a170 20 20 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69    .  pNew = pBui
2a180 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 57  lder->pNew;.  pW
2a190 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
2a1a0 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 54 61 62 4c  >pWInfo;.  pTabL
2a1b0 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  ist = pWInfo->pT
2a1c0 61 62 4c 69 73 74 3b 0a 20 20 70 53 72 63 20 3d  abList;.  pSrc =
2a1d0 20 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70   pTabList->a + p
2a1e0 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 70 54 61  New->iTab;.  pTa
2a1f0 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a  b = pSrc->pTab;.
2a200 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72    pWC = pBuilder
2a210 2d 3e 70 57 43 3b 0a 20 20 61 73 73 65 72 74 28  ->pWC;.  assert(
2a220 20 21 49 73 56 69 72 74 75 61 6c 28 70 53 72 63   !IsVirtual(pSrc
2a230 2d 3e 70 54 61 62 29 20 29 3b 0a 0a 20 20 69 66  ->pTab) );..  if
2a240 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29  ( pSrc->pIndex )
2a250 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49 4e 44 45  {.    /* An INDE
2a260 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 73 70  XED BY clause sp
2a270 65 63 69 66 69 65 73 20 61 20 70 61 72 74 69 63  ecifies a partic
2a280 75 6c 61 72 20 69 6e 64 65 78 20 74 6f 20 75 73  ular index to us
2a290 65 20 2a 2f 0a 20 20 20 20 70 50 72 6f 62 65 20  e */.    pProbe 
2a2a0 3d 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3b 0a  = pSrc->pIndex;.
2a2b0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 48 61 73    }else if( !Has
2a2c0 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
2a2d0 20 20 20 70 50 72 6f 62 65 20 3d 20 70 54 61 62     pProbe = pTab
2a2e0 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73  ->pIndex;.  }els
2a2f0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  e{.    /* There 
2a300 69 73 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59  is no INDEXED BY
2a310 20 63 6c 61 75 73 65 2e 20 20 43 72 65 61 74 65   clause.  Create
2a320 20 61 20 66 61 6b 65 20 49 6e 64 65 78 20 6f 62   a fake Index ob
2a330 6a 65 63 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20  ject in local.  
2a340 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 73 50    ** variable sP
2a350 6b 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 74  k to represent t
2a360 68 65 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79  he rowid primary
2a370 20 6b 65 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b   key index.  Mak
2a380 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 61  e this.    ** fa
2a390 6b 65 20 69 6e 64 65 78 20 74 68 65 20 66 69 72  ke index the fir
2a3a0 73 74 20 69 6e 20 61 20 63 68 61 69 6e 20 6f 66  st in a chain of
2a3b0 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 73 20 77   Index objects w
2a3c0 69 74 68 20 61 6c 6c 20 6f 66 20 74 68 65 20 72  ith all of the r
2a3d0 65 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63  eal.    ** indic
2a3e0 65 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a  es to follow */.
2a3f0 20 20 20 20 49 6e 64 65 78 20 2a 70 46 69 72 73      Index *pFirs
2a400 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2a410 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6f 66 20      /* First of 
2a420 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20  real indices on 
2a430 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  the table */.   
2a440 20 6d 65 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c   memset(&sPk, 0,
2a450 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b   sizeof(Index));
2a460 0a 20 20 20 20 73 50 6b 2e 6e 4b 65 79 43 6f 6c  .    sPk.nKeyCol
2a470 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69   = 1;.    sPk.ai
2a480 43 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75  Column = &aiColu
2a490 6d 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69  mnPk;.    sPk.ai
2a4a0 52 6f 77 4c 6f 67 45 73 74 20 3d 20 61 69 52 6f  RowLogEst = aiRo
2a4b0 77 45 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e  wEstPk;.    sPk.
2a4c0 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70  onError = OE_Rep
2a4d0 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54  lace;.    sPk.pT
2a4e0 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 20  able = pTab;.   
2a4f0 20 73 50 6b 2e 73 7a 49 64 78 52 6f 77 20 3d 20   sPk.szIdxRow = 
2a500 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a  pTab->szTabRow;.
2a510 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30      aiRowEstPk[0
2a520 5d 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  ] = pTab->nRowLo
2a530 67 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45  gEst;.    aiRowE
2a540 73 74 50 6b 5b 31 5d 20 3d 20 30 3b 0a 20 20 20  stPk[1] = 0;.   
2a550 20 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e   pFirst = pSrc->
2a560 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
2a570 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49    if( pSrc->notI
2a580 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20  ndexed==0 ){.   
2a590 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69     /* The real i
2a5a0 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20 74 61  ndices of the ta
2a5b0 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e  ble are only con
2a5c0 73 69 64 65 72 65 64 20 69 66 20 74 68 65 0a 20  sidered if the. 
2a5d0 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45       ** NOT INDE
2a5e0 58 45 44 20 71 75 61 6c 69 66 69 65 72 20 69 73  XED qualifier is
2a5f0 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68   omitted from th
2a600 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
2a610 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74  .      sPk.pNext
2a620 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d   = pFirst;.    }
2a630 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73  .    pProbe = &s
2a640 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20  Pk;.  }.  rSize 
2a650 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45  = pTab->nRowLogE
2a660 73 74 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d  st;.  rLogSize =
2a670 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a   estLog(rSize);.
2a680 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2a690 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
2a6a0 4e 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61  NDEX.  /* Automa
2a6b0 74 69 63 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20  tic indexes */. 
2a6c0 20 69 66 28 20 21 70 42 75 69 6c 64 65 72 2d 3e   if( !pBuilder->
2a6d0 70 4f 72 53 65 74 0a 20 20 20 26 26 20 28 70 57  pOrSet.   && (pW
2a6e0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
2a6f0 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
2a700 5f 41 75 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20  _AutoIndex)!=0. 
2a710 20 20 26 26 20 70 53 72 63 2d 3e 70 49 6e 64 65    && pSrc->pInde
2a720 78 3d 3d 30 0a 20 20 20 26 26 20 21 70 53 72 63  x==0.   && !pSrc
2a730 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 0a 20  ->viaCoroutine. 
2a740 20 20 26 26 20 21 70 53 72 63 2d 3e 6e 6f 74 49    && !pSrc->notI
2a750 6e 64 65 78 65 64 0a 20 20 20 26 26 20 48 61 73  ndexed.   && Has
2a760 52 6f 77 69 64 28 70 54 61 62 29 0a 20 20 20 26  Rowid(pTab).   &
2a770 26 20 21 70 53 72 63 2d 3e 69 73 43 6f 72 72 65  & !pSrc->isCorre
2a780 6c 61 74 65 64 0a 20 20 20 26 26 20 21 70 53 72  lated.   && !pSr
2a790 63 2d 3e 69 73 52 65 63 75 72 73 69 76 65 0a 20  c->isRecursive. 
2a7a0 20 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72   ){.    /* Gener
2a7b0 61 74 65 20 61 75 74 6f 2d 69 6e 64 65 78 20 57  ate auto-index W
2a7c0 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20  hereLoops */.   
2a7d0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
2a7e0 6d 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  m;.    WhereTerm
2a7f0 20 2a 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e   *pWCEnd = pWC->
2a800 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a  a + pWC->nTerm;.
2a810 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57      for(pTerm=pW
2a820 43 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45  C->a; rc==SQLITE
2a830 5f 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70 57 43  _OK && pTerm<pWC
2a840 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  End; pTerm++){. 
2a850 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
2a860 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e  prereqRight & pN
2a870 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63  ew->maskSelf ) c
2a880 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
2a890 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  f( termCanDriveI
2a8a0 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63  ndex(pTerm, pSrc
2a8b0 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
2a8c0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
2a8d0 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  q = 1;.        p
2a8e0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b  New->u.btree.nSk
2a8f0 69 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ip = 0;.        
2a900 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
2a910 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  ndex = 0;.      
2a920 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
2a930 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   1;.        pNew
2a940 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54  ->aLTerm[0] = pT
2a950 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  erm;.        /* 
2a960 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d 65  TUNING: One-time
2a970 20 63 6f 73 74 20 66 6f 72 20 63 6f 6d 70 75 74   cost for comput
2a980 69 6e 67 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ing the automati
2a990 63 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 20  c index is.     
2a9a0 20 20 20 2a 2a 20 61 70 70 72 6f 78 69 6d 61 74     ** approximat
2a9b0 65 6c 79 20 37 2a 4e 2a 6c 6f 67 32 28 4e 29 20  ely 7*N*log2(N) 
2a9c0 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e  where N is the n
2a9d0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
2a9e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
2a9f0 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65  table being inde
2aa00 78 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  xed. */.        
2aa10 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 72  pNew->rSetup = r
2aa20 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69 7a 65 20  LogSize + rSize 
2aa30 2b 20 32 38 3b 20 20 61 73 73 65 72 74 28 20 32  + 28;  assert( 2
2aa40 38 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  8==sqlite3LogEst
2aa50 28 37 29 20 29 3b 0a 20 20 20 20 20 20 20 20 2f  (7) );.        /
2aa60 2a 20 54 55 4e 49 4e 47 3a 20 45 61 63 68 20 69  * TUNING: Each i
2aa70 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 79 69 65 6c  ndex lookup yiel
2aa80 64 73 20 32 30 20 72 6f 77 73 20 69 6e 20 74 68  ds 20 rows in th
2aa90 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73 0a 20  e table.  This. 
2aaa0 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6d 6f 72         ** is mor
2aab0 65 20 74 68 61 6e 20 74 68 65 20 75 73 75 61 6c  e than the usual
2aac0 20 67 75 65 73 73 20 6f 66 20 31 30 20 72 6f 77   guess of 10 row
2aad0 73 2c 20 73 69 6e 63 65 20 77 65 20 68 61 76 65  s, since we have
2aae0 20 6e 6f 20 77 61 79 0a 20 20 20 20 20 20 20 20   no way.        
2aaf0 2a 2a 20 6f 66 20 6b 6e 6f 77 6e 69 6e 67 20 68  ** of knowning h
2ab00 6f 77 20 73 65 6c 65 63 74 69 76 65 20 74 68 65  ow selective the
2ab10 20 69 6e 64 65 78 20 77 69 6c 6c 20 75 6c 74 69   index will ulti
2ab20 6d 61 74 65 6c 79 20 62 65 2e 20 20 49 74 20 77  mately be.  It w
2ab30 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ould.        ** 
2ab40 6e 6f 74 20 62 65 20 75 6e 72 65 61 73 6f 6e 61  not be unreasona
2ab50 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74 68 69 73  ble to make this
2ab60 20 76 61 6c 75 65 20 6d 75 63 68 20 6c 61 72 67   value much larg
2ab70 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  er. */.        p
2ab80 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34 33 3b 20  New->nOut = 43; 
2ab90 20 61 73 73 65 72 74 28 20 34 33 3d 3d 73 71 6c   assert( 43==sql
2aba0 69 74 65 33 4c 6f 67 45 73 74 28 32 30 29 20 29  ite3LogEst(20) )
2abb0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
2abc0 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rRun = sqlite3Lo
2abd0 67 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65  gEstAdd(rLogSize
2abe0 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20  ,pNew->nOut);.  
2abf0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
2ac00 61 67 73 20 3d 20 57 48 45 52 45 5f 41 55 54 4f  ags = WHERE_AUTO
2ac10 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20 20 20 20  _INDEX;.        
2ac20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d  pNew->prereq = m
2ac30 45 78 74 72 61 20 7c 20 70 54 65 72 6d 2d 3e 70  Extra | pTerm->p
2ac40 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20  rereqRight;.    
2ac50 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2ac60 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
2ac70 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
2ac80 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
2ac90 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2aca0 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
2acb0 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  X */..  /* Loop 
2acc0 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69 63 65 73  over all indices
2acd0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 72 63  .  */.  for(; rc
2ace0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
2acf0 50 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d 70 50  Probe; pProbe=pP
2ad00 72 6f 62 65 2d 3e 70 4e 65 78 74 2c 20 69 53 6f  robe->pNext, iSo
2ad10 72 74 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69 66  rtIdx++){.    if
2ad20 28 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49  ( pProbe->pPartI
2ad30 64 78 57 68 65 72 65 21 3d 30 0a 20 20 20 20 20  dxWhere!=0.     
2ad40 26 26 20 21 77 68 65 72 65 55 73 61 62 6c 65 50  && !whereUsableP
2ad50 61 72 74 69 61 6c 49 6e 64 65 78 28 70 4e 65 77  artialIndex(pNew
2ad60 2d 3e 69 54 61 62 2c 20 70 57 43 2c 20 70 50 72  ->iTab, pWC, pPr
2ad70 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65  obe->pPartIdxWhe
2ad80 72 65 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  re) ){.      con
2ad90 74 69 6e 75 65 3b 20 20 2f 2a 20 50 61 72 74 69  tinue;  /* Parti
2ada0 61 6c 20 69 6e 64 65 78 20 69 6e 61 70 70 72 6f  al index inappro
2adb0 70 72 69 61 74 65 20 66 6f 72 20 74 68 69 73 20  priate for this 
2adc0 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 7d 0a 20  query */.    }. 
2add0 20 20 20 72 53 69 7a 65 20 3d 20 70 50 72 6f 62     rSize = pProb
2ade0 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30  e->aiRowLogEst[0
2adf0 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  ];.    pNew->u.b
2ae00 74 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20  tree.nEq = 0;.  
2ae10 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
2ae20 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 70  nSkip = 0;.    p
2ae30 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b  New->nLTerm = 0;
2ae40 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74  .    pNew->iSort
2ae50 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  Idx = 0;.    pNe
2ae60 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
2ae70 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
2ae80 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 70 4e  = mExtra;.    pN
2ae90 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65  ew->nOut = rSize
2aea0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
2aeb0 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 50 72  ree.pIndex = pPr
2aec0 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64  obe;.    b = ind
2aed0 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f  exMightHelpWithO
2aee0 72 64 65 72 42 79 28 70 42 75 69 6c 64 65 72 2c  rderBy(pBuilder,
2aef0 20 70 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69   pProbe, pSrc->i
2af00 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20  Cursor);.    /* 
2af10 54 68 65 20 4f 4e 45 50 41 53 53 5f 44 45 53 49  The ONEPASS_DESI
2af20 52 45 44 20 66 6c 61 67 73 20 6e 65 76 65 72 20  RED flags never 
2af30 6f 63 63 75 72 73 20 74 6f 67 65 74 68 65 72 20  occurs together 
2af40 77 69 74 68 20 4f 52 44 45 52 20 42 59 20 2a 2f  with ORDER BY */
2af50 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 57  .    assert( (pW
2af60 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
2af70 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
2af80 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20  _DESIRED)==0 || 
2af90 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  b==0 );.    if( 
2afa0 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20  pProbe->tnum<=0 
2afb0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74 65  ){.      /* Inte
2afc0 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20  ger primary key 
2afd0 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70  index */.      p
2afe0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
2aff0 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20  HERE_IPK;..     
2b000 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73   /* Full table s
2b010 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  can */.      pNe
2b020 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20  w->iSortIdx = b 
2b030 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a  ? iSortIdx : 0;.
2b040 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
2b050 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74 61   Cost of full ta
2b060 62 6c 65 20 73 63 61 6e 20 69 73 20 28 4e 2a 33  ble scan is (N*3
2b070 2e 30 29 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e  .0). */.      pN
2b080 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65  ew->rRun = rSize
2b090 20 2b 20 31 36 3b 0a 20 20 20 20 20 20 77 68 65   + 16;.      whe
2b0a0 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75  reLoopOutputAdju
2b0b0 73 74 28 70 57 43 2c 20 70 4e 65 77 29 3b 0a 20  st(pWC, pNew);. 
2b0c0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
2b0d0 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
2b0e0 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
2b0f0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53   pNew->nOut = rS
2b100 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ize;.      if( r
2b110 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  c ) break;.    }
2b120 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d  else{.      Bitm
2b130 61 73 6b 20 6d 3b 0a 20 20 20 20 20 20 69 66 28  ask m;.      if(
2b140 20 70 50 72 6f 62 65 2d 3e 69 73 43 6f 76 65 72   pProbe->isCover
2b150 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ing ){.        p
2b160 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
2b170 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20  HERE_IDX_ONLY | 
2b180 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20  WHERE_INDEXED;. 
2b190 20 20 20 20 20 20 20 6d 20 3d 20 30 3b 0a 20 20         m = 0;.  
2b1a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b1b0 20 20 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c     m = pSrc->col
2b1c0 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49  Used & ~columnsI
2b1d0 6e 49 6e 64 65 78 28 70 50 72 6f 62 65 29 3b 0a  nIndex(pProbe);.
2b1e0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73          pNew->ws
2b1f0 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30 29 20 3f  Flags = (m==0) ?
2b200 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59   (WHERE_IDX_ONLY
2b210 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 20  |WHERE_INDEXED) 
2b220 3a 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b  : WHERE_INDEXED;
2b230 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2b240 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76 69 61  /* Full scan via
2b250 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
2b260 69 66 28 20 62 0a 20 20 20 20 20 20 20 7c 7c 20  if( b.       || 
2b270 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 0a  !HasRowid(pTab).
2b280 20 20 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30         || ( m==0
2b290 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 72  .         && pPr
2b2a0 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d  obe->bUnordered=
2b2b0 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
2b2c0 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77  pProbe->szIdxRow
2b2d0 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 29  <pTab->szTabRow)
2b2e0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57  .         && (pW
2b2f0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
2b300 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
2b310 5f 44 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20  _DESIRED)==0.   
2b320 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
2b330 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73  GlobalConfig.bUs
2b340 65 43 69 73 0a 20 20 20 20 20 20 20 20 20 26 26  eCis.         &&
2b350 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
2b360 62 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61  bled(pWInfo->pPa
2b370 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f  rse->db, SQLITE_
2b380 43 6f 76 65 72 49 64 78 53 63 61 6e 29 0a 20 20  CoverIdxScan).  
2b390 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20          ).      
2b3a0 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
2b3b0 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20  >iSortIdx = b ? 
2b3c0 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 0a 20  iSortIdx : 0;.. 
2b3d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
2b3e0 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20 74  st of visiting t
2b3f0 68 65 20 69 6e 64 65 78 20 72 6f 77 73 20 69 73  he index rows is
2b400 20 4e 2a 4b 2c 20 77 68 65 72 65 20 4b 20 69 73   N*K, where K is
2b410 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 74 77  .        ** betw
2b420 65 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30 2c  een 1.1 and 3.0,
2b430 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
2b440 65 20 72 65 6c 61 74 69 76 65 20 73 69 7a 65 73  e relative sizes
2b450 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
2b460 2a 2a 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62  ** index and tab
2b470 6c 65 20 72 6f 77 73 2e 20 49 66 20 74 68 69 73  le rows. If this
2b480 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69   is a non-coveri
2b490 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 2c 0a 20  ng index scan,. 
2b4a0 20 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20 61         ** also a
2b4b0 64 64 20 74 68 65 20 63 6f 73 74 20 6f 66 20 76  dd the cost of v
2b4c0 69 73 69 74 69 6e 67 20 74 61 62 6c 65 20 72 6f  isiting table ro
2b4d0 77 73 20 28 4e 2a 33 2e 30 29 2e 20 20 2a 2f 0a  ws (N*3.0).  */.
2b4e0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
2b4f0 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31 20 2b  un = rSize + 1 +
2b500 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49   (15*pProbe->szI
2b510 64 78 52 6f 77 29 2f 70 54 61 62 2d 3e 73 7a 54  dxRow)/pTab->szT
2b520 61 62 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 69  abRow;.        i
2b530 66 28 20 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20  f( m!=0 ){.     
2b540 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
2b550 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
2b560 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 72  dd(pNew->rRun, r
2b570 53 69 7a 65 2b 31 36 29 3b 0a 20 20 20 20 20 20  Size+16);.      
2b580 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 77 68 65    }..        whe
2b590 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75  reLoopOutputAdju
2b5a0 73 74 28 70 57 43 2c 20 70 4e 65 77 29 3b 0a 20  st(pWC, pNew);. 
2b5b0 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
2b5c0 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
2b5d0 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
2b5e0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
2b5f0 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  = rSize;.       
2b600 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
2b610 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2b620 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2b630 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28  opAddBtreeIndex(
2b640 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20  pBuilder, pSrc, 
2b650 70 50 72 6f 62 65 2c 20 30 29 3b 0a 23 69 66 64  pProbe, 0);.#ifd
2b660 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2b670 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
2b680 20 20 20 20 73 71 6c 69 74 65 33 53 74 61 74 34      sqlite3Stat4
2b690 50 72 6f 62 65 46 72 65 65 28 70 42 75 69 6c 64  ProbeFree(pBuild
2b6a0 65 72 2d 3e 70 52 65 63 29 3b 0a 20 20 20 20 70  er->pRec);.    p
2b6b0 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
2b6c0 69 64 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 69  id = 0;.    pBui
2b6d0 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a  lder->pRec = 0;.
2b6e0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
2b6f0 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49  f there was an I
2b700 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
2b710 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74  , then only that
2b720 20 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20   one index is.  
2b730 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e    ** considered.
2b740 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63   */.    if( pSrc
2b750 2d 3e 70 49 6e 64 65 78 20 29 20 62 72 65 61 6b  ->pIndex ) break
2b760 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2b770 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
2b780 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2b790 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 64 64  LTABLE./*.** Add
2b7a0 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f   all WhereLoop o
2b7b0 62 6a 65 63 74 73 20 66 6f 72 20 61 20 74 61 62  bjects for a tab
2b7c0 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69  le of the join i
2b7d0 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20  dentified by.** 
2b7e0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
2b7f0 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c  iTab.  That tabl
2b800 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
2b810 74 6f 20 62 65 20 61 20 76 69 72 74 75 61 6c 20  to be a virtual 
2b820 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
2b830 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
2b840 64 56 69 72 74 75 61 6c 28 0a 20 20 57 68 65 72  dVirtual(.  Wher
2b850 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
2b860 75 69 6c 64 65 72 2c 20 20 2f 2a 20 57 48 45 52  uilder,  /* WHER
2b870 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61  E clause informa
2b880 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73  tion */.  Bitmas
2b890 6b 20 6d 45 78 74 72 61 0a 29 7b 0a 20 20 57 68  k mExtra.){.  Wh
2b8a0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
2b8b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48             /* WH
2b8c0 45 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e  ERE analysis con
2b8d0 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20  text */.  Parse 
2b8e0 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
2b8f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
2b900 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
2b910 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
2b920 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20  pWC;            
2b930 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
2b940 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
2b950 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
2b960 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f  rc;   /* The FRO
2b970 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
2b980 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 54 61 62   search */.  Tab
2b990 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69  le *pTab;.  sqli
2b9a0 74 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74  te3 *db;.  sqlit
2b9b0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
2b9c0 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63  IdxInfo;.  struc
2b9d0 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
2b9e0 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78  constraint *pIdx
2b9f0 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73  Cons;.  struct s
2ba00 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
2ba10 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70  straint_usage *p
2ba20 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65  Usage;.  WhereTe
2ba30 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74  rm *pTerm;.  int
2ba40 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 69 54 65   i, j;.  int iTe
2ba50 72 6d 2c 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e  rm, mxTerm;.  in
2ba60 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  t nConstraint;. 
2ba70 20 69 6e 74 20 73 65 65 6e 49 6e 20 3d 20 30 3b   int seenIn = 0;
2ba80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ba90 20 54 72 75 65 20 69 66 20 61 6e 20 49 4e 20 6f   True if an IN o
2baa0 70 65 72 61 74 6f 72 20 69 73 20 73 65 65 6e 20  perator is seen 
2bab0 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6e 56 61 72  */.  int seenVar
2bac0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2bad0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6e    /* True if a n
2bae0 6f 6e 2d 63 6f 6e 73 74 61 6e 74 20 63 6f 6e 73  on-constant cons
2baf0 74 72 61 69 6e 74 20 69 73 20 73 65 65 6e 20 2a  traint is seen *
2bb00 2f 0a 20 20 69 6e 74 20 69 50 68 61 73 65 3b 20  /.  int iPhase; 
2bb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb20 20 2f 2a 20 30 3a 20 63 6f 6e 73 74 20 77 2f 6f   /* 0: const w/o
2bb30 20 49 4e 2c 20 31 3a 20 63 6f 6e 73 74 2c 20 32   IN, 1: const, 2
2bb40 3a 20 6e 6f 20 49 4e 2c 20 20 32 3a 20 49 4e 20  : no IN,  2: IN 
2bb50 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
2bb60 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pNew;.  int rc =
2bb70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70   SQLITE_OK;..  p
2bb80 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
2bb90 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72  ->pWInfo;.  pPar
2bba0 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
2bbb0 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  rse;.  db = pPar
2bbc0 73 65 2d 3e 64 62 3b 0a 20 20 70 57 43 20 3d 20  se->db;.  pWC = 
2bbd0 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20  pBuilder->pWC;. 
2bbe0 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72   pNew = pBuilder
2bbf0 2d 3e 70 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d  ->pNew;.  pSrc =
2bc00 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69   &pWInfo->pTabLi
2bc10 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62  st->a[pNew->iTab
2bc20 5d 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63  ];.  pTab = pSrc
2bc30 2d 3e 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74  ->pTab;.  assert
2bc40 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
2bc50 29 20 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f 20  ) );.  pIdxInfo 
2bc60 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49  = allocateIndexI
2bc70 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 57 43 2c  nfo(pParse, pWC,
2bc80 20 70 53 72 63 2c 20 70 42 75 69 6c 64 65 72 2d   pSrc, pBuilder-
2bc90 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66  >pOrderBy);.  if
2bca0 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 20  ( pIdxInfo==0 ) 
2bcb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2bcc0 4d 45 4d 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65  MEM;.  pNew->pre
2bcd0 72 65 71 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  req = 0;.  pNew-
2bce0 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 70  >rSetup = 0;.  p
2bcf0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
2bd00 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
2bd10 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  E;.  pNew->nLTer
2bd20 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75  m = 0;.  pNew->u
2bd30 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
2bd40 20 30 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 70   0;.  pUsage = p
2bd50 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
2bd60 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 6e 43 6f  aintUsage;.  nCo
2bd70 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49  nstraint = pIdxI
2bd80 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
2bd90 3b 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f  ;.  if( whereLoo
2bda0 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77  pResize(db, pNew
2bdb0 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 20 29  , nConstraint) )
2bdc0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
2bdd0 72 65 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f  ree(db, pIdxInfo
2bde0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
2bdf0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
2be00 0a 20 20 66 6f 72 28 69 50 68 61 73 65 3d 30 3b  .  for(iPhase=0;
2be10 20 69 50 68 61 73 65 3c 3d 33 3b 20 69 50 68 61   iPhase<=3; iPha
2be20 73 65 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21  se++){.    if( !
2be30 73 65 65 6e 49 6e 20 26 26 20 28 69 50 68 61 73  seenIn && (iPhas
2be40 65 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  e&1)!=0 ){.     
2be50 20 69 50 68 61 73 65 2b 2b 3b 0a 20 20 20 20 20   iPhase++;.     
2be60 20 69 66 28 20 69 50 68 61 73 65 3e 33 20 29 20   if( iPhase>3 ) 
2be70 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
2be80 20 69 66 28 20 21 73 65 65 6e 56 61 72 20 26 26   if( !seenVar &&
2be90 20 69 50 68 61 73 65 3e 31 20 29 20 62 72 65 61   iPhase>1 ) brea
2bea0 6b 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20  k;.    pIdxCons 
2beb0 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74  = *(struct sqlit
2bec0 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
2bed0 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  int**)&pIdxInfo-
2bee0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >aConstraint;.  
2bef0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
2bf00 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
2bf10 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e  nt; i++, pIdxCon
2bf20 73 2b 2b 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20  s++){.      j = 
2bf30 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f  pIdxCons->iTermO
2bf40 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 54 65  ffset;.      pTe
2bf50 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b  rm = &pWC->a[j];
2bf60 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 69  .      switch( i
2bf70 50 68 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20  Phase ){.       
2bf80 20 63 61 73 65 20 30 3a 20 20 20 20 2f 2a 20 43   case 0:    /* C
2bf90 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 6f 75 74  onstants without
2bfa0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
2bfb0 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f            pIdxCo
2bfc0 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a  ns->usable = 0;.
2bfd0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
2bfe0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
2bff0 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20  & WO_IN)!=0 ){. 
2c000 20 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 49             seenI
2c010 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
2c020 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
2c030 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
2c040 67 68 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ght!=0 ){.      
2c050 20 20 20 20 20 20 73 65 65 6e 56 61 72 20 3d 20        seenVar = 
2c060 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  1;.          }el
2c070 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65  se if( (pTerm->e
2c080 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
2c090 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2c0a0 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73      pIdxCons->us
2c0b0 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  able = 1;.      
2c0c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2c0d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
2c0e0 61 73 65 20 31 3a 20 20 20 20 2f 2a 20 43 6f 6e  ase 1:    /* Con
2c0f0 73 74 61 6e 74 73 20 77 69 74 68 20 49 4e 20 6f  stants with IN o
2c100 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20  perators */.    
2c110 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65        assert( se
2c120 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  enIn );.        
2c130 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
2c140 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65  le = (pTerm->pre
2c150 72 65 71 52 69 67 68 74 3d 3d 30 29 3b 0a 20 20  reqRight==0);.  
2c160 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2c170 20 20 20 20 20 20 20 63 61 73 65 20 32 3a 20 20         case 2:  
2c180 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 77    /* Variables w
2c190 69 74 68 6f 75 74 20 49 4e 20 2a 2f 0a 20 20 20  ithout IN */.   
2c1a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
2c1b0 65 65 6e 56 61 72 20 29 3b 0a 20 20 20 20 20 20  eenVar );.      
2c1c0 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73      pIdxCons->us
2c1d0 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 65  able = (pTerm->e
2c1e0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
2c1f0 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20  )==0;.          
2c200 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 64  break;.        d
2c210 65 66 61 75 6c 74 3a 20 20 20 2f 2a 20 56 61 72  efault:   /* Var
2c220 69 61 62 6c 65 73 20 77 69 74 68 20 49 4e 20 2a  iables with IN *
2c230 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
2c240 72 74 28 20 73 65 65 6e 56 61 72 20 26 26 20 73  rt( seenVar && s
2c250 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20 20  eenIn );.       
2c260 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
2c270 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ble = 1;.       
2c280 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2c290 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  }.    }.    mems
2c2a0 65 74 28 70 55 73 61 67 65 2c 20 30 2c 20 73 69  et(pUsage, 0, si
2c2b0 7a 65 6f 66 28 70 55 73 61 67 65 5b 30 5d 29 2a  zeof(pUsage[0])*
2c2c0 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
2c2d0 72 61 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  raint);.    if( 
2c2e0 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
2c2f0 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71 6c  FreeIdxStr ) sql
2c300 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e  ite3_free(pIdxIn
2c310 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20  fo->idxStr);.   
2c320 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74   pIdxInfo->idxSt
2c330 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49  r = 0;.    pIdxI
2c340 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b  nfo->idxNum = 0;
2c350 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  .    pIdxInfo->n
2c360 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
2c370 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 0;.    pIdxInf
2c380 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  o->orderByConsum
2c390 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78  ed = 0;.    pIdx
2c3a0 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
2c3b0 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47  ost = SQLITE_BIG
2c3c0 5f 44 42 4c 20 2f 20 28 64 6f 75 62 6c 65 29 32  _DBL / (double)2
2c3d0 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
2c3e0 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20  estimatedRows = 
2c3f0 32 35 3b 0a 20 20 20 20 72 63 20 3d 20 76 74 61  25;.    rc = vta
2c400 62 42 65 73 74 49 6e 64 65 78 28 70 50 61 72 73  bBestIndex(pPars
2c410 65 2c 20 70 54 61 62 2c 20 70 49 64 78 49 6e 66  e, pTab, pIdxInf
2c420 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  o);.    if( rc )
2c430 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41   goto whereLoopA
2c440 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20  ddVtab_exit;.   
2c450 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74   pIdxCons = *(st
2c460 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
2c470 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29  ex_constraint**)
2c480 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
2c490 74 72 61 69 6e 74 3b 0a 20 20 20 20 70 4e 65 77  traint;.    pNew
2c4a0 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72  ->prereq = mExtr
2c4b0 61 3b 0a 20 20 20 20 6d 78 54 65 72 6d 20 3d 20  a;.    mxTerm = 
2c4c0 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  -1;.    assert( 
2c4d0 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43  pNew->nLSlot>=nC
2c4e0 6f 6e 73 74 72 61 69 6e 74 20 29 3b 0a 20 20 20  onstraint );.   
2c4f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e   for(i=0; i<nCon
2c500 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e  straint; i++) pN
2c510 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20  ew->aLTerm[i] = 
2c520 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76  0;.    pNew->u.v
2c530 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20 30  tab.omitMask = 0
2c540 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2c550 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  <nConstraint; i+
2c560 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a  +, pIdxCons++){.
2c570 20 20 20 20 20 20 69 66 28 20 28 69 54 65 72 6d        if( (iTerm
2c580 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67   = pUsage[i].arg
2c590 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20 29  vIndex - 1)>=0 )
2c5a0 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 49  {.        j = pI
2c5b0 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66  dxCons->iTermOff
2c5c0 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  set;.        if(
2c5d0 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61   iTerm>=nConstra
2c5e0 69 6e 74 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  int.         || 
2c5f0 6a 3c 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  j<0.         || 
2c600 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20  j>=pWC->nTerm.  
2c610 20 20 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e         || pNew->
2c620 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30  aLTerm[iTerm]!=0
2c630 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
2c640 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2c650 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
2c660 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2c670 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 2e 78  sg(pParse, "%s.x
2c680 42 65 73 74 49 6e 64 65 78 28 29 20 6d 61 6c 66  BestIndex() malf
2c690 75 6e 63 74 69 6f 6e 22 2c 20 70 54 61 62 2d 3e  unction", pTab->
2c6a0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
2c6b0 20 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70    goto whereLoop
2c6c0 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20  AddVtab_exit;.  
2c6d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c6e0 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d  testcase( iTerm=
2c6f0 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29  =nConstraint-1 )
2c700 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
2c710 73 65 28 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20  se( j==0 );.    
2c720 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d      testcase( j=
2c730 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b  =pWC->nTerm-1 );
2c740 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
2c750 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20   &pWC->a[j];.   
2c760 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
2c770 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72  q |= pTerm->prer
2c780 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  eqRight;.       
2c790 20 61 73 73 65 72 74 28 20 69 54 65 72 6d 3c 70   assert( iTerm<p
2c7a0 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20  New->nLSlot );. 
2c7b0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54         pNew->aLT
2c7c0 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20 70 54 65  erm[iTerm] = pTe
2c7d0 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rm;.        if( 
2c7e0 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29 20 6d  iTerm>mxTerm ) m
2c7f0 78 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b 0a 20  xTerm = iTerm;. 
2c800 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2c810 20 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20   iTerm==15 );.  
2c820 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2c830 69 54 65 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20  iTerm==16 );.   
2c840 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3c 31       if( iTerm<1
2c850 36 20 26 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f  6 && pUsage[i].o
2c860 6d 69 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74  mit ) pNew->u.vt
2c870 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31  ab.omitMask |= 1
2c880 3c 3c 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  <<iTerm;.       
2c890 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
2c8a0 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21  erator & WO_IN)!
2c8b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2c8c0 69 66 28 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d  if( pUsage[i].om
2c8d0 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
2c8e0 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61       /* Do not a
2c8f0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 6e  ttempt to use an
2c900 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 69   IN constraint i
2c910 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  f the virtual ta
2c920 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ble.            
2c930 2a 2a 20 73 61 79 73 20 74 68 61 74 20 74 68 65  ** says that the
2c940 20 65 71 75 69 76 61 6c 65 6e 74 20 45 51 20 63   equivalent EQ c
2c950 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74  onstraint cannot
2c960 20 62 65 20 73 61 66 65 6c 79 20 6f 6d 69 74 74   be safely omitt
2c970 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed..            
2c980 2a 2a 20 49 66 20 77 65 20 64 6f 20 61 74 74 65  ** If we do atte
2c990 6d 70 74 20 74 6f 20 75 73 65 20 73 75 63 68 20  mpt to use such 
2c9a0 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 73 6f  a constraint, so
2c9b0 6d 65 20 72 6f 77 73 20 6d 69 67 68 74 20 62 65  me rows might be
2c9c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2c9d0 72 65 70 65 61 74 65 64 20 69 6e 20 74 68 65 20  repeated in the 
2c9e0 6f 75 74 70 75 74 2e 20 2a 2f 0a 20 20 20 20 20  output. */.     
2c9f0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2ca00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ca10 20 20 20 20 2f 2a 20 41 20 76 69 72 74 75 61 6c      /* A virtual
2ca20 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 63   table that is c
2ca30 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 61 6e  onstrained by an
2ca40 20 49 4e 20 63 6c 61 75 73 65 20 6d 61 79 20 6e   IN clause may n
2ca50 6f 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ot.          ** 
2ca60 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52 44 45  consume the ORDE
2ca70 52 20 42 59 20 63 6c 61 75 73 65 20 62 65 63 61  R BY clause beca
2ca80 75 73 65 20 28 31 29 20 74 68 65 20 6f 72 64 65  use (1) the orde
2ca90 72 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20 20  r of IN terms.  
2caa0 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f          ** is no
2cab0 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65  t necessarily re
2cac0 6c 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64  lated to the ord
2cad0 65 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72  er of output ter
2cae0 6d 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  ms and.         
2caf0 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c 65   ** (2) Multiple
2cb00 20 6f 75 74 70 75 74 73 20 66 72 6f 6d 20 61 20   outputs from a 
2cb10 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65 20  single IN value 
2cb20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20  will not merge. 
2cb30 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 67 65           ** toge
2cb40 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ther.  */.      
2cb50 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72      pIdxInfo->or
2cb60 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20  derByConsumed = 
2cb70 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
2cb80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2cb90 66 28 20 69 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e  f( i>=nConstrain
2cba0 74 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  t ){.      pNew-
2cbb0 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d  >nLTerm = mxTerm
2cbc0 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +1;.      assert
2cbd0 28 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d  ( pNew->nLTerm<=
2cbe0 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a  pNew->nLSlot );.
2cbf0 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74        pNew->u.vt
2cc00 61 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64 78  ab.idxNum = pIdx
2cc10 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20  Info->idxNum;.  
2cc20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
2cc30 2e 6e 65 65 64 46 72 65 65 20 3d 20 70 49 64 78  .needFree = pIdx
2cc40 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
2cc50 49 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70 49  IdxStr;.      pI
2cc60 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
2cc70 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  eeIdxStr = 0;.  
2cc80 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
2cc90 2e 69 64 78 53 74 72 20 3d 20 70 49 64 78 49 6e  .idxStr = pIdxIn
2cca0 66 6f 2d 3e 69 64 78 53 74 72 3b 0a 20 20 20 20  fo->idxStr;.    
2ccb0 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69    pNew->u.vtab.i
2ccc0 73 4f 72 64 65 72 65 64 20 3d 20 28 69 38 29 28  sOrdered = (i8)(
2ccd0 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
2cce0 79 43 6f 6e 73 75 6d 65 64 20 3f 0a 20 20 20 20  yConsumed ?.    
2ccf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd10 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64    pIdxInfo->nOrd
2cd20 65 72 42 79 20 3a 20 30 29 3b 0a 20 20 20 20 20  erBy : 0);.     
2cd30 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
2cd40 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  0;.      pNew->r
2cd50 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
2cd60 45 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28 70 49  EstFromDouble(pI
2cd70 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
2cd80 64 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 70 4e  dCost);.      pN
2cd90 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74  ew->nOut = sqlit
2cda0 65 33 4c 6f 67 45 73 74 28 70 49 64 78 49 6e 66  e3LogEst(pIdxInf
2cdb0 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73  o->estimatedRows
2cdc0 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  );.      whereLo
2cdd0 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
2cde0 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
2cdf0 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  if( pNew->u.vtab
2ce00 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20  .needFree ){.   
2ce10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2ce20 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69  e(pNew->u.vtab.i
2ce30 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 20 20  dxStr);.        
2ce40 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
2ce50 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20  dFree = 0;.     
2ce60 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 0a   }.    }.  }  ..
2ce70 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62  whereLoopAddVtab
2ce80 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 70 49 64  _exit:.  if( pId
2ce90 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
2cea0 65 49 64 78 53 74 72 20 29 20 73 71 6c 69 74 65  eIdxStr ) sqlite
2ceb0 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d  3_free(pIdxInfo-
2cec0 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69  >idxStr);.  sqli
2ced0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
2cee0 64 78 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72  dxInfo);.  retur
2cef0 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
2cf00 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
2cf10 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f  RTUALTABLE */../
2cf20 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72 65 4c 6f  *.** Add WhereLo
2cf30 6f 70 20 65 6e 74 72 69 65 73 20 74 6f 20 68 61  op entries to ha
2cf40 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20 20  ndle OR terms.  
2cf50 54 68 69 73 20 77 6f 72 6b 73 20 66 6f 72 20 65  This works for e
2cf60 69 74 68 65 72 0a 2a 2a 20 62 74 72 65 65 73 20  ither.** btrees 
2cf70 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  or virtual table
2cf80 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2cf90 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28   whereLoopAddOr(
2cfa0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
2cfb0 20 2a 70 42 75 69 6c 64 65 72 2c 20 42 69 74 6d   *pBuilder, Bitm
2cfc0 61 73 6b 20 6d 45 78 74 72 61 29 7b 0a 20 20 57  ask mExtra){.  W
2cfd0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
2cfe0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
2cff0 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43 6c 61 75  nfo;.  WhereClau
2d000 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65  se *pWC;.  Where
2d010 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68  Loop *pNew;.  Wh
2d020 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
2d030 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72  *pWCEnd;.  int r
2d040 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2d050 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 57 68 65   int iCur;.  Whe
2d060 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43 3b  reClause tempWC;
2d070 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
2d080 64 65 72 20 73 53 75 62 42 75 69 6c 64 3b 0a 20  der sSubBuild;. 
2d090 20 57 68 65 72 65 4f 72 53 65 74 20 73 53 75 6d   WhereOrSet sSum
2d0a0 2c 20 73 43 75 72 3b 0a 20 20 73 74 72 75 63 74  , sCur;.  struct
2d0b0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2d0c0 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57 43 20 3d  Item;.  .  pWC =
2d0d0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
2d0e0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63    if( pWInfo->wc
2d0f0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2d100 5f 41 4e 44 5f 4f 4e 4c 59 20 29 20 72 65 74 75  _AND_ONLY ) retu
2d110 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2d120 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20  pWCEnd = pWC->a 
2d130 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20  + pWC->nTerm;.  
2d140 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
2d150 3e 70 4e 65 77 3b 0a 20 20 6d 65 6d 73 65 74 28  >pNew;.  memset(
2d160 26 73 53 75 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  &sSum, 0, sizeof
2d170 28 73 53 75 6d 29 29 3b 0a 20 20 70 49 74 65 6d  (sSum));.  pItem
2d180 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
2d190 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69  ist->a + pNew->i
2d1a0 54 61 62 3b 0a 20 20 69 43 75 72 20 3d 20 70 49  Tab;.  iCur = pI
2d1b0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 0a 20  tem->iCursor;.. 
2d1c0 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
2d1d0 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 20  a; pTerm<pWCEnd 
2d1e0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
2d1f0 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
2d200 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
2d210 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d  rator & WO_OR)!=
2d220 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72 6d  0.     && (pTerm
2d230 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64  ->u.pOrInfo->ind
2d240 65 78 61 62 6c 65 20 26 20 70 4e 65 77 2d 3e 6d  exable & pNew->m
2d250 61 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20 20 20  askSelf)!=0 .   
2d260 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 43   ){.      WhereC
2d270 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f  lause * const pO
2d280 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e  rWC = &pTerm->u.
2d290 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  pOrInfo->wc;.   
2d2a0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20 63     WhereTerm * c
2d2b0 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20 3d 20  onst pOrWCEnd = 
2d2c0 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d  &pOrWC->a[pOrWC-
2d2d0 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57  >nTerm];.      W
2d2e0 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72  hereTerm *pOrTer
2d2f0 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63  m;.      int onc
2d300 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74  e = 1;.      int
2d310 20 69 2c 20 6a 3b 0a 20 20 20 20 0a 20 20 20 20   i, j;.    .    
2d320 20 20 73 53 75 62 42 75 69 6c 64 20 3d 20 2a 70    sSubBuild = *p
2d330 42 75 69 6c 64 65 72 3b 0a 20 20 20 20 20 20 73  Builder;.      s
2d340 53 75 62 42 75 69 6c 64 2e 70 4f 72 64 65 72 42  SubBuild.pOrderB
2d350 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 53 75  y = 0;.      sSu
2d360 62 42 75 69 6c 64 2e 70 4f 72 53 65 74 20 3d 20  bBuild.pOrSet = 
2d370 26 73 43 75 72 3b 0a 0a 20 20 20 20 20 20 66 6f  &sCur;..      fo
2d380 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d  r(pOrTerm=pOrWC-
2d390 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57  >a; pOrTerm<pOrW
2d3a0 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29  CEnd; pOrTerm++)
2d3b0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
2d3c0 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
2d3d0 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29  r & WO_AND)!=0 )
2d3e0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 62  {.          sSub
2d3f0 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 70 4f 72  Build.pWC = &pOr
2d400 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f  Term->u.pAndInfo
2d410 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 7d 65  ->wc;.        }e
2d420 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  lse if( pOrTerm-
2d430 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
2d440 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  r ){.          t
2d450 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d 20 70  empWC.pWInfo = p
2d460 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 20 20  WC->pWInfo;.    
2d470 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4f 75        tempWC.pOu
2d480 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20  ter = pWC;.     
2d490 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d       tempWC.op =
2d4a0 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20   TK_AND;.       
2d4b0 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20     tempWC.nTerm 
2d4c0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74  = 1;.          t
2d4d0 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54 65 72  empWC.a = pOrTer
2d4e0 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  m;.          sSu
2d4f0 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 74 65  bBuild.pWC = &te
2d500 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20 7d 65  mpWC;.        }e
2d510 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
2d520 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2d530 20 7d 0a 20 20 20 20 20 20 20 20 73 43 75 72 2e   }.        sCur.
2d540 6e 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  n = 0;.#ifndef S
2d550 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2d560 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20  ALTABLE.        
2d570 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 49  if( IsVirtual(pI
2d580 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20  tem->pTab) ){.  
2d590 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
2d5a0 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
2d5b0 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78  (&sSubBuild, mEx
2d5c0 74 72 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  tra);.        }e
2d5d0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
2d5e0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72     {.          r
2d5f0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
2d600 42 74 72 65 65 28 26 73 53 75 62 42 75 69 6c 64  Btree(&sSubBuild
2d610 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 20  , mExtra);.     
2d620 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
2d630 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
2d640 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d 30 20  OK || sCur.n==0 
2d650 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
2d660 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  Cur.n==0 ){.    
2d670 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30        sSum.n = 0
2d680 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
2d690 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
2d6a0 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20   if( once ){.   
2d6b0 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f         whereOrMo
2d6c0 76 65 28 26 73 53 75 6d 2c 20 26 73 43 75 72 29  ve(&sSum, &sCur)
2d6d0 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 6e 63 65  ;.          once
2d6e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
2d6f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 57  lse{.          W
2d700 68 65 72 65 4f 72 53 65 74 20 73 50 72 65 76 3b  hereOrSet sPrev;
2d710 0a 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65  .          where
2d720 4f 72 4d 6f 76 65 28 26 73 50 72 65 76 2c 20 26  OrMove(&sPrev, &
2d730 73 53 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  sSum);.         
2d740 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20   sSum.n = 0;.   
2d750 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
2d760 69 3c 73 50 72 65 76 2e 6e 3b 20 69 2b 2b 29 7b  i<sPrev.n; i++){
2d770 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
2d780 28 6a 3d 30 3b 20 6a 3c 73 43 75 72 2e 6e 3b 20  (j=0; j<sCur.n; 
2d790 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
2d7a0 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72      whereOrInser
2d7b0 74 28 26 73 53 75 6d 2c 20 73 50 72 65 76 2e 61  t(&sSum, sPrev.a
2d7c0 5b 69 5d 2e 70 72 65 72 65 71 20 7c 20 73 43 75  [i].prereq | sCu
2d7d0 72 2e 61 5b 6a 5d 2e 70 72 65 72 65 71 2c 0a 20  r.a[j].prereq,. 
2d7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d7f0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2d800 65 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65  e3LogEstAdd(sPre
2d810 76 2e 61 5b 69 5d 2e 72 52 75 6e 2c 20 73 43 75  v.a[i].rRun, sCu
2d820 72 2e 61 5b 6a 5d 2e 72 52 75 6e 29 2c 0a 20 20  r.a[j].rRun),.  
2d830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d840 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2d850 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65 76  3LogEstAdd(sPrev
2d860 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73 43 75 72  .a[i].nOut, sCur
2d870 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b 0a 20 20  .a[j].nOut));.  
2d880 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d890 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d8a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2d8b0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31  pNew->nLTerm = 1
2d8c0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c  ;.      pNew->aL
2d8d0 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b  Term[0] = pTerm;
2d8e0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
2d8f0 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c  lags = WHERE_MUL
2d900 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20 70 4e 65  TI_OR;.      pNe
2d910 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
2d920 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74       pNew->iSort
2d930 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d  Idx = 0;.      m
2d940 65 6d 73 65 74 28 26 70 4e 65 77 2d 3e 75 2c 20  emset(&pNew->u, 
2d950 30 2c 20 73 69 7a 65 6f 66 28 70 4e 65 77 2d 3e  0, sizeof(pNew->
2d960 75 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  u));.      for(i
2d970 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
2d980 4b 20 26 26 20 69 3c 73 53 75 6d 2e 6e 3b 20 69  K && i<sSum.n; i
2d990 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ++){.        /* 
2d9a0 54 55 4e 49 4e 47 3a 20 43 75 72 72 65 6e 74 6c  TUNING: Currentl
2d9b0 79 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e  y sSum.a[i].rRun
2d9c0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
2d9d0 75 6d 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a  um of the costs.
2d9e0 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 6c          ** of al
2d9f0 6c 20 73 75 62 2d 73 63 61 6e 73 20 72 65 71 75  l sub-scans requ
2da00 69 72 65 64 20 62 79 20 74 68 65 20 4f 52 2d 73  ired by the OR-s
2da10 63 61 6e 2e 20 48 6f 77 65 76 65 72 2c 20 64 75  can. However, du
2da20 65 20 74 6f 20 72 6f 75 6e 64 69 6e 67 0a 20 20  e to rounding.  
2da30 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 73 2c        ** errors,
2da40 20 69 74 20 6d 61 79 20 62 65 20 74 68 61 74 20   it may be that 
2da50 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20  the cost of the 
2da60 4f 52 2d 73 63 61 6e 20 69 73 20 65 71 75 61 6c  OR-scan is equal
2da70 20 74 6f 20 69 74 73 0a 20 20 20 20 20 20 20 20   to its.        
2da80 2a 2a 20 6d 6f 73 74 20 65 78 70 65 6e 73 69 76  ** most expensiv
2da90 65 20 73 75 62 2d 73 63 61 6e 2e 20 41 64 64 20  e sub-scan. Add 
2daa0 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 70 6f 73  the smallest pos
2dab0 73 69 62 6c 65 20 70 65 6e 61 6c 74 79 20 0a 20  sible penalty . 
2dac0 20 20 20 20 20 20 20 2a 2a 20 28 65 71 75 69 76         ** (equiv
2dad0 61 6c 65 6e 74 20 74 6f 20 6d 75 6c 74 69 70 6c  alent to multipl
2dae0 79 69 6e 67 20 74 68 65 20 63 6f 73 74 20 62 79  ying the cost by
2daf0 20 31 2e 30 37 29 20 74 6f 20 65 6e 73 75 72 65   1.07) to ensure
2db00 20 74 68 61 74 20 0a 20 20 20 20 20 20 20 20 2a   that .        *
2db10 2a 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20  * this does not 
2db20 68 61 70 70 65 6e 2e 20 4f 74 68 65 72 77 69 73  happen. Otherwis
2db30 65 2c 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61  e, for WHERE cla
2db40 75 73 65 73 20 73 75 63 68 20 61 73 20 74 68 65  uses such as the
2db50 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c  .        ** foll
2db60 6f 77 69 6e 67 20 77 68 65 72 65 20 74 68 65 72  owing where ther
2db70 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e  e is an index on
2db80 20 22 79 22 3a 0a 20 20 20 20 20 20 20 20 2a 2a   "y":.        **
2db90 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
2dba0 57 48 45 52 45 20 6c 69 6b 65 6c 69 68 6f 6f 64  WHERE likelihood
2dbb0 28 78 3d 3f 2c 20 30 2e 39 39 29 20 4f 52 20 79  (x=?, 0.99) OR y
2dbc0 3d 3f 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  =?.        **.  
2dbd0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6c 61        ** the pla
2dbe0 6e 6e 65 72 20 6d 61 79 20 65 6c 65 63 74 20 74  nner may elect t
2dbf0 6f 20 22 4f 52 22 20 74 6f 67 65 74 68 65 72 20  o "OR" together 
2dc00 61 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61  a full-table sca
2dc10 6e 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20 20  n and an.       
2dc20 20 2a 2a 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70   ** index lookup
2dc30 2e 20 41 6e 64 20 6f 74 68 65 72 20 73 69 6d 69  . And other simi
2dc40 6c 61 72 6c 79 20 6f 64 64 20 72 65 73 75 6c 74  larly odd result
2dc50 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  s.  */.        p
2dc60 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 53 75 6d  New->rRun = sSum
2dc70 2e 61 5b 69 5d 2e 72 52 75 6e 20 2b 20 31 3b 0a  .a[i].rRun + 1;.
2dc80 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
2dc90 75 74 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 6e  ut = sSum.a[i].n
2dca0 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  Out;.        pNe
2dcb0 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 53 75 6d  w->prereq = sSum
2dcc0 2e 61 5b 69 5d 2e 70 72 65 72 65 71 3b 0a 20 20  .a[i].prereq;.  
2dcd0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2dce0 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
2dcf0 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
2dd00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
2dd10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2dd20 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72  .** Add all Wher
2dd30 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f  eLoop objects fo
2dd40 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 0a 2a 2f  r all tables .*/
2dd50 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
2dd60 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 57 68 65 72  eLoopAddAll(Wher
2dd70 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
2dd80 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65  uilder){.  Where
2dd90 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
2dda0 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
2ddb0 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72  .  Bitmask mExtr
2ddc0 61 20 3d 20 30 3b 0a 20 20 42 69 74 6d 61 73 6b  a = 0;.  Bitmask
2ddd0 20 6d 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 69   mPrior = 0;.  i
2dde0 6e 74 20 69 54 61 62 3b 0a 20 20 53 72 63 4c 69  nt iTab;.  SrcLi
2ddf0 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70  st *pTabList = p
2de00 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
2de10 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
2de20 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
2de30 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
2de40 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
2de50 62 3b 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73  b;.  int nTabLis
2de60 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  t = pWInfo->nLev
2de70 65 6c 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  el;.  int rc = S
2de80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 70  QLITE_OK;.  u8 p
2de90 72 69 6f 72 4a 6f 69 6e 54 79 70 65 20 3d 20 30  riorJoinType = 0
2dea0 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
2deb0 4e 65 77 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  New;..  /* Loop 
2dec0 6f 76 65 72 20 74 68 65 20 74 61 62 6c 65 73 20  over the tables 
2ded0 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f  in the join, fro
2dee0 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20  m left to right 
2def0 2a 2f 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  */.  pNew = pBui
2df00 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 77 68  lder->pNew;.  wh
2df10 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 4e 65 77  ereLoopInit(pNew
2df20 29 3b 0a 20 20 66 6f 72 28 69 54 61 62 3d 30 2c  );.  for(iTab=0,
2df30 20 70 49 74 65 6d 3d 70 54 61 62 4c 69 73 74 2d   pItem=pTabList-
2df40 3e 61 3b 20 69 54 61 62 3c 6e 54 61 62 4c 69 73  >a; iTab<nTabLis
2df50 74 3b 20 69 54 61 62 2b 2b 2c 20 70 49 74 65 6d  t; iTab++, pItem
2df60 2b 2b 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  ++){.    pNew->i
2df70 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  Tab = iTab;.    
2df80 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d  pNew->maskSelf =
2df90 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
2dfa0 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 49 74 65  ->sMaskSet, pIte
2dfb0 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
2dfc0 20 69 66 28 20 28 28 70 49 74 65 6d 2d 3e 6a 6f   if( ((pItem->jo
2dfd0 69 6e 74 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e  intype|priorJoin
2dfe0 54 79 70 65 29 20 26 20 28 4a 54 5f 4c 45 46 54  Type) & (JT_LEFT
2dff0 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 20 29  |JT_CROSS))!=0 )
2e000 7b 0a 20 20 20 20 20 20 6d 45 78 74 72 61 20 3d  {.      mExtra =
2e010 20 6d 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20   mPrior;.    }. 
2e020 20 20 20 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65     priorJoinType
2e030 20 3d 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79   = pItem->jointy
2e040 70 65 3b 0a 20 20 20 20 69 66 28 20 49 73 56 69  pe;.    if( IsVi
2e050 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61  rtual(pItem->pTa
2e060 62 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  b) ){.      rc =
2e070 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
2e080 74 75 61 6c 28 70 42 75 69 6c 64 65 72 2c 20 6d  tual(pBuilder, m
2e090 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 65 6c 73  Extra);.    }els
2e0a0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  e{.      rc = wh
2e0b0 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
2e0c0 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61  pBuilder, mExtra
2e0d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2e0e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2e0f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  {.      rc = whe
2e100 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75 69  reLoopAddOr(pBui
2e110 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20  lder, mExtra);. 
2e120 20 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72 20     }.    mPrior 
2e130 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c  |= pNew->maskSel
2e140 66 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c  f;.    if( rc ||
2e150 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2e160 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  d ) break;.  }. 
2e170 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28   whereLoopClear(
2e180 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74  db, pNew);.  ret
2e190 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2e1a0 20 45 78 61 6d 69 6e 65 20 61 20 57 68 65 72 65   Examine a Where
2e1b0 50 61 74 68 20 28 77 69 74 68 20 74 68 65 20 61  Path (with the a
2e1c0 64 64 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65  ddition of the e
2e1d0 78 74 72 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f  xtra WhereLoop o
2e1e0 66 20 74 68 65 20 35 74 68 0a 2a 2a 20 70 61 72  f the 5th.** par
2e1f0 61 6d 65 74 65 72 73 29 20 74 6f 20 73 65 65 20  ameters) to see 
2e200 69 66 20 69 74 20 6f 75 74 70 75 74 73 20 72 6f  if it outputs ro
2e210 77 73 20 69 6e 20 74 68 65 20 72 65 71 75 65 73  ws in the reques
2e220 74 65 64 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20  ted ORDER BY.** 
2e230 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 77 69  (or GROUP BY) wi
2e240 74 68 6f 75 74 20 72 65 71 75 69 72 69 6e 67 20  thout requiring 
2e250 61 20 73 65 70 61 72 61 74 65 20 73 6f 72 74 20  a separate sort 
2e260 6f 70 65 72 61 74 69 6f 6e 2e 20 20 52 65 74 75  operation.  Retu
2e270 72 6e 20 4e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4e  rn N:.** .**   N
2e280 3e 30 3a 20 20 20 4e 20 74 65 72 6d 73 20 6f 66  >0:   N terms of
2e290 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2e2a0 61 75 73 65 20 61 72 65 20 73 61 74 69 73 66 69  ause are satisfi
2e2b0 65 64 0a 2a 2a 20 20 20 4e 3d 3d 30 3a 20 20 4e  ed.**   N==0:  N
2e2c0 6f 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f  o terms of the O
2e2d0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
2e2e0 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20  re satisfied.** 
2e2f0 20 20 4e 3c 30 3a 20 20 20 55 6e 6b 6e 6f 77 6e    N<0:   Unknown
2e300 20 79 65 74 20 68 6f 77 20 6d 61 6e 79 20 74 65   yet how many te
2e310 72 6d 73 20 6f 66 20 4f 52 44 45 52 20 42 59 20  rms of ORDER BY 
2e320 6d 69 67 68 74 20 62 65 20 73 61 74 69 73 66 69  might be satisfi
2e330 65 64 2e 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74  ed.   .**.** Not
2e340 65 20 74 68 61 74 20 70 72 6f 63 65 73 73 69 6e  e that processin
2e350 67 20 66 6f 72 20 57 48 45 52 45 5f 47 52 4f 55  g for WHERE_GROU
2e360 50 42 59 20 61 6e 64 20 57 48 45 52 45 5f 44 49  PBY and WHERE_DI
2e370 53 54 49 4e 43 54 42 59 20 69 73 20 6e 6f 74 20  STINCTBY is not 
2e380 61 73 0a 2a 2a 20 73 74 72 69 63 74 2e 20 20 57  as.** strict.  W
2e390 69 74 68 20 47 52 4f 55 50 20 42 59 20 61 6e 64  ith GROUP BY and
2e3a0 20 44 49 53 54 49 4e 43 54 20 74 68 65 20 6f 6e   DISTINCT the on
2e3b0 6c 79 20 72 65 71 75 69 72 65 6d 65 6e 74 20 69  ly requirement i
2e3c0 73 20 74 68 61 74 0a 2a 2a 20 65 71 75 69 76 61  s that.** equiva
2e3d0 6c 65 6e 74 20 72 6f 77 73 20 61 70 70 65 61 72  lent rows appear
2e3e0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 64 6a   immediately adj
2e3f0 61 63 65 6e 74 20 74 6f 20 6f 6e 65 20 61 6e 6f  acent to one ano
2e400 74 68 65 72 2e 20 20 47 52 4f 55 50 20 42 59 0a  ther.  GROUP BY.
2e410 2a 2a 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20  ** and DISTINCT 
2e420 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20 72  do not require r
2e430 6f 77 73 20 74 6f 20 61 70 70 65 61 72 20 69 6e  ows to appear in
2e440 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20   any particular 
2e450 6f 72 64 65 72 20 61 73 20 6c 6f 6e 67 0a 2a 2a  order as long.**
2e460 20 61 73 20 65 71 75 69 76 65 6c 65 6e 74 20 72   as equivelent r
2e470 6f 77 73 20 61 72 65 20 67 72 6f 75 70 65 64 20  ows are grouped 
2e480 74 6f 67 65 74 68 65 72 2e 20 20 54 68 75 73 20  together.  Thus 
2e490 66 6f 72 20 47 52 4f 55 50 20 42 59 20 61 6e 64  for GROUP BY and
2e4a0 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 74 68 65   DISTINCT.** the
2e4b0 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20   pOrderBy terms 
2e4c0 63 61 6e 20 62 65 20 6d 61 74 63 68 65 64 20 69  can be matched i
2e4d0 6e 20 61 6e 79 20 6f 72 64 65 72 2e 20 20 57 69  n any order.  Wi
2e4e0 74 68 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65  th ORDER BY, the
2e4f0 20 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 74 65   .** pOrderBy te
2e500 72 6d 73 20 6d 75 73 74 20 62 65 20 6d 61 74 63  rms must be matc
2e510 68 65 64 20 69 6e 20 73 74 72 69 63 74 20 6c 65  hed in strict le
2e520 66 74 2d 74 6f 2d 72 69 67 68 74 20 6f 72 64 65  ft-to-right orde
2e530 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 38 20  r..*/.static i8 
2e540 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69  wherePathSatisfi
2e550 65 73 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65  esOrderBy(.  Whe
2e560 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20  reInfo *pWInfo, 
2e570 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
2e580 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
2e590 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
2e5a0 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 6f 72    /* ORDER BY or
2e5b0 20 47 52 4f 55 50 20 42 59 20 6f 72 20 44 49 53   GROUP BY or DIS
2e5c0 54 49 4e 43 54 20 63 6c 61 75 73 65 20 74 6f 20  TINCT clause to 
2e5d0 63 68 65 63 6b 20 2a 2f 0a 20 20 57 68 65 72 65  check */.  Where
2e5e0 50 61 74 68 20 2a 70 50 61 74 68 2c 20 20 20 20  Path *pPath,    
2e5f0 20 2f 2a 20 54 68 65 20 57 68 65 72 65 50 61 74   /* The WherePat
2e600 68 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  h to check */.  
2e610 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20  u16 wctrlFlags, 
2e620 20 20 20 20 20 20 2f 2a 20 4d 69 67 68 74 20 63        /* Might c
2e630 6f 6e 74 61 69 6e 20 57 48 45 52 45 5f 47 52 4f  ontain WHERE_GRO
2e640 55 50 42 59 20 6f 72 20 57 48 45 52 45 5f 44 49  UPBY or WHERE_DI
2e650 53 54 49 4e 43 54 42 59 20 2a 2f 0a 20 20 75 31  STINCTBY */.  u1
2e660 36 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20  6 nLoop,        
2e670 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2e680 20 65 6e 74 72 69 65 73 20 69 6e 20 70 50 61 74   entries in pPat
2e690 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20  h->aLoop[] */.  
2e6a0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74  WhereLoop *pLast
2e6b0 2c 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69  ,     /* Add thi
2e6c0 73 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 74  s WhereLoop to t
2e6d0 68 65 20 65 6e 64 20 6f 66 20 70 50 61 74 68 2d  he end of pPath-
2e6e0 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69  >aLoop[] */.  Bi
2e6f0 74 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73 6b 20  tmask *pRevMask 
2e700 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b      /* OUT: Mask
2e710 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73 20 74   of WhereLoops t
2e720 6f 20 72 75 6e 20 69 6e 20 72 65 76 65 72 73 65  o run in reverse
2e730 20 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a 20 20 75   order */.){.  u
2e740 38 20 72 65 76 53 65 74 3b 20 20 20 20 20 20 20  8 revSet;       
2e750 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2e760 72 65 76 20 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a  rev is known */.
2e770 20 20 75 38 20 72 65 76 3b 20 20 20 20 20 20 20    u8 rev;       
2e780 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6f          /* Compo
2e790 73 69 74 65 20 73 6f 72 74 20 6f 72 64 65 72 20  site sort order 
2e7a0 2a 2f 0a 20 20 75 38 20 72 65 76 49 64 78 3b 20  */.  u8 revIdx; 
2e7b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2e7c0 64 65 78 20 73 6f 72 74 20 6f 72 64 65 72 20 2a  dex sort order *
2e7d0 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72 44 69  /.  u8 isOrderDi
2e7e0 73 74 69 6e 63 74 3b 20 20 20 2f 2a 20 41 6c 6c  stinct;   /* All
2e7f0 20 70 72 69 6f 72 20 57 68 65 72 65 4c 6f 6f 70   prior WhereLoop
2e800 73 20 61 72 65 20 6f 72 64 65 72 2d 64 69 73 74  s are order-dist
2e810 69 6e 63 74 20 2a 2f 0a 20 20 75 38 20 64 69 73  inct */.  u8 dis
2e820 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20 20 20  tinctColumns;   
2e830 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6c  /* True if the l
2e840 6f 6f 70 20 68 61 73 20 55 4e 49 51 55 45 20 4e  oop has UNIQUE N
2e850 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20  OT NULL columns 
2e860 2a 2f 0a 20 20 75 38 20 69 73 4d 61 74 63 68 3b  */.  u8 isMatch;
2e870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 43             /* iC
2e880 6f 6c 75 6d 6e 20 6d 61 74 63 68 65 73 20 61 20  olumn matches a 
2e890 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45  term of the ORDE
2e8a0 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
2e8b0 20 75 31 36 20 6e 4b 65 79 43 6f 6c 3b 20 20 20   u16 nKeyCol;   
2e8c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2e8d0 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20   of key columns 
2e8e0 69 6e 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 75  in pIndex */.  u
2e8f0 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  16 nColumn;     
2e900 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
2e910 6d 62 65 72 20 6f 66 20 6f 72 64 65 72 65 64 20  mber of ordered 
2e920 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69  columns in the i
2e930 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 4f  ndex */.  u16 nO
2e940 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20  rderBy;         
2e950 2f 2a 20 4e 75 6d 62 65 72 20 74 65 72 6d 73 20  /* Number terms 
2e960 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
2e970 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
2e980 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  iLoop;          
2e990 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 57 68    /* Index of Wh
2e9a0 65 72 65 4c 6f 6f 70 20 69 6e 20 70 50 61 74 68  ereLoop in pPath
2e9b0 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64   being processed
2e9c0 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20   */.  int i, j; 
2e9d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2e9e0 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
2e9f0 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20    int iCur;     
2ea00 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
2ea10 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 63 75 72  r number for cur
2ea20 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a  rent WhereLoop *
2ea30 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b  /.  int iColumn;
2ea40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63            /* A c
2ea50 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74  olumn number wit
2ea60 68 69 6e 20 74 61 62 6c 65 20 69 43 75 72 20 2a  hin table iCur *
2ea70 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
2ea80 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20 43 75 72  Loop = 0; /* Cur
2ea90 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 62  rent WhereLoop b
2eaa0 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2e 20  eing processed. 
2eab0 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
2eac0 70 54 65 72 6d 3b 20 20 20 20 20 2f 2a 20 41 20  pTerm;     /* A 
2ead0 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74  single term of t
2eae0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2eaf0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 42 45 78  */.  Expr *pOBEx
2eb00 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  pr;        /* An
2eb10 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d   expression from
2eb20 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2eb30 61 75 73 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65  ause */.  CollSe
2eb40 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  q *pColl;       
2eb50 2f 2a 20 43 4f 4c 4c 41 54 45 20 66 75 6e 63 74  /* COLLATE funct
2eb60 69 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f 52 44 45  ion from an ORDE
2eb70 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d  R BY clause term
2eb80 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
2eb90 64 65 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  dex;        /* T
2eba0 68 65 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61  he index associa
2ebb0 74 65 64 20 77 69 74 68 20 70 4c 6f 6f 70 20 2a  ted with pLoop *
2ebc0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
2ebd0 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
2ebe0 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61  ->db;  /* Databa
2ebf0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
2ec00 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 53 61 74  .  Bitmask obSat
2ec10 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 73 6b   = 0;    /* Mask
2ec20 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72   of ORDER BY ter
2ec30 6d 73 20 73 61 74 69 73 66 69 65 64 20 73 6f 20  ms satisfied so 
2ec40 66 61 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  far */.  Bitmask
2ec50 20 6f 62 44 6f 6e 65 3b 20 20 20 20 20 20 20 2f   obDone;       /
2ec60 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 4f 52  * Mask of all OR
2ec70 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a  DER BY terms */.
2ec80 20 20 42 69 74 6d 61 73 6b 20 6f 72 64 65 72 44    Bitmask orderD
2ec90 69 73 74 69 6e 63 74 4d 61 73 6b 3b 20 20 2f 2a  istinctMask;  /*
2eca0 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 77 65 6c   Mask of all wel
2ecb0 6c 2d 6f 72 64 65 72 65 64 20 6c 6f 6f 70 73 20  l-ordered loops 
2ecc0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72 65 61  */.  Bitmask rea
2ecd0 64 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dy;             
2ece0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 69 6e 6e 65   /* Mask of inne
2ecf0 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20 20 2f 2a  r loops */..  /*
2ed00 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65  .  ** We say the
2ed10 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f   WhereLoop is "o
2ed20 6e 65 2d 72 6f 77 22 20 69 66 20 69 74 20 67 65  ne-row" if it ge
2ed30 6e 65 72 61 74 65 73 20 6e 6f 20 6d 6f 72 65 20  nerates no more 
2ed40 74 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a 20 72 6f  than one.  ** ro
2ed50 77 20 6f 66 20 6f 75 74 70 75 74 2e 20 20 41 20  w of output.  A 
2ed60 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6f 6e 65  WhereLoop is one
2ed70 2d 72 6f 77 20 69 66 20 61 6c 6c 20 6f 66 20 74  -row if all of t
2ed80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
2ed90 20 74 72 75 65 3a 0a 20 20 2a 2a 20 20 28 61 29   true:.  **  (a)
2eda0 20 41 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d   All index colum
2edb0 6e 73 20 6d 61 74 63 68 20 77 69 74 68 20 57 48  ns match with WH
2edc0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20  ERE_COLUMN_EQ.. 
2edd0 20 2a 2a 20 20 28 62 29 20 54 68 65 20 69 6e 64   **  (b) The ind
2ede0 65 78 20 69 73 20 75 6e 69 71 75 65 0a 20 20 2a  ex is unique.  *
2edf0 2a 20 41 6e 79 20 57 68 65 72 65 4c 6f 6f 70 20  * Any WhereLoop 
2ee00 77 69 74 68 20 61 6e 20 57 48 45 52 45 5f 43 4f  with an WHERE_CO
2ee10 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73 74 72 61 69  LUMN_EQ constrai
2ee20 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77 69 64 20  nt on the rowid 
2ee30 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a  is one-row..  **
2ee40 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57   Every one-row W
2ee50 68 65 72 65 4c 6f 6f 70 20 77 69 6c 6c 20 68 61  hereLoop will ha
2ee60 76 65 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45  ve the WHERE_ONE
2ee70 52 4f 57 20 62 69 74 20 73 65 74 20 69 6e 20 77  ROW bit set in w
2ee80 73 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a  sFlags..  **.  *
2ee90 2a 20 57 65 20 73 61 79 20 74 68 65 20 57 68 65  * We say the Whe
2eea0 72 65 4c 6f 6f 70 20 69 73 20 22 6f 72 64 65 72  reLoop is "order
2eeb0 2d 64 69 73 74 69 6e 63 74 22 20 69 66 20 74 68  -distinct" if th
2eec0 65 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e 73  e set of columns
2eed0 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 61 74 20   from.  ** that 
2eee0 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 61  WhereLoop that a
2eef0 72 65 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  re in the ORDER 
2ef00 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 64 69  BY clause are di
2ef10 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72  fferent for ever
2ef20 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68  y.  ** row of th
2ef30 65 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20 45 76  e WhereLoop.  Ev
2ef40 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72  ery one-row Wher
2ef50 65 4c 6f 6f 70 20 69 73 20 61 75 74 6f 6d 61 74  eLoop is automat
2ef60 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f 72 64 65  ically.  ** orde
2ef70 72 2d 64 69 73 74 69 6e 63 74 2e 20 20 20 41 20  r-distinct.   A 
2ef80 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 68  WhereLoop that h
2ef90 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e  as no columns in
2efa0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2efb0 61 75 73 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  ause.  ** is not
2efc0 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e   order-distinct.
2efd0 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69 73   To be order-dis
2efe0 74 69 6e 63 74 20 69 73 20 6e 6f 74 20 71 75 69  tinct is not qui
2eff0 74 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 62  te the same as b
2f000 65 69 6e 67 0a 20 20 2a 2a 20 55 4e 49 51 55 45  eing.  ** UNIQUE
2f010 20 73 69 6e 63 65 20 61 20 55 4e 49 51 55 45 20   since a UNIQUE 
2f020 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64 65 78 20  column or index 
2f030 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c  can have multipl
2f040 65 20 72 6f 77 73 20 74 68 61 74 20 0a 20 20 2a  e rows that .  *
2f050 2a 20 61 72 65 20 4e 55 4c 4c 20 61 6e 64 20 4e  * are NULL and N
2f060 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 65  ULL values are e
2f070 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 20 74 68  quivalent for th
2f080 65 20 70 75 72 70 6f 73 65 20 6f 66 20 6f 72 64  e purpose of ord
2f090 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a  er-distinct..  *
2f0a0 2a 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69  * To be order-di
2f0b0 73 74 69 6e 63 74 2c 20 74 68 65 20 63 6f 6c 75  stinct, the colu
2f0c0 6d 6e 73 20 6d 75 73 74 20 62 65 20 55 4e 49 51  mns must be UNIQ
2f0d0 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 2e  UE and NOT NULL.
2f0e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72  .  **.  ** The r
2f0f0 6f 77 69 64 20 66 6f 72 20 61 20 74 61 62 6c 65  owid for a table
2f100 20 69 73 20 61 6c 77 61 79 73 20 55 4e 49 51 55   is always UNIQU
2f110 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 20 73  E and NOT NULL s
2f120 6f 20 77 68 65 6e 65 76 65 72 20 74 68 65 0a 20  o whenever the. 
2f130 20 2a 2a 20 72 6f 77 69 64 20 61 70 70 65 61 72   ** rowid appear
2f140 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
2f150 59 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63 6f  Y clause, the co
2f160 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72  rresponding Wher
2f170 65 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a 20 61 75  eLoop is.  ** au
2f180 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6f 72 64 65  tomatically orde
2f190 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2f  r-distinct..  */
2f1a0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ..  assert( pOrd
2f1b0 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28  erBy!=0 );.  if(
2f1c0 20 6e 4c 6f 6f 70 20 26 26 20 4f 70 74 69 6d 69   nLoop && Optimi
2f1d0 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64  zationDisabled(d
2f1e0 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64 65 72 42  b, SQLITE_OrderB
2f1f0 79 49 64 78 4a 6f 69 6e 29 20 29 20 72 65 74 75  yIdxJoin) ) retu
2f200 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64 65 72 42  rn 0;..  nOrderB
2f210 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  y = pOrderBy->nE
2f220 78 70 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28  xpr;.  testcase(
2f230 20 6e 4f 72 64 65 72 42 79 3d 3d 42 4d 53 2d 31   nOrderBy==BMS-1
2f240 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65 72   );.  if( nOrder
2f250 42 79 3e 42 4d 53 2d 31 20 29 20 72 65 74 75 72  By>BMS-1 ) retur
2f260 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20  n 0;  /* Cannot 
2f270 6f 70 74 69 6d 69 7a 65 20 6f 76 65 72 6c 79 20  optimize overly 
2f280 6c 61 72 67 65 20 4f 52 44 45 52 20 42 59 73 20  large ORDER BYs 
2f290 2a 2f 0a 20 20 69 73 4f 72 64 65 72 44 69 73 74  */.  isOrderDist
2f2a0 69 6e 63 74 20 3d 20 31 3b 0a 20 20 6f 62 44 6f  inct = 1;.  obDo
2f2b0 6e 65 20 3d 20 4d 41 53 4b 42 49 54 28 6e 4f 72  ne = MASKBIT(nOr
2f2c0 64 65 72 42 79 29 2d 31 3b 0a 20 20 6f 72 64 65  derBy)-1;.  orde
2f2d0 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 3d 20  rDistinctMask = 
2f2e0 30 3b 0a 20 20 72 65 61 64 79 20 3d 20 30 3b 0a  0;.  ready = 0;.
2f2f0 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69    for(iLoop=0; i
2f300 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 26  sOrderDistinct &
2f310 26 20 6f 62 53 61 74 3c 6f 62 44 6f 6e 65 20 26  & obSat<obDone &
2f320 26 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20  & iLoop<=nLoop; 
2f330 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 69 66  iLoop++){.    if
2f340 28 20 69 4c 6f 6f 70 3e 30 20 29 20 72 65 61 64  ( iLoop>0 ) read
2f350 79 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  y |= pLoop->mask
2f360 53 65 6c 66 3b 0a 20 20 20 20 70 4c 6f 6f 70 20  Self;.    pLoop 
2f370 3d 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20 3f 20  = iLoop<nLoop ? 
2f380 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f  pPath->aLoop[iLo
2f390 6f 70 5d 20 3a 20 70 4c 61 73 74 3b 0a 20 20 20  op] : pLast;.   
2f3a0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
2f3b0 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
2f3c0 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20  UALTABLE ){.    
2f3d0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 76    if( pLoop->u.v
2f3e0 74 61 62 2e 69 73 4f 72 64 65 72 65 64 20 29 20  tab.isOrdered ) 
2f3f0 6f 62 53 61 74 20 3d 20 6f 62 44 6f 6e 65 3b 0a  obSat = obDone;.
2f400 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2f410 20 7d 0a 20 20 20 20 69 43 75 72 20 3d 20 70 57   }.    iCur = pW
2f420 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
2f430 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69  a[pLoop->iTab].i
2f440 43 75 72 73 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20  Cursor;..    /* 
2f450 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 4f 52 44  Mark off any ORD
2f460 45 52 20 42 59 20 74 65 72 6d 20 58 20 74 68 61  ER BY term X tha
2f470 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  t is a column in
2f480 20 74 68 65 20 74 61 62 6c 65 20 6f 66 0a 20 20   the table of.  
2f490 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74    ** the current
2f4a0 20 6c 6f 6f 70 20 66 6f 72 20 77 68 69 63 68 20   loop for which 
2f4b0 74 68 65 72 65 20 69 73 20 74 65 72 6d 20 69 6e  there is term in
2f4c0 20 74 68 65 20 57 48 45 52 45 0a 20 20 20 20 2a   the WHERE.    *
2f4d0 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  * clause of the 
2f4e0 66 6f 72 6d 20 58 20 49 53 20 4e 55 4c 4c 20 6f  form X IS NULL o
2f4f0 72 20 58 3d 3f 20 74 68 61 74 20 72 65 66 65 72  r X=? that refer
2f500 65 6e 63 65 20 6f 6e 6c 79 20 6f 75 74 65 72 0a  ence only outer.
2f510 20 20 20 20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20      ** loops..  
2f520 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
2f530 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
2f540 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4d 41  +){.      if( MA
2f550 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74  SKBIT(i) & obSat
2f560 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2f570 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c     pOBExpr = sql
2f580 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
2f590 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ate(pOrderBy->a[
2f5a0 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
2f5b0 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70   if( pOBExpr->op
2f5c0 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f  !=TK_COLUMN ) co
2f5d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
2f5e0 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c  ( pOBExpr->iTabl
2f5f0 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e  e!=iCur ) contin
2f600 75 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  ue;.      pTerm 
2f610 3d 20 66 69 6e 64 54 65 72 6d 28 26 70 57 49 6e  = findTerm(&pWIn
2f620 66 6f 2d 3e 73 57 43 2c 20 69 43 75 72 2c 20 70  fo->sWC, iCur, p
2f630 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c  OBExpr->iColumn,
2f640 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f650 20 20 20 20 20 20 20 20 7e 72 65 61 64 79 2c 20          ~ready, 
2f660 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2c  WO_EQ|WO_ISNULL,
2f670 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
2f680 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  Term==0 ) contin
2f690 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  ue;.      if( (p
2f6a0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26  Term->eOperator&
2f6b0 57 4f 5f 45 51 29 21 3d 30 20 26 26 20 70 4f 42  WO_EQ)!=0 && pOB
2f6c0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30  Expr->iColumn>=0
2f6d0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
2f6e0 74 20 63 68 61 72 20 2a 7a 31 2c 20 2a 7a 32 3b  t char *z1, *z2;
2f6f0 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
2f700 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2f710 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  Seq(pWInfo->pPar
2f720 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  se, pOrderBy->a[
2f730 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
2f740 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
2f750 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
2f760 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a  tColl;.        z
2f770 31 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  1 = pColl->zName
2f780 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  ;.        pColl 
2f790 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
2f7a0 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61  lSeq(pWInfo->pPa
2f7b0 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70  rse, pTerm->pExp
2f7c0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
2f7d0 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
2f7e0 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
2f7f0 20 20 20 20 20 20 20 20 7a 32 20 3d 20 70 43 6f          z2 = pCo
2f800 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ll->zName;.     
2f810 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
2f820 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 21 3d 30  rICmp(z1, z2)!=0
2f830 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2f840 20 20 20 7d 0a 20 20 20 20 20 20 6f 62 53 61 74     }.      obSat
2f850 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a   |= MASKBIT(i);.
2f860 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28      }..    if( (
2f870 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2f880 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d   WHERE_ONEROW)==
2f890 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
2f8a0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2f8b0 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20 20  WHERE_IPK ){.   
2f8c0 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b       pIndex = 0;
2f8d0 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c  .        nKeyCol
2f8e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 43   = 0;.        nC
2f8f0 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 20  olumn = 1;.     
2f900 20 7d 65 6c 73 65 20 69 66 28 20 28 70 49 6e 64   }else if( (pInd
2f910 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ex = pLoop->u.bt
2f920 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20 7c  ree.pIndex)==0 |
2f930 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64  | pIndex->bUnord
2f940 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  ered ){.        
2f950 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
2f960 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
2f970 4b 65 79 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d  KeyCol = pIndex-
2f980 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20  >nKeyCol;.      
2f990 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64    nColumn = pInd
2f9a0 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ex->nColumn;.   
2f9b0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
2f9c0 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b 31 20  lumn==nKeyCol+1 
2f9d0 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e  || !HasRowid(pIn
2f9e0 64 65 78 2d 3e 70 54 61 62 6c 65 29 20 29 3b 0a  dex->pTable) );.
2f9f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2fa00 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
2fa10 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d 28 2d 31  [nColumn-1]==(-1
2fa20 29 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70  ) || !HasRowid(p
2fa30 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 29 3b  Index->pTable));
2fa40 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72  .        isOrder
2fa50 44 69 73 74 69 6e 63 74 20 3d 20 70 49 6e 64 65  Distinct = pInde
2fa60 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
2fa70 6f 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  one;.      }..  
2fa80 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
2fa90 75 67 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  ugh all columns 
2faa0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  of the index and
2fab0 20 64 65 61 6c 20 77 69 74 68 20 74 68 65 20 6f   deal with the o
2fac0 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  nes.      ** tha
2fad0 74 20 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74 72  t are not constr
2fae0 61 69 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20 49  ained by == or I
2faf0 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  N..      */.    
2fb00 20 20 72 65 76 20 3d 20 72 65 76 53 65 74 20 3d    rev = revSet =
2fb10 20 30 3b 0a 20 20 20 20 20 20 64 69 73 74 69 6e   0;.      distin
2fb20 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20  ctColumns = 0;. 
2fb30 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
2fb40 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20  nColumn; j++){. 
2fb50 20 20 20 20 20 20 20 75 38 20 62 4f 6e 63 65 3b         u8 bOnce;
2fb60 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 75     /* True to ru
2fb70 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 73  n the ORDER BY s
2fb80 65 61 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20  earch loop */.. 
2fb90 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f         /* Skip o
2fba0 76 65 72 20 3d 3d 20 61 6e 64 20 49 53 20 4e 55  ver == and IS NU
2fbb0 4c 4c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  LL terms */.    
2fbc0 20 20 20 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d      if( j<pLoop-
2fbd0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20  >u.btree.nEq.   
2fbe0 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e        && pLoop->
2fbf0 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 3d 3d 30  u.btree.nSkip==0
2fc00 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28 69  .         && ((i
2fc10 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
2fc20 5b 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 29 20  [j]->eOperator) 
2fc30 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55  & (WO_EQ|WO_ISNU
2fc40 4c 4c 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20  LL))!=0.        
2fc50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2fc60 20 69 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29   i & WO_ISNULL )
2fc70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
2fc80 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44  stcase( isOrderD
2fc90 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20  istinct );.     
2fca0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
2fcb0 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20  stinct = 0;.    
2fcc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2fcd0 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20    continue;  .  
2fce0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2fcf0 20 2f 2a 20 47 65 74 20 74 68 65 20 63 6f 6c 75   /* Get the colu
2fd00 6d 6e 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65  mn number in the
2fd10 20 74 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e 29   table (iColumn)
2fd20 20 61 6e 64 20 73 6f 72 74 20 6f 72 64 65 72 0a   and sort order.
2fd30 20 20 20 20 20 20 20 20 2a 2a 20 28 72 65 76 49          ** (revI
2fd40 64 78 29 20 66 6f 72 20 74 68 65 20 6a 2d 74 68  dx) for the j-th
2fd50 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
2fd60 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ndex..        */
2fd70 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e  .        if( pIn
2fd80 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20  dex ){.         
2fd90 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65   iColumn = pInde
2fda0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a  x->aiColumn[j];.
2fdb0 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64 78            revIdx
2fdc0 20 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74   = pIndex->aSort
2fdd0 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20  Order[j];.      
2fde0 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d      if( iColumn=
2fdf0 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d  =pIndex->pTable-
2fe00 3e 69 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e  >iPKey ) iColumn
2fe10 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d   = -1;.        }
2fe20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2fe30 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  iColumn = -1;.  
2fe40 20 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d          revIdx =
2fe50 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   0;.        }.. 
2fe60 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 63         /* An unc
2fe70 6f 6e 73 74 72 61 69 6e 65 64 20 63 6f 6c 75 6d  onstrained colum
2fe80 6e 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  n that might be 
2fe90 4e 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20  NULL means that 
2fea0 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  this.        ** 
2feb0 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74  WhereLoop is not
2fec0 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 0a 20 20   well-ordered.  
2fed0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2fee0 20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73 74   if( isOrderDist
2fef0 69 6e 63 74 0a 20 20 20 20 20 20 20 20 20 26 26  inct.         &&
2ff00 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20   iColumn>=0.    
2ff10 20 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70       && j>=pLoop
2ff20 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20  ->u.btree.nEq.  
2ff30 20 20 20 20 20 20 20 26 26 20 70 49 6e 64 65 78         && pIndex
2ff40 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69  ->pTable->aCol[i
2ff50 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d  Column].notNull=
2ff60 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  =0.        ){.  
2ff70 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
2ff80 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20  istinct = 0;.   
2ff90 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
2ffa0 2f 2a 20 46 69 6e 64 20 74 68 65 20 4f 52 44 45  /* Find the ORDE
2ffb0 52 20 42 59 20 74 65 72 6d 20 74 68 61 74 20 63  R BY term that c
2ffc0 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
2ffd0 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20  e j-th column.  
2ffe0 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
2fff0 69 6e 64 65 78 20 61 6e 64 20 6d 61 72 6b 20 74  index and mark t
30000 68 61 74 20 4f 52 44 45 52 20 42 59 20 74 65 72  hat ORDER BY ter
30010 6d 20 6f 66 66 20 0a 20 20 20 20 20 20 20 20 2a  m off .        *
30020 2f 0a 20 20 20 20 20 20 20 20 62 4f 6e 63 65 20  /.        bOnce 
30030 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 73 4d  = 1;.        isM
30040 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  atch = 0;.      
30050 20 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65    for(i=0; bOnce
30060 20 26 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20   && i<nOrderBy; 
30070 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
30080 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26  if( MASKBIT(i) &
30090 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75   obSat ) continu
300a0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 42  e;.          pOB
300b0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
300c0 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f  prSkipCollate(pO
300d0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
300e0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  pr);.          t
300f0 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c  estcase( wctrlFl
30100 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55  ags & WHERE_GROU
30110 50 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20  PBY );.         
30120 20 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c   testcase( wctrl
30130 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49  Flags & WHERE_DI
30140 53 54 49 4e 43 54 42 59 20 29 3b 0a 20 20 20 20  STINCTBY );.    
30150 20 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c        if( (wctrl
30160 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 47  Flags & (WHERE_G
30170 52 4f 55 50 42 59 7c 57 48 45 52 45 5f 44 49 53  ROUPBY|WHERE_DIS
30180 54 49 4e 43 54 42 59 29 29 3d 3d 30 20 29 20 62  TINCTBY))==0 ) b
30190 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Once = 0;.      
301a0 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
301b0 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
301c0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
301d0 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
301e0 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29  ->iTable!=iCur )
301f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
30200 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
30210 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75  ->iColumn!=iColu
30220 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  mn ) continue;. 
30230 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f           if( iCo
30240 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20  lumn>=0 ){.     
30250 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
30260 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
30270 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  q(pWInfo->pParse
30280 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  , pOrderBy->a[i]
30290 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
302a0 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
302b0 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
302c0 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  fltColl;.       
302d0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
302e0 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a  StrICmp(pColl->z
302f0 4e 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 61 7a  Name, pIndex->az
30300 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63 6f  Coll[j])!=0 ) co
30310 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
30320 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 73    }.          is
30330 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 20  Match = 1;.     
30340 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
30350 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
30360 28 20 69 73 4d 61 74 63 68 20 26 26 20 28 70 57  ( isMatch && (pW
30370 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
30380 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59   & WHERE_GROUPBY
30390 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
303a0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
303b0 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 69 73  he sort order is
303c0 20 63 6f 6d 70 61 74 69 62 6c 65 20 69 6e 20 61   compatible in a
303d0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
303e0 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e..          ** 
303f0 53 6f 72 74 20 6f 72 64 65 72 20 69 73 20 69 72  Sort order is ir
30400 72 65 6c 65 76 61 6e 74 20 66 6f 72 20 61 20 47  relevant for a G
30410 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
30420 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
30430 20 72 65 76 53 65 74 20 29 7b 0a 20 20 20 20 20   revSet ){.     
30440 20 20 20 20 20 20 20 69 66 28 20 28 72 65 76 20         if( (rev 
30450 5e 20 72 65 76 49 64 78 29 21 3d 70 4f 72 64 65  ^ revIdx)!=pOrde
30460 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
30470 64 65 72 20 29 20 69 73 4d 61 74 63 68 20 3d 20  der ) isMatch = 
30480 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
30490 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
304a0 72 65 76 20 3d 20 72 65 76 49 64 78 20 5e 20 70  rev = revIdx ^ p
304b0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
304c0 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 20  rtOrder;.       
304d0 20 20 20 20 20 69 66 28 20 72 65 76 20 29 20 2a       if( rev ) *
304e0 70 52 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b  pRevMask |= MASK
304f0 42 49 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20  BIT(iLoop);.    
30500 20 20 20 20 20 20 20 20 72 65 76 53 65 74 20 3d          revSet =
30510 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
30520 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30530 20 20 69 66 28 20 69 73 4d 61 74 63 68 20 29 7b    if( isMatch ){
30540 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
30550 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
30560 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
30570 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e  ( distinctColumn
30580 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  s==0 );.        
30590 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75      distinctColu
305a0 6d 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mns = 1;.       
305b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6f     }.          o
305c0 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28  bSat |= MASKBIT(
305d0 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  i);.        }els
305e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
305f0 4e 6f 20 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a  No match found *
30600 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
30610 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f  j==0 || j<nKeyCo
30620 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l ){.           
30630 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64   testcase( isOrd
30640 65 72 44 69 73 74 69 6e 63 74 21 3d 30 20 29 3b  erDistinct!=0 );
30650 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f  .            isO
30660 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
30670 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
30680 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
30690 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
306a0 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65   /* end Loop ove
306b0 72 20 61 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75  r all index colu
306c0 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  mns */.      if(
306d0 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
306e0 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
306f0 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73  case( isOrderDis
30700 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20  tinct==0 );.    
30710 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
30720 6e 63 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  nct = 1;.      }
30730 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66  .    } /* end-if
30740 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a   not one-row */.
30750 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66  .    /* Mark off
30760 20 61 6e 79 20 6f 74 68 65 72 20 4f 52 44 45 52   any other ORDER
30770 20 42 59 20 74 65 72 6d 73 20 74 68 61 74 20 72   BY terms that r
30780 65 66 65 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a  eference pLoop *
30790 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 72 64 65  /.    if( isOrde
307a0 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  rDistinct ){.   
307b0 20 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74     orderDistinct
307c0 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d  Mask |= pLoop->m
307d0 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 66  askSelf;.      f
307e0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
307f0 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
30800 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 20    Expr *p;.     
30810 20 20 20 42 69 74 6d 61 73 6b 20 6d 54 65 72 6d     Bitmask mTerm
30820 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 41  ;.        if( MA
30830 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74  SKBIT(i) & obSat
30840 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
30850 20 20 20 20 20 70 20 3d 20 70 4f 72 64 65 72 42       p = pOrderB
30860 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
30870 20 20 20 20 20 20 20 6d 54 65 72 6d 20 3d 20 65         mTerm = e
30880 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 26 70  xprTableUsage(&p
30890 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
308a0 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p);.        if( 
308b0 6d 54 65 72 6d 3d 3d 30 20 26 26 20 21 73 71 6c  mTerm==0 && !sql
308c0 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
308d0 6e 74 28 70 29 20 29 20 63 6f 6e 74 69 6e 75 65  nt(p) ) continue
308e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  ;.        if( (m
308f0 54 65 72 6d 26 7e 6f 72 64 65 72 44 69 73 74 69  Term&~orderDisti
30900 6e 63 74 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  nctMask)==0 ){. 
30910 20 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c           obSat |
30920 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20  = MASKBIT(i);.  
30930 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
30940 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64      }.  } /* End
30950 20 74 68 65 20 6c 6f 6f 70 20 6f 76 65 72 20 61   the loop over a
30960 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 72  ll WhereLoops fr
30970 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73 74 20 64 6f  om outer-most do
30980 77 6e 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74  wn to inner-most
30990 20 2a 2f 0a 20 20 69 66 28 20 6f 62 53 61 74 3d   */.  if( obSat=
309a0 3d 6f 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e  =obDone ) return
309b0 20 28 69 38 29 6e 4f 72 64 65 72 42 79 3b 0a 20   (i8)nOrderBy;. 
309c0 20 69 66 28 20 21 69 73 4f 72 64 65 72 44 69 73   if( !isOrderDis
309d0 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 66 6f 72  tinct ){.    for
309e0 28 69 3d 6e 4f 72 64 65 72 42 79 2d 31 3b 20 69  (i=nOrderBy-1; i
309f0 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  >0; i--){.      
30a00 42 69 74 6d 61 73 6b 20 6d 20 3d 20 4d 41 53 4b  Bitmask m = MASK
30a10 42 49 54 28 69 29 20 2d 20 31 3b 0a 20 20 20 20  BIT(i) - 1;.    
30a20 20 20 69 66 28 20 28 6f 62 53 61 74 26 6d 29 3d    if( (obSat&m)=
30a30 3d 6d 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =m ) return i;. 
30a40 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
30a50 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
30a60 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66  -1;.}.../*.** If
30a70 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50   the WHERE_GROUP
30a80 42 59 20 66 6c 61 67 20 69 73 20 73 65 74 20 69  BY flag is set i
30a90 6e 20 74 68 65 20 6d 61 73 6b 20 70 61 73 73 65  n the mask passe
30aa0 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  d to sqlite3Wher
30ab0 65 42 65 67 69 6e 28 29 2c 0a 2a 2a 20 74 68 65  eBegin(),.** the
30ac0 20 70 6c 61 6e 6e 65 72 20 61 73 73 75 6d 65 73   planner assumes
30ad0 20 74 68 61 74 20 74 68 65 20 73 70 65 63 69 66   that the specif
30ae0 69 65 64 20 70 4f 72 64 65 72 42 79 20 6c 69 73  ied pOrderBy lis
30af0 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  t is actually a 
30b00 47 52 4f 55 50 0a 2a 2a 20 42 59 20 63 6c 61 75  GROUP.** BY clau
30b10 73 65 20 2d 20 61 6e 64 20 73 6f 20 61 6e 79 20  se - and so any 
30b20 6f 72 64 65 72 20 74 68 61 74 20 67 72 6f 75 70  order that group
30b30 73 20 72 6f 77 73 20 61 73 20 72 65 71 75 69 72  s rows as requir
30b40 65 64 20 73 61 74 69 73 66 69 65 73 20 74 68 65  ed satisfies the
30b50 0a 2a 2a 20 72 65 71 75 65 73 74 2e 0a 2a 2a 0a  .** request..**.
30b60 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 6e 20  ** Normally, in 
30b70 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
30b80 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
30b90 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 64   the caller to d
30ba0 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74  etermine.** whet
30bb0 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 72  her or not the r
30bc0 6f 77 73 20 61 72 65 20 72 65 61 6c 6c 79 20 62  ows are really b
30bd0 65 69 6e 67 20 64 65 6c 69 76 65 72 65 64 20 69  eing delivered i
30be0 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20  n sorted order, 
30bf0 6f 72 0a 2a 2a 20 6a 75 73 74 20 69 6e 20 73 6f  or.** just in so
30c00 6d 65 20 6f 74 68 65 72 20 6f 72 64 65 72 20 74  me other order t
30c10 68 61 74 20 70 72 6f 76 69 64 65 73 20 74 68 65  hat provides the
30c20 20 72 65 71 75 69 72 65 64 20 67 72 6f 75 70 69   required groupi
30c30 6e 67 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20  ng. However,.** 
30c40 69 66 20 74 68 65 20 57 48 45 52 45 5f 53 4f 52  if the WHERE_SOR
30c50 54 42 59 47 52 4f 55 50 20 66 6c 61 67 20 69 73  TBYGROUP flag is
30c60 20 61 6c 73 6f 20 70 61 73 73 65 64 20 74 6f 20   also passed to 
30c70 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
30c80 6e 28 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  n(), then.** thi
30c90 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
30ca0 65 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  e called on the 
30cb0 72 65 74 75 72 6e 65 64 20 57 68 65 72 65 49 6e  returned WhereIn
30cc0 66 6f 20 6f 62 6a 65 63 74 2e 20 49 74 20 72 65  fo object. It re
30cd0 74 75 72 6e 73 0a 2a 2a 20 74 72 75 65 20 69 66  turns.** true if
30ce0 20 74 68 65 20 72 6f 77 73 20 72 65 61 6c 6c 79   the rows really
30cf0 20 77 69 6c 6c 20 62 65 20 73 6f 72 74 65 64 20   will be sorted 
30d00 69 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  in the specified
30d10 20 6f 72 64 65 72 2c 20 6f 72 20 66 61 6c 73 65   order, or false
30d20 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  .** otherwise..*
30d30 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
30d40 2c 20 61 73 73 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a  , assuming:.**.*
30d50 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
30d60 20 69 31 20 4f 4e 20 74 31 28 78 2c 20 59 29 3b   i1 ON t1(x, Y);
30d70 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 0a 2a 2a 0a 2a  .**.** then.**.*
30d80 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
30d90 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20 78 2c  M t1 GROUP BY x,
30da0 79 20 4f 52 44 45 52 20 42 59 20 78 2c 79 3b 20  y ORDER BY x,y; 
30db0 20 20 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d    -- IsSorted()=
30dc0 3d 31 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a  =1.**   SELECT *
30dd0 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42   FROM t1 GROUP B
30de0 59 20 79 2c 78 20 4f 52 44 45 52 20 42 59 20 79  Y y,x ORDER BY y
30df0 2c 78 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74 65  ,x;   -- IsSorte
30e00 64 28 29 3d 3d 30 0a 2a 2f 0a 69 6e 74 20 73 71  d()==0.*/.int sq
30e10 6c 69 74 65 33 57 68 65 72 65 49 73 53 6f 72 74  lite3WhereIsSort
30e20 65 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ed(WhereInfo *pW
30e30 49 6e 66 6f 29 7b 0a 20 20 61 73 73 65 72 74 28  Info){.  assert(
30e40 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
30e50 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55  ags & WHERE_GROU
30e60 50 42 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PBY );.  assert(
30e70 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
30e80 61 67 73 20 26 20 57 48 45 52 45 5f 53 4f 52 54  ags & WHERE_SORT
30e90 42 59 47 52 4f 55 50 20 29 3b 0a 20 20 72 65 74  BYGROUP );.  ret
30ea0 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74  urn pWInfo->sort
30eb0 65 64 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48  ed;.}..#ifdef WH
30ec0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
30ed0 0a 2f 2a 20 46 6f 72 20 64 65 62 75 67 67 69 6e  ./* For debuggin
30ee0 67 20 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73  g use only: */.s
30ef0 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
30f00 20 2a 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28   *wherePathName(
30f10 57 68 65 72 65 50 61 74 68 20 2a 70 50 61 74 68  WherePath *pPath
30f20 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68 65  , int nLoop, Whe
30f30 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 29 7b 0a  reLoop *pLast){.
30f40 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 4e    static char zN
30f50 61 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e 74 20 69  ame[65];.  int i
30f60 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
30f70 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d  Loop; i++){ zNam
30f80 65 5b 69 5d 20 3d 20 70 50 61 74 68 2d 3e 61 4c  e[i] = pPath->aL
30f90 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20  oop[i]->cId; }. 
30fa0 20 69 66 28 20 70 4c 61 73 74 20 29 20 7a 4e 61   if( pLast ) zNa
30fb0 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d  me[i++] = pLast-
30fc0 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d  >cId;.  zName[i]
30fd0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a   = 0;.  return z
30fe0 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Name;.}.#endif..
30ff0 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
31000 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f  list of WhereLoo
31010 70 20 6f 62 6a 65 63 74 73 20 61 74 20 70 57 49  p objects at pWI
31020 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68 69  nfo->pLoops, thi
31030 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 74 74  s routine.** att
31040 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 74 68  empts to find th
31050 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61  e lowest cost pa
31060 74 68 20 74 68 61 74 20 76 69 73 69 74 73 20 65  th that visits e
31070 61 63 68 20 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a  ach WhereLoop.**
31080 20 6f 6e 63 65 2e 20 20 54 68 69 73 20 70 61 74   once.  This pat
31090 68 20 69 73 20 74 68 65 6e 20 6c 6f 61 64 65 64  h is then loaded
310a0 20 69 6e 74 6f 20 74 68 65 20 70 57 49 6e 66 6f   into the pWInfo
310b0 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69 65  ->a[].pWLoop fie
310c0 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d  lds..**.** Assum
310d0 65 20 74 68 61 74 20 74 68 65 20 74 6f 74 61 6c  e that the total
310e0 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
310f0 74 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  t rows that will
31100 20 6e 65 65 64 20 74 6f 20 62 65 20 73 6f 72 74   need to be sort
31110 65 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6e 52  ed.** will be nR
31120 6f 77 45 73 74 20 28 69 6e 20 74 68 65 20 31 30  owEst (in the 10
31130 2a 6c 6f 67 32 20 72 65 70 72 65 73 65 6e 74 61  *log2 representa
31140 74 69 6f 6e 29 2e 20 20 4f 72 2c 20 69 67 6e 6f  tion).  Or, igno
31150 72 65 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f  re sorting.** co
31160 73 74 73 20 69 66 20 6e 52 6f 77 45 73 74 3d 3d  sts if nRowEst==
31170 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  0..**.** Return 
31180 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
31190 63 65 73 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e  cess or SQLITE_N
311a0 4f 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79  OMEM of a memory
311b0 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65   allocation.** e
311c0 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  rror occurs..*/.
311d0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
311e0 50 61 74 68 53 6f 6c 76 65 72 28 57 68 65 72 65  PathSolver(Where
311f0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 4c 6f  Info *pWInfo, Lo
31200 67 45 73 74 20 6e 52 6f 77 45 73 74 29 7b 0a 20  gEst nRowEst){. 
31210 20 69 6e 74 20 6d 78 43 68 6f 69 63 65 3b 20 20   int mxChoice;  
31220 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
31230 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
31240 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61 74  simultaneous pat
31250 68 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20 20  hs tracked */.  
31260 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20 20  int nLoop;      
31270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
31280 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
31290 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61  the join */.  Pa
312a0 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
312b0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
312c0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
312d0 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
312e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
312f0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
31300 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  tion */.  int iL
31310 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
31320 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
31330 74 65 72 20 6f 76 65 72 20 74 68 65 20 74 65 72  ter over the ter
31340 6d 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a  ms of the join *
31350 2f 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 20  /.  int ii, jj; 
31360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31370 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
31380 2f 0a 20 20 69 6e 74 20 6d 78 49 20 3d 20 30 3b  /.  int mxI = 0;
31390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
313a0 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 65   Index of next e
313b0 6e 74 72 79 20 74 6f 20 72 65 70 6c 61 63 65 20  ntry to replace 
313c0 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  */.  int nOrderB
313d0 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  y;             /
313e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45  * Number of ORDE
313f0 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d  R BY clause term
31400 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 43  s */.  LogEst rC
31410 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ost;            
31420 20 2f 2a 20 43 6f 73 74 20 6f 66 20 61 20 70 61   /* Cost of a pa
31430 74 68 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e  th */.  LogEst n
31440 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Out;            
31450 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
31460 75 74 70 75 74 73 20 2a 2f 0a 20 20 4c 6f 67 45  utputs */.  LogE
31470 73 74 20 6d 78 43 6f 73 74 20 3d 20 30 3b 20 20  st mxCost = 0;  
31480 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
31490 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f   cost of a set o
314a0 66 20 70 61 74 68 73 20 2a 2f 0a 20 20 69 6e 74  f paths */.  int
314b0 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20 20   nTo, nFrom;    
314c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
314d0 20 6f 66 20 76 61 6c 69 64 20 65 6e 74 72 69 65   of valid entrie
314e0 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e 64 20 61  s in aTo[] and a
314f0 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  From[] */.  Wher
31500 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b 20 20 20  ePath *aFrom;   
31510 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6e 46 72        /* All nFr
31520 6f 6d 20 70 61 74 68 73 20 61 74 20 74 68 65 20  om paths at the 
31530 70 72 65 76 69 6f 75 73 20 6c 65 76 65 6c 20 2a  previous level *
31540 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 61  /.  WherePath *a
31550 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  To;           /*
31560 20 54 68 65 20 6e 54 6f 20 62 65 73 74 20 70 61   The nTo best pa
31570 74 68 73 20 61 74 20 74 68 65 20 63 75 72 72 65  ths at the curre
31580 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68  nt level */.  Wh
31590 65 72 65 50 61 74 68 20 2a 70 46 72 6f 6d 3b 20  erePath *pFrom; 
315a0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c          /* An el
315b0 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f 6d 5b 5d  ement of aFrom[]
315c0 20 74 68 61 74 20 77 65 20 61 72 65 20 77 6f 72   that we are wor
315d0 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65  king on */.  Whe
315e0 72 65 50 61 74 68 20 2a 70 54 6f 3b 20 20 20 20  rePath *pTo;    
315f0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65         /* An ele
31600 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d 20 74 68  ment of aTo[] th
31610 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e  at we are workin
31620 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c  g on */.  WhereL
31630 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 20 20  oop *pWLoop;    
31640 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
31650 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
31660 63 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  cts */.  WhereLo
31670 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20 20 20 20  op **pX;        
31680 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 64 69     /* Used to di
31690 76 79 20 75 70 20 74 68 65 20 70 53 70 61 63 65  vy up the pSpace
316a0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 63 68 61   memory */.  cha
316b0 72 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20  r *pSpace;      
316c0 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
316d0 61 72 79 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  ary memory used 
316e0 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  by this routine 
316f0 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70  */..  pParse = p
31700 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
31710 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
31720 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e  ;.  nLoop = pWIn
31730 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a  fo->nLevel;.  /*
31740 20 54 55 4e 49 4e 47 3a 20 46 6f 72 20 73 69 6d   TUNING: For sim
31750 70 6c 65 20 71 75 65 72 69 65 73 2c 20 6f 6e 6c  ple queries, onl
31760 79 20 74 68 65 20 62 65 73 74 20 70 61 74 68 20  y the best path 
31770 69 73 20 74 72 61 63 6b 65 64 2e 0a 20 20 2a 2a  is tracked..  **
31780 20 46 6f 72 20 32 2d 77 61 79 20 6a 6f 69 6e 73   For 2-way joins
31790 2c 20 74 68 65 20 35 20 62 65 73 74 20 70 61 74  , the 5 best pat
317a0 68 73 20 61 72 65 20 66 6f 6c 6c 6f 77 65 64 2e  hs are followed.
317b0 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73 20  .  ** For joins 
317c0 6f 66 20 33 20 6f 72 20 6d 6f 72 65 20 74 61 62  of 3 or more tab
317d0 6c 65 73 2c 20 74 72 61 63 6b 20 74 68 65 20 31  les, track the 1
317e0 30 20 62 65 73 74 20 70 61 74 68 73 20 2a 2f 0a  0 best paths */.
317f0 20 20 6d 78 43 68 6f 69 63 65 20 3d 20 28 6e 4c    mxChoice = (nL
31800 6f 6f 70 3c 3d 31 29 20 3f 20 31 20 3a 20 28 6e  oop<=1) ? 1 : (n
31810 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20 3a 20 31 30  Loop==2 ? 5 : 10
31820 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4c 6f  );.  assert( nLo
31830 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62  op<=pWInfo->pTab
31840 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  List->nSrc );.  
31850 57 48 45 52 45 54 52 41 43 45 28 30 78 30 30 32  WHERETRACE(0x002
31860 2c 20 28 22 2d 2d 2d 2d 20 62 65 67 69 6e 20 73  , ("---- begin s
31870 6f 6c 76 65 72 5c 6e 22 29 29 3b 0a 0a 20 20 2f  olver\n"));..  /
31880 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
31890 6e 69 74 69 61 6c 69 7a 65 20 73 70 61 63 65 20  nitialize space 
318a0 66 6f 72 20 61 54 6f 20 61 6e 64 20 61 46 72 6f  for aTo and aFro
318b0 6d 20 2a 2f 0a 20 20 69 69 20 3d 20 28 73 69 7a  m */.  ii = (siz
318c0 65 6f 66 28 57 68 65 72 65 50 61 74 68 29 2b 73  eof(WherePath)+s
318d0 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a  izeof(WhereLoop*
318e0 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69 63  )*nLoop)*mxChoic
318f0 65 2a 32 3b 0a 20 20 70 53 70 61 63 65 20 3d 20  e*2;.  pSpace = 
31900 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
31910 61 77 28 64 62 2c 20 69 69 29 3b 0a 20 20 69 66  aw(db, ii);.  if
31920 28 20 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65  ( pSpace==0 ) re
31930 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
31940 4d 3b 0a 20 20 61 54 6f 20 3d 20 28 57 68 65 72  M;.  aTo = (Wher
31950 65 50 61 74 68 2a 29 70 53 70 61 63 65 3b 0a 20  ePath*)pSpace;. 
31960 20 61 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43   aFrom = aTo+mxC
31970 68 6f 69 63 65 3b 0a 20 20 6d 65 6d 73 65 74 28  hoice;.  memset(
31980 61 46 72 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  aFrom, 0, sizeof
31990 28 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70  (aFrom[0]));.  p
319a0 58 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 2a  X = (WhereLoop**
319b0 29 28 61 46 72 6f 6d 2b 6d 78 43 68 6f 69 63 65  )(aFrom+mxChoice
319c0 29 3b 0a 20 20 66 6f 72 28 69 69 3d 6d 78 43 68  );.  for(ii=mxCh
319d0 6f 69 63 65 2a 32 2c 20 70 46 72 6f 6d 3d 61 54  oice*2, pFrom=aT
319e0 6f 3b 20 69 69 3e 30 3b 20 69 69 2d 2d 2c 20 70  o; ii>0; ii--, p
319f0 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c  From++, pX += nL
31a00 6f 6f 70 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d  oop){.    pFrom-
31a10 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20 20 7d  >aLoop = pX;.  }
31a20 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68 65 20  ..  /* Seed the 
31a30 73 65 61 72 63 68 20 77 69 74 68 20 61 20 73 69  search with a si
31a40 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68 20 63  ngle WherePath c
31a50 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20 57  ontaining zero W
31a60 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a  hereLoops..  **.
31a70 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44 6f 20    ** TUNING: Do 
31a80 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e 75 6d 62  not let the numb
31a90 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73  er of iterations
31aa0 20 67 6f 20 61 62 6f 76 65 20 32 35 2e 20 20 49   go above 25.  I
31ab0 66 20 74 68 65 20 63 6f 73 74 0a 20 20 2a 2a 20  f the cost.  ** 
31ac0 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20  of computing an 
31ad0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
31ae0 69 73 20 6e 6f 74 20 70 61 69 64 20 62 61 63 6b  is not paid back
31af0 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
31b00 74 20 32 35 0a 20 20 2a 2a 20 72 6f 77 73 2c 20  t 25.  ** rows, 
31b10 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73 65 20  then do not use 
31b20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
31b30 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b  dex. */.  aFrom[
31b40 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28 70 50  0].nRow = MIN(pP
31b50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
31b60 2c 20 34 36 29 3b 20 20 61 73 73 65 72 74 28 20  , 46);  assert( 
31b70 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  46==sqlite3LogEs
31b80 74 28 32 35 29 20 29 3b 0a 20 20 6e 46 72 6f 6d  t(25) );.  nFrom
31b90 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 50 72 65 63   = 1;..  /* Prec
31ba0 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 73 74 20  ompute the cost 
31bb0 6f 66 20 73 6f 72 74 69 6e 67 20 74 68 65 20 66  of sorting the f
31bc0 69 6e 61 6c 20 72 65 73 75 6c 74 20 73 65 74 2c  inal result set,
31bd0 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 0a 20   if the caller. 
31be0 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 57 68   ** to sqlite3Wh
31bf0 65 72 65 42 65 67 69 6e 28 29 20 77 61 73 20 63  ereBegin() was c
31c00 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 73  oncerned about s
31c10 6f 72 74 69 6e 67 20 2a 2f 0a 20 20 69 66 28 20  orting */.  if( 
31c20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
31c30 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73 74 3d 3d  ==0 || nRowEst==
31c40 30 20 29 7b 0a 20 20 20 20 61 46 72 6f 6d 5b 30  0 ){.    aFrom[0
31c50 5d 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 30 3b  ].isOrdered = 0;
31c60 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  .    nOrderBy = 
31c70 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
31c80 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72  aFrom[0].isOrder
31c90 65 64 20 3d 20 6e 4c 6f 6f 70 3e 30 20 3f 20 2d  ed = nLoop>0 ? -
31ca0 31 20 3a 20 31 3b 0a 20 20 20 20 6e 4f 72 64 65  1 : 1;.    nOrde
31cb0 72 42 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f  rBy = pWInfo->pO
31cc0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
31cd0 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
31ce0 20 73 75 63 63 65 73 73 69 76 65 6c 79 20 6c 6f   successively lo
31cf0 6e 67 65 72 20 57 68 65 72 65 50 61 74 68 73 20  nger WherePaths 
31d00 75 73 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f  using the previo
31d10 75 73 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20  us generation.  
31d20 2a 2a 20 6f 66 20 57 68 65 72 65 50 61 74 68 73  ** of WherePaths
31d30 20 61 73 20 74 68 65 20 62 61 73 69 73 20 66 6f   as the basis fo
31d40 72 20 74 68 65 20 6e 65 78 74 2e 20 20 4b 65 65  r the next.  Kee
31d50 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6d  p track of the m
31d60 78 43 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73  xChoice.  ** bes
31d70 74 20 70 61 74 68 73 20 61 74 20 65 61 63 68 20  t paths at each 
31d80 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  generation */.  
31d90 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f  for(iLoop=0; iLo
31da0 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b  op<nLoop; iLoop+
31db0 2b 29 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b  +){.    nTo = 0;
31dc0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70  .    for(ii=0, p
31dd0 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e  From=aFrom; ii<n
31de0 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f  From; ii++, pFro
31df0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  m++){.      for(
31e00 70 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70  pWLoop=pWInfo->p
31e10 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70  Loops; pWLoop; p
31e20 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e  WLoop=pWLoop->pN
31e30 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20  extLoop){.      
31e40 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65    Bitmask maskNe
31e50 77 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  w;.        Bitma
31e60 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 0a  sk revMask = 0;.
31e70 20 20 20 20 20 20 20 20 69 38 20 69 73 4f 72 64          i8 isOrd
31e80 65 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73  ered = pFrom->is
31e90 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20  Ordered;.       
31ea0 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72   if( (pWLoop->pr
31eb0 65 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d  ereq & ~pFrom->m
31ec0 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f  askLoop)!=0 ) co
31ed0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
31ee0 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73  if( (pWLoop->mas
31ef0 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d  kSelf & pFrom->m
31f00 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f  askLoop)!=0 ) co
31f10 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
31f20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
31f30 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 63 61  , pWLoop is a ca
31f40 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 68  ndidate to be th
31f50 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20  e next loop. .  
31f60 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65        ** Compute
31f70 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20   its cost */.   
31f80 20 20 20 20 20 72 43 6f 73 74 20 3d 20 73 71 6c       rCost = sql
31f90 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 57  ite3LogEstAdd(pW
31fa0 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 2c 70 57 4c  Loop->rSetup,pWL
31fb0 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20 70 46 72 6f  oop->rRun + pFro
31fc0 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20  m->nRow);.      
31fd0 20 20 72 43 6f 73 74 20 3d 20 73 71 6c 69 74 65    rCost = sqlite
31fe0 33 4c 6f 67 45 73 74 41 64 64 28 72 43 6f 73 74  3LogEstAdd(rCost
31ff0 2c 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 29 3b  , pFrom->rCost);
32000 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20  .        nOut = 
32010 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57  pFrom->nRow + pW
32020 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20  Loop->nOut;.    
32030 20 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46      maskNew = pF
32040 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20  rom->maskLoop | 
32050 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  pWLoop->maskSelf
32060 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  ;.        if( is
32070 4f 72 64 65 72 65 64 3c 30 20 29 7b 0a 20 20 20  Ordered<0 ){.   
32080 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
32090 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69   = wherePathSati
320a0 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49  sfiesOrderBy(pWI
320b0 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  nfo,.           
320c0 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e              pWIn
320d0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46  fo->pOrderBy, pF
320e0 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63 74  rom, pWInfo->wct
320f0 72 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20  rlFlags,.       
32100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32110 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20 26  iLoop, pWLoop, &
32120 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20  revMask);.      
32130 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 65      if( isOrdere
32140 64 3e 3d 30 20 26 26 20 69 73 4f 72 64 65 72 65  d>=0 && isOrdere
32150 64 3c 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  d<nOrderBy ){.  
32160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e            /* TUN
32170 49 4e 47 3a 20 45 73 74 69 6d 61 74 65 64 20 63  ING: Estimated c
32180 6f 73 74 20 6f 66 20 61 20 66 75 6c 6c 20 65 78  ost of a full ex
32190 74 65 72 6e 61 6c 20 73 6f 72 74 2c 20 77 68 65  ternal sort, whe
321a0 72 65 20 4e 20 69 73 20 0a 20 20 20 20 20 20 20  re N is .       
321b0 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62       ** the numb
321c0 65 72 20 6f 66 20 72 6f 77 73 20 74 6f 20 73 6f  er of rows to so
321d0 72 74 20 69 73 3a 0a 20 20 20 20 20 20 20 20 20  rt is:.         
321e0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
321f0 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28 33    **   cost = (3
32200 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29  .0 * N * log(N))
32210 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ..            **
32220 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
32230 20 4f 72 2c 20 69 66 20 74 68 65 20 6f 72 64 65   Or, if the orde
32240 72 2d 62 79 20 63 6c 61 75 73 65 20 68 61 73 20  r-by clause has 
32250 58 20 74 65 72 6d 73 20 62 75 74 20 6f 6e 6c 79  X terms but only
32260 20 74 68 65 20 6c 61 73 74 20 59 20 0a 20 20 20   the last Y .   
32270 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d           ** term
32280 73 20 61 72 65 20 6f 75 74 20 6f 66 20 6f 72 64  s are out of ord
32290 65 72 2c 20 74 68 65 6e 20 62 6c 6f 63 6b 2d 73  er, then block-s
322a0 6f 72 74 69 6e 67 20 77 69 6c 6c 20 72 65 64 75  orting will redu
322b0 63 65 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  ce the .        
322c0 20 20 20 20 2a 2a 20 73 6f 72 74 69 6e 67 20 63      ** sorting c
322d0 6f 73 74 20 74 6f 3a 0a 20 20 20 20 20 20 20 20  ost to:.        
322e0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
322f0 20 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28     **   cost = (
32300 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29  3.0 * N * log(N)
32310 29 20 2a 20 28 59 2f 58 29 0a 20 20 20 20 20 20  ) * (Y/X).      
32320 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
32330 20 20 20 20 20 2a 2a 20 54 68 65 20 28 59 2f 58       ** The (Y/X
32340 29 20 74 65 72 6d 20 69 73 20 69 6d 70 6c 65 6d  ) term is implem
32350 65 6e 74 65 64 20 75 73 69 6e 67 20 73 74 61 63  ented using stac
32360 6b 20 76 61 72 69 61 62 6c 65 20 72 53 63 61 6c  k variable rScal
32370 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
32380 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20   below.  */.    
32390 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 72          LogEst r
323a0 53 63 61 6c 65 2c 20 72 53 6f 72 74 43 6f 73 74  Scale, rSortCost
323b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
323c0 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 30  sert( nOrderBy>0
323d0 20 26 26 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c   && 66==sqlite3L
323e0 6f 67 45 73 74 28 31 30 30 29 20 29 3b 0a 20 20  ogEst(100) );.  
323f0 20 20 20 20 20 20 20 20 20 20 72 53 63 61 6c 65            rScale
32400 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
32410 28 28 6e 4f 72 64 65 72 42 79 2d 69 73 4f 72 64  ((nOrderBy-isOrd
32420 65 72 65 64 29 2a 31 30 30 2f 6e 4f 72 64 65 72  ered)*100/nOrder
32430 42 79 29 20 2d 20 36 36 3b 0a 20 20 20 20 20 20  By) - 66;.      
32440 20 20 20 20 20 20 72 53 6f 72 74 43 6f 73 74 20        rSortCost 
32450 3d 20 6e 52 6f 77 45 73 74 20 2b 20 65 73 74 4c  = nRowEst + estL
32460 6f 67 28 6e 52 6f 77 45 73 74 29 20 2b 20 72 53  og(nRowEst) + rS
32470 63 61 6c 65 20 2b 20 31 36 3b 0a 0a 20 20 20 20  cale + 16;..    
32480 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
32490 47 3a 20 54 68 65 20 63 6f 73 74 20 6f 66 20 69  G: The cost of i
324a0 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 44 49 53 54  mplementing DIST
324b0 49 4e 43 54 20 75 73 69 6e 67 20 61 20 42 2d 54  INCT using a B-T
324c0 52 45 45 20 69 73 0a 20 20 20 20 20 20 20 20 20  REE is.         
324d0 20 20 20 2a 2a 20 73 69 6d 69 6c 61 72 20 62 75     ** similar bu
324e0 74 20 77 69 74 68 20 61 20 6c 61 72 67 65 72 20  t with a larger 
324f0 63 6f 6e 73 74 61 6e 74 20 6f 66 20 70 72 6f 70  constant of prop
32500 6f 72 74 69 6f 6e 61 6c 69 74 79 2e 20 0a 20 20  ortionality. .  
32510 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 75 6c            ** Mul
32520 74 69 70 6c 79 20 62 79 20 61 6e 20 61 64 64 69  tiply by an addi
32530 74 69 6f 6e 61 6c 20 66 61 63 74 6f 72 20 6f 66  tional factor of
32540 20 33 2e 30 2e 20 20 2a 2f 0a 20 20 20 20 20 20   3.0.  */.      
32550 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
32560 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
32570 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
32580 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  CT ){.          
32590 20 20 20 20 72 53 6f 72 74 43 6f 73 74 20 2b 3d      rSortCost +=
325a0 20 31 36 3b 0a 20 20 20 20 20 20 20 20 20 20 20   16;.           
325b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 57   }.            W
325c0 48 45 52 45 54 52 41 43 45 28 30 78 30 30 32 2c  HERETRACE(0x002,
325d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
325e0 28 22 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74  ("---- sort cost
325f0 3d 25 2d 33 64 20 28 25 64 2f 25 64 29 20 69 6e  =%-3d (%d/%d) in
32600 63 72 65 61 73 65 73 20 63 6f 73 74 20 25 33 64  creases cost %3d
32610 20 74 6f 20 25 2d 33 64 5c 6e 22 2c 0a 20 20 20   to %-3d\n",.   
32620 20 20 20 20 20 20 20 20 20 20 20 20 20 72 53 6f               rSo
32630 72 74 43 6f 73 74 2c 20 28 6e 4f 72 64 65 72 42  rtCost, (nOrderB
32640 79 2d 69 73 4f 72 64 65 72 65 64 29 2c 20 6e 4f  y-isOrdered), nO
32650 72 64 65 72 42 79 2c 20 72 43 6f 73 74 2c 0a 20  rderBy, rCost,. 
32660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
32670 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
32680 72 43 6f 73 74 2c 72 53 6f 72 74 43 6f 73 74 29  rCost,rSortCost)
32690 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
326a0 72 43 6f 73 74 20 3d 20 73 71 6c 69 74 65 33 4c  rCost = sqlite3L
326b0 6f 67 45 73 74 41 64 64 28 72 43 6f 73 74 2c 20  ogEstAdd(rCost, 
326c0 72 53 6f 72 74 43 6f 73 74 29 3b 0a 20 20 20 20  rSortCost);.    
326d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
326e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
326f0 20 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d   revMask = pFrom
32700 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20  ->revLoop;.     
32710 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
32720 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
32730 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65  pWLoop should be
32740 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6d 78   added to the mx
32750 43 68 6f 69 63 65 20 62 65 73 74 20 73 6f 20 66  Choice best so f
32760 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  ar */.        fo
32770 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b  r(jj=0, pTo=aTo;
32780 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70   jj<nTo; jj++, p
32790 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  To++){.         
327a0 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f   if( pTo->maskLo
327b0 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a 20 20 20 20  op==maskNew.    
327c0 20 20 20 20 20 20 20 26 26 20 28 28 70 54 6f 2d         && ((pTo-
327d0 3e 69 73 4f 72 64 65 72 65 64 5e 69 73 4f 72 64  >isOrdered^isOrd
327e0 65 72 65 64 29 26 38 30 29 3d 3d 30 0a 20 20 20  ered)&80)==0.   
327f0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
32800 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
32810 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b 0a 20 20 20  jj==nTo-1 );.   
32820 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
32830 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
32840 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
32850 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20  ( jj>=nTo ){.   
32860 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d         if( nTo>=
32870 6d 78 43 68 6f 69 63 65 20 26 26 20 72 43 6f 73  mxChoice && rCos
32880 74 3e 3d 6d 78 43 6f 73 74 20 29 7b 0a 23 69 66  t>=mxCost ){.#if
32890 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
328a0 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f  NABLED /* 0x4 */
328b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
328c0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
328d0 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20  ce&0x4 ){.      
328e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
328f0 65 62 75 67 50 72 69 6e 74 66 28 22 53 6b 69 70  ebugPrintf("Skip
32900 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c     %s cost=%-3d,
32910 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c  %3d order=%c\n",
32920 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32930 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
32940 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70  (pFrom, iLoop, p
32950 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e  WLoop), rCost, n
32960 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Out,.           
32970 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
32980 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b  >=0 ? isOrdered+
32990 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  '0' : '?');.    
329a0 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
329b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
329c0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
329d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20   }.          /* 
329e0 41 64 64 20 61 20 6e 65 77 20 50 61 74 68 20 74  Add a new Path t
329f0 6f 20 74 68 65 20 61 54 6f 5b 5d 20 73 65 74 20  o the aTo[] set 
32a00 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
32a10 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29 7b   nTo<mxChoice ){
32a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
32a30 49 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a  Increase the siz
32a40 65 20 6f 66 20 74 68 65 20 61 54 6f 20 73 65 74  e of the aTo set
32a50 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20   by one */.     
32a60 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b         jj = nTo+
32a70 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  +;.          }el
32a80 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
32a90 2f 2a 20 4e 65 77 20 70 61 74 68 20 72 65 70 6c  /* New path repl
32aa0 61 63 65 73 20 74 68 65 20 70 72 69 6f 72 20 77  aces the prior w
32ab0 6f 72 73 74 20 74 6f 20 6b 65 65 70 20 63 6f 75  orst to keep cou
32ac0 6e 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69 63  nt below mxChoic
32ad0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
32ae0 20 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20 20 20 20   jj = mxI;.     
32af0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
32b00 20 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b   pTo = &aTo[jj];
32b10 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
32b20 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
32b30 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  4 */.          i
32b40 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
32b50 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
32b60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
32b70 65 62 75 67 50 72 69 6e 74 66 28 22 4e 65 77 20  ebugPrintf("New 
32b80 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c     %s cost=%-3d,
32b90 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c  %3d order=%c\n",
32ba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32bb0 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
32bc0 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c  From, iLoop, pWL
32bd0 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75  oop), rCost, nOu
32be0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
32bf0 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20     isOrdered>=0 
32c00 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20  ? isOrdered+'0' 
32c10 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
32c20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
32c30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32c40 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f      if( pTo->rCo
32c50 73 74 3c 3d 72 43 6f 73 74 20 29 7b 0a 23 69 66  st<=rCost ){.#if
32c60 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
32c70 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f  NABLED /* 0x4 */
32c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
32c90 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
32ca0 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20  ce&0x4 ){.      
32cb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
32cc0 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20  ebugPrintf(.    
32cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
32ce0 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d  kip   %s cost=%-
32cf0 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22  3d,%3d order=%c"
32d00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
32d10 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
32d20 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20  e(pFrom, iLoop, 
32d30 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20  pWLoop), rCost, 
32d40 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20  nOut,.          
32d50 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
32d60 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64  d>=0 ? isOrdered
32d70 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20  +'0' : '?');.   
32d80 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
32d90 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
32da0 20 20 76 73 20 25 73 20 63 6f 73 74 3d 25 2d 33    vs %s cost=%-3
32db0 64 2c 25 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22  d,%d order=%c\n"
32dc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
32dd0 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
32de0 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20  e(pTo, iLoop+1, 
32df0 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20  0), pTo->rCost, 
32e00 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20  pTo->nRow,.     
32e10 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 6f               pTo
32e20 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f  ->isOrdered>=0 ?
32e30 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b   pTo->isOrdered+
32e40 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  '0' : '?');.    
32e50 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
32e60 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
32e70 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73  tcase( pTo->rCos
32e80 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20 20 20 20  t==rCost );.    
32e90 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
32ea0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
32eb0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
32ec0 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43  ( pTo->rCost==rC
32ed0 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20 20 20 20  ost+1 );.       
32ee0 20 20 20 2f 2a 20 41 20 6e 65 77 20 61 6e 64 20     /* A new and 
32ef0 62 65 74 74 65 72 20 73 63 6f 72 65 20 66 6f 72  better score for
32f00 20 61 20 70 72 65 76 69 6f 75 73 6c 79 20 63 72   a previously cr
32f10 65 61 74 65 64 20 65 71 75 69 76 61 6c 65 6e 74  eated equivalent
32f20 20 70 61 74 68 20 2a 2f 0a 23 69 66 64 65 66 20   path */.#ifdef 
32f30 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
32f40 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20  ED /* 0x4 */.   
32f50 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
32f60 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
32f70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
32f80 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
32f90 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  tf(.            
32fa0 20 20 20 20 22 55 70 64 61 74 65 20 25 73 20 63      "Update %s c
32fb0 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64  ost=%-3d,%3d ord
32fc0 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20  er=%c",.        
32fd0 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
32fe0 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
32ff0 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
33000 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20  st, nOut,.      
33010 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
33020 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72  red>=0 ? isOrder
33030 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20  ed+'0' : '?');. 
33040 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
33050 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
33060 20 77 61 73 20 25 73 20 63 6f 73 74 3d 25 2d 33   was %s cost=%-3
33070 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e  d,%3d order=%c\n
33080 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
33090 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
330a0 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30  (pTo, iLoop+1, 0
330b0 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70  ), pTo->rCost, p
330c0 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20  To->nRow,.      
330d0 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69            pTo->i
330e0 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 70 54  sOrdered>=0 ? pT
330f0 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27  o->isOrdered+'0'
33100 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
33110 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
33120 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
33130 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 77 69 6e   pWLoop is a win
33140 6e 65 72 2e 20 20 41 64 64 20 69 74 20 74 6f 20  ner.  Add it to 
33150 74 68 65 20 73 65 74 20 6f 66 20 62 65 73 74 20  the set of best 
33160 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20  so far */.      
33170 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20    pTo->maskLoop 
33180 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f  = pFrom->maskLoo
33190 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  p | pWLoop->mask
331a0 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 70 54  Self;.        pT
331b0 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20 72 65 76  o->revLoop = rev
331c0 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 54  Mask;.        pT
331d0 6f 2d 3e 6e 52 6f 77 20 3d 20 6e 4f 75 74 3b 0a  o->nRow = nOut;.
331e0 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 43 6f          pTo->rCo
331f0 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20 20 20  st = rCost;.    
33200 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72      pTo->isOrder
33210 65 64 20 3d 20 69 73 4f 72 64 65 72 65 64 3b 0a  ed = isOrdered;.
33220 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
33230 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d  To->aLoop, pFrom
33240 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a 65 6f 66 28  ->aLoop, sizeof(
33250 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f  WhereLoop*)*iLoo
33260 70 29 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  p);.        pTo-
33270 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20  >aLoop[iLoop] = 
33280 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  pWLoop;.        
33290 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63  if( nTo>=mxChoic
332a0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  e ){.          m
332b0 78 49 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xI = 0;.        
332c0 20 20 6d 78 43 6f 73 74 20 3d 20 61 54 6f 5b 30    mxCost = aTo[0
332d0 5d 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20  ].rCost;.       
332e0 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70 54 6f     for(jj=1, pTo
332f0 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78 43  =&aTo[1]; jj<mxC
33300 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54 6f  hoice; jj++, pTo
33310 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
33320 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3e   if( pTo->rCost>
33330 6d 78 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20  mxCost ){.      
33340 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d          mxCost =
33350 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20 20   pTo->rCost;.   
33360 20 20 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d             mxI =
33370 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20   jj;.           
33380 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
33390 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
333a0 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 57  .    }..#ifdef W
333b0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
333c0 44 20 20 2f 2a 20 3e 3d 32 20 2a 2f 0a 20 20 20  D  /* >=2 */.   
333d0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
333e0 65 54 72 61 63 65 3e 3d 32 20 29 7b 0a 20 20 20  eTrace>=2 ){.   
333f0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
33400 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 61 66 74 65  rintf("---- afte
33410 72 20 72 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c  r round %d ----\
33420 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20  n", iLoop);.    
33430 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 54 6f 3d    for(ii=0, pTo=
33440 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b  aTo; ii<nTo; ii+
33450 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20  +, pTo++){.     
33460 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
33470 72 69 6e 74 66 28 22 20 25 73 20 63 6f 73 74 3d  rintf(" %s cost=
33480 25 2d 33 64 20 6e 72 6f 77 3d 25 2d 33 64 20 6f  %-3d nrow=%-3d o
33490 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20  rder=%c",.      
334a0 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
334b0 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c  me(pTo, iLoop+1,
334c0 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c   0), pTo->rCost,
334d0 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20   pTo->nRow,.    
334e0 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72         pTo->isOr
334f0 64 65 72 65 64 3e 3d 30 20 3f 20 28 70 54 6f 2d  dered>=0 ? (pTo-
33500 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27 29 20  >isOrdered+'0') 
33510 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
33520 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72  if( pTo->isOrder
33530 65 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ed>0 ){.        
33540 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
33550 69 6e 74 66 28 22 20 72 65 76 3d 30 78 25 6c 6c  intf(" rev=0x%ll
33560 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f  x\n", pTo->revLo
33570 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  op);.        }el
33580 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
33590 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
335a0 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  ("\n");.        
335b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
335c0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53  #endif..    /* S
335d0 77 61 70 20 74 68 65 20 72 6f 6c 65 73 20 6f 66  wap the roles of
335e0 20 61 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20 66   aFrom and aTo f
335f0 6f 72 20 74 68 65 20 6e 65 78 74 20 67 65 6e 65  or the next gene
33600 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 46  ration */.    pF
33610 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20 61  rom = aTo;.    a
33620 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20 20  To = aFrom;.    
33630 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20  aFrom = pFrom;. 
33640 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a     nFrom = nTo;.
33650 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f 6d    }..  if( nFrom
33660 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
33670 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
33680 65 2c 20 22 6e 6f 20 71 75 65 72 79 20 73 6f 6c  e, "no query sol
33690 75 74 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71 6c  ution");.    sql
336a0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
336b0 53 70 61 63 65 29 3b 0a 20 20 20 20 72 65 74 75  Space);.    retu
336c0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
336d0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6e  .  }.  .  /* Fin
336e0 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  d the lowest cos
336f0 74 20 70 61 74 68 2e 20 20 70 46 72 6f 6d 20 77  t path.  pFrom w
33700 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e  ill be left poin
33710 74 69 6e 67 20 74 6f 20 74 68 61 74 20 70 61 74  ting to that pat
33720 68 20 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20 61  h */.  pFrom = a
33730 46 72 6f 6d 3b 0a 20 20 66 6f 72 28 69 69 3d 31  From;.  for(ii=1
33740 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b  ; ii<nFrom; ii++
33750 29 7b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d  ){.    if( pFrom
33760 2d 3e 72 43 6f 73 74 3e 61 46 72 6f 6d 5b 69 69  ->rCost>aFrom[ii
33770 5d 2e 72 43 6f 73 74 20 29 20 70 46 72 6f 6d 20  ].rCost ) pFrom 
33780 3d 20 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20  = &aFrom[ii];.  
33790 7d 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  }.  assert( pWIn
337a0 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f  fo->nLevel==nLoo
337b0 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20 74  p );.  /* Load t
337c0 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70  he lowest cost p
337d0 61 74 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f 20  ath into pWInfo 
337e0 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30  */.  for(iLoop=0
337f0 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69  ; iLoop<nLoop; i
33800 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68 65  Loop++){.    Whe
33810 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20  reLevel *pLevel 
33820 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c  = pWInfo->a + iL
33830 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  oop;.    pLevel-
33840 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70  >pWLoop = pWLoop
33850 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b   = pFrom->aLoop[
33860 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65 76  iLoop];.    pLev
33870 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c 6f  el->iFrom = pWLo
33880 6f 70 2d 3e 69 54 61 62 3b 0a 20 20 20 20 70 4c  op->iTab;.    pL
33890 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20  evel->iTabCur = 
338a0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
338b0 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
338c0 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d 0a  m].iCursor;.  }.
338d0 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
338e0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
338f0 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29  E_WANT_DISTINCT)
33900 21 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66  !=0.   && (pWInf
33910 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
33920 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
33930 29 3d 3d 30 0a 20 20 20 26 26 20 70 57 49 6e 66  )==0.   && pWInf
33940 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57 48  o->eDistinct==WH
33950 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f  ERE_DISTINCT_NOO
33960 50 0a 20 20 20 26 26 20 6e 52 6f 77 45 73 74 0a  P.   && nRowEst.
33970 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b    ){.    Bitmask
33980 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 69 6e   notUsed;.    in
33990 74 20 72 63 20 3d 20 77 68 65 72 65 50 61 74 68  t rc = wherePath
339a0 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
339b0 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d  (pWInfo, pWInfo-
339c0 3e 70 52 65 73 75 6c 74 53 65 74 2c 20 70 46 72  >pResultSet, pFr
339d0 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  om,.            
339e0 20 20 20 20 20 57 48 45 52 45 5f 44 49 53 54 49       WHERE_DISTI
339f0 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20  NCTBY, nLoop-1, 
33a00 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f  pFrom->aLoop[nLo
33a10 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64 29  op-1], &notUsed)
33a20 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 70 57  ;.    if( rc==pW
33a30 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74  Info->pResultSet
33a40 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
33a50 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
33a60 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
33a70 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20  NCT_ORDERED;.   
33a80 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49   }.  }.  if( pWI
33a90 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  nfo->pOrderBy ){
33aa0 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
33ab0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
33ac0 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29  ERE_DISTINCTBY )
33ad0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 6f  {.      if( pFro
33ae0 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d 70 57  m->isOrdered==pW
33af0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Info->pOrderBy->
33b00 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
33b10 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
33b20 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
33b30 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20  NCT_ORDERED;.   
33b40 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
33b50 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f        pWInfo->nO
33b60 42 53 61 74 20 3d 20 70 46 72 6f 6d 2d 3e 69 73  BSat = pFrom->is
33b70 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 69  Ordered;.      i
33b80 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61  f( pWInfo->nOBSa
33b90 74 3c 30 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f  t<0 ) pWInfo->nO
33ba0 42 53 61 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  BSat = 0;.      
33bb0 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20  pWInfo->revMask 
33bc0 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70  = pFrom->revLoop
33bd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
33be0 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
33bf0 61 67 73 20 26 20 57 48 45 52 45 5f 53 4f 52 54  ags & WHERE_SORT
33c00 42 59 47 52 4f 55 50 29 0a 20 20 20 20 20 20 20  BYGROUP).       
33c10 20 26 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53   && pWInfo->nOBS
33c20 61 74 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  at==pWInfo->pOrd
33c30 65 72 42 79 2d 3e 6e 45 78 70 72 0a 20 20 20 20  erBy->nExpr.    
33c40 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  ){.      Bitmask
33c50 20 6e 6f 74 55 73 65 64 20 3d 20 30 3b 0a 20 20   notUsed = 0;.  
33c60 20 20 20 20 69 6e 74 20 6e 4f 72 64 65 72 20 3d      int nOrder =
33c70 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66   wherePathSatisf
33c80 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66  iesOrderBy(pWInf
33c90 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  o, pWInfo->pOrde
33ca0 72 42 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rBy, .          
33cb0 70 46 72 6f 6d 2c 20 30 2c 20 6e 4c 6f 6f 70 2d  pFrom, 0, nLoop-
33cc0 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b  1, pFrom->aLoop[
33cd0 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73  nLoop-1], &notUs
33ce0 65 64 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  ed.      );.    
33cf0 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
33d00 2d 3e 73 6f 72 74 65 64 3d 3d 30 20 29 3b 0a 20  ->sorted==0 );. 
33d10 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 73 6f 72       pWInfo->sor
33d20 74 65 64 20 3d 20 28 6e 4f 72 64 65 72 3d 3d 70  ted = (nOrder==p
33d30 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d  WInfo->pOrderBy-
33d40 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  >nExpr);.    }. 
33d50 20 7d 0a 0a 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e   }...  pWInfo->n
33d60 52 6f 77 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e  RowOut = pFrom->
33d70 6e 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  nRow;..  /* Free
33d80 20 74 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72   temporary memor
33d90 79 20 61 6e 64 20 72 65 74 75 72 6e 20 73 75 63  y and return suc
33da0 63 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  cess */.  sqlite
33db0 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 70 61  3DbFree(db, pSpa
33dc0 63 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ce);.  return SQ
33dd0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
33de0 2a 20 4d 6f 73 74 20 71 75 65 72 69 65 73 20 75  * Most queries u
33df0 73 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  se only a single
33e00 20 74 61 62 6c 65 20 28 74 68 65 79 20 61 72 65   table (they are
33e10 20 6e 6f 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20   not joins) and 
33e20 68 61 76 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d  have.** simple =
33e30 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 67  = constraints ag
33e40 61 69 6e 73 74 20 69 6e 64 65 78 65 64 20 66 69  ainst indexed fi
33e50 65 6c 64 73 2e 20 20 54 68 69 73 20 72 6f 75 74  elds.  This rout
33e60 69 6e 65 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20  ine attempts.** 
33e70 74 6f 20 70 6c 61 6e 20 74 68 6f 73 65 20 73 69  to plan those si
33e80 6d 70 6c 65 20 63 61 73 65 73 20 75 73 69 6e 67  mple cases using
33e90 20 6d 75 63 68 20 6c 65 73 73 20 63 65 72 65 6d   much less cerem
33ea0 6f 6e 79 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20  ony than the.** 
33eb0 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20  general-purpose 
33ec0 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61  query planner, a
33ed0 6e 64 20 74 68 65 72 65 62 79 20 79 69 65 6c 64  nd thereby yield
33ee0 20 66 61 73 74 65 72 20 73 71 6c 69 74 65 33 5f   faster sqlite3_
33ef0 70 72 65 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d  prepare().** tim
33f00 65 73 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  es for the commo
33f10 6e 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  n case..**.** Re
33f20 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e  turn non-zero on
33f30 20 73 75 63 63 65 73 73 2c 20 69 66 20 74 68 69   success, if thi
33f40 73 20 71 75 65 72 79 20 63 61 6e 20 62 65 20 68  s query can be h
33f50 61 6e 64 6c 65 64 20 62 79 20 74 68 69 73 0a 2a  andled by this.*
33f60 2a 20 6e 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72  * no-frills quer
33f70 79 20 70 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75  y planner.  Retu
33f80 72 6e 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20  rn zero if this 
33f90 71 75 65 72 79 20 6e 65 65 64 73 20 74 68 65 20  query needs the 
33fa0 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70  .** general-purp
33fb0 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  ose query planne
33fc0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
33fd0 20 77 68 65 72 65 53 68 6f 72 74 43 75 74 28 57   whereShortCut(W
33fe0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
33ff0 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68  *pBuilder){.  Wh
34000 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
34010 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
34020 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
34030 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
34040 43 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  C;.  WhereTerm *
34050 70 54 65 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f  pTerm;.  WhereLo
34060 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74  op *pLoop;.  int
34070 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a   iCur;.  int j;.
34080 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
34090 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
340a0 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  .  pWInfo = pBui
340b0 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
340c0 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  if( pWInfo->wctr
340d0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46  lFlags & WHERE_F
340e0 4f 52 43 45 5f 54 41 42 4c 45 20 29 20 72 65 74  ORCE_TABLE ) ret
340f0 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28  urn 0;.  assert(
34100 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
34110 74 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20  t->nSrc>=1 );.  
34120 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e  pItem = pWInfo->
34130 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70  pTabList->a;.  p
34140 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61  Tab = pItem->pTa
34150 62 3b 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  b;.  if( IsVirtu
34160 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72  al(pTab) ) retur
34170 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 74 65 6d  n 0;.  if( pItem
34180 2d 3e 7a 49 6e 64 65 78 20 29 20 72 65 74 75 72  ->zIndex ) retur
34190 6e 20 30 3b 0a 20 20 69 43 75 72 20 3d 20 70 49  n 0;.  iCur = pI
341a0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
341b0 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73  pWC = &pWInfo->s
341c0 57 43 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 42  WC;.  pLoop = pB
341d0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
341e0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d  pLoop->wsFlags =
341f0 20 30 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62   0;.  pLoop->u.b
34200 74 72 65 65 2e 6e 53 6b 69 70 20 3d 20 30 3b 0a  tree.nSkip = 0;.
34210 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
34220 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31  rm(pWC, iCur, -1
34230 2c 20 30 2c 20 57 4f 5f 45 51 2c 20 30 29 3b 0a  , 0, WO_EQ, 0);.
34240 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20    if( pTerm ){. 
34250 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67     pLoop->wsFlag
34260 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s = WHERE_COLUMN
34270 5f 45 51 7c 57 48 45 52 45 5f 49 50 4b 7c 57 48  _EQ|WHERE_IPK|WH
34280 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20  ERE_ONEROW;.    
34290 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  pLoop->aLTerm[0]
342a0 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4c   = pTerm;.    pL
342b0 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b  oop->nLTerm = 1;
342c0 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  .    pLoop->u.bt
342d0 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20  ree.nEq = 1;.   
342e0 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74   /* TUNING: Cost
342f0 20 6f 66 20 61 20 72 6f 77 69 64 20 6c 6f 6f 6b   of a rowid look
34300 75 70 20 69 73 20 31 30 20 2a 2f 0a 20 20 20 20  up is 10 */.    
34310 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 33  pLoop->rRun = 33
34320 3b 20 20 2f 2a 20 33 33 3d 3d 73 71 6c 69 74 65  ;  /* 33==sqlite
34330 33 4c 6f 67 45 73 74 28 31 30 29 20 2a 2f 0a 20  3LogEst(10) */. 
34340 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
34350 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
34360 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
34370 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
34380 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d    assert( pLoop-
34390 3e 61 4c 54 65 72 6d 53 70 61 63 65 3d 3d 70 4c  >aLTermSpace==pL
343a0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 20 29 3b 0a 20  oop->aLTerm );. 
343b0 20 20 20 20 20 61 73 73 65 72 74 28 20 41 72 72       assert( Arr
343c0 61 79 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c  aySize(pLoop->aL
343d0 54 65 72 6d 53 70 61 63 65 29 3d 3d 34 20 29 3b  TermSpace)==4 );
343e0 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
343f0 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e  >onError==OE_Non
34400 65 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64  e .       || pId
34410 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  x->pPartIdxWhere
34420 21 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  !=0 .       || p
34430 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 41 72 72  Idx->nKeyCol>Arr
34440 61 79 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c  aySize(pLoop->aL
34450 54 65 72 6d 53 70 61 63 65 29 20 0a 20 20 20 20  TermSpace) .    
34460 20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20    ) continue;.  
34470 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
34480 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b  Idx->nKeyCol; j+
34490 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72  +){.        pTer
344a0 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  m = findTerm(pWC
344b0 2c 20 69 43 75 72 2c 20 70 49 64 78 2d 3e 61 69  , iCur, pIdx->ai
344c0 43 6f 6c 75 6d 6e 5b 6a 5d 2c 20 30 2c 20 57 4f  Column[j], 0, WO
344d0 5f 45 51 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  _EQ, pIdx);.    
344e0 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
344f0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
34500 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b    pLoop->aLTerm[
34510 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  j] = pTerm;.    
34520 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 21    }.      if( j!
34530 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29  =pIdx->nKeyCol )
34540 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
34550 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
34560 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  = WHERE_COLUMN_E
34570 51 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 7c 57  Q|WHERE_ONEROW|W
34580 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20  HERE_INDEXED;.  
34590 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 69 73      if( pIdx->is
345a0 43 6f 76 65 72 69 6e 67 20 7c 7c 20 28 70 49 74  Covering || (pIt
345b0 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63  em->colUsed & ~c
345c0 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70 49  olumnsInIndex(pI
345d0 64 78 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  dx))==0 ){.     
345e0 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67     pLoop->wsFlag
345f0 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f  s |= WHERE_IDX_O
34600 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  NLY;.      }.   
34610 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d     pLoop->nLTerm
34620 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f   = j;.      pLoo
34630 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  p->u.btree.nEq =
34640 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d   j;.      pLoop-
34650 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
34660 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 2f 2a  = pIdx;.      /*
34670 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66   TUNING: Cost of
34680 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 20   a unique index 
34690 6c 6f 6f 6b 75 70 20 69 73 20 31 35 20 2a 2f 0a  lookup is 15 */.
346a0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75        pLoop->rRu
346b0 6e 20 3d 20 33 39 3b 20 20 2f 2a 20 33 39 3d 3d  n = 39;  /* 39==
346c0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 35  sqlite3LogEst(15
346d0 29 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  ) */.      break
346e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
346f0 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
34700 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e   ){.    pLoop->n
34710 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 31 3b  Out = (LogEst)1;
34720 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30  .    pWInfo->a[0
34730 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f 6f 70  ].pWLoop = pLoop
34740 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73  ;.    pLoop->mas
34750 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28  kSelf = getMask(
34760 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
34770 74 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 70 57  t, iCur);.    pW
34780 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62 43  Info->a[0].iTabC
34790 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70  ur = iCur;.    p
347a0 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d  WInfo->nRowOut =
347b0 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e   1;.    if( pWIn
347c0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 70  fo->pOrderBy ) p
347d0 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20  WInfo->nOBSat = 
347e0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
347f0 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 66  y->nExpr;.    if
34800 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  ( pWInfo->wctrlF
34810 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
34820 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20  T_DISTINCT ){.  
34830 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
34840 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
34850 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20  STINCT_UNIQUE;. 
34860 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
34870 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70 4c 6f  TE_DEBUG.    pLo
34880 6f 70 2d 3e 63 49 64 20 3d 20 27 30 27 3b 0a 23  op->cId = '0';.#
34890 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
348a0 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
348b0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   0;.}../*.** Gen
348c0 65 72 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e  erate the beginn
348d0 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  ing of the loop 
348e0 75 73 65 64 20 66 6f 72 20 57 48 45 52 45 20 63  used for WHERE c
348f0 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
34900 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
34910 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74  value is a point
34920 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20  er to an opaque 
34930 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63  structure that c
34940 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72  ontains.** infor
34950 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f  mation needed to
34960 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
34970 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65  oop.  Later, the
34980 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
34990 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b  .** should invok
349a0 65 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  e sqlite3WhereEn
349b0 64 28 29 20 77 69 74 68 20 74 68 65 20 72 65 74  d() with the ret
349c0 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69  urn value of thi
349d0 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e  s function.** in
349e0 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65   order to comple
349f0 74 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  te the WHERE cla
34a00 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
34a10 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
34a20 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72  r occurs, this r
34a30 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e  outine returns N
34a40 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62  ULL..**.** The b
34a50 61 73 69 63 20 69 64 65 61 20 69 73 20 74 6f 20  asic idea is to 
34a60 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70  do a nested loop
34a70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65  , one loop for e
34a80 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20  ach table in.** 
34a90 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
34aa0 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49  of a select.  (I
34ab0 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45  NSERT and UPDATE
34ac0 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
34ad0 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61  the.** same as a
34ae0 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c   SELECT with onl
34af0 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  y a single table
34b00 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
34b10 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78  use.)  For.** ex
34b20 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51  ample, if the SQ
34b30 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  L is this:.**.**
34b40 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20         SELECT * 
34b50 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20  FROM t1, t2, t3 
34b60 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a  WHERE ...;.**.**
34b70 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67   Then the code g
34b80 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63  enerated is conc
34b90 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68  eptually like th
34ba0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
34bb0 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  **      foreach 
34bc0 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20  row1 in t1 do   
34bd0 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65      \    Code ge
34be0 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  nerated.**      
34bf0 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69    foreach row2 i
34c00 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d  n t2 do      |--
34c10 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
34c20 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20  Begin().**      
34c30 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33      foreach row3
34c40 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a   in t3 do   /.**
34c50 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a              ....
34c60 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64 20  **          end 
34c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c80 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65      \    Code ge
34c90 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  nerated.**      
34ca0 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
34cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d               |--
34cc0 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
34cd0 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e  End().**      en
34ce0 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
34cf0 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a            /.**.*
34d00 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
34d10 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20  loops might not 
34d20 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65  be nested in the
34d30 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20   order in which 
34d40 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69  they.** appear i
34d50 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
34d60 65 20 69 66 20 61 20 64 69 66 66 65 72 65 6e 74  e if a different
34d70 20 6f 72 64 65 72 20 69 73 20 62 65 74 74 65 72   order is better
34d80 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a   able to make.**
34d90 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e   use of indices.
34da0 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74    Note also that
34db0 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65   when the IN ope
34dc0 72 61 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e  rator appears in
34dd0 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c  .** the WHERE cl
34de0 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72  ause, it might r
34df0 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f  esult in additio
34e00 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73  nal nested loops
34e10 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67   for.** scanning
34e20 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c   through all val
34e30 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ues on the right
34e40 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
34e50 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  e IN..**.** Ther
34e60 65 20 61 72 65 20 42 74 72 65 65 20 63 75 72 73  e are Btree curs
34e70 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ors associated w
34e80 69 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20  ith each table. 
34e90 20 74 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a   t1 uses cursor.
34ea0 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69  ** number pTabLi
34eb0 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  st->a[0].iCursor
34ec0 2e 20 20 74 32 20 75 73 65 73 20 74 68 65 20 63  .  t2 uses the c
34ed0 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e  ursor pTabList->
34ee0 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a  a[1].iCursor..**
34ef0 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20   And so forth.  
34f00 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
34f10 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f  erates code to o
34f20 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63  pen those VDBE c
34f30 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71  ursors.** and sq
34f40 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20  lite3WhereEnd() 
34f50 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
34f60 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d  de to close them
34f70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  ..**.** The code
34f80 20 74 68 61 74 20 73 71 6c 69 74 65 33 57 68 65   that sqlite3Whe
34f90 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61  reBegin() genera
34fa0 74 65 73 20 6c 65 61 76 65 73 20 74 68 65 20 63  tes leaves the c
34fb0 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20  ursors named.** 
34fc0 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e  in pTabList poin
34fd0 74 69 6e 67 20 61 74 20 74 68 65 69 72 20 61 70  ting at their ap
34fe0 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65  propriate entrie
34ff0 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f  s.  The [...] co
35000 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50  de.** can use OP
35010 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52  _Column and OP_R
35020 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20  owid opcodes on 
35030 74 68 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f  these cursors to
35040 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61   extract.** data
35050 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75   from the variou
35060 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20  s tables of the 
35070 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  loop..**.** If t
35080 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
35090 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f  is empty, the fo
350a0 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74  reach loops must
350b0 20 65 61 63 68 20 73 63 61 6e 20 74 68 65 69 72   each scan their
350c0 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65  .** entire table
350d0 73 2e 20 20 54 68 75 73 20 61 20 74 68 72 65 65  s.  Thus a three
350e0 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20  -way join is an 
350f0 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e  O(N^3) operation
35100 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65  .  But if.** the
35110 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64   tables have ind
35120 69 63 65 73 20 61 6e 64 20 74 68 65 72 65 20 61  ices and there a
35130 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  re terms in the 
35140 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
35150 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68  t.** refer to th
35160 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63  ose indices, a c
35170 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63  omplete table sc
35180 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65  an can be avoide
35190 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64  d and the.** cod
351a0 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20  e will run much 
351b0 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66  faster.  Most of
351c0 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69   the work of thi
351d0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65  s routine is che
351e0 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20  cking.** to see 
351f0 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 64  if there are ind
35200 69 63 65 73 20 74 68 61 74 20 63 61 6e 20 62 65  ices that can be
35210 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75   used to speed u
35220 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a  p the loop..**.*
35230 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57  * Terms of the W
35240 48 45 52 45 20 63 6c 61 75 73 65 20 61 72 65 20  HERE clause are 
35250 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d  also used to lim
35260 69 74 20 77 68 69 63 68 20 72 6f 77 73 20 61 63  it which rows ac
35270 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69  tually.** make i
35280 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69  t to the "..." i
35290 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20  n the middle of 
352a0 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72  the loop.  After
352b0 20 65 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c   each "foreach",
352c0 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65  .** terms of the
352d0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
352e0 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d  at use only term
352f0 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61  s in that loop a
35300 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70  nd outer.** loop
35310 73 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  s are evaluated 
35320 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a  and if false a j
35330 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75  ump is made arou
35340 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e  nd all subsequen
35350 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73  t.** inner loops
35360 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20   (or around the 
35370 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73  "..." if the tes
35380 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  t occurs within 
35390 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f  the inner-.** mo
353a0 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f  st loop).**.** O
353b0 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a  UTER JOINS.**.**
353c0 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f   An outer join o
353d0 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20  f tables t1 and 
353e0 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c  t2 is conceptall
353f0 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f  y coded as follo
35400 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72  ws:.**.**    for
35410 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20  each row1 in t1 
35420 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20  do.**      flag 
35430 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65  = 0.**      fore
35440 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64  ach row2 in t2 d
35450 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72  o.**        star
35460 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e  t:.**          .
35470 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66  ...**          f
35480 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20  lag = 1.**      
35490 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66  end.**      if f
354a0 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20  lag==0 then.**  
354b0 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72        move the r
354c0 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20  ow2 cursor to a 
354d0 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20  null row.**     
354e0 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a     goto start.**
354f0 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65        fi.**    e
35500 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42  nd.**.** ORDER B
35510 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53  Y CLAUSE PROCESS
35520 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72  ING.**.** pOrder
35530 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  By is a pointer 
35540 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
35550 63 6c 61 75 73 65 20 28 6f 72 20 74 68 65 20 47  clause (or the G
35560 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 2a  ROUP BY clause.*
35570 2a 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 47  * if the WHERE_G
35580 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20 73  ROUPBY flag is s
35590 65 74 20 69 6e 20 77 63 74 72 6c 46 6c 61 67 73  et in wctrlFlags
355a0 29 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74  ) of a SELECT st
355b0 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 66 20 74 68  atement.** if th
355c0 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20  ere is one.  If 
355d0 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45  there is no ORDE
355e0 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69  R BY clause or i
355f0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  f this routine.*
35600 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  * is called from
35610 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
35620 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20  LETE statement, 
35630 74 68 65 6e 20 70 4f 72 64 65 72 42 79 20 69 73  then pOrderBy is
35640 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   NULL..**.** The
35650 20 69 49 64 78 43 75 72 20 70 61 72 61 6d 65 74   iIdxCur paramet
35660 65 72 20 69 73 20 74 68 65 20 63 75 72 73 6f 72  er is the cursor
35670 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e   number of an in
35680 64 65 78 2e 20 20 49 66 20 0a 2a 2a 20 57 48 45  dex.  If .** WHE
35690 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
356a0 20 69 73 20 73 65 74 2c 20 69 49 64 78 43 75 72   is set, iIdxCur
356b0 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e   is the cursor n
356c0 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65  umber of an inde
356d0 78 0a 2a 2a 20 74 6f 20 75 73 65 20 66 6f 72 20  x.** to use for 
356e0 4f 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  OR clause proces
356f0 73 69 6e 67 2e 20 20 54 68 65 20 57 48 45 52 45  sing.  The WHERE
35700 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 75   clause should u
35710 73 65 20 74 68 69 73 0a 2a 2a 20 73 70 65 63 69  se this.** speci
35720 66 69 63 20 63 75 72 73 6f 72 2e 20 20 49 66 20  fic cursor.  If 
35730 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
35740 53 49 52 45 44 20 69 73 20 73 65 74 2c 20 74 68  SIRED is set, th
35750 65 6e 20 69 49 64 78 43 75 72 20 69 73 0a 2a 2a  en iIdxCur is.**
35760 20 74 68 65 20 66 69 72 73 74 20 63 75 72 73 6f   the first curso
35770 72 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  r in an array of
35780 20 63 75 72 73 6f 72 73 20 66 6f 72 20 61 6c 6c   cursors for all
35790 20 69 6e 64 69 63 65 73 2e 20 20 69 49 64 78 43   indices.  iIdxC
357a0 75 72 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  ur should.** be 
357b0 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  used to compute 
357c0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
357d0 63 75 72 73 6f 72 20 64 65 70 65 6e 64 69 6e 67  cursor depending
357e0 20 6f 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20   on which index 
357f0 69 73 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 57  is.** used..*/.W
35800 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65  hereInfo *sqlite
35810 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50  3WhereBegin(.  P
35820 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
35830 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
35840 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
35850 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
35860 74 2c 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  t,    /* FROM cl
35870 61 75 73 65 3a 20 41 20 6c 69 73 74 20 6f 66 20  ause: A list of 
35880 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65  all tables to be
35890 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78   scanned */.  Ex
358a0 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
358b0 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
358c0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
358d0 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
358e0 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42     /* An ORDER B
358f0 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20  Y (or GROUP BY) 
35900 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20  clause, or NULL 
35910 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
35920 52 65 73 75 6c 74 53 65 74 2c 20 2f 2a 20 52 65  ResultSet, /* Re
35930 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
35940 71 75 65 72 79 20 2a 2f 0a 20 20 75 31 36 20 77  query */.  u16 w
35950 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20  ctrlFlags,      
35960 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57   /* One of the W
35970 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66  HERE_* flags def
35980 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e  ined in sqliteIn
35990 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  t.h */.  int iId
359a0 78 43 75 72 20 20 20 20 20 20 20 20 20 20 20 2f  xCur           /
359b0 2a 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 54 41  * If WHERE_ONETA
359c0 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c  BLE_ONLY is set,
359d0 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 6e 75   index cursor nu
359e0 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  mber */.){.  int
359f0 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20 20 20   nByteWInfo;    
35a00 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20          /* Num. 
35a10 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
35a20 66 6f 72 20 57 68 65 72 65 49 6e 66 6f 20 73 74  for WhereInfo st
35a30 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  ruct */.  int nT
35a40 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  abList;         
35a50 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
35a60 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54  f elements in pT
35a70 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72  abList */.  Wher
35a80 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
35a90 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62         /* Will b
35aa0 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e  ecome the return
35ab0 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
35ac0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62  unction */.  Vdb
35ad0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
35ae0 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76  Vdbe;   /* The v
35af0 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20  irtual database 
35b00 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d  engine */.  Bitm
35b10 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20  ask notReady;   
35b20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
35b30 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79  s that are not y
35b40 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f  et positioned */
35b50 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
35b60 64 65 72 20 73 57 4c 42 3b 20 20 20 20 20 2f 2a  der sWLB;     /*
35b70 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 62   The WhereLoop b
35b80 75 69 6c 64 65 72 20 2a 2f 0a 20 20 57 68 65 72  uilder */.  Wher
35b90 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
35ba0 65 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 65 78  et;    /* The ex
35bb0 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65  pression mask se
35bc0 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  t */.  WhereLeve
35bd0 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20  l *pLevel;      
35be0 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65    /* A single le
35bf0 76 65 6c 20 69 6e 20 70 57 49 6e 66 6f 2d 3e 61  vel in pWInfo->a
35c00 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  [] */.  WhereLoo
35c10 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  p *pLoop;       
35c20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
35c30 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4c   a single WhereL
35c40 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
35c50 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
35c60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
35c70 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
35c80 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
35c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
35ca0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
35cb0 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  n */.  int rc;  
35cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35cd0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
35ce0 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 56 61 72 69 61   */...  /* Varia
35cf0 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ble initializati
35d00 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  on */.  db = pPa
35d10 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73 65  rse->db;.  memse
35d20 74 28 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a 65  t(&sWLB, 0, size
35d30 6f 66 28 73 57 4c 42 29 29 3b 0a 0a 20 20 2f 2a  of(sWLB));..  /*
35d40 20 41 6e 20 4f 52 44 45 52 2f 47 52 4f 55 50 20   An ORDER/GROUP 
35d50 42 59 20 63 6c 61 75 73 65 20 6f 66 20 6d 6f 72  BY clause of mor
35d60 65 20 74 68 61 6e 20 36 33 20 74 65 72 6d 73 20  e than 63 terms 
35d70 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69  cannot be optimi
35d80 7a 65 64 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  zed */.  testcas
35d90 65 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 70  e( pOrderBy && p
35da0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d  OrderBy->nExpr==
35db0 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 70  BMS-1 );.  if( p
35dc0 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72 64 65  OrderBy && pOrde
35dd0 72 42 79 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53 20  rBy->nExpr>=BMS 
35de0 29 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ) pOrderBy = 0;.
35df0 20 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20    sWLB.pOrderBy 
35e00 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f  = pOrderBy;..  /
35e10 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20 44 49  * Disable the DI
35e20 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74  STINCT optimizat
35e30 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69  ion if SQLITE_Di
35e40 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74  stinctOpt is set
35e50 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65   via.  ** sqlite
35e60 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49  3_test_ctrl(SQLI
35e70 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
35e80 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a  MIZATIONS,...) *
35e90 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  /.  if( Optimiza
35ea0 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c  tionDisabled(db,
35eb0 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74   SQLITE_Distinct
35ec0 4f 70 74 29 20 29 7b 0a 20 20 20 20 77 63 74 72  Opt) ){.    wctr
35ed0 6c 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45  lFlags &= ~WHERE
35ee0 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b 0a  _WANT_DISTINCT;.
35ef0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75    }..  /* The nu
35f00 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69  mber of tables i
35f10 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
35f20 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20  e is limited by 
35f30 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
35f40 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69 74  ** bits in a Bit
35f50 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73  mask .  */.  tes
35f60 74 63 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d  tcase( pTabList-
35f70 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20  >nSrc==BMS );.  
35f80 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  if( pTabList->nS
35f90 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71  rc>BMS ){.    sq
35fa0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
35fb0 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25  arse, "at most %
35fc0 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f  d tables in a jo
35fd0 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72  in", BMS);.    r
35fe0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
35ff0 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
36000 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61   normally genera
36010 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f  tes a nested loo
36020 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  p for all tables
36030 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69   in .  ** pTabLi
36040 73 74 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  st.  But if the 
36050 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
36060 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74 2c  NLY flag is set,
36070 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a   then we should.
36080 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61    ** only genera
36090 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
360a0 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70  first table in p
360b0 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75  TabList and assu
360c0 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79  me that.  ** any
360d0 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61   cursors associa
360e0 74 65 64 20 77 69 74 68 20 73 75 62 73 65 71 75  ted with subsequ
360f0 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20 75  ent tables are u
36100 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20  ninitialized..  
36110 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20  */.  nTabList = 
36120 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
36130 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
36140 59 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73  Y) ? 1 : pTabLis
36150 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41  t->nSrc;..  /* A
36160 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
36170 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65  ialize the Where
36180 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
36190 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
361a0 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  the.  ** return 
361b0 76 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20  value. A single 
361c0 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73  allocation is us
361d0 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
361e0 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73  WhereInfo.  ** s
361f0 74 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65  truct, the conte
36200 6e 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f  nts of WhereInfo
36210 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43  .a[], the WhereC
36220 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a  lause structure.
36230 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65    ** and the Whe
36240 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74  reMaskSet struct
36250 75 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65  ure. Since Where
36260 43 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  Clause contains 
36270 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66  an 8-byte.  ** f
36280 69 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61  ield (type Bitma
36290 73 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20 61  sk) it must be a
362a0 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62  ligned on an 8-b
362b0 79 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a  yte boundary on.
362c0 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74    ** some archit
362d0 65 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74  ectures. Hence t
362e0 68 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f  he ROUND8() belo
362f0 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57  w..  */.  nByteW
36300 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69  Info = ROUND8(si
36310 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b  zeof(WhereInfo)+
36320 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a  (nTabList-1)*siz
36330 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29  eof(WhereLevel))
36340 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c  ;.  pWInfo = sql
36350 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
36360 28 64 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20  (db, nByteWInfo 
36370 2b 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  + sizeof(WhereLo
36380 6f 70 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  op));.  if( db->
36390 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
363a0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
363b0 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
363c0 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20     pWInfo = 0;. 
363d0 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
363e0 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  inError;.  }.  p
363f0 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50  WInfo->aiCurOneP
36400 61 73 73 5b 30 5d 20 3d 20 70 57 49 6e 66 6f 2d  ass[0] = pWInfo-
36410 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d  >aiCurOnePass[1]
36420 20 3d 20 2d 31 3b 0a 20 20 70 57 49 6e 66 6f 2d   = -1;.  pWInfo-
36430 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69  >nLevel = nTabLi
36440 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50  st;.  pWInfo->pP
36450 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
36460 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
36470 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
36480 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
36490 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70   = pOrderBy;.  p
364a0 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65  WInfo->pResultSe
364b0 74 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a  t = pResultSet;.
364c0 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b    pWInfo->iBreak
364d0 20 3d 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74   = pWInfo->iCont
364e0 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64  inue = sqlite3Vd
364f0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
36500 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46    pWInfo->wctrlF
36510 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67  lags = wctrlFlag
36520 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76  s;.  pWInfo->sav
36530 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  edNQueryLoop = p
36540 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
36550 70 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20  p;.  pMaskSet = 
36560 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
36570 74 3b 0a 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f  t;.  sWLB.pWInfo
36580 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c   = pWInfo;.  sWL
36590 42 2e 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d  B.pWC = &pWInfo-
365a0 3e 73 57 43 3b 0a 20 20 73 57 4c 42 2e 70 4e 65  >sWC;.  sWLB.pNe
365b0 77 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 29  w = (WhereLoop*)
365c0 28 28 28 63 68 61 72 2a 29 70 57 49 6e 66 6f 29  (((char*)pWInfo)
365d0 2b 6e 42 79 74 65 57 49 6e 66 6f 29 3b 0a 20 20  +nByteWInfo);.  
365e0 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
365f0 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 73 57 4c  TE_ALIGNMENT(sWL
36600 42 2e 70 4e 65 77 29 20 29 3b 0a 20 20 77 68 65  B.pNew) );.  whe
36610 72 65 4c 6f 6f 70 49 6e 69 74 28 73 57 4c 42 2e  reLoopInit(sWLB.
36620 70 4e 65 77 29 3b 0a 23 69 66 64 65 66 20 53 51  pNew);.#ifdef SQ
36630 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73 57 4c  LITE_DEBUG.  sWL
36640 42 2e 70 4e 65 77 2d 3e 63 49 64 20 3d 20 27 2a  B.pNew->cId = '*
36650 27 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  ';.#endif..  /* 
36660 53 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20  Split the WHERE 
36670 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61  clause into sepa
36680 72 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69  rate subexpressi
36690 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20  ons where each. 
366a0 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f   ** subexpressio
366b0 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62  n is separated b
366c0 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  y an AND operato
366d0 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61  r..  */.  initMa
366e0 73 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b  skSet(pMaskSet);
366f0 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  .  whereClauseIn
36700 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  it(&pWInfo->sWC,
36710 20 70 57 49 6e 66 6f 29 3b 0a 20 20 77 68 65 72   pWInfo);.  wher
36720 65 53 70 6c 69 74 28 26 70 57 49 6e 66 6f 2d 3e  eSplit(&pWInfo->
36730 73 57 43 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f  sWC, pWhere, TK_
36740 41 4e 44 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20  AND);.    .  /* 
36750 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 61 20  Special case: a 
36760 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
36770 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20  t is constant.  
36780 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20 20 2a  Evaluate the.  *
36790 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  * expression and
367a0 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f 76 65   either jump ove
367b0 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64  r all of the cod
367c0 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a  e or fall thru..
367d0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b    */.  for(ii=0;
367e0 20 69 69 3c 73 57 4c 42 2e 70 57 43 2d 3e 6e 54   ii<sWLB.pWC->nT
367f0 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  erm; ii++){.    
36800 69 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20  if( nTabList==0 
36810 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  || sqlite3ExprIs
36820 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
36830 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e  sWLB.pWC->a[ii].
36840 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
36850 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
36860 73 65 28 70 50 61 72 73 65 2c 20 73 57 4c 42 2e  se(pParse, sWLB.
36870 70 57 43 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72  pWC->a[ii].pExpr
36880 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
36890 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
368a0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
368b0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
368c0 20 20 20 20 20 73 57 4c 42 2e 70 57 43 2d 3e 61       sWLB.pWC->a
368d0 5b 69 69 5d 2e 77 74 46 6c 61 67 73 20 7c 3d 20  [ii].wtFlags |= 
368e0 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20  TERM_CODED;.    
368f0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63  }.  }..  /* Spec
36900 69 61 6c 20 63 61 73 65 3a 20 4e 6f 20 46 52 4f  ial case: No FRO
36910 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  M clause.  */.  
36920 69 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20  if( nTabList==0 
36930 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65  ){.    if( pOrde
36940 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f  rBy ) pWInfo->nO
36950 42 53 61 74 20 3d 20 70 4f 72 64 65 72 42 79 2d  BSat = pOrderBy-
36960 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  >nExpr;.    if( 
36970 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
36980 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
36990 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   ){.      pWInfo
369a0 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48  ->eDistinct = WH
369b0 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
369c0 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  QUE;.    }.  }..
369d0 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62 69    /* Assign a bi
369e0 74 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d 61  t from the bitma
369f0 73 6b 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d  sk to every term
36a00 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
36a10 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  use..  **.  ** W
36a20 68 65 6e 20 61 73 73 69 67 6e 69 6e 67 20 62 69  hen assigning bi
36a30 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 74 6f 20  tmask values to 
36a40 46 52 4f 4d 20 63 6c 61 75 73 65 20 63 75 72 73  FROM clause curs
36a50 6f 72 73 2c 20 69 74 20 6d 75 73 74 20 62 65 0a  ors, it must be.
36a60 20 20 2a 2a 20 74 68 65 20 63 61 73 65 20 74 68    ** the case th
36a70 61 74 20 69 66 20 58 20 69 73 20 74 68 65 20 62  at if X is the b
36a80 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 4e  itmask for the N
36a90 2d 74 68 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  -th FROM clause 
36aa0 74 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74  term then.  ** t
36ab0 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61  he bitmask for a
36ac0 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  ll FROM clause t
36ad0 65 72 6d 73 20 74 6f 20 74 68 65 20 6c 65 66 74  erms to the left
36ae0 20 6f 66 20 74 68 65 20 4e 2d 74 68 20 74 65 72   of the N-th ter
36af0 6d 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e  m.  ** is (X-1).
36b00 20 20 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e     An expression
36b10 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61   from the ON cla
36b20 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  use of a LEFT JO
36b30 49 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20  IN can use.  ** 
36b40 69 74 73 20 45 78 70 72 2e 69 52 69 67 68 74 4a  its Expr.iRightJ
36b50 6f 69 6e 54 61 62 6c 65 20 76 61 6c 75 65 20 74  oinTable value t
36b60 6f 20 66 69 6e 64 20 74 68 65 20 62 69 74 6d 61  o find the bitma
36b70 73 6b 20 6f 66 20 74 68 65 20 72 69 67 68 74 20  sk of the right 
36b80 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68  table.  ** of th
36b90 65 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61 63  e join.  Subtrac
36ba0 74 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68  ting one from th
36bb0 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 62 69  e right table bi
36bc0 74 6d 61 73 6b 20 67 69 76 65 73 20 61 0a 20 20  tmask gives a.  
36bd0 2a 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61  ** bitmask for a
36be0 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  ll tables to the
36bf0 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69   left of the joi
36c00 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20  n.  Knowing the 
36c10 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72  bitmask.  ** for
36c20 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74   all tables to t
36c30 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66  he left of a lef
36c40 74 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74  t join is import
36c50 61 6e 74 2e 20 20 54 69 63 6b 65 74 20 23 33 30  ant.  Ticket #30
36c60 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f  15..  **.  ** No
36c70 74 65 20 74 68 61 74 20 62 69 74 6d 61 73 6b 73  te that bitmasks
36c80 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72   are created for
36c90 20 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e   all pTabList->n
36ca0 53 72 63 20 74 61 62 6c 65 73 20 69 6e 0a 20 20  Src tables in.  
36cb0 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74  ** pTabList, not
36cc0 20 6a 75 73 74 20 74 68 65 20 66 69 72 73 74 20   just the first 
36cd0 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65 73 2e  nTabList tables.
36ce0 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20 6e 6f    nTabList is no
36cf0 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75 61  rmally.  ** equa
36d00 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e  l to pTabList->n
36d10 53 72 63 20 62 75 74 20 6d 69 67 68 74 20 62 65  Src but might be
36d20 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20 31 20   shortened to 1 
36d30 69 66 20 74 68 65 0a 20 20 2a 2a 20 57 48 45 52  if the.  ** WHER
36d40 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20  E_ONETABLE_ONLY 
36d50 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20 20 2a  flag is set..  *
36d60 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
36d70 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
36d80 20 69 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61   ii++){.    crea
36d90 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  teMask(pMaskSet,
36da0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d   pTabList->a[ii]
36db0 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23  .iCursor);.  }.#
36dc0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
36dd0 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74 6f  {.    Bitmask to
36de0 54 68 65 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20  TheLeft = 0;.   
36df0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54   for(ii=0; ii<pT
36e00 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69  abList->nSrc; ii
36e10 2b 2b 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61  ++){.      Bitma
36e20 73 6b 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70  sk m = getMask(p
36e30 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73  MaskSet, pTabLis
36e40 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72  t->a[ii].iCursor
36e50 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
36e60 20 28 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c 65 66   (m-1)==toTheLef
36e70 74 20 29 3b 0a 20 20 20 20 20 20 74 6f 54 68 65  t );.      toThe
36e80 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d  Left |= m;.    }
36e90 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
36ea0 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66  * Analyze all of
36eb0 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69   the subexpressi
36ec0 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  ons.  Note that 
36ed0 65 78 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d 69  exprAnalyze() mi
36ee0 67 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65 77  ght.  ** add new
36ef0 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 6f   virtual terms o
36f00 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
36f10 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
36f20 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a    We do not.  **
36f30 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a 65   want to analyze
36f40 20 74 68 65 73 65 20 76 69 72 74 75 61 6c 20 74   these virtual t
36f50 65 72 6d 73 2c 20 73 6f 20 73 74 61 72 74 20 61  erms, so start a
36f60 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74 68 65 20  nalyzing at the 
36f70 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f 72  end.  ** and wor
36f80 6b 20 66 6f 72 77 61 72 64 20 73 6f 20 74 68 61  k forward so tha
36f90 74 20 74 68 65 20 61 64 64 65 64 20 76 69 72 74  t the added virt
36fa0 75 61 6c 20 74 65 72 6d 73 20 61 72 65 20 6e 65  ual terms are ne
36fb0 76 65 72 20 70 72 6f 63 65 73 73 65 64 2e 0a 20  ver processed.. 
36fc0 20 2a 2f 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a   */.  exprAnalyz
36fd0 65 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20 26  eAll(pTabList, &
36fe0 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20  pWInfo->sWC);.  
36ff0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
37000 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
37010 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
37020 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77 63 74  ;.  }..  if( wct
37030 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
37040 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b  WANT_DISTINCT ){
37050 0a 20 20 20 20 69 66 28 20 69 73 44 69 73 74 69  .    if( isDisti
37060 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 70 50 61  nctRedundant(pPa
37070 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 26  rse, pTabList, &
37080 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 52 65  pWInfo->sWC, pRe
37090 73 75 6c 74 53 65 74 29 20 29 7b 0a 20 20 20 20  sultSet) ){.    
370a0 20 20 2f 2a 20 54 68 65 20 44 49 53 54 49 4e 43    /* The DISTINC
370b0 54 20 6d 61 72 6b 69 6e 67 20 69 73 20 70 6f 69  T marking is poi
370c0 6e 74 6c 65 73 73 2e 20 20 49 67 6e 6f 72 65 20  ntless.  Ignore 
370d0 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70 57 49  it. */.      pWI
370e0 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
370f0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
37100 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73  UNIQUE;.    }els
37110 65 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d  e if( pOrderBy==
37120 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72  0 ){.      /* Tr
37130 79 20 74 6f 20 4f 52 44 45 52 20 42 59 20 74 68  y to ORDER BY th
37140 65 20 72 65 73 75 6c 74 20 73 65 74 20 74 6f 20  e result set to 
37150 6d 61 6b 65 20 64 69 73 74 69 6e 63 74 20 70 72  make distinct pr
37160 6f 63 65 73 73 69 6e 67 20 65 61 73 69 65 72 20  ocessing easier 
37170 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  */.      pWInfo-
37180 3e 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57  >wctrlFlags |= W
37190 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 3b  HERE_DISTINCTBY;
371a0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70  .      pWInfo->p
371b0 4f 72 64 65 72 42 79 20 3d 20 70 52 65 73 75 6c  OrderBy = pResul
371c0 74 53 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  tSet;.    }.  }.
371d0 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20  .  /* Construct 
371e0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  the WhereLoop ob
371f0 6a 65 63 74 73 20 2a 2f 0a 20 20 57 48 45 52 45  jects */.  WHERE
37200 54 52 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a  TRACE(0xffff,("*
37210 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61  ** Optimizer Sta
37220 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 2f  rt ***\n"));.  /
37230 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 74 65  * Display all te
37240 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
37250 20 63 6c 61 75 73 65 20 2a 2f 0a 23 69 66 20 64   clause */.#if d
37260 65 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43  efined(WHERETRAC
37270 45 5f 45 4e 41 42 4c 45 44 29 20 26 26 20 64 65  E_ENABLED) && de
37280 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
37290 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e  BLE_TREE_EXPLAIN
372a0 29 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57  ).  if( sqlite3W
372b0 68 65 72 65 54 72 61 63 65 20 26 20 30 78 31 30  hereTrace & 0x10
372c0 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
372d0 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
372e0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20  arse->pVdbe;.   
372f0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 42   sqlite3ExplainB
37300 65 67 69 6e 28 76 29 3b 0a 20 20 20 20 66 6f 72  egin(v);.    for
37310 28 69 3d 30 3b 20 69 3c 73 57 4c 42 2e 70 57 43  (i=0; i<sWLB.pWC
37320 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20  ->nTerm; i++){. 
37330 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
37340 61 69 6e 50 72 69 6e 74 66 28 76 2c 20 22 23 25  ainPrintf(v, "#%
37350 2d 32 64 20 22 2c 20 69 29 3b 0a 20 20 20 20 20  -2d ", i);.     
37360 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
37370 75 73 68 28 76 29 3b 0a 20 20 20 20 20 20 77 68  ush(v);.      wh
37380 65 72 65 45 78 70 6c 61 69 6e 54 65 72 6d 28 76  ereExplainTerm(v
37390 2c 20 26 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69  , &sWLB.pWC->a[i
373a0 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ]);.      sqlite
373b0 33 45 78 70 6c 61 69 6e 50 6f 70 28 76 29 3b 0a  3ExplainPop(v);.
373c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
373d0 6c 61 69 6e 4e 4c 28 76 29 3b 0a 20 20 20 20 7d  lainNL(v);.    }
373e0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
373f0 61 69 6e 46 69 6e 69 73 68 28 76 29 3b 0a 20 20  ainFinish(v);.  
37400 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
37410 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74  intf("%s", sqlit
37420 65 33 56 64 62 65 45 78 70 6c 61 6e 61 74 69 6f  e3VdbeExplanatio
37430 6e 28 76 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  n(v));.  }.#endi
37440 66 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74  f.  if( nTabList
37450 21 3d 31 20 7c 7c 20 77 68 65 72 65 53 68 6f 72  !=1 || whereShor
37460 74 43 75 74 28 26 73 57 4c 42 29 3d 3d 30 20 29  tCut(&sWLB)==0 )
37470 7b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  {.    rc = where
37480 4c 6f 6f 70 41 64 64 41 6c 6c 28 26 73 57 4c 42  LoopAddAll(&sWLB
37490 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
374a0 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
374b0 72 72 6f 72 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  rror;.  .    /* 
374c0 44 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66 20 74  Display all of t
374d0 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  he WhereLoop obj
374e0 65 63 74 73 20 69 66 20 77 68 65 72 65 74 72 61  ects if wheretra
374f0 63 65 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f  ce is enabled */
37500 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
37510 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 21 3d  CE_ENABLED /* !=
37520 30 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  0 */.    if( sql
37530 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29  ite3WhereTrace )
37540 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f  {.      WhereLoo
37550 70 20 2a 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  p *p;.      int 
37560 69 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  i;.      static 
37570 63 68 61 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20  char zLabel[] = 
37580 22 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65  "0123456789abcde
37590 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
375a0 76 77 79 78 7a 22 0a 20 20 20 20 20 20 20 20 20  vwyxz".         
375b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
375c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 41                "A
375d0 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51  BCDEFGHIJKLMNOPQ
375e0 52 53 54 55 56 57 59 58 5a 22 3b 0a 20 20 20 20  RSTUVWYXZ";.    
375f0 20 20 66 6f 72 28 70 3d 70 57 49 6e 66 6f 2d 3e    for(p=pWInfo->
37600 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20 70 3b 20  pLoops, i=0; p; 
37610 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20  p=p->pNextLoop, 
37620 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  i++){.        p-
37630 3e 63 49 64 20 3d 20 7a 4c 61 62 65 6c 5b 69 25  >cId = zLabel[i%
37640 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 5d 3b  sizeof(zLabel)];
37650 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f  .        whereLo
37660 6f 70 50 72 69 6e 74 28 70 2c 20 73 57 4c 42 2e  opPrint(p, sWLB.
37670 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pWC);.      }.  
37680 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
37690 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65    wherePathSolve
376a0 72 28 70 57 49 6e 66 6f 2c 20 30 29 3b 0a 20 20  r(pWInfo, 0);.  
376b0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
376c0 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68  Failed ) goto wh
376d0 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
376e0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70     if( pWInfo->p
376f0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
37700 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65    wherePathSolve
37710 72 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f  r(pWInfo, pWInfo
37720 2d 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b 0a 20 20  ->nRowOut+1);.  
37730 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
37740 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
37750 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
37760 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
37770 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
37780 42 79 3d 3d 30 20 26 26 20 28 64 62 2d 3e 66 6c  By==0 && (db->fl
37790 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 76  ags & SQLITE_Rev
377a0 65 72 73 65 4f 72 64 65 72 29 21 3d 30 20 29 7b  erseOrder)!=0 ){
377b0 0a 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65  .     pWInfo->re
377c0 76 4d 61 73 6b 20 3d 20 28 42 69 74 6d 61 73 6b  vMask = (Bitmask
377d0 29 28 2d 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28  )(-1);.  }.  if(
377e0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
377f0 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c 6c 6f   NEVER(db->mallo
37800 63 46 61 69 6c 65 64 29 20 29 7b 0a 20 20 20 20  cFailed) ){.    
37810 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
37820 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64 65 66  rror;.  }.#ifdef
37830 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
37840 4c 45 44 20 2f 2a 20 21 3d 30 20 2a 2f 0a 20 20  LED /* !=0 */.  
37850 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
37860 54 72 61 63 65 20 29 7b 0a 20 20 20 20 69 6e 74  Trace ){.    int
37870 20 69 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ii;.    sqlite3
37880 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d  DebugPrintf("---
37890 2d 20 53 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d  - Solution nRow=
378a0 25 64 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  %d", pWInfo->nRo
378b0 77 4f 75 74 29 3b 0a 20 20 20 20 69 66 28 20 70  wOut);.    if( p
378c0 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3e 30 20  WInfo->nOBSat>0 
378d0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
378e0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 4f 52  DebugPrintf(" OR
378f0 44 45 52 42 59 3d 25 64 2c 30 78 25 6c 6c 78 22  DERBY=%d,0x%llx"
37900 2c 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74  , pWInfo->nOBSat
37910 2c 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73  , pWInfo->revMas
37920 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77  k);.    }.    sw
37930 69 74 63 68 28 20 70 57 49 6e 66 6f 2d 3e 65 44  itch( pWInfo->eD
37940 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
37950 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
37960 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20  INCT_UNIQUE: {. 
37970 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
37980 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53  bugPrintf("  DIS
37990 54 49 4e 43 54 3d 75 6e 69 71 75 65 22 29 3b 0a  TINCT=unique");.
379a0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
379b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
379c0 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
379d0 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20  _ORDERED: {.    
379e0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
379f0 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e  Printf("  DISTIN
37a00 43 54 3d 6f 72 64 65 72 65 64 22 29 3b 0a 20 20  CT=ordered");.  
37a10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
37a20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
37a30 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
37a40 4e 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20  NORDERED: {.    
37a50 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
37a60 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e  Printf("  DISTIN
37a70 43 54 3d 75 6e 6f 72 64 65 72 65 64 22 29 3b 0a  CT=unordered");.
37a80 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
37a90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
37aa0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
37ab0 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 66  ntf("\n");.    f
37ac0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 57 49 6e  or(ii=0; ii<pWIn
37ad0 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b  fo->nLevel; ii++
37ae0 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  ){.      whereLo
37af0 6f 70 50 72 69 6e 74 28 70 57 49 6e 66 6f 2d 3e  opPrint(pWInfo->
37b00 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70 2c 20 73 57  a[ii].pWLoop, sW
37b10 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20  LB.pWC);.    }. 
37b20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 41   }.#endif.  /* A
37b30 74 74 65 6d 70 74 20 74 6f 20 6f 6d 69 74 20 74  ttempt to omit t
37b40 61 62 6c 65 73 20 66 72 6f 6d 20 74 68 65 20 6a  ables from the j
37b50 6f 69 6e 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  oin that do not 
37b60 65 66 66 65 63 74 20 74 68 65 20 72 65 73 75 6c  effect the resul
37b70 74 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66  t */.  if( pWInf
37b80 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 0a 20 20 20  o->nLevel>=2.   
37b90 26 26 20 70 52 65 73 75 6c 74 53 65 74 21 3d 30  && pResultSet!=0
37ba0 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  .   && Optimizat
37bb0 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
37bc0 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f  QLITE_OmitNoopJo
37bd0 69 6e 29 0a 20 20 29 7b 0a 20 20 20 20 42 69 74  in).  ){.    Bit
37be0 6d 61 73 6b 20 74 61 62 55 73 65 64 20 3d 20 65  mask tabUsed = e
37bf0 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
37c00 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 65 73  e(pMaskSet, pRes
37c10 75 6c 74 53 65 74 29 3b 0a 20 20 20 20 69 66 28  ultSet);.    if(
37c20 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 29   sWLB.pOrderBy )
37c30 20 74 61 62 55 73 65 64 20 7c 3d 20 65 78 70 72   tabUsed |= expr
37c40 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
37c50 4d 61 73 6b 53 65 74 2c 20 73 57 4c 42 2e 70 4f  MaskSet, sWLB.pO
37c60 72 64 65 72 42 79 29 3b 0a 20 20 20 20 77 68 69  rderBy);.    whi
37c70 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  le( pWInfo->nLev
37c80 65 6c 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 57  el>=2 ){.      W
37c90 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
37ca0 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 4c   *pEnd;.      pL
37cb0 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b  oop = pWInfo->a[
37cc0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31  pWInfo->nLevel-1
37cd0 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  ].pWLoop;.      
37ce0 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 70 54 61  if( (pWInfo->pTa
37cf0 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e  bList->a[pLoop->
37d00 69 54 61 62 5d 2e 6a 6f 69 6e 74 79 70 65 20 26  iTab].jointype &
37d10 20 4a 54 5f 4c 45 46 54 29 3d 3d 30 20 29 20 62   JT_LEFT)==0 ) b
37d20 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
37d30 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
37d40 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
37d50 54 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20  T)==0.       && 
37d60 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
37d70 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d  & WHERE_ONEROW)=
37d80 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  =0.      ){.    
37d90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
37da0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 74 61   }.      if( (ta
37db0 62 55 73 65 64 20 26 20 70 4c 6f 6f 70 2d 3e 6d  bUsed & pLoop->m
37dc0 61 73 6b 53 65 6c 66 29 21 3d 30 20 29 20 62 72  askSelf)!=0 ) br
37dd0 65 61 6b 3b 0a 20 20 20 20 20 20 70 45 6e 64 20  eak;.      pEnd 
37de0 3d 20 73 57 4c 42 2e 70 57 43 2d 3e 61 20 2b 20  = sWLB.pWC->a + 
37df0 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b  sWLB.pWC->nTerm;
37e00 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d  .      for(pTerm
37e10 3d 73 57 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54  =sWLB.pWC->a; pT
37e20 65 72 6d 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b  erm<pEnd; pTerm+
37e30 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
37e40 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
37e50 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53  l & pLoop->maskS
37e60 65 6c 66 29 21 3d 30 0a 20 20 20 20 20 20 20 20  elf)!=0.        
37e70 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
37e80 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
37e90 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a  r, EP_FromJoin).
37ea0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
37eb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
37ec0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
37ed0 20 20 20 20 69 66 28 20 70 54 65 72 6d 3c 70 45      if( pTerm<pE
37ee0 6e 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  nd ) break;.    
37ef0 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66    WHERETRACE(0xf
37f00 66 66 66 2c 20 28 22 2d 3e 20 64 72 6f 70 20 6c  fff, ("-> drop l
37f10 6f 6f 70 20 25 63 20 6e 6f 74 20 75 73 65 64 5c  oop %c not used\
37f20 6e 22 2c 20 70 4c 6f 6f 70 2d 3e 63 49 64 29 29  n", pLoop->cId))
37f30 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ;.      pWInfo->
37f40 6e 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20  nLevel--;.      
37f50 6e 54 61 62 4c 69 73 74 2d 2d 3b 0a 20 20 20 20  nTabList--;.    
37f60 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41  }.  }.  WHERETRA
37f70 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20  CE(0xffff,("*** 
37f80 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68  Optimizer Finish
37f90 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70  ed ***\n"));.  p
37fa0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e  WInfo->pParse->n
37fb0 51 75 65 72 79 4c 6f 6f 70 20 2b 3d 20 70 57 49  QueryLoop += pWI
37fc0 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20  nfo->nRowOut;.. 
37fd0 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65   /* If the calle
37fe0 72 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f  r is an UPDATE o
37ff0 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
38000 6e 74 20 74 68 61 74 20 69 73 20 72 65 71 75 65  nt that is reque
38010 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73  sting.  ** to us
38020 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67  e a one-pass alg
38030 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e  orithm, determin
38040 65 20 69 66 20 74 68 69 73 20 69 73 20 61 70 70  e if this is app
38050 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a 20 54  ropriate..  ** T
38060 68 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f  he one-pass algo
38070 72 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73  rithm only works
38080 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   if the WHERE cl
38090 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 73 0a  ause constrains.
380a0 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
380b0 6e 74 20 74 6f 20 75 70 64 61 74 65 20 61 20 73  nt to update a s
380c0 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a  ingle row..  */.
380d0 20 20 61 73 73 65 72 74 28 20 28 77 63 74 72 6c    assert( (wctrl
380e0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
380f0 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d  EPASS_DESIRED)==
38100 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  0 || pWInfo->nLe
38110 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  vel==1 );.  if( 
38120 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
38130 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
38140 52 45 44 29 21 3d 30 20 0a 20 20 20 26 26 20 28  RED)!=0 .   && (
38150 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 7