/ Hex Artifact Content
Login

Artifact c9d804dcf02388207096e4da19487d9a2a7a9a67:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61  Int.h"../* Forwa
0360: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f  rd declaration o
0370: 66 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61  f methods */.sta
0380: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
0390: 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 2a  pResize(sqlite3*
03a0: 2c 20 57 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e  , WhereLoop*, in
03b0: 74 29 3b 0a 0a 2f 2a 20 54 65 73 74 20 76 61 72  t);../* Test var
03c0: 69 61 62 6c 65 20 74 68 61 74 20 63 61 6e 20 62  iable that can b
03d0: 65 20 73 65 74 20 74 6f 20 65 6e 61 62 6c 65 20  e set to enable 
03e0: 57 48 45 52 45 20 74 72 61 63 69 6e 67 20 2a 2f  WHERE tracing */
03f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0400: 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
0410: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
0420: 47 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c  G)./***/ int sql
0430: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d  ite3WhereTrace =
0440: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a   0;.#endif.../*.
0450: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 65 73  ** Return the es
0460: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
0470: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 66 72  f output rows fr
0480: 6f 6d 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  om a WHERE claus
0490: 65 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33  e.*/.u64 sqlite3
04a0: 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f  WhereOutputRowCo
04b0: 75 6e 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  unt(WhereInfo *p
04c0: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
04d0: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f   sqlite3LogEstTo
04e0: 49 6e 74 28 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  Int(pWInfo->nRow
04f0: 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Out);.}../*.** R
0500: 65 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65  eturn one of the
0510: 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
0520: 78 78 78 78 78 20 76 61 6c 75 65 73 20 74 6f 20  xxxxx values to 
0530: 69 6e 64 69 63 61 74 65 20 68 6f 77 20 74 68 69  indicate how thi
0540: 73 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  s.** WHERE claus
0550: 65 20 72 65 74 75 72 6e 73 20 6f 75 74 70 75 74  e returns output
0560: 73 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70  s for DISTINCT p
0570: 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e  rocessing..*/.in
0580: 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  t sqlite3WhereIs
0590: 44 69 73 74 69 6e 63 74 28 57 68 65 72 65 49 6e  Distinct(WhereIn
05a0: 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72  fo *pWInfo){.  r
05b0: 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65 44  eturn pWInfo->eD
05c0: 69 73 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  istinct;.}../*.*
05d0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
05e0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
05f0: 65 20 72 65 74 75 72 6e 73 20 72 6f 77 73 20 69  e returns rows i
0600: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72  n ORDER BY order
0610: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53  ..** Return FALS
0620: 45 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  E if the output 
0630: 6e 65 65 64 73 20 74 6f 20 62 65 20 73 6f 72 74  needs to be sort
0640: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
0650: 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64  e3WhereIsOrdered
0660: 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
0670: 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57  fo){.  return pW
0680: 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3b 0a 7d 0a  Info->nOBSat;.}.
0690: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
06a0: 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20 6f  e VDBE address o
06b0: 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20  r label to jump 
06c0: 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  to in order to c
06d0: 6f 6e 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65 64  ontinue.** immed
06e0: 69 61 74 65 6c 79 20 77 69 74 68 20 74 68 65 20  iately with the 
06f0: 6e 65 78 74 20 72 6f 77 20 6f 66 20 61 20 57 48  next row of a WH
0700: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69  ERE clause..*/.i
0710: 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 43  nt sqlite3WhereC
0720: 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 57 68 65  ontinueLabel(Whe
0730: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
0740: 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
0750: 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20  o->iContinue!=0 
0760: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  );.  return pWIn
0770: 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a 7d  fo->iContinue;.}
0780: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
0790: 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20  he VDBE address 
07a0: 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70  or label to jump
07b0: 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20   to in order to 
07c0: 62 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66 20  break.** out of 
07d0: 61 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a 2f  a WHERE loop..*/
07e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72  .int sqlite3Wher
07f0: 65 42 72 65 61 6b 4c 61 62 65 6c 28 57 68 65 72  eBreakLabel(Wher
0800: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0810: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
0820: 3e 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a  >iBreak;.}../*.*
0830: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
0840: 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
0850: 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 63  LETE statement c
0860: 61 6e 20 6f 70 65 72 61 74 65 20 64 69 72 65 63  an operate direc
0870: 74 6c 79 20 6f 6e 0a 2a 2a 20 74 68 65 20 72 6f  tly on.** the ro
0880: 77 69 64 73 20 72 65 74 75 72 6e 65 64 20 62 79  wids returned by
0890: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
08a0: 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69    Return FALSE i
08b0: 66 20 64 6f 69 6e 67 20 61 6e 0a 2a 2a 20 55 50  f doing an.** UP
08c0: 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 6d  DATE or DELETE m
08d0: 69 67 68 74 20 63 68 61 6e 67 65 20 73 75 62 73  ight change subs
08e0: 65 71 75 65 6e 74 20 57 48 45 52 45 20 63 6c 61  equent WHERE cla
08f0: 75 73 65 20 72 65 73 75 6c 74 73 2e 0a 2a 2a 0a  use results..**.
0900: 2a 2a 20 49 66 20 74 68 65 20 4f 4e 45 50 41 53  ** If the ONEPAS
0910: 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  S optimization i
0920: 73 20 75 73 65 64 20 28 69 66 20 74 68 69 73 20  s used (if this 
0930: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
0940: 74 72 75 65 29 0a 2a 2a 20 74 68 65 6e 20 61 6c  true).** then al
0950: 73 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 64  so write the ind
0960: 69 63 65 73 20 6f 66 20 6f 70 65 6e 20 63 75 72  ices of open cur
0970: 73 6f 72 73 20 75 73 65 64 20 62 79 20 4f 4e 45  sors used by ONE
0980: 50 41 53 53 0a 2a 2a 20 69 6e 74 6f 20 61 69 43  PASS.** into aiC
0990: 75 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b  ur[0] and aiCur[
09a0: 31 5d 2e 20 20 69 61 43 75 72 5b 30 5d 20 67 65  1].  iaCur[0] ge
09b0: 74 73 20 74 68 65 20 63 75 72 73 6f 72 20 6f 66  ts the cursor of
09c0: 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 74 61 62   the data.** tab
09d0: 6c 65 20 61 6e 64 20 69 61 43 75 72 5b 31 5d 20  le and iaCur[1] 
09e0: 67 65 74 73 20 74 68 65 20 63 75 72 73 6f 72 20  gets the cursor 
09f0: 75 73 65 64 20 62 79 20 61 6e 20 61 75 78 69 6c  used by an auxil
0a00: 69 61 72 79 20 69 6e 64 65 78 2e 0a 2a 2a 20 45  iary index..** E
0a10: 69 74 68 65 72 20 76 61 6c 75 65 20 6d 61 79 20  ither value may 
0a20: 62 65 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e  be -1, indicatin
0a30: 67 20 74 68 61 74 20 63 75 72 73 6f 72 20 69 73  g that cursor is
0a40: 20 6e 6f 74 20 75 73 65 64 2e 0a 2a 2a 20 41 6e   not used..** An
0a50: 79 20 63 75 72 73 6f 72 73 20 72 65 74 75 72 6e  y cursors return
0a60: 65 64 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  ed will have bee
0a70: 6e 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69  n opened for wri
0a80: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75  ting..**.** aiCu
0a90: 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31  r[0] and aiCur[1
0aa0: 5d 20 62 6f 74 68 20 67 65 74 20 2d 31 20 69 66  ] both get -1 if
0ab0: 20 74 68 65 20 77 68 65 72 65 2d 63 6c 61 75 73   the where-claus
0ac0: 65 20 6c 6f 67 69 63 20 69 73 0a 2a 2a 20 75 6e  e logic is.** un
0ad0: 61 62 6c 65 20 74 6f 20 75 73 65 20 74 68 65 20  able to use the 
0ae0: 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61  ONEPASS optimiza
0af0: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
0b00: 69 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61  ite3WhereOkOnePa
0b10: 73 73 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ss(WhereInfo *pW
0b20: 49 6e 66 6f 2c 20 69 6e 74 20 2a 61 69 43 75 72  Info, int *aiCur
0b30: 29 7b 0a 20 20 6d 65 6d 63 70 79 28 61 69 43 75  ){.  memcpy(aiCu
0b40: 72 2c 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72  r, pWInfo->aiCur
0b50: 4f 6e 65 50 61 73 73 2c 20 73 69 7a 65 6f 66 28  OnePass, sizeof(
0b60: 69 6e 74 29 2a 32 29 3b 0a 20 20 72 65 74 75 72  int)*2);.  retur
0b70: 6e 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50  n pWInfo->okOneP
0b80: 61 73 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  ass;.}../*.** Mo
0b90: 76 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ve the content o
0ba0: 66 20 70 53 72 63 20 69 6e 74 6f 20 70 44 65 73  f pSrc into pDes
0bb0: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
0bc0: 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 57 68 65   whereOrMove(Whe
0bd0: 72 65 4f 72 53 65 74 20 2a 70 44 65 73 74 2c 20  reOrSet *pDest, 
0be0: 57 68 65 72 65 4f 72 53 65 74 20 2a 70 53 72 63  WhereOrSet *pSrc
0bf0: 29 7b 0a 20 20 70 44 65 73 74 2d 3e 6e 20 3d 20  ){.  pDest->n = 
0c00: 70 53 72 63 2d 3e 6e 3b 0a 20 20 6d 65 6d 63 70  pSrc->n;.  memcp
0c10: 79 28 70 44 65 73 74 2d 3e 61 2c 20 70 53 72 63  y(pDest->a, pSrc
0c20: 2d 3e 61 2c 20 70 44 65 73 74 2d 3e 6e 2a 73 69  ->a, pDest->n*si
0c30: 7a 65 6f 66 28 70 44 65 73 74 2d 3e 61 5b 30 5d  zeof(pDest->a[0]
0c40: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  ));.}../*.** Try
0c50: 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77   to insert a new
0c60: 20 70 72 65 72 65 71 75 69 73 69 74 65 2f 63 6f   prerequisite/co
0c70: 73 74 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  st entry into th
0c80: 65 20 57 68 65 72 65 4f 72 53 65 74 20 70 53 65  e WhereOrSet pSe
0c90: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  t..**.** The new
0ca0: 20 65 6e 74 72 79 20 6d 69 67 68 74 20 6f 76 65   entry might ove
0cb0: 72 77 72 69 74 65 20 61 6e 20 65 78 69 73 74 69  rwrite an existi
0cc0: 6e 67 20 65 6e 74 72 79 2c 20 6f 72 20 69 74 20  ng entry, or it 
0cd0: 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 70 70 65  might be.** appe
0ce0: 6e 64 65 64 2c 20 6f 72 20 69 74 20 6d 69 67 68  nded, or it migh
0cf0: 74 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 20  t be discarded. 
0d00: 20 44 6f 20 77 68 61 74 65 76 65 72 20 69 73 20   Do whatever is 
0d10: 74 68 65 20 72 69 67 68 74 20 74 68 69 6e 67 0a  the right thing.
0d20: 2a 2a 20 73 6f 20 74 68 61 74 20 70 53 65 74 20  ** so that pSet 
0d30: 6b 65 65 70 73 20 74 68 65 20 4e 5f 4f 52 5f 43  keeps the N_OR_C
0d40: 4f 53 54 20 62 65 73 74 20 65 6e 74 72 69 65 73  OST best entries
0d50: 20 73 65 65 6e 20 73 6f 20 66 61 72 2e 0a 2a 2f   seen so far..*/
0d60: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
0d70: 65 4f 72 49 6e 73 65 72 74 28 0a 20 20 57 68 65  eOrInsert(.  Whe
0d80: 72 65 4f 72 53 65 74 20 2a 70 53 65 74 2c 20 20  reOrSet *pSet,  
0d90: 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
0da0: 4f 72 53 65 74 20 74 6f 20 62 65 20 75 70 64 61  OrSet to be upda
0db0: 74 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ted */.  Bitmask
0dc0: 20 70 72 65 72 65 71 2c 20 20 20 20 20 20 20 20   prereq,        
0dd0: 2f 2a 20 50 72 65 72 65 71 75 69 73 69 74 65 73  /* Prerequisites
0de0: 20 6f 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72   of the new entr
0df0: 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 52  y */.  LogEst rR
0e00: 75 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  un,           /*
0e10: 20 52 75 6e 2d 63 6f 73 74 20 6f 66 20 74 68 65   Run-cost of the
0e20: 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20 20   new entry */.  
0e30: 4c 6f 67 45 73 74 20 6e 4f 75 74 20 20 20 20 20  LogEst nOut     
0e40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
0e50: 20 6f 66 20 6f 75 74 70 75 74 73 20 66 6f 72 20   of outputs for 
0e60: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f  the new entry */
0e70: 0a 29 7b 0a 20 20 75 31 36 20 69 3b 0a 20 20 57  .){.  u16 i;.  W
0e80: 68 65 72 65 4f 72 43 6f 73 74 20 2a 70 3b 0a 20  hereOrCost *p;. 
0e90: 20 66 6f 72 28 69 3d 70 53 65 74 2d 3e 6e 2c 20   for(i=pSet->n, 
0ea0: 70 3d 70 53 65 74 2d 3e 61 3b 20 69 3e 30 3b 20  p=pSet->a; i>0; 
0eb0: 69 2d 2d 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i--, p++){.    i
0ec0: 66 28 20 72 52 75 6e 3c 3d 70 2d 3e 72 52 75 6e  f( rRun<=p->rRun
0ed0: 20 26 26 20 28 70 72 65 72 65 71 20 26 20 70 2d   && (prereq & p-
0ee0: 3e 70 72 65 72 65 71 29 3d 3d 70 72 65 72 65 71  >prereq)==prereq
0ef0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 77   ){.      goto w
0f00: 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e  hereOrInsert_don
0f10: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
0f20: 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 26   p->rRun<=rRun &
0f30: 26 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  & (p->prereq & p
0f40: 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65  rereq)==p->prere
0f50: 71 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  q ){.      retur
0f60: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 0;.    }.  }. 
0f70: 20 69 66 28 20 70 53 65 74 2d 3e 6e 3c 4e 5f 4f   if( pSet->n<N_O
0f80: 52 5f 43 4f 53 54 20 29 7b 0a 20 20 20 20 70 20  R_COST ){.    p 
0f90: 3d 20 26 70 53 65 74 2d 3e 61 5b 70 53 65 74 2d  = &pSet->a[pSet-
0fa0: 3e 6e 2b 2b 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4f  >n++];.    p->nO
0fb0: 75 74 20 3d 20 6e 4f 75 74 3b 0a 20 20 7d 65 6c  ut = nOut;.  }el
0fc0: 73 65 7b 0a 20 20 20 20 70 20 3d 20 70 53 65 74  se{.    p = pSet
0fd0: 2d 3e 61 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  ->a;.    for(i=1
0fe0: 3b 20 69 3c 70 53 65 74 2d 3e 6e 3b 20 69 2b 2b  ; i<pSet->n; i++
0ff0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
1000: 72 52 75 6e 3e 70 53 65 74 2d 3e 61 5b 69 5d 2e  rRun>pSet->a[i].
1010: 72 52 75 6e 20 29 20 70 20 3d 20 70 53 65 74 2d  rRun ) p = pSet-
1020: 3e 61 20 2b 20 69 3b 0a 20 20 20 20 7d 0a 20 20  >a + i;.    }.  
1030: 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3c 3d 72    if( p->rRun<=r
1040: 52 75 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Run ) return 0;.
1050: 20 20 7d 0a 77 68 65 72 65 4f 72 49 6e 73 65 72    }.whereOrInser
1060: 74 5f 64 6f 6e 65 3a 0a 20 20 70 2d 3e 70 72 65  t_done:.  p->pre
1070: 72 65 71 20 3d 20 70 72 65 72 65 71 3b 0a 20 20  req = prereq;.  
1080: 70 2d 3e 72 52 75 6e 20 3d 20 72 52 75 6e 3b 0a  p->rRun = rRun;.
1090: 20 20 69 66 28 20 70 2d 3e 6e 4f 75 74 3e 6e 4f    if( p->nOut>nO
10a0: 75 74 20 29 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e  ut ) p->nOut = n
10b0: 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  Out;.  return 1;
10c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
10d0: 6c 69 7a 65 20 61 20 70 72 65 61 6c 6c 6f 63 61  lize a prealloca
10e0: 74 65 64 20 57 68 65 72 65 43 6c 61 75 73 65 20  ted WhereClause 
10f0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
1100: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43  atic void whereC
1110: 6c 61 75 73 65 49 6e 69 74 28 0a 20 20 57 68 65  lauseInit(.  Whe
1120: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
1130: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65        /* The Whe
1140: 72 65 43 6c 61 75 73 65 20 74 6f 20 62 65 20 69  reClause to be i
1150: 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
1160: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
1170: 6f 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  o        /* The 
1180: 57 48 45 52 45 20 70 72 6f 63 65 73 73 69 6e 67  WHERE processing
1190: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20   context */.){. 
11a0: 20 70 57 43 2d 3e 70 57 49 6e 66 6f 20 3d 20 70   pWC->pWInfo = p
11b0: 57 49 6e 66 6f 3b 0a 20 20 70 57 43 2d 3e 70 4f  WInfo;.  pWC->pO
11c0: 75 74 65 72 20 3d 20 30 3b 0a 20 20 70 57 43 2d  uter = 0;.  pWC-
11d0: 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 57  >nTerm = 0;.  pW
11e0: 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41 72 72 61 79  C->nSlot = Array
11f0: 53 69 7a 65 28 70 57 43 2d 3e 61 53 74 61 74 69  Size(pWC->aStati
1200: 63 29 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20 70  c);.  pWC->a = p
1210: 57 43 2d 3e 61 53 74 61 74 69 63 3b 0a 7d 0a 0a  WC->aStatic;.}..
1220: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
1230: 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76  ence */.static v
1240: 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 43  oid whereClauseC
1250: 6c 65 61 72 28 57 68 65 72 65 43 6c 61 75 73 65  lear(WhereClause
1260: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  *);../*.** Deall
1270: 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f 72 79  ocate all memory
1280: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1290: 20 61 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 6f   a WhereOrInfo o
12a0: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
12b0: 20 76 6f 69 64 20 77 68 65 72 65 4f 72 49 6e 66   void whereOrInf
12c0: 6f 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  oDelete(sqlite3 
12d0: 2a 64 62 2c 20 57 68 65 72 65 4f 72 49 6e 66 6f  *db, WhereOrInfo
12e0: 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 43 6c 61   *p){.  whereCla
12f0: 75 73 65 43 6c 65 61 72 28 26 70 2d 3e 77 63 29  useClear(&p->wc)
1300: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1310: 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
1320: 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 6c  ** Deallocate al
1330: 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  l memory associa
1340: 74 65 64 20 77 69 74 68 20 61 20 57 68 65 72 65  ted with a Where
1350: 41 6e 64 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a  AndInfo object..
1360: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
1370: 68 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74  hereAndInfoDelet
1380: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
1390: 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70 29 7b  hereAndInfo *p){
13a0: 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
13b0: 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73  ear(&p->wc);.  s
13c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
13d0: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   p);.}../*.** De
13e0: 61 6c 6c 6f 63 61 74 65 20 61 20 57 68 65 72 65  allocate a Where
13f0: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
1400: 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61 75  .  The WhereClau
1410: 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  se structure.** 
1420: 69 74 73 65 6c 66 20 69 73 20 6e 6f 74 20 66 72  itself is not fr
1430: 65 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  eed.  This routi
1440: 6e 65 20 69 73 20 74 68 65 20 69 6e 76 65 72 73  ne is the invers
1450: 65 20 6f 66 20 77 68 65 72 65 43 6c 61 75 73 65  e of whereClause
1460: 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Init()..*/.stati
1470: 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75  c void whereClau
1480: 73 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61  seClear(WhereCla
1490: 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 69 6e 74  use *pWC){.  int
14a0: 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20   i;.  WhereTerm 
14b0: 2a 61 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *a;.  sqlite3 *d
14c0: 62 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d  b = pWC->pWInfo-
14d0: 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 66  >pParse->db;.  f
14e0: 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d  or(i=pWC->nTerm-
14f0: 31 2c 20 61 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d  1, a=pWC->a; i>=
1500: 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20  0; i--, a++){.  
1510: 20 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73    if( a->wtFlags
1520: 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20   & TERM_DYNAMIC 
1530: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1540: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 61  ExprDelete(db, a
1550: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ->pExpr);.    }.
1560: 20 20 20 20 69 66 28 20 61 2d 3e 77 74 46 6c 61      if( a->wtFla
1570: 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f  gs & TERM_ORINFO
1580: 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4f   ){.      whereO
1590: 72 49 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c 20  rInfoDelete(db, 
15a0: 61 2d 3e 75 2e 70 4f 72 49 6e 66 6f 29 3b 0a 20  a->u.pOrInfo);. 
15b0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 2d 3e     }else if( a->
15c0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 41  wtFlags & TERM_A
15d0: 4e 44 49 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20  NDINFO ){.      
15e0: 77 68 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65  whereAndInfoDele
15f0: 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70 41 6e 64  te(db, a->u.pAnd
1600: 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Info);.    }.  }
1610: 0a 20 20 69 66 28 20 70 57 43 2d 3e 61 21 3d 70  .  if( pWC->a!=p
1620: 57 43 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20  WC->aStatic ){. 
1630: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1640: 28 64 62 2c 20 70 57 43 2d 3e 61 29 3b 0a 20 20  (db, pWC->a);.  
1650: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  }.}../*.** Add a
1660: 20 73 69 6e 67 6c 65 20 6e 65 77 20 57 68 65 72   single new Wher
1670: 65 54 65 72 6d 20 65 6e 74 72 79 20 74 6f 20 74  eTerm entry to t
1680: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f  he WhereClause o
1690: 62 6a 65 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68  bject pWC..** Th
16a0: 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20  e new WhereTerm 
16b0: 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e 73 74 72  object is constr
16c0: 75 63 74 65 64 20 66 72 6f 6d 20 45 78 70 72 20  ucted from Expr 
16d0: 70 20 61 6e 64 20 77 69 74 68 20 77 74 46 6c 61  p and with wtFla
16e0: 67 73 2e 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78  gs..** The index
16f0: 20 69 6e 20 70 57 43 2d 3e 61 5b 5d 20 6f 66 20   in pWC->a[] of 
1700: 74 68 65 20 6e 65 77 20 57 68 65 72 65 54 65 72  the new WhereTer
1710: 6d 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  m is returned on
1720: 20 73 75 63 63 65 73 73 2e 0a 2a 2a 20 30 20 69   success..** 0 i
1730: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
1740: 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20  e new WhereTerm 
1750: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 64 64  could not be add
1760: 65 64 20 64 75 65 20 74 6f 20 61 20 6d 65 6d 6f  ed due to a memo
1770: 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  ry.** allocation
1780: 20 65 72 72 6f 72 2e 20 20 54 68 65 20 6d 65 6d   error.  The mem
1790: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
17a0: 61 69 6c 75 72 65 20 77 69 6c 6c 20 62 65 20 72  ailure will be r
17b0: 65 63 6f 72 64 65 64 20 69 6e 0a 2a 2a 20 74 68  ecorded in.** th
17c0: 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  e db->mallocFail
17d0: 65 64 20 66 6c 61 67 20 73 6f 20 74 68 61 74 20  ed flag so that 
17e0: 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 66 75 6e  higher-level fun
17f0: 63 74 69 6f 6e 73 20 63 61 6e 20 64 65 74 65 63  ctions can detec
1800: 74 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  t it..**.** This
1810: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 69 6e   routine will in
1820: 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65 20  crease the size 
1830: 6f 66 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20  of the pWC->a[] 
1840: 61 72 72 61 79 20 61 73 20 6e 65 63 65 73 73 61  array as necessa
1850: 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ry..**.** If the
1860: 20 77 74 46 6c 61 67 73 20 61 72 67 75 6d 65 6e   wtFlags argumen
1870: 74 20 69 6e 63 6c 75 64 65 73 20 54 45 52 4d 5f  t includes TERM_
1880: 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 72 65  DYNAMIC, then re
1890: 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20  sponsibility.** 
18a0: 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65 20  for freeing the 
18b0: 65 78 70 72 65 73 73 69 6f 6e 20 70 20 69 73 20  expression p is 
18c0: 61 73 73 75 6d 65 64 20 62 79 20 74 68 65 20 57  assumed by the W
18d0: 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63  hereClause objec
18e0: 74 20 70 57 43 2e 0a 2a 2a 20 54 68 69 73 20 69  t pWC..** This i
18f0: 73 20 74 72 75 65 20 65 76 65 6e 20 69 66 20 74  s true even if t
1900: 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
1910: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20  s to allocate a 
1920: 6e 65 77 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a  new WhereTerm..*
1930: 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 20 54  *.** WARNING:  T
1940: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
1950: 74 20 72 65 61 6c 6c 6f 63 61 74 65 20 74 68 65  t reallocate the
1960: 20 73 70 61 63 65 20 75 73 65 64 20 74 6f 20 73   space used to s
1970: 74 6f 72 65 0a 2a 2a 20 57 68 65 72 65 54 65 72  tore.** WhereTer
1980: 6d 73 2e 20 20 41 6c 6c 20 70 6f 69 6e 74 65 72  ms.  All pointer
1990: 73 20 74 6f 20 57 68 65 72 65 54 65 72 6d 73 20  s to WhereTerms 
19a0: 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 61 6c 69  should be invali
19b0: 64 61 74 65 64 20 61 66 74 65 72 0a 2a 2a 20 63  dated after.** c
19c0: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
19d0: 69 6e 65 2e 20 20 53 75 63 68 20 70 6f 69 6e 74  ine.  Such point
19e0: 65 72 73 20 6d 61 79 20 62 65 20 72 65 69 6e 69  ers may be reini
19f0: 74 69 61 6c 69 7a 65 64 20 62 79 20 72 65 66 65  tialized by refe
1a00: 72 65 6e 63 69 6e 67 0a 2a 2a 20 74 68 65 20 70  rencing.** the p
1a10: 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79 2e 0a 2a  WC->a[] array..*
1a20: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
1a30: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 57  reClauseInsert(W
1a40: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
1a50: 20 45 78 70 72 20 2a 70 2c 20 75 31 36 20 77 74   Expr *p, u16 wt
1a60: 46 6c 61 67 73 29 7b 0a 20 20 57 68 65 72 65 54  Flags){.  WhereT
1a70: 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e  erm *pTerm;.  in
1a80: 74 20 69 64 78 3b 0a 20 20 74 65 73 74 63 61 73  t idx;.  testcas
1a90: 65 28 20 77 74 46 6c 61 67 73 20 26 20 54 45 52  e( wtFlags & TER
1aa0: 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 69  M_VIRTUAL );.  i
1ab0: 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 3d 70  f( pWC->nTerm>=p
1ac0: 57 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a 20 20 20  WC->nSlot ){.   
1ad0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 6c 64   WhereTerm *pOld
1ae0: 20 3d 20 70 57 43 2d 3e 61 3b 0a 20 20 20 20 73   = pWC->a;.    s
1af0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 43  qlite3 *db = pWC
1b00: 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  ->pWInfo->pParse
1b10: 2d 3e 64 62 3b 0a 20 20 20 20 70 57 43 2d 3e 61  ->db;.    pWC->a
1b20: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
1b30: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
1b40: 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d  (pWC->a[0])*pWC-
1b50: 3e 6e 53 6c 6f 74 2a 32 20 29 3b 0a 20 20 20 20  >nSlot*2 );.    
1b60: 69 66 28 20 70 57 43 2d 3e 61 3d 3d 30 20 29 7b  if( pWC->a==0 ){
1b70: 0a 20 20 20 20 20 20 69 66 28 20 77 74 46 6c 61  .      if( wtFla
1b80: 67 73 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49  gs & TERM_DYNAMI
1b90: 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  C ){.        sql
1ba0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
1bb0: 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, p);.      }. 
1bc0: 20 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 70 4f       pWC->a = pO
1bd0: 6c 64 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ld;.      return
1be0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65   0;.    }.    me
1bf0: 6d 63 70 79 28 70 57 43 2d 3e 61 2c 20 70 4f 6c  mcpy(pWC->a, pOl
1c00: 64 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61  d, sizeof(pWC->a
1c10: 5b 30 5d 29 2a 70 57 43 2d 3e 6e 54 65 72 6d 29  [0])*pWC->nTerm)
1c20: 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 21 3d  ;.    if( pOld!=
1c30: 70 57 43 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a  pWC->aStatic ){.
1c40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
1c50: 72 65 65 28 64 62 2c 20 70 4f 6c 64 29 3b 0a 20  ree(db, pOld);. 
1c60: 20 20 20 7d 0a 20 20 20 20 70 57 43 2d 3e 6e 53     }.    pWC->nS
1c70: 6c 6f 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  lot = sqlite3DbM
1c80: 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 57  allocSize(db, pW
1c90: 43 2d 3e 61 29 2f 73 69 7a 65 6f 66 28 70 57 43  C->a)/sizeof(pWC
1ca0: 2d 3e 61 5b 30 5d 29 3b 0a 20 20 20 20 6d 65 6d  ->a[0]);.    mem
1cb0: 73 65 74 28 26 70 57 43 2d 3e 61 5b 70 57 43 2d  set(&pWC->a[pWC-
1cc0: 3e 6e 54 65 72 6d 5d 2c 20 30 2c 20 73 69 7a 65  >nTerm], 0, size
1cd0: 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 28 70  of(pWC->a[0])*(p
1ce0: 57 43 2d 3e 6e 53 6c 6f 74 2d 70 57 43 2d 3e 6e  WC->nSlot-pWC->n
1cf0: 54 65 72 6d 29 29 3b 0a 20 20 7d 0a 20 20 70 54  Term));.  }.  pT
1d00: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
1d10: 78 20 3d 20 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b  x = pWC->nTerm++
1d20: 5d 3b 0a 20 20 69 66 28 20 70 20 26 26 20 45 78  ];.  if( p && Ex
1d30: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
1d40: 20 45 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b   EP_Unlikely) ){
1d50: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 74 72 75 74  .    pTerm->trut
1d60: 68 50 72 6f 62 20 3d 20 73 71 6c 69 74 65 33 4c  hProb = sqlite3L
1d70: 6f 67 45 73 74 28 70 2d 3e 69 54 61 62 6c 65 29  ogEst(p->iTable)
1d80: 20 2d 20 32 37 30 3b 0a 20 20 7d 65 6c 73 65 7b   - 270;.  }else{
1d90: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 74 72 75 74  .    pTerm->trut
1da0: 68 50 72 6f 62 20 3d 20 31 3b 0a 20 20 7d 0a 20  hProb = 1;.  }. 
1db0: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 3d 20   pTerm->pExpr = 
1dc0: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
1dd0: 6f 6c 6c 61 74 65 28 70 29 3b 0a 20 20 70 54 65  ollate(p);.  pTe
1de0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 3d 20 77 74  rm->wtFlags = wt
1df0: 46 6c 61 67 73 3b 0a 20 20 70 54 65 72 6d 2d 3e  Flags;.  pTerm->
1e00: 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 54 65  pWC = pWC;.  pTe
1e10: 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31  rm->iParent = -1
1e20: 3b 0a 20 20 72 65 74 75 72 6e 20 69 64 78 3b 0a  ;.  return idx;.
1e30: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1e40: 75 74 69 6e 65 20 69 64 65 6e 74 69 66 69 65 73  utine identifies
1e50: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20   subexpressions 
1e60: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
1e70: 75 73 65 20 77 68 65 72 65 0a 2a 2a 20 65 61 63  use where.** eac
1e80: 68 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  h subexpression 
1e90: 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20  is separated by 
1ea0: 74 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72  the AND operator
1eb0: 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a   or some other.*
1ec0: 2a 20 6f 70 65 72 61 74 6f 72 20 73 70 65 63 69  * operator speci
1ed0: 66 69 65 64 20 69 6e 20 74 68 65 20 6f 70 20 70  fied in the op p
1ee0: 61 72 61 6d 65 74 65 72 2e 20 20 54 68 65 20 57  arameter.  The W
1ef0: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
1f00: 74 75 72 65 0a 2a 2a 20 69 73 20 66 69 6c 6c 65  ture.** is fille
1f10: 64 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20  d with pointers 
1f20: 74 6f 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  to subexpression
1f30: 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  s.  For example:
1f40: 0a 2a 2a 0a 2a 2a 20 20 20 20 57 48 45 52 45 20  .**.**    WHERE 
1f50: 20 61 3d 3d 27 68 65 6c 6c 6f 27 20 41 4e 44 20   a=='hello' AND 
1f60: 63 6f 61 6c 65 73 63 65 28 62 2c 31 31 29 3c 31  coalesce(b,11)<1
1f70: 30 20 41 4e 44 20 28 63 2b 31 32 21 3d 64 20 4f  0 AND (c+12!=d O
1f80: 52 20 63 3d 3d 32 32 29 0a 2a 2a 20 20 20 20 20  R c==22).**     
1f90: 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f        \________/
1fa0: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
1fb0: 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f  _____/     \____
1fc0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a  ____________/.**
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74              slot
1fe0: 5b 30 5d 20 20 20 20 20 20 20 20 20 20 20 20 73  [0]            s
1ff0: 6c 6f 74 5b 31 5d 20 20 20 20 20 20 20 20 20 20  lot[1]          
2000: 20 20 20 20 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a       slot[2].**.
2010: 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** The original 
2020: 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20  WHERE clause in 
2030: 70 45 78 70 72 20 69 73 20 75 6e 61 6c 74 65 72  pExpr is unalter
2040: 65 64 2e 20 20 41 6c 6c 20 74 68 69 73 20 72 6f  ed.  All this ro
2050: 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 69 73  utine.** does is
2060: 20 6d 61 6b 65 20 73 6c 6f 74 5b 5d 20 65 6e 74   make slot[] ent
2070: 72 69 65 73 20 70 6f 69 6e 74 20 74 6f 20 73 75  ries point to su
2080: 62 73 74 72 75 63 74 75 72 65 20 77 69 74 68 69  bstructure withi
2090: 6e 20 70 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49  n pExpr..**.** I
20a0: 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  n the previous s
20b0: 65 6e 74 65 6e 63 65 20 61 6e 64 20 69 6e 20 74  entence and in t
20c0: 68 65 20 64 69 61 67 72 61 6d 2c 20 22 73 6c 6f  he diagram, "slo
20d0: 74 5b 5d 22 20 72 65 66 65 72 73 20 74 6f 0a 2a  t[]" refers to.*
20e0: 2a 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  * the WhereClaus
20f0: 65 2e 61 5b 5d 20 61 72 72 61 79 2e 20 20 54 68  e.a[] array.  Th
2100: 65 20 73 6c 6f 74 5b 5d 20 61 72 72 61 79 20 67  e slot[] array g
2110: 72 6f 77 73 20 61 73 20 6e 65 65 64 65 64 20 74  rows as needed t
2120: 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c  o contain.** all
2130: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
2140: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73  ERE clause..*/.s
2150: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
2160: 53 70 6c 69 74 28 57 68 65 72 65 43 6c 61 75 73  Split(WhereClaus
2170: 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 45  e *pWC, Expr *pE
2180: 78 70 72 2c 20 75 38 20 6f 70 29 7b 0a 20 20 45  xpr, u8 op){.  E
2190: 78 70 72 20 2a 70 45 32 20 3d 20 73 71 6c 69 74  xpr *pE2 = sqlit
21a0: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
21b0: 65 28 70 45 78 70 72 29 3b 0a 20 20 70 57 43 2d  e(pExpr);.  pWC-
21c0: 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 69 66 28 20  >op = op;.  if( 
21d0: 70 45 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pE2==0 ) return;
21e0: 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 21 3d  .  if( pE2->op!=
21f0: 6f 70 20 29 7b 0a 20 20 20 20 77 68 65 72 65 43  op ){.    whereC
2200: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
2210: 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d 65   pExpr, 0);.  }e
2220: 6c 73 65 7b 0a 20 20 20 20 77 68 65 72 65 53 70  lse{.    whereSp
2230: 6c 69 74 28 70 57 43 2c 20 70 45 32 2d 3e 70 4c  lit(pWC, pE2->pL
2240: 65 66 74 2c 20 6f 70 29 3b 0a 20 20 20 20 77 68  eft, op);.    wh
2250: 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45  ereSplit(pWC, pE
2260: 32 2d 3e 70 52 69 67 68 74 2c 20 6f 70 29 3b 0a  2->pRight, op);.
2270: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69    }.}../*.** Ini
2280: 74 69 61 6c 69 7a 65 20 61 20 57 68 65 72 65 4d  tialize a WhereM
2290: 61 73 6b 53 65 74 20 6f 62 6a 65 63 74 0a 2a 2f  askSet object.*/
22a0: 0a 23 64 65 66 69 6e 65 20 69 6e 69 74 4d 61 73  .#define initMas
22b0: 6b 53 65 74 28 50 29 20 20 28 50 29 2d 3e 6e 3d  kSet(P)  (P)->n=
22c0: 30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  0../*.** Return 
22d0: 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20  the bitmask for 
22e0: 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72  the given cursor
22f0: 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e   number.  Return
2300: 20 30 20 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72   0 if.** iCursor
2310: 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 73   is not in the s
2320: 65 74 2e 0a 2a 2f 0a 42 69 74 6d 61 73 6b 20 73  et..*/.Bitmask s
2330: 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61  qlite3WhereGetMa
2340: 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  sk(WhereMaskSet 
2350: 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69  *pMaskSet, int i
2360: 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69  Cursor){.  int i
2370: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61 73  ;.  assert( pMas
2380: 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69  kSet->n<=(int)si
2390: 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 20  zeof(Bitmask)*8 
23a0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
23b0: 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b  pMaskSet->n; i++
23c0: 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73 6b  ){.    if( pMask
23d0: 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72  Set->ix[i]==iCur
23e0: 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sor ){.      ret
23f0: 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a  urn MASKBIT(i);.
2400: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2410: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
2420: 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73 6b  reate a new mask
2430: 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75 72   for cursor iCur
2440: 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  sor..**.** There
2450: 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20 70   is one cursor p
2460: 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  er table in the 
2470: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68  FROM clause.  Th
2480: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74  e number of.** t
2490: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
24a0: 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69  M clause is limi
24b0: 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65 61  ted by a test ea
24c0: 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71  rly in the.** sq
24d0: 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
24e0: 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77  ) routine.  So w
24f0: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
2500: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a  pMaskSet->ix[].*
2510: 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65 76  * array will nev
2520: 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a  er overflow..*/.
2530: 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61  static void crea
2540: 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b  teMask(WhereMask
2550: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69  Set *pMaskSet, i
2560: 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 61  nt iCursor){.  a
2570: 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d  ssert( pMaskSet-
2580: 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28 70  >n < ArraySize(p
2590: 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a  MaskSet->ix) );.
25a0: 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70    pMaskSet->ix[p
25b0: 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20  MaskSet->n++] = 
25c0: 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  iCursor;.}../*.*
25d0: 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
25e0: 20 77 61 6c 6b 20 28 72 65 63 75 72 73 69 76 65   walk (recursive
25f0: 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ly) an expressio
2600: 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65 72  n tree and gener
2610: 61 74 65 0a 2a 2a 20 61 20 62 69 74 6d 61 73 6b  ate.** a bitmask
2620: 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69 63   indicating whic
2630: 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 73 65  h tables are use
2640: 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73  d in that expres
2650: 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2f  sion.** tree..*/
2660: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
2670: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
2680: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  ge(WhereMaskSet*
2690: 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74  , ExprList*);.st
26a0: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
26b0: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
26c0: 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c  e(WhereMaskSet*,
26d0: 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74 69   Select*);.stati
26e0: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54 61  c Bitmask exprTa
26f0: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
2700: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
2710: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69 74   Expr *p){.  Bit
2720: 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20  mask mask = 0;. 
2730: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
2740: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f  rn 0;.  if( p->o
2750: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
2760: 20 20 20 20 6d 61 73 6b 20 3d 20 73 71 6c 69 74      mask = sqlit
2770: 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 70  e3WhereGetMask(p
2780: 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69 54 61 62  MaskSet, p->iTab
2790: 6c 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  le);.    return 
27a0: 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b  mask;.  }.  mask
27b0: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
27c0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70  e(pMaskSet, p->p
27d0: 52 69 67 68 74 29 3b 0a 20 20 6d 61 73 6b 20 7c  Right);.  mask |
27e0: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
27f0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 4c  (pMaskSet, p->pL
2800: 65 66 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72  eft);.  if( Expr
2810: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
2820: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
2830: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
2840: 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65  SelectTableUsage
2850: 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 78 2e  (pMaskSet, p->x.
2860: 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 65 6c 73  pSelect);.  }els
2870: 65 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  e{.    mask |= e
2880: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
2890: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 78  e(pMaskSet, p->x
28a0: 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 72  .pList);.  }.  r
28b0: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74  eturn mask;.}.st
28c0: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
28d0: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
28e0: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
28f0: 61 73 6b 53 65 74 2c 20 45 78 70 72 4c 69 73 74  askSet, ExprList
2900: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
2910: 69 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73  i;.  Bitmask mas
2920: 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69  k = 0;.  if( pLi
2930: 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  st ){.    for(i=
2940: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
2950: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6d  r; i++){.      m
2960: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
2970: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2980: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
2990: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
29a0: 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73  return mask;.}.s
29b0: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
29c0: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
29d0: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  ge(WhereMaskSet 
29e0: 2a 70 4d 61 73 6b 53 65 74 2c 20 53 65 6c 65 63  *pMaskSet, Selec
29f0: 74 20 2a 70 53 29 7b 0a 20 20 42 69 74 6d 61 73  t *pS){.  Bitmas
2a00: 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 77 68  k mask = 0;.  wh
2a10: 69 6c 65 28 20 70 53 20 29 7b 0a 20 20 20 20 53  ile( pS ){.    S
2a20: 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70  rcList *pSrc = p
2a30: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 6d 61 73  S->pSrc;.    mas
2a40: 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62  k |= exprListTab
2a50: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2a60: 2c 20 70 53 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  , pS->pEList);. 
2a70: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c     mask |= exprL
2a80: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
2a90: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 47 72 6f  askSet, pS->pGro
2aa0: 75 70 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20  upBy);.    mask 
2ab0: 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
2ac0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2ad0: 70 53 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20  pS->pOrderBy);. 
2ae0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54     mask |= exprT
2af0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2b00: 65 74 2c 20 70 53 2d 3e 70 57 68 65 72 65 29 3b  et, pS->pWhere);
2b10: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  .    mask |= exp
2b20: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
2b30: 6b 53 65 74 2c 20 70 53 2d 3e 70 48 61 76 69 6e  kSet, pS->pHavin
2b40: 67 29 3b 0a 20 20 20 20 69 66 28 20 41 4c 57 41  g);.    if( ALWA
2b50: 59 53 28 70 53 72 63 21 3d 30 29 20 29 7b 0a 20  YS(pSrc!=0) ){. 
2b60: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
2b70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
2b80: 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  c->nSrc; i++){. 
2b90: 20 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65         mask |= e
2ba0: 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73  xprSelectTableUs
2bb0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
2bc0: 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  rc->a[i].pSelect
2bd0: 29 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20  );.        mask 
2be0: 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  |= exprTableUsag
2bf0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 72 63  e(pMaskSet, pSrc
2c00: 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b 0a 20 20 20  ->a[i].pOn);.   
2c10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
2c20: 53 20 3d 20 70 53 2d 3e 70 50 72 69 6f 72 3b 0a  S = pS->pPrior;.
2c30: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73    }.  return mas
2c40: 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  k;.}../*.** Retu
2c50: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
2c60: 69 76 65 6e 20 6f 70 65 72 61 74 6f 72 20 69 73  iven operator is
2c70: 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72   one of the oper
2c80: 61 74 6f 72 73 20 74 68 61 74 20 69 73 0a 2a 2a  ators that is.**
2c90: 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 61 6e 20   allowed for an 
2ca0: 69 6e 64 65 78 61 62 6c 65 20 57 48 45 52 45 20  indexable WHERE 
2cb0: 63 6c 61 75 73 65 20 74 65 72 6d 2e 20 20 54 68  clause term.  Th
2cc0: 65 20 61 6c 6c 6f 77 65 64 20 6f 70 65 72 61 74  e allowed operat
2cd0: 6f 72 73 20 61 72 65 0a 2a 2a 20 22 3d 22 2c 20  ors are.** "=", 
2ce0: 22 3c 22 2c 20 22 3e 22 2c 20 22 3c 3d 22 2c 20  "<", ">", "<=", 
2cf0: 22 3e 3d 22 2c 20 22 49 4e 22 2c 20 61 6e 64 20  ">=", "IN", and 
2d00: 22 49 53 20 4e 55 4c 4c 22 0a 2a 2f 0a 73 74 61  "IS NULL".*/.sta
2d10: 74 69 63 20 69 6e 74 20 61 6c 6c 6f 77 65 64 4f  tic int allowedO
2d20: 70 28 69 6e 74 20 6f 70 29 7b 0a 20 20 61 73 73  p(int op){.  ass
2d30: 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51  ert( TK_GT>TK_EQ
2d40: 20 26 26 20 54 4b 5f 47 54 3c 54 4b 5f 47 45 20   && TK_GT<TK_GE 
2d50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f  );.  assert( TK_
2d60: 4c 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c  LT>TK_EQ && TK_L
2d70: 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73  T<TK_GE );.  ass
2d80: 65 72 74 28 20 54 4b 5f 4c 45 3e 54 4b 5f 45 51  ert( TK_LE>TK_EQ
2d90: 20 26 26 20 54 4b 5f 4c 45 3c 54 4b 5f 47 45 20   && TK_LE<TK_GE 
2da0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f  );.  assert( TK_
2db0: 47 45 3d 3d 54 4b 5f 45 51 2b 34 20 29 3b 0a 20  GE==TK_EQ+4 );. 
2dc0: 20 72 65 74 75 72 6e 20 6f 70 3d 3d 54 4b 5f 49   return op==TK_I
2dd0: 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b 5f 45 51 20  N || (op>=TK_EQ 
2de0: 26 26 20 6f 70 3c 3d 54 4b 5f 47 45 29 20 7c 7c  && op<=TK_GE) ||
2df0: 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c   op==TK_ISNULL |
2e00: 7c 20 6f 70 3d 3d 54 4b 5f 49 53 3b 0a 7d 0a 0a  | op==TK_IS;.}..
2e10: 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20  /*.** Commute a 
2e20: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
2e30: 74 6f 72 2e 20 20 45 78 70 72 65 73 73 69 6f 6e  tor.  Expression
2e40: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58  s of the form "X
2e50: 20 6f 70 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f   op Y".** are co
2e60: 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 22 59 20  nverted into "Y 
2e70: 6f 70 20 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  op X"..**.** If 
2e80: 6c 65 66 74 2f 72 69 67 68 74 20 70 72 65 63 65  left/right prece
2e90: 64 65 6e 63 65 20 72 75 6c 65 73 20 63 6f 6d 65  dence rules come
2ea0: 20 69 6e 74 6f 20 70 6c 61 79 20 77 68 65 6e 20   into play when 
2eb0: 64 65 74 65 72 6d 69 6e 69 6e 67 20 74 68 65 0a  determining the.
2ec0: 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ** collating seq
2ed0: 75 65 6e 63 65 2c 20 74 68 65 6e 20 43 4f 4c 4c  uence, then COLL
2ee0: 41 54 45 20 6f 70 65 72 61 74 6f 72 73 20 61 72  ATE operators ar
2ef0: 65 20 61 64 6a 75 73 74 65 64 20 74 6f 20 65 6e  e adjusted to en
2f00: 73 75 72 65 0a 2a 2a 20 74 68 61 74 20 74 68 65  sure.** that the
2f10: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
2f20: 6e 63 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 61  nce does not cha
2f30: 6e 67 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  nge.  For exampl
2f40: 65 3a 0a 2a 2a 20 22 59 20 63 6f 6c 6c 61 74 65  e:.** "Y collate
2f50: 20 4e 4f 43 41 53 45 20 6f 70 20 58 22 20 62 65   NOCASE op X" be
2f60: 63 6f 6d 65 73 20 22 58 20 6f 70 20 59 22 20 62  comes "X op Y" b
2f70: 65 63 61 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61  ecause any colla
2f80: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e  tion sequence on
2f90: 0a 2a 2a 20 74 68 65 20 6c 65 66 74 20 68 61 6e  .** the left han
2fa0: 64 20 73 69 64 65 20 6f 66 20 61 20 63 6f 6d 70  d side of a comp
2fb0: 61 72 69 73 6f 6e 20 6f 76 65 72 72 69 64 65 73  arison overrides
2fc0: 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   any collation s
2fd0: 65 71 75 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61  equence .** atta
2fe0: 63 68 65 64 20 74 6f 20 74 68 65 20 72 69 67 68  ched to the righ
2ff0: 74 2e 20 46 6f 72 20 74 68 65 20 73 61 6d 65 20  t. For the same 
3000: 72 65 61 73 6f 6e 20 74 68 65 20 45 50 5f 43 6f  reason the EP_Co
3010: 6c 6c 61 74 65 20 66 6c 61 67 0a 2a 2a 20 69 73  llate flag.** is
3020: 20 6e 6f 74 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a   not commuted..*
3030: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
3040: 70 72 43 6f 6d 6d 75 74 65 28 50 61 72 73 65 20  prCommute(Parse 
3050: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
3060: 45 78 70 72 29 7b 0a 20 20 75 31 36 20 65 78 70  Expr){.  u16 exp
3070: 52 69 67 68 74 20 3d 20 28 70 45 78 70 72 2d 3e  Right = (pExpr->
3080: 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20  pRight->flags & 
3090: 45 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75  EP_Collate);.  u
30a0: 31 36 20 65 78 70 4c 65 66 74 20 3d 20 28 70 45  16 expLeft = (pE
30b0: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  xpr->pLeft->flag
30c0: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b  s & EP_Collate);
30d0: 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77  .  assert( allow
30e0: 65 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29 20  edOp(pExpr->op) 
30f0: 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  && pExpr->op!=TK
3100: 5f 49 4e 20 29 3b 0a 20 20 69 66 28 20 65 78 70  _IN );.  if( exp
3110: 52 69 67 68 74 3d 3d 65 78 70 4c 65 66 74 20 29  Right==expLeft )
3120: 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20  {.    /* Either 
3130: 58 20 61 6e 64 20 59 20 62 6f 74 68 20 68 61 76  X and Y both hav
3140: 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  e COLLATE operat
3150: 6f 72 20 6f 72 20 6e 65 69 74 68 65 72 20 64 6f  or or neither do
3160: 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 78 70 52   */.    if( expR
3170: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ight ){.      /*
3180: 20 42 6f 74 68 20 58 20 61 6e 64 20 59 20 68 61   Both X and Y ha
3190: 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61  ve COLLATE opera
31a0: 74 6f 72 73 2e 20 20 4d 61 6b 65 20 73 75 72 65  tors.  Make sure
31b0: 20 58 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20   X is always.   
31c0: 20 20 20 2a 2a 20 75 73 65 64 20 62 79 20 63 6c     ** used by cl
31d0: 65 61 72 69 6e 67 20 74 68 65 20 45 50 5f 43 6f  earing the EP_Co
31e0: 6c 6c 61 74 65 20 66 6c 61 67 20 66 72 6f 6d 20  llate flag from 
31f0: 59 2e 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70  Y. */.      pExp
3200: 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73  r->pRight->flags
3210: 20 26 3d 20 7e 45 50 5f 43 6f 6c 6c 61 74 65 3b   &= ~EP_Collate;
3220: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
3230: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
3240: 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
3250: 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20  >pLeft)!=0 ){.  
3260: 20 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 58      /* Neither X
3270: 20 6e 6f 72 20 59 20 68 61 76 65 20 43 4f 4c 4c   nor Y have COLL
3280: 41 54 45 20 6f 70 65 72 61 74 6f 72 73 2c 20 62  ATE operators, b
3290: 75 74 20 58 20 68 61 73 20 61 20 6e 6f 6e 2d 64  ut X has a non-d
32a0: 65 66 61 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20  efault.      ** 
32b0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
32c0: 63 65 2e 20 20 53 6f 20 61 64 64 20 74 68 65 20  ce.  So add the 
32d0: 45 50 5f 43 6f 6c 6c 61 74 65 20 6d 61 72 6b 65  EP_Collate marke
32e0: 72 20 6f 6e 20 58 20 74 6f 20 63 61 75 73 65 0a  r on X to cause.
32f0: 20 20 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 62        ** it to b
3300: 65 20 73 65 61 72 63 68 65 64 20 66 69 72 73 74  e searched first
3310: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72  . */.      pExpr
3320: 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 7c  ->pLeft->flags |
3330: 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20  = EP_Collate;.  
3340: 20 20 7d 0a 20 20 7d 0a 20 20 53 57 41 50 28 45    }.  }.  SWAP(E
3350: 78 70 72 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67  xpr*,pExpr->pRig
3360: 68 74 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  ht,pExpr->pLeft)
3370: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
3380: 70 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20  p>=TK_GT ){.    
3390: 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54  assert( TK_LT==T
33a0: 4b 5f 47 54 2b 32 20 29 3b 0a 20 20 20 20 61 73  K_GT+2 );.    as
33b0: 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f  sert( TK_GE==TK_
33c0: 4c 45 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65  LE+2 );.    asse
33d0: 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20  rt( TK_GT>TK_EQ 
33e0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  );.    assert( T
33f0: 4b 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20  K_GT<TK_LE );.  
3400: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
3410: 3e 6f 70 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45  >op>=TK_GT && pE
3420: 78 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29  xpr->op<=TK_GE )
3430: 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20  ;.    pExpr->op 
3440: 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b  = ((pExpr->op-TK
3450: 5f 47 54 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20  _GT)^2)+TK_GT;. 
3460: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e   }.}../*.** Tran
3470: 73 6c 61 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78  slate from TK_xx
3480: 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f   operator to WO_
3490: 78 78 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73  xx bitmask..*/.s
34a0: 74 61 74 69 63 20 75 31 36 20 6f 70 65 72 61 74  tatic u16 operat
34b0: 6f 72 4d 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a  orMask(int op){.
34c0: 20 20 75 31 36 20 63 3b 0a 20 20 61 73 73 65 72    u16 c;.  asser
34d0: 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29  t( allowedOp(op)
34e0: 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   );.  if( op==TK
34f0: 5f 49 4e 20 29 7b 0a 20 20 20 20 63 20 3d 20 57  _IN ){.    c = W
3500: 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  O_IN;.  }else if
3510: 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op==TK_ISNULL 
3520: 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 53  ){.    c = WO_IS
3530: 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NULL;.  }else if
3540: 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 7b 0a 20  ( op==TK_IS ){. 
3550: 20 20 20 63 20 3d 20 57 4f 5f 49 53 3b 0a 20 20     c = WO_IS;.  
3560: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
3570: 74 28 20 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54  t( (WO_EQ<<(op-T
3580: 4b 5f 45 51 29 29 20 3c 20 30 78 37 66 66 66 20  K_EQ)) < 0x7fff 
3590: 29 3b 0a 20 20 20 20 63 20 3d 20 28 75 31 36 29  );.    c = (u16)
35a0: 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45  (WO_EQ<<(op-TK_E
35b0: 51 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  Q));.  }.  asser
35c0: 74 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c  t( op!=TK_ISNULL
35d0: 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c   || c==WO_ISNULL
35e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
35f0: 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f  !=TK_IN || c==WO
3600: 5f 49 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _IN );.  assert(
3610: 20 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d   op!=TK_EQ || c=
3620: 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73 73 65  =WO_EQ );.  asse
3630: 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c  rt( op!=TK_LT ||
3640: 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61   c==WO_LT );.  a
3650: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45  ssert( op!=TK_LE
3660: 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a   || c==WO_LE );.
3670: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
3680: 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20  _GT || c==WO_GT 
3690: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
36a0: 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_GE || c==WO_
36b0: 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
36c0: 6f 70 21 3d 54 4b 5f 49 53 20 7c 7c 20 63 3d 3d  op!=TK_IS || c==
36d0: 57 4f 5f 49 53 20 29 3b 0a 20 20 72 65 74 75 72  WO_IS );.  retur
36e0: 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n c;.}../*.** Ad
36f0: 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
3700: 74 20 57 68 65 72 65 54 65 72 6d 20 74 68 61 74  t WhereTerm that
3710: 20 6d 61 74 63 68 65 73 20 61 63 63 6f 72 64 69   matches accordi
3720: 6e 67 20 74 6f 20 74 68 65 20 63 72 69 74 65 72  ng to the criter
3730: 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73 68 65  ia.** establishe
3740: 64 20 77 68 65 6e 20 74 68 65 20 70 53 63 61 6e  d when the pScan
3750: 20 6f 62 6a 65 63 74 20 77 61 73 20 69 6e 69 74   object was init
3760: 69 61 6c 69 7a 65 64 20 62 79 20 77 68 65 72 65  ialized by where
3770: 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20 52  ScanInit()..** R
3780: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68  eturn NULL if th
3790: 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
37a0: 6d 61 74 63 68 69 6e 67 20 57 68 65 72 65 54 65  matching WhereTe
37b0: 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57  rms..*/.static W
37c0: 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53  hereTerm *whereS
37d0: 63 61 6e 4e 65 78 74 28 57 68 65 72 65 53 63 61  canNext(WhereSca
37e0: 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20 69 6e 74  n *pScan){.  int
37f0: 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20   iCur;          
3800: 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
3810: 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  on the LHS of th
3820: 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  e term */.  int 
3830: 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20  iColumn;        
3840: 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f   /* The column o
3850: 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  n the LHS of the
3860: 20 74 65 72 6d 2e 20 20 2d 31 20 66 6f 72 20 49   term.  -1 for I
3870: 50 4b 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 58  PK */.  Expr *pX
3880: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
3890: 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62 65  An expression be
38a0: 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a 20 20  ing tested */.  
38b0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
38c0: 3b 20 20 20 20 2f 2a 20 53 68 6f 72 74 68 61 6e  ;    /* Shorthan
38d0: 64 20 66 6f 72 20 70 53 63 61 6e 2d 3e 70 57 43  d for pScan->pWC
38e0: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
38f0: 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20 54 68  *pTerm;    /* Th
3900: 65 20 74 65 72 6d 20 62 65 69 6e 67 20 74 65 73  e term being tes
3910: 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6b 20 3d  ted */.  int k =
3920: 20 70 53 63 61 6e 2d 3e 6b 3b 20 20 20 20 2f 2a   pScan->k;    /*
3930: 20 57 68 65 72 65 20 74 6f 20 73 74 61 72 74 20   Where to start 
3940: 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20 20 77  scanning */..  w
3950: 68 69 6c 65 28 20 70 53 63 61 6e 2d 3e 69 45 71  hile( pScan->iEq
3960: 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45 71 75  uiv<=pScan->nEqu
3970: 69 76 20 29 7b 0a 20 20 20 20 69 43 75 72 20 3d  iv ){.    iCur =
3980: 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 70   pScan->aEquiv[p
3990: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 32 5d 3b  Scan->iEquiv-2];
39a0: 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70  .    iColumn = p
39b0: 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 70 53 63  Scan->aEquiv[pSc
39c0: 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b 0a 20  an->iEquiv-1];. 
39d0: 20 20 20 77 68 69 6c 65 28 20 28 70 57 43 20 3d     while( (pWC =
39e0: 20 70 53 63 61 6e 2d 3e 70 57 43 29 21 3d 30 20   pScan->pWC)!=0 
39f0: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65  ){.      for(pTe
3a00: 72 6d 3d 70 57 43 2d 3e 61 2b 6b 3b 20 6b 3c 70  rm=pWC->a+k; k<p
3a10: 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b 2b 2b 2c 20  WC->nTerm; k++, 
3a20: 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
3a30: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
3a40: 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20  tCursor==iCur.  
3a50: 20 20 20 20 20 20 20 26 26 20 70 54 65 72 6d 2d         && pTerm-
3a60: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69  >u.leftColumn==i
3a70: 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20 20  Column.         
3a80: 26 26 20 28 70 53 63 61 6e 2d 3e 69 45 71 75 69  && (pScan->iEqui
3a90: 76 3c 3d 32 20 7c 7c 20 21 45 78 70 72 48 61 73  v<=2 || !ExprHas
3aa0: 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
3ab0: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
3ac0: 69 6e 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  in)).        ){.
3ad0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
3ae0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
3af0: 26 20 57 4f 5f 45 51 55 49 56 29 21 3d 30 0a 20  & WO_EQUIV)!=0. 
3b00: 20 20 20 20 20 20 20 20 20 20 26 26 20 70 53 63            && pSc
3b10: 61 6e 2d 3e 6e 45 71 75 69 76 3c 41 72 72 61 79  an->nEquiv<Array
3b20: 53 69 7a 65 28 70 53 63 61 6e 2d 3e 61 45 71 75  Size(pScan->aEqu
3b30: 69 76 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  iv).          ){
3b40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
3b50: 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   j;.            
3b60: 70 58 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pX = sqlite3Expr
3b70: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 54 65 72  SkipCollate(pTer
3b80: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
3b90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  );.            a
3ba0: 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54  ssert( pX->op==T
3bb0: 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
3bc0: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
3bd0: 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76   j<pScan->nEquiv
3be0: 3b 20 6a 2b 3d 32 29 7b 0a 20 20 20 20 20 20 20  ; j+=2){.       
3bf0: 20 20 20 20 20 20 20 69 66 28 20 70 53 63 61 6e         if( pScan
3c00: 2d 3e 61 45 71 75 69 76 5b 6a 5d 3d 3d 70 58 2d  ->aEquiv[j]==pX-
3c10: 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20 20  >iTable.        
3c20: 20 20 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d         && pScan-
3c30: 3e 61 45 71 75 69 76 5b 6a 2b 31 5d 3d 3d 70 58  >aEquiv[j+1]==pX
3c40: 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
3c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
3c60: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
3c70: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
3c80: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
3c90: 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e 6e 45  if( j==pScan->nE
3ca0: 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20 20 20  quiv ){.        
3cb0: 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 45 71        pScan->aEq
3cc0: 75 69 76 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54 61  uiv[j] = pX->iTa
3cd0: 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ble;.           
3ce0: 20 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76     pScan->aEquiv
3cf0: 5b 6a 2b 31 5d 20 3d 20 70 58 2d 3e 69 43 6f 6c  [j+1] = pX->iCol
3d00: 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  umn;.           
3d10: 20 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76     pScan->nEquiv
3d20: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20   += 2;.         
3d30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
3d40: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
3d50: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
3d60: 20 26 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b   & pScan->opMask
3d70: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
3d80: 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68      /* Verify th
3d90: 65 20 61 66 66 69 6e 69 74 79 20 61 6e 64 20 63  e affinity and c
3da0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
3db0: 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20  e match */.     
3dc0: 20 20 20 20 20 20 20 69 66 28 20 70 53 63 61 6e         if( pScan
3dd0: 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 26 26 20 28  ->zCollName && (
3de0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
3df0: 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30   & WO_ISNULL)==0
3e00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3e10: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
3e20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3e30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
3e40: 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61  pWC->pWInfo->pPa
3e50: 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rse;.           
3e60: 20 20 20 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70     pX = pTerm->p
3e70: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
3e80: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
3e90: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28  IndexAffinityOk(
3ea0: 70 58 2c 20 70 53 63 61 6e 2d 3e 69 64 78 61 66  pX, pScan->idxaf
3eb0: 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  f) ){.          
3ec0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
3ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
3ef0: 73 65 72 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b  sert(pX->pLeft);
3f00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
3f10: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  Coll = sqlite3Bi
3f20: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
3f30: 65 71 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  eq(pParse,.     
3f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d               pX-
3f70: 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67  >pLeft, pX->pRig
3f80: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ht);.           
3f90: 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20     if( pColl==0 
3fa0: 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65  ) pColl = pParse
3fb0: 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
3fc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
3fd0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
3fe0: 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20  p(pColl->zName, 
3ff0: 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65  pScan->zCollName
4000: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
4010: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
4020: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
4030: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
4040: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54           if( (pT
4050: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
4060: 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21   (WO_EQ|WO_IS))!
4070: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
4080: 26 26 20 28 70 58 20 3d 20 70 54 65 72 6d 2d 3e  && (pX = pTerm->
4090: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 2d 3e  pExpr->pRight)->
40a0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20  op==TK_COLUMN.  
40b0: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 58             && pX
40c0: 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 63 61 6e 2d  ->iTable==pScan-
40d0: 3e 61 45 71 75 69 76 5b 30 5d 0a 20 20 20 20 20  >aEquiv[0].     
40e0: 20 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e 69          && pX->i
40f0: 43 6f 6c 75 6d 6e 3d 3d 70 53 63 61 6e 2d 3e 61  Column==pScan->a
4100: 45 71 75 69 76 5b 31 5d 0a 20 20 20 20 20 20 20  Equiv[1].       
4110: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
4120: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
4130: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
4140: 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20   & WO_IS );.    
4150: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
4160: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
4170: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  }.            pS
4180: 63 61 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a 20 20  can->k = k+1;.  
4190: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
41a0: 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   pTerm;.        
41b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
41c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63 61      }.      pSca
41d0: 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e  n->pWC = pScan->
41e0: 70 57 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20  pWC->pOuter;.   
41f0: 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a     k = 0;.    }.
4200: 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d      pScan->pWC =
4210: 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 3b   pScan->pOrigWC;
4220: 0a 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20  .    k = 0;.    
4230: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 2b 3d  pScan->iEquiv +=
4240: 20 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   2;.  }.  return
4250: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69   0;.}../*.** Ini
4260: 74 69 61 6c 69 7a 65 20 61 20 57 48 45 52 45 20  tialize a WHERE 
4270: 63 6c 61 75 73 65 20 73 63 61 6e 6e 65 72 20 6f  clause scanner o
4280: 62 6a 65 63 74 2e 20 20 52 65 74 75 72 6e 20 61  bject.  Return a
4290: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a   pointer to the.
42a0: 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 2e 20  ** first match. 
42b0: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
42c0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 61 74  there are no mat
42d0: 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ches..**.** The 
42e0: 73 63 61 6e 6e 65 72 20 77 69 6c 6c 20 62 65 20  scanner will be 
42f0: 73 65 61 72 63 68 69 6e 67 20 74 68 65 20 57 48  searching the WH
4300: 45 52 45 20 63 6c 61 75 73 65 20 70 57 43 2e 20  ERE clause pWC. 
4310: 20 49 74 20 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a   It will look.**
4320: 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68   for terms of th
4330: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c  e form "X <op> <
4340: 65 78 70 72 3e 22 20 77 68 65 72 65 20 58 20 69  expr>" where X i
4350: 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e  s column iColumn
4360: 20 6f 66 20 74 61 62 6c 65 0a 2a 2a 20 69 43 75   of table.** iCu
4370: 72 2e 20 20 54 68 65 20 3c 6f 70 3e 20 6d 75 73  r.  The <op> mus
4380: 74 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20  t be one of the 
4390: 6f 70 65 72 61 74 6f 72 73 20 64 65 73 63 72 69  operators descri
43a0: 62 65 64 20 62 79 20 6f 70 4d 61 73 6b 2e 0a 2a  bed by opMask..*
43b0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 61 72  *.** If the sear
43c0: 63 68 20 69 73 20 66 6f 72 20 58 20 61 6e 64 20  ch is for X and 
43d0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
43e0: 20 63 6f 6e 74 61 69 6e 73 20 74 65 72 6d 73 20   contains terms 
43f0: 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 58  of the.** form X
4400: 3d 59 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  =Y then this rou
4410: 74 69 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f 20  tine might also 
4420: 72 65 74 75 72 6e 20 74 65 72 6d 73 20 6f 66 20  return terms of 
4430: 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c  the form.** "Y <
4440: 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 20 20 54 68  op> <expr>".  Th
4450: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65  e number of leve
4460: 6c 73 20 6f 66 20 74 72 61 6e 73 69 74 69 76 69  ls of transitivi
4470: 74 79 20 69 73 20 6c 69 6d 69 74 65 64 2c 0a 2a  ty is limited,.*
4480: 2a 20 62 75 74 20 69 73 20 65 6e 6f 75 67 68 20  * but is enough 
4490: 74 6f 20 68 61 6e 64 6c 65 20 6d 6f 73 74 20 63  to handle most c
44a0: 6f 6d 6d 6f 6e 6c 79 20 6f 63 63 75 72 72 69 6e  ommonly occurrin
44b0: 67 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  g SQL statements
44c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20  ..**.** If X is 
44d0: 6e 6f 74 20 74 68 65 20 49 4e 54 45 47 45 52 20  not the INTEGER 
44e0: 50 52 49 4d 41 52 59 20 4b 45 59 20 74 68 65 6e  PRIMARY KEY then
44f0: 20 58 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 61   X must be compa
4500: 74 69 62 6c 65 20 77 69 74 68 0a 2a 2a 20 69 6e  tible with.** in
4510: 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 73 74 61  dex pIdx..*/.sta
4520: 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77  tic WhereTerm *w
4530: 68 65 72 65 53 63 61 6e 49 6e 69 74 28 0a 20 20  hereScanInit(.  
4540: 57 68 65 72 65 53 63 61 6e 20 2a 70 53 63 61 6e  WhereScan *pScan
4550: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57  ,       /* The W
4560: 68 65 72 65 53 63 61 6e 20 6f 62 6a 65 63 74 20  hereScan object 
4570: 62 65 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 65  being initialize
4580: 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  d */.  WhereClau
4590: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 2f  se *pWC,       /
45a0: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
45b0: 73 65 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64  se to be scanned
45c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20   */.  int iCur, 
45d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
45e0: 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20   Cursor to scan 
45f0: 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  for */.  int iCo
4600: 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20  lumn,           
4610: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 73 63   /* Column to sc
4620: 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 75 33 32 20  an for */.  u32 
4630: 6f 70 4d 61 73 6b 2c 20 20 20 20 20 20 20 20 20  opMask,         
4640: 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 28      /* Operator(
4650: 73 29 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a  s) to scan for *
4660: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
4670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
4680: 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c  ust be compatibl
4690: 65 20 77 69 74 68 20 74 68 69 73 20 69 6e 64 65  e with this inde
46a0: 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 3b  x */.){.  int j;
46b0: 0a 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 53  ..  /* memset(pS
46c0: 63 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  can, 0, sizeof(*
46d0: 70 53 63 61 6e 29 29 3b 20 2a 2f 0a 20 20 70 53  pScan)); */.  pS
46e0: 63 61 6e 2d 3e 70 4f 72 69 67 57 43 20 3d 20 70  can->pOrigWC = p
46f0: 57 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 57 43  WC;.  pScan->pWC
4700: 20 3d 20 70 57 43 3b 0a 20 20 69 66 28 20 70 49   = pWC;.  if( pI
4710: 64 78 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30  dx && iColumn>=0
4720: 20 29 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69   ){.    pScan->i
4730: 64 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54  dxaff = pIdx->pT
4740: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75  able->aCol[iColu
4750: 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  mn].affinity;.  
4760: 20 20 66 6f 72 28 6a 3d 30 3b 20 70 49 64 78 2d    for(j=0; pIdx-
4770: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69 43  >aiColumn[j]!=iC
4780: 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  olumn; j++){.   
4790: 20 20 20 69 66 28 20 4e 45 56 45 52 28 6a 3e 70     if( NEVER(j>p
47a0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 20  Idx->nColumn) ) 
47b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
47c0: 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c      pScan->zColl
47d0: 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Name = pIdx->azC
47e0: 6f 6c 6c 5b 6a 5d 3b 0a 20 20 7d 65 6c 73 65 7b  oll[j];.  }else{
47f0: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64 78 61  .    pScan->idxa
4800: 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 53 63 61  ff = 0;.    pSca
4810: 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 30  n->zCollName = 0
4820: 3b 0a 20 20 7d 0a 20 20 70 53 63 61 6e 2d 3e 6f  ;.  }.  pScan->o
4830: 70 4d 61 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b 0a  pMask = opMask;.
4840: 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a    pScan->k = 0;.
4850: 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b    pScan->aEquiv[
4860: 30 5d 20 3d 20 69 43 75 72 3b 0a 20 20 70 53 63  0] = iCur;.  pSc
4870: 61 6e 2d 3e 61 45 71 75 69 76 5b 31 5d 20 3d 20  an->aEquiv[1] = 
4880: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63 61 6e  iColumn;.  pScan
4890: 2d 3e 6e 45 71 75 69 76 20 3d 20 32 3b 0a 20 20  ->nEquiv = 2;.  
48a0: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 3d 20  pScan->iEquiv = 
48b0: 32 3b 0a 20 20 72 65 74 75 72 6e 20 77 68 65 72  2;.  return wher
48c0: 65 53 63 61 6e 4e 65 78 74 28 70 53 63 61 6e 29  eScanNext(pScan)
48d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
48e0: 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20  h for a term in 
48f0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4900: 20 74 68 61 74 20 69 73 20 6f 66 20 74 68 65 20   that is of the 
4910: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78  form "X <op> <ex
4920: 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20  pr>".** where X 
4930: 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  is a reference t
4940: 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66  o the iColumn of
4950: 20 74 61 62 6c 65 20 69 43 75 72 20 61 6e 64 20   table iCur and 
4960: 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a 2a  <op> is one of.*
4970: 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f 70 65 72  * the WO_xx oper
4980: 61 74 6f 72 20 63 6f 64 65 73 20 73 70 65 63 69  ator codes speci
4990: 66 69 65 64 20 62 79 20 74 68 65 20 6f 70 20 70  fied by the op p
49a0: 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65 74  arameter..** Ret
49b0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
49c0: 20 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74 75   the term.  Retu
49d0: 72 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e  rn 0 if not foun
49e0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72  d..**.** The ter
49f0: 6d 20 72 65 74 75 72 6e 65 64 20 6d 69 67 68 74  m returned might
4a00: 20 62 79 20 59 3d 3c 65 78 70 72 3e 20 69 66 20   by Y=<expr> if 
4a10: 74 68 65 72 65 20 69 73 20 61 6e 6f 74 68 65 72  there is another
4a20: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 0a 2a   constraint in.*
4a30: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
4a40: 73 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65  se that specifie
4a50: 73 20 74 68 61 74 20 58 3d 59 2e 20 20 41 6e 79  s that X=Y.  Any
4a60: 20 73 75 63 68 20 63 6f 6e 73 74 72 61 69 6e 74   such constraint
4a70: 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 64 65  s will be.** ide
4a80: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 57  ntified by the W
4a90: 4f 5f 45 51 55 49 56 20 62 69 74 20 69 6e 20 74  O_EQUIV bit in t
4aa0: 68 65 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  he pTerm->eOpera
4ab0: 74 6f 72 20 66 69 65 6c 64 2e 20 20 54 68 65 0a  tor field.  The.
4ac0: 2a 2a 20 61 45 71 75 69 76 5b 5d 20 61 72 72 61  ** aEquiv[] arra
4ad0: 79 20 68 6f 6c 64 73 20 58 20 61 6e 64 20 61 6c  y holds X and al
4ae0: 6c 20 69 74 73 20 65 71 75 69 76 61 6c 65 6e 74  l its equivalent
4af0: 73 2c 20 77 69 74 68 20 65 61 63 68 20 53 51 4c  s, with each SQL
4b00: 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 74 61 6b   variable.** tak
4b10: 69 6e 67 20 75 70 20 74 77 6f 20 73 6c 6f 74 73  ing up two slots
4b20: 20 69 6e 20 61 45 71 75 69 76 5b 5d 2e 20 20 54   in aEquiv[].  T
4b30: 68 65 20 66 69 72 73 74 20 73 6c 6f 74 20 69 73  he first slot is
4b40: 20 66 6f 72 20 74 68 65 20 63 75 72 73 6f 72 20   for the cursor 
4b50: 6e 75 6d 62 65 72 0a 2a 2a 20 61 6e 64 20 74 68  number.** and th
4b60: 65 20 73 65 63 6f 6e 64 20 69 73 20 66 6f 72 20  e second is for 
4b70: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  the column numbe
4b80: 72 2e 20 20 54 68 65 72 65 20 61 72 65 20 32 32  r.  There are 22
4b90: 20 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69 76   slots in aEquiv
4ba0: 5b 5d 0a 2a 2a 20 73 6f 20 74 68 61 74 20 6d 65  [].** so that me
4bb0: 61 6e 73 20 77 65 20 63 61 6e 20 6c 6f 6f 6b 20  ans we can look 
4bc0: 66 6f 72 20 58 20 70 6c 75 73 20 75 70 20 74 6f  for X plus up to
4bd0: 20 31 30 20 6f 74 68 65 72 20 65 71 75 69 76 61   10 other equiva
4be0: 6c 65 6e 74 20 76 61 6c 75 65 73 2e 0a 2a 2a 20  lent values..** 
4bf0: 48 65 6e 63 65 20 61 20 73 65 61 72 63 68 20 66  Hence a search f
4c00: 6f 72 20 58 20 77 69 6c 6c 20 72 65 74 75 72 6e  or X will return
4c10: 20 3c 65 78 70 72 3e 20 69 66 20 58 3d 41 31 20   <expr> if X=A1 
4c20: 61 6e 64 20 41 31 3d 41 32 20 61 6e 64 20 41 32  and A1=A2 and A2
4c30: 3d 41 33 0a 2a 2a 20 61 6e 64 20 2e 2e 2e 20 61  =A3.** and ... a
4c40: 6e 64 20 41 39 3d 41 31 30 20 61 6e 64 20 41 31  nd A9=A10 and A1
4c50: 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a 2a 2a 20  0=<expr>..**.** 
4c60: 49 66 20 74 68 65 72 65 20 61 72 65 20 6d 75 6c  If there are mul
4c70: 74 69 70 6c 65 20 74 65 72 6d 73 20 69 6e 20 74  tiple terms in t
4c80: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
4c90: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
4ca0: 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 74  op> <expr>".** t
4cb0: 68 65 6e 20 74 72 79 20 66 6f 72 20 74 68 65 20  hen try for the 
4cc0: 6f 6e 65 20 77 69 74 68 20 6e 6f 20 64 65 70 65  one with no depe
4cd0: 6e 64 65 6e 63 69 65 73 20 6f 6e 20 3c 65 78 70  ndencies on <exp
4ce0: 72 3e 20 2d 20 69 6e 20 6f 74 68 65 72 20 77 6f  r> - in other wo
4cf0: 72 64 73 20 77 68 65 72 65 0a 2a 2a 20 3c 65 78  rds where.** <ex
4d00: 70 72 3e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  pr> is a constan
4d10: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  t expression of 
4d20: 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f 6e 6c 79  some kind.  Only
4d30: 20 72 65 74 75 72 6e 20 65 6e 74 72 69 65 73 20   return entries 
4d40: 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22  of.** the form "
4d50: 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20  X <op> Y" where 
4d60: 59 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  Y is a column in
4d70: 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
4d80: 66 20 6e 6f 20 74 65 72 6d 73 20 6f 66 0a 2a 2a  f no terms of.**
4d90: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
4da0: 3e 20 3c 63 6f 6e 73 74 2d 65 78 70 72 3e 22 20  > <const-expr>" 
4db0: 65 78 69 73 74 2e 20 20 20 49 66 20 6e 6f 20 74  exist.   If no t
4dc0: 65 72 6d 73 20 77 69 74 68 20 61 20 63 6f 6e 73  erms with a cons
4dd0: 74 61 6e 74 20 52 48 53 0a 2a 2a 20 65 78 69 73  tant RHS.** exis
4de0: 74 2c 20 74 72 79 20 74 6f 20 72 65 74 75 72 6e  t, try to return
4df0: 20 61 20 74 65 72 6d 20 74 68 61 74 20 64 6f 65   a term that doe
4e00: 73 20 6e 6f 74 20 75 73 65 20 57 4f 5f 45 51 55  s not use WO_EQU
4e10: 49 56 2e 0a 2a 2f 0a 57 68 65 72 65 54 65 72 6d  IV..*/.WhereTerm
4e20: 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65 46 69   *sqlite3WhereFi
4e30: 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72 65 43  ndTerm(.  WhereC
4e40: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
4e50: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
4e60: 75 73 65 20 74 6f 20 62 65 20 73 65 61 72 63 68  use to be search
4e70: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  ed */.  int iCur
4e80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
4e90: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
4ea0: 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69  f LHS */.  int i
4eb0: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20  Column,         
4ec0: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* Column numbe
4ed0: 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42 69  r of LHS */.  Bi
4ee0: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
4ef0: 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73 74 20      /* RHS must 
4f00: 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69 74 68  not overlap with
4f10: 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20 20   this mask */.  
4f20: 75 33 32 20 6f 70 2c 20 20 20 20 20 20 20 20 20  u32 op,         
4f30: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
4f40: 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20 64 65   WO_xx values de
4f50: 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61 74 6f  scribing operato
4f60: 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  r */.  Index *pI
4f70: 64 78 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dx           /* 
4f80: 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62  Must be compatib
4f90: 6c 65 20 77 69 74 68 20 74 68 69 73 20 69 6e 64  le with this ind
4fa0: 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20  ex, if not NULL 
4fb0: 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72  */.){.  WhereTer
4fc0: 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20 30 3b 0a  m *pResult = 0;.
4fd0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 3b 0a    WhereTerm *p;.
4fe0: 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e    WhereScan scan
4ff0: 3b 0a 0a 20 20 70 20 3d 20 77 68 65 72 65 53 63  ;..  p = whereSc
5000: 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70 57  anInit(&scan, pW
5010: 43 2c 20 69 43 75 72 2c 20 69 43 6f 6c 75 6d 6e  C, iCur, iColumn
5020: 2c 20 6f 70 2c 20 70 49 64 78 29 3b 0a 20 20 6f  , op, pIdx);.  o
5030: 70 20 26 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 53  p &= WO_EQ|WO_IS
5040: 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
5050: 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72      if( (p->prer
5060: 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61  eqRight & notRea
5070: 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dy)==0 ){.      
5080: 69 66 28 20 70 2d 3e 70 72 65 72 65 71 52 69 67  if( p->prereqRig
5090: 68 74 3d 3d 30 20 26 26 20 28 70 2d 3e 65 4f 70  ht==0 && (p->eOp
50a0: 65 72 61 74 6f 72 26 6f 70 29 21 3d 30 20 29 7b  erator&op)!=0 ){
50b0: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
50c0: 65 28 20 70 2d 3e 65 4f 70 65 72 61 74 6f 72 20  e( p->eOperator 
50d0: 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20  & WO_IS );.     
50e0: 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20     return p;.   
50f0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
5100: 52 65 73 75 6c 74 3d 3d 30 20 29 20 70 52 65 73  Result==0 ) pRes
5110: 75 6c 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20  ult = p;.    }. 
5120: 20 20 20 70 20 3d 20 77 68 65 72 65 53 63 61 6e     p = whereScan
5130: 4e 65 78 74 28 26 73 63 61 6e 29 3b 0a 20 20 7d  Next(&scan);.  }
5140: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 73 75 6c  .  return pResul
5150: 74 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t;.}../* Forward
5160: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
5170: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e  atic void exprAn
5180: 61 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c 20  alyze(SrcList*, 
5190: 57 68 65 72 65 43 6c 61 75 73 65 2a 2c 20 69 6e  WhereClause*, in
51a0: 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  t);../*.** Call 
51b0: 65 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61  exprAnalyze on a
51c0: 6c 6c 20 74 65 72 6d 73 20 69 6e 20 61 20 57 48  ll terms in a WH
51d0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2a  ERE clause.  .**
51e0: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 65 78  .** Note that ex
51f0: 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67 68  prAnalyze() migh
5200: 74 20 61 64 64 20 6e 65 77 20 76 69 72 74 75 61  t add new virtua
5210: 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65  l terms onto the
5220: 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 57  .** end of the W
5230: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 57 65  HERE clause.  We
5240: 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20   do not want to 
5250: 61 6e 61 6c 79 7a 65 20 74 68 65 73 65 20 6e 65  analyze these ne
5260: 77 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 65 72  w.** virtual ter
5270: 6d 73 2c 20 73 6f 20 73 74 61 72 74 20 61 6e 61  ms, so start ana
5280: 6c 79 7a 69 6e 67 20 61 74 20 74 68 65 20 65 6e  lyzing at the en
5290: 64 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61  d and work forwa
52a0: 72 64 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68  rd.** so that th
52b0: 65 20 61 64 64 65 64 20 76 69 72 74 75 61 6c 20  e added virtual 
52c0: 74 65 72 6d 73 20 61 72 65 20 6e 65 76 65 72 20  terms are never 
52d0: 70 72 6f 63 65 73 73 65 64 2e 0a 2a 2f 0a 73 74  processed..*/.st
52e0: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e  atic void exprAn
52f0: 61 6c 79 7a 65 41 6c 6c 28 0a 20 20 53 72 63 4c  alyzeAll(.  SrcL
5300: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
5310: 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d       /* the FROM
5320: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
5330: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20 20 20  reClause *pWC   
5340: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45        /* the WHE
5350: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
5360: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20  analyzed */.){. 
5370: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
5380: 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e  pWC->nTerm-1; i>
5390: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 65 78  =0; i--){.    ex
53a0: 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69  prAnalyze(pTabLi
53b0: 73 74 2c 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d  st, pWC, i);.  }
53c0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
53d0: 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54  TE_OMIT_LIKE_OPT
53e0: 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20  IMIZATION./*.** 
53f0: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
5400: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
5410: 73 69 6f 6e 20 69 73 20 61 20 4c 49 4b 45 20 6f  sion is a LIKE o
5420: 72 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20  r GLOB operator 
5430: 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 6f  that.** can be o
5440: 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 69  ptimized using i
5450: 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
5460: 61 69 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 54  aints.  Return T
5470: 52 55 45 20 69 66 20 69 74 20 69 73 0a 2a 2a 20  RUE if it is.** 
5480: 73 6f 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  so and false if 
5490: 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72  not..**.** In or
54a0: 64 65 72 20 66 6f 72 20 74 68 65 20 6f 70 65 72  der for the oper
54b0: 61 74 6f 72 20 74 6f 20 62 65 20 6f 70 74 69 6d  ator to be optim
54c0: 69 7a 69 62 6c 65 2c 20 74 68 65 20 52 48 53 20  izible, the RHS 
54d0: 6d 75 73 74 20 62 65 20 61 20 73 74 72 69 6e 67  must be a string
54e0: 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 74 68 61 74  .** literal that
54f0: 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20   does not begin 
5500: 77 69 74 68 20 61 20 77 69 6c 64 63 61 72 64 2e  with a wildcard.
5510: 20 20 54 68 65 20 4c 48 53 20 6d 75 73 74 20 62    The LHS must b
5520: 65 20 61 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 68  e a column.** th
5530: 61 74 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 4e  at may only be N
5540: 55 4c 4c 2c 20 61 20 73 74 72 69 6e 67 2c 20 6f  ULL, a string, o
5550: 72 20 61 20 42 4c 4f 42 2c 20 6e 65 76 65 72 20  r a BLOB, never 
5560: 61 20 6e 75 6d 62 65 72 2e 20 28 54 68 69 73 20  a number. (This 
5570: 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 76 69  means.** that vi
5580: 72 74 75 61 6c 20 74 61 62 6c 65 73 20 63 61 6e  rtual tables can
5590: 6e 6f 74 20 70 61 72 74 69 63 69 70 61 74 65 20  not participate 
55a0: 69 6e 20 74 68 65 20 4c 49 4b 45 20 6f 70 74 69  in the LIKE opti
55b0: 6d 69 7a 61 74 69 6f 6e 2e 29 20 20 54 68 65 0a  mization.)  The.
55c0: 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ** collating seq
55d0: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f  uence for the co
55e0: 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 4c 48 53 20  lumn on the LHS 
55f0: 6d 75 73 74 20 62 65 20 61 70 70 72 6f 70 72 69  must be appropri
5600: 61 74 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6f  ate for.** the o
5610: 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  perator..*/.stat
5620: 69 63 20 69 6e 74 20 69 73 4c 69 6b 65 4f 72 47  ic int isLikeOrG
5630: 6c 6f 62 28 0a 20 20 50 61 72 73 65 20 2a 70 50  lob(.  Parse *pP
5640: 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
5650: 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
5660: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
5670: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
5680: 2c 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74  ,      /* Test t
5690: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  his expression *
56a0: 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 50 72 65  /.  Expr **ppPre
56b0: 66 69 78 2c 20 20 2f 2a 20 50 6f 69 6e 74 65 72  fix,  /* Pointer
56c0: 20 74 6f 20 54 4b 5f 53 54 52 49 4e 47 20 65 78   to TK_STRING ex
56d0: 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 70 61  pression with pa
56e0: 74 74 65 72 6e 20 70 72 65 66 69 78 20 2a 2f 0a  ttern prefix */.
56f0: 20 20 69 6e 74 20 2a 70 69 73 43 6f 6d 70 6c 65    int *pisComple
5700: 74 65 2c 20 2f 2a 20 54 72 75 65 20 69 66 20 74  te, /* True if t
5710: 68 65 20 6f 6e 6c 79 20 77 69 6c 64 63 61 72 64  he only wildcard
5720: 20 69 73 20 25 20 69 6e 20 74 68 65 20 6c 61 73   is % in the las
5730: 74 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20  t character */. 
5740: 20 69 6e 74 20 2a 70 6e 6f 43 61 73 65 20 20 20   int *pnoCase   
5750: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 75 70     /* True if up
5760: 70 65 72 63 61 73 65 20 69 73 20 65 71 75 69 76  percase is equiv
5770: 61 6c 65 6e 74 20 74 6f 20 6c 6f 77 65 72 63 61  alent to lowerca
5780: 73 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  se */.){.  const
5790: 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 20 20 20   char *z = 0;   
57a0: 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20        /* String 
57b0: 6f 6e 20 52 48 53 20 6f 66 20 4c 49 4b 45 20 6f  on RHS of LIKE o
57c0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70  perator */.  Exp
57d0: 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66  r *pRight, *pLef
57e0: 74 3b 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74  t;      /* Right
57f0: 20 61 6e 64 20 6c 65 66 74 20 73 69 7a 65 20 6f   and left size o
5800: 66 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20  f LIKE operator 
5810: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
5820: 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
5830: 2f 2a 20 4c 69 73 74 20 6f 66 20 6f 70 65 72 61  /* List of opera
5840: 6e 64 73 20 74 6f 20 74 68 65 20 4c 49 4b 45 20  nds to the LIKE 
5850: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  operator */.  in
5860: 74 20 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  t c;            
5870: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
5880: 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a 5b 5d  character in z[]
5890: 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20   */.  int cnt;  
58a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f   /* Number of no
58c0: 6e 2d 77 69 6c 64 63 61 72 64 20 70 72 65 66 69  n-wildcard prefi
58d0: 78 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a  x characters */.
58e0: 20 20 63 68 61 72 20 77 63 5b 33 5d 3b 20 20 20    char wc[3];   
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5900: 57 69 6c 64 63 61 72 64 20 63 68 61 72 61 63 74  Wildcard charact
5910: 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ers */.  sqlite3
5920: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
5930: 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  b;  /* Database 
5940: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
5950: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
5960: 56 61 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6f  Val = 0;.  int o
5970: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
5980: 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20        /* Opcode 
5990: 6f 66 20 70 52 69 67 68 74 20 2a 2f 0a 0a 20 20  of pRight */..  
59a0: 69 66 28 20 21 73 71 6c 69 74 65 33 49 73 4c 69  if( !sqlite3IsLi
59b0: 6b 65 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70  keFunction(db, p
59c0: 45 78 70 72 2c 20 70 6e 6f 43 61 73 65 2c 20 77  Expr, pnoCase, w
59d0: 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  c) ){.    return
59e0: 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53   0;.  }.#ifdef S
59f0: 51 4c 49 54 45 5f 45 42 43 44 49 43 0a 20 20 69  QLITE_EBCDIC.  i
5a00: 66 28 20 2a 70 6e 6f 43 61 73 65 20 29 20 72 65  f( *pnoCase ) re
5a10: 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20  turn 0;.#endif. 
5a20: 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e   pList = pExpr->
5a30: 78 2e 70 4c 69 73 74 3b 0a 20 20 70 4c 65 66 74  x.pList;.  pLeft
5a40: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70   = pList->a[1].p
5a50: 45 78 70 72 3b 0a 20 20 69 66 28 20 70 4c 65 66  Expr;.  if( pLef
5a60: 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op!=TK_COLUMN
5a70: 20 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45   .   || sqlite3E
5a80: 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66  xprAffinity(pLef
5a90: 74 29 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  t)!=SQLITE_AFF_T
5aa0: 45 58 54 20 0a 20 20 20 7c 7c 20 49 73 56 69 72  EXT .   || IsVir
5ab0: 74 75 61 6c 28 70 4c 65 66 74 2d 3e 70 54 61 62  tual(pLeft->pTab
5ac0: 29 20 20 2f 2a 20 56 61 6c 75 65 20 6d 69 67 68  )  /* Value migh
5ad0: 74 20 62 65 20 6e 75 6d 65 72 69 63 20 2a 2f 0a  t be numeric */.
5ae0: 20 20 29 7b 0a 20 20 20 20 2f 2a 20 49 4d 50 3a    ){.    /* IMP:
5af0: 20 52 2d 30 32 30 36 35 2d 34 39 34 36 35 20 54   R-02065-49465 T
5b00: 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64  he left-hand sid
5b10: 65 20 6f 66 20 74 68 65 20 4c 49 4b 45 20 6f 72  e of the LIKE or
5b20: 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 6d   GLOB operator m
5b30: 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68  ust.    ** be th
5b40: 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 69 6e 64  e name of an ind
5b50: 65 78 65 64 20 63 6f 6c 75 6d 6e 20 77 69 74 68  exed column with
5b60: 20 54 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20   TEXT affinity. 
5b70: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  */.    return 0;
5b80: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
5b90: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 28  Left->iColumn!=(
5ba0: 2d 31 29 20 29 3b 20 2f 2a 20 42 65 63 61 75 73  -1) ); /* Becaus
5bb0: 65 20 49 50 4b 20 6e 65 76 65 72 20 68 61 73 20  e IPK never has 
5bc0: 41 46 46 5f 54 45 58 54 20 2a 2f 0a 0a 20 20 70  AFF_TEXT */..  p
5bd0: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
5be0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
5bf0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
5c00: 29 3b 0a 20 20 6f 70 20 3d 20 70 52 69 67 68 74  );.  op = pRight
5c10: 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
5c20: 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20  TK_VARIABLE ){. 
5c30: 20 20 20 56 64 62 65 20 2a 70 52 65 70 72 65 70     Vdbe *pReprep
5c40: 61 72 65 20 3d 20 70 50 61 72 73 65 2d 3e 70 52  are = pParse->pR
5c50: 65 70 72 65 70 61 72 65 3b 0a 20 20 20 20 69 6e  eprepare;.    in
5c60: 74 20 69 43 6f 6c 20 3d 20 70 52 69 67 68 74 2d  t iCol = pRight-
5c70: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 56  >iColumn;.    pV
5c80: 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  al = sqlite3Vdbe
5c90: 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 70 52  GetBoundValue(pR
5ca0: 65 70 72 65 70 61 72 65 2c 20 69 43 6f 6c 2c 20  eprepare, iCol, 
5cb0: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 29  SQLITE_AFF_BLOB)
5cc0: 3b 0a 20 20 20 20 69 66 28 20 70 56 61 6c 20 26  ;.    if( pVal &
5cd0: 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  & sqlite3_value_
5ce0: 74 79 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c 49  type(pVal)==SQLI
5cf0: 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20  TE_TEXT ){.     
5d00: 20 7a 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c   z = (char *)sql
5d10: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
5d20: 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pVal);.    }.   
5d30: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56   sqlite3VdbeSetV
5d40: 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70  armask(pParse->p
5d50: 56 64 62 65 2c 20 69 43 6f 6c 29 3b 0a 20 20 20  Vdbe, iCol);.   
5d60: 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74 2d   assert( pRight-
5d70: 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45  >op==TK_VARIABLE
5d80: 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d   || pRight->op==
5d90: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20  TK_REGISTER );. 
5da0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54   }else if( op==T
5db0: 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20  K_STRING ){.    
5dc0: 7a 20 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54  z = pRight->u.zT
5dd0: 6f 6b 65 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  oken;.  }.  if( 
5de0: 7a 20 29 7b 0a 20 20 20 20 63 6e 74 20 3d 20 30  z ){.    cnt = 0
5df0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d  ;.    while( (c=
5e00: 7a 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20 63 21  z[cnt])!=0 && c!
5e10: 3d 77 63 5b 30 5d 20 26 26 20 63 21 3d 77 63 5b  =wc[0] && c!=wc[
5e20: 31 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d 20 29  1] && c!=wc[2] )
5e30: 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  {.      cnt++;. 
5e40: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6e 74     }.    if( cnt
5e50: 21 3d 30 20 26 26 20 32 35 35 21 3d 28 75 38 29  !=0 && 255!=(u8)
5e60: 7a 5b 63 6e 74 2d 31 5d 20 29 7b 0a 20 20 20 20  z[cnt-1] ){.    
5e70: 20 20 45 78 70 72 20 2a 70 50 72 65 66 69 78 3b    Expr *pPrefix;
5e80: 0a 20 20 20 20 20 20 2a 70 69 73 43 6f 6d 70 6c  .      *pisCompl
5e90: 65 74 65 20 3d 20 63 3d 3d 77 63 5b 30 5d 20 26  ete = c==wc[0] &
5ea0: 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a 20  & z[cnt+1]==0;. 
5eb0: 20 20 20 20 20 70 50 72 65 66 69 78 20 3d 20 73       pPrefix = s
5ec0: 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
5ed0: 4b 5f 53 54 52 49 4e 47 2c 20 7a 29 3b 0a 20 20  K_STRING, z);.  
5ee0: 20 20 20 20 69 66 28 20 70 50 72 65 66 69 78 20      if( pPrefix 
5ef0: 29 20 70 50 72 65 66 69 78 2d 3e 75 2e 7a 54 6f  ) pPrefix->u.zTo
5f00: 6b 65 6e 5b 63 6e 74 5d 20 3d 20 30 3b 0a 20 20  ken[cnt] = 0;.  
5f10: 20 20 20 20 2a 70 70 50 72 65 66 69 78 20 3d 20      *ppPrefix = 
5f20: 70 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20 69  pPrefix;.      i
5f30: 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42  f( op==TK_VARIAB
5f40: 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64  LE ){.        Vd
5f50: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
5f60: 70 56 64 62 65 3b 0a 20 20 20 20 20 20 20 20 73  pVdbe;.        s
5f70: 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72  qlite3VdbeSetVar
5f80: 6d 61 73 6b 28 76 2c 20 70 52 69 67 68 74 2d 3e  mask(v, pRight->
5f90: 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
5fa0: 20 20 69 66 28 20 2a 70 69 73 43 6f 6d 70 6c 65    if( *pisComple
5fb0: 74 65 20 26 26 20 70 52 69 67 68 74 2d 3e 75 2e  te && pRight->u.
5fc0: 7a 54 6f 6b 65 6e 5b 31 5d 20 29 7b 0a 20 20 20  zToken[1] ){.   
5fd0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
5fe0: 20 72 68 73 20 6f 66 20 74 68 65 20 4c 49 4b 45   rhs of the LIKE
5ff0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
6000: 20 76 61 72 69 61 62 6c 65 2c 20 61 6e 64 20 74   variable, and t
6010: 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20  he current.     
6020: 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66       ** value of
6030: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 6d 65   the variable me
6040: 61 6e 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ans there is no 
6050: 6e 65 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20 74  need to invoke t
6060: 68 65 20 4c 49 4b 45 0a 20 20 20 20 20 20 20 20  he LIKE.        
6070: 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 74    ** function, t
6080: 68 65 6e 20 6e 6f 20 4f 50 5f 56 61 72 69 61 62  hen no OP_Variab
6090: 6c 65 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64  le will be added
60a0: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
60b0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68  .          ** Th
60c0: 69 73 20 63 61 75 73 65 73 20 70 72 6f 62 6c 65  is causes proble
60d0: 6d 73 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74  ms for the sqlit
60e0: 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
60f0: 72 5f 6e 61 6d 65 28 29 0a 20 20 20 20 20 20 20  r_name().       
6100: 20 20 20 2a 2a 20 41 50 49 2e 20 54 6f 20 77 6f     ** API. To wo
6110: 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 6d 2c 20  rk around them, 
6120: 61 64 64 20 61 20 64 75 6d 6d 79 20 4f 50 5f 56  add a dummy OP_V
6130: 61 72 69 61 62 6c 65 20 68 65 72 65 2e 0a 20 20  ariable here..  
6140: 20 20 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20          */ .    
6150: 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
6160: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
6170: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
6180: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
6190: 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
61a0: 2c 20 70 52 69 67 68 74 2c 20 72 31 29 3b 0a 20  , pRight, r1);. 
61b0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
61c0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
61d0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
61e0: 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 30 29 3b  ntAddr(v)-1, 0);
61f0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
6200: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
6210: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
6220: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
6230: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6240: 20 7a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20   z = 0;.    }.  
6250: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  }..  sqlite3Valu
6260: 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 72  eFree(pVal);.  r
6270: 65 74 75 72 6e 20 28 7a 21 3d 30 29 3b 0a 7d 0a  eturn (z!=0);.}.
6280: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
6290: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
62a0: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69 66  IZATION */...#if
62b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
62c0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
62d0: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
62e0: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   if the given ex
62f0: 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74  pression is of t
6300: 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20  he form.**.**   
6310: 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 4d 41 54        column MAT
6320: 43 48 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66  CH expr.**.** If
6330: 20 69 74 20 69 73 20 74 68 65 6e 20 72 65 74 75   it is then retu
6340: 72 6e 20 54 52 55 45 2e 20 20 49 66 20 6e 6f 74  rn TRUE.  If not
6350: 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a  , return FALSE..
6360: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
6370: 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20  MatchOfColumn(. 
6380: 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
6390: 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65    /* Test this e
63a0: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a  xpression */.){.
63b0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
63c0: 74 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 2d  t;..  if( pExpr-
63d0: 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e  >op!=TK_FUNCTION
63e0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
63f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
6400: 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72  te3StrICmp(pExpr
6410: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 74 63  ->u.zToken,"matc
6420: 68 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  h")!=0 ){.    re
6430: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c  turn 0;.  }.  pL
6440: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
6450: 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73  List;.  if( pLis
6460: 74 2d 3e 6e 45 78 70 72 21 3d 32 20 29 7b 0a 20  t->nExpr!=2 ){. 
6470: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
6480: 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b  .  if( pList->a[
6490: 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 21 3d 20  1].pExpr->op != 
64a0: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
64b0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
64c0: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
64d0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
64e0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
64f0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  */../*.** If the
6500: 20 70 42 61 73 65 20 65 78 70 72 65 73 73 69 6f   pBase expressio
6510: 6e 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20  n originated in 
6520: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
6530: 63 6c 61 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a  clause of.** a j
6540: 6f 69 6e 2c 20 74 68 65 6e 20 74 72 61 6e 73 66  oin, then transf
6550: 65 72 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  er the appropria
6560: 74 65 20 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72  te markings over
6570: 20 74 6f 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a   to derived..*/.
6580: 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e  static void tran
6590: 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73  sferJoinMarkings
65a0: 28 45 78 70 72 20 2a 70 44 65 72 69 76 65 64 2c  (Expr *pDerived,
65b0: 20 45 78 70 72 20 2a 70 42 61 73 65 29 7b 0a 20   Expr *pBase){. 
65c0: 20 69 66 28 20 70 44 65 72 69 76 65 64 20 29 7b   if( pDerived ){
65d0: 0a 20 20 20 20 70 44 65 72 69 76 65 64 2d 3e 66  .    pDerived->f
65e0: 6c 61 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e 66  lags |= pBase->f
65f0: 6c 61 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f  lags & EP_FromJo
6600: 69 6e 3b 0a 20 20 20 20 70 44 65 72 69 76 65 64  in;.    pDerived
6610: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
6620: 65 20 3d 20 70 42 61 73 65 2d 3e 69 52 69 67 68  e = pBase->iRigh
6630: 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 7d 0a  tJoinTable;.  }.
6640: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 65  }../*.** Mark te
6650: 72 6d 20 69 43 68 69 6c 64 20 61 73 20 62 65 69  rm iChild as bei
6660: 6e 67 20 61 20 63 68 69 6c 64 20 6f 66 20 74 65  ng a child of te
6670: 72 6d 20 69 50 61 72 65 6e 74 0a 2a 2f 0a 73 74  rm iParent.*/.st
6680: 61 74 69 63 20 76 6f 69 64 20 6d 61 72 6b 54 65  atic void markTe
6690: 72 6d 41 73 43 68 69 6c 64 28 57 68 65 72 65 43  rmAsChild(WhereC
66a0: 6c 61 75 73 65 20 2a 70 57 43 2c 20 69 6e 74 20  lause *pWC, int 
66b0: 69 43 68 69 6c 64 2c 20 69 6e 74 20 69 50 61 72  iChild, int iPar
66c0: 65 6e 74 29 7b 0a 20 20 70 57 43 2d 3e 61 5b 69  ent){.  pWC->a[i
66d0: 43 68 69 6c 64 5d 2e 69 50 61 72 65 6e 74 20 3d  Child].iParent =
66e0: 20 69 50 61 72 65 6e 74 3b 0a 20 20 70 57 43 2d   iParent;.  pWC-
66f0: 3e 61 5b 69 43 68 69 6c 64 5d 2e 74 72 75 74 68  >a[iChild].truth
6700: 50 72 6f 62 20 3d 20 70 57 43 2d 3e 61 5b 69 50  Prob = pWC->a[iP
6710: 61 72 65 6e 74 5d 2e 74 72 75 74 68 50 72 6f 62  arent].truthProb
6720: 3b 0a 20 20 70 57 43 2d 3e 61 5b 69 50 61 72 65  ;.  pWC->a[iPare
6730: 6e 74 5d 2e 6e 43 68 69 6c 64 2b 2b 3b 0a 7d 0a  nt].nChild++;.}.
6740: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
6750: 65 20 4e 2d 74 68 20 41 4e 44 2d 63 6f 6e 6e 65  e N-th AND-conne
6760: 63 74 65 64 20 73 75 62 74 65 72 6d 20 6f 66 20  cted subterm of 
6770: 70 54 65 72 6d 2e 20 20 4f 72 20 69 66 20 70 54  pTerm.  Or if pT
6780: 65 72 6d 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20  erm is not.** a 
6790: 63 6f 6e 6a 75 6e 63 74 69 6f 6e 2c 20 74 68 65  conjunction, the
67a0: 6e 20 72 65 74 75 72 6e 20 6a 75 73 74 20 70 54  n return just pT
67b0: 65 72 6d 20 77 68 65 6e 20 4e 3d 3d 30 2e 20 20  erm when N==0.  
67c0: 49 66 20 4e 20 69 73 20 65 78 63 65 65 64 73 0a  If N is exceeds.
67d0: 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
67e0: 20 61 76 61 69 6c 61 62 6c 65 20 73 75 62 74 65   available subte
67f0: 72 6d 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  rms, return NULL
6800: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72  ..*/.static Wher
6810: 65 54 65 72 6d 20 2a 77 68 65 72 65 4e 74 68 53  eTerm *whereNthS
6820: 75 62 74 65 72 6d 28 57 68 65 72 65 54 65 72 6d  ubterm(WhereTerm
6830: 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 4e 29 7b   *pTerm, int N){
6840: 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f  .  if( pTerm->eO
6850: 70 65 72 61 74 6f 72 21 3d 57 4f 5f 41 4e 44 20  perator!=WO_AND 
6860: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 4e 3d  ){.    return N=
6870: 3d 30 20 3f 20 70 54 65 72 6d 20 3a 20 30 3b 0a  =0 ? pTerm : 0;.
6880: 20 20 7d 0a 20 20 69 66 28 20 4e 3c 70 54 65 72    }.  if( N<pTer
6890: 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77  m->u.pAndInfo->w
68a0: 63 2e 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20 72  c.nTerm ){.    r
68b0: 65 74 75 72 6e 20 26 70 54 65 72 6d 2d 3e 75 2e  eturn &pTerm->u.
68c0: 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 2e 61 5b 4e  pAndInfo->wc.a[N
68d0: 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ];.  }.  return 
68e0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 74  0;.}../*.** Subt
68f0: 65 72 6d 73 20 70 4f 6e 65 20 61 6e 64 20 70 54  erms pOne and pT
6900: 77 6f 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  wo are contained
6910: 20 77 69 74 68 69 6e 20 57 48 45 52 45 20 63 6c   within WHERE cl
6920: 61 75 73 65 20 70 57 43 2e 20 20 54 68 65 0a 2a  ause pWC.  The.*
6930: 2a 20 74 77 6f 20 73 75 62 74 65 72 6d 73 20 61  * two subterms a
6940: 72 65 20 69 6e 20 64 69 73 6a 75 6e 63 74 69 6f  re in disjunctio
6950: 6e 20 2d 20 74 68 65 79 20 61 72 65 20 4f 52 2d  n - they are OR-
6960: 65 64 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2a 0a  ed together..**.
6970: 2a 2a 20 49 66 20 74 68 65 73 65 20 74 77 6f 20  ** If these two 
6980: 74 65 72 6d 73 20 61 72 65 20 62 6f 74 68 20 6f  terms are both o
6990: 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 22 41 20  f the form:  "A 
69a0: 6f 70 20 42 22 20 77 69 74 68 20 74 68 65 20 73  op B" with the s
69b0: 61 6d 65 0a 2a 2a 20 41 20 61 6e 64 20 42 20 76  ame.** A and B v
69c0: 61 6c 75 65 73 20 62 75 74 20 64 69 66 66 65 72  alues but differ
69d0: 65 6e 74 20 6f 70 65 72 61 74 6f 72 73 20 61 6e  ent operators an
69e0: 64 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 6f  d if the operato
69f0: 72 73 20 61 72 65 0a 2a 2a 20 63 6f 6d 70 61 74  rs are.** compat
6a00: 69 62 6c 65 20 28 69 66 20 6f 6e 65 20 69 73 20  ible (if one is 
6a10: 3d 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20  = and the other 
6a20: 69 73 20 3c 2c 20 66 6f 72 20 65 78 61 6d 70 6c  is <, for exampl
6a30: 65 29 20 74 68 65 6e 0a 2a 2a 20 61 64 64 20 61  e) then.** add a
6a40: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 41 4e 44   new virtual AND
6a50: 20 74 65 72 6d 20 74 6f 20 70 57 43 20 74 68 61   term to pWC tha
6a60: 74 20 69 73 20 74 68 65 20 63 6f 6d 62 69 6e 61  t is the combina
6a70: 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 74  tion of the.** t
6a80: 77 6f 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 65  wo..**.** Some e
6a90: 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  xamples:.**.**  
6aa0: 20 20 78 3c 79 20 4f 52 20 78 3d 79 20 20 20 20    x<y OR x=y    
6ab0: 2d 2d 3e 20 20 20 20 20 78 3c 3d 79 0a 2a 2a 20  -->     x<=y.** 
6ac0: 20 20 20 78 3d 79 20 4f 52 20 78 3d 79 20 20 20     x=y OR x=y   
6ad0: 20 2d 2d 3e 20 20 20 20 20 78 3d 79 0a 2a 2a 20   -->     x=y.** 
6ae0: 20 20 20 78 3c 3d 79 20 4f 52 20 78 3c 79 20 20     x<=y OR x<y  
6af0: 20 2d 2d 3e 20 20 20 20 20 78 3c 3d 79 0a 2a 2a   -->     x<=y.**
6b00: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
6b10: 67 20 69 73 20 4e 4f 54 20 67 65 6e 65 72 61 74  g is NOT generat
6b20: 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3c 79  ed:.**.**    x<y
6b30: 20 4f 52 20 78 3e 79 20 20 20 20 2d 2d 3e 20 20   OR x>y    -->  
6b40: 20 20 20 78 21 3d 79 20 20 20 20 20 0a 2a 2f 0a     x!=y     .*/.
6b50: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
6b60: 65 43 6f 6d 62 69 6e 65 44 69 73 6a 75 6e 63 74  eCombineDisjunct
6b70: 73 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  s(.  SrcList *pS
6b80: 72 63 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  rc,         /* t
6b90: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
6ba0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
6bb0: 2a 70 57 43 2c 20 20 20 20 20 20 2f 2a 20 54 68  *pWC,      /* Th
6bc0: 65 20 63 6f 6d 70 6c 65 74 65 20 57 48 45 52 45  e complete WHERE
6bd0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
6be0: 72 65 54 65 72 6d 20 2a 70 4f 6e 65 2c 20 20 20  reTerm *pOne,   
6bf0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 64 69 73      /* First dis
6c00: 6a 75 6e 63 74 20 2a 2f 0a 20 20 57 68 65 72 65  junct */.  Where
6c10: 54 65 72 6d 20 2a 70 54 77 6f 20 20 20 20 20 20  Term *pTwo      
6c20: 20 20 2f 2a 20 53 65 63 6f 6e 64 20 64 69 73 6a    /* Second disj
6c30: 75 6e 63 74 20 2a 2f 0a 29 7b 0a 20 20 75 31 36  unct */.){.  u16
6c40: 20 65 4f 70 20 3d 20 70 4f 6e 65 2d 3e 65 4f 70   eOp = pOne->eOp
6c50: 65 72 61 74 6f 72 20 7c 20 70 54 77 6f 2d 3e 65  erator | pTwo->e
6c60: 4f 70 65 72 61 74 6f 72 3b 0a 20 20 73 71 6c 69  Operator;.  sqli
6c70: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
6c80: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
6c90: 6f 6e 6e 65 63 74 69 6f 6e 20 28 66 6f 72 20 6d  onnection (for m
6ca0: 61 6c 6c 6f 63 29 20 2a 2f 0a 20 20 45 78 70 72  alloc) */.  Expr
6cb0: 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
6cc0: 20 20 20 2f 2a 20 4e 65 77 20 76 69 72 74 75 61     /* New virtua
6cd0: 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  l expression */.
6ce0: 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
6cf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 72           /* Oper
6d00: 61 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 6d  ator for the com
6d10: 62 69 6e 65 64 20 65 78 70 72 65 73 73 69 6f 6e  bined expression
6d20: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 4e 65 77   */.  int idxNew
6d30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
6d40: 49 6e 64 65 78 20 69 6e 20 70 57 43 20 6f 66 20  Index in pWC of 
6d50: 74 68 65 20 6e 65 78 74 20 76 69 72 74 75 61 6c  the next virtual
6d60: 20 74 65 72 6d 20 2a 2f 0a 0a 20 20 69 66 28 20   term */..  if( 
6d70: 28 70 4f 6e 65 2d 3e 65 4f 70 65 72 61 74 6f 72  (pOne->eOperator
6d80: 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c   & (WO_EQ|WO_LT|
6d90: 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
6da0: 45 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  E))==0 ) return;
6db0: 0a 20 20 69 66 28 20 28 70 54 77 6f 2d 3e 65 4f  .  if( (pTwo->eO
6dc0: 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51  perator & (WO_EQ
6dd0: 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f  |WO_LT|WO_LE|WO_
6de0: 47 54 7c 57 4f 5f 47 45 29 29 3d 3d 30 20 29 20  GT|WO_GE))==0 ) 
6df0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 65  return;.  if( (e
6e00: 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 4c  Op & (WO_EQ|WO_L
6e10: 54 7c 57 4f 5f 4c 45 29 29 21 3d 65 4f 70 0a 20  T|WO_LE))!=eOp. 
6e20: 20 20 26 26 20 28 65 4f 70 20 26 20 28 57 4f 5f    && (eOp & (WO_
6e30: 45 51 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29  EQ|WO_GT|WO_GE))
6e40: 21 3d 65 4f 70 20 29 20 72 65 74 75 72 6e 3b 0a  !=eOp ) return;.
6e50: 20 20 61 73 73 65 72 74 28 20 70 4f 6e 65 2d 3e    assert( pOne->
6e60: 70 45 78 70 72 2d 3e 70 4c 65 66 74 21 3d 30 20  pExpr->pLeft!=0 
6e70: 26 26 20 70 4f 6e 65 2d 3e 70 45 78 70 72 2d 3e  && pOne->pExpr->
6e80: 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 61  pRight!=0 );.  a
6e90: 73 73 65 72 74 28 20 70 54 77 6f 2d 3e 70 45 78  ssert( pTwo->pEx
6ea0: 70 72 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26 20  pr->pLeft!=0 && 
6eb0: 70 54 77 6f 2d 3e 70 45 78 70 72 2d 3e 70 52 69  pTwo->pExpr->pRi
6ec0: 67 68 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ght!=0 );.  if( 
6ed0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
6ee0: 72 65 28 70 4f 6e 65 2d 3e 70 45 78 70 72 2d 3e  re(pOne->pExpr->
6ef0: 70 4c 65 66 74 2c 20 70 54 77 6f 2d 3e 70 45 78  pLeft, pTwo->pEx
6f00: 70 72 2d 3e 70 4c 65 66 74 2c 20 2d 31 29 20 29  pr->pLeft, -1) )
6f10: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73   return;.  if( s
6f20: 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
6f30: 65 28 70 4f 6e 65 2d 3e 70 45 78 70 72 2d 3e 70  e(pOne->pExpr->p
6f40: 52 69 67 68 74 2c 20 70 54 77 6f 2d 3e 70 45 78  Right, pTwo->pEx
6f50: 70 72 2d 3e 70 52 69 67 68 74 2c 20 2d 31 29 20  pr->pRight, -1) 
6f60: 29 72 65 74 75 72 6e 3b 0a 20 20 2f 2a 20 49 66  )return;.  /* If
6f70: 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
6f80: 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74  oint, it means t
6f90: 68 65 20 74 77 6f 20 73 75 62 74 65 72 6d 73 20  he two subterms 
6fa0: 63 61 6e 20 62 65 20 63 6f 6d 62 69 6e 65 64 20  can be combined 
6fb0: 2a 2f 0a 20 20 69 66 28 20 28 65 4f 70 20 26 20  */.  if( (eOp & 
6fc0: 28 65 4f 70 2d 31 29 29 21 3d 30 20 29 7b 0a 20  (eOp-1))!=0 ){. 
6fd0: 20 20 20 69 66 28 20 65 4f 70 20 26 20 28 57 4f     if( eOp & (WO
6fe0: 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 7b 0a 20 20  _LT|WO_LE) ){.  
6ff0: 20 20 20 20 65 4f 70 20 3d 20 57 4f 5f 4c 45 3b      eOp = WO_LE;
7000: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7010: 20 20 61 73 73 65 72 74 28 20 65 4f 70 20 26 20    assert( eOp & 
7020: 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29 3b  (WO_GT|WO_GE) );
7030: 0a 20 20 20 20 20 20 65 4f 70 20 3d 20 57 4f 5f  .      eOp = WO_
7040: 47 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  GE;.    }.  }.  
7050: 64 62 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f  db = pWC->pWInfo
7060: 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  ->pParse->db;.  
7070: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
7080: 70 72 44 75 70 28 64 62 2c 20 70 4f 6e 65 2d 3e  prDup(db, pOne->
7090: 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28  pExpr, 0);.  if(
70a0: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
70b0: 6e 3b 0a 20 20 66 6f 72 28 6f 70 3d 54 4b 5f 45  n;.  for(op=TK_E
70c0: 51 3b 20 65 4f 70 21 3d 28 57 4f 5f 45 51 3c 3c  Q; eOp!=(WO_EQ<<
70d0: 28 6f 70 2d 54 4b 5f 45 51 29 29 3b 20 6f 70 2b  (op-TK_EQ)); op+
70e0: 2b 29 7b 20 61 73 73 65 72 74 28 20 6f 70 3c 54  +){ assert( op<T
70f0: 4b 5f 47 45 20 29 3b 20 7d 0a 20 20 70 4e 65 77  K_GE ); }.  pNew
7100: 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 69 64 78  ->op = op;.  idx
7110: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
7120: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
7130: 77 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  w, TERM_VIRTUAL|
7140: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
7150: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
7160: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b  c, pWC, idxNew);
7170: 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
7180: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f  (SQLITE_OMIT_OR_
7190: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26  OPTIMIZATION) &&
71a0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
71b0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
71c0: 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 20  /*.** Analyze a 
71d0: 74 65 72 6d 20 74 68 61 74 20 63 6f 6e 73 69 73  term that consis
71e0: 74 73 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ts of two or mor
71f0: 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 0a 2a  e OR-connected.*
7200: 2a 20 73 75 62 74 65 72 6d 73 2e 20 20 53 6f 20  * subterms.  So 
7210: 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e  in:.**.**     ..
7220: 2e 20 57 48 45 52 45 20 20 28 61 3d 35 29 20 41  . WHERE  (a=5) A
7230: 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d 39 20 4f  ND (b=7 OR c=9 O
7240: 52 20 64 3d 31 33 29 20 41 4e 44 20 28 64 3d 31  R d=13) AND (d=1
7250: 33 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  3).**           
7260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5e                 ^
7270: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e  ^^^^^^^^^^^^^^^^
7280: 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ^^^.**.** This r
7290: 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20  outine analyzes 
72a0: 74 65 72 6d 73 20 73 75 63 68 20 61 73 20 74 68  terms such as th
72b0: 65 20 6d 69 64 64 6c 65 20 74 65 72 6d 20 69 6e  e middle term in
72c0: 20 74 68 65 20 61 62 6f 76 65 20 65 78 61 6d 70   the above examp
72d0: 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72 65 4f 72  le..** A WhereOr
72e0: 54 65 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63  Term object is c
72f0: 6f 6d 70 75 74 65 64 20 61 6e 64 20 61 74 74 61  omputed and atta
7300: 63 68 65 64 20 74 6f 20 74 68 65 20 74 65 72 6d  ched to the term
7310: 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61 6c 79 73   under.** analys
7320: 69 73 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  is, regardless o
7330: 66 20 74 68 65 20 6f 75 74 63 6f 6d 65 20 6f 66  f the outcome of
7340: 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e 20 20   the analysis.  
7350: 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  Hence:.**.**    
7360: 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61   WhereTerm.wtFla
7370: 67 73 20 20 20 7c 3d 20 20 54 45 52 4d 5f 4f 52  gs   |=  TERM_OR
7380: 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57 68 65 72  INFO.**     Wher
7390: 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20  eTerm.u.pOrInfo 
73a0: 20 3d 20 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   =  a dynamicall
73b0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72  y allocated Wher
73c0: 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a  eOrTerm object.*
73d0: 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 62 65  *.** The term be
73e0: 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 6d 75 73  ing analyzed mus
73f0: 74 20 68 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f  t have two or mo
7400: 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e 65 63 74  re of OR-connect
7410: 65 64 20 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20  ed subterms..** 
7420: 41 20 73 69 6e 67 6c 65 20 73 75 62 74 65 72 6d  A single subterm
7430: 20 6d 69 67 68 74 20 62 65 20 61 20 73 65 74 20   might be a set 
7440: 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64  of AND-connected
7450: 20 73 75 62 2d 73 75 62 74 65 72 6d 73 2e 0a 2a   sub-subterms..*
7460: 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 74 65  * Examples of te
7470: 72 6d 73 20 75 6e 64 65 72 20 61 6e 61 6c 79 73  rms under analys
7480: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 41  is:.**.**     (A
7490: 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20  )     t1.x=t2.y 
74a0: 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20 4f 52 20  OR t1.x=t2.z OR 
74b0: 74 31 2e 79 3d 31 35 20 4f 52 20 74 31 2e 7a 3d  t1.y=15 OR t1.z=
74c0: 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20 20 28 42  t3.a+5.**     (B
74d0: 29 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52  )     x=expr1 OR
74e0: 20 65 78 70 72 32 3d 78 20 4f 52 20 78 3d 65 78   expr2=x OR x=ex
74f0: 70 72 33 0a 2a 2a 20 20 20 20 20 28 43 29 20 20  pr3.**     (C)  
7500: 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20     t1.x=t2.y OR 
7510: 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e 44 20 74  (t1.x=t2.z AND t
7520: 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20 20 20 28  1.y=15).**     (
7530: 44 29 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f  D)     x=expr1 O
7540: 52 20 28 79 3e 31 31 20 41 4e 44 20 79 3c 32 32  R (y>11 AND y<22
7550: 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27 2a 68 65   AND z LIKE '*he
7560: 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20 20 28 45  llo*').**     (E
7570: 29 20 20 20 20 20 28 70 2e 61 3d 31 20 41 4e 44  )     (p.a=1 AND
7580: 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e 63 3d 33   q.b=2 AND r.c=3
7590: 29 20 4f 52 20 28 70 2e 78 3d 34 20 41 4e 44 20  ) OR (p.x=4 AND 
75a0: 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a 3d 36 29  q.y=5 AND r.z=6)
75b0: 0a 2a 2a 20 20 20 20 20 28 46 29 20 20 20 20 20  .**     (F)     
75c0: 78 3e 41 20 4f 52 20 28 78 3d 41 20 41 4e 44 20  x>A OR (x=A AND 
75d0: 79 3e 3d 42 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45  y>=B).**.** CASE
75e0: 20 31 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c   1:.**.** If all
75f0: 20 73 75 62 74 65 72 6d 73 20 61 72 65 20 6f 66   subterms are of
7600: 20 74 68 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78   the form T.C=ex
7610: 70 72 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67  pr for some sing
7620: 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 43 20 61  le column of C a
7630: 6e 64 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74  nd.** a single t
7640: 61 62 6c 65 20 54 20 28 61 73 20 73 68 6f 77 6e  able T (as shown
7650: 20 69 6e 20 65 78 61 6d 70 6c 65 20 42 20 61 62   in example B ab
7660: 6f 76 65 29 20 74 68 65 6e 20 63 72 65 61 74 65  ove) then create
7670: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a   a new virtual.*
7680: 2a 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 61  * term that is a
7690: 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 49 4e 20  n equivalent IN 
76a0: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20  expression.  In 
76b0: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
76c0: 74 68 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e  the term.** bein
76d0: 67 20 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a  g analyzed is:.*
76e0: 2a 0a 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78  *.**      x = ex
76f0: 70 72 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d  pr1  OR  expr2 =
7700: 20 78 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72   x  OR  x = expr
7710: 33 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65  3.**.** then cre
7720: 61 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61  ate a new virtua
7730: 6c 20 74 65 72 6d 20 6c 69 6b 65 20 74 68 69 73  l term like this
7740: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49  :.**.**      x I
7750: 4e 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65  N (expr1,expr2,e
7760: 78 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45  xpr3).**.** CASE
7770: 20 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65   2:.**.** If the
7780: 72 65 20 61 72 65 20 65 78 61 63 74 6c 79 20 74  re are exactly t
7790: 77 6f 20 64 69 73 6a 75 6e 63 74 73 20 61 6e 64  wo disjuncts and
77a0: 20 6f 6e 65 20 73 69 64 65 20 68 61 73 20 78 3e   one side has x>
77b0: 41 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20  A and the other 
77c0: 73 69 64 65 0a 2a 2a 20 68 61 73 20 78 3d 41 20  side.** has x=A 
77d0: 28 66 6f 72 20 74 68 65 20 73 61 6d 65 20 78 20  (for the same x 
77e0: 61 6e 64 20 41 29 20 74 68 65 6e 20 61 64 64 20  and A) then add 
77f0: 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 63 6f  a new virtual co
7800: 6e 6a 75 6e 63 74 20 74 65 72 6d 20 74 6f 20 74  njunct term to t
7810: 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75  he.** WHERE clau
7820: 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  se of the form "
7830: 78 3e 3d 41 22 2e 20 20 45 78 61 6d 70 6c 65 3a  x>=A".  Example:
7840: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 3e 41 20  .**.**      x>A 
7850: 4f 52 20 28 78 3d 41 20 41 4e 44 20 79 3e 42 29  OR (x=A AND y>B)
7860: 20 20 20 20 61 64 64 73 3a 20 20 20 20 78 3e 3d      adds:    x>=
7870: 41 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 64 64 65  A.**.** The adde
7880: 64 20 63 6f 6e 6a 75 6e 63 74 20 63 61 6e 20 73  d conjunct can s
7890: 6f 6d 65 74 69 6d 65 73 20 62 65 20 68 65 6c 70  ometimes be help
78a0: 66 75 6c 20 69 6e 20 71 75 65 72 79 20 70 6c 61  ful in query pla
78b0: 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 43 41 53  nning..**.** CAS
78c0: 45 20 33 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c  E 3:.**.** If al
78d0: 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65 20 69  l subterms are i
78e0: 6e 64 65 78 61 62 6c 65 20 62 79 20 61 20 73 69  ndexable by a si
78f0: 6e 67 6c 65 20 74 61 62 6c 65 20 54 2c 20 74 68  ngle table T, th
7900: 65 6e 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20  en set.**.**    
7910: 20 57 68 65 72 65 54 65 72 6d 2e 65 4f 70 65 72   WhereTerm.eOper
7920: 61 74 6f 72 20 20 20 20 20 20 20 20 20 20 20 20  ator            
7930: 20 20 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20    =  WO_OR.**   
7940: 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f    WhereTerm.u.pO
7950: 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65  rInfo->indexable
7960: 20 20 7c 3d 20 20 74 68 65 20 63 75 72 73 6f 72    |=  the cursor
7970: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c   number for tabl
7980: 65 20 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74  e T.**.** A subt
7990: 65 72 6d 20 69 73 20 22 69 6e 64 65 78 61 62 6c  erm is "indexabl
79a0: 65 22 20 69 66 20 69 74 20 69 73 20 6f 66 20 74  e" if it is of t
79b0: 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20  he form.** "T.C 
79c0: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65  <op> <expr>" whe
79d0: 72 65 20 43 20 69 73 20 61 6e 79 20 63 6f 6c 75  re C is any colu
79e0: 6d 6e 20 6f 66 20 74 61 62 6c 65 20 54 20 61 6e  mn of table T an
79f0: 64 20 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e  d .** <op> is on
7a00: 65 20 6f 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22  e of "=", "<", "
7a10: 3c 3d 22 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20  <=", ">", ">=", 
7a20: 22 49 53 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49  "IS NULL", or "I
7a30: 4e 22 2e 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d  N"..** A subterm
7a40: 20 69 73 20 61 6c 73 6f 20 69 6e 64 65 78 61 62   is also indexab
7a50: 6c 65 20 69 66 20 69 74 20 69 73 20 61 6e 20 41  le if it is an A
7a60: 4e 44 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ND of two or mor
7a70: 65 0a 2a 2a 20 73 75 62 73 75 62 74 65 72 6d 73  e.** subsubterms
7a80: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66   at least one of
7a90: 20 77 68 69 63 68 20 69 73 20 69 6e 64 65 78 61   which is indexa
7aa0: 62 6c 65 2e 20 20 49 6e 64 65 78 61 62 6c 65 20  ble.  Indexable 
7ab0: 41 4e 44 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73  AND .** subterms
7ac0: 20 68 61 76 65 20 74 68 65 69 72 20 65 4f 70 65   have their eOpe
7ad0: 72 61 74 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f  rator set to WO_
7ae0: 41 4e 44 20 61 6e 64 20 74 68 65 79 20 68 61 76  AND and they hav
7af0: 65 0a 2a 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20  e.** u.pAndInfo 
7b00: 73 65 74 20 74 6f 20 61 20 64 79 6e 61 6d 69 63  set to a dynamic
7b10: 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57  ally allocated W
7b20: 68 65 72 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65  hereAndTerm obje
7b30: 63 74 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61  ct..**.** From a
7b40: 6e 6f 74 68 65 72 20 70 6f 69 6e 74 20 6f 66 20  nother point of 
7b50: 76 69 65 77 2c 20 22 69 6e 64 65 78 61 62 6c 65  view, "indexable
7b60: 22 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  " means that the
7b70: 20 73 75 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a   subterm could.*
7b80: 2a 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65  * potentially be
7b90: 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e   used with an in
7ba0: 64 65 78 20 69 66 20 61 6e 20 61 70 70 72 6f 70  dex if an approp
7bb0: 72 69 61 74 65 20 69 6e 64 65 78 20 65 78 69 73  riate index exis
7bc0: 74 73 2e 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c  ts..** This anal
7bd0: 79 73 69 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f  ysis does not co
7be0: 6e 73 69 64 65 72 20 77 68 65 74 68 65 72 20 6f  nsider whether o
7bf0: 72 20 6e 6f 74 20 74 68 65 20 69 6e 64 65 78 20  r not the index 
7c00: 65 78 69 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20  exists; that.** 
7c10: 69 73 20 64 65 63 69 64 65 64 20 65 6c 73 65 77  is decided elsew
7c20: 68 65 72 65 2e 20 20 54 68 69 73 20 61 6e 61 6c  here.  This anal
7c30: 79 73 69 73 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20  ysis only looks 
7c40: 61 74 20 77 68 65 74 68 65 72 20 73 75 62 74 65  at whether subte
7c50: 72 6d 73 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61  rms.** appropria
7c60: 74 65 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20  te for indexing 
7c70: 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  exist..**.** All
7c80: 20 65 78 61 6d 70 6c 65 73 20 41 20 74 68 72 6f   examples A thro
7c90: 75 67 68 20 45 20 61 62 6f 76 65 20 73 61 74 69  ugh E above sati
7ca0: 73 66 79 20 63 61 73 65 20 33 2e 20 20 42 75 74  sfy case 3.  But
7cb0: 20 69 66 20 61 20 74 65 72 6d 0a 2a 2a 20 61 6c   if a term.** al
7cc0: 73 6f 20 73 61 74 69 73 66 69 65 73 20 63 61 73  so satisfies cas
7cd0: 65 20 31 20 28 73 75 63 68 20 61 73 20 42 29 20  e 1 (such as B) 
7ce0: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
7cf0: 20 6f 70 74 69 6d 69 7a 65 72 20 77 69 6c 6c 0a   optimizer will.
7d00: 2a 2a 20 61 6c 77 61 79 73 20 70 72 65 66 65 72  ** always prefer
7d10: 20 63 61 73 65 20 31 2c 20 73 6f 20 69 6e 20 74   case 1, so in t
7d20: 68 61 74 20 63 61 73 65 20 77 65 20 70 72 65 74  hat case we pret
7d30: 65 6e 64 20 74 68 61 74 20 63 61 73 65 20 33 20  end that case 3 
7d40: 69 73 20 6e 6f 74 0a 2a 2a 20 73 61 74 69 73 66  is not.** satisf
7d50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69  ied..**.** It mi
7d60: 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20  ght be the case 
7d70: 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20 74 61  that multiple ta
7d80: 62 6c 65 73 20 61 72 65 20 69 6e 64 65 78 61 62  bles are indexab
7d90: 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  le.  For example
7da0: 2c 0a 2a 2a 20 28 45 29 20 61 62 6f 76 65 20 69  ,.** (E) above i
7db0: 73 20 69 6e 64 65 78 61 62 6c 65 20 6f 6e 20 74  s indexable on t
7dc0: 61 62 6c 65 73 20 50 2c 20 51 2c 20 61 6e 64 20  ables P, Q, and 
7dd0: 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 74  R..**.** Terms t
7de0: 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73 65  hat satisfy case
7df0: 20 33 20 61 72 65 20 63 61 6e 64 69 64 61 74 65   3 are candidate
7e00: 73 20 66 6f 72 20 6c 6f 6f 6b 75 70 20 62 79 20  s for lookup by 
7e10: 75 73 69 6e 67 0a 2a 2a 20 73 65 70 61 72 61 74  using.** separat
7e20: 65 20 69 6e 64 69 63 65 73 20 74 6f 20 66 69 6e  e indices to fin
7e30: 64 20 72 6f 77 69 64 73 20 66 6f 72 20 65 61 63  d rowids for eac
7e40: 68 20 73 75 62 74 65 72 6d 20 61 6e 64 20 63 6f  h subterm and co
7e50: 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 75  mposing.** the u
7e60: 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f 77 69  nion of all rowi
7e70: 64 73 20 75 73 69 6e 67 20 61 20 52 6f 77 53 65  ds using a RowSe
7e80: 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20  t object.  This 
7e90: 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f  is similar.** to
7ea0: 20 22 62 69 74 6d 61 70 20 69 6e 64 69 63 65 73   "bitmap indices
7eb0: 22 20 69 6e 20 6f 74 68 65 72 20 64 61 74 61 62  " in other datab
7ec0: 61 73 65 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a 0a  ase engines..**.
7ed0: 2a 2a 20 4f 54 48 45 52 57 49 53 45 3a 0a 2a 2a  ** OTHERWISE:.**
7ee0: 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 63  .** If none of c
7ef0: 61 73 65 73 20 31 2c 20 32 2c 20 6f 72 20 33 20  ases 1, 2, or 3 
7f00: 61 70 70 6c 79 2c 20 74 68 65 6e 20 6c 65 61 76  apply, then leav
7f10: 65 20 74 68 65 20 65 4f 70 65 72 61 74 6f 72 20  e the eOperator 
7f20: 73 65 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 20  set to.** zero. 
7f30: 20 54 68 69 73 20 74 65 72 6d 20 69 73 20 6e 6f   This term is no
7f40: 74 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 61  t useful for sea
7f50: 72 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rch..*/.static v
7f60: 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f  oid exprAnalyzeO
7f70: 72 54 65 72 6d 28 0a 20 20 53 72 63 4c 69 73 74  rTerm(.  SrcList
7f80: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20   *pSrc,         
7f90: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
7fa0: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
7fb0: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
7fc0: 20 20 20 20 20 2f 2a 20 74 68 65 20 63 6f 6d 70       /* the comp
7fd0: 6c 65 74 65 20 57 48 45 52 45 20 63 6c 61 75 73  lete WHERE claus
7fe0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65  e */.  int idxTe
7ff0: 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rm              
8000: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
8010: 20 4f 52 2d 74 65 72 6d 20 74 6f 20 62 65 20 61   OR-term to be a
8020: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20  nalyzed */.){.  
8030: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
8040: 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b  o = pWC->pWInfo;
8050: 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45          /* WHERE
8060: 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
8070: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
8080: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
8090: 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20  pWInfo->pParse; 
80a0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
80b0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  r context */.  s
80c0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
80d0: 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20  rse->db;        
80e0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
80f0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
8100: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
8110: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
8120: 78 54 65 72 6d 5d 3b 20 20 20 20 2f 2a 20 54 68  xTerm];    /* Th
8130: 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61  e term to be ana
8140: 6c 79 7a 65 64 20 2a 2f 0a 20 20 45 78 70 72 20  lyzed */.  Expr 
8150: 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
8160: 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  pExpr;          
8170: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
8180: 73 69 6f 6e 20 6f 66 20 74 68 65 20 74 65 72 6d  sion of the term
8190: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
81a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
81c0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
81d0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
81e0: 2a 70 4f 72 57 63 3b 20 20 20 20 20 20 20 2f 2a  *pOrWc;       /*
81f0: 20 42 72 65 61 6b 75 70 20 6f 66 20 70 54 65 72   Breakup of pTer
8200: 6d 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20  m into subterms 
8210: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
8220: 70 4f 72 54 65 72 6d 3b 20 20 20 20 20 20 20 2f  pOrTerm;       /
8230: 2a 20 41 20 53 75 62 2d 74 65 72 6d 20 77 69 74  * A Sub-term wit
8240: 68 69 6e 20 74 68 65 20 70 4f 72 57 63 20 2a 2f  hin the pOrWc */
8250: 0a 20 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a  .  WhereOrInfo *
8260: 70 4f 72 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20  pOrInfo;     /* 
8270: 41 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  Additional infor
8280: 6d 61 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65  mation associate
8290: 64 20 77 69 74 68 20 70 54 65 72 6d 20 2a 2f 0a  d with pTerm */.
82a0: 20 20 42 69 74 6d 61 73 6b 20 63 68 6e 67 54 6f    Bitmask chngTo
82b0: 49 4e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  IN;         /* T
82c0: 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74  ables that might
82d0: 20 73 61 74 69 73 66 79 20 63 61 73 65 20 31 20   satisfy case 1 
82e0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64  */.  Bitmask ind
82f0: 65 78 61 62 6c 65 3b 20 20 20 20 20 20 20 20 2f  exable;        /
8300: 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20 61 72  * Tables that ar
8310: 65 20 69 6e 64 65 78 61 62 6c 65 2c 20 73 61 74  e indexable, sat
8320: 69 73 66 79 69 6e 67 20 63 61 73 65 20 32 20 2a  isfying case 2 *
8330: 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 72 65  /..  /*.  ** Bre
8340: 61 6b 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  ak the OR clause
8350: 20 69 6e 74 6f 20 69 74 73 20 73 65 70 61 72 61   into its separa
8360: 74 65 20 73 75 62 74 65 72 6d 73 2e 20 20 54 68  te subterms.  Th
8370: 65 20 73 75 62 74 65 72 6d 73 20 61 72 65 0a 20  e subterms are. 
8380: 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 20   ** stored in a 
8390: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
83a0: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67  cture containing
83b0: 20 77 69 74 68 69 6e 20 74 68 65 20 57 68 65 72   within the Wher
83c0: 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f 62 6a  eOrInfo.  ** obj
83d0: 65 63 74 20 74 68 61 74 20 69 73 20 61 74 74 61  ect that is atta
83e0: 63 68 65 64 20 74 6f 20 74 68 65 20 6f 72 69 67  ched to the orig
83f0: 69 6e 61 6c 20 4f 52 20 63 6c 61 75 73 65 20 74  inal OR clause t
8400: 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  erm..  */.  asse
8410: 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  rt( (pTerm->wtFl
8420: 61 67 73 20 26 20 28 54 45 52 4d 5f 44 59 4e 41  ags & (TERM_DYNA
8430: 4d 49 43 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 7c  MIC|TERM_ORINFO|
8440: 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 29 29 3d 3d  TERM_ANDINFO))==
8450: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
8460: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20  Expr->op==TK_OR 
8470: 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f  );.  pTerm->u.pO
8480: 72 49 6e 66 6f 20 3d 20 70 4f 72 49 6e 66 6f 20  rInfo = pOrInfo 
8490: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
84a0: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
84b0: 28 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a 20 20 69  (*pOrInfo));.  i
84c0: 66 28 20 70 4f 72 49 6e 66 6f 3d 3d 30 20 29 20  f( pOrInfo==0 ) 
84d0: 72 65 74 75 72 6e 3b 0a 20 20 70 54 65 72 6d 2d  return;.  pTerm-
84e0: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
84f0: 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f 72 57 63  _ORINFO;.  pOrWc
8500: 20 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b   = &pOrInfo->wc;
8510: 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  .  whereClauseIn
8520: 69 74 28 70 4f 72 57 63 2c 20 70 57 49 6e 66 6f  it(pOrWc, pWInfo
8530: 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28  );.  whereSplit(
8540: 70 4f 72 57 63 2c 20 70 45 78 70 72 2c 20 54 4b  pOrWc, pExpr, TK
8550: 5f 4f 52 29 3b 0a 20 20 65 78 70 72 41 6e 61 6c  _OR);.  exprAnal
8560: 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 4f 72  yzeAll(pSrc, pOr
8570: 57 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  Wc);.  if( db->m
8580: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
8590: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
85a0: 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d 32 20  pOrWc->nTerm>=2 
85b0: 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6f  );..  /*.  ** Co
85c0: 6d 70 75 74 65 20 74 68 65 20 73 65 74 20 6f 66  mpute the set of
85d0: 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67   tables that mig
85e0: 68 74 20 73 61 74 69 73 66 79 20 63 61 73 65 73  ht satisfy cases
85f0: 20 31 20 6f 72 20 33 2e 0a 20 20 2a 2f 0a 20 20   1 or 3..  */.  
8600: 69 6e 64 65 78 61 62 6c 65 20 3d 20 7e 28 42 69  indexable = ~(Bi
8610: 74 6d 61 73 6b 29 30 3b 0a 20 20 63 68 6e 67 54  tmask)0;.  chngT
8620: 6f 49 4e 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29  oIN = ~(Bitmask)
8630: 30 3b 0a 20 20 66 6f 72 28 69 3d 70 4f 72 57 63  0;.  for(i=pOrWc
8640: 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65  ->nTerm-1, pOrTe
8650: 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d  rm=pOrWc->a; i>=
8660: 30 20 26 26 20 69 6e 64 65 78 61 62 6c 65 3b 20  0 && indexable; 
8670: 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  i--, pOrTerm++){
8680: 0a 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72  .    if( (pOrTer
8690: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
86a0: 4f 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a  O_SINGLE)==0 ){.
86b0: 20 20 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e        WhereAndIn
86c0: 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20 20  fo *pAndInfo;.  
86d0: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4f 72      assert( (pOr
86e0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
86f0: 28 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c 54 45  (TERM_ANDINFO|TE
8700: 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30 20 29  RM_ORINFO))==0 )
8710: 3b 0a 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e  ;.      chngToIN
8720: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 41 6e 64   = 0;.      pAnd
8730: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
8740: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
8750: 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f 29 29  zeof(*pAndInfo))
8760: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e 64  ;.      if( pAnd
8770: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
8780: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 41 6e  WhereClause *pAn
8790: 64 57 43 3b 0a 20 20 20 20 20 20 20 20 57 68 65  dWC;.        Whe
87a0: 72 65 54 65 72 6d 20 2a 70 41 6e 64 54 65 72 6d  reTerm *pAndTerm
87b0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b  ;.        int j;
87c0: 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
87d0: 20 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   b = 0;.        
87e0: 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49  pOrTerm->u.pAndI
87f0: 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f 3b 0a  nfo = pAndInfo;.
8800: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
8810: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
8820: 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20 20 20  _ANDINFO;.      
8830: 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72    pOrTerm->eOper
8840: 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b 0a 20  ator = WO_AND;. 
8850: 20 20 20 20 20 20 20 70 41 6e 64 57 43 20 3d 20         pAndWC = 
8860: 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20  &pAndInfo->wc;. 
8870: 20 20 20 20 20 20 20 77 68 65 72 65 43 6c 61 75         whereClau
8880: 73 65 49 6e 69 74 28 70 41 6e 64 57 43 2c 20 70  seInit(pAndWC, p
8890: 57 43 2d 3e 70 57 49 6e 66 6f 29 3b 0a 20 20 20  WC->pWInfo);.   
88a0: 20 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28       whereSplit(
88b0: 70 41 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d 2d  pAndWC, pOrTerm-
88c0: 3e 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29 3b  >pExpr, TK_AND);
88d0: 0a 20 20 20 20 20 20 20 20 65 78 70 72 41 6e 61  .        exprAna
88e0: 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 41  lyzeAll(pSrc, pA
88f0: 6e 64 57 43 29 3b 0a 20 20 20 20 20 20 20 20 70  ndWC);.        p
8900: 41 6e 64 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20  AndWC->pOuter = 
8910: 70 57 43 3b 0a 20 20 20 20 20 20 20 20 74 65 73  pWC;.        tes
8920: 74 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f  tcase( db->mallo
8930: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
8940: 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c     if( !db->mall
8950: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
8960: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
8970: 41 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e  AndTerm=pAndWC->
8980: 61 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65  a; j<pAndWC->nTe
8990: 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72  rm; j++, pAndTer
89a0: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
89b0: 20 20 61 73 73 65 72 74 28 20 70 41 6e 64 54 65    assert( pAndTe
89c0: 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20  rm->pExpr );.   
89d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 61 6c 6c           if( all
89e0: 6f 77 65 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d  owedOp(pAndTerm-
89f0: 3e 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20  >pExpr->op) ){. 
8a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 20 7c               b |
8a10: 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65  = sqlite3WhereGe
8a20: 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
8a30: 4d 61 73 6b 53 65 74 2c 20 70 41 6e 64 54 65 72  MaskSet, pAndTer
8a40: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a  m->leftCursor);.
8a50: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8a60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8a70: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 6e 64 65    }.        inde
8a80: 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20  xable &= b;.    
8a90: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
8aa0: 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61  ( pOrTerm->wtFla
8ab0: 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44  gs & TERM_COPIED
8ac0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 6b 69   ){.      /* Ski
8ad0: 70 20 74 68 69 73 20 74 65 72 6d 20 66 6f 72 20  p this term for 
8ae0: 6e 6f 77 2e 20 20 57 65 20 72 65 76 69 73 69 74  now.  We revisit
8af0: 20 69 74 20 77 68 65 6e 20 77 65 20 70 72 6f 63   it when we proc
8b00: 65 73 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ess the.      **
8b10: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 54   corresponding T
8b20: 45 52 4d 5f 56 49 52 54 55 41 4c 20 74 65 72 6d  ERM_VIRTUAL term
8b30: 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
8b40: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 3b 0a       Bitmask b;.
8b50: 20 20 20 20 20 20 62 20 3d 20 73 71 6c 69 74 65        b = sqlite
8b60: 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70  3WhereGetMask(&p
8b70: 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
8b80: 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
8b90: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28  rsor);.      if(
8ba0: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
8bb0: 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
8bc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72   ){.        Wher
8bd0: 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20  eTerm *pOther = 
8be0: 26 70 4f 72 57 63 2d 3e 61 5b 70 4f 72 54 65 72  &pOrWc->a[pOrTer
8bf0: 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20  m->iParent];.   
8c00: 20 20 20 20 20 62 20 7c 3d 20 73 71 6c 69 74 65       b |= sqlite
8c10: 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70  3WhereGetMask(&p
8c20: 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
8c30: 20 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72   pOther->leftCur
8c40: 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  sor);.      }.  
8c50: 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d      indexable &=
8c60: 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   b;.      if( (p
8c70: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
8c80: 72 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 7b  r & WO_EQ)==0 ){
8c90: 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49  .        chngToI
8ca0: 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  N = 0;.      }el
8cb0: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67  se{.        chng
8cc0: 54 6f 49 4e 20 26 3d 20 62 3b 0a 20 20 20 20 20  ToIN &= b;.     
8cd0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
8ce0: 2f 2a 0a 20 20 2a 2a 20 52 65 63 6f 72 64 20 74  /*.  ** Record t
8cf0: 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  he set of tables
8d00: 20 74 68 61 74 20 73 61 74 69 73 66 79 20 63 61   that satisfy ca
8d10: 73 65 20 33 2e 20 20 54 68 65 20 73 65 74 20 6d  se 3.  The set m
8d20: 69 67 68 74 20 62 65 0a 20 20 2a 2a 20 65 6d 70  ight be.  ** emp
8d30: 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 49 6e  ty..  */.  pOrIn
8d40: 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20  fo->indexable = 
8d50: 69 6e 64 65 78 61 62 6c 65 3b 0a 20 20 70 54 65  indexable;.  pTe
8d60: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
8d70: 69 6e 64 65 78 61 62 6c 65 3d 3d 30 20 3f 20 30  indexable==0 ? 0
8d80: 20 3a 20 57 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 20   : WO_OR;..  /* 
8d90: 46 6f 72 20 61 20 74 77 6f 2d 77 61 79 20 4f 52  For a two-way OR
8da0: 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 69 6d 70  , attempt to imp
8db0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 63 61 73 65  lementation case
8dc0: 20 32 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69   2..  */.  if( i
8dd0: 6e 64 65 78 61 62 6c 65 20 26 26 20 70 4f 72 57  ndexable && pOrW
8de0: 63 2d 3e 6e 54 65 72 6d 3d 3d 32 20 29 7b 0a 20  c->nTerm==2 ){. 
8df0: 20 20 20 69 6e 74 20 69 4f 6e 65 20 3d 20 30 3b     int iOne = 0;
8e00: 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
8e10: 70 4f 6e 65 3b 0a 20 20 20 20 77 68 69 6c 65 28  pOne;.    while(
8e20: 20 28 70 4f 6e 65 20 3d 20 77 68 65 72 65 4e 74   (pOne = whereNt
8e30: 68 53 75 62 74 65 72 6d 28 26 70 4f 72 57 63 2d  hSubterm(&pOrWc-
8e40: 3e 61 5b 30 5d 2c 69 4f 6e 65 2b 2b 29 29 21 3d  >a[0],iOne++))!=
8e50: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
8e60: 54 77 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 57  Two = 0;.      W
8e70: 68 65 72 65 54 65 72 6d 20 2a 70 54 77 6f 3b 0a  hereTerm *pTwo;.
8e80: 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 70 54        while( (pT
8e90: 77 6f 20 3d 20 77 68 65 72 65 4e 74 68 53 75 62  wo = whereNthSub
8ea0: 74 65 72 6d 28 26 70 4f 72 57 63 2d 3e 61 5b 31  term(&pOrWc->a[1
8eb0: 5d 2c 69 54 77 6f 2b 2b 29 29 21 3d 30 20 29 7b  ],iTwo++))!=0 ){
8ec0: 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 43 6f  .        whereCo
8ed0: 6d 62 69 6e 65 44 69 73 6a 75 6e 63 74 73 28 70  mbineDisjuncts(p
8ee0: 53 72 63 2c 20 70 57 43 2c 20 70 4f 6e 65 2c 20  Src, pWC, pOne, 
8ef0: 70 54 77 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pTwo);.      }. 
8f00: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20     }.  }..  /*. 
8f10: 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 68 6f 6c   ** chngToIN hol
8f20: 64 73 20 61 20 73 65 74 20 6f 66 20 74 61 62 6c  ds a set of tabl
8f30: 65 73 20 74 68 61 74 20 2a 6d 69 67 68 74 2a 20  es that *might* 
8f40: 73 61 74 69 73 66 79 20 63 61 73 65 20 31 2e 20  satisfy case 1. 
8f50: 20 42 75 74 0a 20 20 2a 2a 20 77 65 20 68 61 76   But.  ** we hav
8f60: 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 61 64 64  e to do some add
8f70: 69 74 69 6f 6e 61 6c 20 63 68 65 63 6b 69 6e 67  itional checking
8f80: 20 74 6f 20 73 65 65 20 69 66 20 63 61 73 65 20   to see if case 
8f90: 31 20 72 65 61 6c 6c 79 0a 20 20 2a 2a 20 69 73  1 really.  ** is
8fa0: 20 73 61 74 69 73 66 69 65 64 2e 0a 20 20 2a 2a   satisfied..  **
8fb0: 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 77  .  ** chngToIN w
8fc0: 69 6c 6c 20 68 6f 6c 64 20 65 69 74 68 65 72 20  ill hold either 
8fd0: 30 2c 20 31 2c 20 6f 72 20 32 20 62 69 74 73 2e  0, 1, or 2 bits.
8fe0: 20 20 54 68 65 20 30 2d 62 69 74 20 63 61 73 65    The 0-bit case
8ff0: 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74   means.  ** that
9000: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 73   there is no pos
9010: 73 69 62 69 6c 69 74 79 20 6f 66 20 74 72 61 6e  sibility of tran
9020: 73 66 6f 72 6d 69 6e 67 20 74 68 65 20 4f 52 20  sforming the OR 
9030: 63 6c 61 75 73 65 20 69 6e 74 6f 20 61 6e 0a 20  clause into an. 
9040: 20 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   ** IN operator 
9050: 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 72 20 6d  because one or m
9060: 6f 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65  ore terms in the
9070: 20 4f 52 20 63 6c 61 75 73 65 20 63 6f 6e 74 61   OR clause conta
9080: 69 6e 0a 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e  in.  ** somethin
9090: 67 20 6f 74 68 65 72 20 74 68 61 6e 20 3d 3d 20  g other than == 
90a0: 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  on a column in t
90b0: 68 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e  he single table.
90c0: 20 20 54 68 65 20 31 2d 62 69 74 0a 20 20 2a 2a    The 1-bit.  **
90d0: 20 63 61 73 65 20 6d 65 61 6e 73 20 74 68 61 74   case means that
90e0: 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74   every term of t
90f0: 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69 73 20  he OR clause is 
9100: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 20 20 2a 2a  of the form.  **
9110: 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65   "table.column=e
9120: 78 70 72 22 20 66 6f 72 20 73 6f 6d 65 20 73 69  xpr" for some si
9130: 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65  ngle table.  The
9140: 20 6f 6e 65 20 62 69 74 20 74 68 61 74 20 69 73   one bit that is
9150: 20 73 65 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 63   set.  ** will c
9160: 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65  orrespond to the
9170: 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20 20   common table.  
9180: 57 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f  We still need to
9190: 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 0a 20   check to make. 
91a0: 20 2a 2a 20 73 75 72 65 20 74 68 65 20 73 61 6d   ** sure the sam
91b0: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64  e column is used
91c0: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 2e 20 20   on all terms.  
91d0: 54 68 65 20 32 2d 62 69 74 20 63 61 73 65 20 69  The 2-bit case i
91e0: 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  s when.  ** the 
91f0: 61 6c 6c 20 74 65 72 6d 73 20 61 72 65 20 6f 66  all terms are of
9200: 20 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65   the form "table
9210: 31 2e 63 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e  1.column=table2.
9220: 63 6f 6c 75 6d 6e 22 2e 20 20 49 74 0a 20 20 2a  column".  It.  *
9230: 2a 20 6d 69 67 68 74 20 62 65 20 70 6f 73 73 69  * might be possi
9240: 62 6c 65 20 74 6f 20 66 6f 72 6d 20 61 6e 20 49  ble to form an I
9250: 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
9260: 65 69 74 68 65 72 20 74 61 62 6c 65 31 2e 63 6f  either table1.co
9270: 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 72 20 74 61 62  lumn.  ** or tab
9280: 6c 65 32 2e 63 6f 6c 75 6d 6e 20 61 73 20 74 68  le2.column as th
9290: 65 20 4c 48 53 20 69 66 20 65 69 74 68 65 72 20  e LHS if either 
92a0: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65  is common to eve
92b0: 72 79 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20  ry term of.  ** 
92c0: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 2e 0a 20  the OR clause.. 
92d0: 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68   **.  ** Note th
92e0: 61 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  at terms of the 
92f0: 66 6f 72 6d 20 22 74 61 62 6c 65 2e 63 6f 6c 75  form "table.colu
9300: 6d 6e 31 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e  mn1=table.column
9310: 32 22 20 28 74 68 65 0a 20 20 2a 2a 20 73 61 6d  2" (the.  ** sam
9320: 65 20 74 61 62 6c 65 20 6f 6e 20 62 6f 74 68 20  e table on both 
9330: 73 69 7a 65 73 20 6f 66 20 74 68 65 20 3d 3d 29  sizes of the ==)
9340: 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d   cannot be optim
9350: 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ized..  */.  if(
9360: 20 63 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20   chngToIN ){.   
9370: 20 69 6e 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49   int okToChngToI
9380: 4e 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72  N = 0;     /* Tr
9390: 75 65 20 69 66 20 74 68 65 20 63 6f 6e 76 65 72  ue if the conver
93a0: 73 69 6f 6e 20 74 6f 20 49 4e 20 69 73 20 76 61  sion to IN is va
93b0: 6c 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  lid */.    int i
93c0: 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20 20  Column = -1;    
93d0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69       /* Column i
93e0: 6e 64 65 78 20 6f 6e 20 6c 68 73 20 6f 66 20 49  ndex on lhs of I
93f0: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
9400: 20 20 69 6e 74 20 69 43 75 72 73 6f 72 20 3d 20    int iCursor = 
9410: 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  -1;         /* T
9420: 61 62 6c 65 20 63 75 72 73 6f 72 20 63 6f 6d 6d  able cursor comm
9430: 6f 6e 20 74 6f 20 61 6c 6c 20 74 65 72 6d 73 20  on to all terms 
9440: 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 30  */.    int j = 0
9450: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9460: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
9470: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72   */..    /* Sear
9480: 63 68 20 66 6f 72 20 61 20 74 61 62 6c 65 20 61  ch for a table a
9490: 6e 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 61  nd column that a
94a0: 70 70 65 61 72 73 20 6f 6e 20 6f 6e 65 20 73 69  ppears on one si
94b0: 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  de or the.    **
94c0: 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 3d 3d   other of the ==
94d0: 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 65 76 65   operator in eve
94e0: 72 79 20 73 75 62 74 65 72 6d 2e 20 20 54 68 61  ry subterm.  Tha
94f0: 74 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  t table and colu
9500: 6d 6e 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  mn.    ** will b
9510: 65 20 72 65 63 6f 72 64 65 64 20 69 6e 20 69 43  e recorded in iC
9520: 75 72 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75 6d  ursor and iColum
9530: 6e 2e 20 20 54 68 65 72 65 20 6d 69 67 68 74 20  n.  There might 
9540: 6e 6f 74 20 62 65 20 61 6e 79 0a 20 20 20 20 2a  not be any.    *
9550: 2a 20 73 75 63 68 20 74 61 62 6c 65 20 61 6e 64  * such table and
9560: 20 63 6f 6c 75 6d 6e 2e 20 20 53 65 74 20 6f 6b   column.  Set ok
9570: 54 6f 43 68 6e 67 54 6f 49 4e 20 69 66 20 61 6e  ToChngToIN if an
9580: 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 61 62   appropriate tab
9590: 6c 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f  le.    ** and co
95a0: 6c 75 6d 6e 20 69 73 20 66 6f 75 6e 64 20 62 75  lumn is found bu
95b0: 74 20 6c 65 61 76 65 20 6f 6b 54 6f 43 68 6e 67  t leave okToChng
95c0: 54 6f 49 4e 20 66 61 6c 73 65 20 69 66 20 6e 6f  ToIN false if no
95d0: 74 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a  t found..    */.
95e0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32      for(j=0; j<2
95f0: 20 26 26 20 21 6f 6b 54 6f 43 68 6e 67 54 6f 49   && !okToChngToI
9600: 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70  N; j++){.      p
9610: 4f 72 54 65 72 6d 20 3d 20 70 4f 72 57 63 2d 3e  OrTerm = pOrWc->
9620: 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  a;.      for(i=p
9630: 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69  OrWc->nTerm-1; i
9640: 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72  >=0; i--, pOrTer
9650: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  m++){.        as
9660: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65  sert( pOrTerm->e
9670: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
9680: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54   );.        pOrT
9690: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20  erm->wtFlags &= 
96a0: 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20  ~TERM_OR_OK;.   
96b0: 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d       if( pOrTerm
96c0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
96d0: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  ursor ){.       
96e0: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
96f0: 65 20 32 2d 62 69 74 20 63 61 73 65 20 61 6e 64  e 2-bit case and
9700: 20 77 65 20 61 72 65 20 6f 6e 20 74 68 65 20 73   we are on the s
9710: 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20  econd iteration 
9720: 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  and.          **
9730: 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73   current term is
9740: 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20   from the first 
9750: 69 74 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20 73  iteration.  So s
9760: 6b 69 70 20 74 68 69 73 20 74 65 72 6d 2e 20 2a  kip this term. *
9770: 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
9780: 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20  rt( j==1 );.    
9790: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
97a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
97b0: 20 20 69 66 28 20 28 63 68 6e 67 54 6f 49 4e 20    if( (chngToIN 
97c0: 26 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65  & sqlite3WhereGe
97d0: 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
97e0: 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d  MaskSet, pOrTerm
97f0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 29 3d 3d  ->leftCursor))==
9800: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
9810: 2a 20 54 68 69 73 20 74 65 72 6d 20 6d 75 73 74  * This term must
9820: 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   be of the form 
9830: 74 31 2e 61 3d 3d 74 32 2e 62 20 77 68 65 72 65  t1.a==t2.b where
9840: 20 74 32 20 69 73 20 69 6e 20 74 68 65 0a 20 20   t2 is in the.  
9850: 20 20 20 20 20 20 20 20 2a 2a 20 63 68 6e 67 54          ** chngT
9860: 6f 49 4e 20 73 65 74 20 62 75 74 20 74 31 20 69  oIN set but t1 i
9870: 73 20 6e 6f 74 2e 20 20 54 68 69 73 20 74 65 72  s not.  This ter
9880: 6d 20 77 69 6c 6c 20 62 65 20 65 69 74 68 65 72  m will be either
9890: 20 70 72 65 63 65 64 65 64 0a 20 20 20 20 20 20   preceded.      
98a0: 20 20 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77 65      ** or follwe
98b0: 64 20 62 79 20 61 6e 20 69 6e 76 65 72 74 65 64  d by an inverted
98c0: 20 63 6f 70 79 20 28 74 32 2e 62 3d 3d 74 31 2e   copy (t2.b==t1.
98d0: 61 29 2e 20 20 53 6b 69 70 20 74 68 69 73 20 74  a).  Skip this t
98e0: 65 72 6d 20 0a 20 20 20 20 20 20 20 20 20 20 2a  erm .          *
98f0: 2a 20 61 6e 64 20 75 73 65 20 69 74 73 20 69 6e  * and use its in
9900: 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  version. */.    
9910: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9920: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
9930: 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29   & TERM_COPIED )
9940: 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
9950: 63 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77  case( pOrTerm->w
9960: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
9970: 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 20  RTUAL );.       
9980: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
9990: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
99a0: 45 52 4d 5f 43 4f 50 49 45 44 7c 54 45 52 4d 5f  ERM_COPIED|TERM_
99b0: 56 49 52 54 55 41 4c 29 20 29 3b 0a 20 20 20 20  VIRTUAL) );.    
99c0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
99d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
99e0: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72 54    iColumn = pOrT
99f0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
9a00: 6e 3b 0a 20 20 20 20 20 20 20 20 69 43 75 72 73  n;.        iCurs
9a10: 6f 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c 65  or = pOrTerm->le
9a20: 66 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  ftCursor;.      
9a30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
9a40: 0a 20 20 20 20 20 20 69 66 28 20 69 3c 30 20 29  .      if( i<0 )
9a50: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20  {.        /* No 
9a60: 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65 2b  candidate table+
9a70: 63 6f 6c 75 6d 6e 20 77 61 73 20 66 6f 75 6e 64  column was found
9a80: 2e 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  .  This can only
9a90: 20 6f 63 63 75 72 0a 20 20 20 20 20 20 20 20 2a   occur.        *
9aa0: 2a 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  * on the second 
9ab0: 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  iteration */.   
9ac0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d       assert( j==
9ad0: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  1 );.        ass
9ae0: 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77  ert( IsPowerOfTw
9af0: 6f 28 63 68 6e 67 54 6f 49 4e 29 20 29 3b 0a 20  o(chngToIN) );. 
9b00: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63         assert( c
9b10: 68 6e 67 54 6f 49 4e 3d 3d 73 71 6c 69 74 65 33  hngToIN==sqlite3
9b20: 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57  WhereGetMask(&pW
9b30: 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
9b40: 69 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20  iCursor) );.    
9b50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9b60: 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   }.      testcas
9b70: 65 28 20 6a 3d 3d 31 20 29 3b 0a 0a 20 20 20 20  e( j==1 );..    
9b80: 20 20 2f 2a 20 57 65 20 68 61 76 65 20 66 6f 75    /* We have fou
9b90: 6e 64 20 61 20 63 61 6e 64 69 64 61 74 65 20 74  nd a candidate t
9ba0: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e  able and column.
9bb0: 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69    Check to see i
9bc0: 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  f that.      ** 
9bd0: 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e  table and column
9be0: 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76   is common to ev
9bf0: 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20  ery term in the 
9c00: 4f 52 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OR clause */.   
9c10: 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20     okToChngToIN 
9c20: 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b  = 1;.      for(;
9c30: 20 69 3e 3d 30 20 26 26 20 6f 6b 54 6f 43 68 6e   i>=0 && okToChn
9c40: 67 54 6f 49 4e 3b 20 69 2d 2d 2c 20 70 4f 72 54  gToIN; i--, pOrT
9c50: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
9c60: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
9c70: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
9c80: 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  EQ );.        if
9c90: 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
9ca0: 75 72 73 6f 72 21 3d 69 43 75 72 73 6f 72 20 29  ursor!=iCursor )
9cb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 54  {.          pOrT
9cc0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20  erm->wtFlags &= 
9cd0: 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20  ~TERM_OR_OK;.   
9ce0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
9cf0: 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  OrTerm->u.leftCo
9d00: 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 7b  lumn!=iColumn ){
9d10: 0a 20 20 20 20 20 20 20 20 20 20 6f 6b 54 6f 43  .          okToC
9d20: 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20  hngToIN = 0;.   
9d30: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9d40: 20 20 20 20 20 20 69 6e 74 20 61 66 66 4c 65 66        int affLef
9d50: 74 2c 20 61 66 66 52 69 67 68 74 3b 0a 20 20 20  t, affRight;.   
9d60: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
9d70: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
9d80: 20 69 73 20 61 6c 73 6f 20 61 20 63 6f 6c 75 6d   is also a colum
9d90: 6e 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69  n, then the affi
9da0: 6e 69 74 69 65 73 0a 20 20 20 20 20 20 20 20 20  nities.         
9db0: 20 2a 2a 20 6f 66 20 62 6f 74 68 20 72 69 67 68   ** of both righ
9dc0: 74 20 61 6e 64 20 6c 65 66 74 20 73 69 64 65 73  t and left sides
9dd0: 20 6d 75 73 74 20 62 65 20 73 75 63 68 20 74 68   must be such th
9de0: 61 74 20 6e 6f 20 74 79 70 65 0a 20 20 20 20 20  at no type.     
9df0: 20 20 20 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69       ** conversi
9e00: 6f 6e 73 20 61 72 65 20 72 65 71 75 69 72 65 64  ons are required
9e10: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 20   on the right.  
9e20: 28 54 69 63 6b 65 74 20 23 32 32 34 39 29 0a 20  (Ticket #2249). 
9e30: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
9e40: 20 20 20 20 20 20 61 66 66 52 69 67 68 74 20 3d        affRight =
9e50: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
9e60: 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45  nity(pOrTerm->pE
9e70: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
9e80: 20 20 20 20 20 20 20 20 61 66 66 4c 65 66 74 20          affLeft 
9e90: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
9ea0: 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70  inity(pOrTerm->p
9eb0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
9ec0: 20 20 20 20 20 20 20 20 69 66 28 20 61 66 66 52          if( affR
9ed0: 69 67 68 74 21 3d 30 20 26 26 20 61 66 66 52 69  ight!=0 && affRi
9ee0: 67 68 74 21 3d 61 66 66 4c 65 66 74 20 29 7b 0a  ght!=affLeft ){.
9ef0: 20 20 20 20 20 20 20 20 20 20 20 20 6f 6b 54 6f              okTo
9f00: 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20  ChngToIN = 0;.  
9f10: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
9f20: 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 54 65             pOrTe
9f30: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
9f40: 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20  ERM_OR_OK;.     
9f50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
9f60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
9f70: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
9f80: 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68 6e 67 54 6f  oint, okToChngTo
9f90: 49 4e 20 69 73 20 74 72 75 65 20 69 66 20 6f 72  IN is true if or
9fa0: 69 67 69 6e 61 6c 20 70 54 65 72 6d 20 73 61 74  iginal pTerm sat
9fb0: 69 73 66 69 65 73 0a 20 20 20 20 2a 2a 20 63 61  isfies.    ** ca
9fc0: 73 65 20 31 2e 20 20 49 6e 20 74 68 61 74 20 63  se 1.  In that c
9fd0: 61 73 65 2c 20 63 6f 6e 73 74 72 75 63 74 20 61  ase, construct a
9fe0: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72   new virtual ter
9ff0: 6d 20 74 68 61 74 20 69 73 20 0a 20 20 20 20 2a  m that is .    *
a000: 2a 20 70 54 65 72 6d 20 63 6f 6e 76 65 72 74 65  * pTerm converte
a010: 64 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f 70 65  d into an IN ope
a020: 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  rator..    */.  
a030: 20 20 69 66 28 20 6f 6b 54 6f 43 68 6e 67 54 6f    if( okToChngTo
a040: 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  IN ){.      Expr
a050: 20 2a 70 44 75 70 3b 20 20 20 20 20 20 20 20 20   *pDup;         
a060: 20 20 20 2f 2a 20 41 20 74 72 61 6e 73 69 65 6e     /* A transien
a070: 74 20 64 75 70 6c 69 63 61 74 65 20 65 78 70 72  t duplicate expr
a080: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
a090: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
a0a0: 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 52 48  = 0;   /* The RH
a0b0: 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
a0c0: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45 78  ator */.      Ex
a0d0: 70 72 20 2a 70 4c 65 66 74 20 3d 20 30 3b 20 20  pr *pLeft = 0;  
a0e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 48 53 20       /* The LHS 
a0f0: 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
a100: 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  or */.      Expr
a110: 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
a120: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65     /* The comple
a130: 74 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  te IN operator *
a140: 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  /..      for(i=p
a150: 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70  OrWc->nTerm-1, p
a160: 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b  OrTerm=pOrWc->a;
a170: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54   i>=0; i--, pOrT
a180: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
a190: 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74  if( (pOrTerm->wt
a1a0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f  Flags & TERM_OR_
a1b0: 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  OK)==0 ) continu
a1c0: 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e;.        asser
a1d0: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  t( pOrTerm->eOpe
a1e0: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b  rator & WO_EQ );
a1f0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a200: 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
a210: 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29 3b  rsor==iCursor );
a220: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a230: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   pOrTerm->u.left
a240: 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20  Column==iColumn 
a250: 29 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  );.        pDup 
a260: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
a270: 28 64 62 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45  (db, pOrTerm->pE
a280: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b  xpr->pRight, 0);
a290: 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d  .        pList =
a2a0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
a2b0: 41 70 70 65 6e 64 28 70 57 49 6e 66 6f 2d 3e 70  Append(pWInfo->p
a2c0: 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 44  Parse, pList, pD
a2d0: 75 70 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65  up);.        pLe
a2e0: 66 74 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45  ft = pOrTerm->pE
a2f0: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
a300: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
a310: 28 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20  ( pLeft!=0 );.  
a320: 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74      pDup = sqlit
a330: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c  e3ExprDup(db, pL
a340: 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  eft, 0);.      p
a350: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78  New = sqlite3PEx
a360: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e  pr(pParse, TK_IN
a370: 2c 20 70 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  , pDup, 0, 0);. 
a380: 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
a390: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78  .        int idx
a3a0: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 74 72 61  New;.        tra
a3b0: 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67  nsferJoinMarking
a3c0: 73 28 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a  s(pNew, pExpr);.
a3d0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a3e0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
a3f0: 28 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c  (pNew, EP_xIsSel
a400: 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ect) );.        
a410: 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20  pNew->x.pList = 
a420: 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69  pList;.        i
a430: 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61  dxNew = whereCla
a440: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
a450: 4e 65 77 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  New, TERM_VIRTUA
a460: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
a470: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
a480: 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a  e( idxNew==0 );.
a490: 20 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c          exprAnal
a4a0: 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69  yze(pSrc, pWC, i
a4b0: 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20  dxNew);.        
a4c0: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
a4d0: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
a4e0: 20 20 6d 61 72 6b 54 65 72 6d 41 73 43 68 69 6c    markTermAsChil
a4f0: 64 28 70 57 43 2c 20 69 64 78 4e 65 77 2c 20 69  d(pWC, idxNew, i
a500: 64 78 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d  dxTerm);.      }
a510: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
a520: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
a530: 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
a540: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
a550: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
a560: 20 57 4f 5f 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61   WO_NOOP;  /* ca
a570: 73 65 20 31 20 74 72 75 6d 70 73 20 63 61 73 65  se 1 trumps case
a580: 20 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a   3 */.    }.  }.
a590: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
a5a0: 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
a5b0: 4d 49 5a 41 54 49 4f 4e 20 26 26 20 21 53 51 4c  MIZATION && !SQL
a5c0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
a5d0: 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 61  Y */../*.** We a
a5e0: 6c 72 65 61 64 79 20 6b 6e 6f 77 20 74 68 61 74  lready know that
a5f0: 20 70 45 78 70 72 20 69 73 20 61 20 62 69 6e 61   pExpr is a bina
a600: 72 79 20 6f 70 65 72 61 74 6f 72 20 77 68 65 72  ry operator wher
a610: 65 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20  e both operands 
a620: 61 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 72 65  are.** column re
a630: 66 65 72 65 6e 63 65 73 2e 20 20 54 68 69 73 20  ferences.  This 
a640: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74  routine checks t
a650: 6f 20 73 65 65 20 69 66 20 70 45 78 70 72 20 69  o see if pExpr i
a660: 73 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 63 65  s an equivalence
a670: 0a 2a 2a 20 72 65 6c 61 74 69 6f 6e 3a 0a 2a 2a  .** relation:.**
a680: 20 20 20 31 2e 20 20 54 68 65 20 53 51 4c 49 54     1.  The SQLIT
a690: 45 5f 54 72 61 6e 73 69 74 69 76 65 20 6f 70 74  E_Transitive opt
a6a0: 69 6d 69 7a 61 74 69 6f 6e 20 6d 75 73 74 20 62  imization must b
a6b0: 65 20 65 6e 61 62 6c 65 64 0a 2a 2a 20 20 20 32  e enabled.**   2
a6c0: 2e 20 20 4d 75 73 74 20 62 65 20 65 69 74 68 65  .  Must be eithe
a6d0: 72 20 61 6e 20 3d 3d 20 6f 72 20 61 6e 20 49 53  r an == or an IS
a6e0: 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 20 20 33   operator.**   3
a6f0: 2e 20 20 4e 6f 74 20 6f 72 69 67 69 6e 61 74 69  .  Not originati
a700: 6e 67 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61  ng in the ON cla
a710: 75 73 65 20 6f 66 20 61 6e 20 4f 55 54 45 52 20  use of an OUTER 
a720: 4a 4f 49 4e 0a 2a 2a 20 20 20 34 2e 20 20 54 68  JOIN.**   4.  Th
a730: 65 20 61 66 66 69 6e 69 74 69 65 73 20 6f 66 20  e affinities of 
a740: 41 20 61 6e 64 20 42 20 6d 75 73 74 20 62 65 20  A and B must be 
a750: 63 6f 6d 70 61 74 69 62 6c 65 0a 2a 2a 20 20 20  compatible.**   
a760: 35 61 2e 20 42 6f 74 68 20 6f 70 65 72 61 6e 64  5a. Both operand
a770: 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 63  s use the same c
a780: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
a790: 65 20 4f 52 0a 2a 2a 20 20 20 35 62 2e 20 54 68  e OR.**   5b. Th
a7a0: 65 20 6f 76 65 72 61 6c 6c 20 63 6f 6c 6c 61 74  e overall collat
a7b0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
a7c0: 42 49 4e 41 52 59 0a 2a 2a 20 49 66 20 74 68 69  BINARY.** If thi
a7d0: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
a7e0: 73 20 54 52 55 45 2c 20 74 68 61 74 20 6d 65 61  s TRUE, that mea
a7f0: 6e 73 20 74 68 61 74 20 74 68 65 20 52 48 53 20  ns that the RHS 
a800: 63 61 6e 20 62 65 20 73 75 62 73 74 69 74 75 74  can be substitut
a810: 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 4c 48  ed.** for the LH
a820: 53 20 61 6e 79 70 6c 61 63 65 20 65 6c 73 65 20  S anyplace else 
a830: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
a840: 75 73 65 20 77 68 65 72 65 20 74 68 65 20 4c 48  use where the LH
a850: 53 20 63 6f 6c 75 6d 6e 20 6f 63 63 75 72 73 2e  S column occurs.
a860: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f  .** This is an o
a870: 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 4e 6f  ptimization.  No
a880: 20 68 61 72 6d 20 63 6f 6d 65 73 20 66 72 6f 6d   harm comes from
a890: 20 72 65 74 75 72 6e 69 6e 67 20 30 2e 20 20 42   returning 0.  B
a8a0: 75 74 20 69 66 20 31 20 69 73 0a 2a 2a 20 72 65  ut if 1 is.** re
a8b0: 74 75 72 6e 65 64 20 77 68 65 6e 20 69 74 20 73  turned when it s
a8c0: 68 6f 75 6c 64 20 6e 6f 74 20 62 65 2c 20 74 68  hould not be, th
a8d0: 65 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e 73  en incorrect ans
a8e0: 77 65 72 73 20 6d 69 67 68 74 20 72 65 73 75 6c  wers might resul
a8f0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
a900: 20 74 65 72 6d 49 73 45 71 75 69 76 61 6c 65 6e   termIsEquivalen
a910: 63 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ce(Parse *pParse
a920: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
a930: 20 20 63 68 61 72 20 61 66 66 31 2c 20 61 66 66    char aff1, aff
a940: 32 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  2;.  CollSeq *pC
a950: 6f 6c 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  oll;.  const cha
a960: 72 20 2a 7a 43 6f 6c 6c 31 2c 20 2a 7a 43 6f 6c  r *zColl1, *zCol
a970: 6c 32 3b 0a 20 20 69 66 28 20 21 4f 70 74 69 6d  l2;.  if( !Optim
a980: 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70  izationEnabled(p
a990: 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54  Parse->db, SQLIT
a9a0: 45 5f 54 72 61 6e 73 69 74 69 76 65 29 20 29 20  E_Transitive) ) 
a9b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
a9c0: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51  pExpr->op!=TK_EQ
a9d0: 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54   && pExpr->op!=T
a9e0: 4b 5f 49 53 20 29 20 72 65 74 75 72 6e 20 30 3b  K_IS ) return 0;
a9f0: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
aa00: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
aa10: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74  _FromJoin) ) ret
aa20: 75 72 6e 20 30 3b 0a 20 20 61 66 66 31 20 3d 20  urn 0;.  aff1 = 
aa30: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
aa40: 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ity(pExpr->pLeft
aa50: 29 3b 0a 20 20 61 66 66 32 20 3d 20 73 71 6c 69  );.  aff2 = sqli
aa60: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
aa70: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
aa80: 20 20 69 66 28 20 61 66 66 31 21 3d 61 66 66 32    if( aff1!=aff2
aa90: 0a 20 20 20 26 26 20 28 21 73 71 6c 69 74 65 33  .   && (!sqlite3
aaa0: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
aab0: 79 28 61 66 66 31 29 20 7c 7c 20 21 73 71 6c 69  y(aff1) || !sqli
aac0: 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69  te3IsNumericAffi
aad0: 6e 69 74 79 28 61 66 66 32 29 29 0a 20 20 29 7b  nity(aff2)).  ){
aae0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
aaf0: 20 7d 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c   }.  pColl = sql
ab00: 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
ab10: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
ab20: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
ab30: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
ab40: 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 7c 7c   if( pColl==0 ||
ab50: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
ab60: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 22 42  pColl->zName, "B
ab70: 49 4e 41 52 59 22 29 3d 3d 30 20 29 20 72 65 74  INARY")==0 ) ret
ab80: 75 72 6e 20 31 3b 0a 20 20 70 43 6f 6c 6c 20 3d  urn 1;.  pColl =
ab90: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
aba0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
abb0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 2f 2a 20  r->pLeft);.  /* 
abc0: 53 69 6e 63 65 20 70 4c 65 66 74 20 61 6e 64 20  Since pLeft and 
abd0: 70 52 69 67 68 74 20 61 72 65 20 62 6f 74 68 20  pRight are both 
abe0: 61 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e  a column referen
abf0: 63 65 73 2c 20 74 68 65 69 72 20 63 6f 6c 6c 61  ces, their colla
ac00: 74 69 6e 67 0a 20 20 2a 2a 20 73 65 71 75 65 6e  ting.  ** sequen
ac10: 63 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  ce should always
ac20: 20 62 65 20 64 65 66 69 6e 65 64 2e 20 2a 2f 0a   be defined. */.
ac30: 20 20 7a 43 6f 6c 6c 31 20 3d 20 41 4c 57 41 59    zColl1 = ALWAY
ac40: 53 28 70 43 6f 6c 6c 29 20 3f 20 70 43 6f 6c 6c  S(pColl) ? pColl
ac50: 2d 3e 7a 4e 61 6d 65 20 3a 20 30 3b 0a 20 20 70  ->zName : 0;.  p
ac60: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
ac70: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
ac80: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
ac90: 3b 0a 20 20 7a 43 6f 6c 6c 32 20 3d 20 41 4c 57  ;.  zColl2 = ALW
aca0: 41 59 53 28 70 43 6f 6c 6c 29 20 3f 20 70 43 6f  AYS(pColl) ? pCo
acb0: 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 30 3b 0a 20  ll->zName : 0;. 
acc0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53   return sqlite3S
acd0: 74 72 49 43 6d 70 28 7a 43 6f 6c 6c 31 2c 20 7a  trICmp(zColl1, z
ace0: 43 6f 6c 6c 32 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a  Coll2)==0;.}../*
acf0: 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 74 6f  .** The input to
ad00: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
ad10: 20 61 6e 20 57 68 65 72 65 54 65 72 6d 20 73 74   an WhereTerm st
ad20: 72 75 63 74 75 72 65 20 77 69 74 68 20 6f 6e 6c  ructure with onl
ad30: 79 20 74 68 65 0a 2a 2a 20 22 70 45 78 70 72 22  y the.** "pExpr"
ad40: 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e   field filled in
ad50: 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  .  The job of th
ad60: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f  is routine is to
ad70: 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20   analyze the.** 
ad80: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  subexpression an
ad90: 64 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74  d populate all t
ada0: 68 65 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  he other fields 
adb0: 6f 66 20 74 68 65 20 57 68 65 72 65 54 65 72 6d  of the WhereTerm
adc0: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  .** structure..*
add0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
ade0: 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
adf0: 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20 3c 6f   form "<expr> <o
ae00: 70 3e 20 58 22 20 69 74 20 67 65 74 73 20 63 6f  p> X" it gets co
ae10: 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65  mmuted.** to the
ae20: 20 73 74 61 6e 64 61 72 64 20 66 6f 72 6d 20 6f   standard form o
ae30: 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  f "X <op> <expr>
ae40: 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  "..**.** If the 
ae50: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66  expression is of
ae60: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
ae70: 3e 20 59 22 20 77 68 65 72 65 20 62 6f 74 68 20  > Y" where both 
ae80: 58 20 61 6e 64 20 59 20 61 72 65 0a 2a 2a 20 63  X and Y are.** c
ae90: 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 74 68 65  olumns, then the
aea0: 20 6f 72 69 67 69 6e 61 6c 20 65 78 70 72 65 73   original expres
aeb0: 73 69 6f 6e 20 69 73 20 75 6e 63 68 61 6e 67 65  sion is unchange
aec0: 64 20 61 6e 64 20 61 20 6e 65 77 20 76 69 72 74  d and a new virt
aed0: 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f 66 20 74  ual.** term of t
aee0: 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f 70 3e 20  he form "Y <op> 
aef0: 58 22 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  X" is added to t
af00: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
af10: 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20  and.** analyzed 
af20: 73 65 70 61 72 61 74 65 6c 79 2e 20 20 54 68 65  separately.  The
af30: 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20 69   original term i
af40: 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45  s marked with TE
af50: 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20 61 6e 64  RM_COPIED.** and
af60: 20 74 68 65 20 6e 65 77 20 74 65 72 6d 20 69 73   the new term is
af70: 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45 52   marked with TER
af80: 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65 63 61 75  M_DYNAMIC (becau
af90: 73 65 20 69 74 27 73 20 70 45 78 70 72 0a 2a 2a  se it's pExpr.**
afa0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65   needs to be fre
afb0: 65 64 20 77 69 74 68 20 74 68 65 20 57 68 65 72  ed with the Wher
afc0: 65 43 6c 61 75 73 65 29 20 61 6e 64 20 54 45 52  eClause) and TER
afd0: 4d 5f 56 49 52 54 55 41 4c 20 28 62 65 63 61 75  M_VIRTUAL (becau
afe0: 73 65 20 69 74 0a 2a 2a 20 69 73 20 61 20 63 6f  se it.** is a co
aff0: 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f 66 20 61  mmuted copy of a
b000: 20 70 72 69 6f 72 20 74 65 72 6d 2e 29 20 20 54   prior term.)  T
b010: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d  he original term
b020: 20 68 61 73 20 6e 43 68 69 6c 64 3d 31 0a 2a 2a   has nChild=1.**
b030: 20 61 6e 64 20 74 68 65 20 63 6f 70 79 20 68 61   and the copy ha
b040: 73 20 69 64 78 50 61 72 65 6e 74 20 73 65 74 20  s idxParent set 
b050: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
b060: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72  the original ter
b070: 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  m..*/.static voi
b080: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 0a 20  d exprAnalyze(. 
b090: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
b0a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68             /* th
b0b0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
b0c0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
b0d0: 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pWC,         /* 
b0e0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
b0f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72   */.  int idxTer
b100: 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
b110: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
b120: 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79  term to be analy
b130: 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  zed */.){.  Wher
b140: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
b150: 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20 2f 2a 20  pWC->pWInfo; /* 
b160: 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
b170: 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  cessing context 
b180: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
b190: 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
b1a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72        /* The ter
b1b0: 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  m to be analyzed
b1c0: 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53   */.  WhereMaskS
b1d0: 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20  et *pMaskSet;   
b1e0: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66         /* Set of
b1f0: 20 74 61 62 6c 65 20 69 6e 64 65 78 20 6d 61 73   table index mas
b200: 6b 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  ks */.  Expr *pE
b210: 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
b220: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
b230: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65  expression to be
b240: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42   analyzed */.  B
b250: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 4c 65 66  itmask prereqLef
b260: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
b270: 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74 65 73  /* Prerequesites
b280: 20 6f 66 20 74 68 65 20 70 45 78 70 72 2d 3e 70   of the pExpr->p
b290: 4c 65 66 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73  Left */.  Bitmas
b2a0: 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20 20 20 20  k prereqAll;    
b2b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
b2c0: 65 72 65 71 75 65 73 69 74 65 73 20 6f 66 20 70  erequesites of p
b2d0: 45 78 70 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73  Expr */.  Bitmas
b2e0: 6b 20 65 78 74 72 61 52 69 67 68 74 20 3d 20 30  k extraRight = 0
b2f0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78  ;          /* Ex
b300: 74 72 61 20 64 65 70 65 6e 64 65 6e 63 69 65 73  tra dependencies
b310: 20 6f 6e 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f   on LEFT JOIN */
b320: 0a 20 20 45 78 70 72 20 2a 70 53 74 72 31 20 3d  .  Expr *pStr1 =
b330: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
b340: 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49      /* RHS of LI
b350: 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72  KE/GLOB operator
b360: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70   */.  int isComp
b370: 6c 65 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20  lete = 0;       
b380: 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66         /* RHS of
b390: 20 4c 49 4b 45 2f 47 4c 4f 42 20 65 6e 64 73 20   LIKE/GLOB ends 
b3a0: 77 69 74 68 20 77 69 6c 64 63 61 72 64 20 2a 2f  with wildcard */
b3b0: 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65 20 3d 20  .  int noCase = 
b3c0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
b3d0: 20 20 20 20 2f 2a 20 75 70 70 65 72 63 61 73 65      /* uppercase
b3e0: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c   equivalent to l
b3f0: 6f 77 65 72 63 61 73 65 20 2a 2f 0a 20 20 69 6e  owercase */.  in
b400: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
b410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b420: 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65 72  * Top-level oper
b430: 61 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f 70  ator.  pExpr->op
b440: 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
b450: 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
b460: 61 72 73 65 3b 20 20 2f 2a 20 50 61 72 73 69 6e  arse;  /* Parsin
b470: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  g context */.  s
b480: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
b490: 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20  rse->db;        
b4a0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
b4b0: 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28  ection */..  if(
b4c0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
b4d0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d ){.    return;
b4e0: 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26  .  }.  pTerm = &
b4f0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
b500: 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70  .  pMaskSet = &p
b510: 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b  WInfo->sMaskSet;
b520: 0a 20 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d  .  pExpr = pTerm
b530: 2d 3e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72  ->pExpr;.  asser
b540: 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
b550: 5f 41 53 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  _AS && pExpr->op
b560: 21 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a  !=TK_COLLATE );.
b570: 20 20 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65    prereqLeft = e
b580: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
b590: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70  askSet, pExpr->p
b5a0: 4c 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45  Left);.  op = pE
b5b0: 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  xpr->op;.  if( o
b5c0: 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20  p==TK_IN ){.    
b5d0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
b5e0: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
b5f0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
b600: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
b610: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
b620: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
b630: 69 67 68 74 20 3d 20 65 78 70 72 53 65 6c 65 63  ight = exprSelec
b640: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
b650: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70  kSet, pExpr->x.p
b660: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c  Select);.    }el
b670: 73 65 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  se{.      pTerm-
b680: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65  >prereqRight = e
b690: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
b6a0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
b6b0: 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  r->x.pList);.   
b6c0: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f   }.  }else if( o
b6d0: 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a  p==TK_ISNULL ){.
b6e0: 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65      pTerm->prere
b6f0: 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65  qRight = 0;.  }e
b700: 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e  lse{.    pTerm->
b710: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78  prereqRight = ex
b720: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
b730: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52  skSet, pExpr->pR
b740: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65  ight);.  }.  pre
b750: 72 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61 62  reqAll = exprTab
b760: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
b770: 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  , pExpr);.  if( 
b780: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
b790: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
b7a0: 69 6e 29 20 29 7b 0a 20 20 20 20 42 69 74 6d 61  in) ){.    Bitma
b7b0: 73 6b 20 78 20 3d 20 73 71 6c 69 74 65 33 57 68  sk x = sqlite3Wh
b7c0: 65 72 65 47 65 74 4d 61 73 6b 28 70 4d 61 73 6b  ereGetMask(pMask
b7d0: 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 52 69 67  Set, pExpr->iRig
b7e0: 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a 20 20  htJoinTable);.  
b7f0: 20 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d 20 78    prereqAll |= x
b800: 3b 0a 20 20 20 20 65 78 74 72 61 52 69 67 68 74  ;.    extraRight
b810: 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e 20 63   = x-1;  /* ON c
b820: 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61 79 20  lause terms may 
b830: 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68  not be used with
b840: 20 61 6e 20 69 6e 64 65 78 0a 20 20 20 20 20 20   an index.      
b850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b860: 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61 62 6c   ** on left tabl
b870: 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
b880: 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 20  .  Ticket #3015 
b890: 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d 2d 3e  */.  }.  pTerm->
b8a0: 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72  prereqAll = prer
b8b0: 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d 3e  eqAll;.  pTerm->
b8c0: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d 31 3b  leftCursor = -1;
b8d0: 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  .  pTerm->iParen
b8e0: 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d  t = -1;.  pTerm-
b8f0: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 30 3b 0a  >eOperator = 0;.
b900: 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28    if( allowedOp(
b910: 6f 70 29 20 29 7b 0a 20 20 20 20 45 78 70 72 20  op) ){.    Expr 
b920: 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33  *pLeft = sqlite3
b930: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
b940: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
b950: 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
b960: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
b970: 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d 3e  pCollate(pExpr->
b980: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 75 31 36  pRight);.    u16
b990: 20 6f 70 4d 61 73 6b 20 3d 20 28 70 54 65 72 6d   opMask = (pTerm
b9a0: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
b9b0: 70 72 65 72 65 71 4c 65 66 74 29 3d 3d 30 20 3f  prereqLeft)==0 ?
b9c0: 20 57 4f 5f 41 4c 4c 20 3a 20 57 4f 5f 45 51 55   WO_ALL : WO_EQU
b9d0: 49 56 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66  IV;.    if( pLef
b9e0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
b9f0: 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d   ){.      pTerm-
ba00: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
ba10: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
ba20: 20 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74     pTerm->u.left
ba30: 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e  Column = pLeft->
ba40: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70  iColumn;.      p
ba50: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
ba60: 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 6f  = operatorMask(o
ba70: 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20 20 20  p) & opMask;.   
ba80: 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54   }.    if( op==T
ba90: 4b 5f 49 53 20 29 20 70 54 65 72 6d 2d 3e 77 74  K_IS ) pTerm->wt
baa0: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 49 53  Flags |= TERM_IS
bab0: 3b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  ;.    if( pRight
bac0: 20 26 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d   && pRight->op==
bad0: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
bae0: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e     WhereTerm *pN
baf0: 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ew;.      Expr *
bb00: 70 44 75 70 3b 0a 20 20 20 20 20 20 75 31 36 20  pDup;.      u16 
bb10: 65 45 78 74 72 61 4f 70 20 3d 20 30 3b 20 20 20  eExtraOp = 0;   
bb20: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 69       /* Extra bi
bb30: 74 73 20 66 6f 72 20 70 4e 65 77 2d 3e 65 4f 70  ts for pNew->eOp
bb40: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
bb50: 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
bb60: 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20 20 20 20  ursor>=0 ){.    
bb70: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a      int idxNew;.
bb80: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73          pDup = s
bb90: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
bba0: 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  , pExpr, 0);.   
bbb0: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
bbc0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
bbd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
bbe0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 44 75  prDelete(db, pDu
bbf0: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
bc00: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  turn;.        }.
bc10: 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d          idxNew =
bc20: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
bc30: 72 74 28 70 57 43 2c 20 70 44 75 70 2c 20 54 45  rt(pWC, pDup, TE
bc40: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
bc50: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
bc60: 20 20 69 66 28 20 69 64 78 4e 65 77 3d 3d 30 20    if( idxNew==0 
bc70: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
bc80: 20 20 70 4e 65 77 20 3d 20 26 70 57 43 2d 3e 61    pNew = &pWC->a
bc90: 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20  [idxNew];.      
bca0: 20 20 6d 61 72 6b 54 65 72 6d 41 73 43 68 69 6c    markTermAsChil
bcb0: 64 28 70 57 43 2c 20 69 64 78 4e 65 77 2c 20 69  d(pWC, idxNew, i
bcc0: 64 78 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20  dxTerm);.       
bcd0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29   if( op==TK_IS )
bce0: 20 70 4e 65 77 2d 3e 77 74 46 6c 61 67 73 20 7c   pNew->wtFlags |
bcf0: 3d 20 54 45 52 4d 5f 49 53 3b 0a 20 20 20 20 20  = TERM_IS;.     
bd00: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
bd10: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
bd20: 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
bd30: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49  ags |= TERM_COPI
bd40: 45 44 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  ED;..        if(
bd50: 20 74 65 72 6d 49 73 45 71 75 69 76 61 6c 65 6e   termIsEquivalen
bd60: 63 65 28 70 50 61 72 73 65 2c 20 70 44 75 70 29  ce(pParse, pDup)
bd70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54   ){.          pT
bd80: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 7c  erm->eOperator |
bd90: 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20  = WO_EQUIV;.    
bda0: 20 20 20 20 20 20 65 45 78 74 72 61 4f 70 20 3d        eExtraOp =
bdb0: 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 20   WO_EQUIV;.     
bdc0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
bdd0: 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d  {.        pDup =
bde0: 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
bdf0: 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pNew = pTerm;.  
be00: 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70 72      }.      expr
be10: 43 6f 6d 6d 75 74 65 28 70 50 61 72 73 65 2c 20  Commute(pParse, 
be20: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 70 4c 65  pDup);.      pLe
be30: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
be40: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 75 70  SkipCollate(pDup
be50: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
be60: 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72  pNew->leftCursor
be70: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
be80: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ;.      pNew->u.
be90: 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65  leftColumn = pLe
bea0: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ft->iColumn;.   
beb0: 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 72     testcase( (pr
bec0: 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61  ereqLeft | extra
bed0: 52 69 67 68 74 29 20 21 3d 20 70 72 65 72 65 71  Right) != prereq
bee0: 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 70 4e  Left );.      pN
bef0: 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  ew->prereqRight 
bf00: 3d 20 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65  = prereqLeft | e
bf10: 78 74 72 61 52 69 67 68 74 3b 0a 20 20 20 20 20  xtraRight;.     
bf20: 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c   pNew->prereqAll
bf30: 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20   = prereqAll;.  
bf40: 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61      pNew->eOpera
bf50: 74 6f 72 20 3d 20 28 6f 70 65 72 61 74 6f 72 4d  tor = (operatorM
bf60: 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29 20 2b 20  ask(pDup->op) + 
bf70: 65 45 78 74 72 61 4f 70 29 20 26 20 6f 70 4d 61  eExtraOp) & opMa
bf80: 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  sk;.    }.  }..#
bf90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
bfa0: 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d  IT_BETWEEN_OPTIM
bfb0: 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20  IZATION.  /* If 
bfc0: 61 20 74 65 72 6d 20 69 73 20 74 68 65 20 42 45  a term is the BE
bfd0: 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20  TWEEN operator, 
bfe0: 63 72 65 61 74 65 20 74 77 6f 20 6e 65 77 20 76  create two new v
bff0: 69 72 74 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a  irtual terms.  *
c000: 2a 20 74 68 61 74 20 64 65 66 69 6e 65 20 74 68  * that define th
c010: 65 20 72 61 6e 67 65 20 74 68 61 74 20 74 68 65  e range that the
c020: 20 42 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65   BETWEEN impleme
c030: 6e 74 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  nts.  For exampl
c040: 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  e:.  **.  **    
c050: 20 20 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e    a BETWEEN b AN
c060: 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73  D c.  **.  ** is
c070: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 3a   converted into:
c080: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
c090: 28 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44  (a BETWEEN b AND
c0a0: 20 63 29 20 41 4e 44 20 28 61 3e 3d 62 29 20 41   c) AND (a>=b) A
c0b0: 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20  ND (a<=c).  **. 
c0c0: 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65 77 20   ** The two new 
c0d0: 74 65 72 6d 73 20 61 72 65 20 61 64 64 65 64 20  terms are added 
c0e0: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
c0f0: 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  the WhereClause 
c100: 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65  object..  ** The
c110: 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20 22   new terms are "
c120: 64 79 6e 61 6d 69 63 22 20 61 6e 64 20 61 72 65  dynamic" and are
c130: 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74 68 65   children of the
c140: 20 6f 72 69 67 69 6e 61 6c 20 42 45 54 57 45 45   original BETWEE
c150: 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54 68  N.  ** term.  Th
c160: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66  at means that if
c170: 20 74 68 65 20 42 45 54 57 45 45 4e 20 74 65 72   the BETWEEN ter
c180: 6d 20 69 73 20 63 6f 64 65 64 2c 20 74 68 65 20  m is coded, the 
c190: 63 68 69 6c 64 72 65 6e 20 61 72 65 0a 20 20 2a  children are.  *
c1a0: 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c 20  * skipped.  Or, 
c1b0: 69 66 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20  if the children 
c1c0: 61 72 65 20 73 61 74 69 73 66 69 65 64 20 62 79  are satisfied by
c1d0: 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f   an index, the o
c1e0: 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45 54  riginal.  ** BET
c1f0: 57 45 45 4e 20 74 65 72 6d 20 69 73 20 73 6b 69  WEEN term is ski
c200: 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  pped..  */.  els
c210: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d  e if( pExpr->op=
c220: 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26 26 20 70  =TK_BETWEEN && p
c230: 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  WC->op==TK_AND )
c240: 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
c250: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
c260: 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20  .pList;.    int 
c270: 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  i;.    static co
c280: 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b  nst u8 ops[] = {
c290: 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20  TK_GE, TK_LE};. 
c2a0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
c2b0: 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
c2c0: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  t( pList->nExpr=
c2d0: 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  =2 );.    for(i=
c2e0: 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<2; i++){.  
c2f0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
c300: 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64  pr;.      int id
c310: 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77  xNew;.      pNew
c320: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
c330: 78 70 72 28 70 50 61 72 73 65 2c 20 6f 70 73 5b  xpr(pParse, ops[
c340: 69 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  i], .           
c350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c360: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
c370: 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  (db, pExpr->pLef
c380: 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20  t, 0),.         
c390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3a0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
c3b0: 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  up(db, pList->a[
c3c0: 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c 20 30 29  i].pExpr, 0), 0)
c3d0: 3b 0a 20 20 20 20 20 20 74 72 61 6e 73 66 65 72  ;.      transfer
c3e0: 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65  JoinMarkings(pNe
c3f0: 77 45 78 70 72 2c 20 70 45 78 70 72 29 3b 0a 20  wExpr, pExpr);. 
c400: 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68       idxNew = wh
c410: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
c420: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54  pWC, pNewExpr, T
c430: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
c440: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
c450: 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
c460: 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78  w==0 );.      ex
c470: 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20  prAnalyze(pSrc, 
c480: 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20  pWC, idxNew);.  
c490: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
c4a0: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
c4b0: 20 20 20 20 6d 61 72 6b 54 65 72 6d 41 73 43 68      markTermAsCh
c4c0: 69 6c 64 28 70 57 43 2c 20 69 64 78 4e 65 77 2c  ild(pWC, idxNew,
c4d0: 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20 7d   idxTerm);.    }
c4e0: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
c4f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45  QLITE_OMIT_BETWE
c500: 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  EN_OPTIMIZATION 
c510: 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
c520: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f  (SQLITE_OMIT_OR_
c530: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26  OPTIMIZATION) &&
c540: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
c550: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
c560: 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74    /* Analyze a t
c570: 65 72 6d 20 74 68 61 74 20 69 73 20 63 6f 6d 70  erm that is comp
c580: 6f 73 65 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d  osed of two or m
c590: 6f 72 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e  ore subterms con
c5a0: 6e 65 63 74 65 64 20 62 79 0a 20 20 2a 2a 20 61  nected by.  ** a
c5b0: 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20  n OR operator.. 
c5c0: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70   */.  else if( p
c5d0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20  Expr->op==TK_OR 
c5e0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
c5f0: 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  WC->op==TK_AND )
c600: 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  ;.    exprAnalyz
c610: 65 4f 72 54 65 72 6d 28 70 53 72 63 2c 20 70 57  eOrTerm(pSrc, pW
c620: 43 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20  C, idxTerm);.   
c630: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
c640: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 7d 0a 23  [idxTerm];.  }.#
c650: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
c660: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
c670: 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  TION */..#ifndef
c680: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
c690: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20  E_OPTIMIZATION. 
c6a0: 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72 61 69   /* Add constrai
c6b0: 6e 74 73 20 74 6f 20 72 65 64 75 63 65 20 74 68  nts to reduce th
c6c0: 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20 6f  e search space o
c6d0: 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42  n a LIKE or GLOB
c6e0: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a  .  ** operator..
c6f0: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b 65    **.  ** A like
c700: 20 70 61 74 74 65 72 6e 20 6f 66 20 74 68 65 20   pattern of the 
c710: 66 6f 72 6d 20 22 78 20 4c 49 4b 45 20 27 61 42  form "x LIKE 'aB
c720: 63 25 27 22 20 69 73 20 63 68 61 6e 67 65 64 20  c%'" is changed 
c730: 69 6e 74 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73  into constraints
c740: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
c750: 20 20 20 20 78 3e 3d 27 41 42 43 27 20 41 4e 44      x>='ABC' AND
c760: 20 78 3c 27 61 62 64 27 20 41 4e 44 20 78 20 4c   x<'abd' AND x L
c770: 49 4b 45 20 27 61 42 63 25 27 0a 20 20 2a 2a 0a  IKE 'aBc%'.  **.
c780: 20 20 2a 2a 20 54 68 65 20 6c 61 73 74 20 63 68    ** The last ch
c790: 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 70  aracter of the p
c7a0: 72 65 66 69 78 20 22 61 62 63 22 20 69 73 20 69  refix "abc" is i
c7b0: 6e 63 72 65 6d 65 6e 74 65 64 20 74 6f 20 66 6f  ncremented to fo
c7c0: 72 6d 20 74 68 65 0a 20 20 2a 2a 20 74 65 72 6d  rm the.  ** term
c7d0: 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f  ination conditio
c7e0: 6e 20 22 61 62 64 22 2e 20 20 49 66 20 63 61 73  n "abd".  If cas
c7f0: 65 20 69 73 20 6e 6f 74 20 73 69 67 6e 69 66 69  e is not signifi
c800: 63 61 6e 74 20 28 74 68 65 20 64 65 66 61 75 6c  cant (the defaul
c810: 74 0a 20 20 2a 2a 20 66 6f 72 20 4c 49 4b 45 29  t.  ** for LIKE)
c820: 20 74 68 65 6e 20 74 68 65 20 6c 6f 77 65 72 2d   then the lower-
c830: 62 6f 75 6e 64 20 69 73 20 6d 61 64 65 20 61 6c  bound is made al
c840: 6c 20 75 70 70 65 72 63 61 73 65 20 61 6e 64 20  l uppercase and 
c850: 74 68 65 20 75 70 70 65 72 2d 0a 20 20 2a 2a 20  the upper-.  ** 
c860: 62 6f 75 6e 64 20 69 73 20 6d 61 64 65 20 61 6c  bound is made al
c870: 6c 20 6c 6f 77 65 72 63 61 73 65 20 73 6f 20 74  l lowercase so t
c880: 68 61 74 20 74 68 65 20 62 6f 75 6e 64 73 20 61  hat the bounds a
c890: 6c 73 6f 20 77 6f 72 6b 20 77 68 65 6e 20 63 6f  lso work when co
c8a0: 6d 70 61 72 69 6e 67 0a 20 20 2a 2a 20 42 4c 4f  mparing.  ** BLO
c8b0: 42 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  Bs..  */.  if( p
c8c0: 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 0a  WC->op==TK_AND .
c8d0: 20 20 20 26 26 20 69 73 4c 69 6b 65 4f 72 47 6c     && isLikeOrGl
c8e0: 6f 62 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ob(pParse, pExpr
c8f0: 2c 20 26 70 53 74 72 31 2c 20 26 69 73 43 6f 6d  , &pStr1, &isCom
c900: 70 6c 65 74 65 2c 20 26 6e 6f 43 61 73 65 29 0a  plete, &noCase).
c910: 20 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70    ){.    Expr *p
c920: 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c  Left;       /* L
c930: 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20  HS of LIKE/GLOB 
c940: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
c950: 45 78 70 72 20 2a 70 53 74 72 32 3b 20 20 20 20  Expr *pStr2;    
c960: 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 53     /* Copy of pS
c970: 74 72 31 20 2d 20 52 48 53 20 6f 66 20 4c 49 4b  tr1 - RHS of LIK
c980: 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20  E/GLOB operator 
c990: 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  */.    Expr *pNe
c9a0: 77 45 78 70 72 31 3b 0a 20 20 20 20 45 78 70 72  wExpr1;.    Expr
c9b0: 20 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20 20 20   *pNewExpr2;.   
c9c0: 20 69 6e 74 20 69 64 78 4e 65 77 31 3b 0a 20 20   int idxNew1;.  
c9d0: 20 20 69 6e 74 20 69 64 78 4e 65 77 32 3b 0a 20    int idxNew2;. 
c9e0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
c9f0: 43 6f 6c 6c 53 65 71 4e 61 6d 65 3b 20 20 20 20  CollSeqName;    
ca00: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c   /* Name of coll
ca10: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a  ating sequence *
ca20: 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 31 36 20  /.    const u16 
ca30: 77 74 46 6c 61 67 73 20 3d 20 54 45 52 4d 5f 4c  wtFlags = TERM_L
ca40: 49 4b 45 4f 50 54 20 7c 20 54 45 52 4d 5f 56 49  IKEOPT | TERM_VI
ca50: 52 54 55 41 4c 20 7c 20 54 45 52 4d 5f 44 59 4e  RTUAL | TERM_DYN
ca60: 41 4d 49 43 3b 0a 0a 20 20 20 20 70 4c 65 66 74  AMIC;..    pLeft
ca70: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
ca80: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
ca90: 20 20 20 70 53 74 72 32 20 3d 20 73 71 6c 69 74     pStr2 = sqlit
caa0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53  e3ExprDup(db, pS
cab0: 74 72 31 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  tr1, 0);..    /*
cac0: 20 43 6f 6e 76 65 72 74 20 74 68 65 20 6c 6f 77   Convert the low
cad0: 65 72 20 62 6f 75 6e 64 20 74 6f 20 75 70 70 65  er bound to uppe
cae0: 72 2d 63 61 73 65 20 61 6e 64 20 74 68 65 20 75  r-case and the u
caf0: 70 70 65 72 20 62 6f 75 6e 64 20 74 6f 0a 20 20  pper bound to.  
cb00: 20 20 2a 2a 20 6c 6f 77 65 72 2d 63 61 73 65 20    ** lower-case 
cb10: 28 75 70 70 65 72 2d 63 61 73 65 20 69 73 20 6c  (upper-case is l
cb20: 65 73 73 20 74 68 61 6e 20 6c 6f 77 65 72 2d 63  ess than lower-c
cb30: 61 73 65 20 69 6e 20 41 53 43 49 49 29 20 73 6f  ase in ASCII) so
cb40: 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
cb50: 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
cb60: 74 73 20 61 6c 73 6f 20 77 6f 72 6b 20 66 6f 72  ts also work for
cb70: 20 42 4c 4f 42 73 0a 20 20 20 20 2a 2f 0a 20 20   BLOBs.    */.  
cb80: 20 20 69 66 28 20 6e 6f 43 61 73 65 20 26 26 20    if( noCase && 
cb90: 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c  !pParse->db->mal
cba0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
cbb0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
cbc0: 63 68 61 72 20 63 3b 0a 20 20 20 20 20 20 70 54  char c;.      pT
cbd0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
cbe0: 54 45 52 4d 5f 4c 49 4b 45 3b 0a 20 20 20 20 20  TERM_LIKE;.     
cbf0: 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 70   for(i=0; (c = p
cc00: 53 74 72 31 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 69  Str1->u.zToken[i
cc10: 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  ])!=0; i++){.   
cc20: 20 20 20 20 20 70 53 74 72 31 2d 3e 75 2e 7a 54       pStr1->u.zT
cc30: 6f 6b 65 6e 5b 69 5d 20 3d 20 73 71 6c 69 74 65  oken[i] = sqlite
cc40: 33 54 6f 75 70 70 65 72 28 63 29 3b 0a 20 20 20  3Toupper(c);.   
cc50: 20 20 20 20 20 70 53 74 72 32 2d 3e 75 2e 7a 54       pStr2->u.zT
cc60: 6f 6b 65 6e 5b 69 5d 20 3d 20 73 71 6c 69 74 65  oken[i] = sqlite
cc70: 33 54 6f 6c 6f 77 65 72 28 63 29 3b 0a 20 20 20  3Tolower(c);.   
cc80: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
cc90: 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
cca0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 75  ailed ){.      u
ccb0: 38 20 63 2c 20 2a 70 43 3b 20 20 20 20 20 20 20  8 c, *pC;       
ccc0: 2f 2a 20 4c 61 73 74 20 63 68 61 72 61 63 74 65  /* Last characte
ccd0: 72 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  r before the fir
cce0: 73 74 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20  st wildcard */. 
ccf0: 20 20 20 20 20 70 43 20 3d 20 28 75 38 2a 29 26       pC = (u8*)&
cd00: 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pStr2->u.zToken[
cd10: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
cd20: 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pStr2->u.zToken)
cd30: 2d 31 5d 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a  -1];.      c = *
cd40: 70 43 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f  pC;.      if( no
cd50: 43 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Case ){.        
cd60: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 20 69 73 20  /* The point is 
cd70: 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  to increment the
cd80: 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20   last character 
cd90: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
cda0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 64  .        ** wild
cdb0: 63 61 72 64 2e 20 20 42 75 74 20 69 66 20 77 65  card.  But if we
cdc0: 20 69 6e 63 72 65 6d 65 6e 74 20 27 40 27 2c 20   increment '@', 
cdd0: 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20 69  that will push i
cde0: 74 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  t into the.     
cdf0: 20 20 20 2a 2a 20 61 6c 70 68 61 62 65 74 69 63     ** alphabetic
ce00: 20 72 61 6e 67 65 20 77 68 65 72 65 20 63 61 73   range where cas
ce10: 65 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 77 69  e conversions wi
ce20: 6c 6c 20 6d 65 73 73 20 75 70 20 74 68 65 20 0a  ll mess up the .
ce30: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 65 71 75          ** inequ
ce40: 61 6c 69 74 79 2e 20 20 54 6f 20 61 76 6f 69 64  ality.  To avoid
ce50: 20 74 68 69 73 2c 20 6d 61 6b 65 20 73 75 72 65   this, make sure
ce60: 20 74 6f 20 61 6c 73 6f 20 72 75 6e 20 74 68 65   to also run the
ce70: 20 66 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a   full.        **
ce80: 20 4c 49 4b 45 20 6f 6e 20 61 6c 6c 20 63 61 6e   LIKE on all can
ce90: 64 69 64 61 74 65 20 65 78 70 72 65 73 73 69 6f  didate expressio
cea0: 6e 73 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74  ns by clearing t
ceb0: 68 65 20 69 73 43 6f 6d 70 6c 65 74 65 20 66 6c  he isComplete fl
cec0: 61 67 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ag.        */.  
ced0: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 41 27        if( c=='A'
cee0: 2d 31 20 29 20 69 73 43 6f 6d 70 6c 65 74 65 20  -1 ) isComplete 
cef0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 20 3d  = 0;.        c =
cf00: 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c   sqlite3UpperToL
cf10: 6f 77 65 72 5b 63 5d 3b 0a 20 20 20 20 20 20 7d  ower[c];.      }
cf20: 0a 20 20 20 20 20 20 2a 70 43 20 3d 20 63 20 2b  .      *pC = c +
cf30: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43   1;.    }.    zC
cf40: 6f 6c 6c 53 65 71 4e 61 6d 65 20 3d 20 6e 6f 43  ollSeqName = noC
cf50: 61 73 65 20 3f 20 22 4e 4f 43 41 53 45 22 20 3a  ase ? "NOCASE" :
cf60: 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 70   "BINARY";.    p
cf70: 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74  NewExpr1 = sqlit
cf80: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c  e3ExprDup(db, pL
cf90: 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65  eft, 0);.    pNe
cfa0: 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33  wExpr1 = sqlite3
cfb0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
cfc0: 5f 47 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _GE,.           
cfd0: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
cfe0: 6c 6c 61 74 65 53 74 72 69 6e 67 28 70 50 61 72  llateString(pPar
cff0: 73 65 2c 70 4e 65 77 45 78 70 72 31 2c 7a 43 6f  se,pNewExpr1,zCo
d000: 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20  llSeqName),.    
d010: 20 20 20 20 20 20 20 70 53 74 72 31 2c 20 30 29         pStr1, 0)
d020: 3b 0a 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f  ;.    transferJo
d030: 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45  inMarkings(pNewE
d040: 78 70 72 31 2c 20 70 45 78 70 72 29 3b 0a 20 20  xpr1, pExpr);.  
d050: 20 20 69 64 78 4e 65 77 31 20 3d 20 77 68 65 72    idxNew1 = wher
d060: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
d070: 43 2c 20 70 4e 65 77 45 78 70 72 31 2c 20 77 74  C, pNewExpr1, wt
d080: 46 6c 61 67 73 29 3b 0a 20 20 20 20 74 65 73 74  Flags);.    test
d090: 63 61 73 65 28 20 69 64 78 4e 65 77 31 3d 3d 30  case( idxNew1==0
d0a0: 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c   );.    exprAnal
d0b0: 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69  yze(pSrc, pWC, i
d0c0: 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70 4e 65  dxNew1);.    pNe
d0d0: 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65 33  wExpr2 = sqlite3
d0e0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66  ExprDup(db, pLef
d0f0: 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65 77 45  t, 0);.    pNewE
d100: 78 70 72 32 20 3d 20 73 71 6c 69 74 65 33 50 45  xpr2 = sqlite3PE
d110: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c  xpr(pParse, TK_L
d120: 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  T,.           sq
d130: 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c  lite3ExprAddColl
d140: 61 74 65 53 74 72 69 6e 67 28 70 50 61 72 73 65  ateString(pParse
d150: 2c 70 4e 65 77 45 78 70 72 32 2c 7a 43 6f 6c 6c  ,pNewExpr2,zColl
d160: 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20  SeqName),.      
d170: 20 20 20 20 20 70 53 74 72 32 2c 20 30 29 3b 0a       pStr2, 0);.
d180: 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e      transferJoin
d190: 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45 78 70  Markings(pNewExp
d1a0: 72 32 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  r2, pExpr);.    
d1b0: 69 64 78 4e 65 77 32 20 3d 20 77 68 65 72 65 43  idxNew2 = whereC
d1c0: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
d1d0: 20 70 4e 65 77 45 78 70 72 32 2c 20 77 74 46 6c   pNewExpr2, wtFl
d1e0: 61 67 73 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ags);.    testca
d1f0: 73 65 28 20 69 64 78 4e 65 77 32 3d 3d 30 20 29  se( idxNew2==0 )
d200: 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  ;.    exprAnalyz
d210: 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78  e(pSrc, pWC, idx
d220: 4e 65 77 32 29 3b 0a 20 20 20 20 70 54 65 72 6d  New2);.    pTerm
d230: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
d240: 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 43  rm];.    if( isC
d250: 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  omplete ){.     
d260: 20 6d 61 72 6b 54 65 72 6d 41 73 43 68 69 6c 64   markTermAsChild
d270: 28 70 57 43 2c 20 69 64 78 4e 65 77 31 2c 20 69  (pWC, idxNew1, i
d280: 64 78 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 6d  dxTerm);.      m
d290: 61 72 6b 54 65 72 6d 41 73 43 68 69 6c 64 28 70  arkTermAsChild(p
d2a0: 57 43 2c 20 69 64 78 4e 65 77 32 2c 20 69 64 78  WC, idxNew2, idx
d2b0: 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Term);.    }.  }
d2c0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
d2d0: 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49  E_OMIT_LIKE_OPTI
d2e0: 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66  MIZATION */..#if
d2f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d300: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
d310: 2f 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41 54 43  /* Add a WO_MATC
d320: 48 20 61 75 78 69 6c 69 61 72 79 20 74 65 72 6d  H auxiliary term
d330: 20 74 6f 20 74 68 65 20 63 6f 6e 73 74 72 61 69   to the constrai
d340: 6e 74 20 73 65 74 20 69 66 20 74 68 65 0a 20 20  nt set if the.  
d350: 2a 2a 20 63 75 72 72 65 6e 74 20 65 78 70 72 65  ** current expre
d360: 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ssion is of the 
d370: 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41  form:  column MA
d380: 54 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54  TCH expr..  ** T
d390: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
d3a0: 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 78  is used by the x
d3b0: 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64  BestIndex method
d3c0: 73 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75 61  s of.  ** virtua
d3d0: 6c 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20 6e  l tables.  The n
d3e0: 61 74 69 76 65 20 71 75 65 72 79 20 6f 70 74 69  ative query opti
d3f0: 6d 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20 61  mizer does not a
d400: 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64  ttempt.  ** to d
d410: 6f 20 61 6e 79 74 68 69 6e 67 20 77 69 74 68 20  o anything with 
d420: 4d 41 54 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e  MATCH functions.
d430: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61  .  */.  if( isMa
d440: 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70  tchOfColumn(pExp
d450: 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64  r) ){.    int id
d460: 78 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 20 2a  xNew;.    Expr *
d470: 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a  pRight, *pLeft;.
d480: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
d490: 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20 42 69 74  NewTerm;.    Bit
d4a0: 6d 61 73 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d  mask prereqColum
d4b0: 6e 2c 20 70 72 65 72 65 71 45 78 70 72 3b 0a 0a  n, prereqExpr;..
d4c0: 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78      pRight = pEx
d4d0: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30  pr->x.pList->a[0
d4e0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 4c 65  ].pExpr;.    pLe
d4f0: 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ft = pExpr->x.pL
d500: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
d510: 0a 20 20 20 20 70 72 65 72 65 71 45 78 70 72 20  .    prereqExpr 
d520: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
d530: 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 69 67 68  (pMaskSet, pRigh
d540: 74 29 3b 0a 20 20 20 20 70 72 65 72 65 71 43 6f  t);.    prereqCo
d550: 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61 62 6c 65  lumn = exprTable
d560: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
d570: 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20  pLeft);.    if( 
d580: 28 70 72 65 72 65 71 45 78 70 72 20 26 20 70 72  (prereqExpr & pr
d590: 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29  ereqColumn)==0 )
d5a0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
d5b0: 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e  ewExpr;.      pN
d5c0: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ewExpr = sqlite3
d5d0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
d5e0: 5f 4d 41 54 43 48 2c 20 0a 20 20 20 20 20 20 20  _MATCH, .       
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d600: 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74 65         0, sqlite
d610: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 52 69  3ExprDup(db, pRi
d620: 67 68 74 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20  ght, 0), 0);.   
d630: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
d640: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
d650: 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52  C, pNewExpr, TER
d660: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
d670: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74  YNAMIC);.      t
d680: 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d  estcase( idxNew=
d690: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  =0 );.      pNew
d6a0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
d6b0: 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e  dxNew];.      pN
d6c0: 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  ewTerm->prereqRi
d6d0: 67 68 74 20 3d 20 70 72 65 72 65 71 45 78 70 72  ght = prereqExpr
d6e0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
d6f0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
d700: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
d710: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e      pNewTerm->u.
d720: 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65  leftColumn = pLe
d730: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ft->iColumn;.   
d740: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70     pNewTerm->eOp
d750: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43  erator = WO_MATC
d760: 48 3b 0a 20 20 20 20 20 20 6d 61 72 6b 54 65 72  H;.      markTer
d770: 6d 41 73 43 68 69 6c 64 28 70 57 43 2c 20 69 64  mAsChild(pWC, id
d780: 78 4e 65 77 2c 20 69 64 78 54 65 72 6d 29 3b 0a  xNew, idxTerm);.
d790: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
d7a0: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
d7b0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
d7c0: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50  lags |= TERM_COP
d7d0: 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  IED;.      pNewT
d7e0: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  erm->prereqAll =
d7f0: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c   pTerm->prereqAl
d800: 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  l;.    }.  }.#en
d810: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
d820: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
d830: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
d840: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
d850: 52 5f 53 54 41 54 34 0a 20 20 2f 2a 20 57 68 65  R_STAT4.  /* Whe
d860: 6e 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68  n sqlite_stat3 h
d870: 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73  istogram data is
d880: 20 61 76 61 69 6c 61 62 6c 65 20 61 6e 20 6f 70   available an op
d890: 65 72 61 74 6f 72 20 6f 66 20 74 68 65 0a 20 20  erator of the.  
d8a0: 2a 2a 20 66 6f 72 6d 20 22 78 20 49 53 20 4e 4f  ** form "x IS NO
d8b0: 54 20 4e 55 4c 4c 22 20 63 61 6e 20 73 6f 6d 65  T NULL" can some
d8c0: 74 69 6d 65 73 20 62 65 20 65 76 61 6c 75 61 74  times be evaluat
d8d0: 65 64 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  ed more efficien
d8e0: 74 6c 79 0a 20 20 2a 2a 20 61 73 20 22 78 3e 4e  tly.  ** as "x>N
d8f0: 55 4c 4c 22 20 69 66 20 78 20 69 73 20 6e 6f 74  ULL" if x is not
d900: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
d910: 41 52 59 20 4b 45 59 2e 20 20 53 6f 20 63 6f 6e  ARY KEY.  So con
d920: 73 74 72 75 63 74 20 61 0a 20 20 2a 2a 20 76 69  struct a.  ** vi
d930: 72 74 75 61 6c 20 74 65 72 6d 20 6f 66 20 74 68  rtual term of th
d940: 61 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 0a 20 20  at form..  **.  
d950: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
d960: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6d 75   virtual term mu
d970: 73 74 20 62 65 20 74 61 67 67 65 64 20 77 69 74  st be tagged wit
d980: 68 20 54 45 52 4d 5f 56 4e 55 4c 4c 2e 0a 20 20  h TERM_VNULL..  
d990: 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  */.  if( pExpr->
d9a0: 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20  op==TK_NOTNULL. 
d9b0: 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66    && pExpr->pLef
d9c0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
d9d0: 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c  .   && pExpr->pL
d9e0: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a  eft->iColumn>=0.
d9f0: 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
da00: 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
da10: 4c 49 54 45 5f 53 74 61 74 33 34 29 0a 20 20 29  LITE_Stat34).  )
da20: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  {.    Expr *pNew
da30: 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a  Expr;.    Expr *
da40: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
da50: 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74 20 69 64  Left;.    int id
da60: 78 4e 65 77 3b 0a 20 20 20 20 57 68 65 72 65 54  xNew;.    WhereT
da70: 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 0a  erm *pNewTerm;..
da80: 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73      pNewExpr = s
da90: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
daa0: 73 65 2c 20 54 4b 5f 47 54 2c 0a 20 20 20 20 20  se, TK_GT,.     
dab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dac0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
dad0: 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c  prDup(db, pLeft,
dae0: 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20   0),.           
daf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db00: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
db10: 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30  arse, TK_NULL, 0
db20: 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a 0a 20 20  , 0, 0), 0);..  
db30: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
db40: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
db50: 2c 20 70 4e 65 77 45 78 70 72 2c 0a 20 20 20 20  , pNewExpr,.    
db60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db70: 20 20 20 20 20 20 20 20 20 20 54 45 52 4d 5f 56            TERM_V
db80: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
db90: 4d 49 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29 3b  MIC|TERM_VNULL);
dba0: 0a 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 20  .    if( idxNew 
dbb0: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  ){.      pNewTer
dbc0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e  m = &pWC->a[idxN
dbd0: 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ew];.      pNewT
dbe0: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
dbf0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 0;.      pNew
dc00: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
dc10: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
dc20: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
dc30: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  ->u.leftColumn =
dc40: 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b   pLeft->iColumn;
dc50: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
dc60: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f  >eOperator = WO_
dc70: 47 54 3b 0a 20 20 20 20 20 20 6d 61 72 6b 54 65  GT;.      markTe
dc80: 72 6d 41 73 43 68 69 6c 64 28 70 57 43 2c 20 69  rmAsChild(pWC, i
dc90: 64 78 4e 65 77 2c 20 69 64 78 54 65 72 6d 29 3b  dxNew, idxTerm);
dca0: 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26  .      pTerm = &
dcb0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
dcc0: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  .      pTerm->wt
dcd0: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
dce0: 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77  PIED;.      pNew
dcf0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
dd00: 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  = pTerm->prereqA
dd10: 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ll;.    }.  }.#e
dd20: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
dd30: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
dd40: 54 41 54 34 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72  TAT4 */..  /* Pr
dd50: 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75 73 65 20  event ON clause 
dd60: 74 65 72 6d 73 20 6f 66 20 61 20 4c 45 46 54 20  terms of a LEFT 
dd70: 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69 6e 67 20  JOIN from being 
dd80: 75 73 65 64 20 74 6f 20 64 72 69 76 65 0a 20 20  used to drive.  
dd90: 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20  ** an index for 
dda0: 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65  tables to the le
ddb0: 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a  ft of the join..
ddc0: 20 20 2a 2f 0a 20 20 70 54 65 72 6d 2d 3e 70 72    */.  pTerm->pr
ddd0: 65 72 65 71 52 69 67 68 74 20 7c 3d 20 65 78 74  ereqRight |= ext
dde0: 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  raRight;.}../*.*
ddf0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
de00: 73 65 61 72 63 68 65 73 20 70 4c 69 73 74 20 66  searches pList f
de10: 6f 72 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  or an entry that
de20: 20 6d 61 74 63 68 65 73 20 74 68 65 20 69 43 6f   matches the iCo
de30: 6c 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f  l-th column.** o
de40: 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a  f index pIdx..**
de50: 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 6e 20 65  .** If such an e
de60: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75  xpression is fou
de70: 6e 64 2c 20 69 74 73 20 69 6e 64 65 78 20 69 6e  nd, its index in
de80: 20 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73 20 72   pList->a[] is r
de90: 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e  eturned. If.** n
dea0: 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  o expression is 
deb0: 66 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72 65 74  found, -1 is ret
dec0: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
ded0: 20 69 6e 74 20 66 69 6e 64 49 6e 64 65 78 43 6f   int findIndexCo
dee0: 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  l(.  Parse *pPar
def0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
df00: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
df10: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
df20: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
df30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
df40: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f  pression list to
df50: 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74   search */.  int
df60: 20 69 42 61 73 65 2c 20 20 20 20 20 20 20 20 20   iBase,         
df70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
df80: 43 75 72 73 6f 72 20 66 6f 72 20 74 61 62 6c 65  Cursor for table
df90: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
dfa0: 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78   pIdx */.  Index
dfb0: 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20   *pIdx,         
dfc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
dfd0: 64 65 78 20 74 6f 20 6d 61 74 63 68 20 63 6f 6c  dex to match col
dfe0: 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20  umn of */.  int 
dff0: 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20  iCol            
e000: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
e010: 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74  olumn of index t
e020: 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20  o match */.){.  
e030: 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63  int i;.  const c
e040: 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64  har *zColl = pId
e050: 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b  x->azColl[iCol];
e060: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
e070: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
e080: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d  ){.    Expr *p =
e090: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
e0a0: 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61  Collate(pList->a
e0b0: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
e0c0: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
e0d0: 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 70 2d 3e  LUMN.     && p->
e0e0: 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61  iColumn==pIdx->a
e0f0: 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20  iColumn[iCol].  
e100: 20 20 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d     && p->iTable=
e110: 3d 69 42 61 73 65 0a 20 20 20 20 29 7b 0a 20 20  =iBase.    ){.  
e120: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
e130: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
e140: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
e150: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
e160: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  r);.      if( pC
e170: 6f 6c 6c 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  oll && 0==sqlite
e180: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
e190: 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b  zName, zColl) ){
e1a0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
e1b0: 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  i;.      }.    }
e1c0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 2d  .  }..  return -
e1d0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  1;.}../*.** Retu
e1e0: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 44  rn true if the D
e1f0: 49 53 54 49 4e 43 54 20 65 78 70 72 65 73 73 69  ISTINCT expressi
e200: 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61  on-list passed a
e210: 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  s the third argu
e220: 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e  ment.** is redun
e230: 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49  dant..**.** A DI
e240: 53 54 49 4e 43 54 20 6c 69 73 74 20 69 73 20 72  STINCT list is r
e250: 65 64 75 6e 64 61 6e 74 20 69 66 20 61 6e 79 20  edundant if any 
e260: 73 75 62 73 65 74 20 6f 66 20 74 68 65 20 63 6f  subset of the co
e270: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 2a 2a 20  lumns in the.** 
e280: 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20 61 72  DISTINCT list ar
e290: 65 20 63 6f 6c 6c 65 63 74 69 76 65 6c 79 20 75  e collectively u
e2a0: 6e 69 71 75 65 20 61 6e 64 20 69 6e 64 69 76 69  nique and indivi
e2b0: 64 75 61 6c 6c 79 20 6e 6f 6e 2d 6e 75 6c 6c 2e  dually non-null.
e2c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
e2d0: 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61  sDistinctRedunda
e2e0: 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
e2f0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
e300: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
e310: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
e320: 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
e330: 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
e340: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
e350: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
e360: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
e370: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
e380: 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74  rList *pDistinct
e390: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
e3a0: 73 75 6c 74 20 73 65 74 20 74 68 61 74 20 6e 65  sult set that ne
e3b0: 65 64 73 20 74 6f 20 62 65 20 44 49 53 54 49 4e  eds to be DISTIN
e3c0: 43 54 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  CT */.){.  Table
e3d0: 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20   *pTab;.  Index 
e3e0: 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20  *pIdx;.  int i; 
e3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e400: 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20           .  int 
e410: 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  iBase;..  /* If 
e420: 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74 68  there is more th
e430: 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20  an one table or 
e440: 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 20 74 68  sub-select in th
e450: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
e460: 0a 20 20 2a 2a 20 74 68 69 73 20 71 75 65 72 79  .  ** this query
e470: 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e  , then it will n
e480: 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ot be possible t
e490: 6f 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20  o show that the 
e4a0: 44 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63  DISTINCT .  ** c
e4b0: 6c 61 75 73 65 20 69 73 20 72 65 64 75 6e 64 61  lause is redunda
e4c0: 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  nt. */.  if( pTa
e4d0: 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29  bList->nSrc!=1 )
e4e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 42 61   return 0;.  iBa
e4f0: 73 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  se = pTabList->a
e500: 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70  [0].iCursor;.  p
e510: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
e520: 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a  a[0].pTab;..  /*
e530: 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65   If any of the e
e540: 78 70 72 65 73 73 69 6f 6e 73 20 69 73 20 61 6e  xpressions is an
e550: 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74   IPK column on t
e560: 61 62 6c 65 20 69 42 61 73 65 2c 20 74 68 65 6e  able iBase, then
e570: 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72   return .  ** tr
e580: 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28 70  ue. Note: The (p
e590: 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 29  ->iTable==iBase)
e5a0: 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 65   part of this te
e5b0: 73 74 20 6d 61 79 20 62 65 20 66 61 6c 73 65 20  st may be false 
e5c0: 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  if the.  ** curr
e5d0: 65 6e 74 20 53 45 4c 45 43 54 20 69 73 20 61 20  ent SELECT is a 
e5e0: 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d 71  correlated sub-q
e5f0: 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
e600: 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e 63  (i=0; i<pDistinc
e610: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
e620: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
e630: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
e640: 6c 61 74 65 28 70 44 69 73 74 69 6e 63 74 2d 3e  late(pDistinct->
e650: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
e660: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
e670: 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62  OLUMN && p->iTab
e680: 6c 65 3d 3d 69 42 61 73 65 20 26 26 20 70 2d 3e  le==iBase && p->
e690: 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75  iColumn<0 ) retu
e6a0: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
e6b0: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
e6c0: 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20   indices on the 
e6d0: 74 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e 67 20  table, checking 
e6e0: 65 61 63 68 20 74 6f 20 73 65 65 20 69 66 20 69  each to see if i
e6f0: 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74 68 65  t makes.  ** the
e700: 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66   DISTINCT qualif
e710: 69 65 72 20 72 65 64 75 6e 64 61 6e 74 2e 20 49  ier redundant. I
e720: 74 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a 20 20  t does so if:.  
e730: 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54 68 65  **.  **   1. The
e740: 20 69 6e 64 65 78 20 69 73 20 69 74 73 65 6c 66   index is itself
e750: 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20 20 2a   UNIQUE, and.  *
e760: 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c 6c 20  *.  **   2. All 
e770: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69  of the columns i
e780: 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72 65 20  n the index are 
e790: 65 69 74 68 65 72 20 70 61 72 74 20 6f 66 20 74  either part of t
e7a0: 68 65 20 70 44 69 73 74 69 6e 63 74 0a 20 20 2a  he pDistinct.  *
e7b0: 2a 20 20 20 20 20 20 6c 69 73 74 2c 20 6f 72 20  *      list, or 
e7c0: 65 6c 73 65 20 74 68 65 20 57 48 45 52 45 20 63  else the WHERE c
e7d0: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61  lause contains a
e7e0: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72   term of the for
e7f0: 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20  m "col=X",.  ** 
e800: 20 20 20 20 20 77 68 65 72 65 20 58 20 69 73 20       where X is 
e810: 61 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65  a constant value
e820: 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  . The collation 
e830: 73 65 71 75 65 6e 63 65 73 20 6f 66 20 74 68 65  sequences of the
e840: 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d 70 61  .  **      compa
e850: 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74  rison and select
e860: 2d 6c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e  -list expression
e870: 73 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 6f  s must match tho
e880: 73 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  se of the index.
e890: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e 20  .  **.  **   3. 
e8a0: 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69 6e 64  All of those ind
e8b0: 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77  ex columns for w
e8c0: 68 69 63 68 20 74 68 65 20 57 48 45 52 45 20 63  hich the WHERE c
e8d0: 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 0a 20  lause does not. 
e8e0: 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e   **      contain
e8f0: 20 61 20 22 63 6f 6c 3d 58 22 20 74 65 72 6d 20   a "col=X" term 
e900: 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20 61  are subject to a
e910: 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72   NOT NULL constr
e920: 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  aint..  */.  for
e930: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
e940: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
e950: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
e960: 20 69 66 28 20 21 49 73 55 6e 69 71 75 65 49 6e   if( !IsUniqueIn
e970: 64 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e 74  dex(pIdx) ) cont
e980: 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d  inue;.    for(i=
e990: 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65 79 43  0; i<pIdx->nKeyC
e9a0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
e9b0: 69 31 36 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d  i16 iCol = pIdx-
e9c0: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
e9d0: 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
e9e0: 65 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28  e3WhereFindTerm(
e9f0: 70 57 43 2c 20 69 42 61 73 65 2c 20 69 43 6f 6c  pWC, iBase, iCol
ea00: 2c 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20 57  , ~(Bitmask)0, W
ea10: 4f 5f 45 51 2c 20 70 49 64 78 29 20 29 7b 0a 20  O_EQ, pIdx) ){. 
ea20: 20 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 43         int iIdxC
ea30: 6f 6c 20 3d 20 66 69 6e 64 49 6e 64 65 78 43 6f  ol = findIndexCo
ea40: 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69  l(pParse, pDisti
ea50: 6e 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64 78  nct, iBase, pIdx
ea60: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , i);.        if
ea70: 28 20 69 49 64 78 43 6f 6c 3c 30 20 7c 7c 20 70  ( iIdxCol<0 || p
ea80: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
ea90: 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20  notNull==0 ){.  
eaa0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
eab0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
eac0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
ead0: 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20  ==pIdx->nKeyCol 
eae0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
eaf0: 20 69 6e 64 65 78 20 69 6d 70 6c 69 65 73 20 74   index implies t
eb00: 68 61 74 20 74 68 65 20 44 49 53 54 49 4e 43 54  hat the DISTINCT
eb10: 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 72 65   qualifier is re
eb20: 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20 20  dundant. */.    
eb30: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
eb40: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
eb50: 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 73 74  0;.}.../*.** Est
eb60: 69 6d 61 74 65 20 74 68 65 20 6c 6f 67 61 72 69  imate the logari
eb70: 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74  thm of the input
eb80: 20 76 61 6c 75 65 20 74 6f 20 62 61 73 65 20 32   value to base 2
eb90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45  ..*/.static LogE
eba0: 73 74 20 65 73 74 4c 6f 67 28 4c 6f 67 45 73 74  st estLog(LogEst
ebb0: 20 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20 4e 3c   N){.  return N<
ebc0: 3d 31 30 20 3f 20 30 20 3a 20 73 71 6c 69 74 65  =10 ? 0 : sqlite
ebd0: 33 4c 6f 67 45 73 74 28 4e 29 20 2d 20 33 33 3b  3LogEst(N) - 33;
ebe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
ebf0: 74 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f  t OP_Column opco
ec00: 64 65 73 20 74 6f 20 4f 50 5f 43 6f 70 79 20 69  des to OP_Copy i
ec10: 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 67 65 6e  n previously gen
ec20: 65 72 61 74 65 64 20 63 6f 64 65 2e 0a 2a 2a 0a  erated code..**.
ec30: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
ec40: 72 75 6e 73 20 6f 76 65 72 20 67 65 6e 65 72 61  runs over genera
ec50: 74 65 64 20 56 44 42 45 20 63 6f 64 65 20 61 6e  ted VDBE code an
ec60: 64 20 74 72 61 6e 73 6c 61 74 65 73 20 4f 50 5f  d translates OP_
ec70: 43 6f 6c 75 6d 6e 0a 2a 2a 20 6f 70 63 6f 64 65  Column.** opcode
ec80: 73 20 69 6e 74 6f 20 4f 50 5f 43 6f 70 79 2c 20  s into OP_Copy, 
ec90: 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 69 6e 74  and OP_Rowid int
eca0: 6f 20 4f 50 5f 4e 75 6c 6c 2c 20 77 68 65 6e 20  o OP_Null, when 
ecb0: 74 68 65 20 74 61 62 6c 65 20 69 73 20 62 65 69  the table is bei
ecc0: 6e 67 0a 2a 2a 20 61 63 63 65 73 73 65 64 20 76  ng.** accessed v
ecd0: 69 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 6e  ia co-routine in
ece0: 73 74 65 61 64 20 6f 66 20 76 69 61 20 74 61 62  stead of via tab
ecf0: 6c 65 20 6c 6f 6f 6b 75 70 2e 0a 2a 2f 0a 73 74  le lookup..*/.st
ed00: 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 6c  atic void transl
ed10: 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28  ateColumnToCopy(
ed20: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
ed30: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
ed40: 42 45 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f  BE containing co
ed50: 64 65 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20  de to translate 
ed60: 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c  */.  int iStart,
ed70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61 6e           /* Tran
ed80: 73 6c 61 74 65 20 66 72 6f 6d 20 74 68 69 73 20  slate from this 
ed90: 6f 70 63 6f 64 65 20 74 6f 20 74 68 65 20 65 6e  opcode to the en
eda0: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43  d */.  int iTabC
edb0: 75 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 50  ur,        /* OP
edc0: 5f 43 6f 6c 75 6d 6e 2f 4f 50 5f 52 6f 77 69 64  _Column/OP_Rowid
edd0: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
ede0: 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  his table */.  i
edf0: 6e 74 20 69 52 65 67 69 73 74 65 72 20 20 20 20  nt iRegister    
ee00: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
ee10: 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 74 68 69  column is in thi
ee20: 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b  s register */.){
ee30: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d  .  VdbeOp *pOp =
ee40: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
ee50: 70 28 76 2c 20 69 53 74 61 72 74 29 3b 0a 20 20  p(v, iStart);.  
ee60: 69 6e 74 20 69 45 6e 64 20 3d 20 73 71 6c 69 74  int iEnd = sqlit
ee70: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
ee80: 72 28 76 29 3b 0a 20 20 66 6f 72 28 3b 20 69 53  r(v);.  for(; iS
ee90: 74 61 72 74 3c 69 45 6e 64 3b 20 69 53 74 61 72  tart<iEnd; iStar
eea0: 74 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  t++, pOp++){.   
eeb0: 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 69 54   if( pOp->p1!=iT
eec0: 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  abCur ) continue
eed0: 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f  ;.    if( pOp->o
eee0: 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e  pcode==OP_Column
eef0: 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 6f   ){.      pOp->o
ef00: 70 63 6f 64 65 20 3d 20 4f 50 5f 43 6f 70 79 3b  pcode = OP_Copy;
ef10: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d  .      pOp->p1 =
ef20: 20 70 4f 70 2d 3e 70 32 20 2b 20 69 52 65 67 69   pOp->p2 + iRegi
ef30: 73 74 65 72 3b 0a 20 20 20 20 20 20 70 4f 70 2d  ster;.      pOp-
ef40: 3e 70 32 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20  >p2 = pOp->p3;. 
ef50: 20 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30       pOp->p3 = 0
ef60: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
ef70: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
ef80: 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 70  Rowid ){.      p
ef90: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
efa0: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 70 4f 70 2d  Null;.      pOp-
efb0: 3e 70 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  >p1 = 0;.      p
efc0: 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20  Op->p3 = 0;.    
efd0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
efe0: 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20  wo routines for 
eff0: 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e  printing the con
f000: 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69 74  tent of an sqlit
f010: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a  e3_index_info.**
f020: 20 73 74 72 75 63 74 75 72 65 2e 20 20 55 73 65   structure.  Use
f030: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
f040: 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
f050: 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a  .  If neither.**
f060: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72 20   SQLITE_TEST or 
f070: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72 65  SQLITE_DEBUG are
f080: 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74   defined, then t
f090: 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a  hese routines.**
f0a0: 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a   are no-ops..*/.
f0b0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
f0c0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
f0d0: 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65  TABLE) && define
f0e0: 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  d(WHERETRACE_ENA
f0f0: 42 4c 45 44 29 0a 73 74 61 74 69 63 20 76 6f 69  BLED).static voi
f100: 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55  d TRACE_IDX_INPU
f110: 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  TS(sqlite3_index
f120: 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74  _info *p){.  int
f130: 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   i;.  if( !sqlit
f140: 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72  e3WhereTrace ) r
f150: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
f160: 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
f170: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  nt; i++){.    sq
f180: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
f190: 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25  ("  constraint[%
f1a0: 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69  d]: col=%d termi
f1b0: 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c  d=%d op=%d usabl
f1c0: 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ed=%d\n",.      
f1d0: 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43   i,.       p->aC
f1e0: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f  onstraint[i].iCo
f1f0: 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e  lumn,.       p->
f200: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69  aConstraint[i].i
f210: 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20  TermOffset,.    
f220: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
f230: 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20  t[i].op,.       
f240: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
f250: 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20  ].usable);.  }. 
f260: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
f270: 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
f280: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
f290: 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79  rintf("  orderby
f2a0: 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73  [%d]: col=%d des
f2b0: 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
f2c0: 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72  i,.       p->aOr
f2d0: 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e  derBy[i].iColumn
f2e0: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64  ,.       p->aOrd
f2f0: 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20  erBy[i].desc);. 
f300: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
f310: 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55   TRACE_IDX_OUTPU
f320: 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  TS(sqlite3_index
f330: 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74  _info *p){.  int
f340: 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   i;.  if( !sqlit
f350: 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72  e3WhereTrace ) r
f360: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
f370: 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
f380: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  nt; i++){.    sq
f390: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
f3a0: 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61  ("  usage[%d]: a
f3b0: 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25  rgvIdx=%d omit=%
f3c0: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a  d\n",.       i,.
f3d0: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
f3e0: 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72  raintUsage[i].ar
f3f0: 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20  gvIndex,.       
f400: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  p->aConstraintUs
f410: 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20  age[i].omit);.  
f420: 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  }.  sqlite3Debug
f430: 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d  Printf("  idxNum
f440: 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75  =%d\n", p->idxNu
f450: 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  m);.  sqlite3Deb
f460: 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 53  ugPrintf("  idxS
f470: 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78  tr=%s\n", p->idx
f480: 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Str);.  sqlite3D
f490: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72  ebugPrintf("  or
f4a0: 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64  derByConsumed=%d
f4b0: 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43  \n", p->orderByC
f4c0: 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69  onsumed);.  sqli
f4d0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
f4e0: 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d    estimatedCost=
f4f0: 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61  %g\n", p->estima
f500: 74 65 64 43 6f 73 74 29 3b 0a 20 20 73 71 6c 69  tedCost);.  sqli
f510: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
f520: 20 20 65 73 74 69 6d 61 74 65 64 52 6f 77 73 3d    estimatedRows=
f530: 25 6c 6c 64 5c 6e 22 2c 20 70 2d 3e 65 73 74 69  %lld\n", p->esti
f540: 6d 61 74 65 64 52 6f 77 73 29 3b 0a 7d 0a 23 65  matedRows);.}.#e
f550: 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43  lse.#define TRAC
f560: 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 41 29 0a  E_IDX_INPUTS(A).
f570: 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44  #define TRACE_ID
f580: 58 5f 4f 55 54 50 55 54 53 28 41 29 0a 23 65 6e  X_OUTPUTS(A).#en
f590: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
f5a0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
f5b0: 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52  IC_INDEX./*.** R
f5c0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
f5d0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
f5e0: 65 72 6d 20 70 54 65 72 6d 20 69 73 20 6f 66 20  erm pTerm is of 
f5f0: 61 20 66 6f 72 6d 20 77 68 65 72 65 20 69 74 0a  a form where it.
f600: 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75 73 65 64  ** could be used
f610: 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 74   with an index t
f620: 6f 20 61 63 63 65 73 73 20 70 53 72 63 2c 20 61  o access pSrc, a
f630: 73 73 75 6d 69 6e 67 20 61 6e 20 61 70 70 72 6f  ssuming an appro
f640: 70 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65 78 20  priate.** index 
f650: 65 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  existed..*/.stat
f660: 69 63 20 69 6e 74 20 74 65 72 6d 43 61 6e 44 72  ic int termCanDr
f670: 69 76 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72  iveIndex(.  Wher
f680: 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20  eTerm *pTerm,   
f690: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48             /* WH
f6a0: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
f6b0: 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 73 74  to check */.  st
f6c0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
f6d0: 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20  m *pSrc,     /* 
f6e0: 54 61 62 6c 65 20 77 65 20 61 72 65 20 74 72 79  Table we are try
f6f0: 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 2a 2f  ing to access */
f700: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
f710: 61 64 79 20 20 20 20 20 20 20 20 20 20 20 20 20  ady             
f720: 20 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e 20 6f    /* Tables in o
f730: 75 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20 74 68  uter loops of th
f740: 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63  e join */.){.  c
f750: 68 61 72 20 61 66 66 3b 0a 20 20 69 66 28 20 70  har aff;.  if( p
f760: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
f770: 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  !=pSrc->iCursor 
f780: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
f790: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
f7a0: 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  tor & (WO_EQ|WO_
f7b0: 49 53 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  IS))==0 ) return
f7c0: 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d   0;.  if( (pTerm
f7d0: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
f7e0: 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20 72  notReady)!=0 ) r
f7f0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
f800: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
f810: 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b  mn<0 ) return 0;
f820: 0a 20 20 61 66 66 20 3d 20 70 53 72 63 2d 3e 70  .  aff = pSrc->p
f830: 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d  Tab->aCol[pTerm-
f840: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61  >u.leftColumn].a
f850: 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28 20 21  ffinity;.  if( !
f860: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
f870: 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45  nityOk(pTerm->pE
f880: 78 70 72 2c 20 61 66 66 29 20 29 20 72 65 74 75  xpr, aff) ) retu
f890: 72 6e 20 30 3b 0a 20 20 74 65 73 74 63 61 73 65  rn 0;.  testcase
f8a0: 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  ( pTerm->pExpr->
f8b0: 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 72  op==TK_IS );.  r
f8c0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
f8d0: 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  f...#ifndef SQLI
f8e0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
f8f0: 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65  C_INDEX./*.** Ge
f900: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63  nerate code to c
f910: 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e 64  onstruct the Ind
f920: 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 6e  ex object for an
f930: 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
f940: 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74 20 75  .** and to set u
f950: 70 20 74 68 65 20 57 68 65 72 65 4c 65 76 65 6c  p the WhereLevel
f960: 20 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c 20 73   object pLevel s
f970: 6f 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20  o that the code 
f980: 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b  generator.** mak
f990: 65 73 20 75 73 65 20 6f 66 20 74 68 65 20 61 75  es use of the au
f9a0: 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a 2a  tomatic index..*
f9b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
f9c0: 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63  nstructAutomatic
f9d0: 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
f9e0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
f9f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
fa00: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
fa10: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
fa20: 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  C,           /* 
fa30: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
fa40: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
fa50: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
fa60: 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
fa70: 61 75 73 65 20 74 65 72 6d 20 74 6f 20 67 65 74  ause term to get
fa80: 20 74 68 65 20 6e 65 78 74 20 69 6e 64 65 78 20   the next index 
fa90: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
faa0: 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20  Ready,          
fab0: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73   /* Mask of curs
fac0: 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ors that are not
fad0: 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20   available */.  
fae0: 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
faf0: 65 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  el          /* W
fb00: 72 69 74 65 20 6e 65 77 20 69 6e 64 65 78 20 68  rite new index h
fb10: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
fb20: 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20  nKeyCol;        
fb30: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
fb40: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
fb50: 74 68 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20  the constructed 
fb60: 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65  index */.  Where
fb70: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
fb80: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
fb90: 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  le term of the W
fba0: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
fbb0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45   WhereTerm *pWCE
fbc0: 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nd;          /* 
fbd0: 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20  End of pWC->a[] 
fbe0: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
fbf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fc00: 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73 63 72   /* Object descr
fc10: 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69  ibing the transi
fc20: 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56  ent index */.  V
fc30: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
fc40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
fc50: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
fc60: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
fc70: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ion */.  int add
fc80: 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20  rInit;          
fc90: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
fca0: 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  of the initializ
fcb0: 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a 75 6d  ation bypass jum
fcc0: 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  p */.  Table *pT
fcd0: 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  able;           
fce0: 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
fcf0: 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f  being indexed */
fd00: 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20  .  int addrTop; 
fd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fd20: 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 64  * Top of the ind
fd30: 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a  ex fill loop */.
fd40: 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b    int regRecord;
fd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fd60: 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
fd70: 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63 6f 72  g an index recor
fd80: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  d */.  int n;   
fd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fda0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75     /* Column cou
fdb0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  nter */.  int i;
fdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdd0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
fde0: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d  unter */.  int m
fdf0: 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20 20 20  xBitCol;        
fe00: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
fe10: 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63  m column in pSrc
fe20: 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43  ->colUsed */.  C
fe30: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
fe40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
fe50: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
fe60: 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20   to on a column 
fe70: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
fe80: 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
fe90: 20 2f 2a 20 54 68 65 20 4c 6f 6f 70 20 6f 62 6a   /* The Loop obj
fea0: 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ect */.  char *z
feb0: 4e 6f 74 55 73 65 64 3b 20 20 20 20 20 20 20 20  NotUsed;        
fec0: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 73 70       /* Extra sp
fed0: 61 63 65 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f  ace on the end o
fee0: 66 20 70 49 64 78 20 2a 2f 0a 20 20 42 69 74 6d  f pIdx */.  Bitm
fef0: 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20 20 20  ask idxCols;    
ff00: 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61          /* Bitma
ff10: 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65  p of columns use
ff20: 64 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a  d for indexing *
ff30: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72  /.  Bitmask extr
ff40: 61 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20  aCols;          
ff50: 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 61 64 64  /* Bitmap of add
ff60: 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
ff70: 2a 2f 0a 20 20 75 38 20 73 65 6e 74 57 61 72 6e  */.  u8 sentWarn
ff80: 69 6e 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ing = 0;        
ff90: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 77 61   /* True if a wa
ffa0: 72 6e 6e 69 6e 67 20 68 61 73 20 62 65 65 6e 20  rnning has been 
ffb0: 69 73 73 75 65 64 20 2a 2f 0a 20 20 45 78 70 72  issued */.  Expr
ffc0: 20 2a 70 50 61 72 74 69 61 6c 20 3d 20 30 3b 20   *pPartial = 0; 
ffd0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 74 69          /* Parti
ffe0: 61 6c 20 49 6e 64 65 78 20 45 78 70 72 65 73 73  al Index Express
fff0: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  ion */.  int iCo
10000 6e 74 69 6e 75 65 20 3d 20 30 3b 20 20 20 20 20  ntinue = 0;     
10010 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
10020 65 20 74 6f 20 73 6b 69 70 20 65 78 63 6c 75 64  e to skip exclud
10030 65 64 20 72 6f 77 73 20 2a 2f 0a 20 20 73 74 72  ed rows */.  str
10040 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
10050 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20   *pTabItem;  /* 
10060 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
10070 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a   being indexed *
10080 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  /..  /* Generate
10090 20 63 6f 64 65 20 74 6f 20 73 6b 69 70 20 6f 76   code to skip ov
100a0 65 72 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20  er the creation 
100b0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  and initializati
100c0 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 74  on of the.  ** t
100d0 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 6f  ransient index o
100e0 6e 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71  n 2nd and subseq
100f0 75 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 73 20  uent iterations 
10100 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a  of the loop. */.
10110 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
10120 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76  dbe;.  assert( v
10130 21 3d 30 20 29 3b 0a 20 20 61 64 64 72 49 6e 69  !=0 );.  addrIni
10140 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f  t = sqlite3CodeO
10150 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56 64 62  nce(pParse); Vdb
10160 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
10170 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
10180 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
10190 74 68 61 74 20 77 69 6c 6c 20 62 65 20 61 64 64  that will be add
101a0 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 0a  ed to the index.
101b0 20 20 2a 2a 20 61 6e 64 20 75 73 65 64 20 74 6f    ** and used to
101c0 20 6d 61 74 63 68 20 57 48 45 52 45 20 63 6c 61   match WHERE cla
101d0 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  use constraints 
101e0 2a 2f 0a 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30  */.  nKeyCol = 0
101f0 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20 70 53 72  ;.  pTable = pSr
10200 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 45 6e  c->pTab;.  pWCEn
10210 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d  d = &pWC->a[pWC-
10220 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70 4c 6f 6f 70  >nTerm];.  pLoop
10230 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
10240 70 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30  p;.  idxCols = 0
10250 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  ;.  for(pTerm=pW
10260 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45  C->a; pTerm<pWCE
10270 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
10280 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
10290 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
102a0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
102b0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
102c0 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 20  , EP_FromJoin)  
102d0 20 20 2f 2a 20 70 72 65 72 65 71 20 61 6c 77 61    /* prereq alwa
102e0 79 73 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20  ys non-zero */. 
102f0 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72          || pExpr
10300 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
10310 65 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  e!=pSrc->iCursor
10320 20 20 20 2f 2a 20 20 20 66 6f 72 20 74 68 65 20     /*   for the 
10330 72 69 67 68 74 2d 68 61 6e 64 20 20 20 2a 2f 0a  right-hand   */.
10340 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4c 6f 6f           || pLoo
10350 70 2d 3e 70 72 65 72 65 71 21 3d 30 20 29 3b 20  p->prereq!=0 ); 
10360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10370 20 20 20 20 2f 2a 20 20 20 74 61 62 6c 65 20 6f      /*   table o
10380 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f  f a LEFT JOIN */
10390 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
103a0 70 72 65 72 65 71 3d 3d 30 0a 20 20 20 20 20 26  prereq==0.     &
103b0 26 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  & (pTerm->wtFlag
103c0 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
103d0 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 21 45 78  )==0.     && !Ex
103e0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
103f0 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
10400 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65  ).     && sqlite
10410 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73  3ExprIsTableCons
10420 74 61 6e 74 28 70 45 78 70 72 2c 20 70 53 72 63  tant(pExpr, pSrc
10430 2d 3e 69 43 75 72 73 6f 72 29 20 29 7b 0a 20 20  ->iCursor) ){.  
10440 20 20 20 20 70 50 61 72 74 69 61 6c 20 3d 20 73      pPartial = s
10450 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50  qlite3ExprAnd(pP
10460 61 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69  arse->db, pParti
10470 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  al,.            
10480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10490 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
104a0 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
104b0 45 78 70 72 2c 20 30 29 29 3b 0a 20 20 20 20 7d  Expr, 0));.    }
104c0 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e  .    if( termCan
104d0 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d  DriveIndex(pTerm
104e0 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79  , pSrc, notReady
104f0 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
10500 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  Col = pTerm->u.l
10510 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
10520 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d   Bitmask cMask =
10530 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53   iCol>=BMS ? MAS
10540 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41  KBIT(BMS-1) : MA
10550 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20  SKBIT(iCol);.   
10560 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f     testcase( iCo
10570 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20  l==BMS );.      
10580 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
10590 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 69  BMS-1 );.      i
105a0 66 28 20 21 73 65 6e 74 57 61 72 6e 69 6e 67 20  f( !sentWarning 
105b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
105c0 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41  e3_log(SQLITE_WA
105d0 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 2c  RNING_AUTOINDEX,
105e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 61 75  .            "au
105f0 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6f 6e  tomatic index on
10600 20 25 73 28 25 73 29 22 2c 20 70 54 61 62 6c 65   %s(%s)", pTable
10610 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
10620 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f       pTable->aCo
10630 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a  l[iCol].zName);.
10640 20 20 20 20 20 20 20 20 73 65 6e 74 57 61 72 6e          sentWarn
10650 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ing = 1;.      }
10660 0a 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43  .      if( (idxC
10670 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20  ols & cMask)==0 
10680 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77  ){.        if( w
10690 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70  hereLoopResize(p
106a0 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f 70  Parse->db, pLoop
106b0 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29 20 29 7b 0a  , nKeyCol+1) ){.
106c0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
106d0 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72  nd_auto_index_cr
106e0 65 61 74 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  eate;.        }.
106f0 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61          pLoop->a
10700 4c 54 65 72 6d 5b 6e 4b 65 79 43 6f 6c 2b 2b 5d  LTerm[nKeyCol++]
10710 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
10720 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61    idxCols |= cMa
10730 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  sk;.      }.    
10740 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
10750 6e 4b 65 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 70  nKeyCol>0 );.  p
10760 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
10770 71 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72  q = pLoop->nLTer
10780 6d 20 3d 20 6e 4b 65 79 43 6f 6c 3b 0a 20 20 70  m = nKeyCol;.  p
10790 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  Loop->wsFlags = 
107a0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
107b0 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  | WHERE_IDX_ONLY
107c0 20 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   | WHERE_INDEXED
107d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
107e0 20 20 20 20 20 20 7c 20 57 48 45 52 45 5f 41 55        | WHERE_AU
107f0 54 4f 5f 49 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20  TO_INDEX;..  /* 
10800 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
10810 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63   of additional c
10820 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f  olumns needed to
10830 20 63 72 65 61 74 65 20 61 0a 20 20 2a 2a 20 63   create a.  ** c
10840 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20  overing index.  
10850 41 20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  A "covering inde
10860 78 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74  x" is an index t
10870 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  hat contains all
10880 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68  .  ** columns th
10890 61 74 20 61 72 65 20 6e 65 65 64 65 64 20 62 79  at are needed by
108a0 20 74 68 65 20 71 75 65 72 79 2e 20 20 57 69 74   the query.  Wit
108b0 68 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  h a covering ind
108c0 65 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69  ex, the.  ** ori
108d0 67 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76 65  ginal table neve
108e0 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 63  r needs to be ac
108f0 63 65 73 73 65 64 2e 20 20 41 75 74 6f 6d 61 74  cessed.  Automat
10900 69 63 20 69 6e 64 69 63 65 73 20 6d 75 73 74 0a  ic indices must.
10910 20 20 2a 2a 20 62 65 20 61 20 63 6f 76 65 72 69    ** be a coveri
10920 6e 67 20 69 6e 64 65 78 20 62 65 63 61 75 73 65  ng index because
10930 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20   the index will 
10940 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64 20 69  not be updated i
10950 66 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69  f the.  ** origi
10960 6e 61 6c 20 74 61 62 6c 65 20 63 68 61 6e 67 65  nal table change
10970 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  s and the index 
10980 61 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74  and table cannot
10990 20 62 6f 74 68 20 62 65 20 75 73 65 64 0a 20 20   both be used.  
109a0 2a 2a 20 69 66 20 74 68 65 79 20 67 6f 20 6f 75  ** if they go ou
109b0 74 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a  t of sync..  */.
109c0 20 20 65 78 74 72 61 43 6f 6c 73 20 3d 20 70 53    extraCols = pS
109d0 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e  rc->colUsed & (~
109e0 69 64 78 43 6f 6c 73 20 7c 20 4d 41 53 4b 42 49  idxCols | MASKBI
109f0 54 28 42 4d 53 2d 31 29 29 3b 0a 20 20 6d 78 42  T(BMS-1));.  mxB
10a00 69 74 43 6f 6c 20 3d 20 4d 49 4e 28 42 4d 53 2d  itCol = MIN(BMS-
10a10 31 2c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 29 3b  1,pTable->nCol);
10a20 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61  .  testcase( pTa
10a30 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31  ble->nCol==BMS-1
10a40 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
10a50 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d  pTable->nCol==BM
10a60 53 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  S-2 );.  for(i=0
10a70 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b  ; i<mxBitCol; i+
10a80 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72  +){.    if( extr
10a90 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28  aCols & MASKBIT(
10aa0 69 29 20 29 20 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a  i) ) nKeyCol++;.
10ab0 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e    }.  if( pSrc->
10ac0 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49  colUsed & MASKBI
10ad0 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20  T(BMS-1) ){.    
10ae0 6e 4b 65 79 43 6f 6c 20 2b 3d 20 70 54 61 62 6c  nKeyCol += pTabl
10af0 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20  e->nCol - BMS + 
10b00 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e  1;.  }..  /* Con
10b10 73 74 72 75 63 74 20 74 68 65 20 49 6e 64 65 78  struct the Index
10b20 20 6f 62 6a 65 63 74 20 74 6f 20 64 65 73 63 72   object to descr
10b30 69 62 65 20 74 68 69 73 20 69 6e 64 65 78 20 2a  ibe this index *
10b40 2f 0a 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74  /.  pIdx = sqlit
10b50 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f  e3AllocateIndexO
10b60 62 6a 65 63 74 28 70 50 61 72 73 65 2d 3e 64 62  bject(pParse->db
10b70 2c 20 6e 4b 65 79 43 6f 6c 2b 31 2c 20 30 2c 20  , nKeyCol+1, 0, 
10b80 26 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66  &zNotUsed);.  if
10b90 28 20 70 49 64 78 3d 3d 30 20 29 20 67 6f 74 6f  ( pIdx==0 ) goto
10ba0 20 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f   end_auto_index_
10bb0 63 72 65 61 74 65 3b 0a 20 20 70 4c 6f 6f 70 2d  create;.  pLoop-
10bc0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
10bd0 3d 20 70 49 64 78 3b 0a 20 20 70 49 64 78 2d 3e  = pIdx;.  pIdx->
10be0 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d 69 6e  zName = "auto-in
10bf0 64 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e 70 54  dex";.  pIdx->pT
10c00 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20  able = pTable;. 
10c10 20 6e 20 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c   n = 0;.  idxCol
10c20 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65  s = 0;.  for(pTe
10c30 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d  rm=pWC->a; pTerm
10c40 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b  <pWCEnd; pTerm++
10c50 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43  ){.    if( termC
10c60 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65  anDriveIndex(pTe
10c70 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61  rm, pSrc, notRea
10c80 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  dy) ){.      int
10c90 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75   iCol = pTerm->u
10ca0 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  .leftColumn;.   
10cb0 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b     Bitmask cMask
10cc0 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d   = iCol>=BMS ? M
10cd0 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20  ASKBIT(BMS-1) : 
10ce0 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20  MASKBIT(iCol);. 
10cf0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
10d00 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  Col==BMS-1 );.  
10d10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
10d20 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20  ol==BMS );.     
10d30 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20   if( (idxCols & 
10d40 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  cMask)==0 ){.   
10d50 20 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20       Expr *pX = 
10d60 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
10d70 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d        idxCols |=
10d80 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20   cMask;.        
10d90 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
10da0 5d 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  ] = pTerm->u.lef
10db0 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  tColumn;.       
10dc0 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
10dd0 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
10de0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d  lSeq(pParse, pX-
10df0 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67  >pLeft, pX->pRig
10e00 68 74 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64  ht);.        pId
10e10 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 70  x->azColl[n] = p
10e20 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e  Coll ? pColl->zN
10e30 61 6d 65 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a  ame : "BINARY";.
10e40 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20          n++;.   
10e50 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
10e60 20 61 73 73 65 72 74 28 20 28 75 33 32 29 6e 3d   assert( (u32)n=
10e70 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  =pLoop->u.btree.
10e80 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64  nEq );..  /* Add
10e90 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
10ea0 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 6d 61  mns needed to ma
10eb0 6b 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ke the automatic
10ec0 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a 2a   index into.  **
10ed0 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
10ee0 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  x */.  for(i=0; 
10ef0 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29  i<mxBitCol; i++)
10f00 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43  {.    if( extraC
10f10 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29  ols & MASKBIT(i)
10f20 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   ){.      pIdx->
10f30 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b  aiColumn[n] = i;
10f40 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43  .      pIdx->azC
10f50 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59  oll[n] = "BINARY
10f60 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  ";.      n++;.  
10f70 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53    }.  }.  if( pS
10f80 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41  rc->colUsed & MA
10f90 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a  SKBIT(BMS-1) ){.
10fa0 20 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b      for(i=BMS-1;
10fb0 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   i<pTable->nCol;
10fc0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 64   i++){.      pId
10fd0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d  x->aiColumn[n] =
10fe0 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   i;.      pIdx->
10ff0 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e  azColl[n] = "BIN
11000 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b  ARY";.      n++;
11010 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
11020 65 72 74 28 20 6e 3d 3d 6e 4b 65 79 43 6f 6c 20  ert( n==nKeyCol 
11030 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c  );.  pIdx->aiCol
11040 75 6d 6e 5b 6e 5d 20 3d 20 2d 31 3b 0a 20 20 70  umn[n] = -1;.  p
11050 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d  Idx->azColl[n] =
11060 20 22 42 49 4e 41 52 59 22 3b 0a 0a 20 20 2f 2a   "BINARY";..  /*
11070 20 43 72 65 61 74 65 20 74 68 65 20 61 75 74 6f   Create the auto
11080 6d 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20  matic index */. 
11090 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d   assert( pLevel-
110a0 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20  >iIdxCur>=0 );. 
110b0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
110c0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
110d0 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  +;.  sqlite3Vdbe
110e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
110f0 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76  nAutoindex, pLev
11100 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 4b 65  el->iIdxCur, nKe
11110 79 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c 69 74  yCol+1);.  sqlit
11120 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e  e3VdbeSetP4KeyIn
11130 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  fo(pParse, pIdx)
11140 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
11150 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70 54  (v, "for %s", pT
11160 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a  able->zName));..
11170 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61 75    /* Fill the au
11180 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77 69  tomatic index wi
11190 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  th content */.  
111a0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
111b0 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
111c0 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57 43 2d  pTabItem = &pWC-
111d0 3e 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  >pWInfo->pTabLis
111e0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
111f0 6f 6d 5d 3b 0a 20 20 69 66 28 20 70 54 61 62 49  om];.  if( pTabI
11200 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e  tem->viaCoroutin
11210 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67  e ){.    int reg
11220 59 69 65 6c 64 20 3d 20 70 54 61 62 49 74 65 6d  Yield = pTabItem
11230 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20  ->regReturn;.   
11240 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11250 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
11260 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64  outine, regYield
11270 2c 20 30 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61  , 0, pTabItem->a
11280 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20  ddrFillSub);.   
11290 20 61 64 64 72 54 6f 70 20 3d 20 20 73 71 6c 69   addrTop =  sqli
112a0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
112b0 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 59 69   OP_Yield, regYi
112c0 65 6c 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  eld);.    VdbeCo
112d0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56  verage(v);.    V
112e0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
112f0 6e 65 78 74 20 72 6f 77 20 6f 66 20 5c 22 25 73  next row of \"%s
11300 5c 22 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70  \"", pTabItem->p
11310 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
11320 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 54  }else{.    addrT
11330 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
11340 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77  AddOp1(v, OP_Rew
11350 69 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ind, pLevel->iTa
11360 62 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72  bCur); VdbeCover
11370 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66  age(v);.  }.  if
11380 28 20 70 50 61 72 74 69 61 6c 20 29 7b 0a 20 20  ( pPartial ){.  
11390 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71    iContinue = sq
113a0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
113b0 65 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  el(v);.    sqlit
113c0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
113d0 61 72 73 65 2c 20 70 50 61 72 74 69 61 6c 2c 20  arse, pPartial, 
113e0 69 43 6f 6e 74 69 6e 75 65 2c 20 53 51 4c 49 54  iContinue, SQLIT
113f0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
11400 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67     pLoop->wsFlag
11410 73 20 7c 3d 20 57 48 45 52 45 5f 50 41 52 54 49  s |= WHERE_PARTI
11420 41 4c 49 44 58 3b 0a 20 20 7d 0a 20 20 72 65 67  ALIDX;.  }.  reg
11430 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33  Record = sqlite3
11440 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
11450 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 6e  e);.  sqlite3Gen
11460 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50  erateIndexKey(pP
11470 61 72 73 65 2c 20 70 49 64 78 2c 20 70 4c 65 76  arse, pIdx, pLev
11480 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72 65 67  el->iTabCur, reg
11490 52 65 63 6f 72 64 2c 20 30 2c 20 30 2c 20 30 2c  Record, 0, 0, 0,
114a0 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
114b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
114c0 64 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c  dxInsert, pLevel
114d0 2d 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52 65  ->iIdxCur, regRe
114e0 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
114f0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
11500 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
11510 53 55 4c 54 29 3b 0a 20 20 69 66 28 20 70 50 61  SULT);.  if( pPa
11520 72 74 69 61 6c 20 29 20 73 71 6c 69 74 65 33 56  rtial ) sqlite3V
11530 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
11540 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  v, iContinue);. 
11550 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 76   if( pTabItem->v
11560 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20  iaCoroutine ){. 
11570 20 20 20 74 72 61 6e 73 6c 61 74 65 43 6f 6c 75     translateColu
11580 6d 6e 54 6f 43 6f 70 79 28 76 2c 20 61 64 64 72  mnToCopy(v, addr
11590 54 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  Top, pLevel->iTa
115a0 62 43 75 72 2c 20 70 54 61 62 49 74 65 6d 2d 3e  bCur, pTabItem->
115b0 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  regResult);.    
115c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
115d0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
115e0 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 70   addrTop);.    p
115f0 54 61 62 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f  TabItem->viaCoro
11600 75 74 69 6e 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  utine = 0;.  }el
11610 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
11620 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11630 4e 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54  Next, pLevel->iT
11640 61 62 43 75 72 2c 20 61 64 64 72 54 6f 70 2b 31  abCur, addrTop+1
11650 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
11660 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  v);.  }.  sqlite
11670 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
11680 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
11690 55 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20  US_AUTOINDEX);. 
116a0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
116b0 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29  Here(v, addrTop)
116c0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
116d0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
116e0 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
116f0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
11700 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 0a  Pop(pParse);.  .
11710 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77    /* Jump here w
11720 68 65 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65  hen skipping the
11730 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
11740 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
11750 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
11760 49 6e 69 74 29 3b 0a 0a 65 6e 64 5f 61 75 74 6f  Init);..end_auto
11770 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3a 0a 20  _index_create:. 
11780 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
11790 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
117a0 50 61 72 74 69 61 6c 29 3b 0a 7d 0a 23 65 6e 64  Partial);.}.#end
117b0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
117c0 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
117d0 58 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  X */..#ifndef SQ
117e0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
117f0 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c  LTABLE./*.** All
11800 6f 63 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61  ocate and popula
11810 74 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e  te an sqlite3_in
11820 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
11830 72 65 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a  re. It is the .*
11840 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  * responsibility
11850 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
11860 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c  o eventually rel
11870 65 61 73 65 20 74 68 65 20 73 74 72 75 63 74 75  ease the structu
11880 72 65 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67  re.** by passing
11890 20 74 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   the pointer ret
118a0 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  urned by this fu
118b0 6e 63 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65  nction to sqlite
118c0 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61  3_free()..*/.sta
118d0 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  tic sqlite3_inde
118e0 78 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65  x_info *allocate
118f0 49 6e 64 65 78 49 6e 66 6f 28 0a 20 20 50 61 72  IndexInfo(.  Par
11900 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 57 68  se *pParse,.  Wh
11910 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a  ereClause *pWC,.
11920 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
11930 5f 69 74 65 6d 20 2a 70 53 72 63 2c 0a 20 20 45  _item *pSrc,.  E
11940 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
11950 79 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  y.){.  int i, j;
11960 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20  .  int nTerm;.  
11970 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
11980 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20  ndex_constraint 
11990 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72  *pIdxCons;.  str
119a0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
119b0 78 5f 6f 72 64 65 72 62 79 20 2a 70 49 64 78 4f  x_orderby *pIdxO
119c0 72 64 65 72 42 79 3b 0a 20 20 73 74 72 75 63 74  rderBy;.  struct
119d0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
119e0 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20  onstraint_usage 
119f0 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65  *pUsage;.  Where
11a00 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69  Term *pTerm;.  i
11a10 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 73  nt nOrderBy;.  s
11a20 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
11a30 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20  o *pIdxInfo;..  
11a40 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  /* Count the num
11a50 62 65 72 20 6f 66 20 70 6f 73 73 69 62 6c 65 20  ber of possible 
11a60 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
11a70 73 74 72 61 69 6e 74 73 20 72 65 66 65 72 72 69  straints referri
11a80 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20  ng.  ** to this 
11a90 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
11aa0 0a 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30  .  for(i=nTerm=0
11ab0 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  , pTerm=pWC->a; 
11ac0 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b  i<pWC->nTerm; i+
11ad0 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
11ae0 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
11af0 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e  Cursor != pSrc->
11b00 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e  iCursor ) contin
11b10 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
11b20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65  IsPowerOfTwo(pTe
11b30 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
11b40 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20  ~WO_EQUIV) );.  
11b50 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
11b60 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
11b70 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74  O_IN );.    test
11b80 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
11b90 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55  erator & WO_ISNU
11ba0 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  LL );.    testca
11bb0 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
11bc0 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a  ator & WO_IS );.
11bd0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
11be0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
11bf0 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69   WO_ALL );.    i
11c00 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
11c10 61 74 6f 72 20 26 20 7e 28 57 4f 5f 49 53 4e 55  ator & ~(WO_ISNU
11c20 4c 4c 7c 57 4f 5f 45 51 55 49 56 7c 57 4f 5f 49  LL|WO_EQUIV|WO_I
11c30 53 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  S))==0 ) continu
11c40 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  e;.    if( pTerm
11c50 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
11c60 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75  _VNULL ) continu
11c70 65 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a  e;.    nTerm++;.
11c80 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
11c90 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
11ca0 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63   contains only c
11cb0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 75  olumns in the cu
11cc0 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74  rrent .  ** virt
11cd0 75 61 6c 20 74 61 62 6c 65 20 74 68 65 6e 20 61  ual table then a
11ce0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
11cf0 72 20 74 68 65 20 61 4f 72 64 65 72 42 79 20 70  r the aOrderBy p
11d00 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  art of.  ** the 
11d10 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
11d20 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20  fo structure..  
11d30 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  */.  nOrderBy = 
11d40 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  0;.  if( pOrderB
11d50 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  y ){.    int n =
11d60 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
11d70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
11d80 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; i++){.      
11d90 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f  Expr *pExpr = pO
11da0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
11db0 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  pr;.      if( pE
11dc0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
11dd0 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61  MN || pExpr->iTa
11de0 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75 72 73  ble!=pSrc->iCurs
11df0 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  or ) break;.    
11e00 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 29 7b  }.    if( i==n){
11e10 0a 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20  .      nOrderBy 
11e20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = n;.    }.  }..
11e30 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    /* Allocate th
11e40 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
11e50 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20  info structure. 
11e60 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d   */.  pIdxInfo =
11e70 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
11e80 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c  Zero(pParse->db,
11e90 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66   sizeof(*pIdxInf
11ea0 6f 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o).             
11eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
11ec0 28 73 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e  (sizeof(*pIdxCon
11ed0 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73  s) + sizeof(*pUs
11ee0 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20  age))*nTerm.    
11ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f00 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28         + sizeof(
11f10 2a 70 49 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f  *pIdxOrderBy)*nO
11f20 72 64 65 72 42 79 20 29 3b 0a 20 20 69 66 28 20  rderBy );.  if( 
11f30 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  pIdxInfo==0 ){. 
11f40 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
11f50 73 67 28 70 50 61 72 73 65 2c 20 22 6f 75 74 20  sg(pParse, "out 
11f60 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20  of memory");.   
11f70 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
11f80 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
11f90 74 68 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  the structure.  
11fa0 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  The sqlite3_inde
11fb0 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
11fc0 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d   contains.  ** m
11fd0 61 6e 79 20 66 69 65 6c 64 73 20 74 68 61 74 20  any fields that 
11fe0 61 72 65 20 64 65 63 6c 61 72 65 64 20 22 63 6f  are declared "co
11ff0 6e 73 74 22 20 74 6f 20 70 72 65 76 65 6e 74 20  nst" to prevent 
12000 78 42 65 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a  xBestIndex from.
12010 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68    ** changing th
12020 65 6d 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  em.  We have to 
12030 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61  do some funky ca
12040 73 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 74  sting in order t
12050 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a  o.  ** initializ
12060 65 20 74 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a  e those fields..
12070 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20    */.  pIdxCons 
12080 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65  = (struct sqlite
12090 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
120a0 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d  nt*)&pIdxInfo[1]
120b0 3b 0a 20 20 70 49 64 78 4f 72 64 65 72 42 79 20  ;.  pIdxOrderBy 
120c0 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65  = (struct sqlite
120d0 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a  3_index_orderby*
120e0 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d  )&pIdxCons[nTerm
120f0 5d 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 28 73  ];.  pUsage = (s
12100 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
12110 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
12120 73 61 67 65 2a 29 26 70 49 64 78 4f 72 64 65 72  sage*)&pIdxOrder
12130 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20  By[nOrderBy];.  
12140 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f  *(int*)&pIdxInfo
12150 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  ->nConstraint = 
12160 6e 54 65 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29  nTerm;.  *(int*)
12170 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65  &pIdxInfo->nOrde
12180 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a  rBy = nOrderBy;.
12190 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74    *(struct sqlit
121a0 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
121b0 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  int**)&pIdxInfo-
121c0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70  >aConstraint = p
121d0 49 64 78 43 6f 6e 73 3b 0a 20 20 2a 28 73 74 72  IdxCons;.  *(str
121e0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
121f0 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70 49 64  x_orderby**)&pId
12200 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20  xInfo->aOrderBy 
12210 3d 20 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20  = pIdxOrderBy;. 
12220 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
12230 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
12240 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70 49 64 78  nt_usage**)&pIdx
12250 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
12260 74 55 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20  tUsage =.       
12270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122a0 20 20 20 20 20 20 20 20 20 20 20 20 70 55 73 61              pUsa
122b0 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  ge;..  for(i=j=0
122c0 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  , pTerm=pWC->a; 
122d0 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b  i<pWC->nTerm; i+
122e0 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
122f0 20 75 38 20 6f 70 3b 0a 20 20 20 20 69 66 28 20   u8 op;.    if( 
12300 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
12310 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73  r != pSrc->iCurs
12320 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  or ) continue;. 
12330 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77     assert( IsPow
12340 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65  erOfTwo(pTerm->e
12350 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45  Operator & ~WO_E
12360 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73  QUIV) );.    tes
12370 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
12380 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
12390 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
123a0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
123b0 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20  r & WO_IS );.   
123c0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
123d0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
123e0 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74  _ISNULL );.    t
123f0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
12400 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
12410 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  LL );.    if( (p
12420 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
12430 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f  & ~(WO_ISNULL|WO
12440 5f 45 51 55 49 56 7c 57 4f 5f 49 53 29 29 3d 3d  _EQUIV|WO_IS))==
12450 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
12460 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
12470 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
12480 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  L ) continue;.  
12490 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43    pIdxCons[j].iC
124a0 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75  olumn = pTerm->u
124b0 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  .leftColumn;.   
124c0 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65   pIdxCons[j].iTe
124d0 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20  rmOffset = i;.  
124e0 20 20 6f 70 20 3d 20 28 75 38 29 70 54 65 72 6d    op = (u8)pTerm
124f0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
12500 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 6f 70  _ALL;.    if( op
12510 3d 3d 57 4f 5f 49 4e 20 29 20 6f 70 20 3d 20 57  ==WO_IN ) op = W
12520 4f 5f 45 51 3b 0a 20 20 20 20 70 49 64 78 43 6f  O_EQ;.    pIdxCo
12530 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 6f 70 3b 0a 20  ns[j].op = op;. 
12540 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74     /* The direct
12550 20 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74   assignment in t
12560 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6e 65  he previous line
12570 20 69 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c   is possible onl
12580 79 20 62 65 63 61 75 73 65 0a 20 20 20 20 2a 2a  y because.    **
12590 20 74 68 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c   the WO_ and SQL
125a0 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
125b0 41 49 4e 54 5f 20 63 6f 64 65 73 20 61 72 65 20  AINT_ codes are 
125c0 69 64 65 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a  identical.  The.
125d0 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
125e0 20 61 73 73 65 72 74 73 20 76 65 72 69 66 79 20   asserts verify 
125f0 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20  this fact. */.  
12600 20 20 61 73 73 65 72 74 28 20 57 4f 5f 45 51 3d    assert( WO_EQ=
12610 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
12620 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 3b 0a 20  NSTRAINT_EQ );. 
12630 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 54     assert( WO_LT
12640 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
12650 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a  ONSTRAINT_LT );.
12660 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c      assert( WO_L
12670 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  E==SQLITE_INDEX_
12680 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b  CONSTRAINT_LE );
12690 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
126a0 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  GT==SQLITE_INDEX
126b0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20 29  _CONSTRAINT_GT )
126c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
126d0 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _GE==SQLITE_INDE
126e0 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20  X_CONSTRAINT_GE 
126f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
12700 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f  O_MATCH==SQLITE_
12710 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
12720 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20 20 61 73  _MATCH );.    as
12730 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70  sert( pTerm->eOp
12740 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c  erator & (WO_IN|
12750 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c  WO_EQ|WO_LT|WO_L
12760 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f  E|WO_GT|WO_GE|WO
12770 5f 4d 41 54 43 48 29 20 29 3b 0a 20 20 20 20 6a  _MATCH) );.    j
12780 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  ++;.  }.  for(i=
12790 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
127a0 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
127b0 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d  Expr = pOrderBy-
127c0 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
127d0 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e   pIdxOrderBy[i].
127e0 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d  iColumn = pExpr-
127f0 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49  >iColumn;.    pI
12800 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73  dxOrderBy[i].des
12810 63 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  c = pOrderBy->a[
12820 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
12830 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78  }..  return pIdx
12840 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Info;.}../*.** T
12850 68 65 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20  he table object 
12860 72 65 66 65 72 65 6e 63 65 20 70 61 73 73 65 64  reference passed
12870 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
12880 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
12890 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74  function.** must
128a0 20 72 65 70 72 65 73 65 6e 74 20 61 20 76 69 72   represent a vir
128b0 74 75 61 6c 20 74 61 62 6c 65 2e 20 54 68 69 73  tual table. This
128c0 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65   function invoke
128d0 73 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78  s the xBestIndex
128e0 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20  ().** method of 
128f0 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
12900 65 20 77 69 74 68 20 74 68 65 20 73 71 6c 69 74  e with the sqlit
12910 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 6f 62  e3_index_info ob
12920 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 63 6f 6d  ject that.** com
12930 65 73 20 69 6e 20 61 73 20 74 68 65 20 33 72 64  es in as the 3rd
12940 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
12950 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
12960 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
12970 63 75 72 73 2c 20 70 50 61 72 73 65 20 69 73 20  curs, pParse is 
12980 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61  populated with a
12990 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
129a0 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  and a.** non-zer
129b0 6f 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72  o value is retur
129c0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
129d0 30 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  0 is returned an
129e0 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  d the output.** 
129f0 70 61 72 74 20 6f 66 20 74 68 65 20 73 71 6c 69  part of the sqli
12a00 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
12a10 74 72 75 63 74 75 72 65 20 69 73 20 6c 65 66 74  tructure is left
12a20 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a   populated..**.*
12a30 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * Whether or not
12a40 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   an error is ret
12a50 75 72 6e 65 64 2c 20 69 74 20 69 73 20 74 68 65  urned, it is the
12a60 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
12a70 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72  of the.** caller
12a80 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   to eventually f
12a90 72 65 65 20 70 2d 3e 69 64 78 53 74 72 20 69 66  ree p->idxStr if
12aa0 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64   p->needToFreeId
12ab0 78 53 74 72 20 69 6e 64 69 63 61 74 65 73 0a 2a  xStr indicates.*
12ac0 2a 20 74 68 61 74 20 74 68 69 73 20 69 73 20 72  * that this is r
12ad0 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  equired..*/.stat
12ae0 69 63 20 69 6e 74 20 76 74 61 62 42 65 73 74 49  ic int vtabBestI
12af0 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
12b00 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  se, Table *pTab,
12b10 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
12b20 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  nfo *p){.  sqlit
12b30 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d  e3_vtab *pVtab =
12b40 20 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c   sqlite3GetVTabl
12b50 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  e(pParse->db, pT
12b60 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20 69 6e  ab)->pVtab;.  in
12b70 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  t i;.  int rc;..
12b80 20 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55    TRACE_IDX_INPU
12b90 54 53 28 70 29 3b 0a 20 20 72 63 20 3d 20 70 56  TS(p);.  rc = pV
12ba0 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42  tab->pModule->xB
12bb0 65 73 74 49 6e 64 65 78 28 70 56 74 61 62 2c 20  estIndex(pVtab, 
12bc0 70 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f  p);.  TRACE_IDX_
12bd0 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a 20 20 69  OUTPUTS(p);..  i
12be0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12bf0 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   ){.    if( rc==
12c00 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
12c10 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62        pParse->db
12c20 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
12c30 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   1;.    }else if
12c40 28 20 21 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ( !pVtab->zErrMs
12c50 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
12c60 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
12c70 65 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33  e, "%s", sqlite3
12c80 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20 20 20  ErrStr(rc));.   
12c90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
12ca0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
12cb0 61 72 73 65 2c 20 22 25 73 22 2c 20 70 56 74 61  arse, "%s", pVta
12cc0 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  b->zErrMsg);.   
12cd0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
12ce0 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72  _free(pVtab->zEr
12cf0 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e  rMsg);.  pVtab->
12d00 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20  zErrMsg = 0;..  
12d10 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
12d20 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
12d30 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 61 43 6f  .    if( !p->aCo
12d40 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62  nstraint[i].usab
12d50 6c 65 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74 72  le && p->aConstr
12d60 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67  aintUsage[i].arg
12d70 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20  vIndex>0 ){.    
12d80 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
12d90 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
12da0 20 20 20 20 20 22 74 61 62 6c 65 20 25 73 3a 20       "table %s: 
12db0 78 42 65 73 74 49 6e 64 65 78 20 72 65 74 75 72  xBestIndex retur
12dc0 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69 64 20 70  ned an invalid p
12dd0 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  lan", pTab->zNam
12de0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
12df0 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e   return pParse->
12e00 6e 45 72 72 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  nErr;.}.#endif /
12e10 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
12e20 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
12e30 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20  BLE) */..#ifdef 
12e40 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
12e50 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a  AT3_OR_STAT4./*.
12e60 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
12e70 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 70 61  location of a pa
12e80 72 74 69 63 75 6c 61 72 20 6b 65 79 20 61 6d 6f  rticular key amo
12e90 6e 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e 20 61  ng all keys in a
12ea0 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53 74 6f  n.** index.  Sto
12eb0 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
12ec0 6e 20 61 53 74 61 74 20 61 73 20 66 6f 6c 6c 6f  n aStat as follo
12ed0 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 53 74  ws:.**.**    aSt
12ee0 61 74 5b 30 5d 20 20 20 20 20 20 45 73 74 2e 20  at[0]      Est. 
12ef0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6c  number of rows l
12f00 65 73 73 20 74 68 61 6e 20 70 52 65 63 0a 2a 2a  ess than pRec.**
12f10 20 20 20 20 61 53 74 61 74 5b 31 5d 20 20 20 20      aStat[1]    
12f20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66    Est. number of
12f30 20 72 6f 77 73 20 65 71 75 61 6c 20 74 6f 20 70   rows equal to p
12f40 52 65 63 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  Rec.**.** Return
12f50 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
12f60 65 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73  e sample that is
12f70 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 73 61   the smallest sa
12f80 6d 70 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  mple that.** is 
12f90 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
12fa0 65 71 75 61 6c 20 74 6f 20 70 52 65 63 2e 20 4e  equal to pRec. N
12fb0 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 69 6e  ote that this in
12fc0 64 65 78 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e  dex is not an in
12fd0 64 65 78 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20  dex.** into the 
12fe0 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 20  aSample[] array 
12ff0 2d 20 69 74 20 69 73 20 61 6e 20 69 6e 64 65 78  - it is an index
13000 20 69 6e 74 6f 20 61 20 76 69 72 74 75 61 6c 20   into a virtual 
13010 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 0a 2a  set of samples.*
13020 2a 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  * based on the c
13030 6f 6e 74 65 6e 74 73 20 6f 66 20 61 53 61 6d 70  ontents of aSamp
13040 6c 65 5b 5d 20 61 6e 64 20 74 68 65 20 6e 75 6d  le[] and the num
13050 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e  ber of fields in
13060 20 72 65 63 6f 72 64 20 0a 2a 2a 20 70 52 65 63   record .** pRec
13070 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
13080 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 0a   whereKeyStats(.
13090 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
130a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
130b0 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
130c0 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20  tion */.  Index 
130d0 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  *pIdx,          
130e0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
130f0 6f 20 63 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69  o consider domai
13100 6e 20 6f 66 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  n of */.  Unpack
13110 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63 2c 20  edRecord *pRec, 
13120 20 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20        /* Vector 
13130 6f 66 20 76 61 6c 75 65 73 20 74 6f 20 63 6f 6e  of values to con
13140 73 69 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  sider */.  int r
13150 6f 75 6e 64 55 70 2c 20 20 20 20 20 20 20 20 20  oundUp,         
13160 20 20 20 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20         /* Round 
13170 75 70 20 69 66 20 74 72 75 65 2e 20 20 52 6f 75  up if true.  Rou
13180 6e 64 20 64 6f 77 6e 20 69 66 20 66 61 6c 73 65  nd down if false
13190 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61   */.  tRowcnt *a
131a0 53 74 61 74 20 20 20 20 20 20 20 20 20 20 20 20  Stat            
131b0 20 20 2f 2a 20 4f 55 54 3a 20 73 74 61 74 73 20    /* OUT: stats 
131c0 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
131d0 29 7b 0a 20 20 49 6e 64 65 78 53 61 6d 70 6c 65  ){.  IndexSample
131e0 20 2a 61 53 61 6d 70 6c 65 20 3d 20 70 49 64 78   *aSample = pIdx
131f0 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 69 6e 74  ->aSample;.  int
13200 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   iCol;          
13210 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
13220 78 20 6f 66 20 72 65 71 75 69 72 65 64 20 73 74  x of required st
13230 61 74 73 20 69 6e 20 61 6e 45 71 5b 5d 20 65 74  ats in anEq[] et
13240 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  c. */.  int i;  
13250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13260 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
13270 66 69 72 73 74 20 73 61 6d 70 6c 65 20 3e 3d 20  first sample >= 
13280 70 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 53  pRec */.  int iS
13290 61 6d 70 6c 65 3b 20 20 20 20 20 20 20 20 20 20  ample;          
132a0 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73        /* Smalles
132b0 74 20 73 61 6d 70 6c 65 20 6c 61 72 67 65 72 20  t sample larger 
132c0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
132d0 20 70 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69   pRec */.  int i
132e0 4d 69 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Min = 0;        
132f0 20 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65         /* Smalle
13300 73 74 20 73 61 6d 70 6c 65 20 6e 6f 74 20 79 65  st sample not ye
13310 74 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e  t tested */.  in
13320 74 20 69 54 65 73 74 3b 20 20 20 20 20 20 20 20  t iTest;        
13330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
13340 74 20 73 61 6d 70 6c 65 20 74 6f 20 74 65 73 74  t sample to test
13350 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b 20 20   */.  int res;  
13360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13370 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 63    /* Result of c
13380 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
13390 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69  ion */.  int nFi
133a0 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  eld;            
133b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
133c0 66 20 66 69 65 6c 64 73 20 69 6e 20 70 52 65 63  f fields in pRec
133d0 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 69 4c   */.  tRowcnt iL
133e0 6f 77 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ower = 0;       
133f0 20 20 2f 2a 20 61 6e 4c 74 5b 5d 20 2b 20 61 6e    /* anLt[] + an
13400 45 71 5b 5d 20 6f 66 20 6c 61 72 67 65 73 74 20  Eq[] of largest 
13410 73 61 6d 70 6c 65 20 70 52 65 63 20 69 73 20 3e  sample pRec is >
13420 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
13430 49 54 45 5f 44 45 42 55 47 0a 20 20 55 4e 55 53  ITE_DEBUG.  UNUS
13440 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20 70 50  ED_PARAMETER( pP
13450 61 72 73 65 20 29 3b 0a 23 65 6e 64 69 66 0a 20  arse );.#endif. 
13460 20 61 73 73 65 72 74 28 20 70 52 65 63 21 3d 30   assert( pRec!=0
13470 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
13480 64 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b  dx->nSample>0 );
13490 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 63 2d  .  assert( pRec-
134a0 3e 6e 46 69 65 6c 64 3e 30 20 26 26 20 70 52 65  >nField>0 && pRe
134b0 63 2d 3e 6e 46 69 65 6c 64 3c 3d 70 49 64 78 2d  c->nField<=pIdx-
134c0 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 3b 0a 0a  >nSampleCol );..
134d0 20 20 2f 2a 20 44 6f 20 61 20 62 69 6e 61 72 79    /* Do a binary
134e0 20 73 65 61 72 63 68 20 74 6f 20 66 69 6e 64 20   search to find 
134f0 74 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65  the first sample
13500 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
13510 20 65 71 75 61 6c 0a 20 20 2a 2a 20 74 6f 20 70   equal.  ** to p
13520 52 65 63 2e 20 49 66 20 70 52 65 63 20 63 6f 6e  Rec. If pRec con
13530 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 66  tains a single f
13540 69 65 6c 64 2c 20 74 68 65 20 73 65 74 20 6f 66  ield, the set of
13550 20 73 61 6d 70 6c 65 73 20 74 6f 20 73 65 61 72   samples to sear
13560 63 68 0a 20 20 2a 2a 20 69 73 20 73 69 6d 70 6c  ch.  ** is simpl
13570 79 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20  y the aSample[] 
13580 61 72 72 61 79 2e 20 49 66 20 74 68 65 20 73 61  array. If the sa
13590 6d 70 6c 65 73 20 69 6e 20 61 53 61 6d 70 6c 65  mples in aSample
135a0 5b 5d 20 63 6f 6e 74 61 69 6e 20 6d 6f 72 65 0a  [] contain more.
135b0 20 20 2a 2a 20 74 68 61 6e 20 6f 6e 65 20 66 69    ** than one fi
135c0 65 6c 64 73 2c 20 61 6c 6c 20 66 69 65 6c 64 73  elds, all fields
135d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66   following the f
135e0 69 72 73 74 20 61 72 65 20 69 67 6e 6f 72 65 64  irst are ignored
135f0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
13600 52 65 63 20 63 6f 6e 74 61 69 6e 73 20 4e 20 66  Rec contains N f
13610 69 65 6c 64 73 2c 20 77 68 65 72 65 20 4e 20 69  ields, where N i
13620 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 2c  s more than one,
13630 20 74 68 65 6e 20 61 73 20 77 65 6c 6c 20 61 73   then as well as
13640 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 70 6c 65   the.  ** sample
13650 73 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 28  s in aSample[] (
13660 74 72 75 6e 63 61 74 65 64 20 74 6f 20 4e 20 66  truncated to N f
13670 69 65 6c 64 73 29 2c 20 74 68 65 20 73 65 61 72  ields), the sear
13680 63 68 20 61 6c 73 6f 20 68 61 73 20 74 6f 0a 20  ch also has to. 
13690 20 2a 2a 20 63 6f 6e 73 69 64 65 72 20 70 72 65   ** consider pre
136a0 66 69 78 65 73 20 6f 66 20 74 68 6f 73 65 20 73  fixes of those s
136b0 61 6d 70 6c 65 73 2e 20 46 6f 72 20 65 78 61 6d  amples. For exam
136c0 70 6c 65 2c 20 69 66 20 74 68 65 20 73 65 74 20  ple, if the set 
136d0 6f 66 20 73 61 6d 70 6c 65 73 0a 20 20 2a 2a 20  of samples.  ** 
136e0 69 6e 20 61 53 61 6d 70 6c 65 20 69 73 3a 0a 20  in aSample is:. 
136f0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 61 53 61   **.  **     aSa
13700 6d 70 6c 65 5b 30 5d 20 3d 20 28 61 2c 20 35 29  mple[0] = (a, 5)
13710 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70   .  **     aSamp
13720 6c 65 5b 31 5d 20 3d 20 28 61 2c 20 31 30 29 20  le[1] = (a, 10) 
13730 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c  .  **     aSampl
13740 65 5b 32 5d 20 3d 20 28 62 2c 20 35 29 20 0a 20  e[2] = (b, 5) . 
13750 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b   **     aSample[
13760 33 5d 20 3d 20 28 63 2c 20 31 30 30 29 20 0a 20  3] = (c, 100) . 
13770 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b   **     aSample[
13780 34 5d 20 3d 20 28 63 2c 20 31 30 35 29 0a 20 20  4] = (c, 105).  
13790 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65  **.  ** Then the
137a0 20 73 65 61 72 63 68 20 73 70 61 63 65 20 73 68   search space sh
137b0 6f 75 6c 64 20 69 64 65 61 6c 6c 79 20 62 65 20  ould ideally be 
137c0 74 68 65 20 73 61 6d 70 6c 65 73 20 61 62 6f 76  the samples abov
137d0 65 20 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20  e and the .  ** 
137e0 75 6e 69 71 75 65 20 70 72 65 66 69 78 65 73 20  unique prefixes 
137f0 5b 61 5d 2c 20 5b 62 5d 20 61 6e 64 20 5b 63 5d  [a], [b] and [c]
13800 2e 20 42 75 74 20 73 69 6e 63 65 20 74 68 61 74  . But since that
13810 20 69 73 20 68 61 72 64 20 74 6f 20 6f 72 67 61   is hard to orga
13820 6e 69 7a 65 2c 20 0a 20 20 2a 2a 20 74 68 65 20  nize, .  ** the 
13830 63 6f 64 65 20 61 63 74 75 61 6c 6c 79 20 73 65  code actually se
13840 61 72 63 68 65 73 20 74 68 69 73 20 73 65 74 3a  arches this set:
13850 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 30  .  **.  **     0
13860 3a 20 28 61 29 20 0a 20 20 2a 2a 20 20 20 20 20  : (a) .  **     
13870 31 3a 20 28 61 2c 20 35 29 20 0a 20 20 2a 2a 20  1: (a, 5) .  ** 
13880 20 20 20 20 32 3a 20 28 61 2c 20 31 30 29 20 0a      2: (a, 10) .
13890 20 20 2a 2a 20 20 20 20 20 33 3a 20 28 61 2c 20    **     3: (a, 
138a0 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 34 3a  10) .  **     4:
138b0 20 28 62 29 20 0a 20 20 2a 2a 20 20 20 20 20 35   (b) .  **     5
138c0 3a 20 28 62 2c 20 35 29 20 0a 20 20 2a 2a 20 20  : (b, 5) .  **  
138d0 20 20 20 36 3a 20 28 63 29 20 0a 20 20 2a 2a 20     6: (c) .  ** 
138e0 20 20 20 20 37 3a 20 28 63 2c 20 31 30 30 29 20      7: (c, 100) 
138f0 0a 20 20 2a 2a 20 20 20 20 20 38 3a 20 28 63 2c  .  **     8: (c,
13900 20 31 30 35 29 0a 20 20 2a 2a 20 20 20 20 20 39   105).  **     9
13910 3a 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a 0a  : (c, 105).  **.
13920 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 73 61    ** For each sa
13930 6d 70 6c 65 20 69 6e 20 74 68 65 20 61 53 61 6d  mple in the aSam
13940 70 6c 65 5b 5d 20 61 72 72 61 79 2c 20 4e 20 73  ple[] array, N s
13950 61 6d 70 6c 65 73 20 61 72 65 20 70 72 65 73 65  amples are prese
13960 6e 74 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 65  nt in the.  ** e
13970 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65 20  ffective sample 
13980 61 72 72 61 79 2e 20 49 6e 20 74 68 65 20 61 62  array. In the ab
13990 6f 76 65 2c 20 73 61 6d 70 6c 65 73 20 30 20 61  ove, samples 0 a
139a0 6e 64 20 31 20 61 72 65 20 62 61 73 65 64 20 6f  nd 1 are based o
139b0 6e 20 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 20 61  n .  ** sample a
139c0 53 61 6d 70 6c 65 5b 30 5d 2e 20 53 61 6d 70 6c  Sample[0]. Sampl
139d0 65 73 20 32 20 61 6e 64 20 33 20 6f 6e 20 61 53  es 2 and 3 on aS
139e0 61 6d 70 6c 65 5b 31 5d 20 65 74 63 2e 0a 20 20  ample[1] etc..  
139f0 2a 2a 0a 20 20 2a 2a 20 4f 66 74 65 6e 2c 20 73  **.  ** Often, s
13a00 61 6d 70 6c 65 20 69 20 6f 66 20 65 61 63 68 20  ample i of each 
13a10 62 6c 6f 63 6b 20 6f 66 20 4e 20 65 66 66 65 63  block of N effec
13a20 74 69 76 65 20 73 61 6d 70 6c 65 73 20 68 61 73  tive samples has
13a30 20 28 69 2b 31 29 20 66 69 65 6c 64 73 2e 0a 20   (i+1) fields.. 
13a40 20 2a 2a 20 45 78 63 65 70 74 2c 20 65 61 63 68   ** Except, each
13a50 20 73 61 6d 70 6c 65 20 6d 61 79 20 62 65 20 65   sample may be e
13a60 78 74 65 6e 64 65 64 20 74 6f 20 65 6e 73 75 72  xtended to ensur
13a70 65 20 74 68 61 74 20 69 74 20 69 73 20 67 72 65  e that it is gre
13a80 61 74 65 72 20 74 68 61 6e 20 6f 72 0a 20 20 2a  ater than or.  *
13a90 2a 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 70  * equal to the p
13aa0 72 65 76 69 6f 75 73 20 73 61 6d 70 6c 65 20 69  revious sample i
13ab0 6e 20 74 68 65 20 61 72 72 61 79 2e 20 46 6f 72  n the array. For
13ac0 20 65 78 61 6d 70 6c 65 2c 20 69 6e 20 74 68 65   example, in the
13ad0 20 61 62 6f 76 65 2c 20 0a 20 20 2a 2a 20 73 61   above, .  ** sa
13ae0 6d 70 6c 65 20 32 20 69 73 20 74 68 65 20 66 69  mple 2 is the fi
13af0 72 73 74 20 73 61 6d 70 6c 65 20 6f 66 20 61 20  rst sample of a 
13b00 62 6c 6f 63 6b 20 6f 66 20 4e 20 73 61 6d 70 6c  block of N sampl
13b10 65 73 2c 20 73 6f 20 61 74 20 66 69 72 73 74 20  es, so at first 
13b20 69 74 20 0a 20 20 2a 2a 20 61 70 70 65 61 72 73  it .  ** appears
13b30 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20   that it should 
13b40 62 65 20 31 20 66 69 65 6c 64 20 69 6e 20 73 69  be 1 field in si
13b50 7a 65 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 61  ze. However, tha
13b60 74 20 77 6f 75 6c 64 20 6d 61 6b 65 20 69 74 20  t would make it 
13b70 0a 20 20 2a 2a 20 73 6d 61 6c 6c 65 72 20 74 68  .  ** smaller th
13b80 61 6e 20 73 61 6d 70 6c 65 20 31 2c 20 73 6f 20  an sample 1, so 
13b90 74 68 65 20 62 69 6e 61 72 79 20 73 65 61 72 63  the binary searc
13ba0 68 20 77 6f 75 6c 64 20 6e 6f 74 20 77 6f 72 6b  h would not work
13bb0 2e 20 41 73 20 61 20 72 65 73 75 6c 74 2c 20 0a  . As a result, .
13bc0 20 20 2a 2a 20 69 74 20 69 73 20 65 78 74 65 6e    ** it is exten
13bd0 64 65 64 20 74 6f 20 74 77 6f 20 66 69 65 6c 64  ded to two field
13be0 73 2e 20 54 68 65 20 64 75 70 6c 69 63 61 74 65  s. The duplicate
13bf0 73 20 74 68 61 74 20 74 68 69 73 20 63 72 65 61  s that this crea
13c00 74 65 73 20 64 6f 20 6e 6f 74 20 0a 20 20 2a 2a  tes do not .  **
13c10 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c   cause any probl
13c20 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 6e 46 69 65  ems..  */.  nFie
13c30 6c 64 20 3d 20 70 52 65 63 2d 3e 6e 46 69 65 6c  ld = pRec->nFiel
13c40 64 3b 0a 20 20 69 43 6f 6c 20 3d 20 30 3b 0a 20  d;.  iCol = 0;. 
13c50 20 69 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d   iSample = pIdx-
13c60 3e 6e 53 61 6d 70 6c 65 20 2a 20 6e 46 69 65 6c  >nSample * nFiel
13c70 64 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 6e 74  d;.  do{.    int
13c80 20 69 53 61 6d 70 3b 20 20 20 20 20 20 20 20 20   iSamp;         
13c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
13ca0 64 65 78 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d  dex in aSample[]
13cb0 20 6f 66 20 74 65 73 74 20 73 61 6d 70 6c 65 20   of test sample 
13cc0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 3b 20 20 20  */.    int n;   
13cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ce0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
13cf0 66 20 66 69 65 6c 64 73 20 69 6e 20 74 65 73 74  f fields in test
13d00 20 73 61 6d 70 6c 65 20 2a 2f 0a 0a 20 20 20 20   sample */..    
13d10 69 54 65 73 74 20 3d 20 28 69 4d 69 6e 2b 69 53  iTest = (iMin+iS
13d20 61 6d 70 6c 65 29 2f 32 3b 0a 20 20 20 20 69 53  ample)/2;.    iS
13d30 61 6d 70 20 3d 20 69 54 65 73 74 20 2f 20 6e 46  amp = iTest / nF
13d40 69 65 6c 64 3b 0a 20 20 20 20 69 66 28 20 69 53  ield;.    if( iS
13d50 61 6d 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f  amp>0 ){.      /
13d60 2a 20 54 68 65 20 70 72 6f 70 6f 73 65 64 20 65  * The proposed e
13d70 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65 20  ffective sample 
13d80 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 73  is a prefix of s
13d90 61 6d 70 6c 65 20 61 53 61 6d 70 6c 65 5b 69 53  ample aSample[iS
13da0 61 6d 70 5d 2e 0a 20 20 20 20 20 20 2a 2a 20 53  amp]..      ** S
13db0 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65  pecifically, the
13dc0 20 73 68 6f 72 74 65 73 74 20 70 72 65 66 69 78   shortest prefix
13dd0 20 6f 66 20 61 74 20 6c 65 61 73 74 20 28 31 20   of at least (1 
13de0 2b 20 69 54 65 73 74 25 6e 46 69 65 6c 64 29 20  + iTest%nField) 
13df0 0a 20 20 20 20 20 20 2a 2a 20 66 69 65 6c 64 73  .      ** fields
13e00 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65 72   that is greater
13e10 20 74 68 61 6e 20 74 68 65 20 70 72 65 76 69 6f   than the previo
13e20 75 73 20 65 66 66 65 63 74 69 76 65 20 73 61 6d  us effective sam
13e30 70 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66  ple.  */.      f
13e40 6f 72 28 6e 3d 28 69 54 65 73 74 20 25 20 6e 46  or(n=(iTest % nF
13e50 69 65 6c 64 29 20 2b 20 31 3b 20 6e 3c 6e 46 69  ield) + 1; n<nFi
13e60 65 6c 64 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20  eld; n++){.     
13e70 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69     if( aSample[i
13e80 53 61 6d 70 2d 31 5d 2e 61 6e 4c 74 5b 6e 2d 31  Samp-1].anLt[n-1
13e90 5d 21 3d 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70  ]!=aSample[iSamp
13ea0 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 20 29 20 62 72  ].anLt[n-1] ) br
13eb0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
13ec0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20   }else{.      n 
13ed0 3d 20 69 54 65 73 74 20 2b 20 31 3b 0a 20 20 20  = iTest + 1;.   
13ee0 20 7d 0a 0a 20 20 20 20 70 52 65 63 2d 3e 6e 46   }..    pRec->nF
13ef0 69 65 6c 64 20 3d 20 6e 3b 0a 20 20 20 20 72 65  ield = n;.    re
13f00 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  s = sqlite3VdbeR
13f10 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61  ecordCompare(aSa
13f20 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 6e 2c 20 61  mple[iSamp].n, a
13f30 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 70 2c  Sample[iSamp].p,
13f40 20 70 52 65 63 29 3b 0a 20 20 20 20 69 66 28 20   pRec);.    if( 
13f50 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69  res<0 ){.      i
13f60 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b  Lower = aSample[
13f70 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d  iSamp].anLt[n-1]
13f80 20 2b 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70   + aSample[iSamp
13f90 5d 2e 61 6e 45 71 5b 6e 2d 31 5d 3b 0a 20 20 20  ].anEq[n-1];.   
13fa0 20 20 20 69 4d 69 6e 20 3d 20 69 54 65 73 74 2b     iMin = iTest+
13fb0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
13fc0 20 72 65 73 3d 3d 30 20 26 26 20 6e 3c 6e 46 69   res==0 && n<nFi
13fd0 65 6c 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f  eld ){.      iLo
13fe0 77 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 53  wer = aSample[iS
13ff0 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 3b 0a  amp].anLt[n-1];.
14000 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 54 65        iMin = iTe
14010 73 74 2b 31 3b 0a 20 20 20 20 20 20 72 65 73 20  st+1;.      res 
14020 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = -1;.    }else{
14030 0a 20 20 20 20 20 20 69 53 61 6d 70 6c 65 20 3d  .      iSample =
14040 20 69 54 65 73 74 3b 0a 20 20 20 20 20 20 69 43   iTest;.      iC
14050 6f 6c 20 3d 20 6e 2d 31 3b 0a 20 20 20 20 7d 0a  ol = n-1;.    }.
14060 20 20 7d 77 68 69 6c 65 28 20 72 65 73 20 26 26    }while( res &&
14070 20 69 4d 69 6e 3c 69 53 61 6d 70 6c 65 20 29 3b   iMin<iSample );
14080 0a 20 20 69 20 3d 20 69 53 61 6d 70 6c 65 20 2f  .  i = iSample /
14090 20 6e 46 69 65 6c 64 3b 0a 0a 23 69 66 64 65 66   nField;..#ifdef
140a0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
140b0 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
140c0 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e   assert statemen
140d0 74 73 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  ts check that th
140e0 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20  e binary search 
140f0 63 6f 64 65 0a 20 20 2a 2a 20 61 62 6f 76 65 20  code.  ** above 
14100 66 6f 75 6e 64 20 74 68 65 20 72 69 67 68 74 20  found the right 
14110 61 6e 73 77 65 72 2e 20 54 68 69 73 20 62 6c 6f  answer. This blo
14120 63 6b 20 73 65 72 76 65 73 20 6e 6f 20 70 75 72  ck serves no pur
14130 70 6f 73 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20  pose other.  ** 
14140 74 68 61 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74  than to invoke t
14150 68 65 20 61 73 73 65 72 74 73 2e 20 20 2a 2f 0a  he asserts.  */.
14160 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
14170 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
14180 30 20 29 7b 0a 20 20 20 20 69 66 28 20 72 65 73  0 ){.    if( res
14190 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
141a0 49 66 20 28 72 65 73 3d 3d 30 29 20 69 73 20 74  If (res==0) is t
141b0 72 75 65 2c 20 74 68 65 6e 20 70 52 65 63 20 6d  rue, then pRec m
141c0 75 73 74 20 62 65 20 65 71 75 61 6c 20 74 6f 20  ust be equal to 
141d0 73 61 6d 70 6c 65 20 69 2e 20 2a 2f 0a 20 20 20  sample i. */.   
141e0 20 20 20 61 73 73 65 72 74 28 20 69 3c 70 49 64     assert( i<pId
141f0 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20  x->nSample );.  
14200 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
14210 3d 3d 6e 46 69 65 6c 64 2d 31 20 29 3b 0a 20 20  ==nField-1 );.  
14220 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64      pRec->nField
14230 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 20   = nField;.     
14240 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69   assert( 0==sqli
14250 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
14260 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e  pare(aSample[i].
14270 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c  n, aSample[i].p,
14280 20 70 52 65 63 29 20 0a 20 20 20 20 20 20 20 20   pRec) .        
14290 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62     || pParse->db
142a0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 0a  ->mallocFailed .
142b0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c        );.    }el
142c0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 55 6e 6c  se{.      /* Unl
142d0 65 73 73 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61  ess i==pIdx->nSa
142e0 6d 70 6c 65 2c 20 69 6e 64 69 63 61 74 69 6e 67  mple, indicating
142f0 20 74 68 61 74 20 70 52 65 63 20 69 73 20 6c 61   that pRec is la
14300 72 67 65 72 20 74 68 61 6e 0a 20 20 20 20 20 20  rger than.      
14310 2a 2a 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20 69  ** all samples i
14320 6e 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20  n the aSample[] 
14330 61 72 72 61 79 2c 20 70 52 65 63 20 6d 75 73 74  array, pRec must
14340 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   be smaller than
14350 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 28 69   the.      ** (i
14360 43 6f 6c 2b 31 29 20 66 69 65 6c 64 20 70 72 65  Col+1) field pre
14370 66 69 78 20 6f 66 20 73 61 6d 70 6c 65 20 69 2e  fix of sample i.
14380 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
14390 74 28 20 69 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d  t( i<=pIdx->nSam
143a0 70 6c 65 20 26 26 20 69 3e 3d 30 20 29 3b 0a 20  ple && i>=0 );. 
143b0 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c       pRec->nFiel
143c0 64 20 3d 20 69 43 6f 6c 2b 31 3b 0a 20 20 20 20  d = iCol+1;.    
143d0 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70 49 64    assert( i==pId
143e0 78 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20  x->nSample .    
143f0 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
14400 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
14410 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c  re(aSample[i].n,
14420 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70   aSample[i].p, p
14430 52 65 63 29 3e 30 0a 20 20 20 20 20 20 20 20 20  Rec)>0.         
14440 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d    || pParse->db-
14450 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
14460 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 69 3d  ..      /* if i=
14470 3d 30 20 61 6e 64 20 69 43 6f 6c 3d 3d 30 2c 20  =0 and iCol==0, 
14480 74 68 65 6e 20 72 65 63 6f 72 64 20 70 52 65 63  then record pRec
14490 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
144a0 20 61 6c 6c 20 73 61 6d 70 6c 65 73 0a 20 20 20   all samples.   
144b0 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 61 53 61     ** in the aSa
144c0 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2e 20 4f 74  mple[] array. Ot
144d0 68 65 72 77 69 73 65 2c 20 69 66 20 28 69 43 6f  herwise, if (iCo
144e0 6c 3e 30 29 20 74 68 65 6e 20 70 52 65 63 20 6d  l>0) then pRec m
144f0 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20  ust.      ** be 
14500 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
14510 65 71 75 61 6c 20 74 6f 20 74 68 65 20 28 69 43  equal to the (iC
14520 6f 6c 29 20 66 69 65 6c 64 20 70 72 65 66 69 78  ol) field prefix
14530 20 6f 66 20 73 61 6d 70 6c 65 20 69 2e 0a 20 20   of sample i..  
14540 20 20 20 20 2a 2a 20 49 66 20 28 69 3e 30 29 2c      ** If (i>0),
14550 20 74 68 65 6e 20 70 52 65 63 20 6d 75 73 74 20   then pRec must 
14560 61 6c 73 6f 20 62 65 20 67 72 65 61 74 65 72 20  also be greater 
14570 74 68 61 6e 20 73 61 6d 70 6c 65 20 28 69 2d 31  than sample (i-1
14580 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ).  */.      if(
14590 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20   iCol>0 ){.     
145a0 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20     pRec->nField 
145b0 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  = iCol;.        
145c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56  assert( sqlite3V
145d0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
145e0 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61  (aSample[i].n, a
145f0 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65  Sample[i].p, pRe
14600 63 29 3c 3d 30 0a 20 20 20 20 20 20 20 20 20 20  c)<=0.          
14610 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62     || pParse->db
14620 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
14630 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14640 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20  if( i>0 ){.     
14650 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20     pRec->nField 
14660 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 20 20  = nField;.      
14670 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
14680 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
14690 72 65 28 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e  re(aSample[i-1].
146a0 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e  n, aSample[i-1].
146b0 70 2c 20 70 52 65 63 29 3c 30 0a 20 20 20 20 20  p, pRec)<0.     
146c0 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73          || pPars
146d0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
146e0 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  led );.      }. 
146f0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
14700 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /* ifdef SQLITE_
14710 44 45 42 55 47 20 2a 2f 0a 0a 20 20 69 66 28 20  DEBUG */..  if( 
14720 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  res==0 ){.    /*
14730 20 52 65 63 6f 72 64 20 70 52 65 63 20 69 73 20   Record pRec is 
14740 65 71 75 61 6c 20 74 6f 20 73 61 6d 70 6c 65 20  equal to sample 
14750 69 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  i */.    assert(
14760 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20   iCol==nField-1 
14770 29 3b 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20  );.    aStat[0] 
14780 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c  = aSample[i].anL
14790 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 61 53 74  t[iCol];.    aSt
147a0 61 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b  at[1] = aSample[
147b0 69 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20  i].anEq[iCol];. 
147c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41   }else{.    /* A
147d0 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  t this point, th
147e0 65 20 28 69 43 6f 6c 2b 31 29 20 66 69 65 6c 64  e (iCol+1) field
147f0 20 70 72 65 66 69 78 20 6f 66 20 61 53 61 6d 70   prefix of aSamp
14800 6c 65 5b 69 5d 20 69 73 20 74 68 65 20 66 69 72  le[i] is the fir
14810 73 74 20 0a 20 20 20 20 2a 2a 20 73 61 6d 70 6c  st .    ** sampl
14820 65 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65  e that is greate
14830 72 20 74 68 61 6e 20 70 52 65 63 2e 20 4f 72 2c  r than pRec. Or,
14840 20 69 66 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61   if i==pIdx->nSa
14850 6d 70 6c 65 20 74 68 65 6e 20 70 52 65 63 0a 20  mple then pRec. 
14860 20 20 20 2a 2a 20 69 73 20 6c 61 72 67 65 72 20     ** is larger 
14870 74 68 61 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73  than all samples
14880 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e 20 2a   in the array. *
14890 2f 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55  /.    tRowcnt iU
148a0 70 70 65 72 2c 20 69 47 61 70 3b 0a 20 20 20 20  pper, iGap;.    
148b0 69 66 28 20 69 3e 3d 70 49 64 78 2d 3e 6e 53 61  if( i>=pIdx->nSa
148c0 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 55  mple ){.      iU
148d0 70 70 65 72 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pper = sqlite3Lo
148e0 67 45 73 74 54 6f 49 6e 74 28 70 49 64 78 2d 3e  gEstToInt(pIdx->
148f0 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b  aiRowLogEst[0]);
14900 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14910 20 20 69 55 70 70 65 72 20 3d 20 61 53 61 6d 70    iUpper = aSamp
14920 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d  le[i].anLt[iCol]
14930 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
14940 20 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72 20   iLower>=iUpper 
14950 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20  ){.      iGap = 
14960 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
14970 20 20 20 20 69 47 61 70 20 3d 20 69 55 70 70 65      iGap = iUppe
14980 72 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20  r - iLower;.    
14990 7d 0a 20 20 20 20 69 66 28 20 72 6f 75 6e 64 55  }.    if( roundU
149a0 70 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20  p ){.      iGap 
149b0 3d 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20 20  = (iGap*2)/3;.  
149c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
149d0 47 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20 20  Gap = iGap/3;.  
149e0 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 30 5d    }.    aStat[0]
149f0 20 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47 61 70   = iLower + iGap
14a00 3b 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d  ;.    aStat[1] =
14a10 20 70 49 64 78 2d 3e 61 41 76 67 45 71 5b 69 43   pIdx->aAvgEq[iC
14a20 6f 6c 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ol];.  }..  /* R
14a30 65 73 74 6f 72 65 20 74 68 65 20 70 52 65 63 2d  estore the pRec-
14a40 3e 6e 46 69 65 6c 64 20 76 61 6c 75 65 20 62 65  >nField value be
14a50 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
14a60 20 2a 2f 0a 20 20 70 52 65 63 2d 3e 6e 46 69 65   */.  pRec->nFie
14a70 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 72  ld = nField;.  r
14a80 65 74 75 72 6e 20 69 3b 0a 7d 0a 23 65 6e 64 69  eturn i;.}.#endi
14a90 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
14aa0 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
14ab0 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 69  4 */../*.** If i
14ac0 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 70  t is not NULL, p
14ad0 54 65 72 6d 20 69 73 20 61 20 74 65 72 6d 20 74  Term is a term t
14ae0 68 61 74 20 70 72 6f 76 69 64 65 73 20 61 6e 20  hat provides an 
14af0 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 0a 2a  upper or lower.*
14b00 2a 20 62 6f 75 6e 64 20 6f 6e 20 61 20 72 61 6e  * bound on a ran
14b10 67 65 20 73 63 61 6e 2e 20 57 69 74 68 6f 75 74  ge scan. Without
14b20 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 70 54 65   considering pTe
14b30 72 6d 2c 20 69 74 20 69 73 20 65 73 74 69 6d 61  rm, it is estima
14b40 74 65 64 20 0a 2a 2a 20 74 68 61 74 20 74 68 65  ted .** that the
14b50 20 73 63 61 6e 20 77 69 6c 6c 20 76 69 73 69 74   scan will visit
14b60 20 6e 4e 65 77 20 72 6f 77 73 2e 20 54 68 69 73   nNew rows. This
14b70 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
14b80 73 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20  s the number.** 
14b90 65 73 74 69 6d 61 74 65 64 20 74 6f 20 62 65 20  estimated to be 
14ba0 76 69 73 69 74 65 64 20 61 66 74 65 72 20 74 61  visited after ta
14bb0 6b 69 6e 67 20 70 54 65 72 6d 20 69 6e 74 6f 20  king pTerm into 
14bc0 61 63 63 6f 75 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  account..**.** I
14bd0 66 20 74 68 65 20 75 73 65 72 20 65 78 70 6c 69  f the user expli
14be0 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20  citly specified 
14bf0 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76  a likelihood() v
14c00 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 74 65  alue for this te
14c10 72 6d 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  rm,.** then the 
14c20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
14c30 74 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6d  the likelihood m
14c40 75 6c 74 69 70 6c 69 65 64 20 62 79 20 74 68 65  ultiplied by the
14c50 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 69 6e   number of.** in
14c60 70 75 74 20 72 6f 77 73 2e 20 4f 74 68 65 72 77  put rows. Otherw
14c70 69 73 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ise, this functi
14c80 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  on assumes that 
14c90 61 6e 20 22 49 53 20 4e 4f 54 20 4e 55 4c 4c 22  an "IS NOT NULL"
14ca0 20 74 65 72 6d 0a 2a 2a 20 68 61 73 20 61 20 6c   term.** has a l
14cb0 69 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 35  ikelihood of 0.5
14cc0 30 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72  0, and any other
14cd0 20 74 65 72 6d 20 61 20 6c 69 6b 65 6c 69 68 6f   term a likeliho
14ce0 6f 64 20 6f 66 20 30 2e 32 35 2e 0a 2a 2f 0a 73  od of 0.25..*/.s
14cf0 74 61 74 69 63 20 4c 6f 67 45 73 74 20 77 68 65  tatic LogEst whe
14d00 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28 57 68  reRangeAdjust(Wh
14d10 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
14d20 4c 6f 67 45 73 74 20 6e 4e 65 77 29 7b 0a 20 20  LogEst nNew){.  
14d30 4c 6f 67 45 73 74 20 6e 52 65 74 20 3d 20 6e 4e  LogEst nRet = nN
14d40 65 77 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20  ew;.  if( pTerm 
14d50 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ){.    if( pTerm
14d60 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 29  ->truthProb<=0 )
14d70 7b 0a 20 20 20 20 20 20 6e 52 65 74 20 2b 3d 20  {.      nRet += 
14d80 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
14d90 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
14da0 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
14db0 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
14dc0 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 74 20 2d   ){.      nRet -
14dd0 3d 20 32 30 3b 20 20 20 20 20 20 20 20 61 73 73  = 20;        ass
14de0 65 72 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33  ert( 20==sqlite3
14df0 4c 6f 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20  LogEst(4) );.   
14e00 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
14e10 6e 52 65 74 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  nRet;.}..#ifdef 
14e20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
14e30 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 20  AT3_OR_STAT4./* 
14e40 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
14e50 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65  n is called to e
14e60 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
14e70 65 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74  er of rows visit
14e80 65 64 20 62 79 20 61 0a 2a 2a 20 72 61 6e 67 65  ed by a.** range
14e90 2d 73 63 61 6e 20 6f 6e 20 61 20 73 6b 69 70 2d  -scan on a skip-
14ea0 73 63 61 6e 20 69 6e 64 65 78 2e 20 46 6f 72 20  scan index. For 
14eb0 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  example:.**.**  
14ec0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
14ed0 20 4f 4e 20 74 31 28 61 2c 20 62 2c 20 63 29 3b   ON t1(a, b, c);
14ee0 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46  .**   SELECT * F
14ef0 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 3f  ROM t1 WHERE a=?
14f00 20 41 4e 44 20 63 20 42 45 54 57 45 45 4e 20 3f   AND c BETWEEN ?
14f10 20 41 4e 44 20 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61   AND ?;.**.** Va
14f20 6c 75 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20  lue pLoop->nOut 
14f30 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74  is currently set
14f40 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65   to the estimate
14f50 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  d number of rows
14f60 20 0a 2a 2a 20 76 69 73 69 74 65 64 20 66 6f 72   .** visited for
14f70 20 73 63 61 6e 6e 69 6e 67 20 28 61 3d 3f 20 41   scanning (a=? A
14f80 4e 44 20 62 3d 3f 29 2e 20 54 68 69 73 20 66 75  ND b=?). This fu
14f90 6e 63 74 69 6f 6e 20 72 65 64 75 63 65 73 20 74  nction reduces t
14fa0 68 61 74 20 65 73 74 69 6d 61 74 65 20 0a 2a 2a  hat estimate .**
14fb0 20 62 79 20 73 6f 6d 65 20 66 61 63 74 6f 72 20   by some factor 
14fc0 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74  to account for t
14fd0 68 65 20 28 63 20 42 45 54 57 45 45 4e 20 3f 20  he (c BETWEEN ? 
14fe0 41 4e 44 20 3f 29 20 65 78 70 72 65 73 73 69 6f  AND ?) expressio
14ff0 6e 20 62 61 73 65 64 0a 2a 2a 20 6f 6e 20 74 68  n based.** on th
15000 65 20 73 74 61 74 34 20 64 61 74 61 20 66 6f 72  e stat4 data for
15010 20 74 68 65 20 69 6e 64 65 78 2e 20 74 68 69 73   the index. this
15020 20 73 63 61 6e 20 77 69 6c 6c 20 62 65 20 70 65   scan will be pe
15030 66 6f 72 6d 65 64 20 6d 75 6c 74 69 70 6c 65 20  formed multiple 
15040 0a 2a 2a 20 74 69 6d 65 73 20 28 6f 6e 63 65 20  .** times (once 
15050 66 6f 72 20 65 61 63 68 20 28 61 2c 62 29 20 63  for each (a,b) c
15060 6f 6d 62 69 6e 61 74 69 6f 6e 20 74 68 61 74 20  ombination that 
15070 6d 61 74 63 68 65 73 20 61 3d 3f 29 20 69 73 20  matches a=?) is 
15080 64 65 61 6c 74 20 77 69 74 68 20 0a 2a 2a 20 62  dealt with .** b
15090 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  y the caller..**
150a0 0a 2a 2a 20 49 74 20 64 6f 65 73 20 74 68 69 73  .** It does this
150b0 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 74 68 72   by scanning thr
150c0 6f 75 67 68 20 61 6c 6c 20 73 74 61 74 34 20 73  ough all stat4 s
150d0 61 6d 70 6c 65 73 2c 20 63 6f 6d 70 61 72 69 6e  amples, comparin
150e0 67 20 76 61 6c 75 65 73 0a 2a 2a 20 65 78 74 72  g values.** extr
150f0 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65  acted from pLowe
15100 72 20 61 6e 64 20 70 55 70 70 65 72 20 77 69 74  r and pUpper wit
15110 68 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  h the correspond
15120 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 61  ing column in ea
15130 63 68 0a 2a 2a 20 73 61 6d 70 6c 65 2e 20 49 66  ch.** sample. If
15140 20 4c 20 61 6e 64 20 55 20 61 72 65 20 74 68 65   L and U are the
15150 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c   number of sampl
15160 65 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 6c  es found to be l
15170 65 73 73 20 74 68 61 6e 20 6f 72 0a 2a 2a 20 65  ess than or.** e
15180 71 75 61 6c 20 74 6f 20 74 68 65 20 76 61 6c 75  qual to the valu
15190 65 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  es extracted fro
151a0 6d 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  m pLower and pUp
151b0 70 65 72 20 72 65 73 70 65 63 74 69 76 65 6c 79  per respectively
151c0 2c 20 61 6e 64 0a 2a 2a 20 4e 20 69 73 20 74 68  , and.** N is th
151d0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
151e0 66 20 73 61 6d 70 6c 65 73 2c 20 74 68 65 20 70  f samples, the p
151f0 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 76 61 6c 75 65  Loop->nOut value
15200 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20   is adjusted.** 
15210 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
15220 2a 20 20 20 6e 4f 75 74 20 3d 20 6e 4f 75 74 20  *   nOut = nOut 
15230 2a 20 28 20 6d 69 6e 28 55 20 2d 20 4c 2c 20 31  * ( min(U - L, 1
15240 29 20 2f 20 4e 20 29 0a 2a 2a 0a 2a 2a 20 49 66  ) / N ).**.** If
15250 20 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 2c   pLower is NULL,
15260 20 6f 72 20 61 20 76 61 6c 75 65 20 63 61 6e 6e   or a value cann
15270 6f 74 20 62 65 20 65 78 74 72 61 63 74 65 64 20  ot be extracted 
15280 66 72 6f 6d 20 74 68 65 20 74 65 72 6d 2c 20 4c  from the term, L
15290 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 7a 65   is.** set to ze
152a0 72 6f 2e 20 49 66 20 70 55 70 70 65 72 20 69 73  ro. If pUpper is
152b0 20 4e 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75   NULL, or a valu
152c0 65 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72  e cannot be extr
152d0 61 63 74 65 64 20 66 72 6f 6d 20 69 74 2c 0a 2a  acted from it,.*
152e0 2a 20 55 20 69 73 20 73 65 74 20 74 6f 20 4e 2e  * U is set to N.
152f0 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
15300 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
15310 65 74 73 20 2a 70 62 44 6f 6e 65 20 74 6f 20 31  ets *pbDone to 1
15320 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
15330 67 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69  g. However,.** i
15340 66 20 6e 6f 20 76 61 6c 75 65 20 63 61 6e 20 62  f no value can b
15350 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
15360 20 65 69 74 68 65 72 20 70 4c 6f 77 65 72 20 6f   either pLower o
15370 72 20 70 55 70 70 65 72 20 28 61 6e 64 20 73 6f  r pUpper (and so
15380 20 74 68 65 0a 2a 2a 20 65 73 74 69 6d 61 74 65   the.** estimate
15390 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
153a0 66 20 72 6f 77 73 20 64 65 6c 69 76 65 72 65 64  f rows delivered
153b0 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67   remains unchang
153c0 65 64 29 2c 20 2a 70 62 44 6f 6e 65 0a 2a 2a 20  ed), *pbDone.** 
153d0 69 73 20 6c 65 66 74 20 61 73 20 69 73 2e 0a 2a  is left as is..*
153e0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
153f0 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69   occurs, an SQLi
15400 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
15410 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
15420 77 69 73 65 2c 20 0a 2a 2a 20 53 51 4c 49 54 45  wise, .** SQLITE
15430 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
15440 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69  nt whereRangeSki
15450 70 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  pScanEst(.  Pars
15460 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
15470 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
15480 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
15490 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
154a0 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20  Term *pLower,   
154b0 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f  /* Lower bound o
154c0 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a  n the range. ex:
154d0 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62   "x>123" Might b
154e0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72  e NULL */.  Wher
154f0 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20  eTerm *pUpper,  
15500 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20   /* Upper bound 
15510 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78  on the range. ex
15520 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20  : "x<455" Might 
15530 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65  be NULL */.  Whe
15540 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20  reLoop *pLoop,  
15550 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
15560 2e 6e 4f 75 74 20 76 61 6c 75 65 20 6f 66 20 74  .nOut value of t
15570 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  his loop */.  in
15580 74 20 2a 70 62 44 6f 6e 65 20 20 20 20 20 20 20  t *pbDone       
15590 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75     /* Set to tru
155a0 65 20 69 66 20 61 74 20 6c 65 61 73 74 20 6f 6e  e if at least on
155b0 65 20 65 78 70 72 2e 20 76 61 6c 75 65 20 65 78  e expr. value ex
155c0 74 72 61 63 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  tracted */.){.  
155d0 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70  Index *p = pLoop
155e0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
155f0 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c  ;.  int nEq = pL
15600 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
15610 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
15620 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
15630 69 6e 74 20 6e 4c 6f 77 65 72 20 3d 20 2d 31 3b  int nLower = -1;
15640 0a 20 20 69 6e 74 20 6e 55 70 70 65 72 20 3d 20  .  int nUpper = 
15650 70 2d 3e 6e 53 61 6d 70 6c 65 2b 31 3b 0a 20 20  p->nSample+1;.  
15660 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
15670 4f 4b 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d  OK;.  int iCol =
15680 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71   p->aiColumn[nEq
15690 5d 3b 0a 20 20 75 38 20 61 66 66 20 3d 20 69 43  ];.  u8 aff = iC
156a0 6f 6c 3e 3d 30 20 3f 20 70 2d 3e 70 54 61 62 6c  ol>=0 ? p->pTabl
156b0 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66  e->aCol[iCol].af
156c0 66 69 6e 69 74 79 20 3a 20 53 51 4c 49 54 45 5f  finity : SQLITE_
156d0 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 43  AFF_INTEGER;.  C
156e0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
156f0 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   .  sqlite3_valu
15700 65 20 2a 70 31 20 3d 20 30 3b 20 20 20 20 20 20  e *p1 = 0;      
15710 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74      /* Value ext
15720 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77  racted from pLow
15730 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  er */.  sqlite3_
15740 76 61 6c 75 65 20 2a 70 32 20 3d 20 30 3b 20 20  value *p2 = 0;  
15750 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
15760 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
15770 70 55 70 70 65 72 20 2a 2f 0a 20 20 73 71 6c 69  pUpper */.  sqli
15780 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20  te3_value *pVal 
15790 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 56  = 0;        /* V
157a0 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20 66  alue extracted f
157b0 72 6f 6d 20 72 65 63 6f 72 64 20 2a 2f 0a 0a 20  rom record */.. 
157c0 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
157d0 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
157e0 61 72 73 65 2c 20 70 2d 3e 61 7a 43 6f 6c 6c 5b  arse, p->azColl[
157f0 6e 45 71 5d 29 3b 0a 20 20 69 66 28 20 70 4c 6f  nEq]);.  if( pLo
15800 77 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  wer ){.    rc = 
15810 73 71 6c 69 74 65 33 53 74 61 74 34 56 61 6c 75  sqlite3Stat4Valu
15820 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65  eFromExpr(pParse
15830 2c 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d  , pLower->pExpr-
15840 3e 70 52 69 67 68 74 2c 20 61 66 66 2c 20 26 70  >pRight, aff, &p
15850 31 29 3b 0a 20 20 20 20 6e 4c 6f 77 65 72 20 3d  1);.    nLower =
15860 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 55   0;.  }.  if( pU
15870 70 70 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49  pper && rc==SQLI
15880 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
15890 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 56 61  = sqlite3Stat4Va
158a0 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72  lueFromExpr(pPar
158b0 73 65 2c 20 70 55 70 70 65 72 2d 3e 70 45 78 70  se, pUpper->pExp
158c0 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 2c 20  r->pRight, aff, 
158d0 26 70 32 29 3b 0a 20 20 20 20 6e 55 70 70 65 72  &p2);.    nUpper
158e0 20 3d 20 70 32 20 3f 20 30 20 3a 20 70 2d 3e 6e   = p2 ? 0 : p->n
158f0 53 61 6d 70 6c 65 3b 0a 20 20 7d 0a 0a 20 20 69  Sample;.  }..  i
15900 66 28 20 70 31 20 7c 7c 20 70 32 20 29 7b 0a 20  f( p1 || p2 ){. 
15910 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
15920 74 20 6e 44 69 66 66 3b 0a 20 20 20 20 66 6f 72  t nDiff;.    for
15930 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
15940 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 53 61 6d  _OK && i<p->nSam
15950 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ple; i++){.     
15960 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
15970 74 34 43 6f 6c 75 6d 6e 28 64 62 2c 20 70 2d 3e  t4Column(db, p->
15980 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 2d  aSample[i].p, p-
15990 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 6e  >aSample[i].n, n
159a0 45 71 2c 20 26 70 56 61 6c 29 3b 0a 20 20 20 20  Eq, &pVal);.    
159b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
159c0 5f 4f 4b 20 26 26 20 70 31 20 29 7b 0a 20 20 20  _OK && p1 ){.   
159d0 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 73       int res = s
159e0 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
159f0 28 70 31 2c 20 70 56 61 6c 2c 20 70 43 6f 6c 6c  (p1, pVal, pColl
15a00 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
15a10 65 73 3e 3d 30 20 29 20 6e 4c 6f 77 65 72 2b 2b  es>=0 ) nLower++
15a20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15a30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15a40 4b 20 26 26 20 70 32 20 29 7b 0a 20 20 20 20 20  K && p2 ){.     
15a50 20 20 20 69 6e 74 20 72 65 73 20 3d 20 73 71 6c     int res = sql
15a60 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70  ite3MemCompare(p
15a70 32 2c 20 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b  2, pVal, pColl);
15a80 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73  .        if( res
15a90 3e 3d 30 20 29 20 6e 55 70 70 65 72 2b 2b 3b 0a  >=0 ) nUpper++;.
15aa0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15ab0 20 20 6e 44 69 66 66 20 3d 20 28 6e 55 70 70 65    nDiff = (nUppe
15ac0 72 20 2d 20 6e 4c 6f 77 65 72 29 3b 0a 20 20 20  r - nLower);.   
15ad0 20 69 66 28 20 6e 44 69 66 66 3c 3d 30 20 29 20   if( nDiff<=0 ) 
15ae0 6e 44 69 66 66 20 3d 20 31 3b 0a 0a 20 20 20 20  nDiff = 1;..    
15af0 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 62  /* If there is b
15b00 6f 74 68 20 61 6e 20 75 70 70 65 72 20 61 6e 64  oth an upper and
15b10 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 73 70 65   lower bound spe
15b20 63 69 66 69 65 64 2c 20 61 6e 64 20 74 68 65 20  cified, and the 
15b30 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73  .    ** comparis
15b40 6f 6e 73 20 69 6e 64 69 63 61 74 65 20 74 68 61  ons indicate tha
15b50 74 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65  t they are close
15b60 20 74 6f 67 65 74 68 65 72 2c 20 75 73 65 20 74   together, use t
15b70 68 65 20 66 61 6c 6c 62 61 63 6b 0a 20 20 20 20  he fallback.    
15b80 2a 2a 20 6d 65 74 68 6f 64 20 28 61 73 73 75 6d  ** method (assum
15b90 65 20 74 68 61 74 20 74 68 65 20 73 63 61 6e 20  e that the scan 
15ba0 76 69 73 69 74 73 20 31 2f 36 34 20 6f 66 20 74  visits 1/64 of t
15bb0 68 65 20 72 6f 77 73 29 20 66 6f 72 20 65 73 74  he rows) for est
15bc0 69 6d 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74  imating.    ** t
15bd0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
15be0 73 20 76 69 73 69 74 65 64 2e 20 4f 74 68 65 72  s visited. Other
15bf0 77 69 73 65 2c 20 65 73 74 69 6d 61 74 65 20 74  wise, estimate t
15c00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
15c10 73 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 74  s.    ** using t
15c20 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69  he method descri
15c30 62 65 64 20 69 6e 20 74 68 65 20 68 65 61 64 65  bed in the heade
15c40 72 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20 74 68  r comment for th
15c50 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a  is function. */.
15c60 20 20 20 20 69 66 28 20 6e 44 69 66 66 21 3d 31      if( nDiff!=1
15c70 20 7c 7c 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c   || pUpper==0 ||
15c80 20 70 4c 6f 77 65 72 3d 3d 30 20 29 7b 0a 20 20   pLower==0 ){.  
15c90 20 20 20 20 69 6e 74 20 6e 41 64 6a 75 73 74 20      int nAdjust 
15ca0 3d 20 28 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  = (sqlite3LogEst
15cb0 28 70 2d 3e 6e 53 61 6d 70 6c 65 29 20 2d 20 73  (p->nSample) - s
15cc0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 44 69  qlite3LogEst(nDi
15cd0 66 66 29 29 3b 0a 20 20 20 20 20 20 70 4c 6f 6f  ff));.      pLoo
15ce0 70 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 41 64 6a 75  p->nOut -= nAdju
15cf0 73 74 3b 0a 20 20 20 20 20 20 2a 70 62 44 6f 6e  st;.      *pbDon
15d00 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 57 48 45  e = 1;.      WHE
15d10 52 45 54 52 41 43 45 28 30 78 31 30 2c 20 28 22  RETRACE(0x10, ("
15d20 72 61 6e 67 65 20 73 6b 69 70 2d 73 63 61 6e 20  range skip-scan 
15d30 72 65 67 69 6f 6e 73 3a 20 25 75 2e 2e 25 75 20  regions: %u..%u 
15d40 20 61 64 6a 75 73 74 3d 25 64 20 65 73 74 3d 25   adjust=%d est=%
15d50 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
15d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d70 20 6e 4c 6f 77 65 72 2c 20 6e 55 70 70 65 72 2c   nLower, nUpper,
15d80 20 6e 41 64 6a 75 73 74 2a 2d 31 2c 20 70 4c 6f   nAdjust*-1, pLo
15d90 6f 70 2d 3e 6e 4f 75 74 29 29 3b 0a 20 20 20 20  op->nOut));.    
15da0 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  }..  }else{.    
15db0 61 73 73 65 72 74 28 20 2a 70 62 44 6f 6e 65 3d  assert( *pbDone=
15dc0 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  =0 );.  }..  sql
15dd0 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 31  ite3ValueFree(p1
15de0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
15df0 65 46 72 65 65 28 70 32 29 3b 0a 20 20 73 71 6c  eFree(p2);.  sql
15e00 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
15e10 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  al);..  return r
15e20 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
15e30 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
15e40 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a  T3_OR_STAT4 */..
15e50 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
15e60 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 65  ion is used to e
15e70 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
15e80 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
15e90 77 69 6c 6c 20 62 65 20 76 69 73 69 74 65 64 0a  will be visited.
15ea0 2a 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 61  ** by scanning a
15eb0 6e 20 69 6e 64 65 78 20 66 6f 72 20 61 20 72 61  n index for a ra
15ec0 6e 67 65 20 6f 66 20 76 61 6c 75 65 73 2e 20 54  nge of values. T
15ed0 68 65 20 72 61 6e 67 65 20 6d 61 79 20 68 61 76  he range may hav
15ee0 65 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f  e an upper.** bo
15ef0 75 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75  und, a lower bou
15f00 6e 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54 68 65  nd, or both. The
15f10 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
15f20 72 6d 73 20 74 68 61 74 20 73 65 74 20 74 68 65  rms that set the
15f30 20 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f   upper.** and lo
15f40 77 65 72 20 62 6f 75 6e 64 73 20 61 72 65 20 72  wer bounds are r
15f50 65 70 72 65 73 65 6e 74 65 64 20 62 79 20 70 4c  epresented by pL
15f60 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20  ower and pUpper 
15f70 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 46 6f  respectively. Fo
15f80 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73  r.** example, as
15f90 73 75 6d 69 6e 67 20 74 68 61 74 20 69 6e 64 65  suming that inde
15fa0 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61 29 3a  x p is on t1(a):
15fb0 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f  .**.**   ... FRO
15fc0 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f  M t1 WHERE a > ?
15fd0 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a   AND a < ? ....*
15fe0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
15ff0 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c       |_____|   |
16000 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20  _____|.**       
16010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16020 7c 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20  |         |.**  
16030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16040 20 20 20 70 4c 6f 77 65 72 20 20 20 20 70 55 70     pLower    pUp
16050 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74  per.**.** If eit
16060 68 65 72 20 6f 66 20 74 68 65 20 75 70 70 65 72  her of the upper
16070 20 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20   or lower bound 
16080 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20  is not present, 
16090 74 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73  then NULL is pas
160a0 73 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20  sed in.** place 
160b0 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  of the correspon
160c0 64 69 6e 67 20 57 68 65 72 65 54 65 72 6d 2e 0a  ding WhereTerm..
160d0 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
160e0 69 6e 20 28 70 42 75 69 6c 64 65 72 2d 3e 70 4e  in (pBuilder->pN
160f0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29  ew->u.btree.nEq)
16100 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
16110 66 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 63  f the index.** c
16120 6f 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f  olumn subject to
16130 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74   the range const
16140 72 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76  raint. Or, equiv
16150 61 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d  alently, the num
16160 62 65 72 20 6f 66 0a 2a 2a 20 65 71 75 61 6c 69  ber of.** equali
16170 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  ty constraints o
16180 70 74 69 6d 69 7a 65 64 20 62 79 20 74 68 65 20  ptimized by the 
16190 70 72 6f 70 6f 73 65 64 20 69 6e 64 65 78 20 73  proposed index s
161a0 63 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  can. For example
161b0 2c 0a 2a 2a 20 61 73 73 75 6d 69 6e 67 20 69 6e  ,.** assuming in
161c0 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61  dex p is on t1(a
161d0 2c 20 62 29 2c 20 61 6e 64 20 74 68 65 20 53 51  , b), and the SQ
161e0 4c 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a  L query is:.**.*
161f0 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  *   ... FROM t1 
16200 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20  WHERE a = ? AND 
16210 62 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20  b > ? AND b < ? 
16220 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e  ....**.** then n
16230 45 71 20 69 73 20 73 65 74 20 74 6f 20 31 20 28  Eq is set to 1 (
16240 61 73 20 74 68 65 20 72 61 6e 67 65 20 72 65 73  as the range res
16250 74 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 20  tricted column, 
16260 62 2c 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  b, is the second
16270 20 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 63   .** left-most c
16280 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
16290 65 78 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20  ex). Or, if the 
162a0 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  query is:.**.** 
162b0 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48    ... FROM t1 WH
162c0 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20  ERE a > ? AND a 
162d0 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68  < ? ....**.** th
162e0 65 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74 6f  en nEq is set to
162f0 20 30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74   0..**.** When t
16300 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
16310 63 61 6c 6c 65 64 2c 20 2a 70 6e 4f 75 74 20 69  called, *pnOut i
16320 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 71 6c  s set to the sql
16330 69 74 65 33 4c 6f 67 45 73 74 28 29 20 6f 66 20  ite3LogEst() of 
16340 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
16350 20 72 6f 77 73 20 74 68 61 74 20 74 68 65 20 69   rows that the i
16360 6e 64 65 78 20 73 63 61 6e 20 69 73 20 65 78 70  ndex scan is exp
16370 65 63 74 65 64 20 74 6f 20 76 69 73 69 74 20 77  ected to visit w
16380 69 74 68 6f 75 74 20 0a 2a 2a 20 63 6f 6e 73 69  ithout .** consi
16390 64 65 72 69 6e 67 20 74 68 65 20 72 61 6e 67 65  dering the range
163a0 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 49 66   constraints. If
163b0 20 6e 45 71 20 69 73 20 30 2c 20 74 68 65 6e 20   nEq is 0, then 
163c0 2a 70 6e 4f 75 74 20 69 73 20 74 68 65 20 6e 75  *pnOut is the nu
163d0 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 72 6f 77 73  mber of .** rows
163e0 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 20 41   in the index. A
163f0 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72  ssuming no error
16400 20 6f 63 63 75 72 73 2c 20 2a 70 6e 4f 75 74 20   occurs, *pnOut 
16410 69 73 20 61 64 6a 75 73 74 65 64 20 28 72 65 64  is adjusted (red
16420 75 63 65 64 29 0a 2a 2a 20 74 6f 20 61 63 63 6f  uced).** to acco
16430 75 6e 74 20 66 6f 72 20 74 68 65 20 72 61 6e 67  unt for the rang
16440 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 70 4c  e constraints pL
16450 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 2e  ower and pUpper.
16460 0a 2a 2a 20 0a 2a 2a 20 49 6e 20 74 68 65 20 61  .** .** In the a
16470 62 73 65 6e 63 65 20 6f 66 20 73 71 6c 69 74 65  bsence of sqlite
16480 5f 73 74 61 74 34 20 41 4e 41 4c 59 5a 45 20 64  _stat4 ANALYZE d
16490 61 74 61 2c 20 6f 72 20 69 66 20 73 75 63 68 20  ata, or if such 
164a0 64 61 74 61 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  data cannot be.*
164b0 2a 20 75 73 65 64 2c 20 61 20 73 69 6e 67 6c 65  * used, a single
164c0 20 72 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74   range inequalit
164d0 79 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65  y reduces the se
164e0 61 72 63 68 20 73 70 61 63 65 20 62 79 20 61 20  arch space by a 
164f0 66 61 63 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a  factor of 4. .**
16500 20 61 6e 64 20 61 20 70 61 69 72 20 6f 66 20 63   and a pair of c
16510 6f 6e 73 74 72 61 69 6e 74 73 20 28 78 3e 3f 20  onstraints (x>? 
16520 41 4e 44 20 78 3c 3f 29 20 72 65 64 75 63 65 73  AND x<?) reduces
16530 20 74 68 65 20 65 78 70 65 63 74 65 64 20 6e 75   the expected nu
16540 6d 62 65 72 20 6f 66 0a 2a 2a 20 72 6f 77 73 20  mber of.** rows 
16550 76 69 73 69 74 65 64 20 62 79 20 61 20 66 61 63  visited by a fac
16560 74 6f 72 20 6f 66 20 36 34 2e 0a 2a 2f 0a 73 74  tor of 64..*/.st
16570 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 52 61  atic int whereRa
16580 6e 67 65 53 63 61 6e 45 73 74 28 0a 20 20 50 61  ngeScanEst(.  Pa
16590 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
165a0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20     /* Parsing & 
165b0 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
165c0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
165d0 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
165e0 42 75 69 6c 64 65 72 2c 0a 20 20 57 68 65 72 65  Builder,.  Where
165f0 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20  Term *pLower,   
16600 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f  /* Lower bound o
16610 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a  n the range. ex:
16620 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62   "x>123" Might b
16630 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72  e NULL */.  Wher
16640 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20  eTerm *pUpper,  
16650 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20   /* Upper bound 
16660 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78  on the range. ex
16670 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20  : "x<455" Might 
16680 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65  be NULL */.  Whe
16690 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 20 20  reLoop *pLoop   
166a0 20 20 2f 2a 20 4d 6f 64 69 66 79 20 74 68 65 20    /* Modify the 
166b0 2e 6e 4f 75 74 20 61 6e 64 20 6d 61 79 62 65 20  .nOut and maybe 
166c0 2e 72 52 75 6e 20 66 69 65 6c 64 73 20 2a 2f 0a  .rRun fields */.
166d0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
166e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e  LITE_OK;.  int n
166f0 4f 75 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  Out = pLoop->nOu
16700 74 3b 0a 20 20 4c 6f 67 45 73 74 20 6e 4e 65 77  t;.  LogEst nNew
16710 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
16720 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
16730 5f 53 54 41 54 34 0a 20 20 49 6e 64 65 78 20 2a  _STAT4.  Index *
16740 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  p = pLoop->u.btr
16750 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74  ee.pIndex;.  int
16760 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e   nEq = pLoop->u.
16770 62 74 72 65 65 2e 6e 45 71 3b 0a 0a 20 20 69 66  btree.nEq;..  if
16780 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 26  ( p->nSample>0 &
16790 26 20 6e 45 71 3c 70 2d 3e 6e 53 61 6d 70 6c 65  & nEq<p->nSample
167a0 43 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  Col ){.    if( n
167b0 45 71 3d 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52  Eq==pBuilder->nR
167c0 65 63 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20  ecValid ){.     
167d0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
167e0 2a 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72  *pRec = pBuilder
167f0 2d 3e 70 52 65 63 3b 0a 20 20 20 20 20 20 74 52  ->pRec;.      tR
16800 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20 20 20  owcnt a[2];.    
16810 20 20 75 38 20 61 66 66 3b 0a 0a 20 20 20 20 20    u8 aff;..     
16820 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 4c 6f   /* Variable iLo
16830 77 65 72 20 77 69 6c 6c 20 62 65 20 73 65 74 20  wer will be set 
16840 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20  to the estimate 
16850 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
16860 20 72 6f 77 73 20 69 6e 20 0a 20 20 20 20 20 20   rows in .      
16870 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 74 68 61  ** the index tha
16880 74 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20  t are less than 
16890 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20  the lower bound 
168a0 6f 66 20 74 68 65 20 72 61 6e 67 65 20 71 75 65  of the range que
168b0 72 79 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  ry. The.      **
168c0 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 62 65 69   lower bound bei
168d0 6e 67 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61  ng the concatena
168e0 74 69 6f 6e 20 6f 66 20 24 50 20 61 6e 64 20 24  tion of $P and $
168f0 4c 2c 20 77 68 65 72 65 20 24 50 20 69 73 20 74  L, where $P is t
16900 68 65 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79 2d  he.      ** key-
16910 70 72 65 66 69 78 20 66 6f 72 6d 65 64 20 62 79  prefix formed by
16920 20 74 68 65 20 6e 45 71 20 76 61 6c 75 65 73 20   the nEq values 
16930 6d 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20  matched against 
16940 74 68 65 20 6e 45 71 20 6c 65 66 74 2d 6d 6f 73  the nEq left-mos
16950 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  t.      ** colum
16960 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c  ns of the index,
16970 20 61 6e 64 20 24 4c 20 69 73 20 74 68 65 20 76   and $L is the v
16980 61 6c 75 65 20 69 6e 20 70 4c 6f 77 65 72 2e 0a  alue in pLower..
16990 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
169a0 2a 20 4f 72 2c 20 69 66 20 70 4c 6f 77 65 72 20  * Or, if pLower 
169b0 69 73 20 4e 55 4c 4c 20 6f 72 20 24 4c 20 63 61  is NULL or $L ca
169c0 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65  nnot be extracte
169d0 64 20 66 72 6f 6d 20 69 74 20 28 62 65 63 61 75  d from it (becau
169e0 73 65 20 69 74 0a 20 20 20 20 20 20 2a 2a 20 69  se it.      ** i
169f0 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20 76  s not a simple v
16a00 61 72 69 61 62 6c 65 20 6f 72 20 6c 69 74 65 72  ariable or liter
16a10 61 6c 20 76 61 6c 75 65 29 2c 20 74 68 65 20 6c  al value), the l
16a20 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68  ower bound of th
16a30 65 0a 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65  e.      ** range
16a40 20 69 73 20 24 50 2e 20 44 75 65 20 74 6f 20 61   is $P. Due to a
16a50 20 71 75 69 72 6b 20 69 6e 20 74 68 65 20 77 61   quirk in the wa
16a60 79 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  y whereKeyStats(
16a70 29 20 77 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20  ) works, even.  
16a80 20 20 20 20 2a 2a 20 69 66 20 24 4c 20 69 73 20      ** if $L is 
16a90 61 76 61 69 6c 61 62 6c 65 2c 20 77 68 65 72 65  available, where
16aa0 4b 65 79 53 74 61 74 73 28 29 20 69 73 20 63 61  KeyStats() is ca
16ab0 6c 6c 65 64 20 66 6f 72 20 62 6f 74 68 20 28 24  lled for both ($
16ac0 50 29 20 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a  P) and .      **
16ad0 20 28 24 50 3a 24 4c 29 20 61 6e 64 20 74 68 65   ($P:$L) and the
16ae0 20 6c 61 72 67 65 72 20 6f 66 20 74 68 65 20 74   larger of the t
16af0 77 6f 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  wo returned valu
16b00 65 73 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20  es is used..    
16b10 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 69    **.      ** Si
16b20 6d 69 6c 61 72 6c 79 2c 20 69 55 70 70 65 72 20  milarly, iUpper 
16b30 69 73 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20  is to be set to 
16b40 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20  the estimate of 
16b50 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
16b60 77 73 0a 20 20 20 20 20 20 2a 2a 20 6c 65 73 73  ws.      ** less
16b70 20 74 68 61 6e 20 74 68 65 20 75 70 70 65 72 20   than the upper 
16b80 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e  bound of the ran
16b90 67 65 20 71 75 65 72 79 2e 20 57 68 65 72 65 20  ge query. Where 
16ba0 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 0a  the upper bound.
16bb0 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68        ** is eith
16bc0 65 72 20 28 24 50 29 20 6f 72 20 28 24 50 3a 24  er ($P) or ($P:$
16bd0 55 29 2e 20 41 67 61 69 6e 2c 20 65 76 65 6e 20  U). Again, even 
16be0 69 66 20 24 55 20 69 73 20 61 76 61 69 6c 61 62  if $U is availab
16bf0 6c 65 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 0a  le, both values.
16c00 20 20 20 20 20 20 2a 2a 20 6f 66 20 69 55 70 70        ** of iUpp
16c10 65 72 20 61 72 65 20 72 65 71 75 65 73 74 65 64  er are requested
16c20 20 6f 66 20 77 68 65 72 65 4b 65 79 53 74 61 74   of whereKeyStat
16c30 73 28 29 20 61 6e 64 20 74 68 65 20 73 6d 61 6c  s() and the smal
16c40 6c 65 72 20 75 73 65 64 2e 0a 20 20 20 20 20 20  ler used..      
16c50 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  **.      ** The 
16c60 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 62  number of rows b
16c70 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 62  etween the two b
16c80 6f 75 6e 64 73 20 69 73 20 74 68 65 6e 20 6a 75  ounds is then ju
16c90 73 74 20 69 55 70 70 65 72 2d 69 4c 6f 77 65 72  st iUpper-iLower
16ca0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
16cb0 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 3b   tRowcnt iLower;
16cc0 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65 73       /* Rows les
16cd0 73 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72  s than the lower
16ce0 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   bound */.      
16cf0 74 52 6f 77 63 6e 74 20 69 55 70 70 65 72 3b 20  tRowcnt iUpper; 
16d00 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65 73 73      /* Rows less
16d10 20 74 68 61 6e 20 74 68 65 20 75 70 70 65 72 20   than the upper 
16d20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69  bound */.      i
16d30 6e 74 20 69 4c 77 72 49 64 78 20 3d 20 2d 32 3b  nt iLwrIdx = -2;
16d40 20 20 20 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20     /* aSample[] 
16d50 66 6f 72 20 74 68 65 20 6c 6f 77 65 72 20 62 6f  for the lower bo
16d60 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  und */.      int
16d70 20 69 55 70 72 49 64 78 20 3d 20 2d 31 3b 20 20   iUprIdx = -1;  
16d80 20 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20 66 6f   /* aSample[] fo
16d90 72 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e  r the upper boun
16da0 64 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20  d */..      if( 
16db0 70 52 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20  pRec ){.        
16dc0 74 65 73 74 63 61 73 65 28 20 70 52 65 63 2d 3e  testcase( pRec->
16dd0 6e 46 69 65 6c 64 21 3d 70 42 75 69 6c 64 65 72  nField!=pBuilder
16de0 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20  ->nRecValid );. 
16df0 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69         pRec->nFi
16e00 65 6c 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  eld = pBuilder->
16e10 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 20 20 20  nRecValid;.     
16e20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 45 71   }.      if( nEq
16e30 3d 3d 70 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a  ==p->nKeyCol ){.
16e40 20 20 20 20 20 20 20 20 61 66 66 20 3d 20 53 51          aff = SQ
16e50 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
16e60 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
16e70 20 20 20 20 20 20 20 61 66 66 20 3d 20 70 2d 3e         aff = p->
16e80 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e  pTable->aCol[p->
16e90 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 5d 2e 61  aiColumn[nEq]].a
16ea0 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 7d  ffinity;.      }
16eb0 0a 20 20 20 20 20 20 2f 2a 20 44 65 74 65 72 6d  .      /* Determ
16ec0 69 6e 65 20 69 4c 6f 77 65 72 20 61 6e 64 20 69  ine iLower and i
16ed0 55 70 70 65 72 20 75 73 69 6e 67 20 28 24 50 29  Upper using ($P)
16ee0 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20   only. */.      
16ef0 69 66 28 20 6e 45 71 3d 3d 30 20 29 7b 0a 20 20  if( nEq==0 ){.  
16f00 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 30        iLower = 0
16f10 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70 65 72  ;.        iUpper
16f20 20 3d 20 70 2d 3e 6e 52 6f 77 45 73 74 30 3b 0a   = p->nRowEst0;.
16f30 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16f40 20 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68       /* Note: th
16f50 69 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20 62 65  is call could be
16f60 20 6f 70 74 69 6d 69 7a 65 64 20 61 77 61 79 20   optimized away 
16f70 2d 20 73 69 6e 63 65 20 74 68 65 20 73 61 6d 65  - since the same
16f80 20 76 61 6c 75 65 73 20 6d 75 73 74 20 0a 20 20   values must .  
16f90 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 62 65        ** have be
16fa0 65 6e 20 72 65 71 75 65 73 74 65 64 20 77 68 65  en requested whe
16fb0 6e 20 74 65 73 74 69 6e 67 20 6b 65 79 20 24 50  n testing key $P
16fc0 20 69 6e 20 77 68 65 72 65 45 71 75 61 6c 53 63   in whereEqualSc
16fd0 61 6e 45 73 74 28 29 2e 20 20 2a 2f 0a 20 20 20  anEst().  */.   
16fe0 20 20 20 20 20 77 68 65 72 65 4b 65 79 53 74 61       whereKeySta
16ff0 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52  ts(pParse, p, pR
17000 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20  ec, 0, a);.     
17010 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d     iLower = a[0]
17020 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70 65 72  ;.        iUpper
17030 20 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b 0a   = a[0] + a[1];.
17040 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
17050 73 73 65 72 74 28 20 70 4c 6f 77 65 72 3d 3d 30  ssert( pLower==0
17060 20 7c 7c 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70   || (pLower->eOp
17070 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c  erator & (WO_GT|
17080 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a 20 20  WO_GE))!=0 );.  
17090 20 20 20 20 61 73 73 65 72 74 28 20 70 55 70 70      assert( pUpp
170a0 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70 65 72  er==0 || (pUpper
170b0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
170c0 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d 30 20  O_LT|WO_LE))!=0 
170d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
170e0 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d   p->aSortOrder!=
170f0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
17100 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71  ->aSortOrder[nEq
17110 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ] ){.        /* 
17120 54 68 65 20 72 6f 6c 65 73 20 6f 66 20 70 4c 6f  The roles of pLo
17130 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 61  wer and pUpper a
17140 72 65 20 73 77 61 70 70 65 64 20 66 6f 72 20 61  re swapped for a
17150 20 44 45 53 43 20 69 6e 64 65 78 20 2a 2f 0a 20   DESC index */. 
17160 20 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72         SWAP(Wher
17170 65 54 65 72 6d 2a 2c 20 70 4c 6f 77 65 72 2c 20  eTerm*, pLower, 
17180 70 55 70 70 65 72 29 3b 0a 20 20 20 20 20 20 7d  pUpper);.      }
17190 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f  ..      /* If po
171a0 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20  ssible, improve 
171b0 6f 6e 20 74 68 65 20 69 4c 6f 77 65 72 20 65 73  on the iLower es
171c0 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50  timate using ($P
171d0 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69  :$L). */.      i
171e0 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20  f( pLower ){.   
171f0 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20       int bOk;   
17200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17210 20 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75   /* True if valu
17220 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  e is extracted f
17230 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20  rom pExpr */.   
17240 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
17250 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72   = pLower->pExpr
17260 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
17270 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
17280 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65  at4ProbeSetValue
17290 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65  (pParse, p, &pRe
172a0 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e  c, pExpr, aff, n
172b0 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20  Eq, &bOk);.     
172c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
172d0 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20  E_OK && bOk ){. 
172e0 20 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74           tRowcnt
172f0 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   iNew;.         
17300 20 69 4c 77 72 49 64 78 20 3d 20 77 68 65 72 65   iLwrIdx = where
17310 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
17320 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b   p, pRec, 0, a);
17330 0a 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20  .          iNew 
17340 3d 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f 77 65  = a[0] + ((pLowe
17350 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  r->eOperator & (
17360 57 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29 20 3f 20  WO_GT|WO_LE)) ? 
17370 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20  a[1] : 0);.     
17380 20 20 20 20 20 69 66 28 20 69 4e 65 77 3e 69 4c       if( iNew>iL
17390 6f 77 65 72 20 29 20 69 4c 6f 77 65 72 20 3d 20  ower ) iLower = 
173a0 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
173b0 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  nOut--;.        
173c0 20 20 70 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20    pLower = 0;.  
173d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
173e0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f 73  .      /* If pos
173f0 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f  sible, improve o
17400 6e 20 74 68 65 20 69 55 70 70 65 72 20 65 73 74  n the iUpper est
17410 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a  imate using ($P:
17420 24 55 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  $U). */.      if
17430 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20  ( pUpper ){.    
17440 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20      int bOk;    
17450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17460 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75 65  /* True if value
17470 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
17480 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20  om pExpr */.    
17490 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
174a0 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d  = pUpper->pExpr-
174b0 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  >pRight;.       
174c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
174d0 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28  t4ProbeSetValue(
174e0 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63  pParse, p, &pRec
174f0 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45  , pExpr, aff, nE
17500 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20  q, &bOk);.      
17510 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17520 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20  _OK && bOk ){.  
17530 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20          tRowcnt 
17540 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
17550 69 55 70 72 49 64 78 20 3d 20 77 68 65 72 65 4b  iUprIdx = whereK
17560 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
17570 70 2c 20 70 52 65 63 2c 20 31 2c 20 61 29 3b 0a  p, pRec, 1, a);.
17580 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d            iNew =
17590 20 61 5b 30 5d 20 2b 20 28 28 70 55 70 70 65 72   a[0] + ((pUpper
175a0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
175b0 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29 20 3f 20 61  O_GT|WO_LE)) ? a
175c0 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  [1] : 0);.      
175d0 20 20 20 20 69 66 28 20 69 4e 65 77 3c 69 55 70      if( iNew<iUp
175e0 70 65 72 20 29 20 69 55 70 70 65 72 20 3d 20 69  per ) iUpper = i
175f0 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  New;.          n
17600 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20  Out--;.         
17610 20 70 55 70 70 65 72 20 3d 20 30 3b 0a 20 20 20   pUpper = 0;.   
17620 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
17630 20 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e        pBuilder->
17640 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 20  pRec = pRec;.   
17650 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
17660 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
17670 69 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77 65  if( iUpper>iLowe
17680 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  r ){.          n
17690 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  New = sqlite3Log
176a0 45 73 74 28 69 55 70 70 65 72 20 2d 20 69 4c 6f  Est(iUpper - iLo
176b0 77 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wer);.          
176c0 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 49 66 20 62  /* TUNING:  If b
176d0 6f 74 68 20 69 55 70 70 65 72 20 61 6e 64 20 69  oth iUpper and i
176e0 4c 6f 77 65 72 20 61 72 65 20 64 65 72 69 76 65  Lower are derive
176f0 64 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 0a  d from the same.
17700 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d            ** sam
17710 70 6c 65 2c 20 74 68 65 6e 20 61 73 73 75 6d 65  ple, then assume
17720 20 74 68 65 79 20 61 72 65 20 34 78 20 6d 6f 72   they are 4x mor
17730 65 20 73 65 6c 65 63 74 69 76 65 2e 20 20 54 68  e selective.  Th
17740 69 73 20 62 72 69 6e 67 73 0a 20 20 20 20 20 20  is brings.      
17750 20 20 20 20 2a 2a 20 74 68 65 20 65 73 74 69 6d      ** the estim
17760 61 74 65 64 20 73 65 6c 65 63 74 69 76 69 74 79  ated selectivity
17770 20 6d 6f 72 65 20 69 6e 20 6c 69 6e 65 20 77 69   more in line wi
17780 74 68 20 77 68 61 74 20 69 74 20 77 6f 75 6c 64  th what it would
17790 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   be.          **
177a0 20 69 66 20 65 73 74 69 6d 61 74 65 64 20 77 69   if estimated wi
177b0 74 68 6f 75 74 20 74 68 65 20 75 73 65 20 6f 66  thout the use of
177c0 20 53 54 41 54 33 2f 34 20 74 61 62 6c 65 73 2e   STAT3/4 tables.
177d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
177e0 28 20 69 4c 77 72 49 64 78 3d 3d 69 55 70 72 49  ( iLwrIdx==iUprI
177f0 64 78 20 29 20 6e 4e 65 77 20 2d 3d 20 32 30 3b  dx ) nNew -= 20;
17800 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71    assert( 20==sq
17810 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29  lite3LogEst(4) )
17820 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
17830 0a 20 20 20 20 20 20 20 20 20 20 6e 4e 65 77 20  .          nNew 
17840 3d 20 31 30 3b 20 20 20 20 20 20 20 20 61 73 73  = 10;        ass
17850 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33  ert( 10==sqlite3
17860 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 20  LogEst(2) );.   
17870 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
17880 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b 0a  f( nNew<nOut ){.
17890 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d            nOut =
178a0 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   nNew;.        }
178b0 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52  .        WHERETR
178c0 41 43 45 28 30 78 31 30 2c 20 28 22 53 54 41 54  ACE(0x10, ("STAT
178d0 34 20 72 61 6e 67 65 20 73 63 61 6e 3a 20 25 75  4 range scan: %u
178e0 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e 22 2c  ..%u  est=%d\n",
178f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17900 20 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32              (u32
17910 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69 55  )iLower, (u32)iU
17920 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20 20  pper, nOut));.  
17930 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
17940 0a 20 20 20 20 20 20 69 6e 74 20 62 44 6f 6e 65  .      int bDone
17950 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
17960 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53   whereRangeSkipS
17970 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
17980 4c 6f 77 65 72 2c 20 70 55 70 70 65 72 2c 20 70  Lower, pUpper, p
17990 4c 6f 6f 70 2c 20 26 62 44 6f 6e 65 29 3b 0a 20  Loop, &bDone);. 
179a0 20 20 20 20 20 69 66 28 20 62 44 6f 6e 65 20 29       if( bDone )
179b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
179c0 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e  }.  }.#else.  UN
179d0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
179e0 50 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45 44  Parse);.  UNUSED
179f0 5f 50 41 52 41 4d 45 54 45 52 28 70 42 75 69 6c  _PARAMETER(pBuil
17a00 64 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  der);.  assert( 
17a10 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72  pLower || pUpper
17a20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   );.#endif.  ass
17a30 65 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20 7c  ert( pUpper==0 |
17a40 7c 20 28 70 55 70 70 65 72 2d 3e 77 74 46 6c 61  | (pUpper->wtFla
17a50 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29  gs & TERM_VNULL)
17a60 3d 3d 30 20 29 3b 0a 20 20 6e 4e 65 77 20 3d 20  ==0 );.  nNew = 
17a70 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74  whereRangeAdjust
17a80 28 70 4c 6f 77 65 72 2c 20 6e 4f 75 74 29 3b 0a  (pLower, nOut);.
17a90 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52 61    nNew = whereRa
17aa0 6e 67 65 41 64 6a 75 73 74 28 70 55 70 70 65 72  ngeAdjust(pUpper
17ab0 2c 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f 2a 20 54  , nNew);..  /* T
17ac0 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20  UNING: If there 
17ad0 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65 72  is both an upper
17ae0 20 61 6e 64 20 6c 6f 77 65 72 20 6c 69 6d 69 74   and lower limit
17af0 20 61 6e 64 20 6e 65 69 74 68 65 72 20 6c 69 6d   and neither lim
17b00 69 74 0a 20 20 2a 2a 20 68 61 73 20 61 6e 20 61  it.  ** has an a
17b10 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e  pplication-defin
17b20 65 64 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c  ed likelihood(),
17b30 20 61 73 73 75 6d 65 20 74 68 65 20 72 61 6e 67   assume the rang
17b40 65 20 69 73 0a 20 20 2a 2a 20 72 65 64 75 63 65  e is.  ** reduce
17b50 64 20 62 79 20 61 6e 20 61 64 64 69 74 69 6f 6e  d by an addition
17b60 61 6c 20 37 35 25 2e 20 54 68 69 73 20 6d 65 61  al 75%. This mea
17b70 6e 73 20 74 68 61 74 2c 20 62 79 20 64 65 66 61  ns that, by defa
17b80 75 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d 65 6e 64  ult, an open-end
17b90 65 64 0a 20 20 2a 2a 20 72 61 6e 67 65 20 71 75  ed.  ** range qu
17ba0 65 72 79 20 28 65 2e 67 2e 20 63 6f 6c 20 3e 20  ery (e.g. col > 
17bb0 3f 29 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  ?) is assumed to
17bc0 20 6d 61 74 63 68 20 31 2f 34 20 6f 66 20 74 68   match 1/4 of th
17bd0 65 20 72 6f 77 73 20 69 6e 20 74 68 65 0a 20 20  e rows in the.  
17be0 2a 2a 20 69 6e 64 65 78 2e 20 57 68 69 6c 65 20  ** index. While 
17bf0 61 20 63 6c 6f 73 65 64 20 72 61 6e 67 65 20 28  a closed range (
17c00 65 2e 67 2e 20 63 6f 6c 20 42 45 54 57 45 45 4e  e.g. col BETWEEN
17c10 20 3f 20 41 4e 44 20 3f 29 20 69 73 20 65 73 74   ? AND ?) is est
17c20 69 6d 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20 6d  imated to.  ** m
17c30 61 74 63 68 20 31 2f 36 34 20 6f 66 20 74 68 65  atch 1/64 of the
17c40 20 69 6e 64 65 78 2e 20 2a 2f 20 0a 20 20 69 66   index. */ .  if
17c50 28 20 70 4c 6f 77 65 72 20 26 26 20 70 4c 6f 77  ( pLower && pLow
17c60 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30 20  er->truthProb>0 
17c70 26 26 20 70 55 70 70 65 72 20 26 26 20 70 55 70  && pUpper && pUp
17c80 70 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30  per->truthProb>0
17c90 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d 3d 20   ){.    nNew -= 
17ca0 32 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f 75 74 20  20;.  }..  nOut 
17cb0 2d 3d 20 28 70 4c 6f 77 65 72 21 3d 30 29 20 2b  -= (pLower!=0) +
17cc0 20 28 70 55 70 70 65 72 21 3d 30 29 3b 0a 20 20   (pUpper!=0);.  
17cd0 69 66 28 20 6e 4e 65 77 3c 31 30 20 29 20 6e 4e  if( nNew<10 ) nN
17ce0 65 77 20 3d 20 31 30 3b 0a 20 20 69 66 28 20 6e  ew = 10;.  if( n
17cf0 4e 65 77 3c 6e 4f 75 74 20 29 20 6e 4f 75 74 20  New<nOut ) nOut 
17d00 3d 20 6e 4e 65 77 3b 0a 23 69 66 20 64 65 66 69  = nNew;.#if defi
17d10 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45  ned(WHERETRACE_E
17d20 4e 41 42 4c 45 44 29 0a 20 20 69 66 28 20 70 4c  NABLED).  if( pL
17d30 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29  oop->nOut>nOut )
17d40 7b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  {.    WHERETRACE
17d50 28 30 78 31 30 2c 28 22 52 61 6e 67 65 20 73 63  (0x10,("Range sc
17d60 61 6e 20 6c 6f 77 65 72 73 20 6e 4f 75 74 20 66  an lowers nOut f
17d70 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c  rom %d to %d\n",
17d80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17d90 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74       pLoop->nOut
17da0 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 7d 0a 23 65  , nOut));.  }.#e
17db0 6e 64 69 66 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 4f  ndif.  pLoop->nO
17dc0 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f 75  ut = (LogEst)nOu
17dd0 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t;.  return rc;.
17de0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
17df0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
17e00 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74  _STAT4./*.** Est
17e10 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
17e20 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69   of rows that wi
17e30 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
17e40 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71  ased on.** an eq
17e50 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
17e60 74 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77 68  t x=VALUE and wh
17e70 65 72 65 20 74 68 61 74 20 56 41 4c 55 45 20 6f  ere that VALUE o
17e80 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20  ccurs in.** the 
17e90 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e 20  histogram data. 
17ea0 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73   This only works
17eb0 20 77 68 65 6e 20 78 20 69 73 20 74 68 65 20 6c   when x is the l
17ec0 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75  eft-most.** colu
17ed0 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 61  mn of an index a
17ee0 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20  nd sqlite_stat3 
17ef0 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69  histogram data i
17f00 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66  s available.** f
17f10 6f 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20 20  or that index.  
17f20 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c  When pExpr==NULL
17f30 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   that means the 
17f40 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a  constraint is.**
17f50 20 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73   "x IS NULL" ins
17f60 74 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55 45  tead of "x=VALUE
17f70 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  "..**.** Write t
17f80 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77  he estimated row
17f90 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52   count into *pnR
17fa0 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ow and return SQ
17fb0 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20  LITE_OK. .** If 
17fc0 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61  unable to make a
17fd0 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76  n estimate, leav
17fe0 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67  e *pnRow unchang
17ff0 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ed and return.**
18000 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a   non-zero..**.**
18010 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
18020 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20  n fail if it is 
18030 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61  unable to load a
18040 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
18050 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20  nce.** required 
18060 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61  for string compa
18070 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61  rison, or if una
18080 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ble to allocate 
18090 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20  memory.** for a 
180a0 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72  UTF conversion r
180b0 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70  equired for comp
180c0 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72  arison.  The err
180d0 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20  or is stored.** 
180e0 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
180f0 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
18100 69 63 20 69 6e 74 20 77 68 65 72 65 45 71 75 61  ic int whereEqua
18110 6c 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  lScanEst(.  Pars
18120 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
18130 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
18140 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
18150 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
18160 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
18170 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 20 2a 70  ilder,.  Expr *p
18180 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  Expr,         /*
18190 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20   Expression for 
181a0 56 41 4c 55 45 20 69 6e 20 74 68 65 20 78 3d 56  VALUE in the x=V
181b0 41 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  ALUE constraint 
181c0 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e  */.  tRowcnt *pn
181d0 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69  Row       /* Wri
181e0 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72  te the revised r
181f0 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65  ow estimate here
18200 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a   */.){.  Index *
18210 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  p = pBuilder->pN
18220 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
18230 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20  ex;.  int nEq = 
18240 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
18250 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 55  u.btree.nEq;.  U
18260 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
18270 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  Rec = pBuilder->
18280 70 52 65 63 3b 0a 20 20 75 38 20 61 66 66 3b 20  pRec;.  u8 aff; 
18290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182a0 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66 69    /* Column affi
182b0 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nity */.  int rc
182c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
182d0 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69      /* Subfuncti
182e0 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  on return code *
182f0 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d  /.  tRowcnt a[2]
18300 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
18310 20 53 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20   Statistics */. 
18320 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61 73 73   int bOk;..  ass
18330 65 72 74 28 20 6e 45 71 3e 3d 31 20 29 3b 0a 20  ert( nEq>=1 );. 
18340 20 61 73 73 65 72 74 28 20 6e 45 71 3c 3d 70 2d   assert( nEq<=p-
18350 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73  >nColumn );.  as
18360 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65  sert( p->aSample
18370 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
18380 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b   p->nSample>0 );
18390 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 69 6c  .  assert( pBuil
183a0 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e  der->nRecValid<n
183b0 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76  Eq );..  /* If v
183c0 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 61 76  alues are not av
183d0 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20  ailable for all 
183e0 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 69 6e  fields of the in
183f0 64 65 78 20 74 6f 20 74 68 65 20 6c 65 66 74 0a  dex to the left.
18400 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65    ** of this one
18410 2c 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 63 61  , no estimate ca
18420 6e 20 62 65 20 6d 61 64 65 2e 20 52 65 74 75 72  n be made. Retur
18430 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
18440 44 2e 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69  D. */.  if( pBui
18450 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c  lder->nRecValid<
18460 28 6e 45 71 2d 31 29 20 29 7b 0a 20 20 20 20 72  (nEq-1) ){.    r
18470 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
18480 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  FOUND;.  }..  /*
18490 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
184a0 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54  mization only. T
184b0 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
184c0 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56  e3Stat4ProbeSetV
184d0 61 6c 75 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f  alue().  ** belo
184e0 77 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 74  w would return t
184f0 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 20  he same value.  
18500 2a 2f 0a 20 20 69 66 28 20 6e 45 71 3e 3d 70 2d  */.  if( nEq>=p-
18510 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
18520 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20  *pnRow = 1;.    
18530 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18540 3b 0a 20 20 7d 0a 0a 20 20 61 66 66 20 3d 20 70  ;.  }..  aff = p
18550 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70  ->pTable->aCol[p
18560 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 2d 31  ->aiColumn[nEq-1
18570 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 72  ]].affinity;.  r
18580 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34  c = sqlite3Stat4
18590 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50  ProbeSetValue(pP
185a0 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20  arse, p, &pRec, 
185b0 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45 71 2d  pExpr, aff, nEq-
185c0 31 2c 20 26 62 4f 6b 29 3b 0a 20 20 70 42 75 69  1, &bOk);.  pBui
185d0 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65  lder->pRec = pRe
185e0 63 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  c;.  if( rc!=SQL
185f0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
18600 72 63 3b 0a 20 20 69 66 28 20 62 4f 6b 3d 3d 30  rc;.  if( bOk==0
18610 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
18620 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 70 42 75  _NOTFOUND;.  pBu
18630 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
18640 20 3d 20 6e 45 71 3b 0a 0a 20 20 77 68 65 72 65   = nEq;..  where
18650 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
18660 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b   p, pRec, 0, a);
18670 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78  .  WHERETRACE(0x
18680 31 30 2c 28 22 65 71 75 61 6c 69 74 79 20 73 63  10,("equality sc
18690 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 64 5c 6e  an regions: %d\n
186a0 22 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a  ", (int)a[1]));.
186b0 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b    *pnRow = a[1];
186c0 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  .  .  return rc;
186d0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
186e0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
186f0 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 23 69  _OR_STAT4 */..#i
18700 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
18710 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
18720 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  4./*.** Estimate
18730 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
18740 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
18750 20 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20   returned based 
18760 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73  on.** an IN cons
18770 74 72 61 69 6e 74 20 77 68 65 72 65 20 74 68 65  traint where the
18780 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
18790 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
187a0 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74  tor.** is a list
187b0 20 6f 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61   of values.  Exa
187c0 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
187d0 20 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 31     WHERE x IN (1
187e0 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72  ,2,3,4).**.** Wr
187f0 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65  ite the estimate
18800 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f  d row count into
18810 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75   *pnRow and retu
18820 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a  rn SQLITE_OK. .*
18830 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d  * If unable to m
18840 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c  ake an estimate,
18850 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e   leave *pnRow un
18860 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75  changed and retu
18870 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  rn.** non-zero..
18880 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
18890 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69  ne can fail if i
188a0 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c  t is unable to l
188b0 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  oad a collating 
188c0 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75  sequence.** requ
188d0 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20  ired for string 
188e0 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69  comparison, or i
188f0 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  f unable to allo
18900 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66  cate memory.** f
18910 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73  or a UTF convers
18920 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72  ion required for
18930 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68   comparison.  Th
18940 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65  e error is store
18950 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72  d.** in the pPar
18960 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
18970 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
18980 65 49 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61  eInScanEst(.  Pa
18990 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
189a0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20     /* Parsing & 
189b0 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
189c0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
189d0 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
189e0 42 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 4c  Builder,.  ExprL
189f0 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
18a00 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6c 69 73  /* The value lis
18a10 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  t on the RHS of 
18a20 22 78 20 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c  "x IN (v1,v2,v3,
18a30 2e 2e 2e 29 22 20 2a 2f 0a 20 20 74 52 6f 77 63  ...)" */.  tRowc
18a40 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20  nt *pnRow       
18a50 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76  /* Write the rev
18a60 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74  ised row estimat
18a70 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49  e here */.){.  I
18a80 6e 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64  ndex *p = pBuild
18a90 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
18aa0 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 36 34 20  e.pIndex;.  i64 
18ab0 6e 52 6f 77 30 20 3d 20 73 71 6c 69 74 65 33 4c  nRow0 = sqlite3L
18ac0 6f 67 45 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69  ogEstToInt(p->ai
18ad0 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20  RowLogEst[0]);. 
18ae0 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d   int nRecValid =
18af0 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
18b00 61 6c 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  alid;.  int rc =
18b10 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
18b20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72  /* Subfunction r
18b30 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
18b40 74 52 6f 77 63 6e 74 20 6e 45 73 74 3b 20 20 20  tRowcnt nEst;   
18b50 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18b60 72 20 6f 66 20 72 6f 77 73 20 66 6f 72 20 61 20  r of rows for a 
18b70 73 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20  single term */. 
18b80 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74   tRowcnt nRowEst
18b90 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20   = 0;    /* New 
18ba0 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
18bb0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a  number of rows *
18bc0 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
18bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
18be0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
18bf0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61    assert( p->aSa
18c00 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72  mple!=0 );.  for
18c10 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
18c20 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e  _OK && i<pList->
18c30 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
18c40 20 6e 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20   nEst = nRow0;. 
18c50 20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75     rc = whereEqu
18c60 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  alScanEst(pParse
18c70 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 4c 69 73  , pBuilder, pLis
18c80 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26  t->a[i].pExpr, &
18c90 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45  nEst);.    nRowE
18ca0 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20  st += nEst;.    
18cb0 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
18cc0 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b  lid = nRecValid;
18cd0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
18ce0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18cf0 20 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 6e   if( nRowEst > n
18d00 52 6f 77 30 20 29 20 6e 52 6f 77 45 73 74 20 3d  Row0 ) nRowEst =
18d10 20 6e 52 6f 77 30 3b 0a 20 20 20 20 2a 70 6e 52   nRow0;.    *pnR
18d20 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20  ow = nRowEst;.  
18d30 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
18d40 30 2c 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d  0,("IN row estim
18d50 61 74 65 3a 20 65 73 74 3d 25 64 5c 6e 22 2c 20  ate: est=%d\n", 
18d60 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20  nRowEst));.  }. 
18d70 20 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65   assert( pBuilde
18d80 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52  r->nRecValid==nR
18d90 65 63 56 61 6c 69 64 20 29 3b 0a 20 20 72 65 74  ecValid );.  ret
18da0 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
18db0 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
18dc0 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
18dd0 20 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 57 48 45   */...#ifdef WHE
18de0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
18df0 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
18e00 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 68 65  content of a Whe
18e10 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2f  reTerm object.*/
18e20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
18e30 72 65 54 65 72 6d 50 72 69 6e 74 28 57 68 65 72  reTermPrint(Wher
18e40 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 69 6e  eTerm *pTerm, in
18e50 74 20 69 54 65 72 6d 29 7b 0a 20 20 69 66 28 20  t iTerm){.  if( 
18e60 70 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  pTerm==0 ){.    
18e70 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
18e80 74 66 28 22 54 45 52 4d 2d 25 2d 33 64 20 4e 55  tf("TERM-%-3d NU
18e90 4c 4c 5c 6e 22 2c 20 69 54 65 72 6d 29 3b 0a 20  LL\n", iTerm);. 
18ea0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
18eb0 20 7a 54 79 70 65 5b 34 5d 3b 0a 20 20 20 20 6d   zType[4];.    m
18ec0 65 6d 63 70 79 28 7a 54 79 70 65 2c 20 22 2e 2e  emcpy(zType, "..
18ed0 2e 22 2c 20 34 29 3b 0a 20 20 20 20 69 66 28 20  .", 4);.    if( 
18ee0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
18ef0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 20   TERM_VIRTUAL ) 
18f00 7a 54 79 70 65 5b 30 5d 20 3d 20 27 56 27 3b 0a  zType[0] = 'V';.
18f10 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
18f20 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
18f30 55 49 56 20 20 29 20 7a 54 79 70 65 5b 31 5d 20  UIV  ) zType[1] 
18f40 3d 20 27 45 27 3b 0a 20 20 20 20 69 66 28 20 45  = 'E';.    if( E
18f50 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
18f60 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f  Term->pExpr, EP_
18f70 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 7a 54 79 70  FromJoin) ) zTyp
18f80 65 5b 32 5d 20 3d 20 27 4c 27 3b 0a 20 20 20 20  e[2] = 'L';.    
18f90 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
18fa0 74 66 28 0a 20 20 20 20 20 20 20 22 54 45 52 4d  tf(.       "TERM
18fb0 2d 25 2d 33 64 20 25 70 20 25 73 20 63 75 72 73  -%-3d %p %s curs
18fc0 6f 72 3d 25 2d 33 64 20 70 72 6f 62 3d 25 2d 33  or=%-3d prob=%-3
18fd0 64 20 6f 70 3d 30 78 25 30 33 78 20 77 74 46 6c  d op=0x%03x wtFl
18fe0 61 67 73 3d 30 78 25 30 34 78 5c 6e 22 2c 0a 20  ags=0x%04x\n",. 
18ff0 20 20 20 20 20 20 69 54 65 72 6d 2c 20 70 54 65        iTerm, pTe
19000 72 6d 2c 20 7a 54 79 70 65 2c 20 70 54 65 72 6d  rm, zType, pTerm
19010 2d 3e 6c 65 66 74 43 75 72 73 6f 72 2c 20 70 54  ->leftCursor, pT
19020 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 2c 0a  erm->truthProb,.
19030 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f         pTerm->eO
19040 70 65 72 61 74 6f 72 2c 20 70 54 65 72 6d 2d 3e  perator, pTerm->
19050 77 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 73 71  wtFlags);.    sq
19060 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70  lite3TreeViewExp
19070 72 28 30 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70  r(0, pTerm->pExp
19080 72 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  r, 0);.  }.}.#en
19090 64 69 66 0a 0a 23 69 66 64 65 66 20 57 48 45 52  dif..#ifdef WHER
190a0 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f  ETRACE_ENABLED./
190b0 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57 68 65  *.** Print a Whe
190c0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f  reLoop object fo
190d0 72 20 64 65 62 75 67 67 69 6e 67 20 70 75 72 70  r debugging purp
190e0 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76  oses.*/.static v
190f0 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 50 72 69  oid whereLoopPri
19100 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c  nt(WhereLoop *p,
19110 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
19120 43 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  C){.  WhereInfo 
19130 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70  *pWInfo = pWC->p
19140 57 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e 62 20  WInfo;.  int nb 
19150 3d 20 31 2b 28 70 57 49 6e 66 6f 2d 3e 70 54 61  = 1+(pWInfo->pTa
19160 62 4c 69 73 74 2d 3e 6e 53 72 63 2b 37 29 2f 38  bList->nSrc+7)/8
19170 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
19180 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
19190 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
191a0 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a  t->a + p->iTab;.
191b0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
191c0 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73  pItem->pTab;.  s
191d0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
191e0 66 28 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e  f("%c%2d.%0*llx.
191f0 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c  %0*llx", p->cId,
19200 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19210 20 20 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e        p->iTab, n
19220 62 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20  b, p->maskSelf, 
19230 6e 62 2c 20 70 2d 3e 70 72 65 72 65 71 29 3b 0a  nb, p->prereq);.
19240 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
19250 69 6e 74 66 28 22 20 25 31 32 73 22 2c 0a 20 20  intf(" %12s",.  
19260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19270 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73     pItem->zAlias
19280 20 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73   ? pItem->zAlias
19290 20 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b   : pTab->zName);
192a0 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61  .  if( (p->wsFla
192b0 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
192c0 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20  ALTABLE)==0 ){. 
192d0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
192e0 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 70 2d  Name;.    if( p-
192f0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
19300 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75  && (zName = p->u
19310 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a  .btree.pIndex->z
19320 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
19330 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e    if( strncmp(zN
19340 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61 75 74  ame, "sqlite_aut
19350 6f 69 6e 64 65 78 5f 22 2c 20 31 37 29 3d 3d 30  oindex_", 17)==0
19360 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
19370 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  i = sqlite3Strle
19380 6e 33 30 28 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a  n30(zName) - 1;.
19390 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a          while( z
193a0 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29 20 69  Name[i]!='_' ) i
193b0 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  --;.        zNam
193c0 65 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a  e += i;.      }.
193d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
193e0 75 67 50 72 69 6e 74 66 28 22 2e 25 2d 31 36 73  ugPrintf(".%-16s
193f0 20 25 32 64 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d   %2d", zName, p-
19400 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 3b 0a 20  >u.btree.nEq);. 
19410 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19420 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
19430 74 66 28 22 25 32 30 73 22 2c 22 22 29 3b 0a 20  tf("%20s","");. 
19440 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
19450 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69    char *z;.    i
19460 66 28 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  f( p->u.vtab.idx
19470 53 74 72 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d  Str ){.      z =
19480 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
19490 28 22 28 25 64 2c 5c 22 25 73 5c 22 2c 25 78 29  ("(%d,\"%s\",%x)
194a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
194b0 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78     p->u.vtab.idx
194c0 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69  Num, p->u.vtab.i
194d0 64 78 53 74 72 2c 20 70 2d 3e 75 2e 76 74 61 62  dxStr, p->u.vtab
194e0 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20  .omitMask);.    
194f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d  }else{.      z =
19500 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
19510 28 22 28 25 64 2c 25 78 29 22 2c 20 70 2d 3e 75  ("(%d,%x)", p->u
19520 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d  .vtab.idxNum, p-
19530 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
19540 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
19550 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
19560 22 20 25 2d 31 39 73 22 2c 20 7a 29 3b 0a 20 20  " %-19s", z);.  
19570 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
19580 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
19590 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
195a0 53 4b 49 50 53 43 41 4e 20 29 7b 0a 20 20 20 20  SKIPSCAN ){.    
195b0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
195c0 74 66 28 22 20 66 20 25 30 35 78 20 25 64 2d 25  tf(" f %05x %d-%
195d0 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20  d", p->wsFlags, 
195e0 70 2d 3e 6e 4c 54 65 72 6d 2c 70 2d 3e 6e 53 6b  p->nLTerm,p->nSk
195f0 69 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ip);.  }else{.  
19600 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
19610 69 6e 74 66 28 22 20 66 20 25 30 35 78 20 4e 20  intf(" f %05x N 
19620 25 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c  %d", p->wsFlags,
19630 20 70 2d 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 7d   p->nLTerm);.  }
19640 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
19650 72 69 6e 74 66 28 22 20 63 6f 73 74 20 25 64 2c  rintf(" cost %d,
19660 25 64 2c 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65  %d,%d\n", p->rSe
19670 74 75 70 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d  tup, p->rRun, p-
19680 3e 6e 4f 75 74 29 3b 0a 20 20 69 66 28 20 70 2d  >nOut);.  if( p-
19690 3e 6e 4c 54 65 72 6d 20 26 26 20 28 73 71 6c 69  >nLTerm && (sqli
196a0 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
196b0 30 78 31 30 30 29 21 3d 30 20 29 7b 0a 20 20 20  0x100)!=0 ){.   
196c0 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
196d0 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d  i=0; i<p->nLTerm
196e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68  ; i++){.      wh
196f0 65 72 65 54 65 72 6d 50 72 69 6e 74 28 70 2d 3e  ereTermPrint(p->
19700 61 4c 54 65 72 6d 5b 69 5d 2c 20 69 29 3b 0a 20  aLTerm[i], i);. 
19710 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
19720 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  f../*.** Convert
19730 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74   bulk memory int
19740 6f 20 61 20 76 61 6c 69 64 20 57 68 65 72 65 4c  o a valid WhereL
19750 6f 6f 70 20 74 68 61 74 20 63 61 6e 20 62 65 20  oop that can be 
19760 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65  passed.** to whe
19770 72 65 4c 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d  reLoopClear harm
19780 6c 65 73 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  lessly..*/.stati
19790 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
197a0 49 6e 69 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a  Init(WhereLoop *
197b0 70 29 7b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20  p){.  p->aLTerm 
197c0 3d 20 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  = p->aLTermSpace
197d0 3b 0a 20 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  ;.  p->nLTerm = 
197e0 30 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d  0;.  p->nLSlot =
197f0 20 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c   ArraySize(p->aL
19800 54 65 72 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d  TermSpace);.  p-
19810 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a  >wsFlags = 0;.}.
19820 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
19830 20 57 68 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69   WhereLoop.u uni
19840 6f 6e 2e 20 20 4c 65 61 76 65 20 57 68 65 72 65  on.  Leave Where
19850 4c 6f 6f 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61  Loop.pLTerm inta
19860 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
19870 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  id whereLoopClea
19880 72 55 6e 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a  rUnion(sqlite3 *
19890 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
198a0 29 7b 0a 20 20 69 66 28 20 70 2d 3e 77 73 46 6c  ){.  if( p->wsFl
198b0 61 67 73 20 26 20 28 57 48 45 52 45 5f 56 49 52  ags & (WHERE_VIR
198c0 54 55 41 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f  TUALTABLE|WHERE_
198d0 41 55 54 4f 5f 49 4e 44 45 58 29 20 29 7b 0a 20  AUTO_INDEX) ){. 
198e0 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61     if( (p->wsFla
198f0 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
19900 41 4c 54 41 42 4c 45 29 21 3d 30 20 26 26 20 70  ALTABLE)!=0 && p
19910 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
19920 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
19930 65 33 5f 66 72 65 65 28 70 2d 3e 75 2e 76 74 61  e3_free(p->u.vta
19940 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20  b.idxStr);.     
19950 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46   p->u.vtab.needF
19960 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ree = 0;.      p
19970 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20  ->u.vtab.idxStr 
19980 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
19990 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
199a0 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
199b0 58 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74  X)!=0 && p->u.bt
199c0 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b  ree.pIndex!=0 ){
199d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
199e0 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74  Free(db, p->u.bt
199f0 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c  ree.pIndex->zCol
19a00 41 66 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Aff);.      sqli
19a10 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
19a20 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29  >u.btree.pIndex)
19a30 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72  ;.      p->u.btr
19a40 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
19a50 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
19a60 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74  * Deallocate int
19a70 65 72 6e 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65  ernal memory use
19a80 64 20 62 79 20 61 20 57 68 65 72 65 4c 6f 6f 70  d by a WhereLoop
19a90 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69   object.*/.stati
19aa0 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
19ab0 43 6c 65 61 72 28 73 71 6c 69 74 65 33 20 2a 64  Clear(sqlite3 *d
19ac0 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  b, WhereLoop *p)
19ad0 7b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72  {.  if( p->aLTer
19ae0 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  m!=p->aLTermSpac
19af0 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  e ) sqlite3DbFre
19b00 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29  e(db, p->aLTerm)
19b10 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  ;.  whereLoopCle
19b20 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a  arUnion(db, p);.
19b30 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
19b40 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  p);.}../*.** Inc
19b50 72 65 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79  rease the memory
19b60 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20   allocation for 
19b70 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20  pLoop->aLTerm[] 
19b80 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 6e  to be at least n
19b90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19ba0 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
19bb0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
19bc0 72 65 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e  reLoop *p, int n
19bd0 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
19be0 2a 70 61 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d  *paNew;.  if( p-
19bf0 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74  >nLSlot>=n ) ret
19c00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
19c10 20 6e 20 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20   n = (n+7)&~7;. 
19c20 20 70 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   paNew = sqlite3
19c30 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
19c40 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d  sizeof(p->aLTerm
19c50 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70  [0])*n);.  if( p
19c60 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  aNew==0 ) return
19c70 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
19c80 20 6d 65 6d 63 70 79 28 70 61 4e 65 77 2c 20 70   memcpy(paNew, p
19c90 2d 3e 61 4c 54 65 72 6d 2c 20 73 69 7a 65 6f 66  ->aLTerm, sizeof
19ca0 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 70  (p->aLTerm[0])*p
19cb0 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a 20 20 69 66 28  ->nLSlot);.  if(
19cc0 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61   p->aLTerm!=p->a
19cd0 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c  LTermSpace ) sql
19ce0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
19cf0 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 70 2d 3e  ->aLTerm);.  p->
19d00 61 4c 54 65 72 6d 20 3d 20 70 61 4e 65 77 3b 0a  aLTerm = paNew;.
19d10 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b    p->nLSlot = n;
19d20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19d30 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  _OK;.}../*.** Tr
19d40 61 6e 73 66 65 72 20 63 6f 6e 74 65 6e 74 20 66  ansfer content f
19d50 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 70  rom the second p
19d60 4c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 66 69  Loop into the fi
19d70 72 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rst..*/.static i
19d80 6e 74 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72  nt whereLoopXfer
19d90 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
19da0 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 2c 20 57 68  ereLoop *pTo, Wh
19db0 65 72 65 4c 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b  ereLoop *pFrom){
19dc0 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  .  whereLoopClea
19dd0 72 55 6e 69 6f 6e 28 64 62 2c 20 70 54 6f 29 3b  rUnion(db, pTo);
19de0 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70  .  if( whereLoop
19df0 52 65 73 69 7a 65 28 64 62 2c 20 70 54 6f 2c 20  Resize(db, pTo, 
19e00 70 46 72 6f 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29  pFrom->nLTerm) )
19e10 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 54  {.    memset(&pT
19e20 6f 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28  o->u, 0, sizeof(
19e30 70 54 6f 2d 3e 75 29 29 3b 0a 20 20 20 20 72 65  pTo->u));.    re
19e40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
19e50 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28  M;.  }.  memcpy(
19e60 70 54 6f 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52  pTo, pFrom, WHER
19e70 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b  E_LOOP_XFER_SZ);
19e80 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61  .  memcpy(pTo->a
19e90 4c 54 65 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c  LTerm, pFrom->aL
19ea0 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72  Term, pTo->nLTer
19eb0 6d 2a 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c  m*sizeof(pTo->aL
19ec0 54 65 72 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28  Term[0]));.  if(
19ed0 20 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20   pFrom->wsFlags 
19ee0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
19ef0 41 42 4c 45 20 29 7b 0a 20 20 20 20 70 46 72 6f  ABLE ){.    pFro
19f00 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  m->u.vtab.needFr
19f10 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  ee = 0;.  }else 
19f20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c  if( (pFrom->wsFl
19f30 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
19f40 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20  _INDEX)!=0 ){.  
19f50 20 20 70 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65    pFrom->u.btree
19f60 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d  .pIndex = 0;.  }
19f70 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19f80 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
19f90 6c 65 74 65 20 61 20 57 68 65 72 65 4c 6f 6f 70  lete a WhereLoop
19fa0 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69   object.*/.stati
19fb0 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
19fc0 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
19fd0 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
19fe0 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c  ){.  whereLoopCl
19ff0 65 61 72 28 64 62 2c 20 70 29 3b 0a 20 20 73 71  ear(db, p);.  sq
1a000 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1a010 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  p);.}../*.** Fre
1a020 65 20 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74  e a WhereInfo st
1a030 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69  ructure.*/.stati
1a040 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f  c void whereInfo
1a050 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62  Free(sqlite3 *db
1a060 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  , WhereInfo *pWI
1a070 6e 66 6f 29 7b 0a 20 20 69 66 28 20 41 4c 57 41  nfo){.  if( ALWA
1a080 59 53 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20  YS(pWInfo) ){.  
1a090 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
1a0a0 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e  (i=0; i<pWInfo->
1a0b0 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20  nLevel; i++){.  
1a0c0 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a      WhereLevel *
1a0d0 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f  pLevel = &pWInfo
1a0e0 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  ->a[i];.      if
1a0f0 28 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  ( pLevel->pWLoop
1a100 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c   && (pLevel->pWL
1a110 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1a120 48 45 52 45 5f 49 4e 5f 41 42 4c 45 29 20 29 7b  HERE_IN_ABLE) ){
1a130 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1a140 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65  DbFree(db, pLeve
1a150 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29  l->u.in.aInLoop)
1a160 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1a170 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 43      whereClauseC
1a180 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d 3e 73 57  lear(&pWInfo->sW
1a190 43 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  C);.    while( p
1a1a0 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 29 7b  WInfo->pLoops ){
1a1b0 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70  .      WhereLoop
1a1c0 20 2a 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4c   *p = pWInfo->pL
1a1d0 6f 6f 70 73 3b 0a 20 20 20 20 20 20 70 57 49 6e  oops;.      pWIn
1a1e0 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70 2d 3e  fo->pLoops = p->
1a1f0 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20  pNextLoop;.     
1a200 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65   whereLoopDelete
1a210 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20  (db, p);.    }. 
1a220 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1a230 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
1a240 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
1a250 6e 20 54 52 55 45 20 69 66 20 61 6c 6c 20 6f 66  n TRUE if all of
1a260 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
1a270 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
1a280 20 28 31 29 20 20 58 20 68 61 73 20 74 68 65 20   (1)  X has the 
1a290 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f  same or lower co
1a2a0 73 74 20 74 68 61 74 20 59 0a 2a 2a 20 20 20 28  st that Y.**   (
1a2b0 32 29 20 20 58 20 69 73 20 61 20 70 72 6f 70 65  2)  X is a prope
1a2c0 72 20 73 75 62 73 65 74 20 6f 66 20 59 0a 2a 2a  r subset of Y.**
1a2d0 20 20 20 28 33 29 20 20 58 20 73 6b 69 70 73 20     (3)  X skips 
1a2e0 61 74 20 6c 65 61 73 74 20 61 73 20 6d 61 6e 79  at least as many
1a2f0 20 63 6f 6c 75 6d 6e 73 20 61 73 20 59 0a 2a 2a   columns as Y.**
1a300 0a 2a 2a 20 42 79 20 22 70 72 6f 70 65 72 20 73  .** By "proper s
1a310 75 62 73 65 74 22 20 77 65 20 6d 65 61 6e 20 74  ubset" we mean t
1a320 68 61 74 20 58 20 75 73 65 73 20 66 65 77 65 72  hat X uses fewer
1a330 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
1a340 72 6d 73 0a 2a 2a 20 74 68 61 6e 20 59 20 61 6e  rms.** than Y an
1a350 64 20 74 68 61 74 20 65 76 65 72 79 20 57 48 45  d that every WHE
1a360 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 75  RE clause term u
1a370 73 65 64 20 62 79 20 58 20 69 73 20 61 6c 73 6f  sed by X is also
1a380 20 75 73 65 64 0a 2a 2a 20 62 79 20 59 2e 0a 2a   used.** by Y..*
1a390 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20 61 20 70  *.** If X is a p
1a3a0 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
1a3b0 59 20 74 68 65 6e 20 59 20 69 73 20 61 20 62 65  Y then Y is a be
1a3c0 74 74 65 72 20 63 68 6f 69 63 65 20 61 6e 64 20  tter choice and 
1a3d0 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 68 61 76 65  ought.** to have
1a3e0 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 2e 20 20   a lower cost.  
1a3f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
1a400 75 72 6e 73 20 54 52 55 45 20 77 68 65 6e 20 74  urns TRUE when t
1a410 68 61 74 20 63 6f 73 74 20 0a 2a 2a 20 72 65 6c  hat cost .** rel
1a420 61 74 69 6f 6e 73 68 69 70 20 69 73 20 69 6e 76  ationship is inv
1a430 65 72 74 65 64 20 61 6e 64 20 6e 65 65 64 73 20  erted and needs 
1a440 74 6f 20 62 65 20 61 64 6a 75 73 74 65 64 2e 20  to be adjusted. 
1a450 20 54 68 65 20 74 68 69 72 64 20 72 75 6c 65 0a   The third rule.
1a460 2a 2a 20 77 61 73 20 61 64 64 65 64 20 62 65 63  ** was added bec
1a470 61 75 73 65 20 69 66 20 58 20 75 73 65 73 20 73  ause if X uses s
1a480 6b 69 70 2d 73 63 61 6e 20 6c 65 73 73 20 74 68  kip-scan less th
1a490 61 6e 20 59 20 69 74 20 73 74 69 6c 6c 20 6d 69  an Y it still mi
1a4a0 67 68 74 0a 2a 2a 20 64 65 73 65 72 76 65 20 61  ght.** deserve a
1a4b0 20 6c 6f 77 65 72 20 63 6f 73 74 20 65 76 65 6e   lower cost even
1a4c0 20 69 66 20 69 74 20 69 73 20 61 20 70 72 6f 70   if it is a prop
1a4d0 65 72 20 73 75 62 73 65 74 20 6f 66 20 59 2e 0a  er subset of Y..
1a4e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
1a4f0 65 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72  ereLoopCheaperPr
1a500 6f 70 65 72 53 75 62 73 65 74 28 0a 20 20 63 6f  operSubset(.  co
1a510 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  nst WhereLoop *p
1a520 58 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  X,       /* Firs
1a530 74 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 63  t WhereLoop to c
1a540 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  ompare */.  cons
1a550 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 59 20  t WhereLoop *pY 
1a560 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72         /* Compar
1a570 65 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 57  e against this W
1a580 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20  hereLoop */.){. 
1a590 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 66 28   int i, j;.  if(
1a5a0 20 70 58 2d 3e 6e 4c 54 65 72 6d 2d 70 58 2d 3e   pX->nLTerm-pX->
1a5b0 6e 53 6b 69 70 20 3e 3d 20 70 59 2d 3e 6e 4c 54  nSkip >= pY->nLT
1a5c0 65 72 6d 2d 70 59 2d 3e 6e 53 6b 69 70 20 29 7b  erm-pY->nSkip ){
1a5d0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f  .    return 0; /
1a5e0 2a 20 58 20 69 73 20 6e 6f 74 20 61 20 73 75 62  * X is not a sub
1a5f0 73 65 74 20 6f 66 20 59 20 2a 2f 0a 20 20 7d 0a  set of Y */.  }.
1a600 20 20 69 66 28 20 70 59 2d 3e 6e 53 6b 69 70 20    if( pY->nSkip 
1a610 3e 20 70 58 2d 3e 6e 53 6b 69 70 20 29 20 72 65  > pX->nSkip ) re
1a620 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 58  turn 0;.  if( pX
1a630 2d 3e 72 52 75 6e 20 3e 3d 20 70 59 2d 3e 72 52  ->rRun >= pY->rR
1a640 75 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 58  un ){.    if( pX
1a650 2d 3e 72 52 75 6e 20 3e 20 70 59 2d 3e 72 52 75  ->rRun > pY->rRu
1a660 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  n ) return 0;   
1a670 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72 65   /* X costs more
1a680 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20 20 20 69   than Y */.    i
1a690 66 28 20 70 58 2d 3e 6e 4f 75 74 20 3e 20 70 59  f( pX->nOut > pY
1a6a0 2d 3e 6e 4f 75 74 20 29 20 72 65 74 75 72 6e 20  ->nOut ) return 
1a6b0 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f 73 74 73  0;    /* X costs
1a6c0 20 6d 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a   more than Y */.
1a6d0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70 58 2d 3e    }.  for(i=pX->
1a6e0 6e 4c 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20  nLTerm-1; i>=0; 
1a6f0 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 70 58  i--){.    if( pX
1a700 2d 3e 61 4c 54 65 72 6d 5b 69 5d 3d 3d 30 20 29  ->aLTerm[i]==0 )
1a710 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66   continue;.    f
1a720 6f 72 28 6a 3d 70 59 2d 3e 6e 4c 54 65 72 6d 2d  or(j=pY->nLTerm-
1a730 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20  1; j>=0; j--){. 
1a740 20 20 20 20 20 69 66 28 20 70 59 2d 3e 61 4c 54       if( pY->aLT
1a750 65 72 6d 5b 6a 5d 3d 3d 70 58 2d 3e 61 4c 54 65  erm[j]==pX->aLTe
1a760 72 6d 5b 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20  rm[i] ) break;. 
1a770 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30     }.    if( j<0
1a780 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
1a790 20 58 20 6e 6f 74 20 61 20 73 75 62 73 65 74 20   X not a subset 
1a7a0 6f 66 20 59 20 73 69 6e 63 65 20 74 65 72 6d 20  of Y since term 
1a7b0 58 5b 69 5d 20 6e 6f 74 20 75 73 65 64 20 62 79  X[i] not used by
1a7c0 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75   Y */.  }.  retu
1a7d0 72 6e 20 31 3b 20 20 2f 2a 20 41 6c 6c 20 63 6f  rn 1;  /* All co
1a7e0 6e 64 69 74 69 6f 6e 73 20 6d 65 65 74 20 2a 2f  nditions meet */
1a7f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  .}../*.** Try to
1a800 20 61 64 6a 75 73 74 20 74 68 65 20 63 6f 73 74   adjust the cost
1a810 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 70 54   of WhereLoop pT
1a820 65 6d 70 6c 61 74 65 20 75 70 77 61 72 64 73 20  emplate upwards 
1a830 6f 72 20 64 6f 77 6e 77 61 72 64 73 20 73 6f 0a  or downwards so.
1a840 2a 2a 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20  ** that:.**.**  
1a850 20 28 31 29 20 70 54 65 6d 70 6c 61 74 65 20 63   (1) pTemplate c
1a860 6f 73 74 73 20 6c 65 73 73 20 74 68 61 6e 20 61  osts less than a
1a870 6e 79 20 6f 74 68 65 72 20 57 68 65 72 65 4c 6f  ny other WhereLo
1a880 6f 70 73 20 74 68 61 74 20 61 72 65 20 61 20 70  ops that are a p
1a890 72 6f 70 65 72 0a 2a 2a 20 20 20 20 20 20 20 73  roper.**       s
1a8a0 75 62 73 65 74 20 6f 66 20 70 54 65 6d 70 6c 61  ubset of pTempla
1a8b0 74 65 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 70  te.**.**   (2) p
1a8c0 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 73 20 6d  Template costs m
1a8d0 6f 72 65 20 74 68 61 6e 20 61 6e 79 20 6f 74 68  ore than any oth
1a8e0 65 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 6f  er WhereLoops fo
1a8f0 72 20 77 68 69 63 68 20 70 54 65 6d 70 6c 61 74  r which pTemplat
1a900 65 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 61 20  e.**       is a 
1a910 70 72 6f 70 65 72 20 73 75 62 73 65 74 2e 0a 2a  proper subset..*
1a920 2a 0a 2a 2a 20 54 6f 20 73 61 79 20 22 57 68 65  *.** To say "Whe
1a930 72 65 4c 6f 6f 70 20 58 20 69 73 20 61 20 70 72  reLoop X is a pr
1a940 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 59  oper subset of Y
1a950 22 20 6d 65 61 6e 73 20 74 68 61 74 20 58 20 75  " means that X u
1a960 73 65 73 20 66 65 77 65 72 0a 2a 2a 20 57 48 45  ses fewer.** WHE
1a970 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
1a980 74 68 61 6e 20 59 20 61 6e 64 20 74 68 61 74 20  than Y and that 
1a990 65 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75  every WHERE clau
1a9a0 73 65 20 74 65 72 6d 20 75 73 65 64 20 62 79 20  se term used by 
1a9b0 58 20 69 73 0a 2a 2a 20 61 6c 73 6f 20 75 73 65  X is.** also use
1a9c0 64 20 62 79 20 59 2e 0a 2a 2f 0a 73 74 61 74 69  d by Y..*/.stati
1a9d0 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
1a9e0 41 64 6a 75 73 74 43 6f 73 74 28 63 6f 6e 73 74  AdjustCost(const
1a9f0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57   WhereLoop *p, W
1aa00 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c  hereLoop *pTempl
1aa10 61 74 65 29 7b 0a 20 20 69 66 28 20 28 70 54 65  ate){.  if( (pTe
1aa20 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20  mplate->wsFlags 
1aa30 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
1aa40 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1aa50 66 6f 72 28 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  for(; p; p=p->pN
1aa60 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 69 66  extLoop){.    if
1aa70 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70  ( p->iTab!=pTemp
1aa80 6c 61 74 65 2d 3e 69 54 61 62 20 29 20 63 6f 6e  late->iTab ) con
1aa90 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
1aaa0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1aab0 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20 29  RE_INDEXED)==0 )
1aac0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
1aad0 66 28 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61  f( whereLoopChea
1aae0 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74 28  perProperSubset(
1aaf0 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 20 29 7b  p, pTemplate) ){
1ab00 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74  .      /* Adjust
1ab10 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 20   pTemplate cost 
1ab20 64 6f 77 6e 77 61 72 64 20 73 6f 20 74 68 61 74  downward so that
1ab30 20 69 74 20 69 73 20 63 68 65 61 70 65 72 20 74   it is cheaper t
1ab40 68 61 6e 20 69 74 73 20 0a 20 20 20 20 20 20 2a  han its .      *
1ab50 2a 20 73 75 62 73 65 74 20 70 2e 20 2a 2f 0a 20  * subset p. */. 
1ab60 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
1ab70 30 78 38 30 2c 28 22 73 75 62 73 65 74 20 63 6f  0x80,("subset co
1ab80 73 74 20 61 64 6a 75 73 74 6d 65 6e 74 20 25 64  st adjustment %d
1ab90 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22 2c  ,%d to %d,%d\n",
1aba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1abb0 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74          pTemplat
1abc0 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c 61  e->rRun, pTempla
1abd0 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52 75  te->nOut, p->rRu
1abe0 6e 2c 20 70 2d 3e 6e 4f 75 74 2d 31 29 29 3b 0a  n, p->nOut-1));.
1abf0 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
1ac00 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b  >rRun = p->rRun;
1ac10 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65  .      pTemplate
1ac20 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74  ->nOut = p->nOut
1ac30 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   - 1;.    }else 
1ac40 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 43 68 65  if( whereLoopChe
1ac50 61 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74  aperProperSubset
1ac60 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 29 20 29  (pTemplate, p) )
1ac70 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73  {.      /* Adjus
1ac80 74 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74  t pTemplate cost
1ac90 20 75 70 77 61 72 64 20 73 6f 20 74 68 61 74 20   upward so that 
1aca0 69 74 20 69 73 20 63 6f 73 74 6c 69 65 72 20 74  it is costlier t
1acb0 68 61 6e 20 70 20 73 69 6e 63 65 0a 20 20 20 20  han p since.    
1acc0 20 20 2a 2a 20 70 54 65 6d 70 6c 61 74 65 20 69    ** pTemplate i
1acd0 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65  s a proper subse
1ace0 74 20 6f 66 20 70 20 2a 2f 0a 20 20 20 20 20 20  t of p */.      
1acf0 57 48 45 52 45 54 52 41 43 45 28 30 78 38 30 2c  WHERETRACE(0x80,
1ad00 28 22 73 75 62 73 65 74 20 63 6f 73 74 20 61 64  ("subset cost ad
1ad10 6a 75 73 74 6d 65 6e 74 20 25 64 2c 25 64 20 74  justment %d,%d t
1ad20 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a 20 20 20 20  o %d,%d\n",.    
1ad30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad40 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52     pTemplate->rR
1ad50 75 6e 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e  un, pTemplate->n
1ad60 4f 75 74 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d  Out, p->rRun, p-
1ad70 3e 6e 4f 75 74 2b 31 29 29 3b 0a 20 20 20 20 20  >nOut+1));.     
1ad80 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e   pTemplate->rRun
1ad90 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20   = p->rRun;.    
1ada0 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75    pTemplate->nOu
1adb0 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2b 20 31 3b  t = p->nOut + 1;
1adc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1add0 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 6c  .** Search the l
1ade0 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  ist of WhereLoop
1adf0 73 20 69 6e 20 2a 70 70 50 72 65 76 20 6c 6f 6f  s in *ppPrev loo
1ae00 6b 69 6e 67 20 66 6f 72 20 6f 6e 65 20 74 68 61  king for one tha
1ae10 74 20 63 61 6e 20 62 65 0a 2a 2a 20 73 75 70 70  t can be.** supp
1ae20 6c 61 6e 74 65 64 20 62 79 20 70 54 65 6d 70 6c  lanted by pTempl
1ae30 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ate..**.** Retur
1ae40 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 57 68  n NULL if the Wh
1ae50 65 72 65 4c 6f 6f 70 20 6c 69 73 74 20 63 6f 6e  ereLoop list con
1ae60 74 61 69 6e 73 20 61 6e 20 65 6e 74 72 79 20 74  tains an entry t
1ae70 68 61 74 20 63 61 6e 20 73 75 70 70 6c 61 6e 74  hat can supplant
1ae80 0a 2a 2a 20 70 54 65 6d 70 6c 61 74 65 2c 20 69  .** pTemplate, i
1ae90 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66  n other words if
1aea0 20 70 54 65 6d 70 6c 61 74 65 20 64 6f 65 73 20   pTemplate does 
1aeb0 6e 6f 74 20 62 65 6c 6f 6e 67 20 6f 6e 20 74 68  not belong on th
1aec0 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  e list..**.** If
1aed0 20 70 58 20 69 73 20 61 20 57 68 65 72 65 4c 6f   pX is a WhereLo
1aee0 6f 70 20 74 68 61 74 20 70 54 65 6d 70 6c 61 74  op that pTemplat
1aef0 65 20 63 61 6e 20 73 75 70 70 6c 61 6e 74 2c 20  e can supplant, 
1af00 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 0a  then return the.
1af10 2a 2a 20 6c 69 6e 6b 20 74 68 61 74 20 70 6f 69  ** link that poi
1af20 6e 74 73 20 74 6f 20 70 58 2e 0a 2a 2a 0a 2a 2a  nts to pX..**.**
1af30 20 49 66 20 70 54 65 6d 70 6c 61 74 65 20 63 61   If pTemplate ca
1af40 6e 6e 6f 74 20 73 75 70 70 6c 61 6e 74 20 61 6e  nnot supplant an
1af50 79 20 65 78 69 73 74 69 6e 67 20 65 6c 65 6d 65  y existing eleme
1af60 6e 74 20 6f 66 20 74 68 65 20 6c 69 73 74 20 62  nt of the list b
1af70 75 74 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62  ut needs.** to b
1af80 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c  e added to the l
1af90 69 73 74 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ist, then return
1afa0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1afb0 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20 6c 69  e tail of the li
1afc0 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68  st..*/.static Wh
1afd0 65 72 65 4c 6f 6f 70 20 2a 2a 77 68 65 72 65 4c  ereLoop **whereL
1afe0 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 0a 20  oopFindLesser(. 
1aff0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50   WhereLoop **ppP
1b000 72 65 76 2c 0a 20 20 63 6f 6e 73 74 20 57 68 65  rev,.  const Whe
1b010 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74  reLoop *pTemplat
1b020 65 0a 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  e.){.  WhereLoop
1b030 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 28 2a 70   *p;.  for(p=(*p
1b040 70 50 72 65 76 29 3b 20 70 3b 20 70 70 50 72 65  pPrev); p; ppPre
1b050 76 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c  v=&p->pNextLoop,
1b060 20 70 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20 20   p=*ppPrev){.   
1b070 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54   if( p->iTab!=pT
1b080 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c 7c  emplate->iTab ||
1b090 20 70 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70 54   p->iSortIdx!=pT
1b0a0 65 6d 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49 64  emplate->iSortId
1b0b0 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  x ){.      /* If
1b0c0 20 65 69 74 68 65 72 20 74 68 65 20 69 54 61 62   either the iTab
1b0d0 20 6f 72 20 69 53 6f 72 74 49 64 78 20 76 61 6c   or iSortIdx val
1b0e0 75 65 73 20 66 6f 72 20 74 77 6f 20 57 68 65 72  ues for two Wher
1b0f0 65 4c 6f 6f 70 20 61 72 65 20 64 69 66 66 65 72  eLoop are differ
1b100 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ent.      ** the
1b110 6e 20 74 68 6f 73 65 20 57 68 65 72 65 4c 6f 6f  n those WhereLoo
1b120 70 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f  ps need to be co
1b130 6e 73 69 64 65 72 65 64 20 73 65 70 61 72 61 74  nsidered separat
1b140 65 6c 79 2e 20 20 4e 65 69 74 68 65 72 20 69 73  ely.  Neither is
1b150 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 61 6e 64  .      ** a cand
1b160 69 64 61 74 65 20 74 6f 20 72 65 70 6c 61 63 65  idate to replace
1b170 20 74 68 65 20 6f 74 68 65 72 2e 20 2a 2f 0a 20   the other. */. 
1b180 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1b190 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 20 74     }.    /* In t
1b1a0 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
1b1b0 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20 72  mentation, the r
1b1c0 53 65 74 75 70 20 76 61 6c 75 65 20 69 73 20 65  Setup value is e
1b1d0 69 74 68 65 72 20 7a 65 72 6f 0a 20 20 20 20 2a  ither zero.    *
1b1e0 2a 20 6f 72 20 74 68 65 20 63 6f 73 74 20 6f 66  * or the cost of
1b1f0 20 62 75 69 6c 64 69 6e 67 20 61 6e 20 61 75 74   building an aut
1b200 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 28 4e 6c  omatic index (Nl
1b210 6f 67 4e 29 20 61 6e 64 20 74 68 65 20 4e 6c 6f  ogN) and the Nlo
1b220 67 4e 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65  gN.    ** is the
1b230 20 73 61 6d 65 20 66 6f 72 20 63 6f 6d 70 61 74   same for compat
1b240 69 62 6c 65 20 57 68 65 72 65 4c 6f 6f 70 73 2e  ible WhereLoops.
1b250 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1b260 70 2d 3e 72 53 65 74 75 70 3d 3d 30 20 7c 7c 20  p->rSetup==0 || 
1b270 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
1b280 70 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  p==0 .          
1b290 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72 53 65         || p->rSe
1b2a0 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  tup==pTemplate->
1b2b0 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f  rSetup );..    /
1b2c0 2a 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  * whereLoopAddBt
1b2d0 72 65 65 28 29 20 61 6c 77 61 79 73 20 67 65 6e  ree() always gen
1b2e0 65 72 61 74 65 73 20 61 6e 64 20 69 6e 73 65 72  erates and inser
1b2f0 74 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ts the automatic
1b300 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63 61   index.    ** ca
1b310 73 65 20 66 69 72 73 74 2e 20 20 48 65 6e 63 65  se first.  Hence
1b320 20 63 6f 6d 70 61 74 69 62 6c 65 20 63 61 6e 64   compatible cand
1b330 69 64 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 73  idate WhereLoops
1b340 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 6c 61   never have a la
1b350 72 67 65 72 0a 20 20 20 20 2a 2a 20 72 53 65 74  rger.    ** rSet
1b360 75 70 2e 20 43 61 6c 6c 20 74 68 69 73 20 53 45  up. Call this SE
1b370 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 2a 2f  TUP-INVARIANT */
1b380 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
1b390 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74  rSetup>=pTemplat
1b3a0 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20  e->rSetup );..  
1b3b0 20 20 2f 2a 20 41 6e 79 20 6c 6f 6f 70 20 75 73    /* Any loop us
1b3c0 69 6e 67 20 61 6e 20 61 70 70 6c 69 61 74 69 6f  ing an appliatio
1b3d0 6e 2d 64 65 66 69 6e 65 64 20 69 6e 64 65 78 20  n-defined index 
1b3e0 28 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20  (or PRIMARY KEY 
1b3f0 6f 72 0a 20 20 20 20 2a 2a 20 55 4e 49 51 55 45  or.    ** UNIQUE
1b400 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 77 69 74   constraint) wit
1b410 68 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 3d 3d  h one or more ==
1b420 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 73 20   constraints is 
1b430 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74 68  better.    ** th
1b440 61 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  an an automatic 
1b450 69 6e 64 65 78 2e 20 55 6e 6c 65 73 73 20 69 74  index. Unless it
1b460 20 69 73 20 61 20 73 6b 69 70 2d 73 63 61 6e 2e   is a skip-scan.
1b470 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   */.    if( (p->
1b480 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1b490 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 0a 20  AUTO_INDEX)!=0. 
1b4a0 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74      && (pTemplat
1b4b0 65 2d 3e 6e 53 6b 69 70 29 3d 3d 30 0a 20 20 20  e->nSkip)==0.   
1b4c0 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d    && (pTemplate-
1b4d0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1b4e0 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20  _INDEXED)!=0.   
1b4f0 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d    && (pTemplate-
1b500 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1b510 5f 43 4f 4c 55 4d 4e 5f 45 51 29 21 3d 30 0a 20  _COLUMN_EQ)!=0. 
1b520 20 20 20 20 26 26 20 28 70 2d 3e 70 72 65 72 65      && (p->prere
1b530 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70  q & pTemplate->p
1b540 72 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74  rereq)==pTemplat
1b550 65 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 29 7b  e->prereq.    ){
1b560 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1b570 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 65    }..    /* If e
1b580 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
1b590 70 20 70 20 69 73 20 62 65 74 74 65 72 20 74 68  p p is better th
1b5a0 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 70 54  an pTemplate, pT
1b5b0 65 6d 70 6c 61 74 65 20 63 61 6e 20 62 65 0a 20  emplate can be. 
1b5c0 20 20 20 2a 2a 20 64 69 73 63 61 72 64 65 64 2e     ** discarded.
1b5d0 20 20 57 68 65 72 65 4c 6f 6f 70 20 70 20 69 73    WhereLoop p is
1b5e0 20 62 65 74 74 65 72 20 69 66 3a 0a 20 20 20 20   better if:.    
1b5f0 2a 2a 20 20 20 28 31 29 20 20 70 20 68 61 73 20  **   (1)  p has 
1b600 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64 65 6e  no more dependen
1b610 63 69 65 73 20 74 68 61 6e 20 70 54 65 6d 70 6c  cies than pTempl
1b620 61 74 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20  ate, and.    ** 
1b630 20 20 28 32 29 20 20 70 20 68 61 73 20 61 6e 20    (2)  p has an 
1b640 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20 63  equal or lower c
1b650 6f 73 74 20 74 68 61 6e 20 70 54 65 6d 70 6c 61  ost than pTempla
1b660 74 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  te.    */.    if
1b670 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  ( (p->prereq & p
1b680 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
1b690 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 20 20 20  )==p->prereq    
1b6a0 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20 20 20  /* (1)  */.     
1b6b0 26 26 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70 54  && p->rSetup<=pT
1b6c0 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20  emplate->rSetup 
1b6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6e0 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20   /* (2a) */.    
1b6f0 20 26 26 20 70 2d 3e 72 52 75 6e 3c 3d 70 54 65   && p->rRun<=pTe
1b700 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20 20  mplate->rRun    
1b710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b720 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20    /* (2b) */.   
1b730 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3c 3d 70 54    && p->nOut<=pT
1b740 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20  emplate->nOut   
1b750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b760 20 20 20 2f 2a 20 28 32 63 29 20 2a 2f 0a 20 20     /* (2c) */.  
1b770 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
1b780 6e 20 30 3b 20 20 2f 2a 20 44 69 73 63 61 72 64  n 0;  /* Discard
1b790 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20   pTemplate */.  
1b7a0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70    }..    /* If p
1b7b0 54 65 6d 70 6c 61 74 65 20 69 73 20 61 6c 77 61  Template is alwa
1b7c0 79 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 70  ys better than p
1b7d0 2c 20 74 68 65 6e 20 63 61 75 73 65 20 70 20 74  , then cause p t
1b7e0 6f 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  o be overwritten
1b7f0 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 70 54 65  .    ** with pTe
1b800 6d 70 6c 61 74 65 2e 20 20 70 54 65 6d 70 6c 61  mplate.  pTempla
1b810 74 65 20 69 73 20 62 65 74 74 65 72 20 74 68 61  te is better tha
1b820 6e 20 70 20 69 66 3a 0a 20 20 20 20 2a 2a 20 20  n p if:.    **  
1b830 20 28 31 29 20 20 70 54 65 6d 70 6c 61 74 65 20   (1)  pTemplate 
1b840 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65  has no more depe
1b850 6e 64 65 6e 63 65 73 20 74 68 61 6e 20 70 2c 20  ndences than p, 
1b860 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28 32 29  and.    **   (2)
1b870 20 20 70 54 65 6d 70 6c 61 74 65 20 68 61 73 20    pTemplate has 
1b880 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65  an equal or lowe
1b890 72 20 63 6f 73 74 20 74 68 61 6e 20 70 2e 0a 20  r cost than p.. 
1b8a0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
1b8b0 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70  ->prereq & pTemp
1b8c0 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70  late->prereq)==p
1b8d0 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
1b8e0 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20     /* (1)  */.  
1b8f0 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d 70     && p->rRun>=p
1b900 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20  Template->rRun  
1b910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
1b930 61 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d  a) */.     && p-
1b940 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c 61 74 65  >nOut>=pTemplate
1b950 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20  ->nOut          
1b960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b970 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20     /* (2b) */.  
1b980 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72    ){.      asser
1b990 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54  t( p->rSetup>=pT
1b9a0 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20  emplate->rSetup 
1b9b0 29 3b 20 2f 2a 20 53 45 54 55 50 2d 49 4e 56 41  ); /* SETUP-INVA
1b9c0 52 49 41 4e 54 20 61 62 6f 76 65 20 2a 2f 0a 20  RIANT above */. 
1b9d0 20 20 20 20 20 62 72 65 61 6b 3b 20 20 20 2f 2a       break;   /*
1b9e0 20 43 61 75 73 65 20 70 20 74 6f 20 62 65 20 6f   Cause p to be o
1b9f0 76 65 72 77 72 69 74 74 65 6e 20 62 79 20 70 54  verwritten by pT
1ba00 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 7d  emplate */.    }
1ba10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 70  .  }.  return pp
1ba20 50 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  Prev;.}../*.** I
1ba30 6e 73 65 72 74 20 6f 72 20 72 65 70 6c 61 63 65  nsert or replace
1ba40 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74   a WhereLoop ent
1ba50 72 79 20 75 73 69 6e 67 20 74 68 65 20 74 65 6d  ry using the tem
1ba60 70 6c 61 74 65 20 73 75 70 70 6c 69 65 64 2e 0a  plate supplied..
1ba70 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e  **.** An existin
1ba80 67 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72  g WhereLoop entr
1ba90 79 20 6d 69 67 68 74 20 62 65 20 6f 76 65 72 77  y might be overw
1baa0 72 69 74 74 65 6e 20 69 66 20 74 68 65 20 6e 65  ritten if the ne
1bab0 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73  w template.** is
1bac0 20 62 65 74 74 65 72 20 61 6e 64 20 68 61 73 20   better and has 
1bad0 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69  fewer dependenci
1bae0 65 73 2e 20 20 4f 72 20 74 68 65 20 74 65 6d 70  es.  Or the temp
1baf0 6c 61 74 65 20 77 69 6c 6c 20 62 65 20 69 67 6e  late will be ign
1bb00 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69  ored.** and no i
1bb10 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63 63 75 72  nsert will occur
1bb20 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
1bb30 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 66 61 73  WhereLoop is fas
1bb40 74 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66  ter and has.** f
1bb50 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65  ewer dependencie
1bb60 73 20 74 68 61 6e 20 74 68 65 20 74 65 6d 70 6c  s than the templ
1bb70 61 74 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20  ate.  Otherwise 
1bb80 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20  a new WhereLoop 
1bb90 69 73 0a 2a 2a 20 61 64 64 65 64 20 62 61 73 65  is.** added base
1bba0 64 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61 74  d on the templat
1bbb0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69  e..**.** If pBui
1bbc0 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
1bbd0 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65  not NULL then we
1bbe0 20 63 61 72 65 20 61 62 6f 75 74 20 6f 6e 6c 79   care about only
1bbf0 20 74 68 65 0a 2a 2a 20 70 72 65 72 65 71 75 69   the.** prerequi
1bc00 73 69 74 65 73 20 61 6e 64 20 72 52 75 6e 20 61  sites and rRun a
1bc10 6e 64 20 6e 4f 75 74 20 63 6f 73 74 73 20 6f 66  nd nOut costs of
1bc20 20 74 68 65 20 4e 20 62 65 73 74 20 6c 6f 6f 70   the N best loop
1bc30 73 2e 20 20 54 68 61 74 0a 2a 2a 20 69 6e 66 6f  s.  That.** info
1bc40 72 6d 61 74 69 6f 6e 20 69 73 20 67 61 74 68 65  rmation is gathe
1bc50 72 65 64 20 69 6e 20 74 68 65 20 70 42 75 69 6c  red in the pBuil
1bc60 64 65 72 2d 3e 70 4f 72 53 65 74 20 6f 62 6a 65  der->pOrSet obje
1bc70 63 74 2e 20 20 54 68 69 73 20 73 70 65 63 69 61  ct.  This specia
1bc80 6c 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20  l.** processing 
1bc90 6d 6f 64 65 20 69 73 20 75 73 65 64 20 6f 6e 6c  mode is used onl
1bca0 79 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20  y for OR clause 
1bcb0 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a  processing..**.*
1bcc0 2a 20 57 68 65 6e 20 61 63 63 75 6d 75 6c 61 74  * When accumulat
1bcd0 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 6c 6f 6f  ing multiple loo
1bce0 70 73 20 28 77 68 65 6e 20 70 42 75 69 6c 64 65  ps (when pBuilde
1bcf0 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 4e 55 4c  r->pOrSet is NUL
1bd00 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c 6c 20 6d  L) we.** still m
1bd10 69 67 68 74 20 6f 76 65 72 77 72 69 74 65 20 73  ight overwrite s
1bd20 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20 77 69 74  imilar loops wit
1bd30 68 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61  h the new templa
1bd40 74 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77  te if the.** new
1bd50 20 74 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74   template is bet
1bd60 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79 20  ter.  Loops may 
1bd70 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69  be overwritten i
1bd80 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1bd90 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61  .** conditions a
1bda0 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  re met:.**.**   
1bdb0 20 28 31 29 20 20 54 68 65 79 20 68 61 76 65 20   (1)  They have 
1bdc0 74 68 65 20 73 61 6d 65 20 69 54 61 62 2e 0a 2a  the same iTab..*
1bdd0 2a 20 20 20 20 28 32 29 20 20 54 68 65 79 20 68  *    (2)  They h
1bde0 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 53 6f  ave the same iSo
1bdf0 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33 29  rtIdx..**    (3)
1be00 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68    The template h
1be10 61 73 20 73 61 6d 65 20 6f 72 20 66 65 77 65 72  as same or fewer
1be20 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68   dependencies th
1be30 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  an the current l
1be40 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20 20 54  oop.**    (4)  T
1be50 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20  he template has 
1be60 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65  the same or lowe
1be70 72 20 63 6f 73 74 20 74 68 61 6e 20 74 68 65 20  r cost than the 
1be80 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2f 0a  current loop.*/.
1be90 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
1bea0 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68 65 72 65  LoopInsert(Where
1beb0 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
1bec0 69 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f 70  ilder, WhereLoop
1bed0 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20   *pTemplate){.  
1bee0 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72  WhereLoop **ppPr
1bef0 65 76 2c 20 2a 70 3b 0a 20 20 57 68 65 72 65 49  ev, *p;.  WhereI
1bf00 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
1bf10 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
1bf20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1bf30 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
1bf40 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75  db;..  /* If pBu
1bf50 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73  ilder->pOrSet is
1bf60 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f   defined, then o
1bf70 6e 6c 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f  nly keep track o
1bf80 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a  f the costs.  **
1bf90 20 61 6e 64 20 70 72 65 72 65 71 73 2e 0a 20 20   and prereqs..  
1bfa0 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65  */.  if( pBuilde
1bfb0 72 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a  r->pOrSet!=0 ){.
1bfc0 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
1bfd0 4e 41 42 4c 45 44 0a 20 20 20 20 75 31 36 20 6e  NABLED.    u16 n
1bfe0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72   = pBuilder->pOr
1bff0 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 69 6e 74 20  Set->n;.    int 
1c000 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20 77  x =.#endif.    w
1c010 68 65 72 65 4f 72 49 6e 73 65 72 74 28 70 42 75  hereOrInsert(pBu
1c020 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c 20 70  ilder->pOrSet, p
1c030 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
1c040 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75  , pTemplate->rRu
1c050 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
1c060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c070 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65         pTemplate
1c080 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57 48 45  ->nOut);.#if WHE
1c090 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
1c0a0 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 69 66  /* 0x8 */.    if
1c0b0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
1c0c0 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20  ace & 0x8 ){.   
1c0d0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1c0e0 72 69 6e 74 66 28 78 3f 22 20 20 20 6f 72 2d 25  rintf(x?"   or-%
1c0f0 64 3a 20 20 22 3a 22 20 20 20 6f 72 2d 58 3a 20  d:  ":"   or-X: 
1c100 20 22 2c 20 6e 29 3b 0a 20 20 20 20 20 20 77 68   ", n);.      wh
1c110 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65  ereLoopPrint(pTe
1c120 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72  mplate, pBuilder
1c130 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65  ->pWC);.    }.#e
1c140 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
1c150 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
1c160 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e    /* Look for an
1c170 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
1c180 6f 6f 70 20 74 6f 20 72 65 70 6c 61 63 65 20 77  oop to replace w
1c190 69 74 68 20 70 54 65 6d 70 6c 61 74 65 0a 20 20  ith pTemplate.  
1c1a0 2a 2f 0a 20 20 77 68 65 72 65 4c 6f 6f 70 41 64  */.  whereLoopAd
1c1b0 6a 75 73 74 43 6f 73 74 28 70 57 49 6e 66 6f 2d  justCost(pWInfo-
1c1c0 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61  >pLoops, pTempla
1c1d0 74 65 29 3b 0a 20 20 70 70 50 72 65 76 20 3d 20  te);.  ppPrev = 
1c1e0 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73  whereLoopFindLes
1c1f0 73 65 72 28 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f  ser(&pWInfo->pLo
1c200 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  ops, pTemplate);
1c210 0a 0a 20 20 69 66 28 20 70 70 50 72 65 76 3d 3d  ..  if( ppPrev==
1c220 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
1c230 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
1c240 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 6e 20   a WhereLoop on 
1c250 74 68 65 20 6c 69 73 74 20 74 68 61 74 20 69 73  the list that is
1c260 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74   better.    ** t
1c270 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 73  han pTemplate, s
1c280 6f 20 6a 75 73 74 20 69 67 6e 6f 72 65 20 70 54  o just ignore pT
1c290 65 6d 70 6c 61 74 65 20 2a 2f 0a 23 69 66 20 57  emplate */.#if W
1c2a0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
1c2b0 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20  D /* 0x8 */.    
1c2c0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
1c2d0 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
1c2e0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
1c2f0 67 50 72 69 6e 74 66 28 22 20 20 20 73 6b 69 70  gPrintf("   skip
1c300 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72  : ");.      wher
1c310 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70  eLoopPrint(pTemp
1c320 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e  late, pBuilder->
1c330 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  pWC);.    }.#end
1c340 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
1c350 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20 20 7d 65 6c  LITE_OK;  .  }el
1c360 73 65 7b 0a 20 20 20 20 70 20 3d 20 2a 70 70 50  se{.    p = *ppP
1c370 72 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  rev;.  }..  /* I
1c380 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
1c390 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20 74  point it means t
1c3a0 68 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20 73  hat either p[] s
1c3b0 68 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72 69  hould be overwri
1c3c0 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70  tten.  ** with p
1c3d0 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b  Template[] if p[
1c3e0 5d 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66 20  ] exists, or if 
1c3f0 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c  p==NULL then all
1c400 6f 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a  ocate a new.  **
1c410 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69   WhereLoop and i
1c420 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23  nsert it..  */.#
1c430 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
1c440 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
1c450 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
1c460 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
1c470 0a 20 20 20 20 69 66 28 20 70 21 3d 30 20 29 7b  .    if( p!=0 ){
1c480 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
1c490 62 75 67 50 72 69 6e 74 66 28 22 72 65 70 6c 61  bugPrintf("repla
1c4a0 63 65 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68  ce: ");.      wh
1c4b0 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20  ereLoopPrint(p, 
1c4c0 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
1c4d0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1c4e0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
1c4f0 20 20 61 64 64 3a 20 22 29 3b 0a 20 20 20 20 77    add: ");.    w
1c500 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54  hereLoopPrint(pT
1c510 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65  emplate, pBuilde
1c520 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e  r->pWC);.  }.#en
1c530 64 69 66 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  dif.  if( p==0 )
1c540 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  {.    /* Allocat
1c550 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f  e a new WhereLoo
1c560 70 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20  p to add to the 
1c570 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 73 74 20  end of the list 
1c580 2a 2f 0a 20 20 20 20 2a 70 70 50 72 65 76 20 3d  */.    *ppPrev =
1c590 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   p = sqlite3DbMa
1c5a0 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
1c5b0 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a  of(WhereLoop));.
1c5c0 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72      if( p==0 ) r
1c5d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1c5e0 45 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f  EM;.    whereLoo
1c5f0 70 49 6e 69 74 28 70 29 3b 0a 20 20 20 20 70 2d  pInit(p);.    p-
1c600 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 30 3b 0a  >pNextLoop = 0;.
1c610 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1c620 57 65 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77  We will be overw
1c630 72 69 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  riting WhereLoop
1c640 20 70 5b 5d 2e 20 20 42 75 74 20 62 65 66 6f 72   p[].  But befor
1c650 65 20 77 65 20 64 6f 2c 20 66 69 72 73 74 0a 20  e we do, first. 
1c660 20 20 20 2a 2a 20 67 6f 20 74 68 72 6f 75 67 68     ** go through
1c670 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
1c680 20 6c 69 73 74 20 61 6e 64 20 64 65 6c 65 74 65   list and delete
1c690 20 61 6e 79 20 6f 74 68 65 72 20 65 6e 74 72 69   any other entri
1c6a0 65 73 20 62 65 73 69 64 65 73 0a 20 20 20 20 2a  es besides.    *
1c6b0 2a 20 70 5b 5d 20 74 68 61 74 20 61 72 65 20 61  * p[] that are a
1c6c0 6c 73 6f 20 73 75 70 70 6c 61 74 65 64 20 62 79  lso supplated by
1c6d0 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20   pTemplate */.  
1c6e0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70    WhereLoop **pp
1c6f0 54 61 69 6c 20 3d 20 26 70 2d 3e 70 4e 65 78 74  Tail = &p->pNext
1c700 4c 6f 6f 70 3b 0a 20 20 20 20 57 68 65 72 65 4c  Loop;.    WhereL
1c710 6f 6f 70 20 2a 70 54 6f 44 65 6c 3b 0a 20 20 20  oop *pToDel;.   
1c720 20 77 68 69 6c 65 28 20 2a 70 70 54 61 69 6c 20   while( *ppTail 
1c730 29 7b 0a 20 20 20 20 20 20 70 70 54 61 69 6c 20  ){.      ppTail 
1c740 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c  = whereLoopFindL
1c750 65 73 73 65 72 28 70 70 54 61 69 6c 2c 20 70 54  esser(ppTail, pT
1c760 65 6d 70 6c 61 74 65 29 3b 0a 20 20 20 20 20 20  emplate);.      
1c770 69 66 28 20 70 70 54 61 69 6c 3d 3d 30 20 29 20  if( ppTail==0 ) 
1c780 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 54 6f  break;.      pTo
1c790 44 65 6c 20 3d 20 2a 70 70 54 61 69 6c 3b 0a 20  Del = *ppTail;. 
1c7a0 20 20 20 20 20 69 66 28 20 70 54 6f 44 65 6c 3d       if( pToDel=
1c7b0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
1c7c0 20 20 2a 70 70 54 61 69 6c 20 3d 20 70 54 6f 44    *ppTail = pToD
1c7d0 65 6c 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 23  el->pNextLoop;.#
1c7e0 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
1c7f0 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
1c800 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1c810 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
1c820 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  8 ){.        sql
1c830 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1c840 22 20 64 65 6c 65 74 65 3a 20 22 29 3b 0a 20 20  " delete: ");.  
1c850 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
1c860 72 69 6e 74 28 70 54 6f 44 65 6c 2c 20 70 42 75  rint(pToDel, pBu
1c870 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20  ilder->pWC);.   
1c880 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1c890 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74    whereLoopDelet
1c8a0 65 28 64 62 2c 20 70 54 6f 44 65 6c 29 3b 0a 20  e(db, pToDel);. 
1c8b0 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 65 72 65     }.  }.  where
1c8c0 4c 6f 6f 70 58 66 65 72 28 64 62 2c 20 70 2c 20  LoopXfer(db, p, 
1c8d0 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 69 66  pTemplate);.  if
1c8e0 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
1c8f0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
1c900 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e  LE)==0 ){.    In
1c910 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d  dex *pIndex = p-
1c920 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
1c930 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20  .    if( pIndex 
1c940 26 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d  && pIndex->tnum=
1c950 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75  =0 ){.      p->u
1c960 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
1c970 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
1c980 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c990 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
1c9a0 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e   the WhereLoop.n
1c9b0 4f 75 74 20 76 61 6c 75 65 20 64 6f 77 6e 77 61  Out value downwa
1c9c0 72 64 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f  rd to account fo
1c9d0 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  r terms of the.*
1c9e0 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  * WHERE clause t
1c9f0 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68  hat reference th
1ca00 65 20 6c 6f 6f 70 20 62 75 74 20 77 68 69 63 68  e loop but which
1ca10 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 62 79   are not used by
1ca20 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 0a   an.** index..*.
1ca30 2a 2a 20 46 6f 72 20 65 76 65 72 79 20 57 48 45  ** For every WHE
1ca40 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  RE clause term t
1ca50 68 61 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20  hat is not used 
1ca60 62 79 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20  by the index.** 
1ca70 61 6e 64 20 77 68 69 63 68 20 68 61 73 20 61 20  and which has a 
1ca80 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74  truth probabilit
1ca90 79 20 61 73 73 69 67 6e 65 64 20 62 79 20 6f 6e  y assigned by on
1caa0 65 20 6f 66 20 74 68 65 20 6c 69 6b 65 6c 69 68  e of the likelih
1cab0 6f 6f 64 28 29 2c 0a 2a 2a 20 6c 69 6b 65 6c 79  ood(),.** likely
1cac0 28 29 2c 20 6f 72 20 75 6e 6c 69 6b 65 6c 79 28  (), or unlikely(
1cad0 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 2c  ) SQL functions,
1cae0 20 72 65 64 75 63 65 20 74 68 65 20 65 73 74 69   reduce the esti
1caf0 6d 61 74 65 64 20 6e 75 6d 62 65 72 0a 2a 2a 20  mated number.** 
1cb00 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 62  of output rows b
1cb10 79 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  y the probabilit
1cb20 79 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a  y specified..**.
1cb30 2a 2a 20 54 55 4e 49 4e 47 3a 20 20 46 6f 72 20  ** TUNING:  For 
1cb40 65 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75  every WHERE clau
1cb50 73 65 20 74 65 72 6d 20 74 68 61 74 20 69 73 20  se term that is 
1cb60 6e 6f 74 20 75 73 65 64 20 62 79 20 74 68 65 20  not used by the 
1cb70 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77 68 69  index.** and whi
1cb80 63 68 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ch does not have
1cb90 20 61 6e 20 61 73 73 69 67 6e 65 64 20 74 72 75   an assigned tru
1cba0 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2c 20  th probability, 
1cbb0 68 65 75 72 69 73 74 69 63 73 0a 2a 2a 20 64 65  heuristics.** de
1cbc0 73 63 72 69 62 65 64 20 62 65 6c 6f 77 20 61 72  scribed below ar
1cbd0 65 20 75 73 65 64 20 74 6f 20 74 72 79 20 74 6f  e used to try to
1cbe0 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 74 72   estimate the tr
1cbf0 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2e  uth probability.
1cc00 0a 2a 2a 20 54 4f 44 4f 20 2d 2d 3e 20 50 65 72  .** TODO --> Per
1cc10 68 61 70 73 20 74 68 69 73 20 69 73 20 73 6f 6d  haps this is som
1cc20 65 74 68 69 6e 67 20 74 68 61 74 20 63 6f 75 6c  ething that coul
1cc30 64 20 62 65 20 69 6d 70 72 6f 76 65 64 20 62 79  d be improved by
1cc40 20 62 65 74 74 65 72 0a 2a 2a 20 74 61 62 6c 65   better.** table
1cc50 20 73 74 61 74 69 73 74 69 63 73 2e 0a 2a 2a 0a   statistics..**.
1cc60 2a 2a 20 48 65 75 72 69 73 74 69 63 20 31 3a 20  ** Heuristic 1: 
1cc70 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 74 72   Estimate the tr
1cc80 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20  uth probability 
1cc90 61 73 20 39 33 2e 37 35 25 2e 20 20 54 68 65 20  as 93.75%.  The 
1cca0 39 33 2e 37 35 25 0a 2a 2a 20 76 61 6c 75 65 20  93.75%.** value 
1ccb0 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 2d  corresponds to -
1ccc0 31 20 69 6e 20 4c 6f 67 45 73 74 20 6e 6f 74 61  1 in LogEst nota
1ccd0 74 69 6f 6e 2c 20 73 6f 20 74 68 69 73 20 6d 65  tion, so this me
1cce0 61 6e 73 20 64 65 63 72 65 6d 65 6e 74 0a 2a 2a  ans decrement.**
1ccf0 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e   the WhereLoop.n
1cd00 4f 75 74 20 66 69 65 6c 64 20 66 6f 72 20 65 76  Out field for ev
1cd10 65 72 79 20 73 75 63 68 20 57 48 45 52 45 20 63  ery such WHERE c
1cd20 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 0a 2a  lause term..**.*
1cd30 2a 20 48 65 75 72 69 73 74 69 63 20 32 3a 20 20  * Heuristic 2:  
1cd40 49 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  If there exists 
1cd50 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48 45 52  one or more WHER
1cd60 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f  E clause terms o
1cd70 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 22 78  f the.** form "x
1cd80 3d 3d 45 58 50 52 22 20 61 6e 64 20 45 58 50 52  ==EXPR" and EXPR
1cd90 20 69 73 20 6e 6f 74 20 61 20 63 6f 6e 73 74 61   is not a consta
1cda0 6e 74 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20  nt 0 or 1, then 
1cdb0 6d 61 6b 65 20 73 75 72 65 20 74 68 65 0a 2a 2a  make sure the.**
1cdc0 20 66 69 6e 61 6c 20 6f 75 74 70 75 74 20 72 6f   final output ro
1cdd0 77 20 65 73 74 69 6d 61 74 65 20 69 73 20 6e 6f  w estimate is no
1cde0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 31 2f   greater than 1/
1cdf0 34 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 6e  4 of the total n
1ce00 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73  umber.** of rows
1ce10 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
1ce20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1ce30 61 73 73 75 6d 65 20 74 68 61 74 20 78 3d 3d 45  assume that x==E
1ce40 58 50 52 20 77 69 6c 6c 20 66 69 6c 74 65 72 0a  XPR will filter.
1ce50 2a 2a 20 6f 75 74 20 61 74 20 6c 65 61 73 74 20  ** out at least 
1ce60 33 20 6f 75 74 20 6f 66 20 34 20 72 6f 77 73 2e  3 out of 4 rows.
1ce70 20 20 49 66 20 45 58 50 52 20 69 73 20 2d 31 20    If EXPR is -1 
1ce80 6f 72 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20  or 0 or 1, then 
1ce90 6d 61 79 62 65 20 74 68 65 0a 2a 2a 20 22 78 22  maybe the.** "x"
1cea0 20 63 6f 6c 75 6d 6e 20 69 73 20 62 6f 6f 6c 65   column is boole
1ceb0 61 6e 20 6f 72 20 65 6c 73 65 20 2d 31 20 6f 72  an or else -1 or
1cec0 20 30 20 6f 72 20 31 20 69 73 20 61 20 63 6f 6d   0 or 1 is a com
1ced0 6d 6f 6e 20 64 65 66 61 75 6c 74 20 76 61 6c 75  mon default valu
1cee0 65 0a 2a 2a 20 6f 6e 20 74 68 65 20 22 78 22 20  e.** on the "x" 
1cef0 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 6f 20 69 6e  column and so in
1cf00 20 74 68 61 74 20 63 61 73 65 20 6f 6e 6c 79 20   that case only 
1cf10 63 61 70 20 74 68 65 20 6f 75 74 70 75 74 20 72  cap the output r
1cf20 6f 77 20 65 73 74 69 6d 61 74 65 0a 2a 2a 20 61  ow estimate.** a
1cf30 74 20 31 2f 32 20 69 6e 73 74 65 61 64 20 6f 66  t 1/2 instead of
1cf40 20 31 2f 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   1/4..*/.static 
1cf50 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 4f 75  void whereLoopOu
1cf60 74 70 75 74 41 64 6a 75 73 74 28 0a 20 20 57 68  tputAdjust(.  Wh
1cf70 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
1cf80 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
1cf90 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  E clause */.  Wh
1cfa0 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20  ereLoop *pLoop, 
1cfb0 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 70       /* The loop
1cfc0 20 74 6f 20 61 64 6a 75 73 74 20 64 6f 77 6e 77   to adjust downw
1cfd0 61 72 64 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ard */.  LogEst 
1cfe0 6e 52 6f 77 20 20 20 20 20 20 20 20 20 20 20 20  nRow            
1cff0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77  /* Number of row
1d000 73 20 69 6e 20 74 68 65 20 65 6e 74 69 72 65 20  s in the entire 
1d010 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68  table */.){.  Wh
1d020 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
1d030 2a 70 58 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6e  *pX;.  Bitmask n
1d040 6f 74 41 6c 6c 6f 77 65 64 20 3d 20 7e 28 70 4c  otAllowed = ~(pL
1d050 6f 6f 70 2d 3e 70 72 65 72 65 71 7c 70 4c 6f 6f  oop->prereq|pLoo
1d060 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3b 0a 20 20  p->maskSelf);.  
1d070 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 4c  int i, j, k;.  L
1d080 6f 67 45 73 74 20 69 52 65 64 75 63 65 20 3d 20  ogEst iReduce = 
1d090 30 3b 20 20 20 20 2f 2a 20 70 4c 6f 6f 70 2d 3e  0;    /* pLoop->
1d0a0 6e 4f 75 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  nOut should not 
1d0b0 65 78 63 65 65 64 20 6e 52 6f 77 2d 69 52 65 64  exceed nRow-iRed
1d0c0 75 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  uce */..  assert
1d0d0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
1d0e0 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49  s & WHERE_AUTO_I
1d0f0 4e 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20 66 6f  NDEX)==0 );.  fo
1d100 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2c 20  r(i=pWC->nTerm, 
1d110 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3e  pTerm=pWC->a; i>
1d120 30 3b 20 69 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29  0; i--, pTerm++)
1d130 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  {.    if( (pTerm
1d140 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1d150 5f 56 49 52 54 55 41 4c 29 21 3d 30 20 29 20 62  _VIRTUAL)!=0 ) b
1d160 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 28 70  reak;.    if( (p
1d170 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
1d180 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  & pLoop->maskSel
1d190 66 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  f)==0 ) continue
1d1a0 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
1d1b0 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f  ->prereqAll & no
1d1c0 74 41 6c 6c 6f 77 65 64 29 21 3d 30 20 29 20 63  tAllowed)!=0 ) c
1d1d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72  ontinue;.    for
1d1e0 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d  (j=pLoop->nLTerm
1d1f0 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a  -1; j>=0; j--){.
1d200 20 20 20 20 20 20 70 58 20 3d 20 70 4c 6f 6f 70        pX = pLoop
1d210 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20  ->aLTerm[j];.   
1d220 20 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 63     if( pX==0 ) c
1d230 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
1d240 66 28 20 70 58 3d 3d 70 54 65 72 6d 20 29 20 62  f( pX==pTerm ) b
1d250 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
1d260 70 58 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 26  pX->iParent>=0 &
1d270 26 20 28 26 70 57 43 2d 3e 61 5b 70 58 2d 3e 69  & (&pWC->a[pX->i
1d280 50 61 72 65 6e 74 5d 29 3d 3d 70 54 65 72 6d 20  Parent])==pTerm 
1d290 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
1d2a0 20 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20     if( j<0 ){.  
1d2b0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74      if( pTerm->t
1d2c0 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20  ruthProb<=0 ){. 
1d2d0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 74         /* If a t
1d2e0 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79  ruth probability
1d2f0 20 69 73 20 73 70 65 63 69 66 69 65 64 20 75 73   is specified us
1d300 69 6e 67 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f  ing the likeliho
1d310 6f 64 28 29 20 68 69 6e 74 73 2c 0a 20 20 20 20  od() hints,.    
1d320 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 73 65 20      ** then use 
1d330 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20  the probability 
1d340 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 65 20  provided by the 
1d350 61 70 70 6c 69 63 61 74 69 6f 6e 2e 20 2a 2f 0a  application. */.
1d360 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e          pLoop->n
1d370 4f 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72  Out += pTerm->tr
1d380 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20 7d  uthProb;.      }
1d390 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
1d3a0 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20   In the absence 
1d3b0 6f 66 20 65 78 70 6c 69 63 69 74 20 74 72 75 74  of explicit trut
1d3c0 68 20 70 72 6f 62 61 62 69 6c 69 74 69 65 73 2c  h probabilities,
1d3d0 20 75 73 65 20 68 65 75 72 69 73 74 69 63 73 20   use heuristics 
1d3e0 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75  to.        ** gu
1d3f0 65 73 73 20 61 20 72 65 61 73 6f 6e 61 62 6c 65  ess a reasonable
1d400 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69   truth probabili
1d410 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ty. */.        p
1d420 4c 6f 6f 70 2d 3e 6e 4f 75 74 2d 2d 3b 0a 20 20  Loop->nOut--;.  
1d430 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
1d440 3e 65 4f 70 65 72 61 74 6f 72 26 28 57 4f 5f 45  >eOperator&(WO_E
1d450 51 7c 57 4f 5f 49 53 29 20 29 7b 0a 20 20 20 20  Q|WO_IS) ){.    
1d460 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
1d470 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  ht = pTerm->pExp
1d480 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
1d490 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1d4a0 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d  Term->pExpr->op=
1d4b0 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
1d4c0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
1d4d0 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 52 69  xprIsInteger(pRi
1d4e0 67 68 74 2c 20 26 6b 29 20 26 26 20 6b 3e 3d 28  ght, &k) && k>=(
1d4f0 2d 31 29 20 26 26 20 6b 3c 3d 31 20 29 7b 0a 20  -1) && k<=1 ){. 
1d500 20 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20 31             k = 1
1d510 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
1d520 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1d530 6b 20 3d 20 32 30 3b 0a 20 20 20 20 20 20 20 20  k = 20;.        
1d540 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
1d550 28 20 69 52 65 64 75 63 65 3c 6b 20 29 20 69 52  ( iReduce<k ) iR
1d560 65 64 75 63 65 20 3d 20 6b 3b 0a 20 20 20 20 20  educe = k;.     
1d570 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1d580 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f   }.  }.  if( pLo
1d590 6f 70 2d 3e 6e 4f 75 74 20 3e 20 6e 52 6f 77 2d  op->nOut > nRow-
1d5a0 69 52 65 64 75 63 65 20 29 20 20 70 4c 6f 6f 70  iReduce )  pLoop
1d5b0 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 20 2d 20  ->nOut = nRow - 
1d5c0 69 52 65 64 75 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  iReduce;.}../*.*
1d5d0 2a 20 41 64 6a 75 73 74 20 74 68 65 20 63 6f 73  * Adjust the cos
1d5e0 74 20 43 20 62 79 20 74 68 65 20 63 6f 73 74 4d  t C by the costM
1d5f0 75 6c 74 20 66 61 63 74 65 72 20 54 2e 20 20 54  ult facter T.  T
1d600 68 69 73 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20  his only occurs 
1d610 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 77  if.** compiled w
1d620 69 74 68 20 2d 44 53 51 4c 49 54 45 5f 45 4e 41  ith -DSQLITE_ENA
1d630 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 2a 2f 0a  BLE_COSTMULT.*/.
1d640 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1d650 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 23 20  ABLE_COSTMULT.# 
1d660 64 65 66 69 6e 65 20 41 70 70 6c 79 43 6f 73 74  define ApplyCost
1d670 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c 54 29 20  Multiplier(C,T) 
1d680 20 43 20 2b 3d 20 54 0a 23 65 6c 73 65 0a 23 20   C += T.#else.# 
1d690 64 65 66 69 6e 65 20 41 70 70 6c 79 43 6f 73 74  define ApplyCost
1d6a0 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c 54 29 0a  Multiplier(C,T).
1d6b0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65  #endif../*.** We
1d6c0 20 68 61 76 65 20 73 6f 20 66 61 72 20 6d 61 74   have so far mat
1d6d0 63 68 65 64 20 70 42 75 69 6c 64 65 72 2d 3e 70  ched pBuilder->p
1d6e0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
1d6f0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 0a 2a   terms of the .*
1d700 2a 20 69 6e 64 65 78 20 70 49 6e 64 65 78 2e 20  * index pIndex. 
1d710 54 72 79 20 74 6f 20 6d 61 74 63 68 20 6f 6e 65  Try to match one
1d720 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65   more..**.** Whe
1d730 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
1d740 69 73 20 63 61 6c 6c 65 64 2c 20 70 42 75 69 6c  is called, pBuil
1d750 64 65 72 2d 3e 70 4e 65 77 2d 3e 6e 4f 75 74 20  der->pNew->nOut 
1d760 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 0a 2a 2a  contains the .**
1d770 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
1d780 65 78 70 65 63 74 65 64 20 74 6f 20 62 65 20 76  expected to be v
1d790 69 73 69 74 65 64 20 62 79 20 66 69 6c 74 65 72  isited by filter
1d7a0 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 6e 45  ing using the nE
1d7b0 71 20 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79  q .** terms only
1d7c0 2e 20 49 66 20 69 74 20 69 73 20 6d 6f 64 69 66  . If it is modif
1d7d0 69 65 64 2c 20 74 68 69 73 20 76 61 6c 75 65 20  ied, this value 
1d7e0 69 73 20 72 65 73 74 6f 72 65 64 20 62 65 66 6f  is restored befo
1d7f0 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  re this .** func
1d800 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a  tion returns..**
1d810 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d 3e 74  .** If pProbe->t
1d820 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61  num==0, that mea
1d830 6e 73 20 70 49 6e 64 65 78 20 69 73 20 61 20 66  ns pIndex is a f
1d840 61 6b 65 20 69 6e 64 65 78 20 75 73 65 64 20 66  ake index used f
1d850 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45  or the.** INTEGE
1d860 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a  R PRIMARY KEY..*
1d870 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
1d880 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e  reLoopAddBtreeIn
1d890 64 65 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  dex(.  WhereLoop
1d8a0 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
1d8b0 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  r,     /* The Wh
1d8c0 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79 20  ereLoop factory 
1d8d0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
1d8e0 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
1d8f0 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
1d900 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61  use term being a
1d910 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64  nalyzed */.  Ind
1d920 65 78 20 2a 70 50 72 6f 62 65 2c 20 20 20 20 20  ex *pProbe,     
1d930 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d940 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53 72 63  An index on pSrc
1d950 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 49 6e   */.  LogEst nIn
1d960 4d 75 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  Mul             
1d970 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e 75 6d        /* log(Num
1d980 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e  ber of iteration
1d990 73 20 64 75 65 20 74 6f 20 49 4e 29 20 2a 2f 0a  s due to IN) */.
1d9a0 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
1d9b0 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
1d9c0 72 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a 20 57  r->pWInfo;  /* W
1d9d0 48 45 52 45 20 61 6e 61 6c 79 73 65 20 63 6f 6e  HERE analyse con
1d9e0 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20  text */.  Parse 
1d9f0 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f  *pParse = pWInfo
1da00 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 20  ->pParse;       
1da10 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
1da20 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
1da30 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1da40 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b;       /* Data
1da50 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1da60 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74 20 2a  malloc context *
1da70 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
1da80 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
1da90 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20      /* Template 
1daa0 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65 72 20  WhereLoop under 
1dab0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
1dac0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
1dad0 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
1dae0 20 20 2f 2a 20 41 20 57 68 65 72 65 54 65 72 6d    /* A WhereTerm
1daf0 20 75 6e 64 65 72 20 63 6f 6e 73 69 64 65 72 61   under considera
1db00 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tion */.  int op
1db10 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
1db20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
1db30 69 64 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72  id operators for
1db40 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
1db50 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e    WhereScan scan
1db60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1db70 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f    /* Iterator fo
1db80 72 20 57 48 45 52 45 20 74 65 72 6d 73 20 2a 2f  r WHERE terms */
1db90 0a 20 20 42 69 74 6d 61 73 6b 20 73 61 76 65 64  .  Bitmask saved
1dba0 5f 70 72 65 72 65 71 3b 20 20 20 20 20 20 20 20  _prereq;        
1dbb0 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
1dbc0 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 70 72  alue of pNew->pr
1dbd0 65 72 65 71 20 2a 2f 0a 20 20 75 31 36 20 73 61  ereq */.  u16 sa
1dbe0 76 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20 20 20  ved_nLTerm;     
1dbf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
1dc00 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
1dc10 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20  New->nLTerm */. 
1dc20 20 75 31 36 20 73 61 76 65 64 5f 6e 45 71 3b 20   u16 saved_nEq; 
1dc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc40 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
1dc50 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74  ue of pNew->u.bt
1dc60 72 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75 31 36  ree.nEq */.  u16
1dc70 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 20 20 20   saved_nSkip;   
1dc80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dc90 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
1dca0 66 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 2a 2f  f pNew->nSkip */
1dcb0 0a 20 20 75 33 32 20 73 61 76 65 64 5f 77 73 46  .  u32 saved_wsF
1dcc0 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1dcd0 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
1dce0 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 77 73  alue of pNew->ws
1dcf0 46 6c 61 67 73 20 2a 2f 0a 20 20 4c 6f 67 45 73  Flags */.  LogEs
1dd00 74 20 73 61 76 65 64 5f 6e 4f 75 74 3b 20 20 20  t saved_nOut;   
1dd10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
1dd20 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
1dd30 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20  pNew->nOut */.  
1dd40 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  int iCol;       
1dd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd60 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
1dd70 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61  column in the ta
1dd80 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ble */.  int rc 
1dd90 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
1dda0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1ddb0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4c 6f 67  rn code */.  Log
1ddc0 45 73 74 20 72 53 69 7a 65 3b 20 20 20 20 20 20  Est rSize;      
1ddd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dde0 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  Number of rows i
1ddf0 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
1de00 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65   LogEst rLogSize
1de10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1de20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66   /* Logarithm of
1de30 20 74 61 62 6c 65 20 73 69 7a 65 20 2a 2f 0a 20   table size */. 
1de40 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 6f 70   WhereTerm *pTop
1de50 20 3d 20 30 2c 20 2a 70 42 74 6d 20 3d 20 30 3b   = 0, *pBtm = 0;
1de60 20 2f 2a 20 54 6f 70 20 61 6e 64 20 62 6f 74 74   /* Top and bott
1de70 6f 6d 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  om range constra
1de80 69 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e 65 77 20  ints */..  pNew 
1de90 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
1dea0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
1deb0 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
1dec0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
1ded0 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77  .  assert( (pNew
1dee0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1def0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
1df00 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1df10 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
1df20 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
1df30 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4e  )==0 );.  if( pN
1df40 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
1df50 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b  ERE_BTM_LIMIT ){
1df60 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f  .    opMask = WO
1df70 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c  _LT|WO_LE;.  }el
1df80 73 65 20 69 66 28 20 2f 2a 70 50 72 6f 62 65 2d  se if( /*pProbe-
1df90 3e 74 6e 75 6d 3c 3d 30 20 7c 7c 2a 2f 20 28 70  >tnum<=0 ||*/ (p
1dfa0 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  Src->jointype & 
1dfb0 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20  JT_LEFT)!=0 ){. 
1dfc0 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45     opMask = WO_E
1dfd0 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f  Q|WO_IN|WO_GT|WO
1dfe0 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b  _GE|WO_LT|WO_LE;
1dff0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
1e000 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f  Mask = WO_EQ|WO_
1e010 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57  IN|WO_GT|WO_GE|W
1e020 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 49 53  O_LT|WO_LE|WO_IS
1e030 4e 55 4c 4c 7c 57 4f 5f 49 53 3b 0a 20 20 7d 0a  NULL|WO_IS;.  }.
1e040 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 55    if( pProbe->bU
1e050 6e 6f 72 64 65 72 65 64 20 29 20 6f 70 4d 61 73  nordered ) opMas
1e060 6b 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f  k &= ~(WO_GT|WO_
1e070 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b  GE|WO_LT|WO_LE);
1e080 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ..  assert( pNew
1e090 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50  ->u.btree.nEq<pP
1e0a0 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b  robe->nColumn );
1e0b0 0a 20 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65  .  iCol = pProbe
1e0c0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4e 65 77 2d  ->aiColumn[pNew-
1e0d0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 5d 3b 0a 0a  >u.btree.nEq];..
1e0e0 20 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53    pTerm = whereS
1e0f0 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70  canInit(&scan, p
1e100 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 53  Builder->pWC, pS
1e110 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 69 43 6f  rc->iCursor, iCo
1e120 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
1e130 20 20 20 20 20 20 20 20 20 20 20 6f 70 4d 61 73             opMas
1e140 6b 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 73 61  k, pProbe);.  sa
1e150 76 65 64 5f 6e 45 71 20 3d 20 70 4e 65 77 2d 3e  ved_nEq = pNew->
1e160 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73  u.btree.nEq;.  s
1e170 61 76 65 64 5f 6e 53 6b 69 70 20 3d 20 70 4e 65  aved_nSkip = pNe
1e180 77 2d 3e 6e 53 6b 69 70 3b 0a 20 20 73 61 76 65  w->nSkip;.  save
1e190 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d  d_nLTerm = pNew-
1e1a0 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76 65 64  >nLTerm;.  saved
1e1b0 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d  _wsFlags = pNew-
1e1c0 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73 61 76 65  >wsFlags;.  save
1e1d0 64 5f 70 72 65 72 65 71 20 3d 20 70 4e 65 77 2d  d_prereq = pNew-
1e1e0 3e 70 72 65 72 65 71 3b 0a 20 20 73 61 76 65 64  >prereq;.  saved
1e1f0 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f  _nOut = pNew->nO
1e200 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74  ut;.  pNew->rSet
1e210 75 70 20 3d 20 30 3b 0a 20 20 72 53 69 7a 65 20  up = 0;.  rSize 
1e220 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c  = pProbe->aiRowL
1e230 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 72 4c 6f 67  ogEst[0];.  rLog
1e240 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72 53  Size = estLog(rS
1e250 69 7a 65 29 3b 0a 20 20 66 6f 72 28 3b 20 72 63  ize);.  for(; rc
1e260 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1e270 54 65 72 6d 21 3d 30 3b 20 70 54 65 72 6d 20 3d  Term!=0; pTerm =
1e280 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26   whereScanNext(&
1e290 73 63 61 6e 29 29 7b 0a 20 20 20 20 75 31 36 20  scan)){.    u16 
1e2a0 65 4f 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4f 70  eOp = pTerm->eOp
1e2b0 65 72 61 74 6f 72 3b 20 20 20 2f 2a 20 53 68 6f  erator;   /* Sho
1e2c0 72 74 68 61 6e 64 20 66 6f 72 20 70 54 65 72 6d  rthand for pTerm
1e2d0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  ->eOperator */. 
1e2e0 20 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74 49     LogEst rCostI
1e2f0 64 78 3b 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e  dx;.    LogEst n
1e300 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 20 20  OutUnadjusted;  
1e310 20 20 20 20 20 20 2f 2a 20 6e 4f 75 74 20 62 65        /* nOut be
1e320 66 6f 72 65 20 49 4e 28 29 20 61 6e 64 20 57 48  fore IN() and WH
1e330 45 52 45 20 61 64 6a 75 73 74 6d 65 6e 74 73 20  ERE adjustments 
1e340 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20 3d  */.    int nIn =
1e350 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
1e360 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
1e370 52 5f 53 54 41 54 34 0a 20 20 20 20 69 6e 74 20  R_STAT4.    int 
1e380 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75 69  nRecValid = pBui
1e390 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b  lder->nRecValid;
1e3a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
1e3b0 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20  (eOp==WO_ISNULL 
1e3c0 7c 7c 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  || (pTerm->wtFla
1e3d0 67 73 26 54 45 52 4d 5f 56 4e 55 4c 4c 29 21 3d  gs&TERM_VNULL)!=
1e3e0 30 29 0a 20 20 20 20 20 26 26 20 28 69 43 6f 6c  0).     && (iCol
1e3f0 3c 30 20 7c 7c 20 70 53 72 63 2d 3e 70 54 61 62  <0 || pSrc->pTab
1e400 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74  ->aCol[iCol].not
1e410 4e 75 6c 6c 29 0a 20 20 20 20 29 7b 0a 20 20 20  Null).    ){.   
1e420 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20     continue; /* 
1e430 69 67 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d 20  ignore IS [NOT] 
1e440 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73  NULL constraints
1e450 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c   on NOT NULL col
1e460 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  umns */.    }.  
1e470 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65    if( pTerm->pre
1e480 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d  reqRight & pNew-
1e490 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74  >maskSelf ) cont
1e4a0 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f  inue;..    /* Do
1e4b0 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 75   not allow the u
1e4c0 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 61 20  pper bound of a 
1e4d0 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f  LIKE optimizatio
1e4e0 6e 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  n range constrai
1e4f0 6e 74 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 69 78  nt.    ** to mix
1e500 20 77 69 74 68 20 61 20 6c 6f 77 65 72 20 72 61   with a lower ra
1e510 6e 67 65 20 62 6f 75 6e 64 20 66 72 6f 6d 20 73  nge bound from s
1e520 6f 6d 65 20 6f 74 68 65 72 20 73 6f 75 72 63 65  ome other source
1e530 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72   */.    if( pTer
1e540 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
1e550 4d 5f 4c 49 4b 45 4f 50 54 20 26 26 20 70 54 65  M_LIKEOPT && pTe
1e560 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
1e570 4f 5f 4c 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b  O_LT ) continue;
1e580 0a 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c  ..    pNew->wsFl
1e590 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c  ags = saved_wsFl
1e5a0 61 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  ags;.    pNew->u
1e5b0 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76  .btree.nEq = sav
1e5c0 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77  ed_nEq;.    pNew
1e5d0 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64  ->nLTerm = saved
1e5e0 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66 28  _nLTerm;.    if(
1e5f0 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
1e600 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d  (db, pNew, pNew-
1e610 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65  >nLTerm+1) ) bre
1e620 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20  ak; /* OOM */.  
1e630 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70    pNew->aLTerm[p
1e640 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d  New->nLTerm++] =
1e650 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65 77   pTerm;.    pNew
1e660 2d 3e 70 72 65 72 65 71 20 3d 20 28 73 61 76 65  ->prereq = (save
1e670 64 5f 70 72 65 72 65 71 20 7c 20 70 54 65 72 6d  d_prereq | pTerm
1e680 2d 3e 70 72 65 72 65 71 52 69 67 68 74 29 20 26  ->prereqRight) &
1e690 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66   ~pNew->maskSelf
1e6a0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ;..    assert( n
1e6b0 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20 20  InMul==0.       
1e6c0 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61   || (pNew->wsFla
1e6d0 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
1e6e0 4e 5f 4e 55 4c 4c 29 21 3d 30 20 0a 20 20 20 20  N_NULL)!=0 .    
1e6f0 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73      || (pNew->ws
1e700 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
1e710 4c 55 4d 4e 5f 49 4e 29 21 3d 30 20 0a 20 20 20  LUMN_IN)!=0 .   
1e720 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77       || (pNew->w
1e730 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53  sFlags & WHERE_S
1e740 4b 49 50 53 43 41 4e 29 21 3d 30 20 0a 20 20 20  KIPSCAN)!=0 .   
1e750 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 4f 70   );..    if( eOp
1e760 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20   & WO_IN ){.    
1e770 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
1e780 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
1e790 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
1e7a0 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
1e7b0 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 69 66 28 20  N_IN;.      if( 
1e7c0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1e7d0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
1e7e0 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
1e7f0 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54  /* "x IN (SELECT
1e800 20 2e 2e 2e 29 22 3a 20 20 54 55 4e 49 4e 47 3a   ...)":  TUNING:
1e810 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 74 75   the SELECT retu
1e820 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20  rns 25 rows */. 
1e830 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 34 36 3b         nIn = 46;
1e840 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d 73 71    assert( 46==sq
1e850 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29 20  lite3LogEst(25) 
1e860 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
1e870 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d  f( ALWAYS(pExpr-
1e880 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 45 78 70  >x.pList && pExp
1e890 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
1e8a0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  r) ){.        /*
1e8b0 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76   "x IN (value, v
1e8c0 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20  alue, ...)" */. 
1e8d0 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 73 71 6c         nIn = sql
1e8e0 69 74 65 33 4c 6f 67 45 73 74 28 70 45 78 70 72  ite3LogEst(pExpr
1e8f0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
1e900 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1e910 20 61 73 73 65 72 74 28 20 6e 49 6e 3e 30 20 29   assert( nIn>0 )
1e920 3b 20 20 2f 2a 20 52 48 53 20 61 6c 77 61 79 73  ;  /* RHS always
1e930 20 68 61 73 20 32 20 6f 72 20 6d 6f 72 65 20 74   has 2 or more t
1e940 65 72 6d 73 2e 2e 2e 20 20 54 68 65 20 70 61 72  erms...  The par
1e950 73 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  ser.            
1e960 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63              ** c
1e970 68 61 6e 67 65 73 20 22 78 20 49 4e 20 28 3f 29  hanges "x IN (?)
1e980 22 20 69 6e 74 6f 20 22 78 3d 3f 22 2e 20 2a 2f  " into "x=?". */
1e990 0a 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ..    }else if( 
1e9a0 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  eOp & (WO_EQ|WO_
1e9b0 49 53 29 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  IS) ){.      pNe
1e9c0 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
1e9d0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20  ERE_COLUMN_EQ;. 
1e9e0 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
1e9f0 7c 7c 20 28 6e 49 6e 4d 75 6c 3d 3d 30 20 26 26  || (nInMul==0 &&
1ea00 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
1ea10 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79  Eq==pProbe->nKey
1ea20 43 6f 6c 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  Col-1) ){.      
1ea30 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26    if( iCol>=0 &&
1ea40 20 70 50 72 6f 62 65 2d 3e 75 6e 69 71 4e 6f 74   pProbe->uniqNot
1ea50 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Null==0 ){.     
1ea60 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
1ea70 67 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e 51 5f  gs |= WHERE_UNQ_
1ea80 57 41 4e 54 45 44 3b 0a 20 20 20 20 20 20 20 20  WANTED;.        
1ea90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1eaa0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
1eab0 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a  = WHERE_ONEROW;.
1eac0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ead0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
1eae0 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  eOp & WO_ISNULL 
1eaf0 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  ){.      pNew->w
1eb00 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
1eb10 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20  COLUMN_NULL;.   
1eb20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26   }else if( eOp &
1eb30 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29   (WO_GT|WO_GE) )
1eb40 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1eb50 28 20 65 4f 70 20 26 20 57 4f 5f 47 54 20 29 3b  ( eOp & WO_GT );
1eb60 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1eb70 20 65 4f 70 20 26 20 57 4f 5f 47 45 20 29 3b 0a   eOp & WO_GE );.
1eb80 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
1eb90 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
1eba0 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  UMN_RANGE|WHERE_
1ebb0 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  BTM_LIMIT;.     
1ebc0 20 70 42 74 6d 20 3d 20 70 54 65 72 6d 3b 0a 20   pBtm = pTerm;. 
1ebd0 20 20 20 20 20 70 54 6f 70 20 3d 20 30 3b 0a 20       pTop = 0;. 
1ebe0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
1ebf0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c  wtFlags & TERM_L
1ec00 49 4b 45 4f 50 54 20 29 7b 0a 20 20 20 20 20 20  IKEOPT ){.      
1ec10 20 20 2f 2a 20 52 61 6e 67 65 20 63 6f 6e 74 72    /* Range contr
1ec20 61 69 6e 74 73 20 74 68 61 74 20 63 6f 6d 65 20  aints that come 
1ec30 66 72 6f 6d 20 74 68 65 20 4c 49 4b 45 20 6f 70  from the LIKE op
1ec40 74 69 6d 69 7a 61 74 69 6f 6e 20 61 72 65 0a 20  timization are. 
1ec50 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
1ec60 20 75 73 65 64 20 69 6e 20 70 61 69 72 73 2e 20   used in pairs. 
1ec70 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 70 20  */.        pTop 
1ec80 3d 20 26 70 54 65 72 6d 5b 31 5d 3b 0a 20 20 20  = &pTerm[1];.   
1ec90 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54       assert( (pT
1eca0 6f 70 2d 28 70 54 65 72 6d 2d 3e 70 57 43 2d 3e  op-(pTerm->pWC->
1ecb0 61 29 29 3c 70 54 65 72 6d 2d 3e 70 57 43 2d 3e  a))<pTerm->pWC->
1ecc0 6e 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20 20  nTerm );.       
1ecd0 20 61 73 73 65 72 74 28 20 70 54 6f 70 2d 3e 77   assert( pTop->w
1ece0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49  tFlags & TERM_LI
1ecf0 4b 45 4f 50 54 20 29 3b 0a 20 20 20 20 20 20 20  KEOPT );.       
1ed00 20 61 73 73 65 72 74 28 20 70 54 6f 70 2d 3e 65   assert( pTop->e
1ed10 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20  Operator==WO_LT 
1ed20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77  );.        if( w
1ed30 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64  hereLoopResize(d
1ed40 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e  b, pNew, pNew->n
1ed50 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65 61 6b  LTerm+1) ) break
1ed60 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20  ; /* OOM */.    
1ed70 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
1ed80 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d  [pNew->nLTerm++]
1ed90 20 3d 20 70 54 6f 70 3b 0a 20 20 20 20 20 20 20   = pTop;.       
1eda0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
1edb0 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  = WHERE_TOP_LIMI
1edc0 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  T;.      }.    }
1edd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1ede0 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 4c 54  rt( eOp & (WO_LT
1edf0 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20 20 20 20 20  |WO_LE) );.     
1ee00 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
1ee10 20 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20   WO_LT );.      
1ee20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
1ee30 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 70  WO_LE );.      p
1ee40 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
1ee50 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
1ee60 47 45 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  GE|WHERE_TOP_LIM
1ee70 49 54 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d  IT;.      pTop =
1ee80 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 42   pTerm;.      pB
1ee90 74 6d 20 3d 20 28 70 4e 65 77 2d 3e 77 73 46 6c  tm = (pNew->wsFl
1eea0 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
1eeb0 4c 49 4d 49 54 29 21 3d 30 20 3f 0a 20 20 20 20  LIMIT)!=0 ?.    
1eec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eed0 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e   pNew->aLTerm[pN
1eee0 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32 5d 20 3a 20  ew->nLTerm-2] : 
1eef0 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
1ef00 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 70   At this point p
1ef10 4e 65 77 2d 3e 6e 4f 75 74 20 69 73 20 73 65 74  New->nOut is set
1ef20 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
1ef30 66 20 72 6f 77 73 20 65 78 70 65 63 74 65 64 20  f rows expected 
1ef40 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 76 69 73  to.    ** be vis
1ef50 69 74 65 64 20 62 79 20 74 68 65 20 69 6e 64 65  ited by the inde
1ef60 78 20 73 63 61 6e 20 62 65 66 6f 72 65 20 63 6f  x scan before co
1ef70 6e 73 69 64 65 72 69 6e 67 20 74 65 72 6d 20 70  nsidering term p
1ef80 54 65 72 6d 2c 20 6f 72 20 74 68 65 0a 20 20 20  Term, or the.   
1ef90 20 2a 2a 20 76 61 6c 75 65 73 20 6f 66 20 6e 49   ** values of nI
1efa0 6e 20 61 6e 64 20 6e 49 6e 4d 75 6c 2e 20 49 6e  n and nInMul. In
1efb0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61 73   other words, as
1efc0 73 75 6d 69 6e 67 20 74 68 61 74 20 61 6c 6c 20  suming that all 
1efd0 0a 20 20 20 20 2a 2a 20 22 78 20 49 4e 28 2e 2e  .    ** "x IN(..
1efe0 2e 29 22 20 74 65 72 6d 73 20 61 72 65 20 72 65  .)" terms are re
1eff0 70 6c 61 63 65 64 20 77 69 74 68 20 22 78 20 3d  placed with "x =
1f000 20 3f 22 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20   ?". This block 
1f010 75 70 64 61 74 65 73 0a 20 20 20 20 2a 2a 20 74  updates.    ** t
1f020 68 65 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  he value of pNew
1f030 2d 3e 6e 4f 75 74 20 74 6f 20 61 63 63 6f 75 6e  ->nOut to accoun
1f040 74 20 66 6f 72 20 70 54 65 72 6d 20 28 62 75 74  t for pTerm (but
1f050 20 6e 6f 74 20 6e 49 6e 2f 6e 49 6e 4d 75 6c 29   not nIn/nInMul)
1f060 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
1f070 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61  ( pNew->nOut==sa
1f080 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20  ved_nOut );.    
1f090 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  if( pNew->wsFlag
1f0a0 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
1f0b0 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
1f0c0 2f 2a 20 41 64 6a 75 73 74 20 6e 4f 75 74 20 75  /* Adjust nOut u
1f0d0 73 69 6e 67 20 73 74 61 74 33 2f 73 74 61 74 34  sing stat3/stat4
1f0e0 20 64 61 74 61 2e 20 4f 72 2c 20 69 66 20 74 68   data. Or, if th
1f0f0 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74 33 2f  ere is no stat3/
1f100 73 74 61 74 34 0a 20 20 20 20 20 20 2a 2a 20 64  stat4.      ** d
1f110 61 74 61 2c 20 75 73 69 6e 67 20 73 6f 6d 65 20  ata, using some 
1f120 6f 74 68 65 72 20 65 73 74 69 6d 61 74 65 2e 20  other estimate. 
1f130 20 2a 2f 0a 20 20 20 20 20 20 77 68 65 72 65 52   */.      whereR
1f140 61 6e 67 65 53 63 61 6e 45 73 74 28 70 50 61 72  angeScanEst(pPar
1f150 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 42  se, pBuilder, pB
1f160 74 6d 2c 20 70 54 6f 70 2c 20 70 4e 65 77 29 3b  tm, pTop, pNew);
1f170 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f180 20 20 69 6e 74 20 6e 45 71 20 3d 20 2b 2b 70 4e    int nEq = ++pN
1f190 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  ew->u.btree.nEq;
1f1a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
1f1b0 4f 70 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c  Op & (WO_ISNULL|
1f1c0 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49  WO_EQ|WO_IN|WO_I
1f1d0 53 29 20 29 3b 0a 0a 20 20 20 20 20 20 61 73 73  S) );..      ass
1f1e0 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d  ert( pNew->nOut=
1f1f0 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20  =saved_nOut );. 
1f200 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
1f210 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 26 26 20  truthProb<=0 && 
1f220 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iCol>=0 ){.     
1f230 20 20 20 61 73 73 65 72 74 28 20 28 65 4f 70 20     assert( (eOp 
1f240 26 20 57 4f 5f 49 4e 29 20 7c 7c 20 6e 49 6e 3d  & WO_IN) || nIn=
1f250 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
1f260 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
1f270 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 70  _IN );.        p
1f280 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65  New->nOut += pTe
1f290 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20  rm->truthProb;. 
1f2a0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
1f2b0 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20  t -= nIn;.      
1f2c0 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51  }else{.#ifdef SQ
1f2d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
1f2e0 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 20  3_OR_STAT4.     
1f2f0 20 20 20 74 52 6f 77 63 6e 74 20 6e 4f 75 74 20     tRowcnt nOut 
1f300 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
1f310 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a 20 20 20 20   nInMul==0 .    
1f320 20 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e       && pProbe->
1f330 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20  nSample .       
1f340 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72    && pNew->u.btr
1f350 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e  ee.nEq<=pProbe->
1f360 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20 20 20 20  nSampleCol.     
1f370 20 20 20 20 26 26 20 28 28 65 4f 70 20 26 20 57      && ((eOp & W
1f380 4f 5f 49 4e 29 3d 3d 30 20 7c 7c 20 21 45 78 70  O_IN)==0 || !Exp
1f390 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
1f3a0 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49  rm->pExpr, EP_xI
1f3b0 73 53 65 6c 65 63 74 29 29 0a 20 20 20 20 20 20  sSelect)).      
1f3c0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45    ){.          E
1f3d0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
1f3e0 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
1f3f0 20 20 20 20 20 69 66 28 20 28 65 4f 70 20 26 20       if( (eOp & 
1f400 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c  (WO_EQ|WO_ISNULL
1f410 7c 57 4f 5f 49 53 29 29 21 3d 30 20 29 7b 0a 20  |WO_IS))!=0 ){. 
1f420 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
1f430 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 45 51  ase( eOp & WO_EQ
1f440 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
1f450 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
1f460 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20  WO_IS );.       
1f470 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
1f480 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  Op & WO_ISNULL )
1f490 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
1f4a0 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63 61   = whereEqualSca
1f4b0 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
1f4c0 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 70 52  ilder, pExpr->pR
1f4d0 69 67 68 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20  ight, &nOut);.  
1f4e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1f4f0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1f500 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 70  whereInScanEst(p
1f510 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c  Parse, pBuilder,
1f520 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c   pExpr->x.pList,
1f530 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20   &nOut);.       
1f540 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
1f550 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
1f560 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20 53 51  TFOUND ) rc = SQ
1f570 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
1f580 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1f590 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 20 20 20  E_OK ) break;   
1f5a0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f         /* Jump o
1f5b0 75 74 20 6f 66 20 74 68 65 20 70 54 65 72 6d 20  ut of the pTerm 
1f5c0 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 20 20  loop */.        
1f5d0 20 20 69 66 28 20 6e 4f 75 74 20 29 7b 0a 20 20    if( nOut ){.  
1f5e0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
1f5f0 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f  nOut = sqlite3Lo
1f600 67 45 73 74 28 6e 4f 75 74 29 3b 0a 20 20 20 20  gEst(nOut);.    
1f610 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
1f620 2d 3e 6e 4f 75 74 3e 73 61 76 65 64 5f 6e 4f 75  ->nOut>saved_nOu
1f630 74 20 29 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d  t ) pNew->nOut =
1f640 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20   saved_nOut;.   
1f650 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e           pNew->n
1f660 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20  Out -= nIn;.    
1f670 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f680 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f  }.        if( nO
1f690 75 74 3d 3d 30 20 29 0a 23 65 6e 64 69 66 0a 20  ut==0 ).#endif. 
1f6a0 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
1f6b0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d     pNew->nOut +=
1f6c0 20 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c   (pProbe->aiRowL
1f6d0 6f 67 45 73 74 5b 6e 45 71 5d 20 2d 20 70 50 72  ogEst[nEq] - pPr
1f6e0 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
1f6f0 5b 6e 45 71 2d 31 5d 29 3b 0a 20 20 20 20 20 20  [nEq-1]);.      
1f700 20 20 20 20 69 66 28 20 65 4f 70 20 26 20 57 4f      if( eOp & WO
1f710 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  _ISNULL ){.     
1f720 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
1f730 3a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  : If there is no
1f740 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76 61   likelihood() va
1f750 6c 75 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74  lue, assume that
1f760 20 61 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   a .            
1f770 2a 2a 20 22 63 6f 6c 20 49 53 20 4e 55 4c 4c 22  ** "col IS NULL"
1f780 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 74 63   expression matc
1f790 68 65 73 20 74 77 69 63 65 20 61 73 20 6d 61 6e  hes twice as man
1f7a0 79 20 72 6f 77 73 20 0a 20 20 20 20 20 20 20 20  y rows .        
1f7b0 20 20 20 20 2a 2a 20 61 73 20 28 63 6f 6c 3d 3f      ** as (col=?
1f7c0 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ). */.          
1f7d0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20    pNew->nOut += 
1f7e0 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  10;.          }.
1f7f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f800 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1f810 53 65 74 20 72 43 6f 73 74 49 64 78 20 74 6f 20  Set rCostIdx to 
1f820 74 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69  the cost of visi
1f830 74 69 6e 67 20 73 65 6c 65 63 74 65 64 20 72 6f  ting selected ro
1f840 77 73 20 69 6e 20 69 6e 64 65 78 2e 20 41 64 64  ws in index. Add
1f850 0a 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 70 4e  .    ** it to pN
1f860 65 77 2d 3e 72 52 75 6e 2c 20 77 68 69 63 68 20  ew->rRun, which 
1f870 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74  is currently set
1f880 20 74 6f 20 74 68 65 20 63 6f 73 74 20 6f 66 20   to the cost of 
1f890 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a  the index.    **
1f8a0 20 73 65 65 6b 20 6f 6e 6c 79 2e 20 54 68 65 6e   seek only. Then
1f8b0 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20 6e  , if this is a n
1f8c0 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  on-covering inde
1f8d0 78 2c 20 61 64 64 20 74 68 65 20 63 6f 73 74 20  x, add the cost 
1f8e0 6f 66 0a 20 20 20 20 2a 2a 20 76 69 73 69 74 69  of.    ** visiti
1f8f0 6e 67 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74  ng the rows in t
1f900 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20 20  he main table.  
1f910 2a 2f 0a 20 20 20 20 72 43 6f 73 74 49 64 78 20  */.    rCostIdx 
1f920 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20 31  = pNew->nOut + 1
1f930 20 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73   + (15*pProbe->s
1f940 7a 49 64 78 52 6f 77 29 2f 70 53 72 63 2d 3e 70  zIdxRow)/pSrc->p
1f950 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20  Tab->szTabRow;. 
1f960 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
1f970 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
1f980 28 72 4c 6f 67 53 69 7a 65 2c 20 72 43 6f 73 74  (rLogSize, rCost
1f990 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20 28 70  Idx);.    if( (p
1f9a0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  New->wsFlags & (
1f9b0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57  WHERE_IDX_ONLY|W
1f9c0 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30 20 29 7b  HERE_IPK))==0 ){
1f9d0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
1f9e0 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
1f9f0 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  tAdd(pNew->rRun,
1fa00 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20 31 36   pNew->nOut + 16
1fa10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 41 70 70  );.    }.    App
1fa20 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72  lyCostMultiplier
1fa30 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 50 72  (pNew->rRun, pPr
1fa40 6f 62 65 2d 3e 70 54 61 62 6c 65 2d 3e 63 6f 73  obe->pTable->cos
1fa50 74 4d 75 6c 74 29 3b 0a 0a 20 20 20 20 6e 4f 75  tMult);..    nOu
1fa60 74 55 6e 61 64 6a 75 73 74 65 64 20 3d 20 70 4e  tUnadjusted = pN
1fa70 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 70 4e  ew->nOut;.    pN
1fa80 65 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e 49 6e 4d  ew->rRun += nInM
1fa90 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 70 4e  ul + nIn;.    pN
1faa0 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 6e 49 6e 4d  ew->nOut += nInM
1fab0 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 77 68  ul + nIn;.    wh
1fac0 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a  ereLoopOutputAdj
1fad0 75 73 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 57  ust(pBuilder->pW
1fae0 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b  C, pNew, rSize);
1faf0 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c  .    rc = whereL
1fb00 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
1fb10 65 72 2c 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20  er, pNew);..    
1fb20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  if( pNew->wsFlag
1fb30 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
1fb40 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
1fb50 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
1fb60 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 7d 65 6c  ed_nOut;.    }el
1fb70 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  se{.      pNew->
1fb80 6e 4f 75 74 20 3d 20 6e 4f 75 74 55 6e 61 64 6a  nOut = nOutUnadj
1fb90 75 73 74 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  usted;.    }..  
1fba0 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46    if( (pNew->wsF
1fbb0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
1fbc0 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20 20 20 20  _LIMIT)==0.     
1fbd0 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  && pNew->u.btree
1fbe0 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f  .nEq<pProbe->nCo
1fbf0 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20  lumn.    ){.    
1fc00 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74    whereLoopAddBt
1fc10 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65  reeIndex(pBuilde
1fc20 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c  r, pSrc, pProbe,
1fc30 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20   nInMul+nIn);.  
1fc40 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f    }.    pNew->nO
1fc50 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
1fc60 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1fc70 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
1fc80 54 41 54 34 0a 20 20 20 20 70 42 75 69 6c 64 65  TAT4.    pBuilde
1fc90 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e  r->nRecValid = n
1fca0 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66  RecValid;.#endif
1fcb0 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 72 65  .  }.  pNew->pre
1fcc0 72 65 71 20 3d 20 73 61 76 65 64 5f 70 72 65 72  req = saved_prer
1fcd0 65 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74  eq;.  pNew->u.bt
1fce0 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f  ree.nEq = saved_
1fcf0 6e 45 71 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 6b  nEq;.  pNew->nSk
1fd00 69 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70  ip = saved_nSkip
1fd10 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  ;.  pNew->wsFlag
1fd20 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67  s = saved_wsFlag
1fd30 73 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  s;.  pNew->nOut 
1fd40 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20  = saved_nOut;.  
1fd50 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73  pNew->nLTerm = s
1fd60 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 0a 20 20  aved_nLTerm;..  
1fd70 2f 2a 20 43 6f 6e 73 69 64 65 72 20 75 73 69 6e  /* Consider usin
1fd80 67 20 61 20 73 6b 69 70 2d 73 63 61 6e 20 69 66  g a skip-scan if
1fd90 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48   there are no WH
1fda0 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
1fdb0 72 61 69 6e 74 73 0a 20 20 2a 2a 20 61 76 61 69  raints.  ** avai
1fdc0 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6c 65  lable for the le
1fdd0 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73 20 6f 66  ft-most terms of
1fde0 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e 64 20   the index, and 
1fdf0 69 66 20 74 68 65 20 61 76 65 72 61 67 65 0a 20  if the average. 
1fe00 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 65   ** number of re
1fe10 70 65 61 74 73 20 69 6e 20 74 68 65 20 6c 65 66  peats in the lef
1fe20 74 2d 6d 6f 73 74 20 74 65 72 6d 73 20 69 73 20  t-most terms is 
1fe30 61 74 20 6c 65 61 73 74 20 31 38 2e 20 0a 20 20  at least 18. .  
1fe40 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6d 61 67 69  **.  ** The magi
1fe50 63 20 6e 75 6d 62 65 72 20 31 38 20 69 73 20 73  c number 18 is s
1fe60 65 6c 65 63 74 65 64 20 6f 6e 20 74 68 65 20 62  elected on the b
1fe70 61 73 69 73 20 74 68 61 74 20 73 63 61 6e 6e 69  asis that scanni
1fe80 6e 67 20 31 37 20 72 6f 77 73 0a 20 20 2a 2a 20  ng 17 rows.  ** 
1fe90 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73  is almost always
1fea0 20 71 75 69 63 6b 65 72 20 74 68 61 6e 20 61 6e   quicker than an
1feb0 20 69 6e 64 65 78 20 73 65 65 6b 20 28 65 76 65   index seek (eve
1fec0 6e 20 74 68 6f 75 67 68 20 69 66 20 74 68 65 20  n though if the 
1fed0 69 6e 64 65 78 0a 20 20 2a 2a 20 63 6f 6e 74 61  index.  ** conta
1fee0 69 6e 73 20 66 65 77 65 72 20 74 68 61 6e 20 32  ins fewer than 2
1fef0 5e 31 37 20 72 6f 77 73 20 77 65 20 61 73 73 75  ^17 rows we assu
1ff00 6d 65 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20  me otherwise in 
1ff10 6f 74 68 65 72 20 70 61 72 74 73 20 6f 66 0a 20  other parts of. 
1ff20 20 2a 2a 20 74 68 65 20 63 6f 64 65 29 2e 20 41   ** the code). A
1ff30 6e 64 2c 20 65 76 65 6e 20 69 66 20 69 74 20 69  nd, even if it i
1ff40 73 20 6e 6f 74 2c 20 69 74 20 73 68 6f 75 6c 64  s not, it should
1ff50 20 6e 6f 74 20 62 65 20 74 6f 6f 20 6d 75 63 68   not be too much
1ff60 20 73 6c 6f 77 65 72 2e 20 0a 20 20 2a 2a 20 4f   slower. .  ** O
1ff70 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
1ff80 2c 20 74 68 65 20 65 78 74 72 61 20 73 65 65 6b  , the extra seek
1ff90 73 20 63 6f 75 6c 64 20 65 6e 64 20 75 70 20 62  s could end up b
1ffa0 65 69 6e 67 20 73 69 67 6e 69 66 69 63 61 6e 74  eing significant
1ffb0 6c 79 0a 20 20 2a 2a 20 6d 6f 72 65 20 65 78 70  ly.  ** more exp
1ffc0 65 6e 73 69 76 65 2e 20 20 2a 2f 0a 20 20 61 73  ensive.  */.  as
1ffd0 73 65 72 74 28 20 34 32 3d 3d 73 71 6c 69 74 65  sert( 42==sqlite
1ffe0 33 4c 6f 67 45 73 74 28 31 38 29 20 29 3b 0a 20  3LogEst(18) );. 
1fff0 20 69 66 28 20 73 61 76 65 64 5f 6e 45 71 3d 3d   if( saved_nEq==
20000 73 61 76 65 64 5f 6e 53 6b 69 70 0a 20 20 20 26  saved_nSkip.   &
20010 26 20 73 61 76 65 64 5f 6e 45 71 2b 31 3c 70 50  & saved_nEq+1<pP
20020 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 0a 20 20  robe->nKeyCol.  
20030 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e 6f 53 6b   && pProbe->noSk
20040 69 70 53 63 61 6e 3d 3d 30 0a 20 20 20 26 26 20  ipScan==0.   && 
20050 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67  pProbe->aiRowLog
20060 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d  Est[saved_nEq+1]
20070 3e 3d 34 32 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  >=42  /* TUNING:
20080 20 4d 69 6e 69 6d 75 6d 20 66 6f 72 20 73 6b 69   Minimum for ski
20090 70 2d 73 63 61 6e 20 2a 2f 0a 20 20 20 26 26 20  p-scan */.   && 
200a0 28 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 52  (rc = whereLoopR
200b0 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20  esize(db, pNew, 
200c0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 29  pNew->nLTerm+1))
200d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b  ==SQLITE_OK.  ){
200e0 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e 49 74 65  .    LogEst nIte
200f0 72 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  r;.    pNew->u.b
20100 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20  tree.nEq++;.    
20110 70 4e 65 77 2d 3e 6e 53 6b 69 70 2b 2b 3b 0a 20  pNew->nSkip++;. 
20120 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
20130 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20  pNew->nLTerm++] 
20140 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77  = 0;.    pNew->w
20150 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
20160 53 4b 49 50 53 43 41 4e 3b 0a 20 20 20 20 6e 49  SKIPSCAN;.    nI
20170 74 65 72 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  ter = pProbe->ai
20180 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f  RowLogEst[saved_
20190 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61  nEq] - pProbe->a
201a0 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64  iRowLogEst[saved
201b0 5f 6e 45 71 2b 31 5d 3b 0a 20 20 20 20 70 4e 65  _nEq+1];.    pNe
201c0 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 74 65 72  w->nOut -= nIter
201d0 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  ;.    /* TUNING:
201e0 20 20 42 65 63 61 75 73 65 20 75 6e 63 65 72 74    Because uncert
201f0 61 69 6e 74 69 65 73 20 69 6e 20 74 68 65 20 65  ainties in the e
20200 73 74 69 6d 61 74 65 73 20 66 6f 72 20 73 6b 69  stimates for ski
20210 70 2d 73 63 61 6e 20 71 75 65 72 69 65 73 2c 0a  p-scan queries,.
20220 20 20 20 20 2a 2a 20 61 64 64 20 61 20 31 2e 33      ** add a 1.3
20230 37 35 20 66 75 64 67 65 20 66 61 63 74 6f 72 20  75 fudge factor 
20240 74 6f 20 6d 61 6b 65 20 73 6b 69 70 2d 73 63 61  to make skip-sca
20250 6e 20 73 6c 69 67 68 74 6c 79 20 6c 65 73 73 20  n slightly less 
20260 6c 69 6b 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 6e  likely. */.    n
20270 49 74 65 72 20 2b 3d 20 35 3b 0a 20 20 20 20 77  Iter += 5;.    w
20280 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
20290 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20  Index(pBuilder, 
202a0 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49  pSrc, pProbe, nI
202b0 74 65 72 20 2b 20 6e 49 6e 4d 75 6c 29 3b 0a 20  ter + nInMul);. 
202c0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
202d0 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20  saved_nOut;.    
202e0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
202f0 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20  q = saved_nEq;. 
20300 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d     pNew->nSkip =
20310 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20   saved_nSkip;.  
20320 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
20330 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b  = saved_wsFlags;
20340 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
20350 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
20360 72 6e 20 54 72 75 65 20 69 66 20 69 74 20 69 73  rn True if it is
20370 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 70   possible that p
20380 49 6e 64 65 78 20 6d 69 67 68 74 20 62 65 20 75  Index might be u
20390 73 65 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c  seful in.** impl
203a0 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44  ementing the ORD
203b0 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20  ER BY clause in 
203c0 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  pBuilder..**.** 
203d0 52 65 74 75 72 6e 20 46 61 6c 73 65 20 69 66 20  Return False if 
203e0 70 42 75 69 6c 64 65 72 20 64 6f 65 73 20 6e 6f  pBuilder does no
203f0 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 4f 52 44  t contain an ORD
20400 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 0a  ER BY clause or.
20410 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  ** if there is n
20420 6f 20 77 61 79 20 66 6f 72 20 70 49 6e 64 65 78  o way for pIndex
20430 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20 69 6e   to be useful in
20440 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
20450 61 74 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63  at.** ORDER BY c
20460 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  lause..*/.static
20470 20 69 6e 74 20 69 6e 64 65 78 4d 69 67 68 74 48   int indexMightH
20480 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28 0a  elpWithOrderBy(.
20490 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
204a0 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20  er *pBuilder,.  
204b0 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 0a 20  Index *pIndex,. 
204c0 20 69 6e 74 20 69 43 75 72 73 6f 72 0a 29 7b 0a   int iCursor.){.
204d0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 42 3b    ExprList *pOB;
204e0 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a  .  int ii, jj;..
204f0 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 62 55    if( pIndex->bU
20500 6e 6f 72 64 65 72 65 64 20 29 20 72 65 74 75 72  nordered ) retur
20510 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 4f 42 20  n 0;.  if( (pOB 
20520 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
20530 66 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d 3d 30  fo->pOrderBy)==0
20540 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66   ) return 0;.  f
20550 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 42 2d  or(ii=0; ii<pOB-
20560 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20  >nExpr; ii++){. 
20570 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
20580 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
20590 43 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61 5b 69  Collate(pOB->a[i
205a0 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  i].pExpr);.    i
205b0 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
205c0 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e  _COLUMN ) return
205d0 20 30 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70   0;.    if( pExp
205e0 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 43 75 72 73  r->iTable==iCurs
205f0 6f 72 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  or ){.      if( 
20600 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pExpr->iColumn<0
20610 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
20620 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c     for(jj=0; jj<
20630 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  pIndex->nKeyCol;
20640 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   jj++){.        
20650 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
20660 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f  mn==pIndex->aiCo
20670 6c 75 6d 6e 5b 6a 6a 5d 20 29 20 72 65 74 75 72  lumn[jj] ) retur
20680 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
20690 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
206a0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
206b0 72 6e 20 61 20 62 69 74 6d 61 73 6b 20 77 68 65  rn a bitmask whe
206c0 72 65 20 31 73 20 69 6e 64 69 63 61 74 65 20 74  re 1s indicate t
206d0 68 61 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f  hat the correspo
206e0 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a  nding column of.
206f0 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  ** the table is 
20700 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78  used by an index
20710 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73  .  Only the firs
20720 74 20 36 33 20 63 6f 6c 75 6d 6e 73 20 61 72 65  t 63 columns are
20730 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a   considered..*/.
20740 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63  static Bitmask c
20750 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 49 6e  olumnsInIndex(In
20760 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 42 69  dex *pIdx){.  Bi
20770 74 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69  tmask m = 0;.  i
20780 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49  nt j;.  for(j=pI
20790 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a  dx->nColumn-1; j
207a0 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69  >=0; j--){.    i
207b0 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43  nt x = pIdx->aiC
207c0 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66  olumn[j];.    if
207d0 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( x>=0 ){.      
207e0 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53  testcase( x==BMS
207f0 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  -1 );.      test
20800 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 32 20 29  case( x==BMS-2 )
20810 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d  ;.      if( x<BM
20820 53 2d 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b 42  S-1 ) m |= MASKB
20830 49 54 28 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  IT(x);.    }.  }
20840 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a  .  return m;.}..
20850 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
20860 69 66 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64  if a partial ind
20870 65 78 20 77 69 74 68 20 70 50 61 72 74 49 6e 64  ex with pPartInd
20880 65 78 57 68 65 72 65 20 63 61 6e 20 62 65 20 75  exWhere can be u
20890 73 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75  sed.** in the cu
208a0 72 72 65 6e 74 20 71 75 65 72 79 2e 20 20 52 65  rrent query.  Re
208b0 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20  turn true if it 
208c0 63 61 6e 20 62 65 20 61 6e 64 20 66 61 6c 73 65  can be and false
208d0 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74   if not..*/.stat
208e0 69 63 20 69 6e 74 20 77 68 65 72 65 55 73 61 62  ic int whereUsab
208f0 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 69  lePartialIndex(i
20900 6e 74 20 69 54 61 62 2c 20 57 68 65 72 65 43 6c  nt iTab, WhereCl
20910 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20  ause *pWC, Expr 
20920 2a 70 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20  *pWhere){.  int 
20930 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  i;.  WhereTerm *
20940 70 54 65 72 6d 3b 0a 20 20 66 6f 72 28 69 3d 30  pTerm;.  for(i=0
20950 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  , pTerm=pWC->a; 
20960 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b  i<pWC->nTerm; i+
20970 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
20980 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
20990 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
209a0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
209b0 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45 78 70  ImpliesExpr(pExp
209c0 72 2c 20 70 57 68 65 72 65 2c 20 69 54 61 62 29  r, pWhere, iTab)
209d0 20 0a 20 20 20 20 20 26 26 20 28 21 45 78 70 72   .     && (!Expr
209e0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
209f0 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
20a00 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74  || pExpr->iRight
20a10 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69 54 61 62 29  JoinTable==iTab)
20a20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
20a30 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
20a40 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
20a50 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57  ./*.** Add all W
20a60 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
20a70 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 61   for a single ta
20a80 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ble of the join 
20a90 77 68 65 72 65 20 74 68 65 20 74 61 62 6c 65 0a  where the table.
20aa0 2a 2a 20 69 73 20 69 64 65 6e 66 69 65 64 20 62  ** is idenfied b
20ab0 79 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  y pBuilder->pNew
20ac0 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74 61  ->iTab.  That ta
20ad0 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65 65  ble is guarantee
20ae0 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 62 2d 74  d to be.** a b-t
20af0 72 65 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61  ree table, not a
20b00 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
20b10 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 73 74 73 20  **.** The costs 
20b20 28 57 68 65 72 65 4c 6f 6f 70 2e 72 52 75 6e 29  (WhereLoop.rRun)
20b30 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6c   of the b-tree l
20b40 6f 6f 70 73 20 61 64 64 65 64 20 62 79 20 74 68  oops added by th
20b50 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  is function.** a
20b60 72 65 20 63 61 6c 63 75 6c 61 74 65 64 20 61 73  re calculated as
20b70 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
20b80 46 6f 72 20 61 20 66 75 6c 6c 20 73 63 61 6e 2c  For a full scan,
20b90 20 61 73 73 75 6d 69 6e 67 20 74 68 65 20 74 61   assuming the ta
20ba0 62 6c 65 20 28 6f 72 20 69 6e 64 65 78 29 20 63  ble (or index) c
20bb0 6f 6e 74 61 69 6e 73 20 6e 52 6f 77 20 72 6f 77  ontains nRow row
20bc0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73  s:.**.**     cos
20bd0 74 20 3d 20 6e 52 6f 77 20 2a 20 33 2e 30 20 20  t = nRow * 3.0  
20be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20bf0 20 20 2f 2f 20 66 75 6c 6c 2d 74 61 62 6c 65 20    // full-table 
20c00 73 63 61 6e 0a 2a 2a 20 20 20 20 20 63 6f 73 74  scan.**     cost
20c10 20 3d 20 6e 52 6f 77 20 2a 20 4b 20 20 20 20 20   = nRow * K     
20c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c30 20 2f 2f 20 73 63 61 6e 20 6f 66 20 63 6f 76 65   // scan of cove
20c40 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20 20  ring index.**   
20c50 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20    cost = nRow * 
20c60 28 4b 2b 33 2e 30 29 20 20 20 20 20 20 20 20 20  (K+3.0)         
20c70 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f         // scan o
20c80 66 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69  f non-covering i
20c90 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  ndex.**.** where
20ca0 20 4b 20 69 73 20 61 20 76 61 6c 75 65 20 62 65   K is a value be
20cb0 74 77 65 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e  tween 1.1 and 3.
20cc0 30 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20 74  0 set based on t
20cd0 68 65 20 72 65 6c 61 74 69 76 65 20 0a 2a 2a 20  he relative .** 
20ce0 65 73 74 69 6d 61 74 65 64 20 61 76 65 72 61 67  estimated averag
20cf0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e  e size of the in
20d00 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 72 65  dex and table re
20d10 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  cords..**.** For
20d20 20 61 6e 20 69 6e 64 65 78 20 73 63 61 6e 2c 20   an index scan, 
20d30 77 68 65 72 65 20 6e 56 69 73 69 74 20 69 73 20  where nVisit is 
20d40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  the number of in
20d50 64 65 78 20 72 6f 77 73 20 76 69 73 69 74 65 64  dex rows visited
20d60 0a 2a 2a 20 62 79 20 74 68 65 20 73 63 61 6e 2c  .** by the scan,
20d70 20 61 6e 64 20 6e 53 65 65 6b 20 69 73 20 74 68   and nSeek is th
20d80 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 65 6b  e number of seek
20d90 20 6f 70 65 72 61 74 69 6f 6e 73 20 72 65 71 75   operations requ
20da0 69 72 65 64 20 6f 6e 20 0a 2a 2a 20 74 68 65 20  ired on .** the 
20db0 69 6e 64 65 78 20 62 2d 74 72 65 65 3a 0a 2a 2a  index b-tree:.**
20dc0 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e  .**     cost = n
20dd0 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77  Seek * (log(nRow
20de0 29 20 2b 20 4b 20 2a 20 6e 56 69 73 69 74 29 20  ) + K * nVisit) 
20df0 20 20 20 20 20 20 20 20 20 2f 2f 20 63 6f 76 65           // cove
20e00 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20 20  ring index.**   
20e10 20 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a    cost = nSeek *
20e20 20 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 28 4b   (log(nRow) + (K
20e30 2b 33 2e 30 29 20 2a 20 6e 56 69 73 69 74 29 20  +3.0) * nVisit) 
20e40 20 20 20 2f 2f 20 6e 6f 6e 2d 63 6f 76 65 72 69     // non-coveri
20e50 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 4e  ng index.**.** N
20e60 6f 72 6d 61 6c 6c 79 2c 20 6e 53 65 65 6b 20 69  ormally, nSeek i
20e70 73 20 31 2e 20 6e 53 65 65 6b 20 76 61 6c 75 65  s 1. nSeek value
20e80 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 31  s greater than 1
20e90 20 63 6f 6d 65 20 61 62 6f 75 74 20 69 66 20 74   come about if t
20ea0 68 65 20 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  he .** WHERE cla
20eb0 75 73 65 20 69 6e 63 6c 75 64 65 73 20 22 78 20  use includes "x 
20ec0 49 4e 20 28 2e 2e 2e 2e 29 22 20 74 65 72 6d 73  IN (....)" terms
20ed0 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f   used in place o
20ee0 66 20 22 78 3d 3f 22 2e 20 4f 72 20 77 68 65 6e  f "x=?". Or when
20ef0 20 0a 2a 2a 20 69 6d 70 6c 69 63 69 74 20 22 78   .** implicit "x
20f00 20 49 4e 20 28 53 45 4c 45 43 54 20 78 20 46 52   IN (SELECT x FR
20f10 4f 4d 20 74 62 6c 29 22 20 74 65 72 6d 73 20 61  OM tbl)" terms a
20f20 72 65 20 61 64 64 65 64 20 66 6f 72 20 73 6b 69  re added for ski
20f30 70 2d 73 63 61 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54  p-scans..**.** T
20f40 68 65 20 65 73 74 69 6d 61 74 65 64 20 76 61 6c  he estimated val
20f50 75 65 73 20 28 6e 52 6f 77 2c 20 6e 56 69 73 69  ues (nRow, nVisi
20f60 74 2c 20 6e 53 65 65 6b 29 20 6f 66 74 65 6e 20  t, nSeek) often 
20f70 63 6f 6e 74 61 69 6e 20 61 20 6c 61 72 67 65 20  contain a large 
20f80 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 75 6e 63  amount.** of unc
20f90 65 72 74 61 69 6e 74 79 2e 20 20 46 6f 72 20 74  ertainty.  For t
20fa0 68 69 73 20 72 65 61 73 6f 6e 2c 20 73 63 6f 72  his reason, scor
20fb0 69 6e 67 20 69 73 20 64 65 73 69 67 6e 65 64 20  ing is designed 
20fc0 74 6f 20 70 69 63 6b 20 70 6c 61 6e 73 20 74 68  to pick plans th
20fd0 61 74 0a 2a 2a 20 22 64 6f 20 74 68 65 20 6c 65  at.** "do the le
20fe0 61 73 74 20 68 61 72 6d 22 20 69 66 20 74 68 65  ast harm" if the
20ff0 20 65 73 74 69 6d 61 74 65 73 20 61 72 65 20 69   estimates are i
21000 6e 61 63 63 75 72 61 74 65 2e 20 20 46 6f 72 20  naccurate.  For 
21010 65 78 61 6d 70 6c 65 2c 20 61 0a 2a 2a 20 6c 6f  example, a.** lo
21020 67 28 6e 52 6f 77 29 20 66 61 63 74 6f 72 20 69  g(nRow) factor i
21030 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 61  s omitted from a
21040 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e   non-covering in
21050 64 65 78 20 73 63 61 6e 20 69 6e 20 6f 72 64 65  dex scan in orde
21060 72 20 74 6f 0a 2a 2a 20 62 69 61 73 20 74 68 65  r to.** bias the
21070 20 73 63 6f 72 69 6e 67 20 69 6e 20 66 61 76 6f   scoring in favo
21080 72 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69 6e  r of using an in
21090 64 65 78 2c 20 73 69 6e 63 65 20 74 68 65 20 77  dex, since the w
210a0 6f 72 73 74 2d 63 61 73 65 0a 2a 2a 20 70 65 72  orst-case.** per
210b0 66 6f 72 6d 61 6e 63 65 20 6f 66 20 75 73 69 6e  formance of usin
210c0 67 20 61 6e 20 69 6e 64 65 78 20 69 73 20 66 61  g an index is fa
210d0 72 20 62 65 74 74 65 72 20 74 68 61 6e 20 74 68  r better than th
210e0 65 20 77 6f 72 73 74 2d 63 61 73 65 20 70 65 72  e worst-case per
210f0 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 6f 66 20 61  formance.** of a
21100 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   full table scan
21110 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21120 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
21130 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  e(.  WhereLoopBu
21140 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
21150 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
21160 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
21170 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61    Bitmask mExtra
21180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21190 20 45 78 74 72 61 20 70 72 65 72 65 71 75 65 73   Extra prereques
211a0 69 74 65 73 20 66 6f 72 20 75 73 69 6e 67 20 74  ites for using t
211b0 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a  his table */.){.
211c0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
211d0 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  nfo;          /*
211e0 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20   WHERE analysis 
211f0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64  context */.  Ind
21200 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20  ex *pProbe;     
21210 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
21220 6e 64 65 78 20 77 65 20 61 72 65 20 65 76 61 6c  ndex we are eval
21230 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65  uating */.  Inde
21240 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20 20  x sPk;          
21250 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61 6b          /* A fak
21260 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 66  e index object f
21270 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  or the primary k
21280 65 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61  ey */.  LogEst a
21290 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20 20  iRowEstPk[2];   
212a0 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f 77      /* The aiRow
212b0 4c 6f 67 45 73 74 5b 5d 20 76 61 6c 75 65 20 66  LogEst[] value f
212c0 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78  or the sPk index
212d0 20 2a 2f 0a 20 20 69 31 36 20 61 69 43 6f 6c 75   */.  i16 aiColu
212e0 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20  mnPk = -1;      
212f0 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e    /* The aColumn
21300 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  [] value for the
21310 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20   sPk index */.  
21320 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
21330 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
21340 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
21350 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
21360 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20  st_item *pSrc;  
21370 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
21380 73 65 20 62 74 72 65 65 20 74 65 72 6d 20 74 6f  se btree term to
21390 20 61 64 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c   add */.  WhereL
213a0 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  oop *pNew;      
213b0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74        /* Templat
213c0 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
213d0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ct */.  int rc =
213e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
213f0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
21400 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72  de */.  int iSor
21410 74 49 64 78 20 3d 20 31 3b 20 20 20 20 20 20 20  tIdx = 1;       
21420 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d      /* Index num
21430 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b 20  ber */.  int b; 
21440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21450 20 20 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65 61       /* A boolea
21460 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4c 6f 67  n value */.  Log
21470 45 73 74 20 72 53 69 7a 65 3b 20 20 20 20 20 20  Est rSize;      
21480 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62           /* numb
21490 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
214a0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67  e table */.  Log
214b0 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20  Est rLogSize;   
214c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61           /* Loga
214d0 72 69 74 68 6d 20 6f 66 20 74 68 65 20 6e 75 6d  rithm of the num
214e0 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
214f0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68  he table */.  Wh
21500 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
21510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
21520 20 70 61 72 73 65 64 20 57 48 45 52 45 20 63 6c   parsed WHERE cl
21530 61 75 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  ause */.  Table 
21540 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
21550 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62        /* Table b
21560 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a  eing queried */.
21570 20 20 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69    .  pNew = pBui
21580 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 57  lder->pNew;.  pW
21590 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
215a0 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 54 61 62 4c  >pWInfo;.  pTabL
215b0 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  ist = pWInfo->pT
215c0 61 62 4c 69 73 74 3b 0a 20 20 70 53 72 63 20 3d  abList;.  pSrc =
215d0 20 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70   pTabList->a + p
215e0 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 70 54 61  New->iTab;.  pTa
215f0 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a  b = pSrc->pTab;.
21600 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72    pWC = pBuilder
21610 2d 3e 70 57 43 3b 0a 20 20 61 73 73 65 72 74 28  ->pWC;.  assert(
21620 20 21 49 73 56 69 72 74 75 61 6c 28 70 53 72 63   !IsVirtual(pSrc
21630 2d 3e 70 54 61 62 29 20 29 3b 0a 0a 20 20 69 66  ->pTab) );..  if
21640 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29  ( pSrc->pIndex )
21650 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49 4e 44 45  {.    /* An INDE
21660 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 73 70  XED BY clause sp
21670 65 63 69 66 69 65 73 20 61 20 70 61 72 74 69 63  ecifies a partic
21680 75 6c 61 72 20 69 6e 64 65 78 20 74 6f 20 75 73  ular index to us
21690 65 20 2a 2f 0a 20 20 20 20 70 50 72 6f 62 65 20  e */.    pProbe 
216a0 3d 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3b 0a  = pSrc->pIndex;.
216b0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 48 61 73    }else if( !Has
216c0 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
216d0 20 20 20 70 50 72 6f 62 65 20 3d 20 70 54 61 62     pProbe = pTab
216e0 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73  ->pIndex;.  }els
216f0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  e{.    /* There 
21700 69 73 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59  is no INDEXED BY
21710 20 63 6c 61 75 73 65 2e 20 20 43 72 65 61 74 65   clause.  Create
21720 20 61 20 66 61 6b 65 20 49 6e 64 65 78 20 6f 62   a fake Index ob
21730 6a 65 63 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20  ject in local.  
21740 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 73 50    ** variable sP
21750 6b 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 74  k to represent t
21760 68 65 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79  he rowid primary
21770 20 6b 65 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b   key index.  Mak
21780 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 61  e this.    ** fa
21790 6b 65 20 69 6e 64 65 78 20 74 68 65 20 66 69 72  ke index the fir
217a0 73 74 20 69 6e 20 61 20 63 68 61 69 6e 20 6f 66  st in a chain of
217b0 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 73 20 77   Index objects w
217c0 69 74 68 20 61 6c 6c 20 6f 66 20 74 68 65 20 72  ith all of the r
217d0 65 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63  eal.    ** indic
217e0 65 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a  es to follow */.
217f0 20 20 20 20 49 6e 64 65 78 20 2a 70 46 69 72 73      Index *pFirs
21800 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
21810 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6f 66 20      /* First of 
21820 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20  real indices on 
21830 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  the table */.   
21840 20 6d 65 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c   memset(&sPk, 0,
21850 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b   sizeof(Index));
21860 0a 20 20 20 20 73 50 6b 2e 6e 4b 65 79 43 6f 6c  .    sPk.nKeyCol
21870 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 6e 43   = 1;.    sPk.nC
21880 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 73  olumn = 1;.    s
21890 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61  Pk.aiColumn = &a
218a0 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73  iColumnPk;.    s
218b0 50 6b 2e 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d  Pk.aiRowLogEst =
218c0 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a 20 20 20   aiRowEstPk;.   
218d0 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f   sPk.onError = O
218e0 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20 20 20 73  E_Replace;.    s
218f0 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70 54 61 62  Pk.pTable = pTab
21900 3b 0a 20 20 20 20 73 50 6b 2e 73 7a 49 64 78 52  ;.    sPk.szIdxR
21910 6f 77 20 3d 20 70 54 61 62 2d 3e 73 7a 54 61 62  ow = pTab->szTab
21920 52 6f 77 3b 0a 20 20 20 20 61 69 52 6f 77 45 73  Row;.    aiRowEs
21930 74 50 6b 5b 30 5d 20 3d 20 70 54 61 62 2d 3e 6e  tPk[0] = pTab->n
21940 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 20 20 61  RowLogEst;.    a
21950 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20 3d 20 30  iRowEstPk[1] = 0
21960 3b 0a 20 20 20 20 70 46 69 72 73 74 20 3d 20 70  ;.    pFirst = p
21970 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65  Src->pTab->pInde
21980 78 3b 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d  x;.    if( pSrc-
21990 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29  >notIndexed==0 )
219a0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72  {.      /* The r
219b0 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 74  eal indices of t
219c0 68 65 20 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c  he table are onl
219d0 79 20 63 6f 6e 73 69 64 65 72 65 64 20 69 66 20  y considered if 
219e0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54  the.      ** NOT
219f0 20 49 4e 44 45 58 45 44 20 71 75 61 6c 69 66 69   INDEXED qualifi
21a00 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72  er is omitted fr
21a10 6f 6d 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  om the FROM clau
21a20 73 65 20 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e  se */.      sPk.
21a30 70 4e 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a  pNext = pFirst;.
21a40 20 20 20 20 7d 0a 20 20 20 20 70 50 72 6f 62 65      }.    pProbe
21a50 20 3d 20 26 73 50 6b 3b 0a 20 20 7d 0a 20 20 72   = &sPk;.  }.  r
21a60 53 69 7a 65 20 3d 20 70 54 61 62 2d 3e 6e 52 6f  Size = pTab->nRo
21a70 77 4c 6f 67 45 73 74 3b 0a 20 20 72 4c 6f 67 53  wLogEst;.  rLogS
21a80 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72 53 69  ize = estLog(rSi
21a90 7a 65 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ze);..#ifndef SQ
21aa0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
21ab0 54 49 43 5f 49 4e 44 45 58 0a 20 20 2f 2a 20 41  TIC_INDEX.  /* A
21ac0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65 73  utomatic indexes
21ad0 20 2a 2f 0a 20 20 69 66 28 20 21 70 42 75 69 6c   */.  if( !pBuil
21ae0 64 65 72 2d 3e 70 4f 72 53 65 74 20 20 20 2f 2a  der->pOrSet   /*
21af0 20 4e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 20   Not part of an 
21b00 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  OR optimization 
21b10 2a 2f 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f  */.   && (pWInfo
21b20 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
21b30 48 45 52 45 5f 4e 4f 5f 41 55 54 4f 49 4e 44 45  HERE_NO_AUTOINDE
21b40 58 29 3d 3d 30 0a 20 20 20 26 26 20 28 70 57 49  X)==0.   && (pWI
21b50 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d  nfo->pParse->db-
21b60 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
21b70 41 75 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20  AutoIndex)!=0.  
21b80 20 26 26 20 70 53 72 63 2d 3e 70 49 6e 64 65 78   && pSrc->pIndex
21b90 3d 3d 30 20 20 20 20 20 2f 2a 20 48 61 73 20 6e  ==0     /* Has n
21ba0 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  o INDEXED BY cla
21bb0 75 73 65 20 2a 2f 0a 20 20 20 26 26 20 21 70 53  use */.   && !pS
21bc0 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 20  rc->notIndexed  
21bd0 20 2f 2a 20 48 61 73 20 6e 6f 20 4e 4f 54 20 49   /* Has no NOT I
21be0 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 2a 2f  NDEXED clause */
21bf0 0a 20 20 20 26 26 20 48 61 73 52 6f 77 69 64 28  .   && HasRowid(
21c00 70 54 61 62 29 20 20 20 20 20 20 2f 2a 20 49 73  pTab)      /* Is
21c10 20 6e 6f 74 20 61 20 57 49 54 48 4f 55 54 20 52   not a WITHOUT R
21c20 4f 57 49 44 20 74 61 62 6c 65 2e 20 28 46 49 58  OWID table. (FIX
21c30 4d 45 3a 20 57 68 79 20 6e 6f 74 3f 29 20 2a 2f  ME: Why not?) */
21c40 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 69 73  .   && !pSrc->is
21c50 43 6f 72 72 65 6c 61 74 65 64 20 2f 2a 20 4e 6f  Correlated /* No
21c60 74 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  t a correlated s
21c70 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 26 26  ubquery */.   &&
21c80 20 21 70 53 72 63 2d 3e 69 73 52 65 63 75 72 73   !pSrc->isRecurs
21c90 69 76 65 20 20 2f 2a 20 4e 6f 74 20 61 20 72 65  ive  /* Not a re
21ca0 63 75 72 73 69 76 65 20 63 6f 6d 6d 6f 6e 20 74  cursive common t
21cb0 61 62 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 2e  able expression.
21cc0 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20   */.  ){.    /* 
21cd0 47 65 6e 65 72 61 74 65 20 61 75 74 6f 2d 69 6e  Generate auto-in
21ce0 64 65 78 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a  dex WhereLoops *
21cf0 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  /.    WhereTerm 
21d00 2a 70 54 65 72 6d 3b 0a 20 20 20 20 57 68 65 72  *pTerm;.    Wher
21d10 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 20 3d 20  eTerm *pWCEnd = 
21d20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54  pWC->a + pWC->nT
21d30 65 72 6d 3b 0a 20 20 20 20 66 6f 72 28 70 54 65  erm;.    for(pTe
21d40 72 6d 3d 70 57 43 2d 3e 61 3b 20 72 63 3d 3d 53  rm=pWC->a; rc==S
21d50 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72  QLITE_OK && pTer
21d60 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b  m<pWCEnd; pTerm+
21d70 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54  +){.      if( pT
21d80 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
21d90 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c   & pNew->maskSel
21da0 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  f ) continue;.  
21db0 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
21dc0 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
21dd0 20 70 53 72 63 2c 20 30 29 20 29 7b 0a 20 20 20   pSrc, 0) ){.   
21de0 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72       pNew->u.btr
21df0 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20  ee.nEq = 1;.    
21e00 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20      pNew->nSkip 
21e10 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  = 0;.        pNe
21e20 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  w->u.btree.pInde
21e30 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  x = 0;.        p
21e40 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b  New->nLTerm = 1;
21e50 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61  .        pNew->a
21e60 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d  LTerm[0] = pTerm
21e70 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e  ;.        /* TUN
21e80 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d 65 20 63 6f  ING: One-time co
21e90 73 74 20 66 6f 72 20 63 6f 6d 70 75 74 69 6e 67  st for computing
21ea0 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
21eb0 6e 64 65 78 20 69 73 0a 20 20 20 20 20 20 20 20  ndex is.        
21ec0 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 74 6f 20  ** estimated to 
21ed0 62 65 20 58 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77  be X*N*log2(N) w
21ee0 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75  here N is the nu
21ef0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 0a  mber of rows in.
21f00 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74          ** the t
21f10 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78  able being index
21f20 65 64 20 61 6e 64 20 77 68 65 72 65 20 58 20 69  ed and where X i
21f30 73 20 37 20 28 4c 6f 67 45 73 74 3d 32 38 29 20  s 7 (LogEst=28) 
21f40 66 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 20  for normal.     
21f50 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 6f 72 20     ** tables or 
21f60 31 2e 33 37 35 20 28 4c 6f 67 45 73 74 3d 34 29  1.375 (LogEst=4)
21f70 20 66 6f 72 20 76 69 65 77 73 20 61 6e 64 20 73   for views and s
21f80 75 62 71 75 65 72 69 65 73 2e 20 20 54 68 65 20  ubqueries.  The 
21f90 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a  value.        **
21fa0 20 6f 66 20 58 20 69 73 20 73 6d 61 6c 6c 65 72   of X is smaller
21fb0 20 66 6f 72 20 76 69 65 77 73 20 61 6e 64 20 73   for views and s
21fc0 75 62 71 75 65 72 69 65 73 20 73 6f 20 74 68 61  ubqueries so tha
21fd0 74 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e  t the query plan
21fe0 6e 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 77  ner.        ** w
21ff0 69 6c 6c 20 62 65 20 6d 6f 72 65 20 61 67 67 72  ill be more aggr
22000 65 73 73 69 76 65 20 61 62 6f 75 74 20 67 65 6e  essive about gen
22010 65 72 61 74 69 6e 67 20 61 75 74 6f 6d 61 74 69  erating automati
22020 63 20 69 6e 64 65 78 65 73 20 66 6f 72 0a 20 20  c indexes for.  
22030 20 20 20 20 20 20 2a 2a 20 74 68 6f 73 65 20 6f        ** those o
22040 62 6a 65 63 74 73 2c 20 73 69 6e 63 65 20 74 68  bjects, since th
22050 65 72 65 20 69 73 20 6e 6f 20 6f 70 70 6f 72 74  ere is no opport
22060 75 6e 69 74 79 20 74 6f 20 61 64 64 20 73 63 68  unity to add sch
22070 65 6d 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ema.        ** i
22080 6e 64 65 78 65 73 20 6f 6e 20 73 75 62 71 75 65  ndexes on subque
22090 72 69 65 73 20 61 6e 64 20 76 69 65 77 73 2e 20  ries and views. 
220a0 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  */.        pNew-
220b0 3e 72 53 65 74 75 70 20 3d 20 72 4c 6f 67 53 69  >rSetup = rLogSi
220c0 7a 65 20 2b 20 72 53 69 7a 65 20 2b 20 34 3b 0a  ze + rSize + 4;.
220d0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62          if( pTab
220e0 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 26 26 20  ->pSelect==0 && 
220f0 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
22100 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d  & TF_Ephemeral)=
22110 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
22120 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 2b 3d 20  pNew->rSetup += 
22130 32 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  24;.        }.  
22140 20 20 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d        ApplyCostM
22150 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e  ultiplier(pNew->
22160 72 53 65 74 75 70 2c 20 70 54 61 62 2d 3e 63 6f  rSetup, pTab->co
22170 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20 20  stMult);.       
22180 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61 63 68   /* TUNING: Each
22190 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 79 69   index lookup yi
221a0 65 6c 64 73 20 32 30 20 72 6f 77 73 20 69 6e 20  elds 20 rows in 
221b0 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73  the table.  This
221c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6d  .        ** is m
221d0 6f 72 65 20 74 68 61 6e 20 74 68 65 20 75 73 75  ore than the usu
221e0 61 6c 20 67 75 65 73 73 20 6f 66 20 31 30 20 72  al guess of 10 r
221f0 6f 77 73 2c 20 73 69 6e 63 65 20 77 65 20 68 61  ows, since we ha
22200 76 65 20 6e 6f 20 77 61 79 0a 20 20 20 20 20 20  ve no way.      
22210 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77 69 6e 67 20    ** of knowing 
22220 68 6f 77 20 73 65 6c 65 63 74 69 76 65 20 74 68  how selective th
22230 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 75 6c 74  e index will ult
22240 69 6d 61 74 65 6c 79 20 62 65 2e 20 20 49 74 20  imately be.  It 
22250 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  would.        **
22260 20 6e 6f 74 20 62 65 20 75 6e 72 65 61 73 6f 6e   not be unreason
22270 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74 68 69  able to make thi
22280 73 20 76 61 6c 75 65 20 6d 75 63 68 20 6c 61 72  s value much lar
22290 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ger. */.        
222a0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34 33 3b  pNew->nOut = 43;
222b0 20 20 61 73 73 65 72 74 28 20 34 33 3d 3d 73 71    assert( 43==sq
222c0 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 30 29 20  lite3LogEst(20) 
222d0 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
222e0 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c  >rRun = sqlite3L
222f0 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a  ogEstAdd(rLogSiz
22300 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20  e,pNew->nOut);. 
22310 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
22320 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 41 55 54  lags = WHERE_AUT
22330 4f 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20 20 20  O_INDEX;.       
22340 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
22350 6d 45 78 74 72 61 20 7c 20 70 54 65 72 6d 2d 3e  mExtra | pTerm->
22360 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20  prereqRight;.   
22370 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
22380 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
22390 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
223a0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
223b0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
223c0 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
223d0 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 6f 70  EX */..  /* Loop
223e0 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69 63 65   over all indice
223f0 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 72  s.  */.  for(; r
22400 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
22410 70 50 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d 70  pProbe; pProbe=p
22420 50 72 6f 62 65 2d 3e 70 4e 65 78 74 2c 20 69 53  Probe->pNext, iS
22430 6f 72 74 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69  ortIdx++){.    i
22440 66 28 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74  f( pProbe->pPart
22450 49 64 78 57 68 65 72 65 21 3d 30 0a 20 20 20 20  IdxWhere!=0.    
22460 20 26 26 20 21 77 68 65 72 65 55 73 61 62 6c 65   && !whereUsable
22470 50 61 72 74 69 61 6c 49 6e 64 65 78 28 70 53 72  PartialIndex(pSr
22480 63 2d 3e 69 43 75 72 73 6f 72 2c 20 70 57 43 2c  c->iCursor, pWC,
22490 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64   pProbe->pPartId
224a0 78 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20  xWhere) ){.     
224b0 20 74 65 73 74 63 61 73 65 28 20 70 4e 65 77 2d   testcase( pNew-
224c0 3e 69 54 61 62 21 3d 70 53 72 63 2d 3e 69 43 75  >iTab!=pSrc->iCu
224d0 72 73 6f 72 20 29 3b 20 20 2f 2a 20 53 65 65 20  rsor );  /* See 
224e0 74 69 63 6b 65 74 20 5b 39 38 64 39 37 33 62 38  ticket [98d973b8
224f0 66 35 5d 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  f5] */.      con
22500 74 69 6e 75 65 3b 20 20 2f 2a 20 50 61 72 74 69  tinue;  /* Parti
22510 61 6c 20 69 6e 64 65 78 20 69 6e 61 70 70 72 6f  al index inappro
22520 70 72 69 61 74 65 20 66 6f 72 20 74 68 69 73 20  priate for this 
22530 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 7d 0a 20  query */.    }. 
22540 20 20 20 72 53 69 7a 65 20 3d 20 70 50 72 6f 62     rSize = pProb
22550 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30  e->aiRowLogEst[0
22560 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  ];.    pNew->u.b
22570 74 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20  tree.nEq = 0;.  
22580 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20    pNew->nSkip = 
22590 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54  0;.    pNew->nLT
225a0 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  erm = 0;.    pNe
225b0 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b  w->iSortIdx = 0;
225c0 0a 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75  .    pNew->rSetu
225d0 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  p = 0;.    pNew-
225e0 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61  >prereq = mExtra
225f0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74  ;.    pNew->nOut
22600 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 70 4e   = rSize;.    pN
22610 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
22620 65 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20  ex = pProbe;.   
22630 20 62 20 3d 20 69 6e 64 65 78 4d 69 67 68 74 48   b = indexMightH
22640 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28 70  elpWithOrderBy(p
22650 42 75 69 6c 64 65 72 2c 20 70 50 72 6f 62 65 2c  Builder, pProbe,
22660 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 29 3b   pSrc->iCursor);
22670 0a 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 45 50  .    /* The ONEP
22680 41 53 53 5f 44 45 53 49 52 45 44 20 66 6c 61 67  ASS_DESIRED flag
22690 73 20 6e 65 76 65 72 20 6f 63 63 75 72 73 20 74  s never occurs t
226a0 6f 67 65 74 68 65 72 20 77 69 74 68 20 4f 52 44  ogether with ORD
226b0 45 52 20 42 59 20 2a 2f 0a 20 20 20 20 61 73 73  ER BY */.    ass
226c0 65 72 74 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63  ert( (pWInfo->wc
226d0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
226e0 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
226f0 29 3d 3d 30 20 7c 7c 20 62 3d 3d 30 20 29 3b 0a  )==0 || b==0 );.
22700 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e      if( pProbe->
22710 74 6e 75 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20  tnum<=0 ){.     
22720 20 2f 2a 20 49 6e 74 65 67 65 72 20 70 72 69 6d   /* Integer prim
22730 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 2a 2f  ary key index */
22740 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
22750 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49 50 4b  lags = WHERE_IPK
22760 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c  ;..      /* Full
22770 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20   table scan */. 
22780 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74       pNew->iSort
22790 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49  Idx = b ? iSortI
227a0 64 78 20 3a 20 30 3b 0a 20 20 20 20 20 20 2f 2a  dx : 0;.      /*
227b0 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66   TUNING: Cost of
227c0 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   full table scan
227d0 20 69 73 20 28 4e 2a 33 2e 30 29 2e 20 2a 2f 0a   is (N*3.0). */.
227e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
227f0 20 3d 20 72 53 69 7a 65 20 2b 20 31 36 3b 0a 20   = rSize + 16;. 
22800 20 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75       ApplyCostMu
22810 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72  ltiplier(pNew->r
22820 52 75 6e 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d  Run, pTab->costM
22830 75 6c 74 29 3b 0a 20 20 20 20 20 20 77 68 65 72  ult);.      wher
22840 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73  eLoopOutputAdjus
22850 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69  t(pWC, pNew, rSi
22860 7a 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ze);.      rc = 
22870 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
22880 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
22890 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  .      pNew->nOu
228a0 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20  t = rSize;.     
228b0 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
228c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
228d0 20 20 42 69 74 6d 61 73 6b 20 6d 3b 0a 20 20 20    Bitmask m;.   
228e0 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 69     if( pProbe->i
228f0 73 43 6f 76 65 72 69 6e 67 20 29 7b 0a 20 20 20  sCovering ){.   
22900 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
22910 67 73 20 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs = WHERE_IDX_O
22920 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e 44 45  NLY | WHERE_INDE
22930 58 45 44 3b 0a 20 20 20 20 20 20 20 20 6d 20 3d  XED;.        m =
22940 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
22950 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 70 53 72  .        m = pSr
22960 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f  c->colUsed & ~co
22970 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70 50 72  lumnsInIndex(pPr
22980 6f 62 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  obe);.        pN
22990 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28 6d  ew->wsFlags = (m
229a0 3d 3d 30 29 20 3f 20 28 57 48 45 52 45 5f 49 44  ==0) ? (WHERE_ID
229b0 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 4e 44  X_ONLY|WHERE_IND
229c0 45 58 45 44 29 20 3a 20 57 48 45 52 45 5f 49 4e  EXED) : WHERE_IN
229d0 44 45 58 45 44 3b 0a 20 20 20 20 20 20 7d 0a 0a  DEXED;.      }..
229e0 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 73 63        /* Full sc
229f0 61 6e 20 76 69 61 20 69 6e 64 65 78 20 2a 2f 0a  an via index */.
22a00 20 20 20 20 20 20 69 66 28 20 62 0a 20 20 20 20        if( b.    
22a10 20 20 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28     || !HasRowid(
22a20 70 54 61 62 29 0a 20 20 20 20 20 20 20 7c 7c 20  pTab).       || 
22a30 28 20 6d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ( m==0.         
22a40 26 26 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72  && pProbe->bUnor
22a50 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20  dered==0.       
22a60 20 20 26 26 20 28 70 50 72 6f 62 65 2d 3e 73 7a    && (pProbe->sz
22a70 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54  IdxRow<pTab->szT
22a80 61 62 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20  abRow).         
22a90 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
22aa0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
22ab0 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d  NEPASS_DESIRED)=
22ac0 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 73  =0.         && s
22ad0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
22ae0 69 67 2e 62 55 73 65 43 69 73 0a 20 20 20 20 20  ig.bUseCis.     
22af0 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74      && Optimizat
22b00 69 6f 6e 45 6e 61 62 6c 65 64 28 70 57 49 6e 66  ionEnabled(pWInf
22b10 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 53  o->pParse->db, S
22b20 51 4c 49 54 45 5f 43 6f 76 65 72 49 64 78 53 63  QLITE_CoverIdxSc
22b30 61 6e 29 0a 20 20 20 20 20 20 20 20 20 20 29 0a  an).          ).
22b40 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
22b50 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20   pNew->iSortIdx 
22b60 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a  = b ? iSortIdx :
22b70 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   0;..        /* 
22b80 54 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69  The cost of visi
22b90 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 72  ting the index r
22ba0 6f 77 73 20 69 73 20 4e 2a 4b 2c 20 77 68 65 72  ows is N*K, wher
22bb0 65 20 4b 20 69 73 0a 20 20 20 20 20 20 20 20 2a  e K is.        *
22bc0 2a 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e  * between 1.1 an
22bd0 64 20 33 2e 30 2c 20 64 65 70 65 6e 64 69 6e 67  d 3.0, depending
22be0 20 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65   on the relative
22bf0 20 73 69 7a 65 73 20 6f 66 20 74 68 65 0a 20 20   sizes of the.  
22c00 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 61        ** index a
22c10 6e 64 20 74 61 62 6c 65 20 72 6f 77 73 2e 20 49  nd table rows. I
22c20 66 20 74 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d  f this is a non-
22c30 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 73  covering index s
22c40 63 61 6e 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  can,.        ** 
22c50 61 6c 73 6f 20 61 64 64 20 74 68 65 20 63 6f 73  also add the cos
22c60 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20 74 61  t of visiting ta
22c70 62 6c 65 20 72 6f 77 73 20 28 4e 2a 33 2e 30 29  ble rows (N*3.0)
22c80 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  .  */.        pN
22c90 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65  ew->rRun = rSize
22ca0 20 2b 20 31 20 2b 20 28 31 35 2a 70 50 72 6f 62   + 1 + (15*pProb
22cb0 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70 54 61  e->szIdxRow)/pTa
22cc0 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20  b->szTabRow;.   
22cd0 20 20 20 20 20 69 66 28 20 6d 21 3d 30 20 29 7b       if( m!=0 ){
22ce0 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
22cf0 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c  >rRun = sqlite3L
22d00 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72  ogEstAdd(pNew->r
22d10 52 75 6e 2c 20 72 53 69 7a 65 2b 31 36 29 3b 0a  Run, rSize+16);.
22d20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22d30 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69    ApplyCostMulti
22d40 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e  plier(pNew->rRun
22d50 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74  , pTab->costMult
22d60 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  );.        where
22d70 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74  LoopOutputAdjust
22d80 28 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a  (pWC, pNew, rSiz
22d90 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  e);.        rc =
22da0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
22db0 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
22dc0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
22dd0 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20  nOut = rSize;.  
22de0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62        if( rc ) b
22df0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
22e00 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77 68    }..    rc = wh
22e10 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49  ereLoopAddBtreeI
22e20 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70  ndex(pBuilder, p
22e30 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 30 29 3b  Src, pProbe, 0);
22e40 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
22e50 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
22e60 54 41 54 34 0a 20 20 20 20 73 71 6c 69 74 65 33  TAT4.    sqlite3
22e70 53 74 61 74 34 50 72 6f 62 65 46 72 65 65 28 70  Stat4ProbeFree(p
22e80 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 29 3b 0a  Builder->pRec);.
22e90 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52      pBuilder->nR
22ea0 65 63 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20  ecValid = 0;.   
22eb0 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20   pBuilder->pRec 
22ec0 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  = 0;.#endif..   
22ed0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73   /* If there was
22ee0 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   an INDEXED BY c
22ef0 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79  lause, then only
22f00 20 74 68 61 74 20 6f 6e 65 20 69 6e 64 65 78 20   that one index 
22f10 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64  is.    ** consid
22f20 65 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ered. */.    if(
22f30 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 20   pSrc->pIndex ) 
22f40 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
22f50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
22f60 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
22f70 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
22f80 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c  * Add all WhereL
22f90 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  oop objects for 
22fa0 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  a table of the j
22fb0 6f 69 6e 20 69 64 65 6e 74 69 66 69 65 64 20 62  oin identified b
22fc0 79 0a 2a 2a 20 70 42 75 69 6c 64 65 72 2d 3e 70  y.** pBuilder->p
22fd0 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74  New->iTab.  That
22fe0 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e   table is guaran
22ff0 74 65 65 64 20 74 6f 20 62 65 20 61 20 76 69 72  teed to be a vir
23000 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  tual table..*/.s
23010 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
23020 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 0a 20  oopAddVirtual(. 
23030 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
23040 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 2f 2a  r *pBuilder,  /*
23050 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
23060 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42  formation */.  B
23070 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 0a 29 7b  itmask mExtra.){
23080 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
23090 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
230a0 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69  /* WHERE analysi
230b0 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  s context */.  P
230c0 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
230d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
230e0 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
230f0 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
23100 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20  use *pWC;       
23110 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
23120 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
23130 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
23140 6d 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 54 68  m *pSrc;   /* Th
23150 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
23160 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  rm to search */.
23170 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
23180 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
23190 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
231a0 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20  fo *pIdxInfo;.  
231b0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
231c0 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20  ndex_constraint 
231d0 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72  *pIdxCons;.  str
231e0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
231f0 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
23200 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68  ge *pUsage;.  Wh
23210 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
23220 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
23230 74 20 69 54 65 72 6d 2c 20 6d 78 54 65 72 6d 3b  t iTerm, mxTerm;
23240 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69  .  int nConstrai
23250 6e 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e 49 6e  nt;.  int seenIn
23260 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
23270 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e     /* True if an
23280 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
23290 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 65  seen */.  int se
232a0 65 6e 56 61 72 20 3d 20 30 3b 20 20 20 20 20 20  enVar = 0;      
232b0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
232c0 66 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74  f a non-constant
232d0 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 73   constraint is s
232e0 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 50 68  een */.  int iPh
232f0 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
23300 20 20 20 20 20 20 2f 2a 20 30 3a 20 63 6f 6e 73        /* 0: cons
23310 74 20 77 2f 6f 20 49 4e 2c 20 31 3a 20 63 6f 6e  t w/o IN, 1: con
23320 73 74 2c 20 32 3a 20 6e 6f 20 49 4e 2c 20 20 32  st, 2: no IN,  2
23330 3a 20 49 4e 20 2a 2f 0a 20 20 57 68 65 72 65 4c  : IN */.  WhereL
23340 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  oop *pNew;.  int
23350 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
23360 0a 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75  ..  pWInfo = pBu
23370 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
23380 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f   pParse = pWInfo
23390 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d  ->pParse;.  db =
233a0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
233b0 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  WC = pBuilder->p
233c0 57 43 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75  WC;.  pNew = pBu
233d0 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70  ilder->pNew;.  p
233e0 53 72 63 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70  Src = &pWInfo->p
233f0 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d  TabList->a[pNew-
23400 3e 69 54 61 62 5d 3b 0a 20 20 70 54 61 62 20 3d  >iTab];.  pTab =
23410 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 61   pSrc->pTab;.  a
23420 73 73 65 72 74 28 20 49 73 56 69 72 74 75 61 6c  ssert( IsVirtual
23430 28 70 54 61 62 29 20 29 3b 0a 20 20 70 49 64 78  (pTab) );.  pIdx
23440 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49  Info = allocateI
23450 6e 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c  ndexInfo(pParse,
23460 20 70 57 43 2c 20 70 53 72 63 2c 20 70 42 75 69   pWC, pSrc, pBui
23470 6c 64 65 72 2d 3e 70 4f 72 64 65 72 42 79 29 3b  lder->pOrderBy);
23480 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d  .  if( pIdxInfo=
23490 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
234a0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 4e 65 77  TE_NOMEM;.  pNew
234b0 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b 0a 20 20  ->prereq = 0;.  
234c0 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
234d0 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  ;.  pNew->wsFlag
234e0 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41  s = WHERE_VIRTUA
234f0 4c 54 41 42 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e  LTABLE;.  pNew->
23500 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 4e  nLTerm = 0;.  pN
23510 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  ew->u.vtab.needF
23520 72 65 65 20 3d 20 30 3b 0a 20 20 70 55 73 61 67  ree = 0;.  pUsag
23530 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43  e = pIdxInfo->aC
23540 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a  onstraintUsage;.
23550 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20    nConstraint = 
23560 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
23570 72 61 69 6e 74 3b 0a 20 20 69 66 28 20 77 68 65  raint;.  if( whe
23580 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c  reLoopResize(db,
23590 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61 69   pNew, nConstrai
235a0 6e 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nt) ){.    sqlit
235b0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 64  e3DbFree(db, pId
235c0 78 49 6e 66 6f 29 3b 0a 20 20 20 20 72 65 74 75  xInfo);.    retu
235d0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
235e0 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 50 68 61  .  }..  for(iPha
235f0 73 65 3d 30 3b 20 69 50 68 61 73 65 3c 3d 33 3b  se=0; iPhase<=3;
23600 20 69 50 68 61 73 65 2b 2b 29 7b 0a 20 20 20 20   iPhase++){.    
23610 69 66 28 20 21 73 65 65 6e 49 6e 20 26 26 20 28  if( !seenIn && (
23620 69 50 68 61 73 65 26 31 29 21 3d 30 20 29 7b 0a  iPhase&1)!=0 ){.
23630 20 20 20 20 20 20 69 50 68 61 73 65 2b 2b 3b 0a        iPhase++;.
23640 20 20 20 20 20 20 69 66 28 20 69 50 68 61 73 65        if( iPhase
23650 3e 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  >3 ) break;.    
23660 7d 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e 56  }.    if( !seenV
23670 61 72 20 26 26 20 69 50 68 61 73 65 3e 31 20 29  ar && iPhase>1 )
23680 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 49 64 78   break;.    pIdx
23690 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20  Cons = *(struct 
236a0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
236b0 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
236c0 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
236d0 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  t;.    for(i=0; 
236e0 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  i<pIdxInfo->nCon
236f0 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49  straint; i++, pI
23700 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20  dxCons++){.     
23710 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69   j = pIdxCons->i
23720 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20  TermOffset;.    
23730 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
23740 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 77 69 74  a[j];.      swit
23750 63 68 28 20 69 50 68 61 73 65 20 29 7b 0a 20 20  ch( iPhase ){.  
23760 20 20 20 20 20 20 63 61 73 65 20 30 3a 20 20 20        case 0:   
23770 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69   /* Constants wi
23780 74 68 6f 75 74 20 49 4e 20 6f 70 65 72 61 74 6f  thout IN operato
23790 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  r */.          p
237a0 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
237b0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
237c0 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
237d0 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30  ator & WO_IN)!=0
237e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
237f0 73 65 65 6e 49 6e 20 3d 20 31 3b 0a 20 20 20 20  seenIn = 1;.    
23800 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23810 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65    if( pTerm->pre
23820 72 65 71 52 69 67 68 74 21 3d 30 20 29 7b 0a 20  reqRight!=0 ){. 
23830 20 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 56             seenV
23840 61 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ar = 1;.        
23850 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65    }else if( (pTe
23860 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
23870 57 4f 5f 49 4e 29 3d 3d 30 20 29 7b 0a 20 20 20  WO_IN)==0 ){.   
23880 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e           pIdxCon
23890 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20  s->usable = 1;. 
238a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
238b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
238c0 20 20 20 20 63 61 73 65 20 31 3a 20 20 20 20 2f      case 1:    /
238d0 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74 68  * Constants with
238e0 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f   IN operators */
238f0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
23900 74 28 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20  t( seenIn );.   
23910 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
23920 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d  >usable = (pTerm
23930 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d 3d 30  ->prereqRight==0
23940 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
23950 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
23960 20 32 3a 20 20 20 20 2f 2a 20 56 61 72 69 61 62   2:    /* Variab
23970 6c 65 73 20 77 69 74 68 6f 75 74 20 49 4e 20 2a  les without IN *
23980 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
23990 72 74 28 20 73 65 65 6e 56 61 72 20 29 3b 0a 20  rt( seenVar );. 
239a0 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e           pIdxCon
239b0 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65  s->usable = (pTe
239c0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
239d0 57 4f 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20 20 20  WO_IN)==0;.     
239e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
239f0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 2f      default:   /
23a00 2a 20 56 61 72 69 61 62 6c 65 73 20 77 69 74 68  * Variables with
23a10 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20   IN */.         
23a20 20 61 73 73 65 72 74 28 20 73 65 65 6e 56 61 72   assert( seenVar
23a30 20 26 26 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20   && seenIn );.  
23a40 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
23a50 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20  ->usable = 1;.  
23a60 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
23a70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
23a80 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20   memset(pUsage, 
23a90 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65  0, sizeof(pUsage
23aa0 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e  [0])*pIdxInfo->n
23ab0 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20  Constraint);.   
23ac0 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e   if( pIdxInfo->n
23ad0 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
23ae0 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70  ) sqlite3_free(p
23af0 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29  IdxInfo->idxStr)
23b00 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
23b10 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  idxStr = 0;.    
23b20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d  pIdxInfo->idxNum
23b30 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e   = 0;.    pIdxIn
23b40 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
23b50 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49  xStr = 0;.    pI
23b60 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43  dxInfo->orderByC
23b70 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20  onsumed = 0;.   
23b80 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
23b90 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54  atedCost = SQLIT
23ba0 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75  E_BIG_DBL / (dou
23bb0 62 6c 65 29 32 3b 0a 20 20 20 20 70 49 64 78 49  ble)2;.    pIdxI
23bc0 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f  nfo->estimatedRo
23bd0 77 73 20 3d 20 32 35 3b 0a 20 20 20 20 72 63 20  ws = 25;.    rc 
23be0 3d 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28  = vtabBestIndex(
23bf0 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 49  pParse, pTab, pI
23c00 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28  dxInfo);.    if(
23c10 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65   rc ) goto where
23c20 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74  LoopAddVtab_exit
23c30 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d  ;.    pIdxCons =
23c40 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
23c50 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
23c60 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
23c70 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20  aConstraint;.   
23c80 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
23c90 6d 45 78 74 72 61 3b 0a 20 20 20 20 6d 78 54 65  mExtra;.    mxTe
23ca0 72 6d 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73  rm = -1;.    ass
23cb0 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f  ert( pNew->nLSlo
23cc0 74 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29  t>=nConstraint )
23cd0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
23ce0 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  <nConstraint; i+
23cf0 2b 29 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b  +) pNew->aLTerm[
23d00 69 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  i] = 0;.    pNew
23d10 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73  ->u.vtab.omitMas
23d20 6b 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  k = 0;.    for(i
23d30 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e  =0; i<nConstrain
23d40 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73  t; i++, pIdxCons
23d50 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ++){.      if( (
23d60 69 54 65 72 6d 20 3d 20 70 55 73 61 67 65 5b 69  iTerm = pUsage[i
23d70 5d 2e 61 72 67 76 49 6e 64 65 78 20 2d 20 31 29  ].argvIndex - 1)
23d80 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a  >=0 ){.        j
23d90 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65   = pIdxCons->iTe
23da0 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  rmOffset;.      
23db0 20 20 69 66 28 20 69 54 65 72 6d 3e 3d 6e 43 6f    if( iTerm>=nCo
23dc0 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 20 20 20  nstraint.       
23dd0 20 20 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20    || j<0.       
23de0 20 20 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65    || j>=pWC->nTe
23df0 72 6d 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  rm.         || p
23e00 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72  New->aLTerm[iTer
23e10 6d 5d 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b  m]!=0.        ){
23e20 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
23e30 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
23e40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
23e50 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
23e60 22 25 73 2e 78 42 65 73 74 49 6e 64 65 78 28 29  "%s.xBestIndex()
23e70 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 20 70   malfunction", p
23e80 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
23e90 20 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72         goto wher
23ea0 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69  eLoopAddVtab_exi
23eb0 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
23ec0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
23ed0 54 65 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e  Term==nConstrain
23ee0 74 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74  t-1 );.        t
23ef0 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 29 3b  estcase( j==0 );
23f00 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
23f10 65 28 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65 72 6d  e( j==pWC->nTerm
23f20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54  -1 );.        pT
23f30 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d  erm = &pWC->a[j]
23f40 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
23f50 70 72 65 72 65 71 20 7c 3d 20 70 54 65 72 6d 2d  prereq |= pTerm-
23f60 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20  >prereqRight;.  
23f70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 54        assert( iT
23f80 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74  erm<pNew->nLSlot
23f90 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   );.        pNew
23fa0 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 20  ->aLTerm[iTerm] 
23fb0 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  = pTerm;.       
23fc0 20 69 66 28 20 69 54 65 72 6d 3e 6d 78 54 65 72   if( iTerm>mxTer
23fd0 6d 20 29 20 6d 78 54 65 72 6d 20 3d 20 69 54 65  m ) mxTerm = iTe
23fe0 72 6d 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  rm;.        test
23ff0 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 31 35 20  case( iTerm==15 
24000 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
24010 61 73 65 28 20 69 54 65 72 6d 3d 3d 31 36 20 29  ase( iTerm==16 )
24020 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 54  ;.        if( iT
24030 65 72 6d 3c 31 36 20 26 26 20 70 55 73 61 67 65  erm<16 && pUsage
24040 5b 69 5d 2e 6f 6d 69 74 20 29 20 70 4e 65 77 2d  [i].omit ) pNew-
24050 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
24060 20 7c 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a 20 20   |= 1<<iTerm;.  
24070 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
24080 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
24090 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  _IN)!=0 ){.     
240a0 20 20 20 20 20 69 66 28 20 70 55 73 61 67 65 5b       if( pUsage[
240b0 69 5d 2e 6f 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  i].omit==0 ){.  
240c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
240d0 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 75  not attempt to u
240e0 73 65 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61  se an IN constra
240f0 69 6e 74 20 69 66 20 74 68 65 20 76 69 72 74 75  int if the virtu
24100 61 6c 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20  al table.       
24110 20 20 20 20 20 2a 2a 20 73 61 79 73 20 74 68 61       ** says tha
24120 74 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  t the equivalent
24130 20 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 63   EQ constraint c
24140 61 6e 6e 6f 74 20 62 65 20 73 61 66 65 6c 79 20  annot be safely 
24150 6f 6d 69 74 74 65 64 2e 0a 20 20 20 20 20 20 20  omitted..       
24160 20 20 20 20 20 2a 2a 20 49 66 20 77 65 20 64 6f       ** If we do
24170 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
24180 73 75 63 68 20 61 20 63 6f 6e 73 74 72 61 69 6e  such a constrain
24190 74 2c 20 73 6f 6d 65 20 72 6f 77 73 20 6d 69 67  t, some rows mig
241a0 68 74 20 62 65 0a 20 20 20 20 20 20 20 20 20 20  ht be.          
241b0 20 20 2a 2a 20 72 65 70 65 61 74 65 64 20 69 6e    ** repeated in
241c0 20 74 68 65 20 6f 75 74 70 75 74 2e 20 2a 2f 0a   the output. */.
241d0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
241e0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
241f0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 76 69           /* A vi
24200 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74  rtual table that
24210 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20   is constrained 
24220 62 79 20 61 6e 20 49 4e 20 63 6c 61 75 73 65 20  by an IN clause 
24230 6d 61 79 20 6e 6f 74 0a 20 20 20 20 20 20 20 20  may not.        
24240 20 20 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68 65    ** consume the
24250 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
24260 20 62 65 63 61 75 73 65 20 28 31 29 20 74 68 65   because (1) the
24270 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 74 65 72   order of IN ter
24280 6d 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ms.          ** 
24290 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
242a0 6c 79 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68  ly related to th
242b0 65 20 6f 72 64 65 72 20 6f 66 20 6f 75 74 70 75  e order of outpu
242c0 74 20 74 65 72 6d 73 20 61 6e 64 0a 20 20 20 20  t terms and.    
242d0 20 20 20 20 20 20 2a 2a 20 28 32 29 20 4d 75 6c        ** (2) Mul
242e0 74 69 70 6c 65 20 6f 75 74 70 75 74 73 20 66 72  tiple outputs fr
242f0 6f 6d 20 61 20 73 69 6e 67 6c 65 20 49 4e 20 76  om a single IN v
24300 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20 6d 65  alue will not me
24310 72 67 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rge.          **
24320 20 74 6f 67 65 74 68 65 72 2e 20 20 2a 2f 0a 20   together.  */. 
24330 20 20 20 20 20 20 20 20 20 70 49 64 78 49 6e 66           pIdxInf
24340 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  o->orderByConsum
24350 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ed = 0;.        
24360 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
24370 20 20 20 20 69 66 28 20 69 3e 3d 6e 43 6f 6e 73      if( i>=nCons
24380 74 72 61 69 6e 74 20 29 7b 0a 20 20 20 20 20 20  traint ){.      
24390 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6d  pNew->nLTerm = m
243a0 78 54 65 72 6d 2b 31 3b 0a 20 20 20 20 20 20 61  xTerm+1;.      a
243b0 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 54  ssert( pNew->nLT
243c0 65 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53 6c 6f  erm<=pNew->nLSlo
243d0 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  t );.      pNew-
243e0 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 20 3d  >u.vtab.idxNum =
243f0 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75   pIdxInfo->idxNu
24400 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  m;.      pNew->u
24410 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
24420 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
24430 6f 46 72 65 65 49 64 78 53 74 72 3b 0a 20 20 20  oFreeIdxStr;.   
24440 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65     pIdxInfo->nee
24450 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20  dToFreeIdxStr = 
24460 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  0;.      pNew->u
24470 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20 70  .vtab.idxStr = p
24480 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 3b  IdxInfo->idxStr;
24490 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76  .      pNew->u.v
244a0 74 61 62 2e 69 73 4f 72 64 65 72 65 64 20 3d 20  tab.isOrdered = 
244b0 28 69 38 29 28 70 49 64 78 49 6e 66 6f 2d 3e 6f  (i8)(pIdxInfo->o
244c0 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3f  rderByConsumed ?
244d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
244e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
244f0 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d         pIdxInfo-
24500 3e 6e 4f 72 64 65 72 42 79 20 3a 20 30 29 3b 0a  >nOrderBy : 0);.
24510 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74        pNew->rSet
24520 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e  up = 0;.      pN
24530 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74  ew->rRun = sqlit
24540 65 33 4c 6f 67 45 73 74 46 72 6f 6d 44 6f 75 62  e3LogEstFromDoub
24550 6c 65 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  le(pIdxInfo->est
24560 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 20  imatedCost);.   
24570 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
24580 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 49  sqlite3LogEst(pI
24590 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
245a0 64 52 6f 77 73 29 3b 0a 20 20 20 20 20 20 77 68  dRows);.      wh
245b0 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
245c0 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
245d0 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 75       if( pNew->u
245e0 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29  .vtab.needFree )
245f0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
24600 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76  3_free(pNew->u.v
24610 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20  tab.idxStr);.   
24620 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61       pNew->u.vta
24630 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
24640 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
24650 7d 20 20 0a 0a 77 68 65 72 65 4c 6f 6f 70 41 64  }  ..whereLoopAd
24660 64 56 74 61 62 5f 65 78 69 74 3a 0a 20 20 69 66  dVtab_exit:.  if
24670 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64  ( pIdxInfo->need
24680 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 20 73  ToFreeIdxStr ) s
24690 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78  qlite3_free(pIdx
246a0 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20  Info->idxStr);. 
246b0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
246c0 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20  b, pIdxInfo);.  
246d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
246e0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
246f0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
24700 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68  */../*.** Add Wh
24710 65 72 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20  ereLoop entries 
24720 74 6f 20 68 61 6e 64 6c 65 20 4f 52 20 74 65 72  to handle OR ter
24730 6d 73 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20  ms.  This works 
24740 66 6f 72 20 65 69 74 68 65 72 0a 2a 2a 20 62 74  for either.** bt
24750 72 65 65 73 20 6f 72 20 76 69 72 74 75 61 6c 20  rees or virtual 
24760 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  tables..*/.stati
24770 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
24780 64 64 4f 72 28 57 68 65 72 65 4c 6f 6f 70 42 75  ddOr(WhereLoopBu
24790 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
247a0 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 29   Bitmask mExtra)
247b0 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
247c0 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
247d0 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72  ->pWInfo;.  Wher
247e0 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20  eClause *pWC;.  
247f0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
24800 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
24810 65 72 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20  erm, *pWCEnd;.  
24820 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
24830 4f 4b 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a  OK;.  int iCur;.
24840 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 74 65    WhereClause te
24850 6d 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  mpWC;.  WhereLoo
24860 70 42 75 69 6c 64 65 72 20 73 53 75 62 42 75 69  pBuilder sSubBui
24870 6c 64 3b 0a 20 20 57 68 65 72 65 4f 72 53 65 74  ld;.  WhereOrSet
24880 20 73 53 75 6d 2c 20 73 43 75 72 3b 0a 20 20 73   sSum, sCur;.  s
24890 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
248a0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20  em *pItem;.  .  
248b0 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pWC = pBuilder->
248c0 70 57 43 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20  pWC;.  pWCEnd = 
248d0 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54  pWC->a + pWC->nT
248e0 65 72 6d 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42  erm;.  pNew = pB
248f0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
24900 6d 65 6d 73 65 74 28 26 73 53 75 6d 2c 20 30 2c  memset(&sSum, 0,
24910 20 73 69 7a 65 6f 66 28 73 53 75 6d 29 29 3b 0a   sizeof(sSum));.
24920 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f    pItem = pWInfo
24930 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20  ->pTabList->a + 
24940 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 69 43  pNew->iTab;.  iC
24950 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72  ur = pItem->iCur
24960 73 6f 72 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72  sor;..  for(pTer
24970 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
24980 70 57 43 45 6e 64 20 26 26 20 72 63 3d 3d 53 51  pWCEnd && rc==SQ
24990 4c 49 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b  LITE_OK; pTerm++
249a0 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  ){.    if( (pTer
249b0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
249c0 4f 5f 4f 52 29 21 3d 30 0a 20 20 20 20 20 26 26  O_OR)!=0.     &&
249d0 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   (pTerm->u.pOrIn
249e0 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20  fo->indexable & 
249f0 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21  pNew->maskSelf)!
24a00 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
24a10 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63   WhereClause * c
24a20 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54  onst pOrWC = &pT
24a30 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e  erm->u.pOrInfo->
24a40 77 63 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54  wc;.      WhereT
24a50 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57  erm * const pOrW
24a60 43 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61  CEnd = &pOrWC->a
24a70 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a  [pOrWC->nTerm];.
24a80 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
24a90 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20  *pOrTerm;.      
24aa0 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20  int once = 1;.  
24ab0 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
24ac0 20 20 0a 20 20 20 20 20 20 73 53 75 62 42 75 69    .      sSubBui
24ad0 6c 64 20 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a  ld = *pBuilder;.
24ae0 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e        sSubBuild.
24af0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
24b00 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f      sSubBuild.pO
24b10 72 53 65 74 20 3d 20 26 73 43 75 72 3b 0a 0a 20  rSet = &sCur;.. 
24b20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
24b30 30 78 32 30 30 2c 20 28 22 42 65 67 69 6e 20 70  0x200, ("Begin p
24b40 72 6f 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61  rocessing OR-cla
24b50 75 73 65 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d  use %p\n", pTerm
24b60 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4f  ));.      for(pO
24b70 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20  rTerm=pOrWC->a; 
24b80 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64  pOrTerm<pOrWCEnd
24b90 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20  ; pOrTerm++){.  
24ba0 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65        if( (pOrTe
24bb0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
24bc0 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20  WO_AND)!=0 ){.  
24bd0 20 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c          sSubBuil
24be0 64 2e 70 57 43 20 3d 20 26 70 4f 72 54 65 72 6d  d.pWC = &pOrTerm
24bf0 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63  ->u.pAndInfo->wc
24c00 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
24c10 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
24c20 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b  tCursor==iCur ){
24c30 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
24c40 43 2e 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e  C.pWInfo = pWC->
24c50 70 57 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  pWInfo;.        
24c60 20 20 74 65 6d 70 57 43 2e 70 4f 75 74 65 72 20    tempWC.pOuter 
24c70 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20  = pWC;.         
24c80 20 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f   tempWC.op = TK_
24c90 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 20 20 74  AND;.          t
24ca0 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b  empWC.nTerm = 1;
24cb0 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
24cc0 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20  C.a = pOrTerm;. 
24cd0 20 20 20 20 20 20 20 20 20 73 53 75 62 42 75 69           sSubBui
24ce0 6c 64 2e 70 57 43 20 3d 20 26 74 65 6d 70 57 43  ld.pWC = &tempWC
24cf0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
24d00 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
24d10 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
24d20 20 20 20 20 20 20 20 73 43 75 72 2e 6e 20 3d 20         sCur.n = 
24d30 30 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  0;.#ifdef WHERET
24d40 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
24d50 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
24d60 30 78 32 30 30 2c 20 28 22 4f 52 2d 74 65 72 6d  0x200, ("OR-term
24d70 20 25 64 20 6f 66 20 25 70 20 68 61 73 20 25 64   %d of %p has %d
24d80 20 73 75 62 74 65 72 6d 73 3a 5c 6e 22 2c 20 0a   subterms:\n", .
24d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24da0 20 20 20 28 69 6e 74 29 28 70 4f 72 54 65 72 6d     (int)(pOrTerm
24db0 2d 70 4f 72 57 43 2d 3e 61 29 2c 20 70 54 65 72  -pOrWC->a), pTer
24dc0 6d 2c 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43  m, sSubBuild.pWC
24dd0 2d 3e 6e 54 65 72 6d 29 29 3b 0a 20 20 20 20 20  ->nTerm));.     
24de0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
24df0 65 72 65 54 72 61 63 65 20 26 20 30 78 34 30 30  ereTrace & 0x400
24e00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   ){.          fo
24e10 72 28 69 3d 30 3b 20 69 3c 73 53 75 62 42 75 69  r(i=0; i<sSubBui
24e20 6c 64 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69  ld.pWC->nTerm; i
24e30 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
24e40 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74 28   whereTermPrint(
24e50 26 73 53 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e  &sSubBuild.pWC->
24e60 61 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20 20 20  a[i], i);.      
24e70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
24e80 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
24e90 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
24ea0 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20  ALTABLE.        
24eb0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 49  if( IsVirtual(pI
24ec0 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20  tem->pTab) ){.  
24ed0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
24ee0 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
24ef0 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78  (&sSubBuild, mEx
24f00 74 72 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  tra);.        }e
24f10 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
24f20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72     {.          r
24f30 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
24f40 42 74 72 65 65 28 26 73 53 75 62 42 75 69 6c 64  Btree(&sSubBuild
24f50 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 20  , mExtra);.     
24f60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
24f70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24f80 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
24f90 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28   whereLoopAddOr(
24fa0 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74  &sSubBuild, mExt
24fb0 72 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ra);.        }. 
24fc0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
24fd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
24fe0 73 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20  sCur.n==0 );.   
24ff0 20 20 20 20 20 69 66 28 20 73 43 75 72 2e 6e 3d       if( sCur.n=
25000 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
25010 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20  sSum.n = 0;.    
25020 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25030 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f       }else if( o
25040 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nce ){.         
25050 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 53   whereOrMove(&sS
25060 75 6d 2c 20 26 73 43 75 72 29 3b 0a 20 20 20 20  um, &sCur);.    
25070 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a        once = 0;.
25080 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
25090 20 20 20 20 20 20 20 20 20 57 68 65 72 65 4f 72           WhereOr
250a0 53 65 74 20 73 50 72 65 76 3b 0a 20 20 20 20 20  Set sPrev;.     
250b0 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65       whereOrMove
250c0 28 26 73 50 72 65 76 2c 20 26 73 53 75 6d 29 3b  (&sPrev, &sSum);
250d0 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e  .          sSum.
250e0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
250f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72 65   for(i=0; i<sPre
25100 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  v.n; i++){.     
25110 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
25120 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a  j<sCur.n; j++){.
25130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
25140 65 72 65 4f 72 49 6e 73 65 72 74 28 26 73 53 75  ereOrInsert(&sSu
25150 6d 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72  m, sPrev.a[i].pr
25160 65 72 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d  ereq | sCur.a[j]
25170 2e 70 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20  .prereq,.       
25180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25190 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45       sqlite3LogE
251a0 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d  stAdd(sPrev.a[i]
251b0 2e 72 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d  .rRun, sCur.a[j]
251c0 2e 72 52 75 6e 29 2c 0a 20 20 20 20 20 20 20 20  .rRun),.        
251d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251e0 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73      sqlite3LogEs
251f0 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e  tAdd(sPrev.a[i].
25200 6e 4f 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e  nOut, sCur.a[j].
25210 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 20 20  nOut));.        
25220 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
25230 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
25240 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e    }.      pNew->
25250 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  nLTerm = 1;.    
25260 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30    pNew->aLTerm[0
25270 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  ] = pTerm;.     
25280 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
25290 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b   WHERE_MULTI_OR;
252a0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65  .      pNew->rSe
252b0 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tup = 0;.      p
252c0 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  New->iSortIdx = 
252d0 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  0;.      memset(
252e0 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a  &pNew->u, 0, siz
252f0 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20  eof(pNew->u));. 
25300 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63       for(i=0; rc
25310 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
25320 3c 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20  <sSum.n; i++){. 
25330 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
25340 3a 20 43 75 72 72 65 6e 74 6c 79 20 73 53 75 6d  : Currently sSum
25350 2e 61 5b 69 5d 2e 72 52 75 6e 20 69 73 20 73 65  .a[i].rRun is se
25360 74 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 20  t to the sum of 
25370 74 68 65 20 63 6f 73 74 73 0a 20 20 20 20 20 20  the costs.      
25380 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 73 75 62 2d    ** of all sub-
25390 73 63 61 6e 73 20 72 65 71 75 69 72 65 64 20 62  scans required b
253a0 79 20 74 68 65 20 4f 52 2d 73 63 61 6e 2e 20 48  y the OR-scan. H
253b0 6f 77 65 76 65 72 2c 20 64 75 65 20 74 6f 20 72  owever, due to r
253c0 6f 75 6e 64 69 6e 67 0a 20 20 20 20 20 20 20 20  ounding.        
253d0 2a 2a 20 65 72 72 6f 72 73 2c 20 69 74 20 6d 61  ** errors, it ma
253e0 79 20 62 65 20 74 68 61 74 20 74 68 65 20 63 6f  y be that the co
253f0 73 74 20 6f 66 20 74 68 65 20 4f 52 2d 73 63 61  st of the OR-sca
25400 6e 20 69 73 20 65 71 75 61 6c 20 74 6f 20 69 74  n is equal to it
25410 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 73  s.        ** mos
25420 74 20 65 78 70 65 6e 73 69 76 65 20 73 75 62 2d  t expensive sub-
25430 73 63 61 6e 2e 20 41 64 64 20 74 68 65 20 73 6d  scan. Add the sm
25440 61 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c 65 20  allest possible 
25450 70 65 6e 61 6c 74 79 20 0a 20 20 20 20 20 20 20  penalty .       
25460 20 2a 2a 20 28 65 71 75 69 76 61 6c 65 6e 74 20   ** (equivalent 
25470 74 6f 20 6d 75 6c 74 69 70 6c 79 69 6e 67 20 74  to multiplying t
25480 68 65 20 63 6f 73 74 20 62 79 20 31 2e 30 37 29  he cost by 1.07)
25490 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
254a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73  .        ** this
254b0 20 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e   does not happen
254c0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72  . Otherwise, for
254d0 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 20 73   WHERE clauses s
254e0 75 63 68 20 61 73 20 74 68 65 0a 20 20 20 20 20  uch as the.     
254f0 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
25500 77 68 65 72 65 20 74 68 65 72 65 20 69 73 20 61  where there is a
25510 6e 20 69 6e 64 65 78 20 6f 6e 20 22 79 22 3a 0a  n index on "y":.
25520 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
25530 20 20 20 2a 2a 20 20 20 20 20 57 48 45 52 45 20     **     WHERE 
25540 6c 69 6b 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c 20  likelihood(x=?, 
25550 30 2e 39 39 29 20 4f 52 20 79 3d 3f 0a 20 20 20  0.99) OR y=?.   
25560 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
25570 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 6d  ** the planner m
25580 61 79 20 65 6c 65 63 74 20 74 6f 20 22 4f 52 22  ay elect to "OR"
25590 20 74 6f 67 65 74 68 65 72 20 61 20 66 75 6c 6c   together a full
255a0 2d 74 61 62 6c 65 20 73 63 61 6e 20 61 6e 64 20  -table scan and 
255b0 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  an.        ** in
255c0 64 65 78 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64 20  dex lookup. And 
255d0 6f 74 68 65 72 20 73 69 6d 69 6c 61 72 6c 79 20  other similarly 
255e0 6f 64 64 20 72 65 73 75 6c 74 73 2e 20 20 2a 2f  odd results.  */
255f0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  .        pNew->r
25600 52 75 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e  Run = sSum.a[i].
25610 72 52 75 6e 20 2b 20 31 3b 0a 20 20 20 20 20 20  rRun + 1;.      
25620 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
25630 53 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20  Sum.a[i].nOut;. 
25640 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65         pNew->pre
25650 72 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e  req = sSum.a[i].
25660 70 72 65 72 65 71 3b 0a 20 20 20 20 20 20 20 20  prereq;.        
25670 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
25680 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
25690 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  New);.      }.  
256a0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
256b0 78 32 30 30 2c 20 28 22 45 6e 64 20 70 72 6f 63  x200, ("End proc
256c0 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65  essing OR-clause
256d0 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b   %p\n", pTerm));
256e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
256f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
25700 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f   Add all WhereLo
25710 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61  op objects for a
25720 6c 6c 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74  ll tables .*/.st
25730 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
25740 6f 70 41 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f  opAddAll(WhereLo
25750 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
25760 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  der){.  WhereInf
25770 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  o *pWInfo = pBui
25780 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
25790 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 3d  Bitmask mExtra =
257a0 20 30 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50   0;.  Bitmask mP
257b0 72 69 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  rior = 0;.  int 
257c0 69 54 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20  iTab;.  SrcList 
257d0 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e  *pTabList = pWIn
257e0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20  fo->pTabList;.  
257f0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
25800 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71  tem *pItem;.  sq
25810 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e  lite3 *db = pWIn
25820 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  fo->pParse->db;.
25830 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 20 3d    int nTabList =
25840 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b   pWInfo->nLevel;
25850 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
25860 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 70 72 69 6f  TE_OK;.  u8 prio
25870 72 4a 6f 69 6e 54 79 70 65 20 3d 20 30 3b 0a 20  rJoinType = 0;. 
25880 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77   WhereLoop *pNew
25890 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65  ;..  /* Loop ove
258a0 72 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20  r the tables in 
258b0 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c  the join, from l
258c0 65 66 74 20 74 6f 20 72 69 67 68 74 20 2a 2f 0a  eft to right */.
258d0 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65    pNew = pBuilde
258e0 72 2d 3e 70 4e 65 77 3b 0a 20 20 77 68 65 72 65  r->pNew;.  where
258f0 4c 6f 6f 70 49 6e 69 74 28 70 4e 65 77 29 3b 0a  LoopInit(pNew);.
25900 20 20 66 6f 72 28 69 54 61 62 3d 30 2c 20 70 49    for(iTab=0, pI
25910 74 65 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  tem=pTabList->a;
25920 20 69 54 61 62 3c 6e 54 61 62 4c 69 73 74 3b 20   iTab<nTabList; 
25930 69 54 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  iTab++, pItem++)
25940 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54 61 62  {.    pNew->iTab
25950 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 4e 65   = iTab;.    pNe
25960 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 73 71  w->maskSelf = sq
25970 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61 73  lite3WhereGetMas
25980 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
25990 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  Set, pItem->iCur
259a0 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28 28  sor);.    if( ((
259b0 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 7c  pItem->jointype|
259c0 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 29 20 26  priorJoinType) &
259d0 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f   (JT_LEFT|JT_CRO
259e0 53 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  SS))!=0 ){.     
259f0 20 6d 45 78 74 72 61 20 3d 20 6d 50 72 69 6f 72   mExtra = mPrior
25a00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6f  ;.    }.    prio
25a10 72 4a 6f 69 6e 54 79 70 65 20 3d 20 70 49 74 65  rJoinType = pIte
25a20 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  m->jointype;.   
25a30 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
25a40 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20  Item->pTab) ){. 
25a50 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
25a60 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 70 42  oopAddVirtual(pB
25a70 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b  uilder, mExtra);
25a80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25a90 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
25aa0 41 64 64 42 74 72 65 65 28 70 42 75 69 6c 64 65  AddBtree(pBuilde
25ab0 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20  r, mExtra);.    
25ac0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
25ad0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
25ae0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
25af0 64 64 4f 72 28 70 42 75 69 6c 64 65 72 2c 20 6d  ddOr(pBuilder, m
25b00 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20  Extra);.    }.  
25b10 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e 65 77    mPrior |= pNew
25b20 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
25b30 69 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e 6d 61  if( rc || db->ma
25b40 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65  llocFailed ) bre
25b50 61 6b 3b 0a 20 20 7d 0a 20 20 77 68 65 72 65 4c  ak;.  }.  whereL
25b60 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 4e 65  oopClear(db, pNe
25b70 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  w);.  return rc;
25b80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e  .}../*.** Examin
25b90 65 20 61 20 57 68 65 72 65 50 61 74 68 20 28 77  e a WherePath (w
25ba0 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e  ith the addition
25bb0 20 6f 66 20 74 68 65 20 65 78 74 72 61 20 57 68   of the extra Wh
25bc0 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20 35  ereLoop of the 5
25bd0 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  th.** parameters
25be0 29 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6f  ) to see if it o
25bf0 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20 74  utputs rows in t
25c00 68 65 20 72 65 71 75 65 73 74 65 64 20 4f 52 44  he requested ORD
25c10 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f  ER BY.** (or GRO
25c20 55 50 20 42 59 29 20 77 69 74 68 6f 75 74 20 72  UP BY) without r
25c30 65 71 75 69 72 69 6e 67 20 61 20 73 65 70 61 72  equiring a separ
25c40 61 74 65 20 73 6f 72 74 20 6f 70 65 72 61 74 69  ate sort operati
25c50 6f 6e 2e 20 20 52 65 74 75 72 6e 20 4e 3a 0a 2a  on.  Return N:.*
25c60 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20 20 20 4e  * .**   N>0:   N
25c70 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
25c80 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
25c90 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20  e satisfied.**  
25ca0 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65 72 6d 73   N==0:  No terms
25cb0 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
25cc0 20 63 6c 61 75 73 65 20 61 72 65 20 73 61 74 69   clause are sati
25cd0 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3c 30 3a 20  sfied.**   N<0: 
25ce0 20 20 55 6e 6b 6e 6f 77 6e 20 79 65 74 20 68 6f    Unknown yet ho
25cf0 77 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f 66 20  w many terms of 
25d00 4f 52 44 45 52 20 42 59 20 6d 69 67 68 74 20 62  ORDER BY might b
25d10 65 20 73 61 74 69 73 66 69 65 64 2e 20 20 20 0a  e satisfied.   .
25d20 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
25d30 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57  processing for W
25d40 48 45 52 45 5f 47 52 4f 55 50 42 59 20 61 6e 64  HERE_GROUPBY and
25d50 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
25d60 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20 73  Y is not as.** s
25d70 74 72 69 63 74 2e 20 20 57 69 74 68 20 47 52 4f  trict.  With GRO
25d80 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  UP BY and DISTIN
25d90 43 54 20 74 68 65 20 6f 6e 6c 79 20 72 65 71 75  CT the only requ
25da0 69 72 65 6d 65 6e 74 20 69 73 20 74 68 61 74 0a  irement is that.
25db0 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f  ** equivalent ro
25dc0 77 73 20 61 70 70 65 61 72 20 69 6d 6d 65 64 69  ws appear immedi
25dd0 61 74 65 6c 79 20 61 64 6a 61 63 65 6e 74 20 74  ately adjacent t
25de0 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20 20  o one another.  
25df0 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64 20  GROUP BY.** and 
25e00 44 49 53 54 49 4e 43 54 20 64 6f 20 6e 6f 74 20  DISTINCT do not 
25e10 72 65 71 75 69 72 65 20 72 6f 77 73 20 74 6f 20  require rows to 
25e20 61 70 70 65 61 72 20 69 6e 20 61 6e 79 20 70 61  appear in any pa
25e30 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72 20 61  rticular order a
25e40 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71 75  s long.** as equ
25e50 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 72 65  ivalent rows are
25e60 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65   grouped togethe
25e70 72 2e 20 20 54 68 75 73 20 66 6f 72 20 47 52 4f  r.  Thus for GRO
25e80 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  UP BY and DISTIN
25e90 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65 72  CT.** the pOrder
25ea0 42 79 20 74 65 72 6d 73 20 63 61 6e 20 62 65 20  By terms can be 
25eb0 6d 61 74 63 68 65 64 20 69 6e 20 61 6e 79 20 6f  matched in any o
25ec0 72 64 65 72 2e 20 20 57 69 74 68 20 4f 52 44 45  rder.  With ORDE
25ed0 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70 4f  R BY, the .** pO
25ee0 72 64 65 72 42 79 20 74 65 72 6d 73 20 6d 75 73  rderBy terms mus
25ef0 74 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20  t be matched in 
25f00 73 74 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d 72  strict left-to-r
25f10 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ight order..*/.s
25f20 74 61 74 69 63 20 69 38 20 77 68 65 72 65 50 61  tatic i8 wherePa
25f30 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
25f40 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  By(.  WhereInfo 
25f50 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54  *pWInfo,    /* T
25f60 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
25f70 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
25f80 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52  OrderBy,   /* OR
25f90 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
25fa0 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54 20 63  BY or DISTINCT c
25fb0 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b 20 2a  lause to check *
25fc0 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70  /.  WherePath *p
25fd0 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54 68 65  Path,     /* The
25fe0 20 57 68 65 72 65 50 61 74 68 20 74 6f 20 63 68   WherePath to ch
25ff0 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  eck */.  u16 wct
26000 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f  rlFlags,       /
26010 2a 20 4d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  * Might contain 
26020 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 6f 72  WHERE_GROUPBY or
26030 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
26040 59 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70  Y */.  u16 nLoop
26050 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
26060 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
26070 73 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f  s in pPath->aLoo
26080 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  p[] */.  WhereLo
26090 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f  op *pLast,     /
260a0 2a 20 41 64 64 20 74 68 69 73 20 57 68 65 72 65  * Add this Where
260b0 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Loop to the end 
260c0 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b  of pPath->aLoop[
260d0 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a  ] */.  Bitmask *
260e0 70 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20  pRevMask     /* 
260f0 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65  OUT: Mask of Whe
26100 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69  reLoops to run i
26110 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
26120 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53 65  */.){.  u8 revSe
26130 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
26140 20 54 72 75 65 20 69 66 20 72 65 76 20 69 73 20   True if rev is 
26150 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65  known */.  u8 re
26160 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
26170 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f   /* Composite so
26180 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38  rt order */.  u8
26190 20 72 65 76 49 64 78 3b 20 20 20 20 20 20 20 20   revIdx;        
261a0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72      /* Index sor
261b0 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20  t order */.  u8 
261c0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3b  isOrderDistinct;
261d0 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20     /* All prior 
261e0 57 68 65 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f  WhereLoops are o
261f0 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f  rder-distinct */
26200 0a 20 20 75 38 20 64 69 73 74 69 6e 63 74 43 6f  .  u8 distinctCo
26210 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65  lumns;   /* True
26220 20 69 66 20 74 68 65 20 6c 6f 6f 70 20 68 61 73   if the loop has
26230 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c   UNIQUE NOT NULL
26240 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38   columns */.  u8
26250 20 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20 20   isMatch;       
26260 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d      /* iColumn m
26270 61 74 63 68 65 73 20 61 20 74 65 72 6d 20 6f 66  atches a term of
26280 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
26290 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 6e 4b  ause */.  u16 nK
262a0 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  eyCol;          
262b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79  /* Number of key
262c0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e 64   columns in pInd
262d0 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f 6c  ex */.  u16 nCol
262e0 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  umn;          /*
262f0 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
26300 20 6f 72 64 65 72 65 64 20 63 6f 6c 75 6d 6e 73   ordered columns
26310 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   in the index */
26320 0a 20 20 75 31 36 20 6e 4f 72 64 65 72 42 79 3b  .  u16 nOrderBy;
26330 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
26340 65 72 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  er terms in the 
26350 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
26360 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20  */.  int iLoop; 
26370 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
26380 64 65 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  dex of WhereLoop
26390 20 69 6e 20 70 50 61 74 68 20 62 65 69 6e 67 20   in pPath being 
263a0 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 69  processed */.  i
263b0 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
263c0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
263d0 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  nters */.  int i
263e0 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cur;            
263f0 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
26400 72 20 66 6f 72 20 63 75 72 72 65 6e 74 20 57 68  r for current Wh
26410 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  ereLoop */.  int
26420 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   iColumn;       
26430 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e     /* A column n
26440 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 61 62  umber within tab
26450 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20 57 68 65  le iCur */.  Whe
26460 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20  reLoop *pLoop = 
26470 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 57 68  0; /* Current Wh
26480 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70 72  ereLoop being pr
26490 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57 68  ocessed. */.  Wh
264a0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
264b0 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
264c0 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
264d0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
264e0 70 72 20 2a 70 4f 42 45 78 70 72 3b 20 20 20 20  pr *pOBExpr;    
264f0 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73      /* An expres
26500 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52  sion from the OR
26510 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
26520 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
26530 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c  l;       /* COLL
26540 41 54 45 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f  ATE function fro
26550 6d 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  m an ORDER BY cl
26560 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49  ause term */.  I
26570 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
26580 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
26590 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
265a0 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c  h pLoop */.  sql
265b0 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66  ite3 *db = pWInf
265c0 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20 20  o->pParse->db;  
265d0 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
265e0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d  ection */.  Bitm
265f0 61 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20 20  ask obSat = 0;  
26600 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44    /* Mask of ORD
26610 45 52 20 42 59 20 74 65 72 6d 73 20 73 61 74 69  ER BY terms sati
26620 73 66 69 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a  sfied so far */.
26630 20 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65    Bitmask obDone
26640 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20  ;       /* Mask 
26650 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20  of all ORDER BY 
26660 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61  terms */.  Bitma
26670 73 6b 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74  sk orderDistinct
26680 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f  Mask;  /* Mask o
26690 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72  f all well-order
266a0 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42 69  ed loops */.  Bi
266b0 74 6d 61 73 6b 20 72 65 61 64 79 3b 20 20 20 20  tmask ready;    
266c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
266d0 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73  k of inner loops
266e0 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57   */..  /*.  ** W
266f0 65 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c  e say the WhereL
26700 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22  oop is "one-row"
26710 20 69 66 20 69 74 20 67 65 6e 65 72 61 74 65 73   if it generates
26720 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
26730 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75  e.  ** row of ou
26740 74 70 75 74 2e 20 20 41 20 57 68 65 72 65 4c 6f  tput.  A WhereLo
26750 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66  op is one-row if
26760 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
26770 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
26780 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e    **  (a) All in
26790 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63  dex columns matc
267a0 68 20 77 69 74 68 20 57 48 45 52 45 5f 43 4f 4c  h with WHERE_COL
267b0 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62  UMN_EQ..  **  (b
267c0 29 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 75  ) The index is u
267d0 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57  nique.  ** Any W
267e0 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e  hereLoop with an
267f0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
26800 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74   constraint on t
26810 68 65 20 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d  he rowid is one-
26820 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20  row..  ** Every 
26830 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f  one-row WhereLoo
26840 70 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65 20  p will have the 
26850 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74  WHERE_ONEROW bit
26860 20 73 65 74 20 69 6e 20 77 73 46 6c 61 67 73 2e   set in wsFlags.
26870 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61  .  **.  ** We sa
26880 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  y the WhereLoop 
26890 69 73 20 22 6f 72 64 65 72 2d 64 69 73 74 69 6e  is "order-distin
268a0 63 74 22 20 69 66 20 74 68 65 20 73 65 74 20 6f  ct" if the set o
268b0 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20  f columns from. 
268c0 20 2a 2a 20 74 68 61 74 20 57 68 65 72 65 4c 6f   ** that WhereLo
268d0 6f 70 20 74 68 61 74 20 61 72 65 20 69 6e 20 74  op that are in t
268e0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
268f0 73 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  se are different
26900 20 66 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a 20   for every.  ** 
26910 72 6f 77 20 6f 66 20 74 68 65 20 57 68 65 72 65  row of the Where
26920 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e 65  Loop.  Every one
26930 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 69  -row WhereLoop i
26940 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a  s automatically.
26950 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74 69    ** order-disti
26960 6e 63 74 2e 20 20 20 41 20 57 68 65 72 65 4c 6f  nct.   A WhereLo
26970 6f 70 20 74 68 61 74 20 68 61 73 20 6e 6f 20 63  op that has no c
26980 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52  olumns in the OR
26990 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20  DER BY clause.  
269a0 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d  ** is not order-
269b0 64 69 73 74 69 6e 63 74 2e 20 54 6f 20 62 65 20  distinct. To be 
269c0 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 69  order-distinct i
269d0 73 20 6e 6f 74 20 71 75 69 74 65 20 74 68 65 20  s not quite the 
269e0 73 61 6d 65 20 61 73 20 62 65 69 6e 67 0a 20 20  same as being.  
269f0 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e 63 65 20  ** UNIQUE since 
26a00 61 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20  a UNIQUE column 
26a10 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 68 61 76  or index can hav
26a20 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20  e multiple rows 
26a30 74 68 61 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e  that .  ** are N
26a40 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c  ULL and NULL val
26a50 75 65 73 20 61 72 65 20 65 71 75 69 76 61 6c 65  ues are equivale
26a60 6e 74 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f  nt for the purpo
26a70 73 65 20 6f 66 20 6f 72 64 65 72 2d 64 69 73 74  se of order-dist
26a80 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65  inct..  ** To be
26a90 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2c   order-distinct,
26aa0 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73   the columns mus
26ab0 74 20 62 65 20 55 4e 49 51 55 45 20 61 6e 64 20  t be UNIQUE and 
26ac0 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20  NOT NULL..  **. 
26ad0 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f   ** The rowid fo
26ae0 72 20 61 20 74 61 62 6c 65 20 69 73 20 61 6c 77  r a table is alw
26af0 61 79 73 20 55 4e 49 51 55 45 20 61 6e 64 20 4e  ays UNIQUE and N
26b00 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65  OT NULL so whene
26b10 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77  ver the.  ** row
26b20 69 64 20 61 70 70 65 61 72 73 20 69 6e 20 74 68  id appears in th
26b30 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
26b40 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  e, the correspon
26b50 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69  ding WhereLoop i
26b60 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63  s.  ** automatic
26b70 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73 74 69  ally order-disti
26b80 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73  nct..  */..  ass
26b90 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30  ert( pOrderBy!=0
26ba0 20 29 3b 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20   );.  if( nLoop 
26bb0 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  && OptimizationD
26bc0 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  isabled(db, SQLI
26bd0 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f 69  TE_OrderByIdxJoi
26be0 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  n) ) return 0;..
26bf0 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72    nOrderBy = pOr
26c00 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
26c10 74 65 73 74 63 61 73 65 28 20 6e 4f 72 64 65 72  testcase( nOrder
26c20 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69  By==BMS-1 );.  i
26c30 66 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53 2d  f( nOrderBy>BMS-
26c40 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  1 ) return 0;  /
26c50 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a  * Cannot optimiz
26c60 65 20 6f 76 65 72 6c 79 20 6c 61 72 67 65 20 4f  e overly large O
26c70 52 44 45 52 20 42 59 73 20 2a 2f 0a 20 20 69 73  RDER BYs */.  is
26c80 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
26c90 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41  1;.  obDone = MA
26ca0 53 4b 42 49 54 28 6e 4f 72 64 65 72 42 79 29 2d  SKBIT(nOrderBy)-
26cb0 31 3b 0a 20 20 6f 72 64 65 72 44 69 73 74 69 6e  1;.  orderDistin
26cc0 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72 65  ctMask = 0;.  re
26cd0 61 64 79 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  ady = 0;.  for(i
26ce0 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72 44  Loop=0; isOrderD
26cf0 69 73 74 69 6e 63 74 20 26 26 20 6f 62 53 61 74  istinct && obSat
26d00 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70  <obDone && iLoop
26d10 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  <=nLoop; iLoop++
26d20 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70  ){.    if( iLoop
26d30 3e 30 20 29 20 72 65 61 64 79 20 7c 3d 20 70 4c  >0 ) ready |= pL
26d40 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
26d50 20 20 20 70 4c 6f 6f 70 20 3d 20 69 4c 6f 6f 70     pLoop = iLoop
26d60 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61 74 68 2d 3e  <nLoop ? pPath->
26d70 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3a 20 70  aLoop[iLoop] : p
26d80 4c 61 73 74 3b 0a 20 20 20 20 69 66 28 20 70 4c  Last;.    if( pL
26d90 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
26da0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
26db0 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E ){.      if( p
26dc0 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 73 4f  Loop->u.vtab.isO
26dd0 72 64 65 72 65 64 20 29 20 6f 62 53 61 74 20 3d  rdered ) obSat =
26de0 20 6f 62 44 6f 6e 65 3b 0a 20 20 20 20 20 20 62   obDone;.      b
26df0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
26e00 69 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  iCur = pWInfo->p
26e10 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70  TabList->a[pLoop
26e20 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f 72 3b  ->iTab].iCursor;
26e30 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66  ..    /* Mark of
26e40 66 20 61 6e 79 20 4f 52 44 45 52 20 42 59 20 74  f any ORDER BY t
26e50 65 72 6d 20 58 20 74 68 61 74 20 69 73 20 61 20  erm X that is a 
26e60 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61  column in the ta
26e70 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  ble of.    ** th
26e80 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20 66  e current loop f
26e90 6f 72 20 77 68 69 63 68 20 74 68 65 72 65 20 69  or which there i
26ea0 73 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  s term in the WH
26eb0 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73  ERE.    ** claus
26ec0 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20  e of the form X 
26ed0 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20 74  IS NULL or X=? t
26ee0 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  hat reference on
26ef0 6c 79 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20  ly outer.    ** 
26f00 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  loops..    */.  
26f10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
26f20 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
26f30 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69     if( MASKBIT(i
26f40 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
26f50 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f 42 45  inue;.      pOBE
26f60 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
26f70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72  rSkipCollate(pOr
26f80 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
26f90 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  r);.      if( pO
26fa0 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  BExpr->op!=TK_CO
26fb0 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  LUMN ) continue;
26fc0 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78  .      if( pOBEx
26fd0 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72  pr->iTable!=iCur
26fe0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
26ff0 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74     pTerm = sqlit
27000 65 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28  e3WhereFindTerm(
27010 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 69 43  &pWInfo->sWC, iC
27020 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f  ur, pOBExpr->iCo
27030 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  lumn,.          
27040 20 20 20 20 20 20 20 20 20 20 20 20 20 7e 72 65               ~re
27050 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53  ady, WO_EQ|WO_IS
27060 4e 55 4c 4c 7c 57 4f 5f 49 53 2c 20 30 29 3b 0a  NULL|WO_IS, 0);.
27070 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
27080 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
27090 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
270a0 3e 65 4f 70 65 72 61 74 6f 72 26 28 57 4f 5f 45  >eOperator&(WO_E
270b0 51 7c 57 4f 5f 49 53 29 29 21 3d 30 20 26 26 20  Q|WO_IS))!=0 && 
270c0 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  pOBExpr->iColumn
270d0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >=0 ){.        c
270e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c 20 2a  onst char *z1, *
270f0 7a 32 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  z2;.        pCol
27100 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
27110 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70  ollSeq(pWInfo->p
27120 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d  Parse, pOrderBy-
27130 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
27140 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
27150 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
27160 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
27170 20 20 7a 31 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e    z1 = pColl->zN
27180 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  ame;.        pCo
27190 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
271a0 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e  CollSeq(pWInfo->
271b0 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70  pParse, pTerm->p
271c0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
271d0 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
271e0 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
271f0 6c 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20  l;.        z2 = 
27200 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pColl->zName;.  
27210 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
27220 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29  3StrICmp(z1, z2)
27230 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
27240 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
27250 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  ( pTerm->pExpr->
27260 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
27270 20 20 20 7d 0a 20 20 20 20 20 20 6f 62 53 61 74     }.      obSat
27280 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a   |= MASKBIT(i);.
27290 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28      }..    if( (
272a0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
272b0 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d   WHERE_ONEROW)==
272c0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
272d0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
272e0 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20 20  WHERE_IPK ){.   
272f0 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b       pIndex = 0;
27300 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c  .        nKeyCol
27310 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 43   = 0;.        nC
27320 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 20  olumn = 1;.     
27330 20 7d 65 6c 73 65 20 69 66 28 20 28 70 49 6e 64   }else if( (pInd
27340 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ex = pLoop->u.bt
27350 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20 7c  ree.pIndex)==0 |
27360 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64  | pIndex->bUnord
27370 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  ered ){.        
27380 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
27390 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
273a0 4b 65 79 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d  KeyCol = pIndex-
273b0 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20  >nKeyCol;.      
273c0 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64    nColumn = pInd
273d0 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ex->nColumn;.   
273e0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
273f0 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b 31 20  lumn==nKeyCol+1 
27400 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e  || !HasRowid(pIn
27410 64 65 78 2d 3e 70 54 61 62 6c 65 29 20 29 3b 0a  dex->pTable) );.
27420 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
27430 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
27440 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d 28 2d 31  [nColumn-1]==(-1
27450 29 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70  ) || !HasRowid(p
27460 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 29 3b  Index->pTable));
27470 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72  .        isOrder
27480 44 69 73 74 69 6e 63 74 20 3d 20 49 73 55 6e 69  Distinct = IsUni
27490 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29  queIndex(pIndex)
274a0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
274b0 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
274c0 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   all columns of 
274d0 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 64 65  the index and de
274e0 61 6c 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73  al with the ones
274f0 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61  .      ** that a
27500 72 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e  re not constrain
27510 65 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a  ed by == or IN..
27520 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
27530 65 76 20 3d 20 72 65 76 53 65 74 20 3d 20 30 3b  ev = revSet = 0;
27540 0a 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 43  .      distinctC
27550 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20  olumns = 0;.    
27560 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f    for(j=0; j<nCo
27570 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  lumn; j++){.    
27580 20 20 20 20 75 38 20 62 4f 6e 63 65 3b 20 20 20      u8 bOnce;   
27590 2f 2a 20 54 72 75 65 20 74 6f 20 72 75 6e 20 74  /* True to run t
275a0 68 65 20 4f 52 44 45 52 20 42 59 20 73 65 61 72  he ORDER BY sear
275b0 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20  ch loop */..    
275c0 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72      /* Skip over
275d0 20 3d 3d 20 61 6e 64 20 49 53 20 4e 55 4c 4c 20   == and IS NULL 
275e0 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 20  terms */.       
275f0 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e   if( j<pLoop->u.
27600 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20  btree.nEq.      
27610 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 6e 53 6b     && pLoop->nSk
27620 69 70 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  ip==0.         &
27630 26 20 28 28 69 20 3d 20 70 4c 6f 6f 70 2d 3e 61  & ((i = pLoop->a
27640 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72 61  LTerm[j]->eOpera
27650 74 6f 72 29 20 26 20 28 57 4f 5f 45 51 7c 57 4f  tor) & (WO_EQ|WO
27660 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29 29 21  _ISNULL|WO_IS))!
27670 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  =0.        ){.  
27680 20 20 20 20 20 20 20 20 69 66 28 20 69 20 26 20          if( i & 
27690 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  WO_ISNULL ){.   
276a0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
276b0 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  e( isOrderDistin
276c0 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ct );.          
276d0 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
276e0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
276f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e   }.          con
27700 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 20  tinue;  .       
27710 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47   }..        /* G
27720 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75  et the column nu
27730 6d 62 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c  mber in the tabl
27740 65 20 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20  e (iColumn) and 
27750 73 6f 72 74 20 6f 72 64 65 72 0a 20 20 20 20 20  sort order.     
27760 20 20 20 2a 2a 20 28 72 65 76 49 64 78 29 20 66     ** (revIdx) f
27770 6f 72 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75  or the j-th colu
27780 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  mn of the index.
27790 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
277a0 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 29      if( pIndex )
277b0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c  {.          iCol
277c0 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69  umn = pIndex->ai
277d0 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20  Column[j];.     
277e0 20 20 20 20 20 72 65 76 49 64 78 20 3d 20 70 49       revIdx = pI
277f0 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
27800 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [j];.          i
27810 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64  f( iColumn==pInd
27820 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65  ex->pTable->iPKe
27830 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31  y ) iColumn = -1
27840 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
27850 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75  .          iColu
27860 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  mn = -1;.       
27870 20 20 20 72 65 76 49 64 78 20 3d 20 30 3b 0a 20     revIdx = 0;. 
27880 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
27890 20 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73 74 72    /* An unconstr
278a0 61 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 74 68 61  ained column tha
278b0 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  t might be NULL 
278c0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 0a  means that this.
278d0 20 20 20 20 20 20 20 20 2a 2a 20 57 68 65 72 65          ** Where
278e0 4c 6f 6f 70 20 69 73 20 6e 6f 74 20 77 65 6c 6c  Loop is not well
278f0 2d 6f 72 64 65 72 65 64 0a 20 20 20 20 20 20 20  -ordered.       
27900 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
27910 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 0a  isOrderDistinct.
27920 20 20 20 20 20 20 20 20 20 26 26 20 69 43 6f 6c           && iCol
27930 75 6d 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20 20  umn>=0.         
27940 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62  && j>=pLoop->u.b
27950 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20  tree.nEq.       
27960 20 20 26 26 20 70 49 6e 64 65 78 2d 3e 70 54 61    && pIndex->pTa
27970 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d  ble->aCol[iColum
27980 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20  n].notNull==0.  
27990 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
279a0 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
279b0 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ct = 0;.        
279c0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69  }..        /* Fi
279d0 6e 64 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  nd the ORDER BY 
279e0 74 65 72 6d 20 74 68 61 74 20 63 6f 72 72 65 73  term that corres
279f0 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d 74  ponds to the j-t
27a00 68 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20  h column.       
27a10 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78   ** of the index
27a20 20 61 6e 64 20 6d 61 72 6b 20 74 68 61 74 20 4f   and mark that O
27a30 52 44 45 52 20 42 59 20 74 65 72 6d 20 6f 66 66  RDER BY term off
27a40 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20   .        */.   
27a50 20 20 20 20 20 62 4f 6e 63 65 20 3d 20 31 3b 0a       bOnce = 1;.
27a60 20 20 20 20 20 20 20 20 69 73 4d 61 74 63 68 20          isMatch 
27a70 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  = 0;.        for
27a80 28 69 3d 30 3b 20 62 4f 6e 63 65 20 26 26 20 69  (i=0; bOnce && i
27a90 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
27aa0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4d  .          if( M
27ab0 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61  ASKBIT(i) & obSa
27ac0 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
27ad0 20 20 20 20 20 20 20 20 70 4f 42 45 78 70 72 20          pOBExpr 
27ae0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
27af0 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42  pCollate(pOrderB
27b00 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
27b10 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
27b20 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  se( wctrlFlags &
27b30 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29   WHERE_GROUPBY )
27b40 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
27b50 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73  case( wctrlFlags
27b60 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   & WHERE_DISTINC
27b70 54 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20  TBY );.         
27b80 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73   if( (wctrlFlags
27b90 20 26 20 28 57 48 45 52 45 5f 47 52 4f 55 50 42   & (WHERE_GROUPB
27ba0 59 7c 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  Y|WHERE_DISTINCT
27bb0 42 59 29 29 3d 3d 30 20 29 20 62 4f 6e 63 65 20  BY))==0 ) bOnce 
27bc0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
27bd0 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d  f( pOBExpr->op!=
27be0 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74  TK_COLUMN ) cont
27bf0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
27c00 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61  if( pOBExpr->iTa
27c10 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74  ble!=iCur ) cont
27c20 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
27c30 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f  if( pOBExpr->iCo
27c40 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 20  lumn!=iColumn ) 
27c50 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
27c60 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e      if( iColumn>
27c70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
27c80 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
27c90 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49  3ExprCollSeq(pWI
27ca0 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72  nfo->pParse, pOr
27cb0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
27cc0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
27cd0 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
27ce0 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
27cf0 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll;.            
27d00 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
27d10 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c  mp(pColl->zName,
27d20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
27d30 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  j])!=0 ) continu
27d40 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
27d50 20 20 20 20 20 20 20 20 20 69 73 4d 61 74 63 68           isMatch
27d60 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
27d70 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
27d80 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4d  .        if( isM
27d90 61 74 63 68 20 26 26 20 28 77 63 74 72 6c 46 6c  atch && (wctrlFl
27da0 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55  ags & WHERE_GROU
27db0 50 42 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  PBY)==0 ){.     
27dc0 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
27dd0 65 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72  e the sort order
27de0 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 69   is compatible i
27df0 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  n an ORDER BY cl
27e00 61 75 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20  ause..          
27e10 2a 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 69 73  ** Sort order is
27e20 20 69 72 72 65 6c 65 76 61 6e 74 20 66 6f 72 20   irrelevant for 
27e30 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
27e40 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
27e50 69 66 28 20 72 65 76 53 65 74 20 29 7b 0a 20 20  if( revSet ){.  
27e60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 72            if( (r
27e70 65 76 20 5e 20 72 65 76 49 64 78 29 21 3d 70 4f  ev ^ revIdx)!=pO
27e80 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
27e90 74 4f 72 64 65 72 20 29 20 69 73 4d 61 74 63 68  tOrder ) isMatch
27ea0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
27eb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
27ec0 20 20 20 72 65 76 20 3d 20 72 65 76 49 64 78 20     rev = revIdx 
27ed0 5e 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  ^ pOrderBy->a[i]
27ee0 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  .sortOrder;.    
27ef0 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76 20          if( rev 
27f00 29 20 2a 70 52 65 76 4d 61 73 6b 20 7c 3d 20 4d  ) *pRevMask |= M
27f10 41 53 4b 42 49 54 28 69 4c 6f 6f 70 29 3b 0a 20  ASKBIT(iLoop);. 
27f20 20 20 20 20 20 20 20 20 20 20 20 72 65 76 53 65             revSe
27f30 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  t = 1;.         
27f40 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
27f50 20 20 20 20 20 69 66 28 20 69 73 4d 61 74 63 68       if( isMatch
27f60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
27f70 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ( iColumn<0 ){. 
27f80 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
27f90 61 73 65 28 20 64 69 73 74 69 6e 63 74 43 6f 6c  ase( distinctCol
27fa0 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20  umns==0 );.     
27fb0 20 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 43         distinctC
27fc0 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 20 20  olumns = 1;.    
27fd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27fe0 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42    obSat |= MASKB
27ff0 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  IT(i);.        }
28000 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
28010 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 66 6f 75 6e  /* No match foun
28020 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  d */.          i
28030 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b 65  f( j==0 || j<nKe
28040 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  yCol ){.        
28050 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73      testcase( is
28060 4f 72 64 65 72 44 69 73 74 69 6e 63 74 21 3d 30  OrderDistinct!=0
28070 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
28080 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
28090 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
280a0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
280b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
280c0 20 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20    } /* end Loop 
280d0 6f 76 65 72 20 61 6c 6c 20 69 6e 64 65 78 20 63  over all index c
280e0 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20  olumns */.      
280f0 69 66 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75  if( distinctColu
28100 6d 6e 73 20 29 7b 0a 20 20 20 20 20 20 20 20 74  mns ){.        t
28110 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72  estcase( isOrder
28120 44 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20  Distinct==0 );. 
28130 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
28140 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 20 20  stinct = 1;.    
28150 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64    }.    } /* end
28160 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20  -if not one-row 
28170 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20  */..    /* Mark 
28180 6f 66 66 20 61 6e 79 20 6f 74 68 65 72 20 4f 52  off any other OR
28190 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 68 61  DER BY terms tha
281a0 74 20 72 65 66 65 72 65 6e 63 65 20 70 4c 6f 6f  t reference pLoo
281b0 70 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f  p */.    if( isO
281c0 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a  rderDistinct ){.
281d0 20 20 20 20 20 20 6f 72 64 65 72 44 69 73 74 69        orderDisti
281e0 6e 63 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70  nctMask |= pLoop
281f0 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
28200 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
28210 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
28220 20 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20       Expr *p;.  
28230 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 54        Bitmask mT
28240 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  erm;.        if(
28250 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62   MASKBIT(i) & ob
28260 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Sat ) continue;.
28270 20 20 20 20 20 20 20 20 70 20 3d 20 70 4f 72 64          p = pOrd
28280 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
28290 3b 0a 20 20 20 20 20 20 20 20 6d 54 65 72 6d 20  ;.        mTerm 
282a0 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
282b0 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
282c0 65 74 2c 70 29 3b 0a 20 20 20 20 20 20 20 20 69  et,p);.        i
282d0 66 28 20 6d 54 65 72 6d 3d 3d 30 20 26 26 20 21  f( mTerm==0 && !
282e0 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
282f0 73 74 61 6e 74 28 70 29 20 29 20 63 6f 6e 74 69  stant(p) ) conti
28300 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
28310 20 28 6d 54 65 72 6d 26 7e 6f 72 64 65 72 44 69   (mTerm&~orderDi
28320 73 74 69 6e 63 74 4d 61 73 6b 29 3d 3d 30 20 29  stinctMask)==0 )
28330 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53 61  {.          obSa
28340 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b  t |= MASKBIT(i);
28350 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28360 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20   }.    }.  } /* 
28370 45 6e 64 20 74 68 65 20 6c 6f 6f 70 20 6f 76 65  End the loop ove
28380 72 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 73  r all WhereLoops
28390 20 66 72 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73 74   from outer-most
283a0 20 64 6f 77 6e 20 74 6f 20 69 6e 6e 65 72 2d 6d   down to inner-m
283b0 6f 73 74 20 2a 2f 0a 20 20 69 66 28 20 6f 62 53  ost */.  if( obS
283c0 61 74 3d 3d 6f 62 44 6f 6e 65 20 29 20 72 65 74  at==obDone ) ret
283d0 75 72 6e 20 28 69 38 29 6e 4f 72 64 65 72 42 79  urn (i8)nOrderBy
283e0 3b 0a 20 20 69 66 28 20 21 69 73 4f 72 64 65 72  ;.  if( !isOrder
283f0 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
28400 66 6f 72 28 69 3d 6e 4f 72 64 65 72 42 79 2d 31  for(i=nOrderBy-1
28410 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20  ; i>0; i--){.   
28420 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 4d     Bitmask m = M
28430 41 53 4b 42 49 54 28 69 29 20 2d 20 31 3b 0a 20  ASKBIT(i) - 1;. 
28440 20 20 20 20 20 69 66 28 20 28 6f 62 53 61 74 26       if( (obSat&
28450 6d 29 3d 3d 6d 20 29 20 72 65 74 75 72 6e 20 69  m)==m ) return i
28460 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
28470 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
28480 72 6e 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn -1;.}.../*.**
28490 20 49 66 20 74 68 65 20 57 48 45 52 45 5f 47 52   If the WHERE_GR
284a0 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20 73 65  OUPBY flag is se
284b0 74 20 69 6e 20 74 68 65 20 6d 61 73 6b 20 70 61  t in the mask pa
284c0 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57  ssed to sqlite3W
284d0 68 65 72 65 42 65 67 69 6e 28 29 2c 0a 2a 2a 20  hereBegin(),.** 
284e0 74 68 65 20 70 6c 61 6e 6e 65 72 20 61 73 73 75  the planner assu
284f0 6d 65 73 20 74 68 61 74 20 74 68 65 20 73 70 65  mes that the spe
28500 63 69 66 69 65 64 20 70 4f 72 64 65 72 42 79 20  cified pOrderBy 
28510 6c 69 73 74 20 69 73 20 61 63 74 75 61 6c 6c 79  list is actually
28520 20 61 20 47 52 4f 55 50 0a 2a 2a 20 42 59 20 63   a GROUP.** BY c
28530 6c 61 75 73 65 20 2d 20 61 6e 64 20 73 6f 20 61  lause - and so a
28540 6e 79 20 6f 72 64 65 72 20 74 68 61 74 20 67 72  ny order that gr
28550 6f 75 70 73 20 72 6f 77 73 20 61 73 20 72 65 71  oups rows as req
28560 75 69 72 65 64 20 73 61 74 69 73 66 69 65 73 20  uired satisfies 
28570 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2e 0a  the.** request..
28580 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
28590 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20  in this case it 
285a0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
285b0 66 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20 74  for the caller t
285c0 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 77  o determine.** w
285d0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
285e0 65 20 72 6f 77 73 20 61 72 65 20 72 65 61 6c 6c  e rows are reall
285f0 79 20 62 65 69 6e 67 20 64 65 6c 69 76 65 72 65  y being delivere
28600 64 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  d in sorted orde
28610 72 2c 20 6f 72 0a 2a 2a 20 6a 75 73 74 20 69 6e  r, or.** just in
28620 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 72 64 65   some other orde
28630 72 20 74 68 61 74 20 70 72 6f 76 69 64 65 73 20  r that provides 
28640 74 68 65 20 72 65 71 75 69 72 65 64 20 67 72 6f  the required gro
28650 75 70 69 6e 67 2e 20 48 6f 77 65 76 65 72 2c 0a  uping. However,.
28660 2a 2a 20 69 66 20 74 68 65 20 57 48 45 52 45 5f  ** if the WHERE_
28670 53 4f 52 54 42 59 47 52 4f 55 50 20 66 6c 61 67  SORTBYGROUP flag
28680 20 69 73 20 61 6c 73 6f 20 70 61 73 73 65 64 20   is also passed 
28690 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
286a0 65 67 69 6e 28 29 2c 20 74 68 65 6e 0a 2a 2a 20  egin(), then.** 
286b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  this function ma
286c0 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 74  y be called on t
286d0 68 65 20 72 65 74 75 72 6e 65 64 20 57 68 65 72  he returned Wher
286e0 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 49 74  eInfo object. It
286f0 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 72 75 65   returns.** true
28700 20 69 66 20 74 68 65 20 72 6f 77 73 20 72 65 61   if the rows rea
28710 6c 6c 79 20 77 69 6c 6c 20 62 65 20 73 6f 72 74  lly will be sort
28720 65 64 20 69 6e 20 74 68 65 20 73 70 65 63 69 66  ed in the specif
28730 69 65 64 20 6f 72 64 65 72 2c 20 6f 72 20 66 61  ied order, or fa
28740 6c 73 65 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  lse.** otherwise
28750 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
28760 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 3a 0a 2a  ple, assuming:.*
28770 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e  *.**   CREATE IN
28780 44 45 58 20 69 31 20 4f 4e 20 74 31 28 78 2c 20  DEX i1 ON t1(x, 
28790 59 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 0a 2a  Y);.**.** then.*
287a0 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20  *.**   SELECT * 
287b0 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42 59  FROM t1 GROUP BY
287c0 20 78 2c 79 20 4f 52 44 45 52 20 42 59 20 78 2c   x,y ORDER BY x,
287d0 79 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74 65 64  y;   -- IsSorted
287e0 28 29 3d 3d 31 0a 2a 2a 20 20 20 53 45 4c 45 43  ()==1.**   SELEC
287f0 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f 55  T * FROM t1 GROU
28800 50 20 42 59 20 79 2c 78 20 4f 52 44 45 52 20 42  P BY y,x ORDER B
28810 59 20 79 2c 78 3b 20 20 20 2d 2d 20 49 73 53 6f  Y y,x;   -- IsSo
28820 72 74 65 64 28 29 3d 3d 30 0a 2a 2f 0a 69 6e 74  rted()==0.*/.int
28830 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 53   sqlite3WhereIsS
28840 6f 72 74 65 64 28 57 68 65 72 65 49 6e 66 6f 20  orted(WhereInfo 
28850 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73 73 65  *pWInfo){.  asse
28860 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  rt( pWInfo->wctr
28870 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47  lFlags & WHERE_G
28880 52 4f 55 50 42 59 20 29 3b 0a 20 20 61 73 73 65  ROUPBY );.  asse
28890 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  rt( pWInfo->wctr
288a0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53  lFlags & WHERE_S
288b0 4f 52 54 42 59 47 52 4f 55 50 20 29 3b 0a 20 20  ORTBYGROUP );.  
288c0 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 73  return pWInfo->s
288d0 6f 72 74 65 64 3b 0a 7d 0a 0a 23 69 66 64 65 66  orted;.}..#ifdef
288e0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
288f0 4c 45 44 0a 2f 2a 20 46 6f 72 20 64 65 62 75 67  LED./* For debug
28900 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 3a 20 2a  ging use only: *
28910 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
28920 68 61 72 20 2a 77 68 65 72 65 50 61 74 68 4e 61  har *wherePathNa
28930 6d 65 28 57 68 65 72 65 50 61 74 68 20 2a 70 50  me(WherePath *pP
28940 61 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20  ath, int nLoop, 
28950 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74  WhereLoop *pLast
28960 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72  ){.  static char
28970 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e   zName[65];.  in
28980 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
28990 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a  i<nLoop; i++){ z
289a0 4e 61 6d 65 5b 69 5d 20 3d 20 70 50 61 74 68 2d  Name[i] = pPath-
289b0 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20  >aLoop[i]->cId; 
289c0 7d 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29 20  }.  if( pLast ) 
289d0 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61  zName[i++] = pLa
289e0 73 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d 65  st->cId;.  zName
289f0 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  [i] = 0;.  retur
28a00 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69  n zName;.}.#endi
28a10 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
28a20 74 68 65 20 63 6f 73 74 20 6f 66 20 73 6f 72 74  the cost of sort
28a30 69 6e 67 20 6e 52 6f 77 20 72 6f 77 73 2c 20 61  ing nRow rows, a
28a40 73 73 75 6d 69 6e 67 20 74 68 61 74 20 74 68 65  ssuming that the
28a50 20 6b 65 79 73 20 68 61 76 65 20 0a 2a 2a 20 6e   keys have .** n
28a60 4f 72 64 65 72 62 79 20 63 6f 6c 75 6d 6e 73 20  Orderby columns 
28a70 61 6e 64 20 74 68 61 74 20 74 68 65 20 66 69 72  and that the fir
28a80 73 74 20 6e 53 6f 72 74 65 64 20 63 6f 6c 75 6d  st nSorted colum
28a90 6e 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 69  ns are already i
28aa0 6e 0a 2a 2a 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  n.** order..*/.s
28ab0 74 61 74 69 63 20 4c 6f 67 45 73 74 20 77 68 65  tatic LogEst whe
28ac0 72 65 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20  reSortingCost(. 
28ad0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
28ae0 66 6f 2c 0a 20 20 4c 6f 67 45 73 74 20 6e 52 6f  fo,.  LogEst nRo
28af0 77 2c 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  w,.  int nOrderB
28b00 79 2c 0a 20 20 69 6e 74 20 6e 53 6f 72 74 65 64  y,.  int nSorted
28b10 0a 29 7b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  .){.  /* TUNING:
28b20 20 45 73 74 69 6d 61 74 65 64 20 63 6f 73 74 20   Estimated cost 
28b30 6f 66 20 61 20 66 75 6c 6c 20 65 78 74 65 72 6e  of a full extern
28b40 61 6c 20 73 6f 72 74 2c 20 77 68 65 72 65 20 4e  al sort, where N
28b50 20 69 73 20 0a 20 20 2a 2a 20 74 68 65 20 6e 75   is .  ** the nu
28b60 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 6f 20  mber of rows to 
28b70 73 6f 72 74 20 69 73 3a 0a 20 20 2a 2a 0a 20 20  sort is:.  **.  
28b80 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28 33 2e 30  **   cost = (3.0
28b90 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 2e 0a   * N * log(N))..
28ba0 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f 72 2c 20 69    ** .  ** Or, i
28bb0 66 20 74 68 65 20 6f 72 64 65 72 2d 62 79 20 63  f the order-by c
28bc0 6c 61 75 73 65 20 68 61 73 20 58 20 74 65 72 6d  lause has X term
28bd0 73 20 62 75 74 20 6f 6e 6c 79 20 74 68 65 20 6c  s but only the l
28be0 61 73 74 20 59 20 0a 20 20 2a 2a 20 74 65 72 6d  ast Y .  ** term
28bf0 73 20 61 72 65 20 6f 75 74 20 6f 66 20 6f 72 64  s are out of ord
28c00 65 72 2c 20 74 68 65 6e 20 62 6c 6f 63 6b 2d 73  er, then block-s
28c10 6f 72 74 69 6e 67 20 77 69 6c 6c 20 72 65 64 75  orting will redu
28c20 63 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 6f 72  ce the .  ** sor
28c30 74 69 6e 67 20 63 6f 73 74 20 74 6f 3a 0a 20 20  ting cost to:.  
28c40 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d  **.  **   cost =
28c50 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28   (3.0 * N * log(
28c60 4e 29 29 20 2a 20 28 59 2f 58 29 0a 20 20 2a 2a  N)) * (Y/X).  **
28c70 0a 20 20 2a 2a 20 54 68 65 20 28 59 2f 58 29 20  .  ** The (Y/X) 
28c80 74 65 72 6d 20 69 73 20 69 6d 70 6c 65 6d 65 6e  term is implemen
28c90 74 65 64 20 75 73 69 6e 67 20 73 74 61 63 6b 20  ted using stack 
28ca0 76 61 72 69 61 62 6c 65 20 72 53 63 61 6c 65 0a  variable rScale.
28cb0 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a    ** below.  */.
28cc0 20 20 4c 6f 67 45 73 74 20 72 53 63 61 6c 65 2c    LogEst rScale,
28cd0 20 72 53 6f 72 74 43 6f 73 74 3b 0a 20 20 61 73   rSortCost;.  as
28ce0 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 30  sert( nOrderBy>0
28cf0 20 26 26 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c   && 66==sqlite3L
28d00 6f 67 45 73 74 28 31 30 30 29 20 29 3b 0a 20 20  ogEst(100) );.  
28d10 72 53 63 61 6c 65 20 3d 20 73 71 6c 69 74 65 33  rScale = sqlite3
28d20 4c 6f 67 45 73 74 28 28 6e 4f 72 64 65 72 42 79  LogEst((nOrderBy
28d30 2d 6e 53 6f 72 74 65 64 29 2a 31 30 30 2f 6e 4f  -nSorted)*100/nO
28d40 72 64 65 72 42 79 29 20 2d 20 36 36 3b 0a 20 20  rderBy) - 66;.  
28d50 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52 6f 77  rSortCost = nRow
28d60 20 2b 20 65 73 74 4c 6f 67 28 6e 52 6f 77 29 20   + estLog(nRow) 
28d70 2b 20 72 53 63 61 6c 65 20 2b 20 31 36 3b 0a 0a  + rScale + 16;..
28d80 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 54 68 65    /* TUNING: The
28d90 20 63 6f 73 74 20 6f 66 20 69 6d 70 6c 65 6d 65   cost of impleme
28da0 6e 74 69 6e 67 20 44 49 53 54 49 4e 43 54 20 75  nting DISTINCT u
28db0 73 69 6e 67 20 61 20 42 2d 54 52 45 45 20 69 73  sing a B-TREE is
28dc0 0a 20 20 2a 2a 20 73 69 6d 69 6c 61 72 20 62 75  .  ** similar bu
28dd0 74 20 77 69 74 68 20 61 20 6c 61 72 67 65 72 20  t with a larger 
28de0 63 6f 6e 73 74 61 6e 74 20 6f 66 20 70 72 6f 70  constant of prop
28df0 6f 72 74 69 6f 6e 61 6c 69 74 79 2e 20 0a 20 20  ortionality. .  
28e00 2a 2a 20 4d 75 6c 74 69 70 6c 79 20 62 79 20 61  ** Multiply by a
28e10 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 66 61 63  n additional fac
28e20 74 6f 72 20 6f 66 20 33 2e 30 2e 20 20 2a 2f 0a  tor of 3.0.  */.
28e30 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63    if( pWInfo->wc
28e40 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
28e50 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29  _WANT_DISTINCT )
28e60 7b 0a 20 20 20 20 72 53 6f 72 74 43 6f 73 74 20  {.    rSortCost 
28e70 2b 3d 20 31 36 3b 0a 20 20 7d 0a 0a 20 20 72 65  += 16;.  }..  re
28e80 74 75 72 6e 20 72 53 6f 72 74 43 6f 73 74 3b 0a  turn rSortCost;.
28e90 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
28ea0 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65  he list of Where
28eb0 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 61 74 20  Loop objects at 
28ec0 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20  pWInfo->pLoops, 
28ed0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
28ee0 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64  attempts to find
28ef0 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
28f00 20 70 61 74 68 20 74 68 61 74 20 76 69 73 69 74   path that visit
28f10 73 20 65 61 63 68 20 57 68 65 72 65 4c 6f 6f 70  s each WhereLoop
28f20 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54 68 69 73 20  .** once.  This 
28f30 70 61 74 68 20 69 73 20 74 68 65 6e 20 6c 6f 61  path is then loa
28f40 64 65 64 20 69 6e 74 6f 20 74 68 65 20 70 57 49  ded into the pWI
28f50 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20  nfo->a[].pWLoop 
28f60 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73  fields..**.** As
28f70 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 74 6f  sume that the to
28f80 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  tal number of ou
28f90 74 70 75 74 20 72 6f 77 73 20 74 68 61 74 20 77  tput rows that w
28fa0 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73  ill need to be s
28fb0 6f 72 74 65 64 0a 2a 2a 20 77 69 6c 6c 20 62 65  orted.** will be
28fc0 20 6e 52 6f 77 45 73 74 20 28 69 6e 20 74 68 65   nRowEst (in the
28fd0 20 31 30 2a 6c 6f 67 32 20 72 65 70 72 65 73 65   10*log2 represe
28fe0 6e 74 61 74 69 6f 6e 29 2e 20 20 4f 72 2c 20 69  ntation).  Or, i
28ff0 67 6e 6f 72 65 20 73 6f 72 74 69 6e 67 0a 2a 2a  gnore sorting.**
29000 20 63 6f 73 74 73 20 69 66 20 6e 52 6f 77 45 73   costs if nRowEs
29010 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  t==0..**.** Retu
29020 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
29030 73 75 63 63 65 73 73 20 6f 72 20 53 51 4c 49 54  success or SQLIT
29040 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d 65 6d  E_NOMEM of a mem
29050 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ory allocation.*
29060 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  * error occurs..
29070 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
29080 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 57 68  erePathSolver(Wh
29090 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
290a0 20 4c 6f 67 45 73 74 20 6e 52 6f 77 45 73 74 29   LogEst nRowEst)
290b0 7b 0a 20 20 69 6e 74 20 6d 78 43 68 6f 69 63 65  {.  int mxChoice
290c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
290d0 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Maximum number 
290e0 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20  of simultaneous 
290f0 70 61 74 68 73 20 74 72 61 63 6b 65 64 20 2a 2f  paths tracked */
29100 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20  .  int nLoop;   
29110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29120 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
29130 69 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20  in the join */. 
29140 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
29150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
29160 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
29170 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
29180 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29190 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
291a0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
291b0 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20   iLoop;         
291c0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
291d0 6f 75 6e 74 65 72 20 6f 76 65 72 20 74 68 65 20  ounter over the 
291e0 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6a 6f 69  terms of the joi
291f0 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 2c 20 6a  n */.  int ii, j
29200 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
29210 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
29220 73 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 49 20 3d  s */.  int mxI =
29230 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
29240 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78   /* Index of nex
29250 74 20 65 6e 74 72 79 20 74 6f 20 72 65 70 6c 61  t entry to repla
29260 63 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64  ce */.  int nOrd
29270 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 20 20  erBy;           
29280 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f    /* Number of O
29290 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
292a0 65 72 6d 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  erms */.  LogEst
292b0 20 6d 78 43 6f 73 74 20 3d 20 30 3b 20 20 20 20   mxCost = 0;    
292c0 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63      /* Maximum c
292d0 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20  ost of a set of 
292e0 70 61 74 68 73 20 2a 2f 0a 20 20 4c 6f 67 45 73  paths */.  LogEs
292f0 74 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 30  t mxUnsorted = 0
29300 3b 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20  ;    /* Maximum 
29310 75 6e 73 6f 72 74 65 64 20 63 6f 73 74 20 6f 66  unsorted cost of
29320 20 61 20 73 65 74 20 6f 66 20 70 61 74 68 20 2a   a set of path *
29330 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72  /.  int nTo, nFr
29340 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  om;           /*
29350 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64   Number of valid
29360 20 65 6e 74 72 69 65 73 20 69 6e 20 61 54 6f 5b   entries in aTo[
29370 5d 20 61 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f  ] and aFrom[] */
29380 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 61 46  .  WherePath *aF
29390 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rom;         /* 
293a0 41 6c 6c 20 6e 46 72 6f 6d 20 70 61 74 68 73 20  All nFrom paths 
293b0 61 74 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  at the previous 
293c0 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65  level */.  Where
293d0 50 61 74 68 20 2a 61 54 6f 3b 20 20 20 20 20 20  Path *aTo;      
293e0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20       /* The nTo 
293f0 62 65 73 74 20 70 61 74 68 73 20 61 74 20 74 68  best paths at th
29400 65 20 63 75 72 72 65 6e 74 20 6c 65 76 65 6c 20  e current level 
29410 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a  */.  WherePath *
29420 70 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f  pFrom;         /
29430 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20  * An element of 
29440 61 46 72 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20  aFrom[] that we 
29450 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a  are working on *
29460 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70  /.  WherePath *p
29470 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  To;           /*
29480 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61   An element of a
29490 54 6f 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65  To[] that we are
294a0 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20   working on */. 
294b0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f   WhereLoop *pWLo
294c0 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  op;        /* On
294d0 65 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f  e of the WhereLo
294e0 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  op objects */.  
294f0 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20  WhereLoop **pX; 
29500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
29510 64 20 74 6f 20 64 69 76 79 20 75 70 20 74 68 65  d to divy up the
29520 20 70 53 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a   pSpace memory *
29530 2f 0a 20 20 4c 6f 67 45 73 74 20 2a 61 53 6f 72  /.  LogEst *aSor
29540 74 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a  tCost = 0;    /*
29550 20 53 6f 72 74 69 6e 67 20 61 6e 64 20 70 61 72   Sorting and par
29560 74 69 61 6c 20 73 6f 72 74 69 6e 67 20 63 6f 73  tial sorting cos
29570 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53  ts */.  char *pS
29580 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
29590 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d    /* Temporary m
295a0 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68  emory used by th
295b0 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  is routine */.  
295c0 69 6e 74 20 6e 53 70 61 63 65 3b 20 20 20 20 20  int nSpace;     
295d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
295e0 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f  es of space allo
295f0 63 61 74 65 64 20 61 74 20 70 53 70 61 63 65 20  cated at pSpace 
29600 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70  */..  pParse = p
29610 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
29620 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
29630 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e  ;.  nLoop = pWIn
29640 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a  fo->nLevel;.  /*
29650 20 54 55 4e 49 4e 47 3a 20 46 6f 72 20 73 69 6d   TUNING: For sim
29660 70 6c 65 20 71 75 65 72 69 65 73 2c 20 6f 6e 6c  ple queries, onl
29670 79 20 74 68 65 20 62 65 73 74 20 70 61 74 68 20  y the best path 
29680 69 73 20 74 72 61 63 6b 65 64 2e 0a 20 20 2a 2a  is tracked..  **
29690 20 46 6f 72 20 32 2d 77 61 79 20 6a 6f 69 6e 73   For 2-way joins
296a0 2c 20 74 68 65 20 35 20 62 65 73 74 20 70 61 74  , the 5 best pat
296b0 68 73 20 61 72 65 20 66 6f 6c 6c 6f 77 65 64 2e  hs are followed.
296c0 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73 20  .  ** For joins 
296d0 6f 66 20 33 20 6f 72 20 6d 6f 72 65 20 74 61 62  of 3 or more tab
296e0 6c 65 73 2c 20 74 72 61 63 6b 20 74 68 65 20 31  les, track the 1
296f0 30 20 62 65 73 74 20 70 61 74 68 73 20 2a 2f 0a  0 best paths */.
29700 20 20 6d 78 43 68 6f 69 63 65 20 3d 20 28 6e 4c    mxChoice = (nL
29710 6f 6f 70 3c 3d 31 29 20 3f 20 31 20 3a 20 28 6e  oop<=1) ? 1 : (n
29720 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20 3a 20 31 30  Loop==2 ? 5 : 10
29730 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4c 6f  );.  assert( nLo
29740 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62  op<=pWInfo->pTab
29750 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  List->nSrc );.  
29760 57 48 45 52 45 54 52 41 43 45 28 30 78 30 30 32  WHERETRACE(0x002
29770 2c 20 28 22 2d 2d 2d 2d 20 62 65 67 69 6e 20 73  , ("---- begin s
29780 6f 6c 76 65 72 2e 20 20 28 6e 52 6f 77 45 73 74  olver.  (nRowEst
29790 3d 25 64 29 5c 6e 22 2c 20 6e 52 6f 77 45 73 74  =%d)\n", nRowEst
297a0 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 52 6f  ));..  /* If nRo
297b0 77 45 73 74 20 69 73 20 7a 65 72 6f 20 61 6e 64  wEst is zero and
297c0 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
297d0 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 69 67  ER BY clause, ig
297e0 6e 6f 72 65 20 69 74 2e 20 49 6e 20 74 68 69 73  nore it. In this
297f0 0a 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 70  .  ** case the p
29800 75 72 70 6f 73 65 20 6f 66 20 74 68 69 73 20 63  urpose of this c
29810 61 6c 6c 20 69 73 20 74 6f 20 65 73 74 69 6d 61  all is to estima
29820 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
29830 20 72 6f 77 73 20 72 65 74 75 72 6e 65 64 0a 20   rows returned. 
29840 20 2a 2a 20 62 79 20 74 68 65 20 6f 76 65 72 61   ** by the overa
29850 6c 6c 20 71 75 65 72 79 2e 20 4f 6e 63 65 20 74  ll query. Once t
29860 68 69 73 20 65 73 74 69 6d 61 74 65 20 68 61 73  his estimate has
29870 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20   been obtained, 
29880 74 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20  the caller.  ** 
29890 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 69 73  will invoke this
298a0 20 66 75 6e 63 74 69 6f 6e 20 61 20 73 65 63 6f   function a seco
298b0 6e 64 20 74 69 6d 65 2c 20 70 61 73 73 69 6e 67  nd time, passing
298c0 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 61 73   the estimate as
298d0 20 74 68 65 0a 20 20 2a 2a 20 6e 52 6f 77 45 73   the.  ** nRowEs
298e0 74 20 70 61 72 61 6d 65 74 65 72 2e 20 20 2a 2f  t parameter.  */
298f0 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70  .  if( pWInfo->p
29900 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e 52  OrderBy==0 || nR
29910 6f 77 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  owEst==0 ){.    
29920 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  nOrderBy = 0;.  
29930 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 72 64 65  }else{.    nOrde
29940 72 42 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f  rBy = pWInfo->pO
29950 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
29960 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
29970 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
29980 20 73 70 61 63 65 20 66 6f 72 20 61 54 6f 2c 20   space for aTo, 
29990 61 46 72 6f 6d 20 61 6e 64 20 61 53 6f 72 74 43  aFrom and aSortC
299a0 6f 73 74 5b 5d 20 2a 2f 0a 20 20 6e 53 70 61 63  ost[] */.  nSpac
299b0 65 20 3d 20 28 73 69 7a 65 6f 66 28 57 68 65 72  e = (sizeof(Wher
299c0 65 50 61 74 68 29 2b 73 69 7a 65 6f 66 28 57 68  ePath)+sizeof(Wh
299d0 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29  ereLoop*)*nLoop)
299e0 2a 6d 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20 6e  *mxChoice*2;.  n
299f0 53 70 61 63 65 20 2b 3d 20 73 69 7a 65 6f 66 28  Space += sizeof(
29a00 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72 64 65 72  LogEst) * nOrder
29a10 42 79 3b 0a 20 20 70 53 70 61 63 65 20 3d 20 73  By;.  pSpace = s
29a20 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
29a30 77 28 64 62 2c 20 6e 53 70 61 63 65 29 3b 0a 20  w(db, nSpace);. 
29a40 20 69 66 28 20 70 53 70 61 63 65 3d 3d 30 20 29   if( pSpace==0 )
29a50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
29a60 4f 4d 45 4d 3b 0a 20 20 61 54 6f 20 3d 20 28 57  OMEM;.  aTo = (W
29a70 68 65 72 65 50 61 74 68 2a 29 70 53 70 61 63 65  herePath*)pSpace
29a80 3b 0a 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f 2b  ;.  aFrom = aTo+
29a90 6d 78 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d 73  mxChoice;.  mems
29aa0 65 74 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69 7a  et(aFrom, 0, siz
29ab0 65 6f 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a  eof(aFrom[0]));.
29ac0 20 20 70 58 20 3d 20 28 57 68 65 72 65 4c 6f 6f    pX = (WhereLoo
29ad0 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68 6f  p**)(aFrom+mxCho
29ae0 69 63 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 6d  ice);.  for(ii=m
29af0 78 43 68 6f 69 63 65 2a 32 2c 20 70 46 72 6f 6d  xChoice*2, pFrom
29b00 3d 61 54 6f 3b 20 69 69 3e 30 3b 20 69 69 2d 2d  =aTo; ii>0; ii--
29b10 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d  , pFrom++, pX +=
29b20 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46 72   nLoop){.    pFr
29b30 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a  om->aLoop = pX;.
29b40 20 20 7d 0a 20 20 69 66 28 20 6e 4f 72 64 65 72    }.  if( nOrder
29b50 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  By ){.    /* If 
29b60 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
29b70 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20  R BY clause and 
29b80 69 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20  it is not being 
29b90 69 67 6e 6f 72 65 64 2c 20 73 65 74 20 75 70 0a  ignored, set up.
29ba0 20 20 20 20 2a 2a 20 73 70 61 63 65 20 66 6f 72      ** space for
29bb0 20 74 68 65 20 61 53 6f 72 74 43 6f 73 74 5b 5d   the aSortCost[]
29bc0 20 61 72 72 61 79 2e 20 45 61 63 68 20 65 6c 65   array. Each ele
29bd0 6d 65 6e 74 20 6f 66 20 74 68 65 20 61 53 6f 72  ment of the aSor
29be0 74 43 6f 73 74 20 61 72 72 61 79 0a 20 20 20 20  tCost array.    
29bf0 2a 2a 20 69 73 20 65 69 74 68 65 72 20 7a 65 72  ** is either zer
29c00 6f 20 2d 20 6d 65 61 6e 69 6e 67 20 69 74 20 68  o - meaning it h
29c10 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
29c20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2d 20 6f 72  initialized - or
29c30 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 73 74   the.    ** cost
29c40 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77   of sorting nRow
29c50 45 73 74 20 72 6f 77 73 20 6f 66 20 64 61 74 61  Est rows of data
29c60 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74   where the first
29c70 20 58 20 74 65 72 6d 73 20 6f 66 0a 20 20 20 20   X terms of.    
29c80 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ** the ORDER BY 
29c90 63 6c 61 75 73 65 20 61 72 65 20 61 6c 72 65 61  clause are alrea
29ca0 64 79 20 69 6e 20 6f 72 64 65 72 2c 20 77 68 65  dy in order, whe
29cb0 72 65 20 58 20 69 73 20 74 68 65 20 61 72 72 61  re X is the arra
29cc0 79 20 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 2e  y .    ** index.
29cd0 20 20 2a 2f 0a 20 20 20 20 61 53 6f 72 74 43 6f    */.    aSortCo
29ce0 73 74 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70 58  st = (LogEst*)pX
29cf0 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 61 53 6f  ;.    memset(aSo
29d00 72 74 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f  rtCost, 0, sizeo
29d10 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72 64  f(LogEst) * nOrd
29d20 65 72 42 79 29 3b 0a 20 20 7d 0a 20 20 61 73 73  erBy);.  }.  ass
29d30 65 72 74 28 20 61 53 6f 72 74 43 6f 73 74 3d 3d  ert( aSortCost==
29d40 30 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70  0 || &pSpace[nSp
29d50 61 63 65 5d 3d 3d 28 63 68 61 72 2a 29 26 61 53  ace]==(char*)&aS
29d60 6f 72 74 43 6f 73 74 5b 6e 4f 72 64 65 72 42 79  ortCost[nOrderBy
29d70 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  ] );.  assert( a
29d80 53 6f 72 74 43 6f 73 74 21 3d 30 20 7c 7c 20 26  SortCost!=0 || &
29d90 70 53 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d 3d  pSpace[nSpace]==
29da0 28 63 68 61 72 2a 29 70 58 20 29 3b 0a 0a 20 20  (char*)pX );..  
29db0 2f 2a 20 53 65 65 64 20 74 68 65 20 73 65 61 72  /* Seed the sear
29dc0 63 68 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65  ch with a single
29dd0 20 57 68 65 72 65 50 61 74 68 20 63 6f 6e 74 61   WherePath conta
29de0 69 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65 72 65  ining zero Where
29df0 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Loops..  **.  **
29e00 20 54 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74 20   TUNING: Do not 
29e10 6c 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  let the number o
29e20 66 20 69 74 65 72 61 74 69 6f 6e 73 20 67 6f 20  f iterations go 
29e30 61 62 6f 76 65 20 32 38 2e 20 20 49 66 20 74 68  above 28.  If th
29e40 65 20 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20 63  e cost.  ** of c
29e50 6f 6d 70 75 74 69 6e 67 20 61 6e 20 61 75 74 6f  omputing an auto
29e60 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 20 6e  matic index is n
29e70 6f 74 20 70 61 69 64 20 62 61 63 6b 20 77 69 74  ot paid back wit
29e80 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 32 38  hin the first 28
29e90 0a 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e  .  ** rows, then
29ea0 20 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20   do not use the 
29eb0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e  automatic index.
29ec0 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e   */.  aFrom[0].n
29ed0 52 6f 77 20 3d 20 4d 49 4e 28 70 50 61 72 73 65  Row = MIN(pParse
29ee0 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34 38  ->nQueryLoop, 48
29ef0 29 3b 20 20 61 73 73 65 72 74 28 20 34 38 3d 3d  );  assert( 48==
29f00 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 38  sqlite3LogEst(28
29f10 29 20 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20 31  ) );.  nFrom = 1
29f20 3b 0a 20 20 61 73 73 65 72 74 28 20 61 46 72 6f  ;.  assert( aFro
29f30 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 3d 3d  m[0].isOrdered==
29f40 30 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65  0 );.  if( nOrde
29f50 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  rBy ){.    /* If
29f60 20 6e 4c 6f 6f 70 20 69 73 20 7a 65 72 6f 2c 20   nLoop is zero, 
29f70 74 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e  then there are n
29f80 6f 20 46 52 4f 4d 20 74 65 72 6d 73 20 69 6e 20  o FROM terms in 
29f90 74 68 65 20 71 75 65 72 79 2e 20 53 69 6e 63 65  the query. Since
29fa0 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 69 73 20  .    ** in this 
29fb0 63 61 73 65 20 74 68 65 20 71 75 65 72 79 20 6d  case the query m
29fc0 61 79 20 72 65 74 75 72 6e 20 61 20 6d 61 78 69  ay return a maxi
29fd0 6d 75 6d 20 6f 66 20 6f 6e 65 20 72 6f 77 2c 20  mum of one row, 
29fe0 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20  the results.    
29ff0 2a 2a 20 61 72 65 20 61 6c 72 65 61 64 79 20 69  ** are already i
2a000 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
2a010 6f 72 64 65 72 2e 20 53 65 74 20 69 73 4f 72 64  order. Set isOrd
2a020 65 72 65 64 20 74 6f 20 6e 4f 72 64 65 72 42 79  ered to nOrderBy
2a030 20 74 6f 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63   to.    ** indic
2a040 61 74 65 20 74 68 69 73 2e 20 4f 72 2c 20 69 66  ate this. Or, if
2a050 20 6e 4c 6f 6f 70 20 69 73 20 67 72 65 61 74 65   nLoop is greate
2a060 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 73 65 74  r than zero, set
2a070 20 69 73 4f 72 64 65 72 65 64 20 74 6f 0a 20 20   isOrdered to.  
2a080 20 20 2a 2a 20 2d 31 2c 20 69 6e 64 69 63 61 74    ** -1, indicat
2a090 69 6e 67 20 74 68 61 74 20 74 68 65 20 72 65 73  ing that the res
2a0a0 75 6c 74 20 73 65 74 20 6d 61 79 20 6f 72 20 6d  ult set may or m
2a0b0 61 79 20 6e 6f 74 20 62 65 20 6f 72 64 65 72 65  ay not be ordere
2a0c0 64 2c 20 0a 20 20 20 20 2a 2a 20 64 65 70 65 6e  d, .    ** depen
2a0d0 64 69 6e 67 20 6f 6e 20 74 68 65 20 6c 6f 6f 70  ding on the loop
2a0e0 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63  s added to the c
2a0f0 75 72 72 65 6e 74 20 70 6c 61 6e 2e 20 20 2a 2f  urrent plan.  */
2a100 0a 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69 73  .    aFrom[0].is
2a110 4f 72 64 65 72 65 64 20 3d 20 6e 4c 6f 6f 70 3e  Ordered = nLoop>
2a120 30 20 3f 20 2d 31 20 3a 20 6e 4f 72 64 65 72 42  0 ? -1 : nOrderB
2a130 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d  y;.  }..  /* Com
2a140 70 75 74 65 20 73 75 63 63 65 73 73 69 76 65 6c  pute successivel
2a150 79 20 6c 6f 6e 67 65 72 20 57 68 65 72 65 50 61  y longer WherePa
2a160 74 68 73 20 75 73 69 6e 67 20 74 68 65 20 70 72  ths using the pr
2a170 65 76 69 6f 75 73 20 67 65 6e 65 72 61 74 69 6f  evious generatio
2a180 6e 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72 65 50  n.  ** of WhereP
2a190 61 74 68 73 20 61 73 20 74 68 65 20 62 61 73 69  aths as the basi
2a1a0 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 2e 20  s for the next. 
2a1b0 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   Keep track of t
2a1c0 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a 2a  he mxChoice.  **
2a1d0 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20 65   best paths at e
2a1e0 61 63 68 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a  ach generation *
2a1f0 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b  /.  for(iLoop=0;
2a200 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c   iLoop<nLoop; iL
2a210 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f 20  oop++){.    nTo 
2a220 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d  = 0;.    for(ii=
2a230 30 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20  0, pFrom=aFrom; 
2a240 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20  ii<nFrom; ii++, 
2a250 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pFrom++){.      
2a260 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e 66  for(pWLoop=pWInf
2a270 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f  o->pLoops; pWLoo
2a280 70 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70  p; pWLoop=pWLoop
2a290 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20  ->pNextLoop){.  
2a2a0 20 20 20 20 20 20 4c 6f 67 45 73 74 20 6e 4f 75        LogEst nOu
2a2b0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2a2c0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20          /* Rows 
2a2d0 76 69 73 69 74 65 64 20 62 79 20 28 70 46 72 6f  visited by (pFro
2a2e0 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20  m+pWLoop) */.   
2a2f0 20 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f 73       LogEst rCos
2a300 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2a310 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f         /* Cost o
2a320 66 20 70 61 74 68 20 28 70 46 72 6f 6d 2b 70 57  f path (pFrom+pW
2a330 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20  Loop) */.       
2a340 20 4c 6f 67 45 73 74 20 72 55 6e 73 6f 72 74 65   LogEst rUnsorte
2a350 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
2a360 20 20 20 2f 2a 20 55 6e 73 6f 72 74 65 64 20 63     /* Unsorted c
2a370 6f 73 74 20 6f 66 20 28 70 46 72 6f 6d 2b 70 57  ost of (pFrom+pW
2a380 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20  Loop) */.       
2a390 20 69 38 20 69 73 4f 72 64 65 72 65 64 20 3d 20   i8 isOrdered = 
2a3a0 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64  pFrom->isOrdered
2a3b0 3b 20 20 2f 2a 20 69 73 4f 72 64 65 72 65 64 20  ;  /* isOrdered 
2a3c0 66 6f 72 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f  for (pFrom+pWLoo
2a3d0 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 42 69  p) */.        Bi
2a3e0 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77 3b 20 20  tmask maskNew;  
2a3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a400 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 72 63 20 76  /* Mask of src v
2a410 69 73 69 74 65 64 20 62 79 20 28 2e 2e 29 20 2a  isited by (..) *
2a420 2f 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  /.        Bitmas
2a430 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 20 20  k revMask = 0;  
2a440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
2a450 61 73 6b 20 6f 66 20 72 65 76 2d 6f 72 64 65 72  ask of rev-order
2a460 20 6c 6f 6f 70 73 20 66 6f 72 20 28 2e 2e 29 20   loops for (..) 
2a470 2a 2f 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  */..        if( 
2a480 28 70 57 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 20  (pWLoop->prereq 
2a490 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f  & ~pFrom->maskLo
2a4a0 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  op)!=0 ) continu
2a4b0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  e;.        if( (
2a4c0 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  pWLoop->maskSelf
2a4d0 20 26 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f   & pFrom->maskLo
2a4e0 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  op)!=0 ) continu
2a4f0 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74  e;.        /* At
2a500 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 70 57 4c   this point, pWL
2a510 6f 6f 70 20 69 73 20 61 20 63 61 6e 64 69 64 61  oop is a candida
2a520 74 65 20 74 6f 20 62 65 20 74 68 65 20 6e 65 78  te to be the nex
2a530 74 20 6c 6f 6f 70 2e 20 0a 20 20 20 20 20 20 20  t loop. .       
2a540 20 2a 2a 20 43 6f 6d 70 75 74 65 20 69 74 73 20   ** Compute its 
2a550 63 6f 73 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  cost */.        
2a560 72 55 6e 73 6f 72 74 65 64 20 3d 20 73 71 6c 69  rUnsorted = sqli
2a570 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 57 4c  te3LogEstAdd(pWL
2a580 6f 6f 70 2d 3e 72 53 65 74 75 70 2c 70 57 4c 6f  oop->rSetup,pWLo
2a590 6f 70 2d 3e 72 52 75 6e 20 2b 20 70 46 72 6f 6d  op->rRun + pFrom
2a5a0 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 20  ->nRow);.       
2a5b0 20 72 55 6e 73 6f 72 74 65 64 20 3d 20 73 71 6c   rUnsorted = sql
2a5c0 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 55  ite3LogEstAdd(rU
2a5d0 6e 73 6f 72 74 65 64 2c 20 70 46 72 6f 6d 2d 3e  nsorted, pFrom->
2a5e0 72 55 6e 73 6f 72 74 65 64 29 3b 0a 20 20 20 20  rUnsorted);.    
2a5f0 20 20 20 20 6e 4f 75 74 20 3d 20 70 46 72 6f 6d      nOut = pFrom
2a600 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d  ->nRow + pWLoop-
2a610 3e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 6d  >nOut;.        m
2a620 61 73 6b 4e 65 77 20 3d 20 70 46 72 6f 6d 2d 3e  askNew = pFrom->
2a630 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f  maskLoop | pWLoo
2a640 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
2a650 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72       if( isOrder
2a660 65 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ed<0 ){.        
2a670 20 20 69 73 4f 72 64 65 72 65 64 20 3d 20 77 68    isOrdered = wh
2a680 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73  erePathSatisfies
2a690 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 0a  OrderBy(pWInfo,.
2a6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6b0 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70         pWInfo->p
2a6c0 4f 72 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c 20  OrderBy, pFrom, 
2a6d0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
2a6e0 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  gs,.            
2a6f0 20 20 20 20 20 20 20 20 20 20 20 69 4c 6f 6f 70             iLoop
2a700 2c 20 70 57 4c 6f 6f 70 2c 20 26 72 65 76 4d 61  , pWLoop, &revMa
2a710 73 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  sk);.        }el
2a720 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65  se{.          re
2a730 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72  vMask = pFrom->r
2a740 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  evLoop;.        
2a750 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  }.        if( is
2a760 4f 72 64 65 72 65 64 3e 3d 30 20 26 26 20 69 73  Ordered>=0 && is
2a770 4f 72 64 65 72 65 64 3c 6e 4f 72 64 65 72 42 79  Ordered<nOrderBy
2a780 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2a790 28 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72  ( aSortCost[isOr
2a7a0 64 65 72 65 64 5d 3d 3d 30 20 29 7b 0a 20 20 20  dered]==0 ){.   
2a7b0 20 20 20 20 20 20 20 20 20 61 53 6f 72 74 43 6f           aSortCo
2a7c0 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 20 3d 20  st[isOrdered] = 
2a7d0 77 68 65 72 65 53 6f 72 74 69 6e 67 43 6f 73 74  whereSortingCost
2a7e0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
2a7f0 20 20 70 57 49 6e 66 6f 2c 20 6e 52 6f 77 45 73    pWInfo, nRowEs
2a800 74 2c 20 6e 4f 72 64 65 72 42 79 2c 20 69 73 4f  t, nOrderBy, isO
2a810 72 64 65 72 65 64 0a 20 20 20 20 20 20 20 20 20  rdered.         
2a820 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
2a830 7d 0a 20 20 20 20 20 20 20 20 20 20 72 43 6f 73  }.          rCos
2a840 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  t = sqlite3LogEs
2a850 74 41 64 64 28 72 55 6e 73 6f 72 74 65 64 2c 20  tAdd(rUnsorted, 
2a860 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65  aSortCost[isOrde
2a870 72 65 64 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20  red]);..        
2a880 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 30    WHERETRACE(0x0
2a890 30 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  02,.            
2a8a0 20 20 28 22 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f    ("---- sort co
2a8b0 73 74 3d 25 2d 33 64 20 28 25 64 2f 25 64 29 20  st=%-3d (%d/%d) 
2a8c0 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74 20 25  increases cost %
2a8d0 33 64 20 74 6f 20 25 2d 33 64 5c 6e 22 2c 0a 20  3d to %-3d\n",. 
2a8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
2a8f0 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65  ortCost[isOrdere
2a900 64 5d 2c 20 28 6e 4f 72 64 65 72 42 79 2d 69 73  d], (nOrderBy-is
2a910 4f 72 64 65 72 65 64 29 2c 20 6e 4f 72 64 65 72  Ordered), nOrder
2a920 42 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  By, .           
2a930 20 20 20 20 72 55 6e 73 6f 72 74 65 64 2c 20 72      rUnsorted, r
2a940 43 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 20 20  Cost));.        
2a950 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2a960 20 72 43 6f 73 74 20 3d 20 72 55 6e 73 6f 72 74   rCost = rUnsort
2a970 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ed;.        }.. 
2a980 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
2a990 74 6f 20 73 65 65 20 69 66 20 70 57 4c 6f 6f 70  to see if pWLoop
2a9a0 20 73 68 6f 75 6c 64 20 62 65 20 61 64 64 65 64   should be added
2a9b0 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 0a 20   to the set of. 
2a9c0 20 20 20 20 20 20 20 2a 2a 20 6d 78 43 68 6f 69         ** mxChoi
2a9d0 63 65 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70  ce best-so-far p
2a9e0 61 74 68 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a  aths..        **
2a9f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 69 72 73  .        ** Firs
2aa00 74 20 6c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 78  t look for an ex
2aa10 69 73 74 69 6e 67 20 70 61 74 68 20 61 6d 6f 6e  isting path amon
2aa20 67 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61  g best-so-far pa
2aa30 74 68 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ths.        ** t
2aa40 68 61 74 20 63 6f 76 65 72 73 20 74 68 65 20 73  hat covers the s
2aa50 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f 70 73  ame set of loops
2aa60 20 61 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d   and has the sam
2aa70 65 20 69 73 4f 72 64 65 72 65 64 0a 20 20 20 20  e isOrdered.    
2aa80 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 20 61      ** setting a
2aa90 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  s the current pa
2aaa0 74 68 20 63 61 6e 64 69 64 61 74 65 2e 0a 20 20  th candidate..  
2aab0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2aac0 20 2a 2a 20 54 68 65 20 74 65 72 6d 20 22 28 28   ** The term "((
2aad0 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69  pTo->isOrdered^i
2aae0 73 4f 72 64 65 72 65 64 29 26 30 78 38 30 29 3d  sOrdered)&0x80)=
2aaf0 3d 30 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e  =0" is equivalen
2ab00 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  t.        ** to 
2ab10 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3d  (pTo->isOrdered=
2ab20 3d 28 2d 31 29 29 3d 3d 28 69 73 4f 72 64 65 72  =(-1))==(isOrder
2ab30 65 64 3d 3d 28 2d 31 29 29 22 20 66 6f 72 20 74  ed==(-1))" for t
2ab40 68 65 20 72 61 6e 67 65 0a 20 20 20 20 20 20 20  he range.       
2ab50 20 2a 2a 20 6f 66 20 6c 65 67 61 6c 20 76 61 6c   ** of legal val
2ab60 75 65 73 20 66 6f 72 20 69 73 4f 72 64 65 72 65  ues for isOrdere
2ab70 64 2c 20 2d 31 2e 2e 36 34 2e 0a 20 20 20 20 20  d, -1..64..     
2ab80 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f     */.        fo
2ab90 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b  r(jj=0, pTo=aTo;
2aba0 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70   jj<nTo; jj++, p
2abb0 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  To++){.         
2abc0 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f   if( pTo->maskLo
2abd0 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a 20 20 20 20  op==maskNew.    
2abe0 20 20 20 20 20 20 20 26 26 20 28 28 70 54 6f 2d         && ((pTo-
2abf0 3e 69 73 4f 72 64 65 72 65 64 5e 69 73 4f 72 64  >isOrdered^isOrd
2ac00 65 72 65 64 29 26 30 78 38 30 29 3d 3d 30 0a 20  ered)&0x80)==0. 
2ac10 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
2ac20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2ac30 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b 0a 20  ( jj==nTo-1 );. 
2ac40 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2ac50 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2ac60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ac70 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20  if( jj>=nTo ){. 
2ac80 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 65           /* None
2ac90 20 6f 66 20 74 68 65 20 65 78 69 73 74 69 6e 67   of the existing
2aca0 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74   best-so-far pat
2acb0 68 73 20 6d 61 74 63 68 20 74 68 65 20 63 61 6e  hs match the can
2acc0 64 69 64 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20  didate. */.     
2acd0 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78       if( nTo>=mx
2ace0 43 68 6f 69 63 65 0a 20 20 20 20 20 20 20 20 20  Choice.         
2acf0 20 20 26 26 20 28 72 43 6f 73 74 3e 6d 78 43 6f    && (rCost>mxCo
2ad00 73 74 20 7c 7c 20 28 72 43 6f 73 74 3d 3d 6d 78  st || (rCost==mx
2ad10 43 6f 73 74 20 26 26 20 72 55 6e 73 6f 72 74 65  Cost && rUnsorte
2ad20 64 3e 3d 6d 78 55 6e 73 6f 72 74 65 64 29 29 0a  d>=mxUnsorted)).
2ad30 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
2ad40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2ad50 63 75 72 72 65 6e 74 20 63 61 6e 64 69 64 61 74  current candidat
2ad60 65 20 69 73 20 6e 6f 20 62 65 74 74 65 72 20 74  e is no better t
2ad70 68 61 6e 20 61 6e 79 20 6f 66 20 74 68 65 20 6d  han any of the m
2ad80 78 43 68 6f 69 63 65 0a 20 20 20 20 20 20 20 20  xChoice.        
2ad90 20 20 20 20 2a 2a 20 70 61 74 68 73 20 63 75 72      ** paths cur
2ada0 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 62 65  rently in the be
2adb0 73 74 2d 73 6f 2d 66 61 72 20 62 75 66 66 65 72  st-so-far buffer
2adc0 2e 20 20 53 6f 20 64 69 73 63 61 72 64 0a 20 20  .  So discard.  
2add0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
2ade0 73 20 63 61 6e 64 69 64 61 74 65 20 61 73 20 6e  s candidate as n
2adf0 6f 74 20 76 69 61 62 6c 65 2e 20 2a 2f 0a 23 69  ot viable. */.#i
2ae00 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
2ae10 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a  ENABLED /* 0x4 *
2ae20 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
2ae30 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
2ae40 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
2ae50 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2ae60 44 65 62 75 67 50 72 69 6e 74 66 28 22 53 6b 69  DebugPrintf("Ski
2ae70 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  p   %s cost=%-3d
2ae80 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22  ,%3d order=%c\n"
2ae90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2aea0 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
2aeb0 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20  e(pFrom, iLoop, 
2aec0 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20  pWLoop), rCost, 
2aed0 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20  nOut,.          
2aee0 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
2aef0 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64  d>=0 ? isOrdered
2af00 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20  +'0' : '?');.   
2af10 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69           }.#endi
2af20 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  f.            co
2af30 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2af40 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a    }.          /*
2af50 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
2af60 73 20 70 6f 69 6e 74 73 20 69 74 20 6d 65 61 6e  s points it mean
2af70 73 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 63  s that the new c
2af80 61 6e 64 69 64 61 74 65 20 70 61 74 68 0a 20 20  andidate path.  
2af90 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 73          ** needs
2afa0 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
2afb0 74 68 65 20 73 65 74 20 6f 66 20 62 65 73 74 2d  the set of best-
2afc0 73 6f 2d 66 61 72 20 70 61 74 68 73 2e 20 2a 2f  so-far paths. */
2afd0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
2afe0 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20  To<mxChoice ){. 
2aff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2b000 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65 20  crease the size 
2b010 6f 66 20 74 68 65 20 61 54 6f 20 73 65 74 20 62  of the aTo set b
2b020 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20  y one */.       
2b030 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b       jj = nTo++;
2b040 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
2b050 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
2b060 20 4e 65 77 20 70 61 74 68 20 72 65 70 6c 61 63   New path replac
2b070 65 73 20 74 68 65 20 70 72 69 6f 72 20 77 6f 72  es the prior wor
2b080 73 74 20 74 6f 20 6b 65 65 70 20 63 6f 75 6e 74  st to keep count
2b090 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69 63 65 20   below mxChoice 
2b0a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  */.            j
2b0b0 6a 20 3d 20 6d 78 49 3b 0a 20 20 20 20 20 20 20  j = mxI;.       
2b0c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
2b0d0 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23  To = &aTo[jj];.#
2b0e0 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
2b0f0 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20  _ENABLED /* 0x4 
2b100 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
2b110 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
2b120 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20  ce&0x4 ){.      
2b130 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
2b140 75 67 50 72 69 6e 74 66 28 22 4e 65 77 20 20 20  ugPrintf("New   
2b150 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33   %s cost=%-3d,%3
2b160 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
2b170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
2b180 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72  herePathName(pFr
2b190 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f  om, iLoop, pWLoo
2b1a0 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c  p), rCost, nOut,
2b1b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b1c0 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20   isOrdered>=0 ? 
2b1d0 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
2b1e0 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
2b1f0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
2b200 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2b210 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61    /* Control rea
2b220 63 68 65 73 20 68 65 72 65 20 69 66 20 62 65 73  ches here if bes
2b230 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 20 70 54  t-so-far path pT
2b240 6f 3d 61 54 6f 5b 6a 6a 5d 20 63 6f 76 65 72 73  o=aTo[jj] covers
2b250 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
2b260 2a 20 73 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f  * same set of lo
2b270 6f 70 73 20 61 6e 64 20 68 61 73 20 74 68 65 20  ops and has the 
2b280 73 61 6d 20 69 73 4f 72 64 65 72 65 64 20 73 65  sam isOrdered se
2b290 74 74 69 6e 67 20 61 73 20 74 68 65 0a 20 20 20  tting as the.   
2b2a0 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 64 69 64         ** candid
2b2b0 61 74 65 20 70 61 74 68 2e 20 20 43 68 65 63 6b  ate path.  Check
2b2c0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 63   to see if the c
2b2d0 61 6e 64 69 64 61 74 65 20 73 68 6f 75 6c 64 20  andidate should 
2b2e0 72 65 70 6c 61 63 65 0a 20 20 20 20 20 20 20 20  replace.        
2b2f0 20 20 2a 2a 20 70 54 6f 20 6f 72 20 69 66 20 74    ** pTo or if t
2b300 68 65 20 63 61 6e 64 69 64 61 74 65 20 73 68 6f  he candidate sho
2b310 75 6c 64 20 62 65 20 73 6b 69 70 70 65 64 20 2a  uld be skipped *
2b320 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
2b330 70 54 6f 2d 3e 72 43 6f 73 74 3c 72 43 6f 73 74  pTo->rCost<rCost
2b340 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d   || (pTo->rCost=
2b350 3d 72 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 6e  =rCost && pTo->n
2b360 52 6f 77 3c 3d 6e 4f 75 74 29 20 29 7b 0a 23 69  Row<=nOut) ){.#i
2b370 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
2b380 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a  ENABLED /* 0x4 *
2b390 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
2b3a0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
2b3b0 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
2b3c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2b3d0 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20  DebugPrintf(.   
2b3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2b3f0 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25  Skip   %s cost=%
2b400 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63  -3d,%3d order=%c
2b410 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2b420 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
2b430 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c  me(pFrom, iLoop,
2b440 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c   pWLoop), rCost,
2b450 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20   nOut,.         
2b460 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
2b470 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65  ed>=0 ? isOrdere
2b480 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20  d+'0' : '?');.  
2b490 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2b4a0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2b4b0 20 20 20 76 73 20 25 73 20 63 6f 73 74 3d 25 2d     vs %s cost=%-
2b4c0 33 64 2c 25 64 20 6f 72 64 65 72 3d 25 63 5c 6e  3d,%d order=%c\n
2b4d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2b4e0 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
2b4f0 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c  me(pTo, iLoop+1,
2b500 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c   0), pTo->rCost,
2b510 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20   pTo->nRow,.    
2b520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
2b530 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20  o->isOrdered>=0 
2b540 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  ? pTo->isOrdered
2b550 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20  +'0' : '?');.   
2b560 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69           }.#endi
2b570 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  f.            /*
2b580 20 44 69 73 63 61 72 64 20 74 68 65 20 63 61 6e   Discard the can
2b590 64 69 64 61 74 65 20 70 61 74 68 20 66 72 6f 6d  didate path from
2b5a0 20 66 75 72 74 68 65 72 20 63 6f 6e 73 69 64 65   further conside
2b5b0 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ration */.      
2b5c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2b5d0 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73  pTo->rCost==rCos
2b5e0 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t );.           
2b5f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2b600 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2b610 20 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e   testcase( pTo->
2b620 72 43 6f 73 74 3d 3d 72 43 6f 73 74 2b 31 20 29  rCost==rCost+1 )
2b630 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;.          /* C
2b640 6f 6e 74 72 6f 6c 20 72 65 61 63 68 65 73 20 68  ontrol reaches h
2b650 65 72 65 20 69 66 20 74 68 65 20 63 61 6e 64 69  ere if the candi
2b660 64 61 74 65 20 70 61 74 68 20 69 73 20 62 65 74  date path is bet
2b670 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 20  ter than the.   
2b680 20 20 20 20 20 20 20 2a 2a 20 70 54 6f 20 70 61         ** pTo pa
2b690 74 68 2e 20 20 52 65 70 6c 61 63 65 20 70 54 6f  th.  Replace pTo
2b6a0 20 77 69 74 68 20 74 68 65 20 63 61 6e 64 69 64   with the candid
2b6b0 61 74 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20 57  ate. */.#ifdef W
2b6c0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
2b6d0 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20  D /* 0x4 */.    
2b6e0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2b6f0 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
2b700 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2b710 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
2b720 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f(.             
2b730 20 20 20 22 55 70 64 61 74 65 20 25 73 20 63 6f     "Update %s co
2b740 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65  st=%-3d,%3d orde
2b750 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20  r=%c",.         
2b760 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
2b770 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f  Name(pFrom, iLoo
2b780 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73  p, pWLoop), rCos
2b790 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20  t, nOut,.       
2b7a0 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
2b7b0 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65  ed>=0 ? isOrdere
2b7c0 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20  d+'0' : '?');.  
2b7d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2b7e0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
2b7f0 77 61 73 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  was %s cost=%-3d
2b800 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22  ,%3d order=%c\n"
2b810 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2b820 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
2b830 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29  pTo, iLoop+1, 0)
2b840 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54  , pTo->rCost, pT
2b850 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20  o->nRow,.       
2b860 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73           pTo->is
2b870 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f  Ordered>=0 ? pTo
2b880 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20  ->isOrdered+'0' 
2b890 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
2b8a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
2b8b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
2b8c0 70 57 4c 6f 6f 70 20 69 73 20 61 20 77 69 6e 6e  pWLoop is a winn
2b8d0 65 72 2e 20 20 41 64 64 20 69 74 20 74 6f 20 74  er.  Add it to t
2b8e0 68 65 20 73 65 74 20 6f 66 20 62 65 73 74 20 73  he set of best s
2b8f0 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20  o far */.       
2b900 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 3d   pTo->maskLoop =
2b910 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70   pFrom->maskLoop
2b920 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   | pWLoop->maskS
2b930 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  elf;.        pTo
2b940 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20 72 65 76 4d  ->revLoop = revM
2b950 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  ask;.        pTo
2b960 2d 3e 6e 52 6f 77 20 3d 20 6e 4f 75 74 3b 0a 20  ->nRow = nOut;. 
2b970 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 43 6f 73         pTo->rCos
2b980 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20 20 20 20  t = rCost;.     
2b990 20 20 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65     pTo->rUnsorte
2b9a0 64 20 3d 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20  d = rUnsorted;. 
2b9b0 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72         pTo->isOr
2b9c0 64 65 72 65 64 20 3d 20 69 73 4f 72 64 65 72 65  dered = isOrdere
2b9d0 64 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  d;.        memcp
2b9e0 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70 46  y(pTo->aLoop, pF
2b9f0 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a 65  rom->aLoop, size
2ba00 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 69  of(WhereLoop*)*i
2ba10 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 70  Loop);.        p
2ba20 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d  To->aLoop[iLoop]
2ba30 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20   = pWLoop;.     
2ba40 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68     if( nTo>=mxCh
2ba50 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  oice ){.        
2ba60 20 20 6d 78 49 20 3d 20 30 3b 0a 20 20 20 20 20    mxI = 0;.     
2ba70 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 61 54       mxCost = aT
2ba80 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20 20 20 20  o[0].rCost;.    
2ba90 20 20 20 20 20 20 6d 78 55 6e 73 6f 72 74 65 64        mxUnsorted
2baa0 20 3d 20 61 54 6f 5b 30 5d 2e 6e 52 6f 77 3b 0a   = aTo[0].nRow;.
2bab0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a            for(jj
2bac0 3d 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b  =1, pTo=&aTo[1];
2bad0 20 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20 6a 6a   jj<mxChoice; jj
2bae0 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20  ++, pTo++){.    
2baf0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d          if( pTo-
2bb00 3e 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 0a 20  >rCost>mxCost . 
2bb10 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
2bb20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 6d 78 43 6f  pTo->rCost==mxCo
2bb30 73 74 20 26 26 20 70 54 6f 2d 3e 72 55 6e 73 6f  st && pTo->rUnso
2bb40 72 74 65 64 3e 6d 78 55 6e 73 6f 72 74 65 64 29  rted>mxUnsorted)
2bb50 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b   .            ){
2bb60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d  .              m
2bb70 78 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72 43 6f  xCost = pTo->rCo
2bb80 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  st;.            
2bb90 20 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 70    mxUnsorted = p
2bba0 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3b 0a 20  To->rUnsorted;. 
2bbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 49               mxI
2bbc0 20 3d 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20   = jj;.         
2bbd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2bbe0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2bbf0 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66   }.    }..#ifdef
2bc00 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
2bc10 4c 45 44 20 20 2f 2a 20 3e 3d 32 20 2a 2f 0a 20  LED  /* >=2 */. 
2bc20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
2bc30 65 72 65 54 72 61 63 65 20 26 20 30 78 30 32 20  ereTrace & 0x02 
2bc40 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2bc50 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d  DebugPrintf("---
2bc60 2d 20 61 66 74 65 72 20 72 6f 75 6e 64 20 25 64  - after round %d
2bc70 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29   ----\n", iLoop)
2bc80 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  ;.      for(ii=0
2bc90 2c 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54  , pTo=aTo; ii<nT
2bca0 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b  o; ii++, pTo++){
2bcb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2bcc0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 73  DebugPrintf(" %s
2bcd0 20 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f 77 3d   cost=%-3d nrow=
2bce0 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a  %-3d order=%c",.
2bcf0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
2bd00 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c  PathName(pTo, iL
2bd10 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e  oop+1, 0), pTo->
2bd20 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77  rCost, pTo->nRow
2bd30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 6f  ,.           pTo
2bd40 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f  ->isOrdered>=0 ?
2bd50 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64   (pTo->isOrdered
2bd60 2b 27 30 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20  +'0') : '?');.  
2bd70 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 69        if( pTo->i
2bd80 73 4f 72 64 65 72 65 64 3e 30 20 29 7b 0a 20 20  sOrdered>0 ){.  
2bd90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
2bda0 65 62 75 67 50 72 69 6e 74 66 28 22 20 72 65 76  ebugPrintf(" rev
2bdb0 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d  =0x%llx\n", pTo-
2bdc0 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  >revLoop);.     
2bdd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2bde0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2bdf0 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
2be00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2be10 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
2be20 20 20 2f 2a 20 53 77 61 70 20 74 68 65 20 72 6f    /* Swap the ro
2be30 6c 65 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e 64  les of aFrom and
2be40 20 61 54 6f 20 66 6f 72 20 74 68 65 20 6e 65 78   aTo for the nex
2be50 74 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a  t generation */.
2be60 20 20 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f 3b      pFrom = aTo;
2be70 0a 20 20 20 20 61 54 6f 20 3d 20 61 46 72 6f 6d  .    aTo = aFrom
2be80 3b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 70 46  ;.    aFrom = pF
2be90 72 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d  rom;.    nFrom =
2bea0 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66 28   nTo;.  }..  if(
2beb0 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20   nFrom==0 ){.   
2bec0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2bed0 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 71 75 65  (pParse, "no que
2bee0 72 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20  ry solution");. 
2bef0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2bf00 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20  (db, pSpace);.  
2bf10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2bf20 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20 20  ERROR;.  }.  .  
2bf30 2f 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f 77 65  /* Find the lowe
2bf40 73 74 20 63 6f 73 74 20 70 61 74 68 2e 20 20 70  st cost path.  p
2bf50 46 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65 66  From will be lef
2bf60 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  t pointing to th
2bf70 61 74 20 70 61 74 68 20 2a 2f 0a 20 20 70 46 72  at path */.  pFr
2bf80 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 66 6f  om = aFrom;.  fo
2bf90 72 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d  r(ii=1; ii<nFrom
2bfa0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
2bfb0 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46   pFrom->rCost>aF
2bfc0 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20 29 20  rom[ii].rCost ) 
2bfd0 70 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b 69  pFrom = &aFrom[i
2bfe0 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  i];.  }.  assert
2bff0 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
2c000 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20  ==nLoop );.  /* 
2c010 4c 6f 61 64 20 74 68 65 20 6c 6f 77 65 73 74 20  Load the lowest 
2c020 63 6f 73 74 20 70 61 74 68 20 69 6e 74 6f 20 70  cost path into p
2c030 57 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72 28 69  WInfo */.  for(i
2c040 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c  Loop=0; iLoop<nL
2c050 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20  oop; iLoop++){. 
2c060 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70     WhereLevel *p
2c070 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e  Level = pWInfo->
2c080 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20 20 70  a + iLoop;.    p
2c090 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20  Level->pWLoop = 
2c0a0 70 57 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e  pWLoop = pFrom->
2c0b0 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20  aLoop[iLoop];.  
2c0c0 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20    pLevel->iFrom 
2c0d0 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a  = pWLoop->iTab;.
2c0e0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62      pLevel->iTab
2c0f0 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  Cur = pWInfo->pT
2c100 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
2c110 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72  ->iFrom].iCursor
2c120 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 57 49  ;.  }.  if( (pWI
2c130 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
2c140 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  & WHERE_WANT_DIS
2c150 54 49 4e 43 54 29 21 3d 30 0a 20 20 20 26 26 20  TINCT)!=0.   && 
2c160 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
2c170 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54  ags & WHERE_DIST
2c180 49 4e 43 54 42 59 29 3d 3d 30 0a 20 20 20 26 26  INCTBY)==0.   &&
2c190 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
2c1a0 63 74 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e  ct==WHERE_DISTIN
2c1b0 43 54 5f 4e 4f 4f 50 0a 20 20 20 26 26 20 6e 52  CT_NOOP.   && nR
2c1c0 6f 77 45 73 74 0a 20 20 29 7b 0a 20 20 20 20 42  owEst.  ){.    B
2c1d0 69 74 6d 61 73 6b 20 6e 6f 74 55 73 65 64 3b 0a  itmask notUsed;.
2c1e0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 68 65      int rc = whe
2c1f0 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f  rePathSatisfiesO
2c200 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70  rderBy(pWInfo, p
2c210 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65  WInfo->pResultSe
2c220 74 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20  t, pFrom,.      
2c230 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45             WHERE
2c240 5f 44 49 53 54 49 4e 43 54 42 59 2c 20 6e 4c 6f  _DISTINCTBY, nLo
2c250 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f  op-1, pFrom->aLo
2c260 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f  op[nLoop-1], &no
2c270 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20  tUsed);.    if( 
2c280 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 52 65 73  rc==pWInfo->pRes
2c290 75 6c 74 53 65 74 2d 3e 6e 45 78 70 72 20 29 7b  ultSet->nExpr ){
2c2a0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
2c2b0 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
2c2c0 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
2c2d0 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  D;.    }.  }.  i
2c2e0 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
2c2f0 72 42 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70  rBy ){.    if( p
2c300 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
2c310 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e  s & WHERE_DISTIN
2c320 43 54 42 59 20 29 7b 0a 20 20 20 20 20 20 69 66  CTBY ){.      if
2c330 28 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72  ( pFrom->isOrder
2c340 65 64 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  ed==pWInfo->pOrd
2c350 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  erBy->nExpr ){. 
2c360 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65         pWInfo->e
2c370 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
2c380 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
2c390 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  D;.      }.    }
2c3a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 49 6e  else{.      pWIn
2c3b0 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 46 72  fo->nOBSat = pFr
2c3c0 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 0a 20  om->isOrdered;. 
2c3d0 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d       if( pWInfo-
2c3e0 3e 6e 4f 42 53 61 74 3c 30 20 29 20 70 57 49 6e  >nOBSat<0 ) pWIn
2c3f0 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 30 3b 0a  fo->nOBSat = 0;.
2c400 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65        pWInfo->re
2c410 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72  vMask = pFrom->r
2c420 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 7d 0a 20 20  evLoop;.    }.  
2c430 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
2c440 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2c450 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 29 0a 20  E_SORTBYGROUP). 
2c460 20 20 20 20 20 20 20 26 26 20 70 57 49 6e 66 6f         && pWInfo
2c470 2d 3e 6e 4f 42 53 61 74 3d 3d 70 57 49 6e 66 6f  ->nOBSat==pWInfo
2c480 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
2c490 72 20 26 26 20 6e 4c 6f 6f 70 3e 30 0a 20 20 20  r && nLoop>0.   
2c4a0 20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73   ){.      Bitmas
2c4b0 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 0a 20  k revMask = 0;. 
2c4c0 20 20 20 20 20 69 6e 74 20 6e 4f 72 64 65 72 20       int nOrder 
2c4d0 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73  = wherePathSatis
2c4e0 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e  fiesOrderBy(pWIn
2c4f0 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  fo, pWInfo->pOrd
2c500 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20 20 20  erBy, .         
2c510 20 70 46 72 6f 6d 2c 20 30 2c 20 6e 4c 6f 6f 70   pFrom, 0, nLoop
2c520 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  -1, pFrom->aLoop
2c530 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 72 65 76 4d  [nLoop-1], &revM
2c540 61 73 6b 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ask.      );.   
2c550 20 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66     assert( pWInf
2c560 6f 2d 3e 73 6f 72 74 65 64 3d 3d 30 20 29 3b 0a  o->sorted==0 );.
2c570 20 20 20 20 20 20 69 66 28 20 6e 4f 72 64 65 72        if( nOrder
2c580 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ==pWInfo->pOrder
2c590 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  By->nExpr ){.   
2c5a0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 73 6f 72       pWInfo->sor
2c5b0 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ted = 1;.       
2c5c0 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b   pWInfo->revMask
2c5d0 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20   = revMask;.    
2c5e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a    }.    }.  }...
2c5f0 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75    pWInfo->nRowOu
2c600 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3b  t = pFrom->nRow;
2c610 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 65 6d 70  ..  /* Free temp
2c620 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 61 6e 64  orary memory and
2c630 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 20   return success 
2c640 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  */.  sqlite3DbFr
2c650 65 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a  ee(db, pSpace);.
2c660 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c670 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73  OK;.}../*.** Mos
2c680 74 20 71 75 65 72 69 65 73 20 75 73 65 20 6f 6e  t queries use on
2c690 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ly a single tabl
2c6a0 65 20 28 74 68 65 79 20 61 72 65 20 6e 6f 74 20  e (they are not 
2c6b0 6a 6f 69 6e 73 29 20 61 6e 64 20 68 61 76 65 0a  joins) and have.
2c6c0 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d 20 63 6f 6e  ** simple == con
2c6d0 73 74 72 61 69 6e 74 73 20 61 67 61 69 6e 73 74  straints against
2c6e0 20 69 6e 64 65 78 65 64 20 66 69 65 6c 64 73 2e   indexed fields.
2c6f0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
2c700 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 70 6c  ttempts.** to pl
2c710 61 6e 20 74 68 6f 73 65 20 73 69 6d 70 6c 65 20  an those simple 
2c720 63 61 73 65 73 20 75 73 69 6e 67 20 6d 75 63 68  cases using much
2c730 20 6c 65 73 73 20 63 65 72 65 6d 6f 6e 79 20 74   less ceremony t
2c740 68 61 6e 20 74 68 65 0a 2a 2a 20 67 65 6e 65 72  han the.** gener
2c750 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79  al-purpose query
2c760 20 70 6c 61 6e 6e 65 72 2c 20 61 6e 64 20 74 68   planner, and th
2c770 65 72 65 62 79 20 79 69 65 6c 64 20 66 61 73 74  ereby yield fast
2c780 65 72 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  er sqlite3_prepa
2c790 72 65 28 29 0a 2a 2a 20 74 69 6d 65 73 20 66 6f  re().** times fo
2c7a0 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
2c7b0 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
2c7c0 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73 75 63 63  non-zero on succ
2c7d0 65 73 73 2c 20 69 66 20 74 68 69 73 20 71 75 65  ess, if this que
2c7e0 72 79 20 63 61 6e 20 62 65 20 68 61 6e 64 6c 65  ry can be handle
2c7f0 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 6e 6f 2d  d by this.** no-
2c800 66 72 69 6c 6c 73 20 71 75 65 72 79 20 70 6c 61  frills query pla
2c810 6e 6e 65 72 2e 20 20 52 65 74 75 72 6e 20 7a 65  nner.  Return ze
2c820 72 6f 20 69 66 20 74 68 69 73 20 71 75 65 72 79  ro if this query
2c830 20 6e 65 65 64 73 20 74 68 65 20 0a 2a 2a 20 67   needs the .** g
2c840 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71  eneral-purpose q
2c850 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f  uery planner..*/
2c860 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
2c870 65 53 68 6f 72 74 43 75 74 28 57 68 65 72 65 4c  eShortCut(WhereL
2c880 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
2c890 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e  lder){.  WhereIn
2c8a0 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 73 74  fo *pWInfo;.  st
2c8b0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2c8c0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57 68 65 72  m *pItem;.  Wher
2c8d0 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20  eClause *pWC;.  
2c8e0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
2c8f0 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
2c900 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69 43 75 72  Loop;.  int iCur
2c910 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 54 61 62  ;.  int j;.  Tab
2c920 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65  le *pTab;.  Inde
2c930 78 20 2a 70 49 64 78 3b 0a 20 20 0a 20 20 70 57  x *pIdx;.  .  pW
2c940 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
2c950 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70  >pWInfo;.  if( p
2c960 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
2c970 73 20 26 20 57 48 45 52 45 5f 46 4f 52 43 45 5f  s & WHERE_FORCE_
2c980 54 41 42 4c 45 20 29 20 72 65 74 75 72 6e 20 30  TABLE ) return 0
2c990 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  ;.  assert( pWIn
2c9a0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53  fo->pTabList->nS
2c9b0 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49 74 65 6d  rc>=1 );.  pItem
2c9c0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
2c9d0 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61 62 20 3d  ist->a;.  pTab =
2c9e0 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20   pItem->pTab;.  
2c9f0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
2ca00 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ab) ) return 0;.
2ca10 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 49 6e    if( pItem->zIn
2ca20 64 65 78 65 64 42 79 20 29 20 72 65 74 75 72 6e  dexedBy ) return
2ca30 20 30 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74   0;.  iCur = pIt
2ca40 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70  em->iCursor;.  p
2ca50 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57  WC = &pWInfo->sW
2ca60 43 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 42 75  C;.  pLoop = pBu
2ca70 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70  ilder->pNew;.  p
2ca80 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  Loop->wsFlags = 
2ca90 30 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69  0;.  pLoop->nSki
2caa0 70 20 3d 20 30 3b 0a 20 20 70 54 65 72 6d 20 3d  p = 0;.  pTerm =
2cab0 20 73 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e   sqlite3WhereFin
2cac0 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
2cad0 20 2d 31 2c 20 30 2c 20 57 4f 5f 45 51 7c 57 4f   -1, 0, WO_EQ|WO
2cae0 5f 49 53 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  _IS, 0);.  if( p
2caf0 54 65 72 6d 20 29 7b 0a 20 20 20 20 74 65 73 74  Term ){.    test
2cb00 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
2cb10 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29  erator & WO_IS )
2cb20 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46  ;.    pLoop->wsF
2cb30 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c  lags = WHERE_COL
2cb40 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 49 50 4b  UMN_EQ|WHERE_IPK
2cb50 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20  |WHERE_ONEROW;. 
2cb60 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d     pLoop->aLTerm
2cb70 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [0] = pTerm;.   
2cb80 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d   pLoop->nLTerm =
2cb90 20 31 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75   1;.    pLoop->u
2cba0 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a  .btree.nEq = 1;.
2cbb0 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
2cbc0 6f 73 74 20 6f 66 20 61 20 72 6f 77 69 64 20 6c  ost of a rowid l
2cbd0 6f 6f 6b 75 70 20 69 73 20 31 30 20 2a 2f 0a 20  ookup is 10 */. 
2cbe0 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d     pLoop->rRun =
2cbf0 20 33 33 3b 20 20 2f 2a 20 33 33 3d 3d 73 71 6c   33;  /* 33==sql
2cc00 69 74 65 33 4c 6f 67 45 73 74 28 31 30 29 20 2a  ite3LogEst(10) *
2cc10 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  /.  }else{.    f
2cc20 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
2cc30 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
2cc40 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
2cc50 20 20 20 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b       int opMask;
2cc60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2cc70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  Loop->aLTermSpac
2cc80 65 3d 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  e==pLoop->aLTerm
2cc90 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 49   );.      if( !I
2cca0 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64  sUniqueIndex(pId
2ccb0 78 29 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64  x).       || pId
2ccc0 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  x->pPartIdxWhere
2ccd0 21 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  !=0 .       || p
2cce0 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 41 72 72  Idx->nKeyCol>Arr
2ccf0 61 79 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c  aySize(pLoop->aL
2cd00 54 65 72 6d 53 70 61 63 65 29 20 0a 20 20 20 20  TermSpace) .    
2cd10 20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20    ) continue;.  
2cd20 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 70 49 64      opMask = pId
2cd30 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3f  x->uniqNotNull ?
2cd40 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 3a   (WO_EQ|WO_IS) :
2cd50 20 57 4f 5f 45 51 3b 0a 20 20 20 20 20 20 66 6f   WO_EQ;.      fo
2cd60 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e  r(j=0; j<pIdx->n
2cd70 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  KeyCol; j++){.  
2cd80 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 73 71        pTerm = sq
2cd90 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64 54 65  lite3WhereFindTe
2cda0 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70 49  rm(pWC, iCur, pI
2cdb0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 2c  dx->aiColumn[j],
2cdc0 20 30 2c 20 6f 70 4d 61 73 6b 2c 20 70 49 64 78   0, opMask, pIdx
2cdd0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2cde0 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Term==0 ) break;
2cdf0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
2ce00 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
2ce10 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20  tor & WO_IS );. 
2ce20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c         pLoop->aL
2ce30 54 65 72 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b  Term[j] = pTerm;
2ce40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2ce50 66 28 20 6a 21 3d 70 49 64 78 2d 3e 6e 4b 65 79  f( j!=pIdx->nKey
2ce60 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Col ) continue;.
2ce70 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46        pLoop->wsF
2ce80 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c  lags = WHERE_COL
2ce90 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 4f 4e 45  UMN_EQ|WHERE_ONE
2cea0 52 4f 57 7c 57 48 45 52 45 5f 49 4e 44 45 58 45  ROW|WHERE_INDEXE
2ceb0 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  D;.      if( pId
2cec0 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 7c 7c  x->isCovering ||
2ced0 20 28 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64   (pItem->colUsed
2cee0 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64   & ~columnsInInd
2cef0 65 78 28 70 49 64 78 29 29 3d 3d 30 20 29 7b 0a  ex(pIdx))==0 ){.
2cf00 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77          pLoop->w
2cf10 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
2cf20 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  IDX_ONLY;.      
2cf30 7d 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e  }.      pLoop->n
2cf40 4c 54 65 72 6d 20 3d 20 6a 3b 0a 20 20 20 20 20  LTerm = j;.     
2cf50 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
2cf60 6e 45 71 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70  nEq = j;.      p
2cf70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
2cf80 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 20  ndex = pIdx;.   
2cf90 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f     /* TUNING: Co
2cfa0 73 74 20 6f 66 20 61 20 75 6e 69 71 75 65 20 69  st of a unique i
2cfb0 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 69 73 20 31  ndex lookup is 1
2cfc0 35 20 2a 2f 0a 20 20 20 20 20 20 70 4c 6f 6f 70  5 */.      pLoop
2cfd0 2d 3e 72 52 75 6e 20 3d 20 33 39 3b 20 20 2f 2a  ->rRun = 39;  /*
2cfe0 20 33 39 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   39==sqlite3LogE
2cff0 73 74 28 31 35 29 20 2a 2f 0a 20 20 20 20 20 20  st(15) */.      
2d000 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
2d010 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73  .  if( pLoop->ws
2d020 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 70 4c 6f  Flags ){.    pLo
2d030 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45  op->nOut = (LogE
2d040 73 74 29 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f  st)1;.    pWInfo
2d050 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20  ->a[0].pWLoop = 
2d060 70 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 6f 6f 70  pLoop;.    pLoop
2d070 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 73 71 6c  ->maskSelf = sql
2d080 69 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b  ite3WhereGetMask
2d090 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
2d0a0 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 70  et, iCur);.    p
2d0b0 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62  WInfo->a[0].iTab
2d0c0 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  Cur = iCur;.    
2d0d0 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20  pWInfo->nRowOut 
2d0e0 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57 49  = 1;.    if( pWI
2d0f0 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 20  nfo->pOrderBy ) 
2d100 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d  pWInfo->nOBSat =
2d110 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
2d120 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69  By->nExpr;.    i
2d130 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  f( pWInfo->wctrl
2d140 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
2d150 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20  NT_DISTINCT ){. 
2d160 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69       pWInfo->eDi
2d170 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
2d180 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a  ISTINCT_UNIQUE;.
2d190 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
2d1a0 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70 4c  ITE_DEBUG.    pL
2d1b0 6f 6f 70 2d 3e 63 49 64 20 3d 20 27 30 27 3b 0a  oop->cId = '0';.
2d1c0 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
2d1d0 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
2d1e0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n 0;.}../*.** Ge
2d1f0 6e 65 72 61 74 65 20 74 68 65 20 62 65 67 69 6e  nerate the begin
2d200 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ning of the loop
2d210 20 75 73 65 64 20 66 6f 72 20 57 48 45 52 45 20   used for WHERE 
2d220 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
2d230 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  g..** The return
2d240 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e   value is a poin
2d250 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65  ter to an opaque
2d260 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
2d270 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f  contains.** info
2d280 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74  rmation needed t
2d290 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
2d2a0 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68  loop.  Later, th
2d2b0 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  e calling routin
2d2c0 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f  e.** should invo
2d2d0 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  ke sqlite3WhereE
2d2e0 6e 64 28 29 20 77 69 74 68 20 74 68 65 20 72 65  nd() with the re
2d2f0 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
2d300 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
2d310 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c  n order to compl
2d320 65 74 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  ete the WHERE cl
2d330 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
2d340 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
2d350 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20  or occurs, this 
2d360 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
2d370 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
2d380 62 61 73 69 63 20 69 64 65 61 20 69 73 20 74 6f  basic idea is to
2d390 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f   do a nested loo
2d3a0 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20  p, one loop for 
2d3b0 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a  each table in.**
2d3c0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2d3d0 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28   of a select.  (
2d3e0 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54  INSERT and UPDAT
2d3f0 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  E statements are
2d400 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20   the.** same as 
2d410 61 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e  a SELECT with on
2d420 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ly a single tabl
2d430 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
2d440 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65  ause.)  For.** e
2d450 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53  xample, if the S
2d460 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a  QL is this:.**.*
2d470 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  *       SELECT *
2d480 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33   FROM t1, t2, t3
2d490 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a   WHERE ...;.**.*
2d4a0 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20  * Then the code 
2d4b0 67 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e  generated is con
2d4c0 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74  ceptually like t
2d4d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
2d4e0 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68  .**      foreach
2d4f0 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20   row1 in t1 do  
2d500 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67       \    Code g
2d510 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20  enerated.**     
2d520 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20     foreach row2 
2d530 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d  in t2 do      |-
2d540 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  - by sqlite3Wher
2d550 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20  eBegin().**     
2d560 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
2d570 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a  3 in t3 do   /.*
2d580 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  *            ...
2d590 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64  .**          end
2d5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d5b0 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67       \    Code g
2d5c0 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20  enerated.**     
2d5d0 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
2d5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d                |-
2d5f0 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  - by sqlite3Wher
2d600 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65  eEnd().**      e
2d610 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
2d620 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a             /.**.
2d630 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
2d640 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74   loops might not
2d650 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68   be nested in th
2d660 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68  e order in which
2d670 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20   they.** appear 
2d680 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2d690 73 65 20 69 66 20 61 20 64 69 66 66 65 72 65 6e  se if a differen
2d6a0 74 20 6f 72 64 65 72 20 69 73 20 62 65 74 74 65  t order is bette
2d6b0 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a  r able to make.*
2d6c0 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73  * use of indices
2d6d0 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61  .  Note also tha
2d6e0 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70  t when the IN op
2d6f0 65 72 61 74 6f 72 20 61 70 70 65 61 72 73 20 69  erator appears i
2d700 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63  n.** the WHERE c
2d710 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20  lause, it might 
2d720 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69  result in additi
2d730 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70  onal nested loop
2d740 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e  s for.** scannin
2d750 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61  g through all va
2d760 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68  lues on the righ
2d770 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
2d780 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  he IN..**.** The
2d790 72 65 20 61 72 65 20 42 74 72 65 65 20 63 75 72  re are Btree cur
2d7a0 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  sors associated 
2d7b0 77 69 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e  with each table.
2d7c0 20 20 74 31 20 75 73 65 73 20 63 75 72 73 6f 72    t1 uses cursor
2d7d0 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c  .** number pTabL
2d7e0 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  ist->a[0].iCurso
2d7f0 72 2e 20 20 74 32 20 75 73 65 73 20 74 68 65 20  r.  t2 uses the 
2d800 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d  cursor pTabList-
2d810 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a  >a[1].iCursor..*
2d820 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20  * And so forth. 
2d830 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
2d840 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20  nerates code to 
2d850 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20  open those VDBE 
2d860 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73  cursors.** and s
2d870 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
2d880 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
2d890 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65  ode to close the
2d8a0 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  m..**.** The cod
2d8b0 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 57 68  e that sqlite3Wh
2d8c0 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72  ereBegin() gener
2d8d0 61 74 65 73 20 6c 65 61 76 65 73 20 74 68 65 20  ates leaves the 
2d8e0 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a  cursors named.**
2d8f0 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69   in pTabList poi
2d900 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72 20 61  nting at their a
2d910 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69  ppropriate entri
2d920 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63  es.  The [...] c
2d930 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f  ode.** can use O
2d940 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f  P_Column and OP_
2d950 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e  Rowid opcodes on
2d960 20 74 68 65 73 65 20 63 75 72 73 6f 72 73 20 74   these cursors t
2d970 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74  o extract.** dat
2d980 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f  a from the vario
2d990 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65  us tables of the
2d9a0 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   loop..**.** If 
2d9b0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2d9c0 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66   is empty, the f
2d9d0 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73  oreach loops mus
2d9e0 74 20 65 61 63 68 20 73 63 61 6e 20 74 68 65 69  t each scan thei
2d9f0 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c  r.** entire tabl
2da00 65 73 2e 20 20 54 68 75 73 20 61 20 74 68 72 65  es.  Thus a thre
2da10 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e  e-way join is an
2da20 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f   O(N^3) operatio
2da30 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68  n.  But if.** th
2da40 65 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e  e tables have in
2da50 64 69 63 65 73 20 61 6e 64 20 74 68 65 72 65 20  dices and there 
2da60 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65  are terms in the
2da70 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
2da80 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74  at.** refer to t
2da90 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20  hose indices, a 
2daa0 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73  complete table s
2dab0 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64  can can be avoid
2dac0 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f  ed and the.** co
2dad0 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68  de will run much
2dae0 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f   faster.  Most o
2daf0 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68  f the work of th
2db00 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68  is routine is ch
2db10 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65  ecking.** to see
2db20 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e   if there are in
2db30 64 69 63 65 73 20 74 68 61 74 20 63 61 6e 20 62  dices that can b
2db40 65 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  e used to speed 
2db50 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a  up the loop..**.
2db60 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20  ** Terms of the 
2db70 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 72 65  WHERE clause are
2db80 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69   also used to li
2db90 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73 20 61  mit which rows a
2dba0 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20  ctually.** make 
2dbb0 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20  it to the "..." 
2dbc0 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
2dbd0 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65   the loop.  Afte
2dbe0 72 20 65 61 63 68 20 22 66 6f 72 65 61 63 68 22  r each "foreach"
2dbf0 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68  ,.** terms of th
2dc00 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
2dc10 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72  hat use only ter
2dc20 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20  ms in that loop 
2dc30 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f  and outer.** loo
2dc40 70 73 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ps are evaluated
2dc50 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20   and if false a 
2dc60 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f  jump is made aro
2dc70 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65  und all subseque
2dc80 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70  nt.** inner loop
2dc90 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65  s (or around the
2dca0 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65   "..." if the te
2dcb0 73 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  st occurs within
2dcc0 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d   the inner-.** m
2dcd0 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20  ost loop).**.** 
2dce0 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a  OUTER JOINS.**.*
2dcf0 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20  * An outer join 
2dd00 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64  of tables t1 and
2dd10 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c   t2 is conceptal
2dd20 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c  ly coded as foll
2dd30 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f  ows:.**.**    fo
2dd40 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31  reach row1 in t1
2dd50 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67   do.**      flag
2dd60 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72   = 0.**      for
2dd70 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20  each row2 in t2 
2dd80 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61  do.**        sta
2dd90 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  rt:.**          
2dda0 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
2ddb0 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20  flag = 1.**     
2ddc0 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20   end.**      if 
2ddd0 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20  flag==0 then.** 
2dde0 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20         move the 
2ddf0 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61  row2 cursor to a
2de00 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20   null row.**    
2de10 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a      goto start.*
2de20 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20  *      fi.**    
2de30 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20  end.**.** ORDER 
2de40 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53  BY CLAUSE PROCES
2de50 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65  SING.**.** pOrde
2de60 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72  rBy is a pointer
2de70 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
2de80 20 63 6c 61 75 73 65 20 28 6f 72 20 74 68 65 20   clause (or the 
2de90 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a  GROUP BY clause.
2dea0 2a 2a 20 69 66 20 74 68 65 20 57 48 45 52 45 5f  ** if the WHERE_
2deb0 47 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20  GROUPBY flag is 
2dec0 73 65 74 20 69 6e 20 77 63 74 72 6c 46 6c 61 67  set in wctrlFlag
2ded0 73 29 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  s) of a SELECT s
2dee0 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 66 20 74  tatement.** if t
2def0 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66  here is one.  If
2df00 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
2df10 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20  ER BY clause or 
2df20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  if this routine.
2df30 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f  ** is called fro
2df40 6d 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44  m an UPDATE or D
2df50 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c  ELETE statement,
2df60 20 74 68 65 6e 20 70 4f 72 64 65 72 42 79 20 69   then pOrderBy i
2df70 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  s NULL..**.** Th
2df80 65 20 69 49 64 78 43 75 72 20 70 61 72 61 6d 65  e iIdxCur parame
2df90 74 65 72 20 69 73 20 74 68 65 20 63 75 72 73 6f  ter is the curso
2dfa0 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 69  r number of an i
2dfb0 6e 64 65 78 2e 20 20 49 66 20 0a 2a 2a 20 57 48  ndex.  If .** WH
2dfc0 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
2dfd0 59 20 69 73 20 73 65 74 2c 20 69 49 64 78 43 75  Y is set, iIdxCu
2dfe0 72 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20  r is the cursor 
2dff0 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64  number of an ind
2e000 65 78 0a 2a 2a 20 74 6f 20 75 73 65 20 66 6f 72  ex.** to use for
2e010 20 4f 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65   OR clause proce
2e020 73 73 69 6e 67 2e 20 20 54 68 65 20 57 48 45 52  ssing.  The WHER
2e030 45 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  E clause should 
2e040 75 73 65 20 74 68 69 73 0a 2a 2a 20 73 70 65 63  use this.** spec
2e050 69 66 69 63 20 63 75 72 73 6f 72 2e 20 20 49 66  ific cursor.  If
2e060 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
2e070 45 53 49 52 45 44 20 69 73 20 73 65 74 2c 20 74  ESIRED is set, t
2e080 68 65 6e 20 69 49 64 78 43 75 72 20 69 73 0a 2a  hen iIdxCur is.*
2e090 2a 20 74 68 65 20 66 69 72 73 74 20 63 75 72 73  * the first curs
2e0a0 6f 72 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  or in an array o
2e0b0 66 20 63 75 72 73 6f 72 73 20 66 6f 72 20 61 6c  f cursors for al
2e0c0 6c 20 69 6e 64 69 63 65 73 2e 20 20 69 49 64 78  l indices.  iIdx
2e0d0 43 75 72 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  Cur should.** be
2e0e0 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
2e0f0 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
2e100 20 63 75 72 73 6f 72 20 64 65 70 65 6e 64 69 6e   cursor dependin
2e110 67 20 6f 6e 20 77 68 69 63 68 20 69 6e 64 65 78  g on which index
2e120 20 69 73 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a   is.** used..*/.
2e130 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74  WhereInfo *sqlit
2e140 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20  e3WhereBegin(.  
2e150 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2e160 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
2e170 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
2e180 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
2e190 73 74 2c 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  st,    /* FROM c
2e1a0 6c 61 75 73 65 3a 20 41 20 6c 69 73 74 20 6f 66  lause: A list of
2e1b0 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62   all tables to b
2e1c0 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45  e scanned */.  E
2e1d0 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
2e1e0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
2e1f0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
2e200 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
2e210 2c 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20  ,   /* An ORDER 
2e220 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29  BY (or GROUP BY)
2e230 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c   clause, or NULL
2e240 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
2e250 70 52 65 73 75 6c 74 53 65 74 2c 20 2f 2a 20 52  pResultSet, /* R
2e260 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
2e270 20 71 75 65 72 79 20 2a 2f 0a 20 20 75 31 36 20   query */.  u16 
2e280 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20  wctrlFlags,     
2e290 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
2e2a0 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65  WHERE_* flags de
2e2b0 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49  fined in sqliteI
2e2c0 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69 49  nt.h */.  int iI
2e2d0 64 78 43 75 72 20 20 20 20 20 20 20 20 20 20 20  dxCur           
2e2e0 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 54  /* If WHERE_ONET
2e2f0 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74  ABLE_ONLY is set
2e300 2c 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 6e  , index cursor n
2e310 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e  umber */.){.  in
2e320 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20 20  t nByteWInfo;   
2e330 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e           /* Num.
2e340 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
2e350 20 66 6f 72 20 57 68 65 72 65 49 6e 66 6f 20 73   for WhereInfo s
2e360 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  truct */.  int n
2e370 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20  TabList;        
2e380 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2e390 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70  of elements in p
2e3a0 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65  TabList */.  Whe
2e3b0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
2e3c0 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20          /* Will 
2e3d0 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72  become the retur
2e3e0 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
2e3f0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64  function */.  Vd
2e400 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
2e410 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20  pVdbe;   /* The 
2e420 76 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65  virtual database
2e430 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74   engine */.  Bit
2e440 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20  mask notReady;  
2e450 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
2e460 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
2e470 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a  yet positioned *
2e480 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  /.  WhereLoopBui
2e490 6c 64 65 72 20 73 57 4c 42 3b 20 20 20 20 20 2f  lder sWLB;     /
2e4a0 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  * The WhereLoop 
2e4b0 62 75 69 6c 64 65 72 20 2a 2f 0a 20 20 57 68 65  builder */.  Whe
2e4c0 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
2e4d0 53 65 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 65  Set;    /* The e
2e4e0 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73  xpression mask s
2e4f0 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  et */.  WhereLev
2e500 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20  el *pLevel;     
2e510 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c     /* A single l
2e520 65 76 65 6c 20 69 6e 20 70 57 49 6e 66 6f 2d 3e  evel in pWInfo->
2e530 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  a[] */.  WhereLo
2e540 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  op *pLoop;      
2e550 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2e560 6f 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65  o a single Where
2e570 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  Loop object */. 
2e580 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
2e590 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2e5a0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
2e5b0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
2e5c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2e5d0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2e5e0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  on */.  int rc; 
2e5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e600 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2e610 65 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 56 61 72 69  e */...  /* Vari
2e620 61 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74  able initializat
2e630 69 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  ion */.  db = pP
2e640 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73  arse->db;.  mems
2e650 65 74 28 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a  et(&sWLB, 0, siz
2e660 65 6f 66 28 73 57 4c 42 29 29 3b 0a 0a 20 20 2f  eof(sWLB));..  /
2e670 2a 20 41 6e 20 4f 52 44 45 52 2f 47 52 4f 55 50  * An ORDER/GROUP
2e680 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20 6d 6f   BY clause of mo
2e690 72 65 20 74 68 61 6e 20 36 33 20 74 65 72 6d 73  re than 63 terms
2e6a0 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d   cannot be optim
2e6b0 69 7a 65 64 20 2a 2f 0a 20 20 74 65 73 74 63 61  ized */.  testca
2e6c0 73 65 28 20 70 4f 72 64 65 72 42 79 20 26 26 20  se( pOrderBy && 
2e6d0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d  pOrderBy->nExpr=
2e6e0 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20  =BMS-1 );.  if( 
2e6f0 70 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72 64  pOrderBy && pOrd
2e700 65 72 42 79 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53  erBy->nExpr>=BMS
2e710 20 29 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b   ) pOrderBy = 0;
2e720 0a 20 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79  .  sWLB.pOrderBy
2e730 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20   = pOrderBy;..  
2e740 2f 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20 44  /* Disable the D
2e750 49 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61  ISTINCT optimiza
2e760 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44  tion if SQLITE_D
2e770 69 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65  istinctOpt is se
2e780 74 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74  t via.  ** sqlit
2e790 65 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c  e3_test_ctrl(SQL
2e7a0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54  ITE_TESTCTRL_OPT
2e7b0 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20  IMIZATIONS,...) 
2e7c0 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a  */.  if( Optimiz
2e7d0 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62  ationDisabled(db
2e7e0 2c 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63  , SQLITE_Distinc
2e7f0 74 4f 70 74 29 20 29 7b 0a 20 20 20 20 77 63 74  tOpt) ){.    wct
2e800 72 6c 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52  rlFlags &= ~WHER
2e810 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b  E_WANT_DISTINCT;
2e820 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e  .  }..  /* The n
2e830 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20  umber of tables 
2e840 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2e850 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79  se is limited by
2e860 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
2e870 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69   ** bits in a Bi
2e880 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65  tmask .  */.  te
2e890 73 74 63 61 73 65 28 20 70 54 61 62 4c 69 73 74  stcase( pTabList
2e8a0 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20  ->nSrc==BMS );. 
2e8b0 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e   if( pTabList->n
2e8c0 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73  Src>BMS ){.    s
2e8d0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2e8e0 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20  Parse, "at most 
2e8f0 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a  %d tables in a j
2e900 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20  oin", BMS);.    
2e910 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
2e920 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
2e930 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72  n normally gener
2e940 61 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f  ates a nested lo
2e950 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  op for all table
2e960 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c  s in .  ** pTabL
2e970 69 73 74 2e 20 20 42 75 74 20 69 66 20 74 68 65  ist.  But if the
2e980 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
2e990 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74  ONLY flag is set
2e9a0 2c 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64  , then we should
2e9b0 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72  .  ** only gener
2e9c0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
2e9d0 20 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20   first table in 
2e9e0 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73  pTabList and ass
2e9f0 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e  ume that.  ** an
2ea00 79 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69  y cursors associ
2ea10 61 74 65 64 20 77 69 74 68 20 73 75 62 73 65 71  ated with subseq
2ea20 75 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20  uent tables are 
2ea30 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  uninitialized.. 
2ea40 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d   */.  nTabList =
2ea50 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
2ea60 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
2ea70 4c 59 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69  LY) ? 1 : pTabLi
2ea80 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20  st->nSrc;..  /* 
2ea90 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
2eaa0 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72  tialize the Wher
2eab0 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  eInfo structure 
2eac0 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  that will become
2ead0 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e   the.  ** return
2eae0 20 76 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65   value. A single
2eaf0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75   allocation is u
2eb00 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
2eb10 20 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20   WhereInfo.  ** 
2eb20 73 74 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74  struct, the cont
2eb30 65 6e 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66  ents of WhereInf
2eb40 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65  o.a[], the Where
2eb50 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
2eb60 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68  .  ** and the Wh
2eb70 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63  ereMaskSet struc
2eb80 74 75 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72  ture. Since Wher
2eb90 65 43 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73  eClause contains
2eba0 20 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20   an 8-byte.  ** 
2ebb0 66 69 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d  field (type Bitm
2ebc0 61 73 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20  ask) it must be 
2ebd0 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d  aligned on an 8-
2ebe0 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e  byte boundary on
2ebf0 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69  .  ** some archi
2ec00 74 65 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20  tectures. Hence 
2ec10 74 68 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c  the ROUND8() bel
2ec20 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65  ow..  */.  nByte
2ec30 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73  WInfo = ROUND8(s
2ec40 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29  izeof(WhereInfo)
2ec50 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69  +(nTabList-1)*si
2ec60 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29  zeof(WhereLevel)
2ec70 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71  );.  pWInfo = sq
2ec80 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
2ec90 6f 28 64 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f  o(db, nByteWInfo
2eca0 20 2b 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c   + sizeof(WhereL
2ecb0 6f 6f 70 29 29 3b 0a 20 20 69 66 28 20 64 62 2d  oop));.  if( db-
2ecc0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
2ecd0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
2ece0 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
2ecf0 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a      pWInfo = 0;.
2ed00 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
2ed10 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  ginError;.  }.  
2ed20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65  pWInfo->aiCurOne
2ed30 50 61 73 73 5b 30 5d 20 3d 20 70 57 49 6e 66 6f  Pass[0] = pWInfo
2ed40 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31  ->aiCurOnePass[1
2ed50 5d 20 3d 20 2d 31 3b 0a 20 20 70 57 49 6e 66 6f  ] = -1;.  pWInfo
2ed60 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c  ->nLevel = nTabL
2ed70 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  ist;.  pWInfo->p
2ed80 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
2ed90 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69    pWInfo->pTabLi
2eda0 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
2edb0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
2edc0 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
2edd0 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53  pWInfo->pResultS
2ede0 65 74 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b  et = pResultSet;
2edf0 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  .  pWInfo->iBrea
2ee00 6b 20 3d 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e  k = pWInfo->iCon
2ee10 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56  tinue = sqlite3V
2ee20 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
2ee30 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  .  pWInfo->wctrl
2ee40 46 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61  Flags = wctrlFla
2ee50 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61  gs;.  pWInfo->sa
2ee60 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  vedNQueryLoop = 
2ee70 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
2ee80 6f 70 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d  op;.  pMaskSet =
2ee90 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53   &pWInfo->sMaskS
2eea0 65 74 3b 0a 20 20 73 57 4c 42 2e 70 57 49 6e 66  et;.  sWLB.pWInf
2eeb0 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 73 57  o = pWInfo;.  sW
2eec0 4c 42 2e 70 57 43 20 3d 20 26 70 57 49 6e 66 6f  LB.pWC = &pWInfo
2eed0 2d 3e 73 57 43 3b 0a 20 20 73 57 4c 42 2e 70 4e  ->sWC;.  sWLB.pN
2eee0 65 77 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a  ew = (WhereLoop*
2eef0 29 28 28 28 63 68 61 72 2a 29 70 57 49 6e 66 6f  )(((char*)pWInfo
2ef00 29 2b 6e 42 79 74 65 57 49 6e 66 6f 29 3b 0a 20  )+nByteWInfo);. 
2ef10 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
2ef20 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 73 57  YTE_ALIGNMENT(sW
2ef30 4c 42 2e 70 4e 65 77 29 20 29 3b 0a 20 20 77 68  LB.pNew) );.  wh
2ef40 65 72 65 4c 6f 6f 70 49 6e 69 74 28 73 57 4c 42  ereLoopInit(sWLB
2ef50 2e 70 4e 65 77 29 3b 0a 23 69 66 64 65 66 20 53  .pNew);.#ifdef S
2ef60 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73 57  QLITE_DEBUG.  sW
2ef70 4c 42 2e 70 4e 65 77 2d 3e 63 49 64 20 3d 20 27  LB.pNew->cId = '
2ef80 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  *';.#endif..  /*
2ef90 20 53 70 6c 69 74 20 74 68 65 20 57 48 45 52 45   Split the WHERE
2efa0 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70   clause into sep
2efb0 61 72 61 74 65 20 73 75 62 65 78 70 72 65 73 73  arate subexpress
2efc0 69 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a  ions where each.
2efd0 20 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69    ** subexpressi
2efe0 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20  on is separated 
2eff0 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  by an AND operat
2f000 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d  or..  */.  initM
2f010 61 73 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29  askSet(pMaskSet)
2f020 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 49  ;.  whereClauseI
2f030 6e 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  nit(&pWInfo->sWC
2f040 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 77 68 65  , pWInfo);.  whe
2f050 72 65 53 70 6c 69 74 28 26 70 57 49 6e 66 6f 2d  reSplit(&pWInfo-
2f060 3e 73 57 43 2c 20 70 57 68 65 72 65 2c 20 54 4b  >sWC, pWhere, TK
2f070 5f 41 4e 44 29 3b 0a 20 20 20 20 0a 20 20 2f 2a  _AND);.    .  /*
2f080 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 61   Special case: a
2f090 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
2f0a0 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20  at is constant. 
2f0b0 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20 20   Evaluate the.  
2f0c0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ** expression an
2f0d0 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f 76  d either jump ov
2f0e0 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f  er all of the co
2f0f0 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e  de or fall thru.
2f100 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  .  */.  for(ii=0
2f110 3b 20 69 69 3c 73 57 4c 42 2e 70 57 43 2d 3e 6e  ; ii<sWLB.pWC->n
2f120 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Term; ii++){.   
2f130 20 69 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30   if( nTabList==0
2f140 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49   || sqlite3ExprI
2f150 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e  sConstantNotJoin
2f160 28 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d  (sWLB.pWC->a[ii]
2f170 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
2f180 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
2f190 6c 73 65 28 70 50 61 72 73 65 2c 20 73 57 4c 42  lse(pParse, sWLB
2f1a0 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 70 45 78 70  .pWC->a[ii].pExp
2f1b0 72 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  r, pWInfo->iBrea
2f1c0 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k,.             
2f1d0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
2f1e0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
2f1f0 20 20 20 20 20 20 73 57 4c 42 2e 70 57 43 2d 3e        sWLB.pWC->
2f200 61 5b 69 69 5d 2e 77 74 46 6c 61 67 73 20 7c 3d  a[ii].wtFlags |=
2f210 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20   TERM_CODED;.   
2f220 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65   }.  }..  /* Spe
2f230 63 69 61 6c 20 63 61 73 65 3a 20 4e 6f 20 46 52  cial case: No FR
2f240 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  OM clause.  */. 
2f250 20 69 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30   if( nTabList==0
2f260 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 72 64   ){.    if( pOrd
2f270 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e  erBy ) pWInfo->n
2f280 4f 42 53 61 74 20 3d 20 70 4f 72 64 65 72 42 79  OBSat = pOrderBy
2f290 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ->nExpr;.    if(
2f2a0 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
2f2b0 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
2f2c0 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  T ){.      pWInf
2f2d0 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
2f2e0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
2f2f0 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  IQUE;.    }.  }.
2f300 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62  .  /* Assign a b
2f310 69 74 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d  it from the bitm
2f320 61 73 6b 20 74 6f 20 65 76 65 72 79 20 74 65 72  ask to every ter
2f330 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  m in the FROM cl
2f340 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ause..  **.  ** 
2f350 57 68 65 6e 20 61 73 73 69 67 6e 69 6e 67 20 62  When assigning b
2f360 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 74 6f  itmask values to
2f370 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 63 75 72   FROM clause cur
2f380 73 6f 72 73 2c 20 69 74 20 6d 75 73 74 20 62 65  sors, it must be
2f390 0a 20 20 2a 2a 20 74 68 65 20 63 61 73 65 20 74  .  ** the case t
2f3a0 68 61 74 20 69 66 20 58 20 69 73 20 74 68 65 20  hat if X is the 
2f3b0 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20  bitmask for the 
2f3c0 4e 2d 74 68 20 46 52 4f 4d 20 63 6c 61 75 73 65  N-th FROM clause
2f3d0 20 74 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20   term then.  ** 
2f3e0 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20  the bitmask for 
2f3f0 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  all FROM clause 
2f400 74 65 72 6d 73 20 74 6f 20 74 68 65 20 6c 65 66  terms to the lef
2f410 74 20 6f 66 20 74 68 65 20 4e 2d 74 68 20 74 65  t of the N-th te
2f420 72 6d 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31 29  rm.  ** is (X-1)
2f430 2e 20 20 20 41 6e 20 65 78 70 72 65 73 73 69 6f  .   An expressio
2f440 6e 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c  n from the ON cl
2f450 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  ause of a LEFT J
2f460 4f 49 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a  OIN can use.  **
2f470 20 69 74 73 20 45 78 70 72 2e 69 52 69 67 68 74   its Expr.iRight
2f480 4a 6f 69 6e 54 61 62 6c 65 20 76 61 6c 75 65 20  JoinTable value 
2f490 74 6f 20 66 69 6e 64 20 74 68 65 20 62 69 74 6d  to find the bitm
2f4a0 61 73 6b 20 6f 66 20 74 68 65 20 72 69 67 68 74  ask of the right
2f4b0 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74   table.  ** of t
2f4c0 68 65 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61  he join.  Subtra
2f4d0 63 74 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74  cting one from t
2f4e0 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 62  he right table b
2f4f0 69 74 6d 61 73 6b 20 67 69 76 65 73 20 61 0a 20  itmask gives a. 
2f500 20 2a 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72 20   ** bitmask for 
2f510 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68  all tables to th
2f520 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f  e left of the jo
2f530 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65  in.  Knowing the
2f540 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f   bitmask.  ** fo
2f550 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  r all tables to 
2f560 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65  the left of a le
2f570 66 74 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72  ft join is impor
2f580 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20 23 33  tant.  Ticket #3
2f590 30 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  015..  **.  ** N
2f5a0 6f 74 65 20 74 68 61 74 20 62 69 74 6d 61 73 6b  ote that bitmask
2f5b0 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f  s are created fo
2f5c0 72 20 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e  r all pTabList->
2f5d0 6e 53 72 63 20 74 61 62 6c 65 73 20 69 6e 0a 20  nSrc tables in. 
2f5e0 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f   ** pTabList, no
2f5f0 74 20 6a 75 73 74 20 74 68 65 20 66 69 72 73 74  t just the first
2f600 20 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65 73   nTabList tables
2f610 2e 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20 6e  .  nTabList is n
2f620 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75  ormally.  ** equ
2f630 61 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e  al to pTabList->
2f640 6e 53 72 63 20 62 75 74 20 6d 69 67 68 74 20 62  nSrc but might b
2f650 65 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20 31  e shortened to 1
2f660 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 57 48 45   if the.  ** WHE
2f670 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
2f680 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20 20   flag is set..  
2f690 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
2f6a0 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
2f6b0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65  ; ii++){.    cre
2f6c0 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  ateMask(pMaskSet
2f6d0 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69  , pTabList->a[ii
2f6e0 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a  ].iCursor);.  }.
2f6f0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
2f700 20 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74   {.    Bitmask t
2f710 6f 54 68 65 4c 65 66 74 20 3d 20 30 3b 0a 20 20  oTheLeft = 0;.  
2f720 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
2f730 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
2f740 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 69 74 6d  i++){.      Bitm
2f750 61 73 6b 20 6d 20 3d 20 73 71 6c 69 74 65 33 57  ask m = sqlite3W
2f760 68 65 72 65 47 65 74 4d 61 73 6b 28 70 4d 61 73  hereGetMask(pMas
2f770 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e  kSet, pTabList->
2f780 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  a[ii].iCursor);.
2f790 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 6d        assert( (m
2f7a0 2d 31 29 3d 3d 74 6f 54 68 65 4c 65 66 74 20 29  -1)==toTheLeft )
2f7b0 3b 0a 20 20 20 20 20 20 74 6f 54 68 65 4c 65 66  ;.      toTheLef
2f7c0 74 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20 20  t |= m;.    }.  
2f7d0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  }.#endif..  /* A
2f7e0 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68  nalyze all of th
2f7f0 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73  e subexpressions
2f800 2e 20 2a 2f 0a 20 20 65 78 70 72 41 6e 61 6c 79  . */.  exprAnaly
2f810 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20  zeAll(pTabList, 
2f820 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20  &pWInfo->sWC);. 
2f830 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2f840 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65  ailed ) goto whe
2f850 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20  reBeginError;.. 
2f860 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20   if( wctrlFlags 
2f870 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  & WHERE_WANT_DIS
2f880 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 69 66 28  TINCT ){.    if(
2f890 20 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e   isDistinctRedun
2f8a0 64 61 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61  dant(pParse, pTa
2f8b0 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e  bList, &pWInfo->
2f8c0 73 57 43 2c 20 70 52 65 73 75 6c 74 53 65 74 29  sWC, pResultSet)
2f8d0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
2f8e0 20 44 49 53 54 49 4e 43 54 20 6d 61 72 6b 69 6e   DISTINCT markin
2f8f0 67 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 2e 20  g is pointless. 
2f900 20 49 67 6e 6f 72 65 20 69 74 2e 20 2a 2f 0a 20   Ignore it. */. 
2f910 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69       pWInfo->eDi
2f920 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
2f930 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a  ISTINCT_UNIQUE;.
2f940 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
2f950 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
2f960 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 4f 52 44     /* Try to ORD
2f970 45 52 20 42 59 20 74 68 65 20 72 65 73 75 6c 74  ER BY the result
2f980 20 73 65 74 20 74 6f 20 6d 61 6b 65 20 64 69 73   set to make dis
2f990 74 69 6e 63 74 20 70 72 6f 63 65 73 73 69 6e 67  tinct processing
2f9a0 20 65 61 73 69 65 72 20 2a 2f 0a 20 20 20 20 20   easier */.     
2f9b0 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
2f9c0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 44 49 53  ags |= WHERE_DIS
2f9d0 54 49 4e 43 54 42 59 3b 0a 20 20 20 20 20 20 70  TINCTBY;.      p
2f9e0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
2f9f0 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20  = pResultSet;.  
2fa00 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f    }.  }..  /* Co
2fa10 6e 73 74 72 75 63 74 20 74 68 65 20 57 68 65 72  nstruct the Wher
2fa20 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f  eLoop objects */
2fa30 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78  .  WHERETRACE(0x
2fa40 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d  ffff,("*** Optim
2fa50 69 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e  izer Start ***\n
2fa60 22 29 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  "));.#if defined
2fa70 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42  (WHERETRACE_ENAB
2fa80 4c 45 44 29 0a 20 20 69 66 28 20 73 71 6c 69 74  LED).  if( sqlit
2fa90 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
2faa0 78 31 30 30 20 29 7b 20 2f 2a 20 44 69 73 70 6c  x100 ){ /* Displ
2fab0 61 79 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  ay all terms of 
2fac0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2fad0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   */.    int i;. 
2fae0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 57     for(i=0; i<sW
2faf0 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69  LB.pWC->nTerm; i
2fb00 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  ++){.      where
2fb10 54 65 72 6d 50 72 69 6e 74 28 26 73 57 4c 42 2e  TermPrint(&sWLB.
2fb20 70 57 43 2d 3e 61 5b 69 5d 2c 20 69 29 3b 0a 20  pWC->a[i], i);. 
2fb30 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
2fb40 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 21  .  if( nTabList!
2fb50 3d 31 20 7c 7c 20 77 68 65 72 65 53 68 6f 72 74  =1 || whereShort
2fb60 43 75 74 28 26 73 57 4c 42 29 3d 3d 30 20 29 7b  Cut(&sWLB)==0 ){
2fb70 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c  .    rc = whereL
2fb80 6f 6f 70 41 64 64 41 6c 6c 28 26 73 57 4c 42 29  oopAddAll(&sWLB)
2fb90 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
2fba0 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
2fbb0 72 6f 72 3b 0a 20 20 0a 23 69 66 64 65 66 20 57  ror;.  .#ifdef W
2fbc0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
2fbd0 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  D.    if( sqlite
2fbe0 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 20 20  3WhereTrace ){  
2fbf0 20 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c    /* Display all
2fc00 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   of the WhereLoo
2fc10 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 20  p objects */.   
2fc20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b     WhereLoop *p;
2fc30 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
2fc40 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
2fc50 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d   char zLabel[] =
2fc60 20 22 30 31 32 33 34 35 36 37 38 39 61 62 63 64   "0123456789abcd
2fc70 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
2fc80 75 76 77 79 78 7a 22 0a 20 20 20 20 20 20 20 20  uvwyxz".        
2fc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fcb0 20 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a       "ABCDEFGHIJ
2fcc0 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59 58 5a  KLMNOPQRSTUVWYXZ
2fcd0 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70  ";.      for(p=p
2fce0 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69  WInfo->pLoops, i
2fcf0 3d 30 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  =0; p; p=p->pNex
2fd00 74 4c 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20 20  tLoop, i++){.   
2fd10 20 20 20 20 20 70 2d 3e 63 49 64 20 3d 20 7a 4c       p->cId = zL
2fd20 61 62 65 6c 5b 69 25 73 69 7a 65 6f 66 28 7a 4c  abel[i%sizeof(zL
2fd30 61 62 65 6c 29 5d 3b 0a 20 20 20 20 20 20 20 20  abel)];.        
2fd40 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
2fd50 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20  , sWLB.pWC);.   
2fd60 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
2fd70 66 0a 20 20 0a 20 20 20 20 77 68 65 72 65 50 61  f.  .    wherePa
2fd80 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c  thSolver(pWInfo,
2fd90 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d   0);.    if( db-
2fda0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
2fdb0 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
2fdc0 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 57  rror;.    if( pW
2fdd0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29  Info->pOrderBy )
2fde0 7b 0a 20 20 20 20 20 20 20 77 68 65 72 65 50 61  {.       wherePa
2fdf0 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c  thSolver(pWInfo,
2fe00 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
2fe10 2b 31 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20  +1);.       if( 
2fe20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2fe30 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
2fe40 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  inError;.    }. 
2fe50 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d   }.  if( pWInfo-
2fe60 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20  >pOrderBy==0 && 
2fe70 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
2fe80 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72  ITE_ReverseOrder
2fe90 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 70 57 49  )!=0 ){.     pWI
2fea0 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 28  nfo->revMask = (
2feb0 42 69 74 6d 61 73 6b 29 28 2d 31 29 3b 0a 20 20  Bitmask)(-1);.  
2fec0 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
2fed0 6e 45 72 72 20 7c 7c 20 4e 45 56 45 52 28 64 62  nErr || NEVER(db
2fee0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20  ->mallocFailed) 
2fef0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72  ){.    goto wher
2ff00 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d  eBeginError;.  }
2ff10 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
2ff20 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
2ff30 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
2ff40 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ce ){.    sqlite
2ff50 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d  3DebugPrintf("--
2ff60 2d 2d 20 53 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77  -- Solution nRow
2ff70 3d 25 64 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52  =%d", pWInfo->nR
2ff80 6f 77 4f 75 74 29 3b 0a 20 20 20 20 69 66 28 20  owOut);.    if( 
2ff90 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3e 30  pWInfo->nOBSat>0
2ffa0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2ffb0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 4f  3DebugPrintf(" O
2ffc0 52 44 45 52 42 59 3d 25 64 2c 30 78 25 6c 6c 78  RDERBY=%d,0x%llx
2ffd0 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61  ", pWInfo->nOBSa
2ffe0 74 2c 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61  t, pWInfo->revMa
2fff0 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  sk);.    }.    s
30000 77 69 74 63 68 28 20 70 57 49 6e 66 6f 2d 3e 65  witch( pWInfo->e
30010 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
30020 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
30030 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a  TINCT_UNIQUE: {.
30040 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
30050 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49  ebugPrintf("  DI
30060 53 54 49 4e 43 54 3d 75 6e 69 71 75 65 22 29 3b  STINCT=unique");
30070 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
30080 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
30090 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  se WHERE_DISTINC
300a0 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20  T_ORDERED: {.   
300b0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
300c0 67 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49  gPrintf("  DISTI
300d0 4e 43 54 3d 6f 72 64 65 72 65 64 22 29 3b 0a 20  NCT=ordered");. 
300e0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
300f0 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
30100 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
30110 55 4e 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20  UNORDERED: {.   
30120 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
30130 67 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49  gPrintf("  DISTI
30140 4e 43 54 3d 75 6e 6f 72 64 65 72 65 64 22 29 3b  NCT=unordered");
30150 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
30160 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
30170 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
30180 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20  intf("\n");.    
30190 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 57 49  for(ii=0; ii<pWI
301a0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 69 2b  nfo->nLevel; ii+
301b0 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c  +){.      whereL
301c0 6f 6f 70 50 72 69 6e 74 28 70 57 49 6e 66 6f 2d  oopPrint(pWInfo-
301d0 3e 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70 2c 20 73  >a[ii].pWLoop, s
301e0 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20 7d 0a  WLB.pWC);.    }.
301f0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20    }.#endif.  /* 
30200 41 74 74 65 6d 70 74 20 74 6f 20 6f 6d 69 74 20  Attempt to omit 
30210 74 61 62 6c 65 73 20 66 72 6f 6d 20 74 68 65 20  tables from the 
30220 6a 6f 69 6e 20 74 68 61 74 20 64 6f 20 6e 6f 74  join that do not
30230 20 65 66 66 65 63 74 20 74 68 65 20 72 65 73 75   effect the resu
30240 6c 74 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e  lt */.  if( pWIn
30250 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 0a 20 20  fo->nLevel>=2.  
30260 20 26 26 20 70 52 65 73 75 6c 74 53 65 74 21 3d   && pResultSet!=
30270 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61  0.   && Optimiza
30280 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
30290 53 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a  SQLITE_OmitNoopJ
302a0 6f 69 6e 29 0a 20 20 29 7b 0a 20 20 20 20 42 69  oin).  ){.    Bi
302b0 74 6d 61 73 6b 20 74 61 62 55 73 65 64 20 3d 20  tmask tabUsed = 
302c0 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
302d0 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 65  ge(pMaskSet, pRe
302e0 73 75 6c 74 53 65 74 29 3b 0a 20 20 20 20 69 66  sultSet);.    if
302f0 28 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20  ( sWLB.pOrderBy 
30300 29 20 74 61 62 55 73 65 64 20 7c 3d 20 65 78 70  ) tabUsed |= exp
30310 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
30320 70 4d 61 73 6b 53 65 74 2c 20 73 57 4c 42 2e 70  pMaskSet, sWLB.p
30330 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 77 68  OrderBy);.    wh
30340 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  ile( pWInfo->nLe
30350 76 65 6c 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20  vel>=2 ){.      
30360 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
30370 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20 70  , *pEnd;.      p
30380 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  Loop = pWInfo->a
30390 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d  [pWInfo->nLevel-
303a0 31 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20  1].pWLoop;.     
303b0 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 70 54   if( (pWInfo->pT
303c0 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d  abList->a[pLoop-
303d0 3e 69 54 61 62 5d 2e 6a 6f 69 6e 74 79 70 65 20  >iTab].jointype 
303e0 26 20 4a 54 5f 4c 45 46 54 29 3d 3d 30 20 29 20  & JT_LEFT)==0 ) 
303f0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28  break;.      if(
30400 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
30410 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
30420 43 54 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26  CT)==0.       &&
30430 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
30440 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29   & WHERE_ONEROW)
30450 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ==0.      ){.   
30460 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
30470 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 74    }.      if( (t
30480 61 62 55 73 65 64 20 26 20 70 4c 6f 6f 70 2d 3e  abUsed & pLoop->
30490 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 29 20 62  maskSelf)!=0 ) b
304a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 45 6e 64  reak;.      pEnd
304b0 20 3d 20 73 57 4c 42 2e 70 57 43 2d 3e 61 20 2b   = sWLB.pWC->a +
304c0 20 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d   sWLB.pWC->nTerm
304d0 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65 72  ;.      for(pTer
304e0 6d 3d 73 57 4c 42 2e 70 57 43 2d 3e 61 3b 20 70  m=sWLB.pWC->a; p
304f0 54 65 72 6d 3c 70 45 6e 64 3b 20 70 54 65 72 6d  Term<pEnd; pTerm
30500 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
30510 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
30520 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  ll & pLoop->mask
30530 53 65 6c 66 29 21 3d 30 0a 20 20 20 20 20 20 20  Self)!=0.       
30540 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f    && !ExprHasPro
30550 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
30560 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
30570 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
30580 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
30590 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
305a0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3c 70       if( pTerm<p
305b0 45 6e 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  End ) break;.   
305c0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
305d0 66 66 66 66 2c 20 28 22 2d 3e 20 64 72 6f 70 20  ffff, ("-> drop 
305e0 6c 6f 6f 70 20 25 63 20 6e 6f 74 20 75 73 65 64  loop %c not used
305f0 5c 6e 22 2c 20 70 4c 6f 6f 70 2d 3e 63 49 64 29  \n", pLoop->cId)
30600 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  );.      pWInfo-
30610 3e 6e 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20  >nLevel--;.     
30620 20 6e 54 61 62 4c 69 73 74 2d 2d 3b 0a 20 20 20   nTabList--;.   
30630 20 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52   }.  }.  WHERETR
30640 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a  ACE(0xffff,("***
30650 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73   Optimizer Finis
30660 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20  hed ***\n"));.  
30670 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
30680 6e 51 75 65 72 79 4c 6f 6f 70 20 2b 3d 20 70 57  nQueryLoop += pW
30690 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a  Info->nRowOut;..
306a0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c    /* If the call
306b0 65 72 20 69 73 20 61 6e 20 55 50 44 41 54 45 20  er is an UPDATE 
306c0 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
306d0 65 6e 74 20 74 68 61 74 20 69 73 20 72 65 71 75  ent that is requ
306e0 65 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75  esting.  ** to u
306f0 73 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c  se a one-pass al
30700 67 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d 69  gorithm, determi
30710 6e 65 20 69 66 20 74 68 69 73 20 69 73 20 61 70  ne if this is ap
30720 70 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a 20  propriate..  ** 
30730 54 68 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67  The one-pass alg
30740 6f 72 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b  orithm only work
30750 73 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63  s if the WHERE c
30760 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 73  lause constrains
30770 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d  .  ** the statem
30780 65 6e 74 20 74 6f 20 75 70 64 61 74 65 20 6f 72  ent to update or
30790 20 64 65 6c 65 74 65 20 61 20 73 69 6e 67 6c 65   delete a single
307a0 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   row..  */.  ass
307b0 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73  ert( (wctrlFlags
307c0 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
307d0 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20  _DESIRED)==0 || 
307e0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d  pWInfo->nLevel==
307f0 31 20 29 3b 0a 20 20 69 66 28 20 28 77 63 74 72  1 );.  if( (wctr
30800 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
30810 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 21  NEPASS_DESIRED)!
30820 3d 30 20 0a 20 20 20 26 26 20 28 70 57 49 6e 66  =0 .   && (pWInf
30830 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e  o->a[0].pWLoop->
30840 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
30850 4f 4e 45 52 4f 57 29 21 3d 30 20 29 7b 0a 20 20  ONEROW)!=0 ){.  
30860 20 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50    pWInfo->okOneP
30870 61 73 73 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  ass = 1;.    if(
30880 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 4c 69   HasRowid(pTabLi
30890 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 29 20 29  st->a[0].pTab) )
308a0 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
308b0 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46  a[0].pWLoop->wsF
308c0 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 49  lags &= ~WHERE_I
308d0 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  DX_ONLY;.    }. 
308e0 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c   }..  /* Open al
308f0 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  l tables in the 
30900 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e 79  pTabList and any
30910 20 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74 65   indices selecte
30920 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63  d for.  ** searc
30930 68 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c 65  hing those table
30940 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  s..  */.  for(ii
30950 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
30960 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61 62 4c 69 73  o->a; ii<nTabLis
30970 74 3b 20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b  t; ii++, pLevel+
30980 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
30990 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c  Tab;     /* Tabl
309a0 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20  e to open */.   
309b0 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
309c0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 61    /* Index of da
309d0 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
309e0 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f  g table/index */
309f0 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
30a00 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
30a10 65 6d 3b 0a 0a 20 20 20 20 70 54 61 62 49 74 65  em;..    pTabIte
30a20 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
30a30 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
30a40 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62  .    pTab = pTab
30a50 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
30a60 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
30a70 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
30a80 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
30a90 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65     pLoop = pLeve
30aa0 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69  l->pWLoop;.    i
30ab0 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  f( (pTab->tabFla
30ac0 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
30ad0 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70  l)!=0 || pTab->p
30ae0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
30af0 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
30b00 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64  .    }else.#ifnd
30b10 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
30b20 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
30b30 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
30b40 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
30b50 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a  UALTABLE)!=0 ){.
30b60 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
30b70 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74   *pVTab = (const
30b80 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47   char *)sqlite3G
30b90 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61  etVTable(db, pTa
30ba0 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b);.      int iC
30bb0 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
30bc0 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71  Cursor;.      sq
30bd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
30be0 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75  v, OP_VOpen, iCu
30bf0 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20  r, 0, 0, pVTab, 
30c00 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65  P4_VTAB);.    }e
30c10 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61  lse if( IsVirtua
30c20 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
30c30 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20   /* noop */.    
30c40 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
30c50 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
30c60 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
30c70 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20  _ONLY)==0.      
30c80 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67     && (wctrlFlag
30c90 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f  s & WHERE_OMIT_O
30ca0 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20 29 7b  PEN_CLOSE)==0 ){
30cb0 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  .      int op = 
30cc0 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20  OP_OpenRead;.   
30cd0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6f     if( pWInfo->o
30ce0 6b 4f 6e 65 50 61 73 73 20 29 7b 0a 20 20 20 20  kOnePass ){.    
30cf0 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e      op = OP_Open
30d00 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20 70  Write;.        p
30d10 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50  WInfo->aiCurOneP
30d20 61 73 73 5b 30 5d 20 3d 20 70 54 61 62 49 74 65  ass[0] = pTabIte
30d30 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
30d40 20 20 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    };.      sqlit
30d50 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
30d60 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  se, pTabItem->iC
30d70 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62  ursor, iDb, pTab
30d80 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 61 73 73  , op);.      ass
30d90 65 72 74 28 20 70 54 61 62 49 74 65 6d 2d 3e 69  ert( pTabItem->i
30da0 43 75 72 73 6f 72 3d 3d 70 4c 65 76 65 6c 2d 3e  Cursor==pLevel->
30db0 69 54 61 62 43 75 72 20 29 3b 0a 20 20 20 20 20  iTabCur );.     
30dc0 20 74 65 73 74 63 61 73 65 28 20 21 70 57 49 6e   testcase( !pWIn
30dd0 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26  fo->okOnePass &&
30de0 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53   pTab->nCol==BMS
30df0 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  -1 );.      test
30e00 63 61 73 65 28 20 21 70 57 49 6e 66 6f 2d 3e 6f  case( !pWInfo->o
30e10 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61 62  kOnePass && pTab
30e20 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20  ->nCol==BMS );. 
30e30 20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f       if( !pWInfo
30e40 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70  ->okOnePass && p
30e50 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 26 26  Tab->nCol<BMS &&
30e60 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
30e70 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  ){.        Bitma
30e80 73 6b 20 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  sk b = pTabItem-
30e90 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20  >colUsed;.      
30ea0 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20    int n = 0;.   
30eb0 20 20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d       for(; b; b=
30ec0 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20  b>>1, n++){}.   
30ed0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30ee0 43 68 61 6e 67 65 50 34 28 76 2c 20 73 71 6c 69  ChangeP4(v, sqli
30ef0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
30f00 64 72 28 76 29 2d 31 2c 20 0a 20 20 20 20 20 20  dr(v)-1, .      
30f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54        SQLITE_INT
30f30 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49  _TO_PTR(n), P4_I
30f40 4e 54 33 32 29 3b 0a 20 20 20 20 20 20 20 20 61  NT32);.        a
30f50 73 73 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e  ssert( n<=pTab->
30f60 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a  nCol );.      }.
30f70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30f80 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
30f90 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
30fa0 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54  Tab->tnum, 0, pT
30fb0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
30fc0 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  }.    if( pLoop-
30fd0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
30fe0 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20  _INDEXED ){.    
30ff0 20 20 49 6e 64 65 78 20 2a 70 49 78 20 3d 20 70    Index *pIx = p
31000 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
31010 6e 64 65 78 3b 0a 20 20 20 20 20 20 69 6e 74 20  ndex;.      int 
31020 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20  iIndexCur;.     
31030 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65   int op = OP_Ope
31040 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 2f 2a 20  nRead;.      /* 
31050 69 49 64 78 43 75 72 20 69 73 20 61 6c 77 61 79  iIdxCur is alway
31060 73 20 73 65 74 20 69 66 20 74 6f 20 61 20 70 6f  s set if to a po
31070 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20  sitive value if 
31080 4f 4e 45 50 41 53 53 20 69 73 20 70 6f 73 73 69  ONEPASS is possi
31090 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ble */.      ass
310a0 65 72 74 28 20 69 49 64 78 43 75 72 21 3d 30 20  ert( iIdxCur!=0 
310b0 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  || (pWInfo->wctr
310c0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
310d0 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d  NEPASS_DESIRED)=
310e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
310f0 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
31100 26 26 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49  && IsPrimaryKeyI
31110 6e 64 65 78 28 70 49 78 29 0a 20 20 20 20 20 20  ndex(pIx).      
31120 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20   && (wctrlFlags 
31130 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  & WHERE_ONETABLE
31140 5f 4f 4e 4c 59 29 21 3d 30 0a 20 20 20 20 20 20  _ONLY)!=0.      
31150 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
31160 69 73 20 69 73 20 6f 6e 65 20 74 65 72 6d 20 6f  is is one term o
31170 66 20 61 6e 20 4f 52 2d 6f 70 74 69 6d 69 7a 61  f an OR-optimiza
31180 74 69 6f 6e 20 75 73 69 6e 67 20 74 68 65 20 50  tion using the P
31190 52 49 4d 41 52 59 20 4b 45 59 20 6f 66 20 61 0a  RIMARY KEY of a.
311a0 20 20 20 20 20 20 20 20 2a 2a 20 57 49 54 48 4f          ** WITHO
311b0 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20  UT ROWID table. 
311c0 20 4e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 73   No need for a s
311d0 65 70 61 72 61 74 65 20 69 6e 64 65 78 20 2a 2f  eparate index */
311e0 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43  .        iIndexC
311f0 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ur = pLevel->iTa
31200 62 43 75 72 3b 0a 20 20 20 20 20 20 20 20 6f 70  bCur;.        op
31210 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
31220 65 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6f 6b  e if( pWInfo->ok
31230 4f 6e 65 50 61 73 73 20 29 7b 0a 20 20 20 20 20  OnePass ){.     
31240 20 20 20 49 6e 64 65 78 20 2a 70 4a 20 3d 20 70     Index *pJ = p
31250 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 70  TabItem->pTab->p
31260 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20 69  Index;.        i
31270 49 6e 64 65 78 43 75 72 20 3d 20 69 49 64 78 43  IndexCur = iIdxC
31280 75 72 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ur;.        asse
31290 72 74 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  rt( wctrlFlags &
312a0 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
312b0 45 53 49 52 45 44 20 29 3b 0a 20 20 20 20 20 20  ESIRED );.      
312c0 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28    while( ALWAYS(
312d0 70 4a 29 20 26 26 20 70 4a 21 3d 70 49 78 20 29  pJ) && pJ!=pIx )
312e0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 49 6e 64  {.          iInd
312f0 65 78 43 75 72 2b 2b 3b 0a 20 20 20 20 20 20 20  exCur++;.       
31300 20 20 20 70 4a 20 3d 20 70 4a 2d 3e 70 4e 65 78     pJ = pJ->pNex
31310 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
31320 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65       op = OP_Ope
31330 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20  nWrite;.        
31340 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65  pWInfo->aiCurOne
31350 50 61 73 73 5b 31 5d 20 3d 20 69 49 6e 64 65 78  Pass[1] = iIndex
31360 43 75 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Cur;.      }else
31370 20 69 66 28 20 69 49 64 78 43 75 72 20 26 26 20   if( iIdxCur && 
31380 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
31390 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
313a0 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)!=0 ){.       
313b0 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69 49 64   iIndexCur = iId
313c0 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 69 66  xCur;.        if
313d0 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
313e0 48 45 52 45 5f 52 45 4f 50 45 4e 5f 49 44 58 20  HERE_REOPEN_IDX 
313f0 29 20 6f 70 20 3d 20 4f 50 5f 52 65 6f 70 65 6e  ) op = OP_Reopen
31400 49 64 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Idx;.      }else
31410 7b 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78  {.        iIndex
31420 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Cur = pParse->nT
31430 61 62 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ab++;.      }.  
31440 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78      pLevel->iIdx
31450 43 75 72 20 3d 20 69 49 6e 64 65 78 43 75 72 3b  Cur = iIndexCur;
31460 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
31470 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  Ix->pSchema==pTa
31480 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  b->pSchema );.  
31490 20 20 20 20 61 73 73 65 72 74 28 20 69 49 6e 64      assert( iInd
314a0 65 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20  exCur>=0 );.    
314b0 20 20 69 66 28 20 6f 70 20 29 7b 0a 20 20 20 20    if( op ){.    
314c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
314d0 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 49 6e  ddOp3(v, op, iIn
314e0 64 65 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75  dexCur, pIx->tnu
314f0 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  m, iDb);.       
31500 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50   sqlite3VdbeSetP
31510 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c  4KeyInfo(pParse,
31520 20 70 49 78 29 3b 0a 20 20 20 20 20 20 20 20 69   pIx);.        i
31530 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
31540 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54  gs & WHERE_CONST
31550 52 41 49 4e 54 29 21 3d 30 0a 20 20 20 20 20 20  RAINT)!=0.      
31560 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73     && (pLoop->ws
31570 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43  Flags & (WHERE_C
31580 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
31590 45 5f 53 4b 49 50 53 43 41 4e 29 29 3d 3d 30 0a  E_SKIPSCAN))==0.
315a0 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
315b0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26  nfo->wctrlFlags&
315c0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
315d0 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b  N)==0.        ){
315e0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
315f0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
31600 2c 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 29  , OPFLAG_SEEKEQ)
31610 3b 20 2f 2a 20 48 69 6e 74 20 74 6f 20 43 4f 4d  ; /* Hint to COM
31620 44 42 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  DB2 */.        }
31630 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
31640 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
31650 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  Ix->zName));.   
31660 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
31670 66 28 20 69 44 62 3e 3d 30 20 29 20 73 71 6c 69  f( iDb>=0 ) sqli
31680 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
31690 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
316a0 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e  ;.  }.  pWInfo->
316b0 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  iTop = sqlite3Vd
316c0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
316d0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
316e0 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
316f0 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
31700 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
31710 74 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74  the code to do t
31720 68 65 20 73 65 61 72 63 68 2e 20 20 45 61 63 68  he search.  Each
31730 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
31740 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20  e for.  ** loop 
31750 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20  below generates 
31760 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c  code for a singl
31770 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66  e nested loop of
31780 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f   the VM.  ** pro
31790 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74  gram..  */.  not
317a0 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73  Ready = ~(Bitmas
317b0 6b 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b  k)0;.  for(ii=0;
317c0 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69   ii<nTabList; ii
317d0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  ++){.    int add
317e0 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 69 6e  rExplain;.    in
317f0 74 20 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70  t wsFlags;.    p
31800 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
31810 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 77 73 46 6c  >a[ii];.    wsFl
31820 61 67 73 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  ags = pLevel->pW
31830 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 23  Loop->wsFlags;.#
31840 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
31850 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
31860 45 58 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76  EX.    if( (pLev
31870 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c  el->pWLoop->wsFl
31880 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
31890 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20  _INDEX)!=0 ){.  
318a0 20 20 20 20 63 6f 6e 73 74 72 75 63 74 41 75 74      constructAut
318b0 6f 6d 61 74 69 63 49 6e 64 65 78 28 70 50 61 72  omaticIndex(pPar
318c0 73 65 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  se, &pWInfo->sWC
318d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
318e0 20 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70    &pTabList->a[p
318f0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2c 20 6e  Level->iFrom], n
31900 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 29  otReady, pLevel)
31910 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  ;.      if( db->
31920 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
31930 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
31940 72 6f 72 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ror;.    }.#endi
31950 66 0a 20 20 20 20 61 64 64 72 45 78 70 6c 61 69  f.    addrExplai
31960 6e 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  n = sqlite3Where
31970 45 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a  ExplainOneScan(.
31980 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
31990 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c  pTabList, pLevel
319a0 2c 20 69 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46  , ii, pLevel->iF
319b0 72 6f 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73 0a  rom, wctrlFlags.
319c0 20 20 20 20 29 3b 0a 20 20 20 20 70 4c 65 76 65      );.    pLeve
319d0 6c 2d 3e 61 64 64 72 42 6f 64 79 20 3d 20 73 71  l->addrBody = sq
319e0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
319f0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 6e 6f 74  Addr(v);.    not
31a00 52 65 61 64 79 20 3d 20 73 71 6c 69 74 65 33 57  Ready = sqlite3W
31a10 68 65 72 65 43 6f 64 65 4f 6e 65 4c 6f 6f 70 53  hereCodeOneLoopS
31a20 74 61 72 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c  tart(pWInfo, ii,
31a30 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20   notReady);.    
31a40 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75  pWInfo->iContinu
31a50 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  e = pLevel->addr
31a60 43 6f 6e 74 3b 0a 20 20 20 20 69 66 28 20 28 77  Cont;.    if( (w
31a70 73 46 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c  sFlags&WHERE_MUL
31a80 54 49 5f 4f 52 29 3d 3d 30 20 26 26 20 28 77 63  TI_OR)==0 && (wc
31a90 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  trlFlags&WHERE_O
31aa0 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 3d 3d 30  NETABLE_ONLY)==0
31ab0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
31ac0 33 57 68 65 72 65 41 64 64 53 63 61 6e 53 74 61  3WhereAddScanSta
31ad0 74 75 73 28 76 2c 20 70 54 61 62 4c 69 73 74 2c  tus(v, pTabList,
31ae0 20 70 4c 65 76 65 6c 2c 20 61 64 64 72 45 78 70   pLevel, addrExp
31af0 6c 61 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  lain);.    }.  }
31b00 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a  ..  /* Done. */.
31b10 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d    VdbeModuleComm
31b20 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 57  ent((v, "Begin W
31b30 48 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20  HERE-core"));.  
31b40 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a  return pWInfo;..
31b50 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
31b60 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a  f malloc fails *
31b70 2f 0a 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  /.whereBeginErro
31b80 72 3a 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 20  r:.  if( pWInfo 
31b90 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  ){.    pParse->n
31ba0 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e  QueryLoop = pWIn
31bb0 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c  fo->savedNQueryL
31bc0 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65 49 6e  oop;.    whereIn
31bd0 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  foFree(db, pWInf
31be0 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
31bf0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   0;.}../*.** Gen
31c00 65 72 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66  erate the end of
31c10 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e   the WHERE loop.
31c20 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f    See comments o
31c30 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65  n .** sqlite3Whe
31c40 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20 61 64  reBegin() for ad
31c50 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
31c60 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
31c70 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 57 68  lite3WhereEnd(Wh
31c80 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
31c90 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
31ca0 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
31cb0 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  se;.  Vdbe *v = 
31cc0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
31cd0 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c   int i;.  WhereL
31ce0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20  evel *pLevel;.  
31cf0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
31d00 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
31d10 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e  bList = pWInfo->
31d20 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69  pTabList;.  sqli
31d30 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
31d40 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  ->db;..  /* Gene
31d50 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e  rate loop termin
31d60 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f  ation code..  */
31d70 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d  .  VdbeModuleCom
31d80 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 57 48  ment((v, "End WH
31d90 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20 73  ERE-core"));.  s
31da0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
31db0 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
31dc0 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c  for(i=pWInfo->nL
31dd0 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  evel-1; i>=0; i-
31de0 2d 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  -){.    int addr
31df0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26  ;.    pLevel = &
31e00 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20  pWInfo->a[i];.  
31e10 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
31e20 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 73 71  ->pWLoop;.    sq
31e30 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
31e40 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
31e50 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20  >addrCont);.    
31e60 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d  if( pLevel->op!=
31e70 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
31e80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
31e90 70 33 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70  p3(v, pLevel->op
31ea0 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c  , pLevel->p1, pL
31eb0 65 76 65 6c 2d 3e 70 32 2c 20 70 4c 65 76 65 6c  evel->p2, pLevel
31ec0 2d 3e 70 33 29 3b 0a 20 20 20 20 20 20 73 71 6c  ->p3);.      sql
31ed0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
31ee0 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70 35 29 3b  (v, pLevel->p5);
31ef0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
31f00 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64  age(v);.      Vd
31f10 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
31f20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 4e  pLevel->op==OP_N
31f30 65 78 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  ext);.      Vdbe
31f40 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 4c  CoverageIf(v, pL
31f50 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 50 72 65  evel->op==OP_Pre
31f60 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  v);.      VdbeCo
31f70 76 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76  verageIf(v, pLev
31f80 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 56 4e 65 78 74  el->op==OP_VNext
31f90 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
31fa0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
31fb0 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20  & WHERE_IN_ABLE 
31fc0 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  && pLevel->u.in.
31fd0 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  nIn>0 ){.      s
31fe0 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49  truct InLoop *pI
31ff0 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  n;.      int j;.
32000 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
32010 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
32020 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
32030 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70  );.      for(j=p
32040 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c  Level->u.in.nIn,
32050 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e   pIn=&pLevel->u.
32060 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b  in.aInLoop[j-1];
32070 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d   j>0; j--, pIn--
32080 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
32090 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
320a0 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
320b0 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  +1);.        sql
320c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
320d0 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f  , pIn->eEndLoopO
320e0 70 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49  p, pIn->iCur, pI
320f0 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20  n->addrInTop);. 
32100 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
32110 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
32120 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
32130 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f  , pIn->eEndLoopO
32140 70 3d 3d 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e  p==OP_PrevIfOpen
32150 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
32160 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 49 6e  overageIf(v, pIn
32170 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50  ->eEndLoopOp==OP
32180 5f 4e 65 78 74 49 66 4f 70 65 6e 29 3b 0a 20 20  _NextIfOpen);.  
32190 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
321a0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e  eJumpHere(v, pIn
321b0 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a  ->addrInTop-1);.
321c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
321d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
321e0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65  olveLabel(v, pLe
321f0 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20  vel->addrBrk);. 
32200 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 61     if( pLevel->a
32210 64 64 72 53 6b 69 70 20 29 7b 0a 20 20 20 20 20  ddrSkip ){.     
32220 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
32230 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
32240 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b  , pLevel->addrSk
32250 69 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ip);.      VdbeC
32260 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74  omment((v, "next
32270 20 73 6b 69 70 2d 73 63 61 6e 20 6f 6e 20 25 73   skip-scan on %s
32280 22 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  ", pLoop->u.btre
32290 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29  e.pIndex->zName)
322a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
322b0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
322c0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70  pLevel->addrSkip
322d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
322e0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
322f0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70  pLevel->addrSkip
32300 2d 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  -2);.    }.    i
32310 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c  f( pLevel->addrL
32320 69 6b 65 52 65 70 20 29 7b 0a 20 20 20 20 20 20  ikeRep ){.      
32330 69 6e 74 20 6f 70 3b 0a 20 20 20 20 20 20 69 66  int op;.      if
32340 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  ( sqlite3VdbeGet
32350 4f 70 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  Op(v, pLevel->ad
32360 64 72 4c 69 6b 65 52 65 70 2d 31 29 2d 3e 70 31  drLikeRep-1)->p1
32370 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d   ){.        op =
32380 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f   OP_DecrJumpZero
32390 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
323a0 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4a         op = OP_J
323b0 75 6d 70 5a 65 72 6f 49 6e 63 72 3b 0a 20 20 20  umpZeroIncr;.   
323c0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
323d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
323e0 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b  op, pLevel->iLik
323f0 65 52 65 70 43 6e 74 72 2c 20 70 4c 65 76 65 6c  eRepCntr, pLevel
32400 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70 29 3b 0a  ->addrLikeRep);.
32410 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
32420 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ge(v);.    }.   
32430 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65   if( pLevel->iLe
32440 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20  ftJoin ){.      
32450 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
32460 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
32470 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c  fPos, pLevel->iL
32480 65 66 74 4a 6f 69 6e 29 3b 20 56 64 62 65 43 6f  eftJoin); VdbeCo
32490 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
324a0 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d   assert( (pLoop-
324b0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
324c0 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20  _IDX_ONLY)==0.  
324d0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4c 6f           || (pLo
324e0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
324f0 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20  ERE_INDEXED)!=0 
32500 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4c  );.      if( (pL
32510 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
32520 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
32530 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
32540 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
32550 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54  , OP_NullRow, pT
32560 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  abList->a[i].iCu
32570 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rsor);.      }. 
32580 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e       if( pLoop->
32590 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
325a0 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20 20  INDEXED ){.     
325b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
325c0 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52  dOp1(v, OP_NullR
325d0 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  ow, pLevel->iIdx
325e0 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Cur);.      }.  
325f0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
32600 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b  op==OP_Return ){
32610 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
32620 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
32630 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e  _Gosub, pLevel->
32640 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  p1, pLevel->addr
32650 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 65  First);.      }e
32660 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
32670 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
32680 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c  , OP_Goto, 0, pL
32690 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29  evel->addrFirst)
326a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
326b0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
326c0 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
326d0 20 20 7d 0a 20 20 20 20 56 64 62 65 4d 6f 64 75    }.    VdbeModu
326e0 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45  leComment((v, "E
326f0 6e 64 20 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a  nd WHERE-loop%d:
32700 20 25 73 22 2c 20 69 2c 0a 20 20 20 20 20 20 20   %s", i,.       
32710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57                pW
32720 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
32730 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
32740 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  .pTab->zName));.
32750 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62    }..  /* The "b
32760 72 65 61 6b 22 20 70 6f 69 6e 74 20 69 73 20 68  reak" point is h
32770 65 72 65 2c 20 6a 75 73 74 20 70 61 73 74 20 74  ere, just past t
32780 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75  he end of the ou
32790 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53  ter loop..  ** S
327a0 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71  et it..  */.  sq
327b0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
327c0 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d  Label(v, pWInfo-
327d0 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 61 73 73  >iBreak);..  ass
327e0 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  ert( pWInfo->nLe
327f0 76 65 6c 3c 3d 70 54 61 62 4c 69 73 74 2d 3e 6e  vel<=pTabList->n
32800 53 72 63 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Src );.  for(i=0
32810 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d  , pLevel=pWInfo-
32820 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c  >a; i<pWInfo->nL
32830 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76 65  evel; i++, pLeve
32840 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6b 2c  l++){.    int k,
32850 20 6c 61 73 74 3b 0a 20 20 20 20 56 64 62 65 4f   last;.    VdbeO
32860 70 20 2a 70 4f 70 3b 0a 20 20 20 20 49 6e 64 65  p *pOp;.    Inde
32870 78 20 2a 70 49 64 78 20 3d 20 30 3b 0a 20 20 20  x *pIdx = 0;.   
32880 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
32890 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d  item *pTabItem =
328a0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
328b0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
328c0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
328d0 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pTabItem->pTab;.
328e0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
328f0 21 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70  !=0 );.    pLoop
32900 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
32910 70 3b 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61  p;..    /* For a
32920 20 63 6f 2d 72 6f 75 74 69 6e 65 2c 20 63 68 61   co-routine, cha
32930 6e 67 65 20 61 6c 6c 20 4f 50 5f 43 6f 6c 75 6d  nge all OP_Colum
32940 6e 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  n references to 
32950 74 68 65 20 74 61 62 6c 65 20 6f 66 0a 20 20 20  the table of.   
32960 20 2a 2a 20 74 68 65 20 63 6f 2d 72 6f 75 74 69   ** the co-routi
32970 6e 65 20 69 6e 74 6f 20 4f 50 5f 43 6f 70 79 20  ne into OP_Copy 
32980 6f 66 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69  of result contai
32990 6e 65 64 20 69 6e 20 61 20 72 65 67 69 73 74 65  ned in a registe
329a0 72 2e 0a 20 20 20 20 2a 2a 20 4f 50 5f 52 6f 77  r..    ** OP_Row
329b0 69 64 20 62 65 63 6f 6d 65 73 20 4f 50 5f 4e 75  id becomes OP_Nu
329c0 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ll..    */.    i
329d0 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 76 69 61  f( pTabItem->via
329e0 43 6f 72 6f 75 74 69 6e 65 20 26 26 20 21 64 62  Coroutine && !db
329f0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
32a00 7b 0a 20 20 20 20 20 20 74 72 61 6e 73 6c 61 74  {.      translat
32a10 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 76 2c  eColumnToCopy(v,
32a20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64   pLevel->addrBod
32a30 79 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  y, pLevel->iTabC
32a40 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ur,.            
32a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32a60 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 73  pTabItem->regRes
32a70 75 6c 74 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74  ult);.      cont
32a80 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  inue;.    }..   
32a90 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66   /* Close all of
32aa0 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61   the cursors tha
32ab0 74 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79  t were opened by
32ac0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
32ad0 69 6e 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65 70  in..    ** Excep
32ae0 74 2c 20 64 6f 20 6e 6f 74 20 63 6c 6f 73 65 20  t, do not close 
32af0 63 75 72 73 6f 72 73 20 74 68 61 74 20 77 69 6c  cursors that wil
32b00 6c 20 62 65 20 72 65 75 73 65 64 20 62 79 20 74  l be reused by t
32b10 68 65 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69  he OR optimizati
32b20 6f 6e 0a 20 20 20 20 2a 2a 20 28 57 48 45 52 45  on.    ** (WHERE
32b30 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45  _OMIT_OPEN_CLOSE
32b40 29 2e 20 20 41 6e 64 20 64 6f 20 6e 6f 74 20 63  ).  And do not c
32b50 6c 6f 73 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e  lose the OP_Open
32b60 57 72 69 74 65 20 63 75 72 73 6f 72 73 0a 20 20  Write cursors.  
32b70 20 20 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72    ** created for
32b80 20 74 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74   the ONEPASS opt
32b90 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  imization..    *
32ba0 2f 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d  /.    if( (pTab-
32bb0 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
32bc0 70 68 65 6d 65 72 61 6c 29 3d 3d 30 0a 20 20 20  phemeral)==0.   
32bd0 20 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65    && pTab->pSele
32be0 63 74 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70  ct==0.     && (p
32bf0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
32c00 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f  s & WHERE_OMIT_O
32c10 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 0a 20 20  PEN_CLOSE)==0.  
32c20 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 77    ){.      int w
32c30 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  s = pLoop->wsFla
32c40 67 73 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  gs;.      if( !p
32c50 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
32c60 20 26 26 20 28 77 73 20 26 20 57 48 45 52 45 5f   && (ws & WHERE_
32c70 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a  IDX_ONLY)==0 ){.
32c80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
32c90 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
32ca0 43 6c 6f 73 65 2c 20 70 54 61 62 49 74 65 6d 2d  Close, pTabItem-
32cb0 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
32cc0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 77 73   }.      if( (ws
32cd0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
32ce0 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28  )!=0.       && (
32cf0 77 73 20 26 20 28 57 48 45 52 45 5f 49 50 4b 7c  ws & (WHERE_IPK|
32d00 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
32d10 29 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26  ))==0 .       &&
32d20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
32d30 21 3d 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f  !=pWInfo->aiCurO
32d40 6e 65 50 61 73 73 5b 31 5d 0a 20 20 20 20 20 20  nePass[1].      
32d50 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
32d60 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
32d70 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c  OP_Close, pLevel
32d80 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20  ->iIdxCur);.    
32d90 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
32da0 2a 20 49 66 20 74 68 69 73 20 73 63 61 6e 20 75  * If this scan u
32db0 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61  ses an index, ma
32dc0 6b 65 20 56 44 42 45 20 63 6f 64 65 20 73 75 62  ke VDBE code sub
32dd0 73 74 69 74 75 74 69 6f 6e 73 20 74 6f 20 72 65  stitutions to re
32de0 61 64 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66  ad data.    ** f
32df0 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 69 6e  rom the index in
32e00 73 74 65 61 64 20 6f 66 20 66 72 6f 6d 20 74 68  stead of from th
32e10 65 20 74 61 62 6c 65 20 77 68 65 72 65 20 70 6f  e table where po
32e20 73 73 69 62 6c 65 2e 20 20 49 6e 20 73 6f 6d 65  ssible.  In some
32e30 20 63 61 73 65 73 0a 20 20 20 20 2a 2a 20 74 68   cases.    ** th
32e40 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
32e50 70 72 65 76 65 6e 74 73 20 74 68 65 20 74 61 62  prevents the tab
32e60 6c 65 20 66 72 6f 6d 20 65 76 65 72 20 62 65 69  le from ever bei
32e70 6e 67 20 72 65 61 64 2c 20 77 68 69 63 68 20 63  ng read, which c
32e80 61 6e 0a 20 20 20 20 2a 2a 20 79 69 65 6c 64 20  an.    ** yield 
32e90 61 20 73 69 67 6e 69 66 69 63 61 6e 74 20 70 65  a significant pe
32ea0 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e  rformance boost.
32eb0 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20  .    ** .    ** 
32ec0 43 61 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64  Calls to the cod
32ed0 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62  e generator in b
32ee0 65 74 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68  etween sqlite3Wh
32ef0 65 72 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20  ereBegin and.   
32f00 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65   ** sqlite3Where
32f10 45 6e 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72  End will have cr
32f20 65 61 74 65 64 20 63 6f 64 65 20 74 68 61 74 20  eated code that 
32f30 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 74  references the t
32f40 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65  able.    ** dire
32f50 63 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70  ctly.  This loop
32f60 20 73 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20   scans all that 
32f70 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  code looking for
32f80 20 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20   opcodes.    ** 
32f90 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74  that reference t
32fa0 68 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e  he table and con
32fb0 76 65 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20  verts them into 
32fc0 6f 70 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20  opcodes that.   
32fd0 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68   ** reference th
32fe0 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a  e index..    */.
32ff0 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
33000 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
33010 49 4e 44 45 58 45 44 7c 57 48 45 52 45 5f 49 44  INDEXED|WHERE_ID
33020 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20 20 20 20  X_ONLY) ){.     
33030 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75   pIdx = pLoop->u
33040 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
33050 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f     }else if( pLo
33060 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
33070 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a  ERE_MULTI_OR ){.
33080 20 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65        pIdx = pLe
33090 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 3b 0a  vel->u.pCovidx;.
330a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
330b0 64 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f  dx && !db->mallo
330c0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
330d0 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56   last = sqlite3V
330e0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
330f0 29 3b 0a 20 20 20 20 20 20 6b 20 3d 20 70 4c 65  );.      k = pLe
33100 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 3b 0a 20  vel->addrBody;. 
33110 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74       pOp = sqlit
33120 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 6b  e3VdbeGetOp(v, k
33130 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 6b  );.      for(; k
33140 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b  <last; k++, pOp+
33150 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
33160 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d  pOp->p1!=pLevel-
33170 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69  >iTabCur ) conti
33180 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
33190 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
331a0 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  _Column ){.     
331b0 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70 4f 70       int x = pOp
331c0 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20  ->p2;.          
331d0 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70 54  assert( pIdx->pT
331e0 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20  able==pTab );.  
331f0 20 20 20 20 20 20 20 20 69 66 28 20 21 48 61 73          if( !Has
33200 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
33210 20 20 20 20 20 20 20 20 20 20 20 49 6e 64 65 78             Index
33220 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50   *pPk = sqlite3P
33230 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
33240 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Tab);.          
33250 20 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c    x = pPk->aiCol
33260 75 6d 6e 5b 78 5d 3b 0a 20 20 20 20 20 20 20 20  umn[x];.        
33270 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 78 20    }.          x 
33280 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f  = sqlite3ColumnO
33290 66 49 6e 64 65 78 28 70 49 64 78 2c 20 78 29 3b  fIndex(pIdx, x);
332a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78  .          if( x
332b0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
332c0 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 78 3b 0a     pOp->p2 = x;.
332d0 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d              pOp-
332e0 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  >p1 = pLevel->iI
332f0 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20  dxCur;.         
33300 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73   }.          ass
33310 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  ert( (pLoop->wsF
33320 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
33330 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20 78 3e 3d  _ONLY)==0 || x>=
33340 30 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  0 );.        }el
33350 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  se if( pOp->opco
33360 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a  de==OP_Rowid ){.
33370 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
33380 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  1 = pLevel->iIdx
33390 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Cur;.          p
333a0 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
333b0 49 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  IdxRowid;.      
333c0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
333d0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61  }.  }..  /* Fina
333e0 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20  l cleanup.  */. 
333f0 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
33400 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61  oop = pWInfo->sa
33410 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  vedNQueryLoop;. 
33420 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64   whereInfoFree(d
33430 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65  b, pWInfo);.  re
33440 74 75 72 6e 3b 0a 7d 0a                          turn;.}.