/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 9257a7f26e6c9da27deae819098d1005f4e1c37e19b8f029292bd2b1aab35721:


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 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 73 2f 25 70 3a 20 22 2c 28 53 29 2d 3e 7a  "%s/%p: ",(S)->z
02c0: 53 65 6c 4e 61 6d 65 2c 28 53 29 29 2c 5c 0a 20  SelName,(S)),\. 
02d0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
02e0: 72 69 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23 20  rintf X.#else.# 
02f0: 64 65 66 69 6e 65 20 53 45 4c 45 43 54 54 52 41  define SELECTTRA
0300: 43 45 28 4b 2c 50 2c 53 2c 58 29 0a 23 65 6e 64  CE(K,P,S,X).#end
0310: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  if.../*.** An in
0320: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
0330: 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20 69  llowing object i
0340: 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72 64  s used to record
0350: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
0360: 75 74 0a 2a 2a 20 68 6f 77 20 74 6f 20 70 72 6f  ut.** how to pro
0370: 63 65 73 73 20 74 68 65 20 44 49 53 54 49 4e 43  cess the DISTINC
0380: 54 20 6b 65 79 77 6f 72 64 2c 20 74 6f 20 73 69  T keyword, to si
0390: 6d 70 6c 69 66 79 20 70 61 73 73 69 6e 67 20 74  mplify passing t
03a0: 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  hat information.
03b0: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 65 6c 65  ** into the sele
03c0: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 72 6f  ctInnerLoop() ro
03d0: 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64 65  utine..*/.typede
03e0: 66 20 73 74 72 75 63 74 20 44 69 73 74 69 6e 63  f struct Distinc
03f0: 74 43 74 78 20 44 69 73 74 69 6e 63 74 43 74 78  tCtx DistinctCtx
0400: 3b 0a 73 74 72 75 63 74 20 44 69 73 74 69 6e 63  ;.struct Distinc
0410: 74 43 74 78 20 7b 0a 20 20 75 38 20 69 73 54 6e  tCtx {.  u8 isTn
0420: 63 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ct;      /* True
0430: 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
0440: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
0450: 65 6e 74 20 2a 2f 0a 20 20 75 38 20 65 54 6e 63  ent */.  u8 eTnc
0460: 74 54 79 70 65 3b 20 20 20 2f 2a 20 4f 6e 65 20  tType;   /* One 
0470: 6f 66 20 74 68 65 20 57 48 45 52 45 5f 44 49 53  of the WHERE_DIS
0480: 54 49 4e 43 54 5f 2a 20 6f 70 65 72 61 74 6f 72  TINCT_* operator
0490: 73 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62 54 6e  s */.  int tabTn
04a0: 63 74 3b 20 20 20 20 2f 2a 20 45 70 68 65 6d 65  ct;    /* Epheme
04b0: 72 61 6c 20 74 61 62 6c 65 20 75 73 65 64 20 66  ral table used f
04c0: 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63  or DISTINCT proc
04d0: 65 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  essing */.  int 
04e0: 61 64 64 72 54 6e 63 74 3b 20 20 20 2f 2a 20 41  addrTnct;   /* A
04f0: 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65  ddress of OP_Ope
0500: 6e 45 70 68 65 6d 65 72 61 6c 20 6f 70 63 6f 64  nEphemeral opcod
0510: 65 20 66 6f 72 20 74 61 62 54 6e 63 74 20 2a 2f  e for tabTnct */
0520: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .};../*.** An in
0530: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
0540: 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20 69  llowing object i
0550: 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72 64  s used to record
0560: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
0570: 75 74 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52 20  ut.** the ORDER 
0580: 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29  BY (or GROUP BY)
0590: 20 63 6c 61 75 73 65 20 6f 66 20 71 75 65 72 79   clause of query
05a0: 20 69 73 20 62 65 69 6e 67 20 63 6f 64 65 64 2e   is being coded.
05b0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 44 65 66 65  .**.** The aDefe
05c0: 72 5b 5d 20 61 72 72 61 79 20 69 73 20 75 73 65  r[] array is use
05d0: 64 20 62 79 20 74 68 65 20 73 6f 72 74 65 72 2d  d by the sorter-
05e0: 72 65 66 65 72 65 6e 63 65 73 20 6f 70 74 69 6d  references optim
05f0: 69 7a 61 74 69 6f 6e 2e 20 46 6f 72 0a 2a 2a 20  ization. For.** 
0600: 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e  example, assumin
0610: 67 20 74 68 65 72 65 20 69 73 20 6e 6f 20 69 6e  g there is no in
0620: 64 65 78 20 74 68 61 74 20 63 61 6e 20 62 65 20  dex that can be 
0630: 75 73 65 64 20 66 6f 72 20 74 68 65 20 4f 52 44  used for the ORD
0640: 45 52 20 42 59 2c 0a 2a 2a 20 66 6f 72 20 74 68  ER BY,.** for th
0650: 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  e query:.**.**  
0660: 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 69 67     SELECT a, big
0670: 62 6c 6f 62 20 46 52 4f 4d 20 74 31 20 4f 52 44  blob FROM t1 ORD
0680: 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 31 30  ER BY a LIMIT 10
0690: 3b 0a 2a 2a 0a 2a 2a 20 69 74 20 6d 61 79 20 62  ;.**.** it may b
06a0: 65 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  e more efficient
06b0: 20 74 6f 20 61 64 64 20 6a 75 73 74 20 74 68 65   to add just the
06c0: 20 22 61 22 20 76 61 6c 75 65 73 20 74 6f 20 74   "a" values to t
06d0: 68 65 20 73 6f 72 74 65 72 2c 20 61 6e 64 0a 2a  he sorter, and.*
06e0: 2a 20 72 65 74 72 69 65 76 65 20 74 68 65 20 61  * retrieve the a
06f0: 73 73 6f 63 69 61 74 65 64 20 22 62 69 67 62 6c  ssociated "bigbl
0700: 6f 62 22 20 76 61 6c 75 65 73 20 64 69 72 65 63  ob" values direc
0710: 74 6c 79 20 66 72 6f 6d 20 74 61 62 6c 65 20 74  tly from table t
0720: 31 20 61 73 20 74 68 65 0a 2a 2a 20 31 30 20 73  1 as the.** 10 s
0730: 6d 61 6c 6c 65 73 74 20 22 61 22 20 76 61 6c 75  mallest "a" valu
0740: 65 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64  es are extracted
0750: 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72   from the sorter
0760: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ..**.** When the
0770: 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e 63   sorter-referenc
0780: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
0790: 73 20 75 73 65 64 2c 20 74 68 65 72 65 20 69 73  s used, there is
07a0: 20 6f 6e 65 20 65 6e 74 72 79 20 69 6e 20 74 68   one entry in th
07b0: 65 0a 2a 2a 20 61 44 65 66 65 72 5b 5d 20 61 72  e.** aDefer[] ar
07c0: 72 61 79 20 66 6f 72 20 65 61 63 68 20 64 61 74  ray for each dat
07d0: 61 62 61 73 65 20 74 61 62 6c 65 20 74 68 61 74  abase table that
07e0: 20 6d 61 79 20 62 65 20 72 65 61 64 20 61 73 20   may be read as 
07f0: 76 61 6c 75 65 73 20 61 72 65 0a 2a 2a 20 65 78  values are.** ex
0800: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
0810: 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 74 79 70 65   sorter..*/.type
0820: 64 65 66 20 73 74 72 75 63 74 20 53 6f 72 74 43  def struct SortC
0830: 74 78 20 53 6f 72 74 43 74 78 3b 0a 73 74 72 75  tx SortCtx;.stru
0840: 63 74 20 53 6f 72 74 43 74 78 20 7b 0a 20 20 45  ct SortCtx {.  E
0850: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
0860: 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  y;   /* The ORDE
0870: 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42  R BY (or GROUP B
0880: 59 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20 69  Y clause) */.  i
0890: 6e 74 20 6e 4f 42 53 61 74 3b 20 20 20 20 20 20  nt nOBSat;      
08a0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
08b0: 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  f ORDER BY terms
08c0: 20 73 61 74 69 73 66 69 65 64 20 62 79 20 69 6e   satisfied by in
08d0: 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  dices */.  int i
08e0: 45 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20  ECursor;        
08f0: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
0900: 72 20 66 6f 72 20 74 68 65 20 73 6f 72 74 65 72  r for the sorter
0910: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74   */.  int regRet
0920: 75 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 52  urn;        /* R
0930: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
0940: 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65 74  block-output ret
0950: 75 72 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20  urn address */. 
0960: 20 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74 3b   int labelBkOut;
0970: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20         /* Start 
0980: 6c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 62 6c  label for the bl
0990: 6f 63 6b 2d 6f 75 74 70 75 74 20 73 75 62 72 6f  ock-output subro
09a0: 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
09b0: 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20  ddrSortIndex;   
09c0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
09d0: 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  he OP_SorterOpen
09e0: 20 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d   or OP_OpenEphem
09f0: 65 72 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  eral */.  int la
0a00: 62 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20 20  belDone;        
0a10: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65  /* Jump here whe
0a20: 6e 20 64 6f 6e 65 2c 20 65 78 3a 20 4c 49 4d 49  n done, ex: LIMI
0a30: 54 20 72 65 61 63 68 65 64 20 2a 2f 0a 20 20 75  T reached */.  u
0a40: 38 20 73 6f 72 74 46 6c 61 67 73 3b 20 20 20 20  8 sortFlags;    
0a50: 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20       /* Zero or 
0a60: 6d 6f 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20  more SORTFLAG_* 
0a70: 62 69 74 73 20 2a 2f 0a 20 20 75 38 20 62 4f 72  bits */.  u8 bOr
0a80: 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3b 20  deredInnerLoop; 
0a90: 2f 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 72 72  /* ORDER BY corr
0aa0: 65 63 74 6c 79 20 73 6f 72 74 73 20 74 68 65 20  ectly sorts the 
0ab0: 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 23 69  inner loop */.#i
0ac0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
0ad0: 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45  LE_SORTER_REFERE
0ae0: 4e 43 45 53 0a 20 20 75 38 20 6e 44 65 66 65 72  NCES.  u8 nDefer
0af0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0b00: 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  Number of valid 
0b10: 65 6e 74 72 69 65 73 20 69 6e 20 61 44 65 66 65  entries in aDefe
0b20: 72 5b 5d 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  r[] */.  struct 
0b30: 44 65 66 65 72 72 65 64 43 73 72 20 7b 0a 20 20  DeferredCsr {.  
0b40: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
0b50: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 64        /* Table d
0b60: 65 66 69 6e 69 74 69 6f 6e 20 2a 2f 0a 20 20 20  efinition */.   
0b70: 20 69 6e 74 20 69 43 73 72 3b 20 20 20 20 20 20   int iCsr;      
0b80: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
0b90: 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20  umber for table 
0ba0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b  */.    int nKey;
0bb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
0bc0: 6d 62 65 72 20 6f 66 20 50 4b 20 63 6f 6c 75 6d  mber of PK colum
0bd0: 6e 73 20 66 6f 72 20 74 61 62 6c 65 20 70 54 61  ns for table pTa
0be0: 62 20 28 3e 3d 31 29 20 2a 2f 0a 20 20 7d 20 61  b (>=1) */.  } a
0bf0: 44 65 66 65 72 5b 34 5d 3b 0a 23 65 6e 64 69 66  Defer[4];.#endif
0c00: 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 53 4f 52 54  .};.#define SORT
0c10: 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20 20  FLAG_UseSorter  
0c20: 30 78 30 31 20 20 20 2f 2a 20 55 73 65 20 53 6f  0x01   /* Use So
0c30: 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 65 61 64  rterOpen instead
0c40: 20 6f 66 20 4f 70 65 6e 45 70 68 65 6d 65 72 61   of OpenEphemera
0c50: 6c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  l */../*.** Dele
0c60: 74 65 20 61 6c 6c 20 74 68 65 20 63 6f 6e 74 65  te all the conte
0c70: 6e 74 20 6f 66 20 61 20 53 65 6c 65 63 74 20 73  nt of a Select s
0c80: 74 72 75 63 74 75 72 65 2e 20 20 44 65 61 6c 6c  tructure.  Deall
0c90: 6f 63 61 74 65 20 74 68 65 20 73 74 72 75 63 74  ocate the struct
0ca0: 75 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20 6f 6e  ure.** itself on
0cb0: 6c 79 20 69 66 20 62 46 72 65 65 20 69 73 20 74  ly if bFree is t
0cc0: 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rue..*/.static v
0cd0: 6f 69 64 20 63 6c 65 61 72 53 65 6c 65 63 74 28  oid clearSelect(
0ce0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c  sqlite3 *db, Sel
0cf0: 65 63 74 20 2a 70 2c 20 69 6e 74 20 62 46 72 65  ect *p, int bFre
0d00: 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  e){.  while( p )
0d10: 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50  {.    Select *pP
0d20: 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
0d30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
0d40: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
0d50: 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  p->pEList);.    
0d60: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
0d70: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53 72 63  lete(db, p->pSrc
0d80: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
0d90: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
0da0: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c  pWhere);.    sql
0db0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
0dc0: 74 65 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70  te(db, p->pGroup
0dd0: 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  By);.    sqlite3
0de0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
0df0: 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20  ->pHaving);.    
0e00: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
0e10: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
0e20: 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69  derBy);.    sqli
0e30: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
0e40: 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
0e50: 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41    if( OK_IF_ALWA
0e60: 59 53 5f 54 52 55 45 28 70 2d 3e 70 57 69 74 68  YS_TRUE(p->pWith
0e70: 29 20 29 20 73 71 6c 69 74 65 33 57 69 74 68 44  ) ) sqlite3WithD
0e80: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69  elete(db, p->pWi
0e90: 74 68 29 3b 0a 20 20 20 20 69 66 28 20 62 46 72  th);.    if( bFr
0ea0: 65 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ee ) sqlite3DbFr
0eb0: 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 20  eeNN(db, p);.   
0ec0: 20 70 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20   p = pPrior;.   
0ed0: 20 62 46 72 65 65 20 3d 20 31 3b 0a 20 20 7d 0a   bFree = 1;.  }.
0ee0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
0ef0: 69 7a 65 20 61 20 53 65 6c 65 63 74 44 65 73 74  ize a SelectDest
0f00: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76   structure..*/.v
0f10: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
0f20: 74 44 65 73 74 49 6e 69 74 28 53 65 6c 65 63 74  tDestInit(Select
0f30: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 69 6e 74  Dest *pDest, int
0f40: 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72   eDest, int iPar
0f50: 6d 29 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44 65  m){.  pDest->eDe
0f60: 73 74 20 3d 20 28 75 38 29 65 44 65 73 74 3b 0a  st = (u8)eDest;.
0f70: 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d    pDest->iSDParm
0f80: 20 3d 20 69 50 61 72 6d 3b 0a 20 20 70 44 65 73   = iParm;.  pDes
0f90: 74 2d 3e 7a 41 66 66 53 64 73 74 20 3d 20 30 3b  t->zAffSdst = 0;
0fa0: 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20  .  pDest->iSdst 
0fb0: 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53  = 0;.  pDest->nS
0fc0: 64 73 74 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  dst = 0;.}.../*.
0fd0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
0fe0: 77 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  w Select structu
0ff0: 72 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  re and return a 
1000: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a  pointer to that.
1010: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ** structure..*/
1020: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
1030: 53 65 6c 65 63 74 4e 65 77 28 0a 20 20 50 61 72  SelectNew(.  Par
1040: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
1050: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1060: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
1070: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
1080: 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e   /* which column
1090: 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20  s to include in 
10a0: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
10b0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
10c0: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
10d0: 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63  M clause -- whic
10e0: 68 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e  h tables to scan
10f0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
1100: 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  re,         /* t
1110: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1120: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1130: 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68  GroupBy,   /* th
1140: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
1150: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  e */.  Expr *pHa
1160: 76 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  ving,        /* 
1170: 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
1180: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
1190: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
11a0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
11b0: 75 73 65 20 2a 2f 0a 20 20 75 33 32 20 73 65 6c  use */.  u32 sel
11c0: 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 2f  Flags,         /
11d0: 2a 20 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72  * Flag parameter
11e0: 73 2c 20 73 75 63 68 20 61 73 20 53 46 5f 44 69  s, such as SF_Di
11f0: 73 74 69 6e 63 74 20 2a 2f 0a 20 20 45 78 70 72  stinct */.  Expr
1200: 20 2a 70 4c 69 6d 69 74 20 20 20 20 20 20 20 20   *pLimit        
1210: 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65    /* LIMIT value
1220: 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f  .  NULL means no
1230: 74 20 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 53  t used */.){.  S
1240: 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53  elect *pNew;.  S
1250: 65 6c 65 63 74 20 73 74 61 6e 64 69 6e 3b 0a 20  elect standin;. 
1260: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
1270: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 70 50 61  bMallocRawNN(pPa
1280: 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28  rse->db, sizeof(
1290: 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20  *pNew) );.  if( 
12a0: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 61  pNew==0 ){.    a
12b0: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
12c0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
12d0: 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 26 73  );.    pNew = &s
12e0: 74 61 6e 64 69 6e 3b 0a 20 20 7d 0a 20 20 69 66  tandin;.  }.  if
12f0: 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  ( pEList==0 ){. 
1300: 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71 6c 69     pEList = sqli
1310: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
1320: 64 28 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20  d(pParse, 0,.   
1330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1350: 73 71 6c 69 74 65 33 45 78 70 72 28 70 50 61 72  sqlite3Expr(pPar
1360: 73 65 2d 3e 64 62 2c 54 4b 5f 41 53 54 45 52 49  se->db,TK_ASTERI
1370: 53 4b 2c 30 29 29 3b 0a 20 20 7d 0a 20 20 70 4e  SK,0));.  }.  pN
1380: 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c  ew->pEList = pEL
1390: 69 73 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20  ist;.  pNew->op 
13a0: 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70  = TK_SELECT;.  p
13b0: 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20  New->selFlags = 
13c0: 73 65 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77  selFlags;.  pNew
13d0: 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
13e0: 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20  pNew->iOffset = 
13f0: 30 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  0;.#if SELECTTRA
1400: 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70 4e 65  CE_ENABLED.  pNe
1410: 77 2d 3e 7a 53 65 6c 4e 61 6d 65 5b 30 5d 20 3d  w->zSelName[0] =
1420: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4e 65   0;.#endif.  pNe
1430: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
1440: 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  0] = -1;.  pNew-
1450: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
1460: 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e   = -1;.  pNew->n
1470: 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20  SelectRow = 0;. 
1480: 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 70   if( pSrc==0 ) p
1490: 53 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Src = sqlite3DbM
14a0: 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65  allocZero(pParse
14b0: 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 53  ->db, sizeof(*pS
14c0: 72 63 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53  rc));.  pNew->pS
14d0: 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 70 4e 65  rc = pSrc;.  pNe
14e0: 77 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65  w->pWhere = pWhe
14f0: 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f  re;.  pNew->pGro
1500: 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b  upBy = pGroupBy;
1510: 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67  .  pNew->pHaving
1520: 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 70 4e   = pHaving;.  pN
1530: 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  ew->pOrderBy = p
1540: 4f 72 64 65 72 42 79 3b 0a 20 20 70 4e 65 77 2d  OrderBy;.  pNew-
1550: 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70  >pPrior = 0;.  p
1560: 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  New->pNext = 0;.
1570: 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d    pNew->pLimit =
1580: 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d   pLimit;.  pNew-
1590: 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20 20 69 66  >pWith = 0;.  if
15a0: 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
15b0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a 20  llocFailed ) {. 
15c0: 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 70     clearSelect(p
15d0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 65 77 2c  Parse->db, pNew,
15e0: 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e 29   pNew!=&standin)
15f0: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a  ;.    pNew = 0;.
1600: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
1610: 65 72 74 28 20 70 4e 65 77 2d 3e 70 53 72 63 21  ert( pNew->pSrc!
1620: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
1630: 72 72 3e 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73  rr>0 );.  }.  as
1640: 73 65 72 74 28 20 70 4e 65 77 21 3d 26 73 74 61  sert( pNew!=&sta
1650: 6e 64 69 6e 20 29 3b 0a 20 20 72 65 74 75 72 6e  ndin );.  return
1660: 20 70 4e 65 77 3b 0a 7d 0a 0a 23 69 66 20 53 45   pNew;.}..#if SE
1670: 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
1680: 44 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  D./*.** Set the 
1690: 6e 61 6d 65 20 6f 66 20 61 20 53 65 6c 65 63 74  name of a Select
16a0: 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20   object.*/.void 
16b0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74  sqlite3SelectSet
16c0: 4e 61 6d 65 28 53 65 6c 65 63 74 20 2a 70 2c 20  Name(Select *p, 
16d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
16e0: 65 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 7a  e){.  if( p && z
16f0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Name ){.    sqli
1700: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
1710: 65 6f 66 28 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29  eof(p->zSelName)
1720: 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 22  , p->zSelName, "
1730: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d  %s", zName);.  }
1740: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
1750: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67 69 76  * Delete the giv
1760: 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  en Select struct
1770: 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69  ure and all of i
1780: 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65 73  ts substructures
1790: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
17a0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 73 71  3SelectDelete(sq
17b0: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
17c0: 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 4f 4b 5f  t *p){.  if( OK_
17d0: 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70  IF_ALWAYS_TRUE(p
17e0: 29 20 29 20 63 6c 65 61 72 53 65 6c 65 63 74 28  ) ) clearSelect(
17f0: 64 62 2c 20 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a  db, p, 1);.}../*
1800: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
1810: 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69 67 68  nter to the righ
1820: 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
1830: 61 74 65 6d 65 6e 74 20 69 6e 20 61 20 63 6f 6d  atement in a com
1840: 70 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  pound..*/.static
1850: 20 53 65 6c 65 63 74 20 2a 66 69 6e 64 52 69 67   Select *findRig
1860: 68 74 6d 6f 73 74 28 53 65 6c 65 63 74 20 2a 70  htmost(Select *p
1870: 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70  ){.  while( p->p
1880: 4e 65 78 74 20 29 20 70 20 3d 20 70 2d 3e 70 4e  Next ) p = p->pN
1890: 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  ext;.  return p;
18a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
18b0: 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69 65  1 to 3 identifie
18c0: 72 73 20 70 72 65 63 65 64 69 6e 67 20 74 68 65  rs preceding the
18d0: 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64   JOIN keyword, d
18e0: 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20  etermine the.** 
18f0: 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52  type of join.  R
1900: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
1910: 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 65   constant that e
1920: 78 70 72 65 73 73 65 73 20 74 68 61 74 20 74 79  xpresses that ty
1930: 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f  pe.** in terms o
1940: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1950: 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a  bit values:.**.*
1960: 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a  *     JT_INNER.*
1970: 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a  *     JT_CROSS.*
1980: 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a  *     JT_OUTER.*
1990: 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c  *     JT_NATURAL
19a0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a  .**     JT_LEFT.
19b0: 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54 0a  **     JT_RIGHT.
19c0: 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74  **.** A full out
19d0: 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20 63  er join is the c
19e0: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54  ombination of JT
19f0: 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49 47  _LEFT and JT_RIG
1a00: 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  HT..**.** If an 
1a10: 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75 70  illegal or unsup
1a20: 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65  ported join type
1a30: 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 73   is seen, then s
1a40: 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61  till return.** a
1a50: 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74 20   join type, but 
1a60: 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  put an error in 
1a70: 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
1a80: 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ture..*/.int sql
1a90: 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61 72  ite3JoinType(Par
1aa0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
1ab0: 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42  n *pA, Token *pB
1ac0: 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20  , Token *pC){.  
1ad0: 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30  int jointype = 0
1ae0: 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c  ;.  Token *apAll
1af0: 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b  [3];.  Token *p;
1b00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b20: 20 20 20 30 31 32 33 34 35 36 37 38 39 20 31 32     0123456789 12
1b30: 33 34 35 36 37 38 39 20 31 32 33 34 35 36 37 38  3456789 12345678
1b40: 39 20 31 32 33 20 2a 2f 0a 20 20 73 74 61 74 69  9 123 */.  stati
1b50: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65  c const char zKe
1b60: 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61 74 75 72  yText[] = "natur
1b70: 61 6c 65 66 74 6f 75 74 65 72 69 67 68 74 66 75  aleftouterightfu
1b80: 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22 3b 0a 20  llinnercross";. 
1b90: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
1ba0: 72 75 63 74 20 7b 0a 20 20 20 20 75 38 20 69 3b  ruct {.    u8 i;
1bb0: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
1bc0: 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f 72 64 20  ning of keyword 
1bd0: 74 65 78 74 20 69 6e 20 7a 4b 65 79 54 65 78 74  text in zKeyText
1be0: 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 6e 43 68  [] */.    u8 nCh
1bf0: 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68  ar;    /* Length
1c00: 20 6f 66 20 74 68 65 20 6b 65 79 77 6f 72 64 20   of the keyword 
1c10: 69 6e 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f  in characters */
1c20: 0a 20 20 20 20 75 38 20 63 6f 64 65 3b 20 20 20  .    u8 code;   
1c30: 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70 65 20 6d    /* Join type m
1c40: 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77  ask */.  } aKeyw
1c50: 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a  ord[] = {.    /*
1c60: 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b 20 30 2c   natural */ { 0,
1c70: 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20    7, JT_NATURAL 
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1c90: 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74 20 20 20  ,.    /* left   
1ca0: 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20 4a 54 5f   */ { 6,  4, JT_
1cb0: 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20  LEFT|JT_OUTER   
1cc0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1cd0: 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b 20 31 30   outer   */ { 10
1ce0: 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 20 20  , 5, JT_OUTER   
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1d00: 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68 74 20 20  ,.    /* right  
1d10: 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20 4a 54 5f   */ { 14, 5, JT_
1d20: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 20  RIGHT|JT_OUTER  
1d30: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1d40: 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b 20 31 39   full    */ { 19
1d50: 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f  , 4, JT_LEFT|JT_
1d60: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d  RIGHT|JT_OUTER }
1d70: 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65 72 20 20  ,.    /* inner  
1d80: 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20 4a 54 5f   */ { 23, 5, JT_
1d90: 49 4e 4e 45 52 20 20 20 20 20 20 20 20 20 20 20  INNER           
1da0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1db0: 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b 20 32 38   cross   */ { 28
1dc0: 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54  , 5, JT_INNER|JT
1dd0: 5f 43 52 4f 53 53 20 20 20 20 20 20 20 20 20 7d  _CROSS         }
1de0: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20  ,.  };.  int i, 
1df0: 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20  j;.  apAll[0] = 
1e00: 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d  pA;.  apAll[1] =
1e10: 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20   pB;.  apAll[2] 
1e20: 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  = pC;.  for(i=0;
1e30: 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d   i<3 && apAll[i]
1e40: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
1e50: 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f  apAll[i];.    fo
1e60: 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69  r(j=0; j<ArraySi
1e70: 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b 20 6a 2b  ze(aKeyword); j+
1e80: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
1e90: 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e  >n==aKeyword[j].
1ea0: 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20  nChar .         
1eb0: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
1ec0: 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c  Cmp((char*)p->z,
1ed0: 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b 65 79 77   &zKeyText[aKeyw
1ee0: 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29  ord[j].i], p->n)
1ef0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a  ==0 ){.        j
1f00: 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b 65 79 77  ointype |= aKeyw
1f10: 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20  ord[j].code;.   
1f20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f30: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65    }.    }.    te
1f40: 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 7c 7c 20  stcase( j==0 || 
1f50: 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20  j==1 || j==2 || 
1f60: 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20  j==3 || j==4 || 
1f70: 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a  j==5 || j==6 );.
1f80: 20 20 20 20 69 66 28 20 6a 3e 3d 41 72 72 61 79      if( j>=Array
1f90: 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 20 29  Size(aKeyword) )
1fa0: 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65  {.      jointype
1fb0: 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20   |= JT_ERROR;.  
1fc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1fd0: 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20  .  }.  if(.     
1fe0: 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f  (jointype & (JT_
1ff0: 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29  INNER|JT_OUTER))
2000: 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f  ==(JT_INNER|JT_O
2010: 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a  UTER) ||.     (j
2020: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52  ointype & JT_ERR
2030: 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  OR)!=0.  ){.    
2040: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 20  const char *zSp 
2050: 3d 20 22 20 22 3b 0a 20 20 20 20 61 73 73 65 72  = " ";.    asser
2060: 74 28 20 70 42 21 3d 30 20 29 3b 0a 20 20 20 20  t( pB!=0 );.    
2070: 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70  if( pC==0 ){ zSp
2080: 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74 65  ++; }.    sqlite
2090: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
20a0: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e  , "unknown or un
20b0: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
20c0: 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20 22 25  ype: ".       "%
20d0: 54 20 25 54 25 73 25 54 22 2c 20 70 41 2c 20 70  T %T%s%T", pA, p
20e0: 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20  B, zSp, pC);.   
20f0: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49   jointype = JT_I
2100: 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NNER;.  }else if
2110: 28 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  ( (jointype & JT
2120: 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20 20  _OUTER)!=0 .    
2130: 20 20 20 20 20 26 26 20 28 6a 6f 69 6e 74 79 70       && (jointyp
2140: 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  e & (JT_LEFT|JT_
2150: 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c 45 46 54  RIGHT))!=JT_LEFT
2160: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
2170: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2180: 0a 20 20 20 20 20 20 22 52 49 47 48 54 20 61 6e  .      "RIGHT an
2190: 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49  d FULL OUTER JOI
21a0: 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65  Ns are not curre
21b0: 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29  ntly supported")
21c0: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
21d0: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20   JT_INNER;.  }. 
21e0: 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65   return jointype
21f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2200: 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  n the index of a
2210: 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62   column in a tab
2220: 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69  le.  Return -1 i
2230: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  f the column.** 
2240: 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
2250: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
2260: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c  /.static int col
2270: 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a  umnIndex(Table *
2280: 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72  pTab, const char
2290: 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69   *zCol){.  int i
22a0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
22b0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
22c0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
22d0: 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43  StrICmp(pTab->aC
22e0: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f  ol[i].zName, zCo
22f0: 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  l)==0 ) return i
2300: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
2310: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  1;.}../*.** Sear
2320: 63 68 20 74 68 65 20 66 69 72 73 74 20 4e 20 74  ch the first N t
2330: 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2c 20 66  ables in pSrc, f
2340: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
2350: 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  t, looking for a
2360: 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61 74 20 68  .** table that h
2370: 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  as a column name
2380: 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20  d zCol.  .**.** 
2390: 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73 65 74 20  When found, set 
23a0: 2a 70 69 54 61 62 20 61 6e 64 20 2a 70 69 43 6f  *piTab and *piCo
23b0: 6c 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 69  l to the table i
23c0: 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  ndex and column 
23d0: 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74 68 65 20  index.** of the 
23e0: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
23f0: 61 6e 64 20 72 65 74 75 72 6e 20 54 52 55 45 2e  and return TRUE.
2400: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20 66 6f  .**.** If not fo
2410: 75 6e 64 2c 20 72 65 74 75 72 6e 20 46 41 4c 53  und, return FALS
2420: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
2430: 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49   tableAndColumnI
2440: 6e 64 65 78 28 0a 20 20 53 72 63 4c 69 73 74 20  ndex(.  SrcList 
2450: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 2f 2a 20  *pSrc,       /* 
2460: 41 72 72 61 79 20 6f 66 20 74 61 62 6c 65 73 20  Array of tables 
2470: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69  to search */.  i
2480: 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20  nt N,           
2490: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
24a0: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2d   tables in pSrc-
24b0: 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63 68 20 2a  >a[] to search *
24c0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
24d0: 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65  zCol,    /* Name
24e0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77   of the column w
24f0: 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f  e are looking fo
2500: 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61  r */.  int *piTa
2510: 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  b,          /* W
2520: 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53  rite index of pS
2530: 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20 2a 2f 0a  rc->a[] here */.
2540: 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20 20 20 20    int *piCol    
2550: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
2560: 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d 3e 61  index of pSrc->a
2570: 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62 2d 3e 61  [*piTab].pTab->a
2580: 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a 29 7b  Col[] here */.){
2590: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
25a0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
25b0: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c  ooping over tabl
25c0: 65 73 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20  es in pSrc */.  
25d0: 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  int iCol;       
25e0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
25f0: 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68 69 6e 67   column matching
2600: 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73 65   zCol */..  asse
2610: 72 74 28 20 28 70 69 54 61 62 3d 3d 30 29 3d 3d  rt( (piTab==0)==
2620: 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f  (piCol==0) );  /
2630: 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69 74 68 65  * Both or neithe
2640: 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  r are NULL */.  
2650: 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b  for(i=0; i<N; i+
2660: 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 63  +){.    iCol = c
2670: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2d  olumnIndex(pSrc-
2680: 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c  >a[i].pTab, zCol
2690: 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e  );.    if( iCol>
26a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
26b0: 70 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  piTab ){.       
26c0: 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a 20 20 20   *piTab = i;.   
26d0: 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 43       *piCol = iC
26e0: 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ol;.      }.    
26f0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2700: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2710: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2720: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
2730: 20 74 6f 20 61 64 64 20 74 65 72 6d 73 20 69 6d   to add terms im
2740: 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e 20 73 79  plied by JOIN sy
2750: 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a 2a 20 57  ntax to the.** W
2760: 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72  HERE clause expr
2770: 65 73 73 69 6f 6e 20 6f 66 20 61 20 53 45 4c 45  ession of a SELE
2780: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  CT statement. Th
2790: 65 20 6e 65 77 20 74 65 72 6d 2c 20 77 68 69 63  e new term, whic
27a0: 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64 20 77 69  h.** is ANDed wi
27b0: 74 68 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  th the existing 
27c0: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 73  WHERE clause, is
27d0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
27e0: 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e 63 6f 6c  .**    (tab1.col
27f0: 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32 29 0a 2a  1 = tab2.col2).*
2800: 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 31 20  *.** where tab1 
2810: 69 73 20 74 68 65 20 69 53 72 63 27 74 68 20 74  is the iSrc'th t
2820: 61 62 6c 65 20 69 6e 20 53 72 63 4c 69 73 74 20  able in SrcList 
2830: 70 53 72 63 20 61 6e 64 20 74 61 62 32 20 69 73  pSrc and tab2 is
2840: 20 74 68 65 20 0a 2a 2a 20 28 69 53 72 63 2b 31   the .** (iSrc+1
2850: 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c  )'th. Column col
2860: 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c  1 is column iCol
2870: 4c 65 66 74 20 6f 66 20 74 61 62 31 2c 20 61 6e  Left of tab1, an
2880: 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c  d col2 is.** col
2890: 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74 20 6f 66  umn iColRight of
28a0: 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63   tab2..*/.static
28b0: 20 76 6f 69 64 20 61 64 64 57 68 65 72 65 54 65   void addWhereTe
28c0: 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rm(.  Parse *pPa
28d0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
28e0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
28f0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
2900: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
2910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2920: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
2930: 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  in FROM clause *
2940: 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74 2c 20 20  /.  int iLeft,  
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2960: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
2970: 66 69 72 73 74 20 74 61 62 6c 65 20 74 6f 20 6a  first table to j
2980: 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20  oin in pSrc */. 
2990: 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74 2c 20 20   int iColLeft,  
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
29c0: 75 6d 6e 20 69 6e 20 66 69 72 73 74 20 74 61 62  umn in first tab
29d0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67  le */.  int iRig
29e0: 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ht,             
29f0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2a00: 20 6f 66 20 73 65 63 6f 6e 64 20 74 61 62 6c 65   of second table
2a10: 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e   in pSrc */.  in
2a20: 74 20 69 43 6f 6c 52 69 67 68 74 2c 20 20 20 20  t iColRight,    
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a40: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
2a50: 20 69 6e 20 73 65 63 6f 6e 64 20 74 61 62 6c 65   in second table
2a60: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74 65   */.  int isOute
2a70: 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20 20 20 20  rJoin,          
2a80: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2a90: 20 74 68 69 73 20 69 73 20 61 6e 20 4f 55 54 45   this is an OUTE
2aa0: 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72  R join */.  Expr
2ab0: 20 2a 2a 70 70 57 68 65 72 65 20 20 20 20 20 20   **ppWhere      
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2ad0: 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48 45 52 45  N/OUT: The WHERE
2ae0: 20 63 6c 61 75 73 65 20 74 6f 20 61 64 64 20 74   clause to add t
2af0: 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  o */.){.  sqlite
2b00: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
2b10: 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 31 3b  db;.  Expr *pE1;
2b20: 0a 20 20 45 78 70 72 20 2a 70 45 32 3b 0a 20 20  .  Expr *pE2;.  
2b30: 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73  Expr *pEq;..  as
2b40: 73 65 72 74 28 20 69 4c 65 66 74 3c 69 52 69 67  sert( iLeft<iRig
2b50: 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ht );.  assert( 
2b60: 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52 69 67 68  pSrc->nSrc>iRigh
2b70: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
2b80: 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70 54  Src->a[iLeft].pT
2b90: 61 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ab );.  assert( 
2ba0: 70 53 72 63 2d 3e 61 5b 69 52 69 67 68 74 5d 2e  pSrc->a[iRight].
2bb0: 70 54 61 62 20 29 3b 0a 0a 20 20 70 45 31 20 3d  pTab );..  pE1 =
2bc0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f   sqlite3CreateCo
2bd0: 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72  lumnExpr(db, pSr
2be0: 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f 6c 4c 65  c, iLeft, iColLe
2bf0: 66 74 29 3b 0a 20 20 70 45 32 20 3d 20 73 71 6c  ft);.  pE2 = sql
2c00: 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e  ite3CreateColumn
2c10: 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20 69  Expr(db, pSrc, i
2c20: 52 69 67 68 74 2c 20 69 43 6f 6c 52 69 67 68 74  Right, iColRight
2c30: 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73 71 6c 69  );..  pEq = sqli
2c40: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
2c50: 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20 70 45 32   TK_EQ, pE1, pE2
2c60: 29 3b 0a 20 20 69 66 28 20 70 45 71 20 26 26 20  );.  if( pEq && 
2c70: 69 73 4f 75 74 65 72 4a 6f 69 6e 20 29 7b 0a 20  isOuterJoin ){. 
2c80: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
2c90: 74 79 28 70 45 71 2c 20 45 50 5f 46 72 6f 6d 4a  ty(pEq, EP_FromJ
2ca0: 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72 74  oin);.    assert
2cb0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2cc0: 74 79 28 70 45 71 2c 20 45 50 5f 54 6f 6b 65 6e  ty(pEq, EP_Token
2cd0: 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
2ce0: 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74 56   );.    ExprSetV
2cf0: 56 41 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20  VAProperty(pEq, 
2d00: 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
2d10: 20 20 70 45 71 2d 3e 69 52 69 67 68 74 4a 6f 69    pEq->iRightJoi
2d20: 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 70 45  nTable = (i16)pE
2d30: 32 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 7d 0a 20  2->iTable;.  }. 
2d40: 20 2a 70 70 57 68 65 72 65 20 3d 20 73 71 6c 69   *ppWhere = sqli
2d50: 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 2a  te3ExprAnd(db, *
2d60: 70 70 57 68 65 72 65 2c 20 70 45 71 29 3b 0a 7d  ppWhere, pEq);.}
2d70: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
2d80: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70  EP_FromJoin prop
2d90: 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d  erty on all term
2da0: 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65  s of the given e
2db0: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e  xpression..** An
2dc0: 64 20 73 65 74 20 74 68 65 20 45 78 70 72 2e 69  d set the Expr.i
2dd0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74  RightJoinTable t
2de0: 6f 20 69 54 61 62 6c 65 20 66 6f 72 20 65 76 65  o iTable for eve
2df0: 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a  ry term in the.*
2e00: 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  * expression..**
2e10: 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a  .** The EP_FromJ
2e20: 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 69 73 20  oin property is 
2e30: 75 73 65 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66  used on terms of
2e40: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
2e50: 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45  o tell.** the LE
2e60: 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72  FT OUTER JOIN pr
2e70: 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 74  ocessing logic t
2e80: 68 61 74 20 74 68 69 73 20 74 65 72 6d 20 69 73  hat this term is
2e90: 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20   part of the.** 
2ea0: 6a 6f 69 6e 20 72 65 73 74 72 69 63 74 69 6f 6e  join restriction
2eb0: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
2ec0: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
2ed0: 61 75 73 65 20 61 6e 64 20 6e 6f 74 20 61 20 70  ause and not a p
2ee0: 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f  art.** of the mo
2ef0: 72 65 20 67 65 6e 65 72 61 6c 20 57 48 45 52 45  re general WHERE
2f00: 20 63 6c 61 75 73 65 2e 20 20 54 68 65 73 65 20   clause.  These 
2f10: 74 65 72 6d 73 20 61 72 65 20 6d 6f 76 65 64 20  terms are moved 
2f20: 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57  over to the.** W
2f30: 48 45 52 45 20 63 6c 61 75 73 65 20 64 75 72 69  HERE clause duri
2f40: 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69  ng join processi
2f50: 6e 67 20 62 75 74 20 77 65 20 6e 65 65 64 20 74  ng but we need t
2f60: 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 20  o remember that 
2f70: 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74  they.** originat
2f80: 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  ed in the ON or 
2f90: 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a  USING clause..**
2fa0: 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 69 52 69  .** The Expr.iRi
2fb0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 65 6c  ghtJoinTable tel
2fc0: 6c 73 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ls the WHERE cla
2fd0: 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 74  use processing t
2fe0: 68 61 74 20 74 68 65 0a 2a 2a 20 65 78 70 72 65  hat the.** expre
2ff0: 73 73 69 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e  ssion depends on
3000: 20 74 61 62 6c 65 20 69 52 69 67 68 74 4a 6f 69   table iRightJoi
3010: 6e 54 61 62 6c 65 20 65 76 65 6e 20 69 66 20 74  nTable even if t
3020: 68 61 74 20 74 61 62 6c 65 20 69 73 20 6e 6f 74  hat table is not
3030: 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 6d  .** explicitly m
3040: 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20  entioned in the 
3050: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 61  expression.  Tha
3060: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  t information is
3070: 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72 20 63   needed.** for c
3080: 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ases like this:.
3090: 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
30a0: 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a  * FROM t1 LEFT J
30b0: 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74  OIN t2 ON t1.a=t
30c0: 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35 0a 2a  2.b AND t1.x=5.*
30d0: 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72 65 20 63  *.** The where c
30e0: 6c 61 75 73 65 20 6e 65 65 64 73 20 74 6f 20 64  lause needs to d
30f0: 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e  efer the handlin
3100: 67 20 6f 66 20 74 68 65 20 74 31 2e 78 3d 35 0a  g of the t1.x=5.
3110: 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20 61 66  ** term until af
3120: 74 65 72 20 74 68 65 20 74 32 20 6c 6f 6f 70 20  ter the t2 loop 
3130: 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 49 6e  of the join.  In
3140: 20 74 68 61 74 20 77 61 79 2c 20 61 0a 2a 2a 20   that way, a.** 
3150: 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77 69 6c 6c  NULL t2 row will
3160: 20 62 65 20 69 6e 73 65 72 74 65 64 20 77 68 65   be inserted whe
3170: 6e 65 76 65 72 20 74 31 2e 78 21 3d 35 2e 20 20  never t1.x!=5.  
3180: 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20  If we do not.** 
3190: 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69  defer the handli
31a0: 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20 69 74  ng of t1.x=5, it
31b0: 20 77 69 6c 6c 20 62 65 20 70 72 6f 63 65 73 73   will be process
31c0: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a  ed immediately.*
31d0: 2a 20 61 66 74 65 72 20 74 68 65 20 74 31 20 6c  * after the t1 l
31e0: 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20 77 69 74  oop and rows wit
31f0: 68 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c 20 6e  h t1.x!=5 will n
3200: 65 76 65 72 20 61 70 70 65 61 72 20 69 6e 0a 2a  ever appear in.*
3210: 2a 20 74 68 65 20 6f 75 74 70 75 74 2c 20 77 68  * the output, wh
3220: 69 63 68 20 69 73 20 69 6e 63 6f 72 72 65 63 74  ich is incorrect
3230: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3240: 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78 70   setJoinExpr(Exp
3250: 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65  r *p, int iTable
3260: 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  ){.  while( p ){
3270: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
3280: 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a  erty(p, EP_FromJ
3290: 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72 74  oin);.    assert
32a0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
32b0: 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ty(p, EP_TokenOn
32c0: 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29  ly|EP_Reduced) )
32d0: 3b 0a 20 20 20 20 45 78 70 72 53 65 74 56 56 41  ;.    ExprSetVVA
32e0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4e  Property(p, EP_N
32f0: 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 70 2d  oReduce);.    p-
3300: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
3310: 20 3d 20 28 69 31 36 29 69 54 61 62 6c 65 3b 0a   = (i16)iTable;.
3320: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
3330: 4b 5f 46 55 4e 43 54 49 4f 4e 20 26 26 20 70 2d  K_FUNCTION && p-
3340: 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  >x.pList ){.    
3350: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
3360: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 78 2e 70  or(i=0; i<p->x.p
3370: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
3380: 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74 4a 6f  ){.        setJo
3390: 69 6e 45 78 70 72 28 70 2d 3e 78 2e 70 4c 69 73  inExpr(p->x.pLis
33a0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69  t->a[i].pExpr, i
33b0: 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Table);.      }.
33c0: 20 20 20 20 7d 0a 20 20 20 20 73 65 74 4a 6f 69      }.    setJoi
33d0: 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20  nExpr(p->pLeft, 
33e0: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d  iTable);.    p =
33f0: 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20   p->pRight;.  } 
3400: 0a 7d 0a 0a 2f 2a 20 55 6e 64 6f 20 74 68 65 20  .}../* Undo the 
3410: 77 6f 72 6b 20 6f 66 20 73 65 74 4a 6f 69 6e 45  work of setJoinE
3420: 78 70 72 28 29 2e 20 20 49 6e 20 74 68 65 20 65  xpr().  In the e
3430: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 70  xpression tree p
3440: 2c 20 63 6f 6e 76 65 72 74 20 65 76 65 72 79 0a  , convert every.
3450: 2a 2a 20 74 65 72 6d 20 74 68 61 74 20 69 73 20  ** term that is 
3460: 6d 61 72 6b 65 64 20 77 69 74 68 20 45 50 5f 46  marked with EP_F
3470: 72 6f 6d 4a 6f 69 6e 20 61 6e 64 20 69 52 69 67  romJoin and iRig
3480: 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69 54 61  htJoinTable==iTa
3490: 62 6c 65 20 69 6e 74 6f 0a 2a 2a 20 61 6e 20 6f  ble into.** an o
34a0: 72 64 69 6e 61 72 79 20 74 65 72 6d 20 74 68 61  rdinary term tha
34b0: 74 20 6f 6d 69 74 73 20 74 68 65 20 45 50 5f 46  t omits the EP_F
34c0: 72 6f 6d 4a 6f 69 6e 20 6d 61 72 6b 2e 0a 2a 2a  romJoin mark..**
34d0: 0a 2a 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73  .** This happens
34e0: 20 77 68 65 6e 20 61 20 4c 45 46 54 20 4a 4f 49   when a LEFT JOI
34f0: 4e 20 69 73 20 73 69 6d 70 6c 69 66 69 65 64 20  N is simplified 
3500: 69 6e 74 6f 20 61 6e 20 6f 72 64 69 6e 61 72 79  into an ordinary
3510: 20 4a 4f 49 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63   JOIN..*/.static
3520: 20 76 6f 69 64 20 75 6e 73 65 74 4a 6f 69 6e 45   void unsetJoinE
3530: 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  xpr(Expr *p, int
3540: 20 69 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c   iTable){.  whil
3550: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  e( p ){.    if( 
3560: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
3570: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a  p, EP_FromJoin).
3580: 20 20 20 20 20 26 26 20 28 69 54 61 62 6c 65 3c       && (iTable<
3590: 30 20 7c 7c 20 70 2d 3e 69 52 69 67 68 74 4a 6f  0 || p->iRightJo
35a0: 69 6e 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 29  inTable==iTable)
35b0: 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 43 6c   ){.      ExprCl
35c0: 65 61 72 50 72 6f 70 65 72 74 79 28 70 2c 20 45  earProperty(p, E
35d0: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20  P_FromJoin);.   
35e0: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70   }.    if( p->op
35f0: 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 26 26  ==TK_FUNCTION &&
3600: 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20   p->x.pList ){. 
3610: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
3620: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
3630: 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  x.pList->nExpr; 
3640: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 6e  i++){.        un
3650: 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 78  setJoinExpr(p->x
3660: 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
3670: 70 72 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20  pr, iTable);.   
3680: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75     }.    }.    u
3690: 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e  nsetJoinExpr(p->
36a0: 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a  pLeft, iTable);.
36b0: 20 20 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68      p = p->pRigh
36c0: 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  t;.  } .}../*.**
36d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72   This routine pr
36e0: 6f 63 65 73 73 65 73 20 74 68 65 20 6a 6f 69 6e  ocesses the join
36f0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
3700: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
3710: 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55  ent..** ON and U
3720: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65  SING clauses are
3730: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
3740: 65 78 74 72 61 20 74 65 72 6d 73 20 6f 66 20 74  extra terms of t
3750: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
3760: 0a 2a 2a 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e  .** NATURAL join
3770: 73 20 61 6c 73 6f 20 63 72 65 61 74 65 20 65 78  s also create ex
3780: 74 72 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  tra WHERE clause
3790: 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   terms..**.** Th
37a0: 65 20 74 65 72 6d 73 20 6f 66 20 61 20 46 52 4f  e terms of a FRO
37b0: 4d 20 63 6c 61 75 73 65 20 61 72 65 20 63 6f 6e  M clause are con
37c0: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 53 65  tained in the Se
37d0: 6c 65 63 74 2e 70 53 72 63 20 73 74 72 75 63 74  lect.pSrc struct
37e0: 75 72 65 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74  ure..** The left
37f0: 20 6d 6f 73 74 20 74 61 62 6c 65 20 69 73 20 74   most table is t
3800: 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
3810: 6e 20 53 65 6c 65 63 74 2e 70 53 72 63 2e 20 20  n Select.pSrc.  
3820: 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a  The right-most.*
3830: 2a 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 6c  * table is the l
3840: 61 73 74 20 65 6e 74 72 79 2e 20 20 54 68 65 20  ast entry.  The 
3850: 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 69 73  join operator is
3860: 20 68 65 6c 64 20 69 6e 20 74 68 65 20 65 6e 74   held in the ent
3870: 72 79 20 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66  ry to.** the lef
3880: 74 2e 20 20 54 68 75 73 20 65 6e 74 72 79 20 30  t.  Thus entry 0
3890: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f   contains the jo
38a0: 69 6e 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20  in operator for 
38b0: 74 68 65 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e  the join between
38c0: 0a 2a 2a 20 65 6e 74 72 69 65 73 20 30 20 61 6e  .** entries 0 an
38d0: 64 20 31 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20  d 1.  Any ON or 
38e0: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 73  USING clauses as
38f0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
3900: 65 20 6a 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c  e join are.** al
3910: 73 6f 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  so attached to t
3920: 68 65 20 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a  he left entry..*
3930: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3940: 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  e returns the nu
3950: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65  mber of errors e
3960: 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73  ncountered..*/.s
3970: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
3980: 50 72 6f 63 65 73 73 4a 6f 69 6e 28 50 61 72 73  ProcessJoin(Pars
3990: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
39a0: 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74  t *p){.  SrcList
39b0: 20 2a 70 53 72 63 3b 20 20 20 20 20 20 20 20 20   *pSrc;         
39c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
39d0: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
39e0: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  OM clause */.  i
39f0: 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
3a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3a10: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
3a20: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
3a30: 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74 3b  ist_item *pLeft;
3a40: 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 74 61 62       /* Left tab
3a50: 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20  le being joined 
3a60: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
3a70: 69 73 74 5f 69 74 65 6d 20 2a 70 52 69 67 68 74  ist_item *pRight
3a80: 3b 20 20 20 20 2f 2a 20 52 69 67 68 74 20 74 61  ;    /* Right ta
3a90: 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64  ble being joined
3aa0: 20 2a 2f 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d   */..  pSrc = p-
3ab0: 3e 70 53 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d  >pSrc;.  pLeft =
3ac0: 20 26 70 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20   &pSrc->a[0];.  
3ad0: 70 52 69 67 68 74 20 3d 20 26 70 4c 65 66 74 5b  pRight = &pLeft[
3ae0: 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  1];.  for(i=0; i
3af0: 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69  <pSrc->nSrc-1; i
3b00: 2b 2b 2c 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c  ++, pRight++, pL
3b10: 65 66 74 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  eft++){.    Tabl
3b20: 65 20 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70  e *pRightTab = p
3b30: 52 69 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20  Right->pTab;.   
3b40: 20 69 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20   int isOuter;.. 
3b50: 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 4c 65     if( NEVER(pLe
3b60: 66 74 2d 3e 70 54 61 62 3d 3d 30 20 7c 7c 20 70  ft->pTab==0 || p
3b70: 52 69 67 68 74 54 61 62 3d 3d 30 29 20 29 20 63  RightTab==0) ) c
3b80: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 73 4f  ontinue;.    isO
3b90: 75 74 65 72 20 3d 20 28 70 52 69 67 68 74 2d 3e  uter = (pRight->
3ba0: 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  fg.jointype & JT
3bb0: 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a 20 20 20  _OUTER)!=0;..   
3bc0: 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41 54   /* When the NAT
3bd0: 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73 20  URAL keyword is 
3be0: 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48 45  present, add WHE
3bf0: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
3c00: 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79  for.    ** every
3c10: 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65   column that the
3c20: 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76 65   two tables have
3c30: 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20   in common..    
3c40: 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  */.    if( pRigh
3c50: 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  t->fg.jointype &
3c60: 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20   JT_NATURAL ){. 
3c70: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
3c80: 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e  >pOn || pRight->
3c90: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
3ca0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
3cb0: 67 28 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54  g(pParse, "a NAT
3cc0: 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f  URAL join may no
3cd0: 74 20 68 61 76 65 20 22 0a 20 20 20 20 20 20 20  t have ".       
3ce0: 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53      "an ON or US
3cf0: 49 4e 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b  ING clause", 0);
3d00: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3d10: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
3d20: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 52 69 67   for(j=0; j<pRig
3d30: 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  htTab->nCol; j++
3d40: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
3d50: 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d  *zName;   /* Nam
3d60: 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  e of column in t
3d70: 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 2a  he right table *
3d80: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c  /.        int iL
3d90: 65 66 74 3b 20 20 20 20 20 2f 2a 20 4d 61 74 63  eft;     /* Matc
3da0: 68 69 6e 67 20 6c 65 66 74 20 74 61 62 6c 65 20  hing left table 
3db0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
3dc0: 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74  LeftCol;  /* Mat
3dd0: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20  ching column in 
3de0: 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 2a  the left table *
3df0: 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  /..        zName
3e00: 20 3d 20 70 52 69 67 68 74 54 61 62 2d 3e 61 43   = pRightTab->aC
3e10: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol[j].zName;.   
3e20: 20 20 20 20 20 69 66 28 20 74 61 62 6c 65 41 6e       if( tableAn
3e30: 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72  dColumnIndex(pSr
3e40: 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26  c, i+1, zName, &
3e50: 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c  iLeft, &iLeftCol
3e60: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ) ){.          a
3e70: 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61 72  ddWhereTerm(pPar
3e80: 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c  se, pSrc, iLeft,
3e90: 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20   iLeftCol, i+1, 
3ea0: 6a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  j,.             
3eb0: 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74 65            isOute
3ec0: 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a  r, &p->pWhere);.
3ed0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3ee0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
3ef0: 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e  Disallow both ON
3f00: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
3f10: 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a  es in the same j
3f20: 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  oin.    */.    i
3f30: 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26  f( pRight->pOn &
3f40: 26 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  & pRight->pUsing
3f50: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
3f60: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
3f70: 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62  , "cannot have b
3f80: 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  oth ON and USING
3f90: 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75   ".        "clau
3fa0: 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ses in the same 
3fb0: 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  join");.      re
3fc0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  turn 1;.    }.. 
3fd0: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e     /* Add the ON
3fe0: 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65   clause to the e
3ff0: 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
4000: 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65  clause, connecte
4010: 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41  d by.    ** an A
4020: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20  ND operator..   
4030: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
4040: 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20  ht->pOn ){.     
4050: 20 69 66 28 20 69 73 4f 75 74 65 72 20 29 20 73   if( isOuter ) s
4060: 65 74 4a 6f 69 6e 45 78 70 72 28 70 52 69 67 68  etJoinExpr(pRigh
4070: 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e  t->pOn, pRight->
4080: 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
4090: 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  p->pWhere = sqli
40a0: 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
40b0: 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  e->db, p->pWhere
40c0: 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a  , pRight->pOn);.
40d0: 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f        pRight->pO
40e0: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  n = 0;.    }..  
40f0: 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72    /* Create extr
4100: 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57  a terms on the W
4110: 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20  HERE clause for 
4120: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  each column name
4130: 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  d.    ** in the 
4140: 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45  USING clause.  E
4150: 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74  xample: If the t
4160: 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  wo tables to be 
4170: 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20  joined are .    
4180: 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74  ** A and B and t
4190: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
41a0: 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20  names X, Y, and 
41b0: 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68 69 73  Z, then add this
41c0: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57  .    ** to the W
41d0: 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20  HERE clause:    
41e0: 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d  A.X=B.X AND A.Y=
41f0: 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a  B.Y AND A.Z=B.Z.
4200: 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e      ** Report an
4210: 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f   error if any co
4220: 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69  lumn mentioned i
4230: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
4240: 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74  se is.    ** not
4250: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f   contained in bo
4260: 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  th tables to be 
4270: 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  joined..    */. 
4280: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
4290: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49  Using ){.      I
42a0: 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  dList *pList = p
42b0: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20  Right->pUsing;. 
42c0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
42d0: 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29  pList->nId; j++)
42e0: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
42f0: 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61  zName;     /* Na
4300: 6d 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20 69  me of the term i
4310: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
4320: 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  se */.        in
4330: 74 20 69 4c 65 66 74 3b 20 20 20 20 20 20 20 2f  t iLeft;       /
4340: 2a 20 54 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c  * Table on the l
4350: 65 66 74 20 77 69 74 68 20 6d 61 74 63 68 69 6e  eft with matchin
4360: 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  g column name */
4370: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65  .        int iLe
4380: 66 74 43 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c  ftCol;    /* Col
4390: 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61  umn number of ma
43a0: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e  tching column on
43b0: 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20   the left */.   
43c0: 20 20 20 20 20 69 6e 74 20 69 52 69 67 68 74 43       int iRightC
43d0: 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20  ol;   /* Column 
43e0: 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69  number of matchi
43f0: 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65  ng column on the
4400: 20 72 69 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20   right */..     
4410: 20 20 20 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74     zName = pList
4420: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[j].zName;.  
4430: 20 20 20 20 20 20 69 52 69 67 68 74 43 6f 6c 20        iRightCol 
4440: 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52  = columnIndex(pR
4450: 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b  ightTab, zName);
4460: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 52 69  .        if( iRi
4470: 67 68 74 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20  ghtCol<0.       
4480: 20 20 7c 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f    || !tableAndCo
4490: 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20  lumnIndex(pSrc, 
44a0: 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65  i+1, zName, &iLe
44b0: 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20  ft, &iLeftCol). 
44c0: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
44d0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
44e0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
44f0: 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63  not join using c
4500: 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d  olumn %s - colum
4510: 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  n ".            
4520: 22 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20  "not present in 
4530: 62 6f 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e  both tables", zN
4540: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
4550: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
4560: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57    }.        addW
4570: 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c  hereTerm(pParse,
4580: 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c   pSrc, iLeft, iL
4590: 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69  eftCol, i+1, iRi
45a0: 67 68 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20  ghtCol,.        
45b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
45c0: 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65  uter, &p->pWhere
45d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
45e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
45f0: 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  .}../* Forward r
4600: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74  eference */.stat
4610: 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49  ic KeyInfo *keyI
4620: 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
4630: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
4640: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
4650: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
4660: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
4670: 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65       /* Form the
4680: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20   KeyInfo object 
4690: 66 72 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69  from this ExprLi
46a0: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61  st */.  int iSta
46b0: 72 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rt,          /* 
46c0: 42 65 67 69 6e 20 77 69 74 68 20 74 68 69 73 20  Begin with this 
46d0: 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20  column of pList 
46e0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  */.  int nExtra 
46f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
4700: 20 74 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61   this many extra
4710: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20   columns to the 
4720: 65 6e 64 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a  end */.);../*.**
4730: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
4740: 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68  hat will push th
4750: 65 20 72 65 63 6f 72 64 20 69 6e 20 72 65 67 69  e record in regi
4760: 73 74 65 72 73 20 72 65 67 44 61 74 61 0a 2a 2a  sters regData.**
4770: 20 74 68 72 6f 75 67 68 20 72 65 67 44 61 74 61   through regData
4780: 2b 6e 44 61 74 61 2d 31 20 6f 6e 74 6f 20 74 68  +nData-1 onto th
4790: 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61  e sorter..*/.sta
47a0: 74 69 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74  tic void pushOnt
47b0: 6f 53 6f 72 74 65 72 28 0a 20 20 50 61 72 73 65  oSorter(.  Parse
47c0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
47d0: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
47e0: 65 78 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78  ext */.  SortCtx
47f0: 20 2a 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20   *pSort,        
4800: 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
4810: 62 6f 75 74 20 74 68 65 20 4f 52 44 45 52 20 42  bout the ORDER B
4820: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65  Y clause */.  Se
4830: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
4840: 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c       /* The whol
4850: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
4860: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44  nt */.  int regD
4870: 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ata,           /
4880: 2a 20 46 69 72 73 74 20 72 65 67 69 73 74 65 72  * First register
4890: 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 74 6f   holding data to
48a0: 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20   be sorted */.  
48b0: 69 6e 74 20 72 65 67 4f 72 69 67 44 61 74 61 2c  int regOrigData,
48c0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
48d0: 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  register holding
48e0: 20 64 61 74 61 20 62 65 66 6f 72 65 20 70 61 63   data before pac
48f0: 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 44  king */.  int nD
4900: 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  ata,            
4910: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c   /* Number of el
4920: 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61  ements in the da
4930: 74 61 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  ta array */.  in
4940: 74 20 6e 50 72 65 66 69 78 52 65 67 20 20 20 20  t nPrefixReg    
4950: 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20 72       /* No. of r
4960: 65 67 20 70 72 69 6f 72 20 74 6f 20 72 65 67 44  eg prior to regD
4970: 61 74 61 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  ata available fo
4980: 72 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 56 64  r use */.){.  Vd
4990: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
49a0: 70 56 64 62 65 3b 20 20 20 20 20 20 20 20 20 20  pVdbe;          
49b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
49c0: 2a 20 53 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e  * Stmt under con
49d0: 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
49e0: 6e 74 20 62 53 65 71 20 3d 20 28 28 70 53 6f 72  nt bSeq = ((pSor
49f0: 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53  t->sortFlags & S
4a00: 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65  ORTFLAG_UseSorte
4a10: 72 29 3d 3d 30 29 3b 0a 20 20 69 6e 74 20 6e 45  r)==0);.  int nE
4a20: 78 70 72 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72  xpr = pSort->pOr
4a30: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 20 20  derBy->nExpr;   
4a40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
4a50: 2e 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65  . of ORDER BY te
4a60: 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 61  rms */.  int nBa
4a70: 73 65 20 3d 20 6e 45 78 70 72 20 2b 20 62 53 65  se = nExpr + bSe
4a80: 71 20 2b 20 6e 44 61 74 61 3b 20 20 20 20 20 20  q + nData;      
4a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 65            /* Fie
4aa0: 6c 64 73 20 69 6e 20 73 6f 72 74 65 72 20 72 65  lds in sorter re
4ab0: 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65  cord */.  int re
4ac0: 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  gBase;          
4ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
4af0: 67 73 20 66 6f 72 20 73 6f 72 74 65 72 20 72 65  gs for sorter re
4b00: 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65  cord */.  int re
4b10: 67 52 65 63 6f 72 64 20 3d 20 2b 2b 70 50 61 72  gRecord = ++pPar
4b20: 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20  se->nMem;       
4b30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
4b40: 73 65 6d 62 6c 65 64 20 73 6f 72 74 65 72 20 72  sembled sorter r
4b50: 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ecord */.  int n
4b60: 4f 42 53 61 74 20 3d 20 70 53 6f 72 74 2d 3e 6e  OBSat = pSort->n
4b70: 4f 42 53 61 74 3b 20 20 20 20 20 20 20 20 20 20  OBSat;          
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4b90: 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f  RDER BY terms to
4ba0: 20 73 6b 69 70 20 2a 2f 0a 20 20 69 6e 74 20 6f   skip */.  int o
4bb0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
4bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4bd0: 20 4f 70 63 6f 64 65 20 74 6f 20 61 64 64 20 73   Opcode to add s
4be0: 6f 72 74 65 72 20 72 65 63 6f 72 64 20 74 6f 20  orter record to 
4bf0: 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  sorter */.  int 
4c00: 69 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20  iLimit;         
4c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4c20: 2a 20 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 20  * LIMIT counter 
4c30: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 62 53  */..  assert( bS
4c40: 65 71 3d 3d 30 20 7c 7c 20 62 53 65 71 3d 3d 31  eq==0 || bSeq==1
4c50: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 44   );.  assert( nD
4c60: 61 74 61 3d 3d 31 20 7c 7c 20 72 65 67 44 61 74  ata==1 || regDat
4c70: 61 3d 3d 72 65 67 4f 72 69 67 44 61 74 61 20 7c  a==regOrigData |
4c80: 7c 20 72 65 67 4f 72 69 67 44 61 74 61 3d 3d 30  | regOrigData==0
4c90: 20 29 3b 0a 20 20 69 66 28 20 6e 50 72 65 66 69   );.  if( nPrefi
4ca0: 78 52 65 67 20 29 7b 0a 20 20 20 20 61 73 73 65  xReg ){.    asse
4cb0: 72 74 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d  rt( nPrefixReg==
4cc0: 6e 45 78 70 72 2b 62 53 65 71 20 29 3b 0a 20 20  nExpr+bSeq );.  
4cd0: 20 20 72 65 67 42 61 73 65 20 3d 20 72 65 67 44    regBase = regD
4ce0: 61 74 61 20 2d 20 6e 45 78 70 72 20 2d 20 62 53  ata - nExpr - bS
4cf0: 65 71 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  eq;.  }else{.   
4d00: 20 72 65 67 42 61 73 65 20 3d 20 70 50 61 72 73   regBase = pPars
4d10: 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20  e->nMem + 1;.   
4d20: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
4d30: 20 6e 42 61 73 65 3b 0a 20 20 7d 0a 20 20 61 73   nBase;.  }.  as
4d40: 73 65 72 74 28 20 70 53 65 6c 65 63 74 2d 3e 69  sert( pSelect->i
4d50: 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 53 65  Offset==0 || pSe
4d60: 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 21 3d 30 20  lect->iLimit!=0 
4d70: 29 3b 0a 20 20 69 4c 69 6d 69 74 20 3d 20 70 53  );.  iLimit = pS
4d80: 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 20 3f  elect->iOffset ?
4d90: 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65   pSelect->iOffse
4da0: 74 2b 31 20 3a 20 70 53 65 6c 65 63 74 2d 3e 69  t+1 : pSelect->i
4db0: 4c 69 6d 69 74 3b 0a 20 20 70 53 6f 72 74 2d 3e  Limit;.  pSort->
4dc0: 6c 61 62 65 6c 44 6f 6e 65 20 3d 20 73 71 6c 69  labelDone = sqli
4dd0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
4de0: 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  (v);.  sqlite3Ex
4df0: 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
4e00: 50 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f  Parse, pSort->pO
4e10: 72 64 65 72 42 79 2c 20 72 65 67 42 61 73 65 2c  rderBy, regBase,
4e20: 20 72 65 67 4f 72 69 67 44 61 74 61 2c 0a 20 20   regOrigData,.  
4e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e40: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45          SQLITE_E
4e50: 43 45 4c 5f 44 55 50 20 7c 20 28 72 65 67 4f 72  CEL_DUP | (regOr
4e60: 69 67 44 61 74 61 3f 20 53 51 4c 49 54 45 5f 45  igData? SQLITE_E
4e70: 43 45 4c 5f 52 45 46 20 3a 20 30 29 29 3b 0a 20  CEL_REF : 0));. 
4e80: 20 69 66 28 20 62 53 65 71 20 29 7b 0a 20 20 20   if( bSeq ){.   
4e90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4ea0: 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  p2(v, OP_Sequenc
4eb0: 65 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73  e, pSort->iECurs
4ec0: 6f 72 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70  or, regBase+nExp
4ed0: 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50  r);.  }.  if( nP
4ee0: 72 65 66 69 78 52 65 67 3d 3d 30 20 26 26 20 6e  refixReg==0 && n
4ef0: 44 61 74 61 3e 30 20 29 7b 0a 20 20 20 20 73 71  Data>0 ){.    sq
4f00: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
4f10: 65 28 70 50 61 72 73 65 2c 20 72 65 67 44 61 74  e(pParse, regDat
4f20: 61 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  a, regBase+nExpr
4f30: 2b 62 53 65 71 2c 20 6e 44 61 74 61 29 3b 0a 20  +bSeq, nData);. 
4f40: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
4f50: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
4f60: 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65  eRecord, regBase
4f70: 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d 6e  +nOBSat, nBase-n
4f80: 4f 42 53 61 74 2c 20 72 65 67 52 65 63 6f 72 64  OBSat, regRecord
4f90: 29 3b 0a 20 20 69 66 28 20 6e 4f 42 53 61 74 3e  );.  if( nOBSat>
4fa0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67  0 ){.    int reg
4fb0: 50 72 65 76 4b 65 79 3b 20 20 20 2f 2a 20 54 68  PrevKey;   /* Th
4fc0: 65 20 66 69 72 73 74 20 6e 4f 42 53 61 74 20 63  e first nOBSat c
4fd0: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 70 72  olumns of the pr
4fe0: 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20  evious row */.  
4ff0: 20 20 69 6e 74 20 61 64 64 72 46 69 72 73 74 3b    int addrFirst;
5000: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
5010: 66 20 74 68 65 20 4f 50 5f 49 66 4e 6f 74 20 6f  f the OP_IfNot o
5020: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74  pcode */.    int
5030: 20 61 64 64 72 4a 6d 70 3b 20 20 20 20 20 20 2f   addrJmp;      /
5040: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
5050: 20 4f 50 5f 4a 75 6d 70 20 6f 70 63 6f 64 65 20   OP_Jump opcode 
5060: 2a 2f 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70  */.    VdbeOp *p
5070: 4f 70 3b 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f  Op;      /* Opco
5080: 64 65 20 74 68 61 74 20 6f 70 65 6e 73 20 74 68  de that opens th
5090: 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20  e sorter */.    
50a0: 69 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20  int nKey;       
50b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
50c0: 6f 72 74 69 6e 67 20 6b 65 79 20 63 6f 6c 75 6d  orting key colum
50d0: 6e 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 4f 50  ns, including OP
50e0: 5f 53 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 20  _Sequence */.   
50f0: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 49 3b 20 20   KeyInfo *pKI;  
5100: 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 4b     /* Original K
5110: 65 79 49 6e 66 6f 20 6f 6e 20 74 68 65 20 73 6f  eyInfo on the so
5120: 72 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 0a 20  rter table */.. 
5130: 20 20 20 72 65 67 50 72 65 76 4b 65 79 20 3d 20     regPrevKey = 
5140: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
5150: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
5160: 20 2b 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61   += pSort->nOBSa
5170: 74 3b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 6e 45  t;.    nKey = nE
5180: 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42  xpr - pSort->nOB
5190: 53 61 74 20 2b 20 62 53 65 71 3b 0a 20 20 20 20  Sat + bSeq;.    
51a0: 69 66 28 20 62 53 65 71 20 29 7b 0a 20 20 20 20  if( bSeq ){.    
51b0: 20 20 61 64 64 72 46 69 72 73 74 20 3d 20 73 71    addrFirst = sq
51c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
51d0: 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67  v, OP_IfNot, reg
51e0: 42 61 73 65 2b 6e 45 78 70 72 29 3b 20 0a 20 20  Base+nExpr); .  
51f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
5200: 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74  ddrFirst = sqlit
5210: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
5220: 4f 50 5f 53 65 71 75 65 6e 63 65 54 65 73 74 2c  OP_SequenceTest,
5230: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
5240: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 56 64 62  );.    }.    Vdb
5250: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
5260: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5270: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72  Op3(v, OP_Compar
5280: 65 2c 20 72 65 67 50 72 65 76 4b 65 79 2c 20 72  e, regPrevKey, r
5290: 65 67 42 61 73 65 2c 20 70 53 6f 72 74 2d 3e 6e  egBase, pSort->n
52a0: 4f 42 53 61 74 29 3b 0a 20 20 20 20 70 4f 70 20  OBSat);.    pOp 
52b0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
52c0: 4f 70 28 76 2c 20 70 53 6f 72 74 2d 3e 61 64 64  Op(v, pSort->add
52d0: 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20  rSortIndex);.   
52e0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
52f0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
5300: 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4f 70 2d  return;.    pOp-
5310: 3e 70 32 20 3d 20 6e 4b 65 79 20 2b 20 6e 44 61  >p2 = nKey + nDa
5320: 74 61 3b 0a 20 20 20 20 70 4b 49 20 3d 20 70 4f  ta;.    pKI = pO
5330: 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a  p->p4.pKeyInfo;.
5340: 20 20 20 20 6d 65 6d 73 65 74 28 70 4b 49 2d 3e      memset(pKI->
5350: 61 53 6f 72 74 4f 72 64 65 72 2c 20 30 2c 20 70  aSortOrder, 0, p
5360: 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c 64 29 3b 20  KI->nKeyField); 
5370: 2f 2a 20 4d 61 6b 65 73 20 4f 50 5f 4a 75 6d 70  /* Makes OP_Jump
5380: 20 74 65 73 74 61 62 6c 65 20 2a 2f 0a 20 20 20   testable */.   
5390: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
53a0: 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61  geP4(v, -1, (cha
53b0: 72 2a 29 70 4b 49 2c 20 50 34 5f 4b 45 59 49 4e  r*)pKI, P4_KEYIN
53c0: 46 4f 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  FO);.    testcas
53d0: 65 28 20 70 4b 49 2d 3e 6e 41 6c 6c 46 69 65 6c  e( pKI->nAllFiel
53e0: 64 20 3e 20 70 4b 49 2d 3e 6e 4b 65 79 46 69 65  d > pKI->nKeyFie
53f0: 6c 64 2b 32 20 29 3b 0a 20 20 20 20 70 4f 70 2d  ld+2 );.    pOp-
5400: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 6b  >p4.pKeyInfo = k
5410: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
5420: 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  st(pParse, pSort
5430: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 6e 4f 42 53  ->pOrderBy, nOBS
5440: 61 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  at,.            
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
5470: 4b 49 2d 3e 6e 41 6c 6c 46 69 65 6c 64 2d 70 4b  KI->nAllField-pK
5480: 49 2d 3e 6e 4b 65 79 46 69 65 6c 64 2d 31 29 3b  I->nKeyField-1);
5490: 0a 20 20 20 20 61 64 64 72 4a 6d 70 20 3d 20 73  .    addrJmp = s
54a0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
54b0: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71  tAddr(v);.    sq
54c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
54d0: 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72  v, OP_Jump, addr
54e0: 4a 6d 70 2b 31 2c 20 30 2c 20 61 64 64 72 4a 6d  Jmp+1, 0, addrJm
54f0: 70 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  p+1); VdbeCovera
5500: 67 65 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74  ge(v);.    pSort
5510: 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 3d 20 73  ->labelBkOut = s
5520: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
5530: 62 65 6c 28 76 29 3b 0a 20 20 20 20 70 53 6f 72  bel(v);.    pSor
5540: 74 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  t->regReturn = +
5550: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
5560: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5570: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
5580: 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75  , pSort->regRetu
5590: 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  rn, pSort->label
55a0: 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69  BkOut);.    sqli
55b0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
55c0: 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c   OP_ResetSorter,
55d0: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
55e0: 29 3b 0a 20 20 20 20 69 66 28 20 69 4c 69 6d 69  );.    if( iLimi
55f0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
5600: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5610: 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74  OP_IfNot, iLimit
5620: 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f  , pSort->labelDo
5630: 6e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ne);.      VdbeC
5640: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
5650: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
5660: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
5670: 72 46 69 72 73 74 29 3b 0a 20 20 20 20 73 71 6c  rFirst);.    sql
5680: 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
5690: 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
56a0: 2c 20 72 65 67 50 72 65 76 4b 65 79 2c 20 70 53  , regPrevKey, pS
56b0: 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20  ort->nOBSat);.  
56c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
56d0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 4a 6d 70  pHere(v, addrJmp
56e0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f  );.  }.  if( pSo
56f0: 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20  rt->sortFlags & 
5700: 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
5710: 65 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 4f  er ){.    op = O
5720: 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 3b 0a  P_SorterInsert;.
5730: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20    }else{.    op 
5740: 3d 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 3b 0a  = OP_IdxInsert;.
5750: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
5760: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70  eAddOp4Int(v, op
5770: 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  , pSort->iECurso
5780: 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a 20 20  r, regRecord,.  
5790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57a0: 20 20 20 20 20 72 65 67 42 61 73 65 2b 6e 4f 42       regBase+nOB
57b0: 53 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61  Sat, nBase-nOBSa
57c0: 74 29 3b 0a 20 20 69 66 28 20 69 4c 69 6d 69 74  t);.  if( iLimit
57d0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
57e0: 3b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20 30  ;.    int r1 = 0
57f0: 3b 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68  ;.    /* Fill th
5800: 65 20 73 6f 72 74 65 72 20 75 6e 74 69 6c 20 69  e sorter until i
5810: 74 20 63 6f 6e 74 61 69 6e 73 20 4c 49 4d 49 54  t contains LIMIT
5820: 2b 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 2e  +OFFSET entries.
5830: 20 20 28 54 68 65 20 69 4c 69 6d 69 74 0a 20 20    (The iLimit.  
5840: 20 20 2a 2a 20 72 65 67 69 73 74 65 72 20 69 73    ** register is
5850: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 69 74   initialized wit
5860: 68 20 76 61 6c 75 65 20 6f 66 20 4c 49 4d 49 54  h value of LIMIT
5870: 2b 4f 46 46 53 45 54 2e 29 20 20 41 66 74 65 72  +OFFSET.)  After
5880: 20 74 68 65 20 73 6f 72 74 65 72 0a 20 20 20 20   the sorter.    
5890: 2a 2a 20 66 69 6c 6c 73 20 75 70 2c 20 64 65 6c  ** fills up, del
58a0: 65 74 65 20 74 68 65 20 6c 65 61 73 74 20 65 6e  ete the least en
58b0: 74 72 79 20 69 6e 20 74 68 65 20 73 6f 72 74 65  try in the sorte
58c0: 72 20 61 66 74 65 72 20 65 61 63 68 20 69 6e 73  r after each ins
58d0: 65 72 74 2e 0a 20 20 20 20 2a 2a 20 54 68 75 73  ert..    ** Thus
58e0: 20 77 65 20 6e 65 76 65 72 20 68 6f 6c 64 20 6d   we never hold m
58f0: 6f 72 65 20 74 68 61 6e 20 74 68 65 20 4c 49 4d  ore than the LIM
5900: 49 54 2b 4f 46 46 53 45 54 20 72 6f 77 73 20 69  IT+OFFSET rows i
5910: 6e 20 6d 65 6d 6f 72 79 20 61 74 20 6f 6e 63 65  n memory at once
5920: 20 2a 2f 0a 20 20 20 20 61 64 64 72 20 3d 20 73   */.    addr = s
5930: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
5940: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f  (v, OP_IfNotZero
5950: 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43  , iLimit); VdbeC
5960: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
5970: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5980: 31 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 53  1(v, OP_Last, pS
5990: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a  ort->iECursor);.
59a0: 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 62      if( pSort->b
59b0: 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70  OrderedInnerLoop
59c0: 20 29 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 2b   ){.      r1 = +
59d0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
59e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
59f0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
5a00: 75 6d 6e 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75  umn, pSort->iECu
5a10: 72 73 6f 72 2c 20 6e 45 78 70 72 2c 20 72 31 29  rsor, nExpr, r1)
5a20: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
5a30: 65 6e 74 28 28 76 2c 20 22 73 65 71 22 29 29 3b  ent((v, "seq"));
5a40: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5a50: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
5a60: 4f 50 5f 44 65 6c 65 74 65 2c 20 70 53 6f 72 74  OP_Delete, pSort
5a70: 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20  ->iECursor);.   
5a80: 20 69 66 28 20 70 53 6f 72 74 2d 3e 62 4f 72 64   if( pSort->bOrd
5a90: 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 29 7b  eredInnerLoop ){
5aa0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
5ab0: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 69 73 20 64   inner loop is d
5ac0: 72 69 76 65 6e 20 62 79 20 61 6e 20 69 6e 64 65  riven by an inde
5ad0: 78 20 73 75 63 68 20 74 68 61 74 20 76 61 6c 75  x such that valu
5ae0: 65 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a  es from.      **
5af0: 20 74 68 65 20 73 61 6d 65 20 69 74 65 72 61 74   the same iterat
5b00: 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  ion of the inner
5b10: 20 6c 6f 6f 70 20 61 72 65 20 69 6e 20 73 6f 72   loop are in sor
5b20: 74 65 64 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a  ted order, then.
5b30: 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61        ** immedia
5b40: 74 65 6c 79 20 6a 75 6d 70 20 74 6f 20 74 68 65  tely jump to the
5b50: 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
5b60: 6f 66 20 61 6e 20 69 6e 6e 65 72 20 6c 6f 6f 70  of an inner loop
5b70: 20 69 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   if the.      **
5b80: 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20   entry from the 
5b90: 63 75 72 72 65 6e 74 20 69 74 65 72 61 74 69 6f  current iteratio
5ba0: 6e 20 64 6f 65 73 20 6e 6f 74 20 66 69 74 20 69  n does not fit i
5bb0: 6e 74 6f 20 74 68 65 20 74 6f 70 0a 20 20 20 20  nto the top.    
5bc0: 20 20 2a 2a 20 4c 49 4d 49 54 2b 4f 46 46 53 45    ** LIMIT+OFFSE
5bd0: 54 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65  T entries of the
5be0: 20 73 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 20 20   sorter. */.    
5bf0: 20 20 69 6e 74 20 69 42 72 6b 20 3d 20 73 71 6c    int iBrk = sql
5c00: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
5c10: 64 64 72 28 76 29 20 2b 20 32 3b 0a 20 20 20 20  ddr(v) + 2;.    
5c20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5c30: 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65  Op3(v, OP_Eq, re
5c40: 67 42 61 73 65 2b 6e 45 78 70 72 2c 20 69 42 72  gBase+nExpr, iBr
5c50: 6b 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  k, r1);.      sq
5c60: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
5c70: 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  5(v, SQLITE_NULL
5c80: 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  EQ);.      VdbeC
5c90: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
5ca0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
5cb0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
5cc0: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
5cd0: 20 41 64 64 20 63 6f 64 65 20 74 6f 20 69 6d 70   Add code to imp
5ce0: 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46 46 53 45  lement the OFFSE
5cf0: 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  T.*/.static void
5d00: 20 63 6f 64 65 4f 66 66 73 65 74 28 0a 20 20 56   codeOffset(.  V
5d10: 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
5d20: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
5d30: 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a  e into this VM *
5d40: 2f 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 2c  /.  int iOffset,
5d50: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
5d60: 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 66  r holding the of
5d70: 66 73 65 74 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  fset counter */.
5d80: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20    int iContinue 
5d90: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
5da0: 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72   to skip the cur
5db0: 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 29  rent record */.)
5dc0: 7b 0a 20 20 69 66 28 20 69 4f 66 66 73 65 74 3e  {.  if( iOffset>
5dd0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
5de0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
5df0: 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73 65 74 2c  _IfPos, iOffset,
5e00: 20 69 43 6f 6e 74 69 6e 75 65 2c 20 31 29 3b 20   iContinue, 1); 
5e10: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
5e20: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
5e30: 28 28 76 2c 20 22 4f 46 46 53 45 54 22 29 29 3b  ((v, "OFFSET"));
5e40: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
5e50: 64 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  d code that will
5e60: 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   check to make s
5e70: 75 72 65 20 74 68 65 20 4e 20 72 65 67 69 73 74  ure the N regist
5e80: 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ers starting at 
5e90: 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64  iMem.** form a d
5ea0: 69 73 74 69 6e 63 74 20 65 6e 74 72 79 2e 20 20  istinct entry.  
5eb0: 69 54 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e  iTab is a sortin
5ec0: 67 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c  g index that hol
5ed0: 64 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a  ds previously.**
5ee0: 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f   seen combinatio
5ef0: 6e 73 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75  ns of the N valu
5f00: 65 73 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79  es.  A new entry
5f10: 20 69 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62   is made in iTab
5f20: 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72 72 65  .** if the curre
5f30: 6e 74 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20  nt N values are 
5f40: 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d  new..**.** A jum
5f50: 70 20 74 6f 20 61 64 64 72 52 65 70 65 61 74 20  p to addrRepeat 
5f60: 69 73 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20  is made and the 
5f70: 4e 2b 31 20 76 61 6c 75 65 73 20 61 72 65 20 70  N+1 values are p
5f80: 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  opped from the.*
5f90: 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65 20 74  * stack if the t
5fa0: 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72  op N elements ar
5fb0: 65 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a  e not distinct..
5fc0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
5fd0: 6f 64 65 44 69 73 74 69 6e 63 74 28 0a 20 20 50  odeDistinct(.  P
5fe0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
5ff0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
6000: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
6010: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
6020: 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  t iTab,         
6030: 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e   /* A sorting in
6040: 64 65 78 20 75 73 65 64 20 74 6f 20 74 65 73 74  dex used to test
6050: 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73   for distinctnes
6060: 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52  s */.  int addrR
6070: 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d  epeat,    /* Jum
6080: 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74  p to here if not
6090: 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69   distinct */.  i
60a0: 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20  nt N,           
60b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
60c0: 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  lements */.  int
60d0: 20 69 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20   iMem           
60e0: 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74  /* First element
60f0: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
6100: 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76  ;.  int r1;..  v
6110: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
6120: 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33  ;.  r1 = sqlite3
6130: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
6140: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
6150: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
6160: 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61 64  _Found, iTab, ad
6170: 64 72 52 65 70 65 61 74 2c 20 69 4d 65 6d 2c 20  drRepeat, iMem, 
6180: 4e 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  N); VdbeCoverage
6190: 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
61a0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
61b0: 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c  akeRecord, iMem,
61c0: 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74   N, r1);.  sqlit
61d0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
61e0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
61f0: 20 69 54 61 62 2c 20 72 31 2c 20 69 4d 65 6d 2c   iTab, r1, iMem,
6200: 20 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   N);.  sqlite3Vd
6210: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
6220: 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55  FLAG_USESEEKRESU
6230: 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  LT);.  sqlite3Re
6240: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
6250: 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 23 69 66  rse, r1);.}..#if
6260: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
6270: 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e  E_SORTER_REFEREN
6280: 43 45 53 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  CES./*.** This f
6290: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
62a0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 69 6e 6e  d as part of inn
62b0: 65 72 2d 6c 6f 6f 70 20 67 65 6e 65 72 61 74 69  er-loop generati
62c0: 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 0a  on for a SELECT.
62d0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74  ** statement wit
62e0: 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 74 68  h an ORDER BY th
62f0: 61 74 20 69 73 20 6e 6f 74 20 6f 70 74 69 6d 69  at is not optimi
6300: 7a 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2e  zed by an index.
6310: 20 49 74 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e   It .** determin
6320: 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  es the expressio
6330: 6e 73 2c 20 69 66 20 61 6e 79 2c 20 74 68 61 74  ns, if any, that
6340: 20 74 68 65 20 73 6f 72 74 65 72 2d 72 65 66 65   the sorter-refe
6350: 72 65 6e 63 65 20 0a 2a 2a 20 6f 70 74 69 6d 69  rence .** optimi
6360: 7a 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  zation should be
6370: 20 75 73 65 64 20 66 6f 72 2e 20 54 68 65 20 73   used for. The s
6380: 6f 72 74 65 72 2d 72 65 66 65 72 65 6e 63 65 20  orter-reference 
6390: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20  optimization.** 
63a0: 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45  is used for SELE
63b0: 43 54 20 71 75 65 72 69 65 73 20 6c 69 6b 65 3a  CT queries like:
63c0: 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
63d0: 61 2c 20 62 69 67 62 6c 6f 62 20 46 52 4f 4d 20  a, bigblob FROM 
63e0: 74 31 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49  t1 ORDER BY a LI
63f0: 4d 49 54 20 31 30 0a 2a 2a 0a 2a 2a 20 49 66 20  MIT 10.**.** If 
6400: 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
6410: 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 78 70   is used for exp
6420: 72 65 73 73 69 6f 6e 20 22 62 69 67 62 6c 6f 62  ression "bigblob
6430: 22 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64 20  ", then instead 
6440: 6f 66 0a 2a 2a 20 73 74 6f 72 69 6e 67 20 76 61  of.** storing va
6450: 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74  lues read from t
6460: 68 61 74 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  hat column in th
6470: 65 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 73  e sorter records
6480: 2c 20 74 68 65 20 50 4b 20 6f 66 0a 2a 2a 20 74  , the PK of.** t
6490: 68 65 20 72 6f 77 20 66 72 6f 6d 20 74 61 62 6c  he row from tabl
64a0: 65 20 74 31 20 69 73 20 73 74 6f 72 65 64 20 69  e t1 is stored i
64b0: 6e 73 74 65 61 64 2e 20 54 68 65 6e 2c 20 61 73  nstead. Then, as
64c0: 20 72 65 63 6f 72 64 73 20 61 72 65 20 65 78 74   records are ext
64d0: 72 61 63 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74  racted from.** t
64e0: 68 65 20 73 6f 72 74 65 72 20 74 6f 20 72 65 74  he sorter to ret
64f0: 75 72 6e 20 74 6f 20 74 68 65 20 75 73 65 72 2c  urn to the user,
6500: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 76 61   the required va
6510: 6c 75 65 20 6f 66 20 62 69 67 62 6c 6f 62 20 69  lue of bigblob i
6520: 73 0a 2a 2a 20 72 65 74 72 69 65 76 65 64 20 64  s.** retrieved d
6530: 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 61 62  irectly from tab
6540: 6c 65 20 74 31 2e 20 49 66 20 74 68 65 20 76 61  le t1. If the va
6550: 6c 75 65 73 20 61 72 65 20 76 65 72 79 20 6c 61  lues are very la
6560: 72 67 65 2c 20 74 68 69 73 20 0a 2a 2a 20 63 61  rge, this .** ca
6570: 6e 20 62 65 20 6d 6f 72 65 20 65 66 66 69 63 69  n be more effici
6580: 65 6e 74 20 74 68 61 6e 20 73 74 6f 72 69 6e 67  ent than storing
6590: 20 74 68 65 6d 20 64 69 72 65 63 74 6c 79 20 69   them directly i
65a0: 6e 20 74 68 65 20 73 6f 72 74 65 72 20 72 65 63  n the sorter rec
65b0: 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ords..**.** The 
65c0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2e 62 53  ExprList_item.bS
65d0: 6f 72 74 65 72 52 65 66 20 66 6c 61 67 20 69 73  orterRef flag is
65e0: 20 73 65 74 20 66 6f 72 20 65 61 63 68 20 65 78   set for each ex
65f0: 70 72 65 73 73 69 6f 6e 20 69 6e 20 70 45 4c 69  pression in pELi
6600: 73 74 20 0a 2a 2a 20 66 6f 72 20 77 68 69 63 68  st .** for which
6610: 20 74 68 65 20 73 6f 72 74 65 72 2d 72 65 66 65   the sorter-refe
6620: 72 65 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69  rence optimizati
6630: 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 65 6e 61  on should be ena
6640: 62 6c 65 64 2e 20 0a 2a 2a 20 41 64 64 69 74 69  bled. .** Additi
6650: 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 70 53 6f 72  onally, the pSor
6660: 74 2d 3e 61 44 65 66 65 72 5b 5d 20 61 72 72 61  t->aDefer[] arra
6670: 79 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  y is populated w
6680: 69 74 68 20 65 6e 74 72 69 65 73 0a 2a 2a 20 66  ith entries.** f
6690: 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 72  or all cursors r
66a0: 65 71 75 69 72 65 64 20 74 6f 20 65 76 61 6c 75  equired to evalu
66b0: 61 74 65 20 61 6c 6c 20 73 65 6c 65 63 74 65 64  ate all selected
66c0: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 46 69   expressions. Fi
66d0: 6e 61 6c 6c 79 2e 0a 2a 2a 20 6f 75 74 70 75 74  nally..** output
66e0: 20 76 61 72 69 61 62 6c 65 20 28 2a 70 70 45 78   variable (*ppEx
66f0: 74 72 61 29 20 69 73 20 73 65 74 20 74 6f 20 61  tra) is set to a
6700: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
6710: 74 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20  t containing.** 
6720: 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20  expressions for 
6730: 61 6c 6c 20 65 78 74 72 61 20 50 4b 20 76 61 6c  all extra PK val
6740: 75 65 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ues that should 
6750: 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  be stored in the
6760: 0a 2a 2a 20 73 6f 72 74 65 72 20 72 65 63 6f 72  .** sorter recor
6770: 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ds..*/.static vo
6780: 69 64 20 73 65 6c 65 63 74 45 78 70 72 44 65 66  id selectExprDef
6790: 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  er(.  Parse *pPa
67a0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
67b0: 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 61        /* Leave a
67c0: 6e 79 20 65 72 72 6f 72 20 68 65 72 65 20 2a 2f  ny error here */
67d0: 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72  .  SortCtx *pSor
67e0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
67f0: 20 20 20 2f 2a 20 53 6f 72 74 65 72 20 63 6f 6e     /* Sorter con
6800: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
6810: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20  st *pEList,     
6820: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
6830: 72 65 73 73 69 6f 6e 73 20 64 65 73 74 69 6e 65  ressions destine
6840: 64 20 66 6f 72 20 73 6f 72 74 65 72 20 2a 2f 0a  d for sorter */.
6850: 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 45    ExprList **ppE
6860: 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20 20  xtra            
6870: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
6880: 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 73 6f   to append to so
6890: 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 29  rter record */.)
68a0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
68b0: 20 6e 44 65 66 65 72 20 3d 20 30 3b 0a 20 20 45   nDefer = 0;.  E
68c0: 78 70 72 4c 69 73 74 20 2a 70 45 78 74 72 61 20  xprList *pExtra 
68d0: 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
68e0: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
68f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
6900: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
6910: 2a 70 49 74 65 6d 20 3d 20 26 70 45 4c 69 73 74  *pItem = &pEList
6920: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  ->a[i];.    if( 
6930: 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
6940: 72 42 79 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  rByCol==0 ){.   
6950: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
6960: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20   pItem->pExpr;. 
6970: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
6980: 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a   = pExpr->pTab;.
6990: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
69a0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
69b0: 26 20 70 54 61 62 20 26 26 20 21 49 73 56 69 72  & pTab && !IsVir
69c0: 74 75 61 6c 28 70 54 61 62 29 0a 20 20 20 20 20  tual(pTab).     
69d0: 20 20 26 26 20 28 70 54 61 62 2d 3e 61 43 6f 6c    && (pTab->aCol
69e0: 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
69f0: 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46  .colFlags & COLF
6a00: 4c 41 47 5f 53 4f 52 54 45 52 52 45 46 29 0a 23  LAG_SORTERREF).#
6a10: 69 66 20 30 0a 20 20 20 20 20 20 20 20 20 20 26  if 0.          &
6a20: 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  & pTab->pSchema 
6a30: 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  && pTab->pSelect
6a40: 3d 3d 30 20 26 26 20 21 49 73 56 69 72 74 75 61  ==0 && !IsVirtua
6a50: 6c 28 70 54 61 62 29 0a 23 65 6e 64 69 66 0a 20  l(pTab).#endif. 
6a60: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
6a70: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66  int j;.        f
6a80: 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 44 65 66 65 72  or(j=0; j<nDefer
6a90: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
6aa0: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 61 44 65    if( pSort->aDe
6ab0: 66 65 72 5b 6a 5d 2e 69 43 73 72 3d 3d 70 45 78  fer[j].iCsr==pEx
6ac0: 70 72 2d 3e 69 54 61 62 6c 65 20 29 20 62 72 65  pr->iTable ) bre
6ad0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
6ae0: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 44 65        if( j==nDe
6af0: 66 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  fer ){.         
6b00: 20 69 66 28 20 6e 44 65 66 65 72 3d 3d 41 72 72   if( nDefer==Arr
6b10: 61 79 53 69 7a 65 28 70 53 6f 72 74 2d 3e 61 44  aySize(pSort->aD
6b20: 65 66 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  efer) ){.       
6b30: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
6b40: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
6b50: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
6b60: 6e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  nKey = 1;.      
6b70: 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
6b80: 20 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a           Index *
6b90: 70 50 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  pPk = 0;.       
6ba0: 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77       if( !HasRow
6bb0: 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
6bc0: 20 20 20 20 20 20 20 20 20 20 70 50 6b 20 3d 20            pPk = 
6bd0: 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
6be0: 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 4b 65 79              nKey
6c00: 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b   = pPk->nKeyCol;
6c10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
6c20: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b             for(k
6c30: 3d 30 3b 20 6b 3c 6e 4b 65 79 3b 20 6b 2b 2b 29  =0; k<nKey; k++)
6c40: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
6c50: 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
6c60: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
6c70: 2c 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20  , TK_COLUMN, 0, 
6c80: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
6c90: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
6ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
6cb0: 65 77 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78  ew->iTable = pEx
6cc0: 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
6cd0: 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
6ce0: 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e  ->pTab = pExpr->
6cf0: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
6d00: 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 43 6f 6c        pNew->iCol
6d10: 75 6d 6e 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d  umn = pPk ? pPk-
6d20: 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 3a 20 2d  >aiColumn[k] : -
6d30: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
6d40: 20 20 20 70 45 78 74 72 61 20 3d 20 73 71 6c 69     pExtra = sqli
6d50: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
6d60: 64 28 70 50 61 72 73 65 2c 20 70 45 78 74 72 61  d(pParse, pExtra
6d70: 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , pNew);.       
6d80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6d90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6da0: 20 20 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72     pSort->aDefer
6db0: 5b 6e 44 65 66 65 72 5d 2e 70 54 61 62 20 3d 20  [nDefer].pTab = 
6dc0: 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20  pExpr->pTab;.   
6dd0: 20 20 20 20 20 20 20 20 20 70 53 6f 72 74 2d 3e           pSort->
6de0: 61 44 65 66 65 72 5b 6e 44 65 66 65 72 5d 2e 69  aDefer[nDefer].i
6df0: 43 73 72 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  Csr = pExpr->iTa
6e00: 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ble;.           
6e10: 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6e   pSort->aDefer[n
6e20: 44 65 66 65 72 5d 2e 6e 4b 65 79 20 3d 20 6e 4b  Defer].nKey = nK
6e30: 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey;.            
6e40: 6e 44 65 66 65 72 2b 2b 3b 0a 20 20 20 20 20 20  nDefer++;.      
6e50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
6e60: 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 62          pItem->b
6e70: 53 6f 72 74 65 72 52 65 66 20 3d 20 31 3b 0a 20  SorterRef = 1;. 
6e80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6e90: 0a 20 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72  .  pSort->nDefer
6ea0: 20 3d 20 28 75 38 29 6e 44 65 66 65 72 3b 0a 20   = (u8)nDefer;. 
6eb0: 20 2a 70 70 45 78 74 72 61 20 3d 20 70 45 78 74   *ppExtra = pExt
6ec0: 72 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ra;.}.#endif../*
6ed0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6ee0: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
6ef0: 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69  ode for the insi
6f00: 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  de of the inner 
6f10: 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c  loop.** of a SEL
6f20: 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72  ECT..**.** If sr
6f30: 63 54 61 62 20 69 73 20 6e 65 67 61 74 69 76 65  cTab is negative
6f40: 2c 20 74 68 65 6e 20 74 68 65 20 70 2d 3e 70 45  , then the p->pE
6f50: 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73  List expressions
6f60: 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65  .** are evaluate
6f70: 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  d in order to ge
6f80: 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74  t the data for t
6f90: 68 69 73 20 72 6f 77 2e 20 20 49 66 20 73 72 63  his row.  If src
6fa0: 54 61 62 20 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f  Tab is.** zero o
6fb0: 72 20 6d 6f 72 65 2c 20 74 68 65 6e 20 64 61 74  r more, then dat
6fc0: 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d  a is pulled from
6fd0: 20 73 72 63 54 61 62 20 61 6e 64 20 70 2d 3e 70   srcTab and p->p
6fe0: 45 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e  EList is used on
6ff0: 6c 79 20 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68  ly .** to get th
7000: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
7010: 6d 6e 73 20 61 6e 64 20 74 68 65 20 63 6f 6c 6c  mns and the coll
7020: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
7030: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a  or each column..
7040: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
7050: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a  electInnerLoop(.
7060: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
7070: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
7080: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
7090: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
70a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
70b0: 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c  The complete sel
70c0: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ect statement be
70d0: 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69  ing coded */.  i
70e0: 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20 20 20  nt srcTab,      
70f0: 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64         /* Pull d
7100: 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61  ata from this ta
7110: 62 6c 65 20 69 66 20 6e 6f 6e 2d 6e 65 67 61 74  ble if non-negat
7120: 69 76 65 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78  ive */.  SortCtx
7130: 20 2a 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20   *pSort,        
7140: 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c   /* If not NULL,
7150: 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20   info on how to 
7160: 70 72 6f 63 65 73 73 20 4f 52 44 45 52 20 42 59  process ORDER BY
7170: 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74   */.  DistinctCt
7180: 78 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a  x *pDistinct, /*
7190: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e   If not NULL, in
71a0: 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f  fo on how to pro
71b0: 63 65 73 73 20 44 49 53 54 49 4e 43 54 20 2a 2f  cess DISTINCT */
71c0: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
71d0: 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f  Dest,      /* Ho
71e0: 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20  w to dispose of 
71f0: 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  the results */. 
7200: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20   int iContinue, 
7210: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
7220: 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75   here to continu
7230: 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20  e with next row 
7240: 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20  */.  int iBreak 
7250: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7260: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65  Jump here to bre
7270: 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e  ak out of the in
7280: 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20  ner loop */.){. 
7290: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
72a0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
72b0: 69 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74  i;.  int hasDist
72c0: 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20 20  inct;           
72d0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
72e0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
72f0: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
7300: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
7310: 73 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20  st->eDest;   /* 
7320: 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f  How to dispose o
7330: 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  f results */.  i
7340: 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74  nt iParm = pDest
7350: 2d 3e 69 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69  ->iSDParm; /* Fi
7360: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
7370: 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20  disposal method 
7380: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74  */.  int nResult
7390: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
73a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
73b0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  sult columns */.
73c0: 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67    int nPrefixReg
73d0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
73e0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
73f0: 20 72 65 67 69 73 74 65 72 73 20 62 65 66 6f 72   registers befor
7400: 65 20 72 65 67 52 65 73 75 6c 74 20 2a 2f 0a 0a  e regResult */..
7410: 20 20 2f 2a 20 55 73 75 61 6c 6c 79 2c 20 72 65    /* Usually, re
7420: 67 52 65 73 75 6c 74 20 69 73 20 74 68 65 20 66  gResult is the f
7430: 69 72 73 74 20 63 65 6c 6c 20 69 6e 20 61 6e 20  irst cell in an 
7440: 61 72 72 61 79 20 6f 66 20 6d 65 6d 6f 72 79 20  array of memory 
7450: 63 65 6c 6c 73 0a 20 20 2a 2a 20 63 6f 6e 74 61  cells.  ** conta
7460: 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  ining the curren
7470: 74 20 72 65 73 75 6c 74 20 72 6f 77 2e 20 49 6e  t result row. In
7480: 20 74 68 69 73 20 63 61 73 65 20 72 65 67 4f 72   this case regOr
7490: 69 67 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ig is set to the
74a0: 0a 20 20 2a 2a 20 73 61 6d 65 20 76 61 6c 75 65  .  ** same value
74b0: 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  . However, if th
74c0: 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 62 65  e results are be
74d0: 69 6e 67 20 73 65 6e 74 20 74 6f 20 74 68 65 20  ing sent to the 
74e0: 73 6f 72 74 65 72 2c 20 74 68 65 0a 20 20 2a 2a  sorter, the.  **
74f0: 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6e 79 20   values for any 
7500: 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
7510: 20 61 72 65 20 61 6c 73 6f 20 70 61 72 74 20 6f   are also part o
7520: 66 20 74 68 65 20 73 6f 72 74 2d 6b 65 79 20 61  f the sort-key a
7530: 72 65 20 6f 6d 69 74 74 65 64 0a 20 20 2a 2a 20  re omitted.  ** 
7540: 66 72 6f 6d 20 74 68 69 73 20 61 72 72 61 79 2e  from this array.
7550: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 72 65   In this case re
7560: 67 4f 72 69 67 20 69 73 20 73 65 74 20 74 6f 20  gOrig is set to 
7570: 7a 65 72 6f 2e 20 20 2a 2f 0a 20 20 69 6e 74 20  zero.  */.  int 
7580: 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20  regResult;      
7590: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74          /* Start
75a0: 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69   of memory holdi
75b0: 6e 67 20 63 75 72 72 65 6e 74 20 72 65 73 75 6c  ng current resul
75c0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ts */.  int regO
75d0: 72 69 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  rig;            
75e0: 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
75f0: 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 66  memory holding f
7600: 75 6c 6c 20 72 65 73 75 6c 74 20 28 6f 72 20 30  ull result (or 0
7610: 29 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  ) */..  assert( 
7620: 76 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  v );.  assert( p
7630: 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20  ->pEList!=0 );. 
7640: 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20 70   hasDistinct = p
7650: 44 69 73 74 69 6e 63 74 20 3f 20 70 44 69 73 74  Distinct ? pDist
7660: 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20  inct->eTnctType 
7670: 3a 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  : WHERE_DISTINCT
7680: 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70 53 6f  _NOOP;.  if( pSo
7690: 72 74 20 26 26 20 70 53 6f 72 74 2d 3e 70 4f 72  rt && pSort->pOr
76a0: 64 65 72 42 79 3d 3d 30 20 29 20 70 53 6f 72 74  derBy==0 ) pSort
76b0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53 6f 72   = 0;.  if( pSor
76c0: 74 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73 74  t==0 && !hasDist
76d0: 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65  inct ){.    asse
76e0: 72 74 28 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30  rt( iContinue!=0
76f0: 20 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73   );.    codeOffs
7700: 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et(v, p->iOffset
7710: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
7720: 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65  }..  /* Pull the
7730: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d   requested colum
7740: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65 73 75  ns..  */.  nResu
7750: 6c 74 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73  ltCol = p->pELis
7760: 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28  t->nExpr;..  if(
7770: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30   pDest->iSdst==0
7780: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 6f 72   ){.    if( pSor
7790: 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 72 65 66  t ){.      nPref
77a0: 69 78 52 65 67 20 3d 20 70 53 6f 72 74 2d 3e 70  ixReg = pSort->p
77b0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
77c0: 20 20 20 20 20 20 69 66 28 20 21 28 70 53 6f 72        if( !(pSor
77d0: 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53  t->sortFlags & S
77e0: 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65  ORTFLAG_UseSorte
77f0: 72 29 20 29 20 6e 50 72 65 66 69 78 52 65 67 2b  r) ) nPrefixReg+
7800: 2b 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  +;.      pParse-
7810: 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 72 65 66 69 78  >nMem += nPrefix
7820: 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  Reg;.    }.    p
7830: 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 70 50  Dest->iSdst = pP
7840: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
7850: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
7860: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
7870: 7d 65 6c 73 65 20 69 66 28 20 70 44 65 73 74 2d  }else if( pDest-
7880: 3e 69 53 64 73 74 2b 6e 52 65 73 75 6c 74 43 6f  >iSdst+nResultCo
7890: 6c 20 3e 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  l > pParse->nMem
78a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
78b0: 69 73 20 61 6e 20 65 72 72 6f 72 20 63 6f 6e 64  is an error cond
78c0: 69 74 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 72  ition that can r
78d0: 65 73 75 6c 74 2c 20 66 6f 72 20 65 78 61 6d 70  esult, for examp
78e0: 6c 65 2c 20 77 68 65 6e 20 61 20 53 45 4c 45 43  le, when a SELEC
78f0: 54 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  T.    ** on the 
7900: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
7910: 6f 66 20 61 6e 20 49 4e 53 45 52 54 20 63 6f 6e  of an INSERT con
7920: 74 61 69 6e 73 20 6d 6f 72 65 20 72 65 73 75 6c  tains more resul
7930: 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a 20  t columns than. 
7940: 20 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20     ** there are 
7950: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74  columns in the t
7960: 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74  able on the left
7970: 2e 20 20 54 68 65 20 65 72 72 6f 72 20 77 69 6c  .  The error wil
7980: 6c 20 62 65 20 63 61 75 67 68 74 0a 20 20 20 20  l be caught.    
7990: 2a 2a 20 61 6e 64 20 72 65 70 6f 72 74 65 64 20  ** and reported 
79a0: 6c 61 74 65 72 2e 20 20 42 75 74 20 77 65 20 6e  later.  But we n
79b0: 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eed to make sure
79c0: 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 69   enough memory i
79d0: 73 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20  s allocated.    
79e0: 2a 2a 20 74 6f 20 61 76 6f 69 64 20 6f 74 68 65  ** to avoid othe
79f0: 72 20 73 70 75 72 69 6f 75 73 20 65 72 72 6f 72  r spurious error
7a00: 73 20 69 6e 20 74 68 65 20 6d 65 61 6e 74 69 6d  s in the meantim
7a10: 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65  e. */.    pParse
7a20: 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c  ->nMem += nResul
7a30: 74 43 6f 6c 3b 0a 20 20 7d 0a 20 20 70 44 65 73  tCol;.  }.  pDes
7a40: 74 2d 3e 6e 53 64 73 74 20 3d 20 6e 52 65 73 75  t->nSdst = nResu
7a50: 6c 74 43 6f 6c 3b 0a 20 20 72 65 67 4f 72 69 67  ltCol;.  regOrig
7a60: 20 3d 20 72 65 67 52 65 73 75 6c 74 20 3d 20 70   = regResult = p
7a70: 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20 69  Dest->iSdst;.  i
7a80: 66 28 20 73 72 63 54 61 62 3e 3d 30 20 29 7b 0a  f( srcTab>=0 ){.
7a90: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
7aa0: 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b  ResultCol; i++){
7ab0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7ac0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
7ad0: 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69  olumn, srcTab, i
7ae0: 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a  , regResult+i);.
7af0: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
7b00: 74 28 28 76 2c 20 22 25 73 22 2c 20 70 2d 3e 70  t((v, "%s", p->p
7b10: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
7b20: 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  e));.    }.  }el
7b30: 73 65 20 69 66 28 20 65 44 65 73 74 21 3d 53 52  se if( eDest!=SR
7b40: 54 5f 45 78 69 73 74 73 20 29 7b 0a 23 69 66 64  T_Exists ){.#ifd
7b50: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
7b60: 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43  _SORTER_REFERENC
7b70: 45 53 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ES.    ExprList 
7b80: 2a 70 45 78 74 72 61 20 3d 20 30 3b 0a 23 65 6e  *pExtra = 0;.#en
7b90: 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  dif.    /* If th
7ba0: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73  e destination is
7bb0: 20 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29 20   an EXISTS(...) 
7bc0: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20  expression, the 
7bd0: 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61  actual.    ** va
7be0: 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20 62 79  lues returned by
7bf0: 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65 20   the SELECT are 
7c00: 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20  not required..  
7c10: 20 20 2a 2f 0a 20 20 20 20 75 38 20 65 63 65 6c    */.    u8 ecel
7c20: 46 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20 65  Flags;.    if( e
7c30: 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c  Dest==SRT_Mem ||
7c40: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
7c50: 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ut || eDest==SRT
7c60: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  _Coroutine ){.  
7c70: 20 20 20 20 65 63 65 6c 46 6c 61 67 73 20 3d 20      ecelFlags = 
7c80: 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 3b  SQLITE_ECEL_DUP;
7c90: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7ca0: 20 20 65 63 65 6c 46 6c 61 67 73 20 3d 20 30 3b    ecelFlags = 0;
7cb0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
7cc0: 53 6f 72 74 20 26 26 20 68 61 73 44 69 73 74 69  Sort && hasDisti
7cd0: 6e 63 74 3d 3d 30 20 26 26 20 65 44 65 73 74 21  nct==0 && eDest!
7ce0: 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 26 26  =SRT_EphemTab &&
7cf0: 20 65 44 65 73 74 21 3d 53 52 54 5f 54 61 62 6c   eDest!=SRT_Tabl
7d00: 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f  e ){.      /* Fo
7d10: 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  r each expressio
7d20: 6e 20 69 6e 20 70 2d 3e 70 45 4c 69 73 74 20 74  n in p->pEList t
7d30: 68 61 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66  hat is a copy of
7d40: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
7d50: 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 4f  n.      ** the O
7d60: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 28  RDER BY clause (
7d70: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 29  pSort->pOrderBy)
7d80: 2c 20 73 65 74 20 74 68 65 20 61 73 73 6f 63 69  , set the associ
7d90: 61 74 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 69  ated .      ** i
7da0: 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65  OrderByCol value
7db0: 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61   to one more tha
7dc0: 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  n the index of t
7dd0: 68 65 20 4f 52 44 45 52 20 42 59 20 0a 20 20 20  he ORDER BY .   
7de0: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
7df0: 20 77 69 74 68 69 6e 20 74 68 65 20 73 6f 72 74   within the sort
7e00: 2d 6b 65 79 20 74 68 61 74 20 70 75 73 68 4f 6e  -key that pushOn
7e10: 74 6f 53 6f 72 74 65 72 28 29 20 77 69 6c 6c 20  toSorter() will 
7e20: 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 20 20  generate..      
7e30: 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74  ** This allows t
7e40: 68 65 20 70 2d 3e 70 45 4c 69 73 74 20 66 69 65  he p->pEList fie
7e50: 6c 64 20 74 6f 20 62 65 20 6f 6d 69 74 74 65 64  ld to be omitted
7e60: 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 64   from the sorted
7e70: 20 72 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 2a   record,.      *
7e80: 2a 20 73 61 76 69 6e 67 20 73 70 61 63 65 20 61  * saving space a
7e90: 6e 64 20 43 50 55 20 63 79 63 6c 65 73 2e 20 20  nd CPU cycles.  
7ea0: 2a 2f 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61  */.      ecelFla
7eb0: 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 45 43  gs |= (SQLITE_EC
7ec0: 45 4c 5f 4f 4d 49 54 52 45 46 7c 53 51 4c 49 54  EL_OMITREF|SQLIT
7ed0: 45 5f 45 43 45 4c 5f 52 45 46 29 3b 0a 20 20 20  E_ECEL_REF);.   
7ee0: 20 20 20 66 6f 72 28 69 3d 70 53 6f 72 74 2d 3e     for(i=pSort->
7ef0: 6e 4f 42 53 61 74 3b 20 69 3c 70 53 6f 72 74 2d  nOBSat; i<pSort-
7f00: 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
7f10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
7f20: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 69  int j;.        i
7f30: 66 28 20 28 6a 20 3d 20 70 53 6f 72 74 2d 3e 70  f( (j = pSort->p
7f40: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e  OrderBy->a[i].u.
7f50: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e 30  x.iOrderByCol)>0
7f60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
7f70: 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 2d 31 5d 2e  >pEList->a[j-1].
7f80: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
7f90: 3d 20 69 2b 31 2d 70 53 6f 72 74 2d 3e 6e 4f 42  = i+1-pSort->nOB
7fa0: 53 61 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Sat;.        }. 
7fb0: 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
7fc0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
7fd0: 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20  ER_REFERENCES.  
7fe0: 20 20 20 20 73 65 6c 65 63 74 45 78 70 72 44 65      selectExprDe
7ff0: 66 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72  fer(pParse, pSor
8000: 74 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 26 70  t, p->pEList, &p
8010: 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 69 66  Extra);.      if
8020: 28 20 70 45 78 74 72 61 20 26 26 20 70 50 61 72  ( pExtra && pPar
8030: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
8040: 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iled==0 ){.     
8050: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
8060: 72 65 20 61 6e 79 20 65 78 74 72 61 20 50 4b 20  re any extra PK 
8070: 63 6f 6c 75 6d 6e 73 20 74 6f 20 61 64 64 20 74  columns to add t
8080: 6f 20 74 68 65 20 73 6f 72 74 65 72 20 72 65 63  o the sorter rec
8090: 6f 72 64 73 2c 0a 20 20 20 20 20 20 20 20 2a 2a  ords,.        **
80a0: 20 61 6c 6c 6f 63 61 74 65 20 65 78 74 72 61 20   allocate extra 
80b0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e 64  memory cells and
80c0: 20 61 64 6a 75 73 74 20 74 68 65 20 4f 70 65 6e   adjust the Open
80d0: 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 20  Ephemeral .     
80e0: 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f     ** instructio
80f0: 6e 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72  n to account for
8100: 20 74 68 65 20 6c 61 72 67 65 72 20 72 65 63 6f   the larger reco
8110: 72 64 73 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c  rds. This is onl
8120: 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 71  y.        ** req
8130: 75 69 72 65 64 20 69 66 20 74 68 65 72 65 20 61  uired if there a
8140: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57  re one or more W
8150: 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
8160: 6c 65 73 20 77 69 74 68 0a 20 20 20 20 20 20 20  les with.       
8170: 20 2a 2a 20 63 6f 6d 70 6f 73 69 74 65 20 70 72   ** composite pr
8180: 69 6d 61 72 79 20 6b 65 79 73 20 69 6e 20 74 68  imary keys in th
8190: 65 20 53 6f 72 74 43 74 78 2e 61 44 65 66 65 72  e SortCtx.aDefer
81a0: 5b 5d 20 61 72 72 61 79 2e 20 20 2a 2f 0a 20 20  [] array.  */.  
81b0: 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f        VdbeOp *pO
81c0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  p = sqlite3VdbeG
81d0: 65 74 4f 70 28 76 2c 20 70 53 6f 72 74 2d 3e 61  etOp(v, pSort->a
81e0: 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20  ddrSortIndex);. 
81f0: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 2b         pOp->p2 +
8200: 3d 20 28 70 45 78 74 72 61 2d 3e 6e 45 78 70 72  = (pExtra->nExpr
8210: 20 2d 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72   - pSort->nDefer
8220: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  );.        pOp->
8230: 70 34 2e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c  p4.pKeyInfo->nAl
8240: 6c 46 69 65 6c 64 20 2b 3d 20 28 70 45 78 74 72  lField += (pExtr
8250: 61 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74  a->nExpr - pSort
8260: 2d 3e 6e 44 65 66 65 72 29 3b 0a 20 20 20 20 20  ->nDefer);.     
8270: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
8280: 2b 3d 20 70 45 78 74 72 61 2d 3e 6e 45 78 70 72  += pExtra->nExpr
8290: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
82a0: 0a 20 20 20 20 20 20 72 65 67 4f 72 69 67 20 3d  .      regOrig =
82b0: 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
82c0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74  ( eDest==SRT_Set
82d0: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d   || eDest==SRT_M
82e0: 65 6d 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  em .           |
82f0: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  | eDest==SRT_Cor
8300: 6f 75 74 69 6e 65 20 7c 7c 20 65 44 65 73 74 3d  outine || eDest=
8310: 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
8320: 20 20 20 7d 0a 20 20 20 20 6e 52 65 73 75 6c 74     }.    nResult
8330: 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Col = sqlite3Exp
8340: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
8350: 61 72 73 65 2c 70 2d 3e 70 45 4c 69 73 74 2c 72  arse,p->pEList,r
8360: 65 67 52 65 73 75 6c 74 2c 0a 20 20 20 20 20 20  egResult,.      
8370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8390: 20 20 20 30 2c 65 63 65 6c 46 6c 61 67 73 29 3b     0,ecelFlags);
83a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
83b0: 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
83c0: 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20  ERENCES.    if( 
83d0: 70 45 78 74 72 61 20 29 7b 0a 20 20 20 20 20 20  pExtra ){.      
83e0: 6e 52 65 73 75 6c 74 43 6f 6c 20 2b 3d 20 73 71  nResultCol += sq
83f0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
8400: 72 4c 69 73 74 28 0a 20 20 20 20 20 20 20 20 20  rList(.         
8410: 20 70 50 61 72 73 65 2c 20 70 45 78 74 72 61 2c   pParse, pExtra,
8420: 20 72 65 67 52 65 73 75 6c 74 20 2b 20 6e 52 65   regResult + nRe
8430: 73 75 6c 74 43 6f 6c 2c 20 30 2c 20 30 0a 20 20  sultCol, 0, 0.  
8440: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c      );.      sql
8450: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
8460: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
8470: 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 23 65  Extra);.    }.#e
8480: 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ndif.  }..  /* I
8490: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
84a0: 65 79 77 6f 72 64 20 77 61 73 20 70 72 65 73 65  eyword was prese
84b0: 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54  nt on the SELECT
84c0: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
84d0: 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61 73  and this row has
84e0: 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72   been seen befor
84f0: 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d  e, then do not m
8500: 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a  ake this row.  *
8510: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 65  * part of the re
8520: 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sult..  */.  if(
8530: 20 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a   hasDistinct ){.
8540: 20 20 20 20 73 77 69 74 63 68 28 20 70 44 69 73      switch( pDis
8550: 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65  tinct->eTnctType
8560: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57   ){.      case W
8570: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
8580: 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20  DERED: {.       
8590: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20   VdbeOp *pOp;   
85a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c           /* No l
85b0: 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 20 4f  onger required O
85c0: 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
85d0: 74 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  tr. */.        i
85e0: 6e 74 20 69 4a 75 6d 70 3b 20 20 20 20 20 20 20  nt iJump;       
85f0: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64         /* Jump d
8600: 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20  estination */.  
8610: 20 20 20 20 20 20 69 6e 74 20 72 65 67 50 72 65        int regPre
8620: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v;            /*
8630: 20 50 72 65 76 69 6f 75 73 20 72 6f 77 20 63 6f   Previous row co
8640: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20  ntent */..      
8650: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
8660: 61 63 65 20 66 6f 72 20 74 68 65 20 70 72 65 76  ace for the prev
8670: 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20  ious row */.    
8680: 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50      regPrev = pP
8690: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
86a0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
86b0: 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  em += nResultCol
86c0: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  ;..        /* Ch
86d0: 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e  ange the OP_Open
86e0: 45 70 68 65 6d 65 72 61 6c 20 63 6f 64 65 64 20  Ephemeral coded 
86f0: 65 61 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50  earlier to an OP
8700: 5f 4e 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a  _Null.        **
8710: 20 73 65 74 73 20 74 68 65 20 4d 45 4d 5f 43 6c   sets the MEM_Cl
8720: 65 61 72 65 64 20 62 69 74 20 6f 6e 20 74 68 65  eared bit on the
8730: 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
8740: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
8750: 2a 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65  * previous value
8760: 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75  .  This will cau
8770: 73 65 20 74 68 65 20 4f 50 5f 4e 65 20 62 65 6c  se the OP_Ne bel
8780: 6f 77 20 74 6f 20 61 6c 77 61 79 73 0a 20 20 20  ow to always.   
8790: 20 20 20 20 20 2a 2a 20 66 61 69 6c 20 6f 6e 20       ** fail on 
87a0: 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74  the first iterat
87b0: 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  ion of the loop 
87c0: 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 72 73  even if the firs
87d0: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77  t.        ** row
87e0: 20 69 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20   is all NULLs.. 
87f0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
8800: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
8810: 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69  ngeToNoop(v, pDi
8820: 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74  stinct->addrTnct
8830: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 20 3d  );.        pOp =
8840: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
8850: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
8860: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
8870: 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
8880: 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20   OP_Null;.      
8890: 20 20 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20    pOp->p1 = 1;. 
88a0: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d         pOp->p2 =
88b0: 20 72 65 67 50 72 65 76 3b 0a 0a 20 20 20 20 20   regPrev;..     
88c0: 20 20 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74     iJump = sqlit
88d0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
88e0: 72 28 76 29 20 2b 20 6e 52 65 73 75 6c 74 43 6f  r(v) + nResultCo
88f0: 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  l;.        for(i
8900: 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c  =0; i<nResultCol
8910: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
8920: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
8930: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
8940: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
8950: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  >pEList->a[i].pE
8960: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
8970: 69 66 28 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c  if( i<nResultCol
8980: 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
8990: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
89a0: 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65  Op3(v, OP_Ne, re
89b0: 67 52 65 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70  gResult+i, iJump
89c0: 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20  , regPrev+i);.  
89d0: 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
89e0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
89f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8a00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8a10: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
8a20: 45 71 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c  Eq, regResult+i,
8a30: 20 69 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50   iContinue, regP
8a40: 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20  rev+i);.        
8a50: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
8a60: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
8a70: 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
8a80: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
8a90: 76 2c 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68  v, -1, (const ch
8aa0: 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  ar *)pColl, P4_C
8ab0: 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20  OLLSEQ);.       
8ac0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
8ad0: 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
8ae0: 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
8af0: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
8b00: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 43  rt( sqlite3VdbeC
8b10: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3d 3d 69  urrentAddr(v)==i
8b20: 4a 75 6d 70 20 7c 7c 20 70 50 61 72 73 65 2d 3e  Jump || pParse->
8b30: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8b40: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
8b50: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
8b60: 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 52 65 73   OP_Copy, regRes
8b70: 75 6c 74 2c 20 72 65 67 50 72 65 76 2c 20 6e 52  ult, regPrev, nR
8b80: 65 73 75 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20 20  esultCol-1);.   
8b90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8ba0: 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20    }..      case 
8bb0: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
8bc0: 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20  NIQUE: {.       
8bd0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
8be0: 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73  geToNoop(v, pDis
8bf0: 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29  tinct->addrTnct)
8c00: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
8c10: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
8c20: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
8c30: 20 20 20 61 73 73 65 72 74 28 20 70 44 69 73 74     assert( pDist
8c40: 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d  inct->eTnctType=
8c50: 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f  =WHERE_DISTINCT_
8c60: 55 4e 4f 52 44 45 52 45 44 20 29 3b 0a 20 20 20  UNORDERED );.   
8c70: 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63       codeDistinc
8c80: 74 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69  t(pParse, pDisti
8c90: 6e 63 74 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43  nct->tabTnct, iC
8ca0: 6f 6e 74 69 6e 75 65 2c 20 6e 52 65 73 75 6c 74  ontinue, nResult
8cb0: 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Col,.           
8cc0: 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73            regRes
8cd0: 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ult);.        br
8ce0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
8cf0: 20 7d 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74   }.    if( pSort
8d00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64  ==0 ){.      cod
8d10: 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
8d20: 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65  ffset, iContinue
8d30: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
8d40: 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b  switch( eDest ){
8d50: 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
8d60: 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63 68  mode, write each
8d70: 20 71 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f   query result to
8d80: 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
8d90: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a  temporary.    **
8da0: 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20   table iParm..  
8db0: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
8dc0: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
8dd0: 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73  D_SELECT.    cas
8de0: 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20  e SRT_Union: {. 
8df0: 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20       int r1;.   
8e00: 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
8e10: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
8e20: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8e30: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
8e40: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
8e50: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
8e60: 6f 6c 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  ol, r1);.      s
8e70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
8e80: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
8e90: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20  ert, iParm, r1, 
8ea0: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
8eb0: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 73 71  ltCol);.      sq
8ec0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
8ed0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
8ee0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8ef0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73    }..    /* Cons
8f00: 74 72 75 63 74 20 61 20 72 65 63 6f 72 64 20 66  truct a record f
8f10: 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72 65  rom the query re
8f20: 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61  sult, but instea
8f30: 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69  d of.    ** savi
8f40: 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20  ng that record, 
8f50: 75 73 65 20 69 74 20 61 73 20 61 20 6b 65 79 20  use it as a key 
8f60: 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e  to delete elemen
8f70: 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  ts from.    ** t
8f80: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
8f90: 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f  le iParm..    */
8fa0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78  .    case SRT_Ex
8fb0: 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 73 71  cept: {.      sq
8fc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
8fd0: 76 2c 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c  v, OP_IdxDelete,
8fe0: 20 69 50 61 72 6d 2c 20 72 65 67 52 65 73 75 6c   iParm, regResul
8ff0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
9000: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9010: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
9020: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
9030: 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20  D_SELECT */..   
9040: 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65   /* Store the re
9050: 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69  sult as data usi
9060: 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e  ng a unique key.
9070: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
9080: 20 53 52 54 5f 46 69 66 6f 3a 0a 20 20 20 20 63   SRT_Fifo:.    c
9090: 61 73 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f  ase SRT_DistFifo
90a0: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  :.    case SRT_T
90b0: 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
90c0: 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20  RT_EphemTab: {. 
90d0: 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
90e0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
90f0: 65 28 70 50 61 72 73 65 2c 20 6e 50 72 65 66 69  e(pParse, nPrefi
9100: 78 52 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 74  xReg+1);.      t
9110: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
9120: 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20  SRT_Table );.   
9130: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
9140: 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
9150: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
9160: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 46  se( eDest==SRT_F
9170: 69 66 6f 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ifo );.      tes
9180: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
9190: 54 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20  T_DistFifo );.  
91a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
91b0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
91c0: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
91d0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72  t, nResultCol, r
91e0: 31 2b 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 23  1+nPrefixReg);.#
91f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9200: 49 54 5f 43 54 45 0a 20 20 20 20 20 20 69 66 28  IT_CTE.      if(
9210: 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74   eDest==SRT_Dist
9220: 46 69 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Fifo ){.        
9230: 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e  /* If the destin
9240: 61 74 69 6f 6e 20 69 73 20 44 69 73 74 46 69 66  ation is DistFif
9250: 6f 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28  o, then cursor (
9260: 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e  iParm+1) is open
9270: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61  .        ** on a
9280: 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65  n ephemeral inde
9290: 78 2e 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  x. If the curren
92a0: 74 20 72 6f 77 20 69 73 20 61 6c 72 65 61 64 79  t row is already
92b0: 20 70 72 65 73 65 6e 74 0a 20 20 20 20 20 20 20   present.       
92c0: 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78   ** in the index
92d0: 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 69  , do not write i
92e0: 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e  t to the output.
92f0: 20 49 66 20 6e 6f 74 2c 20 61 64 64 20 74 68 65   If not, add the
9300: 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72  .        ** curr
9310: 65 6e 74 20 72 6f 77 20 74 6f 20 74 68 65 20 69  ent row to the i
9320: 6e 64 65 78 20 61 6e 64 20 70 72 6f 63 65 65 64  ndex and proceed
9330: 20 77 69 74 68 20 77 72 69 74 69 6e 67 20 69 74   with writing it
9340: 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20   to the.        
9350: 2a 2a 20 6f 75 74 70 75 74 20 74 61 62 6c 65 20  ** output table 
9360: 61 73 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20  as well.  */.   
9370: 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
9380: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
9390: 6e 74 41 64 64 72 28 76 29 20 2b 20 34 3b 0a 20  ntAddr(v) + 4;. 
93a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
93b0: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
93c0: 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31  P_Found, iParm+1
93d0: 2c 20 61 64 64 72 2c 20 72 31 2c 20 30 29 3b 0a  , addr, r1, 0);.
93e0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
93f0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
9400: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9410: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49  p4Int(v, OP_IdxI
9420: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20  nsert, iParm+1, 
9430: 72 31 2c 72 65 67 52 65 73 75 6c 74 2c 6e 52 65  r1,regResult,nRe
9440: 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20  sultCol);.      
9450: 20 20 61 73 73 65 72 74 28 20 70 53 6f 72 74 3d    assert( pSort=
9460: 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  =0 );.      }.#e
9470: 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70  ndif.      if( p
9480: 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
9490: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
94a0: 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c  Parse, pSort, p,
94b0: 20 72 31 2b 6e 50 72 65 66 69 78 52 65 67 2c 72   r1+nPrefixReg,r
94c0: 65 67 52 65 73 75 6c 74 2c 31 2c 6e 50 72 65 66  egResult,1,nPref
94d0: 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65  ixReg);.      }e
94e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
94f0: 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
9500: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
9510: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9520: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9530: 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d  _NewRowid, iParm
9540: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73  , r2);.        s
9550: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
9560: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69  (v, OP_Insert, i
9570: 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20  Parm, r1, r2);. 
9580: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
9590: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
95a0: 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
95b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
95c0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
95d0: 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d  se, r2);.      }
95e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
95f0: 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
9600: 50 61 72 73 65 2c 20 72 31 2c 20 6e 50 72 65 66  Parse, r1, nPref
9610: 69 78 52 65 67 2b 31 29 3b 0a 20 20 20 20 20 20  ixReg+1);.      
9620: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
9630: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9640: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f  T_SUBQUERY.    /
9650: 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61  * If we are crea
9660: 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61  ting a set for a
9670: 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  n "expr IN (SELE
9680: 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75  CT ...)" constru
9690: 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ct,.    ** then 
96a0: 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
96b0: 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e  a single item on
96c0: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69   the stack.  Wri
96d0: 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  te this.    ** i
96e0: 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74  tem into the set
96f0: 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75   table with bogu
9700: 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20  s data..    */. 
9710: 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
9720: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f   {.      if( pSo
9730: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  rt ){.        /*
9740: 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65   At first glance
9750: 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b   you would think
9760: 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69   we could optimi
9770: 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20  ze out the.     
9780: 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69     ** ORDER BY i
9790: 6e 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63  n this case sinc
97a0: 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65  e the order of e
97b0: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65  ntries in the se
97c0: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65  t.        ** doe
97d0: 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42  s not matter.  B
97e0: 75 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62  ut there might b
97f0: 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  e a LIMIT clause
9800: 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20  , in which.     
9810: 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f     ** case the o
9820: 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72  rder does matter
9830: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68   */.        push
9840: 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 20 20  OntoSorter(.    
9850: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
9860: 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73  pSort, p, regRes
9870: 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52  ult, regOrig, nR
9880: 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72 65 66 69  esultCol, nPrefi
9890: 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xReg);.      }el
98a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
98b0: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
98c0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
98d0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
98e0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
98f0: 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 29  pDest->zAffSdst)
9900: 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c 20 29 3b 0a  ==nResultCol );.
9910: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9920: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
9930: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
9940: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
9950: 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  l, .            
9960: 72 31 2c 20 70 44 65 73 74 2d 3e 7a 41 66 66 53  r1, pDest->zAffS
9970: 64 73 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  dst, nResultCol)
9980: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
9990: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
99a0: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
99b0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
99c0: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  ultCol);.       
99d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
99e0: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49  p4Int(v, OP_IdxI
99f0: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
9a00: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
9a10: 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20  sultCol);.      
9a20: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
9a30: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
9a40: 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r1);.      }.   
9a50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9a60: 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72  .    /* If any r
9a70: 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68 65 20  ow exist in the 
9a80: 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f  result set, reco
9a90: 72 64 20 74 68 61 74 20 66 61 63 74 20 61 6e 64  rd that fact and
9aa0: 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20   abort..    */. 
9ab0: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73     case SRT_Exis
9ac0: 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ts: {.      sqli
9ad0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
9ae0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
9af0: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a  iParm);.      /*
9b00: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
9b10: 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65  e will terminate
9b20: 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
9b30: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
9b40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
9b50: 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c  f this is a scal
9b60: 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69  ar select that i
9b70: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
9b80: 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20  ression, then.  
9b90: 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72    ** store the r
9ba0: 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70  esults in the ap
9bb0: 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79  propriate memory
9bc0: 20 63 65 6c 6c 20 6f 72 20 61 72 72 61 79 20 6f   cell or array o
9bd0: 66 20 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79  f .    ** memory
9be0: 20 63 65 6c 6c 73 20 61 6e 64 20 62 72 65 61 6b   cells and break
9bf0: 20 6f 75 74 20 6f 66 20 74 68 65 20 73 63 61 6e   out of the scan
9c00: 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
9c10: 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
9c20: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72  {.      if( pSor
9c30: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  t ){.        ass
9c40: 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3c  ert( nResultCol<
9c50: 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 29 3b  =pDest->nSdst );
9c60: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
9c70: 6f 53 6f 72 74 65 72 28 0a 20 20 20 20 20 20 20  oSorter(.       
9c80: 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 53 6f       pParse, pSo
9c90: 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74  rt, p, regResult
9ca0: 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52 65 73 75  , regOrig, nResu
9cb0: 6c 74 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52 65  ltCol, nPrefixRe
9cc0: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
9cd0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9ce0: 20 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d 70 44 65   nResultCol==pDe
9cf0: 73 74 2d 3e 6e 53 64 73 74 20 29 3b 0a 20 20 20  st->nSdst );.   
9d00: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 65 67       assert( reg
9d10: 52 65 73 75 6c 74 3d 3d 69 50 61 72 6d 20 29 3b  Result==iParm );
9d20: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
9d30: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
9d40: 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68  l jump out of th
9d50: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
9d60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
9d70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
9d80: 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
9d90: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
9da0: 52 59 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20  RY */..    case 
9db0: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 20  SRT_Coroutine:  
9dc0: 20 20 20 20 20 2f 2a 20 53 65 6e 64 20 64 61 74       /* Send dat
9dd0: 61 20 74 6f 20 61 20 63 6f 2d 72 6f 75 74 69 6e  a to a co-routin
9de0: 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52  e */.    case SR
9df0: 54 5f 4f 75 74 70 75 74 3a 20 7b 20 20 20 20 20  T_Output: {     
9e00: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
9e10: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20   results */.    
9e20: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
9e30: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
9e40: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
9e50: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  se( eDest==SRT_O
9e60: 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 69  utput );.      i
9e70: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
9e80: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
9e90: 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  er(pParse, pSort
9ea0: 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  , p, regResult, 
9eb0: 72 65 67 4f 72 69 67 2c 20 6e 52 65 73 75 6c 74  regOrig, nResult
9ec0: 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Col,.           
9ed0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 50 72 65              nPre
9ee0: 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  fixReg);.      }
9ef0: 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d  else if( eDest==
9f00: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b  SRT_Coroutine ){
9f10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9f20: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
9f30: 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69  _Yield, pDest->i
9f40: 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d  SDParm);.      }
9f50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
9f60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
9f70: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
9f80: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
9f90: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  ultCol);.       
9fa0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
9fb0: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
9fc0: 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c  pParse, regResul
9fd0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
9fe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
9ff0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
a000: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a010: 43 54 45 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  CTE.    /* Write
a020: 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 74   the results int
a030: 6f 20 61 20 70 72 69 6f 72 69 74 79 20 71 75 65  o a priority que
a040: 75 65 20 74 68 61 74 20 69 73 20 6f 72 64 65 72  ue that is order
a050: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 0a 20 20   according to.  
a060: 20 20 2a 2a 20 70 44 65 73 74 2d 3e 70 4f 72 64    ** pDest->pOrd
a070: 65 72 42 79 20 28 69 6e 20 70 53 4f 29 2e 20 20  erBy (in pSO).  
a080: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 28  pDest->iSDParm (
a090: 69 6e 20 69 50 61 72 6d 29 20 69 73 20 74 68 65  in iParm) is the
a0a0: 20 63 75 72 73 6f 72 20 66 6f 72 20 61 6e 0a 20   cursor for an. 
a0b0: 20 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68     ** index with
a0c0: 20 70 53 4f 2d 3e 6e 45 78 70 72 2b 32 20 63 6f   pSO->nExpr+2 co
a0d0: 6c 75 6d 6e 73 2e 20 20 42 75 69 6c 64 20 61 20  lumns.  Build a 
a0e0: 6b 65 79 20 75 73 69 6e 67 20 70 53 4f 20 66 6f  key using pSO fo
a0f0: 72 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20  r the first.    
a100: 2a 2a 20 70 53 4f 2d 3e 6e 45 78 70 72 20 63 6f  ** pSO->nExpr co
a110: 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6d 61 6b 65  lumns, then make
a120: 20 73 75 72 65 20 61 6c 6c 20 6b 65 79 73 20 61   sure all keys a
a130: 72 65 20 75 6e 69 71 75 65 20 62 79 20 61 64 64  re unique by add
a140: 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6e  ing a.    ** fin
a150: 61 6c 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 63  al OP_Sequence c
a160: 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 6c 61 73 74  olumn.  The last
a170: 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 72   column is the r
a180: 65 63 6f 72 64 20 61 73 20 61 20 62 6c 6f 62 2e  ecord as a blob.
a190: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
a1a0: 20 53 52 54 5f 44 69 73 74 51 75 65 75 65 3a 0a   SRT_DistQueue:.
a1b0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 51 75 65      case SRT_Que
a1c0: 75 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ue: {.      int 
a1d0: 6e 4b 65 79 3b 0a 20 20 20 20 20 20 69 6e 74 20  nKey;.      int 
a1e0: 72 31 2c 20 72 32 2c 20 72 33 3b 0a 20 20 20 20  r1, r2, r3;.    
a1f0: 20 20 69 6e 74 20 61 64 64 72 54 65 73 74 20 3d    int addrTest =
a200: 20 30 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69   0;.      ExprLi
a210: 73 74 20 2a 70 53 4f 3b 0a 20 20 20 20 20 20 70  st *pSO;.      p
a220: 53 4f 20 3d 20 70 44 65 73 74 2d 3e 70 4f 72 64  SO = pDest->pOrd
a230: 65 72 42 79 3b 0a 20 20 20 20 20 20 61 73 73 65  erBy;.      asse
a240: 72 74 28 20 70 53 4f 20 29 3b 0a 20 20 20 20 20  rt( pSO );.     
a250: 20 6e 4b 65 79 20 3d 20 70 53 4f 2d 3e 6e 45 78   nKey = pSO->nEx
a260: 70 72 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  pr;.      r1 = s
a270: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
a280: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
a290: 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r2 = sqlite3GetT
a2a0: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
a2b0: 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20   nKey+2);.      
a2c0: 72 33 20 3d 20 72 32 2b 6e 4b 65 79 2b 31 3b 0a  r3 = r2+nKey+1;.
a2d0: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
a2e0: 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 29  =SRT_DistQueue )
a2f0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
a300: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
a310: 69 73 20 44 69 73 74 51 75 65 75 65 2c 20 74 68  is DistQueue, th
a320: 65 6e 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d  en cursor (iParm
a330: 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20  +1) is open.    
a340: 20 20 20 20 2a 2a 20 6f 6e 20 61 20 73 65 63 6f      ** on a seco
a350: 6e 64 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  nd ephemeral ind
a360: 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20 61 6c  ex that holds al
a370: 6c 20 76 61 6c 75 65 73 20 65 76 65 72 79 20 70  l values every p
a380: 72 65 76 69 6f 75 73 6c 79 0a 20 20 20 20 20 20  reviously.      
a390: 20 20 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68    ** added to th
a3a0: 65 20 71 75 65 75 65 2e 20 2a 2f 0a 20 20 20 20  e queue. */.    
a3b0: 20 20 20 20 61 64 64 72 54 65 73 74 20 3d 20 73      addrTest = s
a3c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
a3d0: 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
a3e0: 20 69 50 61 72 6d 2b 31 2c 20 30 2c 20 0a 20 20   iParm+1, 0, .  
a3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a410: 20 20 20 20 20 20 72 65 67 52 65 73 75 6c 74 2c        regResult,
a420: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
a430: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
a440: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ge(v);.      }. 
a450: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a460: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
a470: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
a480: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20  lt, nResultCol, 
a490: 72 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  r3);.      if( e
a4a0: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75  Dest==SRT_DistQu
a4b0: 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  eue ){.        s
a4c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a4d0: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
a4e0: 2c 20 69 50 61 72 6d 2b 31 2c 20 72 33 29 3b 0a  , iParm+1, r3);.
a4f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a500: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
a510: 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
a520: 55 4c 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ULT);.      }.  
a530: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
a540: 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Key; i++){.     
a550: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a560: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
a570: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a580: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52              regR
a590: 65 73 75 6c 74 20 2b 20 70 53 4f 2d 3e 61 5b 69  esult + pSO->a[i
a5a0: 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
a5b0: 6c 20 2d 20 31 2c 0a 20 20 20 20 20 20 20 20 20  l - 1,.         
a5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5d0: 20 72 32 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a   r2+i);.      }.
a5e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a5f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
a600: 71 75 65 6e 63 65 2c 20 69 50 61 72 6d 2c 20 72  quence, iParm, r
a610: 32 2b 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 73  2+nKey);.      s
a620: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
a630: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
a640: 64 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 2c 20 72  d, r2, nKey+2, r
a650: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
a660: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
a670: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
a680: 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 2c 20 6e  iParm, r1, r2, n
a690: 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 69 66  Key+2);.      if
a6a0: 28 20 61 64 64 72 54 65 73 74 20 29 20 73 71 6c  ( addrTest ) sql
a6b0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
a6c0: 28 76 2c 20 61 64 64 72 54 65 73 74 29 3b 0a 20  (v, addrTest);. 
a6d0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
a6e0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
a6f0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  e, r1);.      sq
a700: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
a710: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 32  Range(pParse, r2
a720: 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20  , nKey+2);.     
a730: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
a740: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
a750: 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 0a 0a 23 69  MIT_CTE */....#i
a760: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
a770: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a  E_OMIT_TRIGGER).
a780: 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74      /* Discard t
a790: 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69  he results.  Thi
a7a0: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45  s is used for SE
a7b0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
a7c0: 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68  inside.    ** th
a7d0: 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47  e body of a TRIG
a7e0: 47 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73  GER.  The purpos
a7f0: 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74  e of such select
a800: 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20  s is to call.   
a810: 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64   ** user-defined
a820: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
a830: 68 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74  have side effect
a840: 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61  s.  We do not ca
a850: 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20  re.    ** about 
a860: 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c  the actual resul
a870: 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ts of the select
a880: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
a890: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
a8a0: 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54  sert( eDest==SRT
a8b0: 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20  _Discard );.    
a8c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
a8d0: 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
a8e0: 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Jump to the end 
a8f0: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74  of the loop if t
a900: 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63  he LIMIT is reac
a910: 68 65 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66  hed.  Except, if
a920: 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61  .  ** there is a
a930: 20 73 6f 72 74 65 72 2c 20 69 6e 20 77 68 69 63   sorter, in whic
a940: 68 20 63 61 73 65 20 74 68 65 20 73 6f 72 74 65  h case the sorte
a950: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6c 69  r has already li
a960: 6d 69 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 6f  mited.  ** the o
a970: 75 74 70 75 74 20 66 6f 72 20 75 73 2e 0a 20 20  utput for us..  
a980: 2a 2f 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d  */.  if( pSort==
a990: 30 20 26 26 20 70 2d 3e 69 4c 69 6d 69 74 20 29  0 && p->iLimit )
a9a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
a9b0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65  eAddOp2(v, OP_De
a9c0: 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69  crJumpZero, p->i
a9d0: 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20  Limit, iBreak); 
a9e0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
a9f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
aa00: 6c 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f  locate a KeyInfo
aa10: 20 6f 62 6a 65 63 74 20 73 75 66 66 69 63 69 65   object sufficie
aa20: 6e 74 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20  nt for an index 
aa30: 6f 66 20 4e 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  of N key columns
aa40: 20 61 6e 64 0a 2a 2a 20 58 20 65 78 74 72 61 20   and.** X extra 
aa50: 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79 49  columns..*/.KeyI
aa60: 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49  nfo *sqlite3KeyI
aa70: 6e 66 6f 41 6c 6c 6f 63 28 73 71 6c 69 74 65 33  nfoAlloc(sqlite3
aa80: 20 2a 64 62 2c 20 69 6e 74 20 4e 2c 20 69 6e 74   *db, int N, int
aa90: 20 58 29 7b 0a 20 20 69 6e 74 20 6e 45 78 74 72   X){.  int nExtr
aaa0: 61 20 3d 20 28 4e 2b 58 29 2a 28 73 69 7a 65 6f  a = (N+X)*(sizeo
aab0: 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 2d  f(CollSeq*)+1) -
aac0: 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a   sizeof(CollSeq*
aad0: 29 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 20  );.  KeyInfo *p 
aae0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
aaf0: 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f  cRawNN(db, sizeo
ab00: 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 6e 45 78  f(KeyInfo) + nEx
ab10: 74 72 61 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  tra);.  if( p ){
ab20: 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64  .    p->aSortOrd
ab30: 65 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 43  er = (u8*)&p->aC
ab40: 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20 20 20 70 2d  oll[N+X];.    p-
ab50: 3e 6e 4b 65 79 46 69 65 6c 64 20 3d 20 28 75 31  >nKeyField = (u1
ab60: 36 29 4e 3b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c  6)N;.    p->nAll
ab70: 46 69 65 6c 64 20 3d 20 28 75 31 36 29 28 4e 2b  Field = (u16)(N+
ab80: 58 29 3b 0a 20 20 20 20 70 2d 3e 65 6e 63 20 3d  X);.    p->enc =
ab90: 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 2d   ENC(db);.    p-
aba0: 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d  >db = db;.    p-
abb0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 6d  >nRef = 1;.    m
abc0: 65 6d 73 65 74 28 26 70 5b 31 5d 2c 20 30 2c 20  emset(&p[1], 0, 
abd0: 6e 45 78 74 72 61 29 3b 0a 20 20 7d 65 6c 73 65  nExtra);.  }else
abe0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d  {.    sqlite3Oom
abf0: 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 7d 0a 20  Fault(db);.  }. 
ac00: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
ac10: 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61  .** Deallocate a
ac20: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a   KeyInfo object.
ac30: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4b  */.void sqlite3K
ac40: 65 79 49 6e 66 6f 55 6e 72 65 66 28 4b 65 79 49  eyInfoUnref(KeyI
ac50: 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  nfo *p){.  if( p
ac60: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
ac70: 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  p->nRef>0 );.   
ac80: 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20   p->nRef--;.    
ac90: 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29  if( p->nRef==0 )
aca0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
acb0: 28 70 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  (p->db, p);.  }.
acc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20  }../*.** Make a 
acd0: 6e 65 77 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  new pointer to a
ace0: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a   KeyInfo object.
acf0: 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69  */.KeyInfo *sqli
ad00: 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 4b 65  te3KeyInfoRef(Ke
ad10: 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28  yInfo *p){.  if(
ad20: 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74   p ){.    assert
ad30: 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  ( p->nRef>0 );. 
ad40: 20 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20     p->nRef++;.  
ad50: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
ad60: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
ad70: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EBUG./*.** Retur
ad80: 6e 20 54 52 55 45 20 69 66 20 61 20 4b 65 79 49  n TRUE if a KeyI
ad90: 6e 66 6f 20 6f 62 6a 65 63 74 20 63 61 6e 20 62  nfo object can b
ada0: 65 20 63 68 61 6e 67 65 2e 20 20 54 68 65 20 4b  e change.  The K
adb0: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a  eyInfo object.**
adc0: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 63 68 61   can only be cha
add0: 6e 67 65 64 20 69 66 20 74 68 69 73 20 69 73 20  nged if this is 
ade0: 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20 72 65  just a single re
adf0: 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6f  ference to the o
ae00: 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bject..**.** Thi
ae10: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
ae20: 64 20 6f 6e 6c 79 20 69 6e 73 69 64 65 20 6f 66  d only inside of
ae30: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
ae40: 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ents..*/.int sql
ae50: 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
ae60: 74 65 61 62 6c 65 28 4b 65 79 49 6e 66 6f 20 2a  teable(KeyInfo *
ae70: 70 29 7b 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52  p){ return p->nR
ae80: 65 66 3d 3d 31 3b 20 7d 0a 23 65 6e 64 69 66 20  ef==1; }.#endif 
ae90: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
aea0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  */../*.** Given 
aeb0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
aec0: 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b  st, generate a K
aed0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
aee0: 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a   that records.**
aef0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
af00: 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68  equence for each
af10: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
af20: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  hat expression l
af30: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ist..**.** If th
af40: 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e  e ExprList is an
af50: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
af60: 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 68 65  UP BY clause the
af70: 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a  n the resulting.
af80: 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  ** KeyInfo struc
af90: 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69  ture is appropri
afa0: 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69  ate for initiali
afb0: 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69  zing a virtual i
afc0: 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65  ndex to.** imple
afd0: 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65  ment that clause
afe0: 2e 20 20 49 66 20 74 68 65 20 45 78 70 72 4c 69  .  If the ExprLi
aff0: 73 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  st is the result
b000: 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54   set of a SELECT
b010: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79  .** then the Key
b020: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
b030: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
b040: 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61  r initializing a
b050: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65   virtual.** inde
b060: 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  x to implement a
b070: 20 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a   DISTINCT test..
b080: 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
b090: 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  old the KeyInfo 
b0a0: 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74  structure is obt
b0b0: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
b0c0: 63 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a  c.  The calling.
b0d0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  ** function is r
b0e0: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73  esponsible for s
b0f0: 65 65 69 6e 67 20 74 68 61 74 20 74 68 69 73 20  eeing that this 
b100: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65  structure is eve
b110: 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64  ntually.** freed
b120: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49  ..*/.static KeyI
b130: 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d  nfo *keyInfoFrom
b140: 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73  ExprList(.  Pars
b150: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
b160: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
b170: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
b180: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a  t *pList,     /*
b190: 20 46 6f 72 6d 20 74 68 65 20 4b 65 79 49 6e 66   Form the KeyInf
b1a0: 6f 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74 68  o object from th
b1b0: 69 73 20 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20  is ExprList */. 
b1c0: 20 69 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20   int iStart,    
b1d0: 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 77        /* Begin w
b1e0: 69 74 68 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20  ith this column 
b1f0: 6f 66 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e  of pList */.  in
b200: 74 20 6e 45 78 74 72 61 20 20 20 20 20 20 20 20  t nExtra        
b210: 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d     /* Add this m
b220: 61 6e 79 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e  any extra column
b230: 73 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a  s to the end */.
b240: 29 7b 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a  ){.  int nExpr;.
b250: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f    KeyInfo *pInfo
b260: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
b270: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
b280: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
b290: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
b2a0: 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d  nt i;..  nExpr =
b2b0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
b2c0: 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33   pInfo = sqlite3
b2d0: 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c  KeyInfoAlloc(db,
b2e0: 20 6e 45 78 70 72 2d 69 53 74 61 72 74 2c 20 6e   nExpr-iStart, n
b2f0: 45 78 74 72 61 2b 31 29 3b 0a 20 20 69 66 28 20  Extra+1);.  if( 
b300: 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 61 73 73  pInfo ){.    ass
b310: 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
b320: 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
b330: 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 66 6f 72  Info) );.    for
b340: 28 69 3d 69 53 74 61 72 74 2c 20 70 49 74 65 6d  (i=iStart, pItem
b350: 3d 70 4c 69 73 74 2d 3e 61 2b 69 53 74 61 72 74  =pList->a+iStart
b360: 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  ; i<nExpr; i++, 
b370: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
b380: 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69  pInfo->aColl[i-i
b390: 53 74 61 72 74 5d 20 3d 20 73 71 6c 69 74 65 33  Start] = sqlite3
b3a0: 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 50  ExprNNCollSeq(pP
b3b0: 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78  arse, pItem->pEx
b3c0: 70 72 29 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f  pr);.      pInfo
b3d0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 2d 69  ->aSortOrder[i-i
b3e0: 53 74 61 72 74 5d 20 3d 20 70 49 74 65 6d 2d 3e  Start] = pItem->
b3f0: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d  sortOrder;.    }
b400: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49  .  }.  return pI
b410: 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61  nfo;.}../*.** Na
b420: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63  me of the connec
b430: 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75  tion operator, u
b440: 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65  sed for error me
b450: 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ssages..*/.stati
b460: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65  c const char *se
b470: 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69  lectOpName(int i
b480: 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  d){.  char *z;. 
b490: 20 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20   switch( id ){. 
b4a0: 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
b4b0: 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e        z = "UNION
b4c0: 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a   ALL";   break;.
b4d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
b4e0: 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45  RSECT: z = "INTE
b4f0: 52 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b  RSECT";   break;
b500: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
b510: 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43  EPT:    z = "EXC
b520: 45 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b  EPT";      break
b530: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20  ;.    default:  
b540: 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e           z = "UN
b550: 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61  ION";       brea
b560: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
b570: 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  z;.}..#ifndef SQ
b580: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
b590: 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61  N./*.** Unless a
b5a0: 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59  n "EXPLAIN QUERY
b5b0: 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69   PLAN" command i
b5c0: 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  s being processe
b5d0: 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
b5e0: 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  .** is a no-op. 
b5f0: 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 61 64  Otherwise, it ad
b600: 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ds a single row 
b610: 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65  of output to the
b620: 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20   EQP result,.** 
b630: 77 68 65 72 65 20 74 68 65 20 63 61 70 74 69 6f  where the captio
b640: 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  n is of the form
b650: 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55 53 45 20 54  :.**.**   "USE T
b660: 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 78  EMP B-TREE FOR x
b670: 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  xx".**.** where 
b680: 78 78 78 20 69 73 20 6f 6e 65 20 6f 66 20 22 44  xxx is one of "D
b690: 49 53 54 49 4e 43 54 22 2c 20 22 4f 52 44 45 52  ISTINCT", "ORDER
b6a0: 20 42 59 22 20 6f 72 20 22 47 52 4f 55 50 20 42   BY" or "GROUP B
b6b0: 59 22 2e 20 45 78 61 63 74 6c 79 20 77 68 69 63  Y". Exactly whic
b6c0: 68 0a 2a 2a 20 69 73 20 64 65 74 65 72 6d 69 6e  h.** is determin
b6d0: 65 64 20 62 79 20 74 68 65 20 7a 55 73 61 67 65  ed by the zUsage
b6e0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
b6f0: 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
b700: 6e 54 65 6d 70 54 61 62 6c 65 28 50 61 72 73 65  nTempTable(Parse
b710: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
b720: 63 68 61 72 20 2a 7a 55 73 61 67 65 29 7b 0a 20  char *zUsage){. 
b730: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
b740: 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56  lain==2 ){.    V
b750: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
b760: 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72  >pVdbe;.    char
b770: 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33   *zMsg = sqlite3
b780: 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e  MPrintf(pParse->
b790: 64 62 2c 20 22 55 53 45 20 54 45 4d 50 20 42 2d  db, "USE TEMP B-
b7a0: 54 52 45 45 20 46 4f 52 20 25 73 22 2c 20 7a 55  TREE FOR %s", zU
b7b0: 73 61 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  sage);.    sqlit
b7c0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
b7d0: 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72  OP_Explain, pPar
b7e0: 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30  se->iSelectId, 0
b7f0: 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59  , 0, zMsg, P4_DY
b800: 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  NAMIC);.  }.}../
b810: 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 65 78 70 72  *.** Assign expr
b820: 65 73 73 69 6f 6e 20 62 20 74 6f 20 6c 76 61 6c  ession b to lval
b830: 75 65 20 61 2e 20 41 20 73 65 63 6f 6e 64 2c 20  ue a. A second, 
b840: 6e 6f 2d 6f 70 2c 20 76 65 72 73 69 6f 6e 20 6f  no-op, version o
b850: 66 20 74 68 69 73 20 6d 61 63 72 6f 0a 2a 2a 20  f this macro.** 
b860: 69 73 20 70 72 6f 76 69 64 65 64 20 77 68 65 6e  is provided when
b870: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
b880: 4c 41 49 4e 20 69 73 20 64 65 66 69 6e 65 64 2e  LAIN is defined.
b890: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65   This allows the
b8a0: 20 63 6f 64 65 0a 2a 2a 20 69 6e 20 73 71 6c 69   code.** in sqli
b8b0: 74 65 33 53 65 6c 65 63 74 28 29 20 74 6f 20 61  te3Select() to a
b8c0: 73 73 69 67 6e 20 76 61 6c 75 65 73 20 74 6f 20  ssign values to 
b8d0: 73 74 72 75 63 74 75 72 65 20 6d 65 6d 62 65 72  structure member
b8e0: 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 0a   variables that.
b8f0: 2a 2a 20 6f 6e 6c 79 20 65 78 69 73 74 20 69 66  ** only exist if
b900: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
b910: 4c 41 49 4e 20 69 73 20 6e 6f 74 20 64 65 66 69  LAIN is not defi
b920: 6e 65 64 20 77 69 74 68 6f 75 74 20 70 6f 6c 6c  ned without poll
b930: 75 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 64  uting the.** cod
b940: 65 20 77 69 74 68 20 23 69 66 6e 64 65 66 20 64  e with #ifndef d
b950: 69 72 65 63 74 69 76 65 73 2e 0a 2a 2f 0a 23 20  irectives..*/.# 
b960: 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65  define explainSe
b970: 74 49 6e 74 65 67 65 72 28 61 2c 20 62 29 20 61  tInteger(a, b) a
b980: 20 3d 20 62 0a 0a 23 65 6c 73 65 0a 2f 2a 20 4e   = b..#else./* N
b990: 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66  o-op versions of
b9a0: 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28   the explainXXX(
b9b0: 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  ) functions and 
b9c0: 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66  macros. */.# def
b9d0: 69 6e 65 20 65 78 70 6c 61 69 6e 54 65 6d 70 54  ine explainTempT
b9e0: 61 62 6c 65 28 79 2c 7a 29 0a 23 20 64 65 66 69  able(y,z).# defi
b9f0: 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74  ne explainSetInt
ba00: 65 67 65 72 28 79 2c 7a 29 0a 23 65 6e 64 69 66  eger(y,z).#endif
ba10: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
ba20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
ba30: 49 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  IN) && !defined(
ba40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
ba50: 4f 55 4e 44 5f 53 45 4c 45 43 54 29 0a 2f 2a 0a  OUND_SELECT)./*.
ba60: 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58  ** Unless an "EX
ba70: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
ba80: 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69  " command is bei
ba90: 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68  ng processed, th
baa0: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
bab0: 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72  s a no-op. Other
bac0: 77 69 73 65 2c 20 69 74 20 61 64 64 73 20 61 20  wise, it adds a 
bad0: 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75  single row of ou
bae0: 74 70 75 74 20 74 6f 20 74 68 65 20 45 51 50 20  tput to the EQP 
baf0: 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65  result,.** where
bb00: 20 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20   the caption is 
bb10: 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 77  of one of the tw
bb20: 6f 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20  o forms:.**.**  
bb30: 20 22 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51   "COMPOSITE SUBQ
bb40: 55 45 52 49 45 53 20 69 53 75 62 31 20 61 6e 64  UERIES iSub1 and
bb50: 20 69 53 75 62 32 20 28 6f 70 29 22 0a 2a 2a 20   iSub2 (op)".** 
bb60: 20 20 22 43 4f 4d 50 4f 53 49 54 45 20 53 55 42    "COMPOSITE SUB
bb70: 51 55 45 52 49 45 53 20 69 53 75 62 31 20 61 6e  QUERIES iSub1 an
bb80: 64 20 69 53 75 62 32 20 55 53 49 4e 47 20 54 45  d iSub2 USING TE
bb90: 4d 50 20 42 2d 54 52 45 45 20 28 6f 70 29 22 0a  MP B-TREE (op)".
bba0: 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 69 53 75 62  **.** where iSub
bbb0: 31 20 61 6e 64 20 69 53 75 62 32 20 61 72 65 20  1 and iSub2 are 
bbc0: 74 68 65 20 69 6e 74 65 67 65 72 73 20 70 61 73  the integers pas
bbd0: 73 65 64 20 61 73 20 74 68 65 20 63 6f 72 72 65  sed as the corre
bbe0: 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 66 75 6e 63  sponding.** func
bbf0: 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 73 2c  tion parameters,
bc00: 20 61 6e 64 20 6f 70 20 69 73 20 74 68 65 20 74   and op is the t
bc10: 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ext representati
bc20: 6f 6e 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65  on of the parame
bc30: 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61  ter.** of the sa
bc40: 6d 65 20 6e 61 6d 65 2e 20 54 68 65 20 70 61 72  me name. The par
bc50: 61 6d 65 74 65 72 20 22 6f 70 22 20 6d 75 73 74  ameter "op" must
bc60: 20 62 65 20 6f 6e 65 20 6f 66 20 54 4b 5f 55 4e   be one of TK_UN
bc70: 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 0a  ION, TK_EXCEPT,.
bc80: 2a 2a 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  ** TK_INTERSECT 
bc90: 6f 72 20 54 4b 5f 41 4c 4c 2e 20 54 68 65 20 66  or TK_ALL. The f
bca0: 69 72 73 74 20 66 6f 72 6d 20 69 73 20 75 73 65  irst form is use
bcb0: 64 20 69 66 20 61 72 67 75 6d 65 6e 74 20 62 55  d if argument bU
bcc0: 73 65 54 6d 70 20 69 73 20 0a 2a 2a 20 66 61 6c  seTmp is .** fal
bcd0: 73 65 2c 20 6f 72 20 74 68 65 20 73 65 63 6f 6e  se, or the secon
bce0: 64 20 66 6f 72 6d 20 69 66 20 69 74 20 69 73 20  d form if it is 
bcf0: 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  true..*/.static 
bd00: 76 6f 69 64 20 65 78 70 6c 61 69 6e 43 6f 6d 70  void explainComp
bd10: 6f 73 69 74 65 28 0a 20 20 50 61 72 73 65 20 2a  osite(.  Parse *
bd20: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
bd30: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
bd40: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  e context */.  i
bd50: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
bd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bd70: 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f  * One of TK_UNIO
bd80: 4e 2c 20 54 4b 5f 45 58 43 45 50 54 20 65 74 63  N, TK_EXCEPT etc
bd90: 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 31  . */.  int iSub1
bda0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
bdb0: 20 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65         /* Subque
bdc0: 72 79 20 69 64 20 31 20 2a 2f 0a 20 20 69 6e 74  ry id 1 */.  int
bdd0: 20 69 53 75 62 32 2c 20 20 20 20 20 20 20 20 20   iSub2,         
bde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bdf0: 53 75 62 71 75 65 72 79 20 69 64 20 32 20 2a 2f  Subquery id 2 */
be00: 0a 20 20 69 6e 74 20 62 55 73 65 54 6d 70 20 20  .  int bUseTmp  
be10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be20: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
be30: 74 65 6d 70 20 74 61 62 6c 65 20 77 61 73 20 75  temp table was u
be40: 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  sed */.){.  asse
be50: 72 74 28 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e  rt( op==TK_UNION
be60: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50   || op==TK_EXCEP
be70: 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45  T || op==TK_INTE
be80: 52 53 45 43 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  RSECT || op==TK_
be90: 41 4c 4c 20 29 3b 0a 20 20 69 66 28 20 70 50 61  ALL );.  if( pPa
bea0: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
beb0: 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ){.    Vdbe *v =
bec0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
bed0: 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d      char *zMsg =
bee0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
bef0: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
bf00: 3e 64 62 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 53  >db, "COMPOUND S
bf10: 55 42 51 55 45 52 49 45 53 20 25 64 20 41 4e 44  UBQUERIES %d AND
bf20: 20 25 64 20 25 73 28 25 73 29 22 2c 20 69 53 75   %d %s(%s)", iSu
bf30: 62 31 2c 20 69 53 75 62 32 2c 0a 20 20 20 20 20  b1, iSub2,.     
bf40: 20 20 20 62 55 73 65 54 6d 70 3f 22 55 53 49 4e     bUseTmp?"USIN
bf50: 47 20 54 45 4d 50 20 42 2d 54 52 45 45 20 22 3a  G TEMP B-TREE ":
bf60: 22 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65  "", selectOpName
bf70: 28 6f 70 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  (op).    );.    
bf80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bf90: 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
bfa0: 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
bfb0: 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20  Id, 0, 0, zMsg, 
bfc0: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
bfd0: 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f  .}.#else./* No-o
bfe0: 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  p versions of th
bff0: 65 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66  e explainXXX() f
c000: 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63  unctions and mac
c010: 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65  ros. */.# define
c020: 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74   explainComposit
c030: 65 28 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  e(v,w,x,y,z).#en
c040: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
c050: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73  e inner loop was
c060: 20 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67   generated using
c070: 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64   a non-null pOrd
c080: 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a  erBy argument,.*
c090: 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  * then the resul
c0a0: 74 73 20 77 65 72 65 20 70 6c 61 63 65 64 20 69  ts were placed i
c0b0: 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74  n a sorter.  Aft
c0c0: 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74  er the loop is t
c0d0: 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20  erminated.** we 
c0e0: 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20  need to run the 
c0f0: 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75  sorter and outpu
c100: 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20  t the results.  
c110: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  The following.**
c120: 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
c130: 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64  es the code need
c140: 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a  ed to do that..*
c150: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
c160: 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a  nerateSortTail(.
c170: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
c180: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
c190: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
c1a0: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a  ct *p,        /*
c1b0: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
c1c0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 6f 72 74 43  ement */.  SortC
c1d0: 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 2f 2a 20  tx *pSort,   /* 
c1e0: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 74  Information on t
c1f0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
c200: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  se */.  int nCol
c210: 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d  umn,      /* Num
c220: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f  ber of columns o
c230: 66 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65  f data */.  Sele
c240: 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a  ctDest *pDest /*
c250: 20 57 72 69 74 65 20 74 68 65 20 73 6f 72 74 65   Write the sorte
c260: 64 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  d results here *
c270: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
c280: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
c290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2a0: 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61      /* The prepa
c2b0: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  red statement */
c2c0: 0a 20 20 69 6e 74 20 61 64 64 72 42 72 65 61 6b  .  int addrBreak
c2d0: 20 3d 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44   = pSort->labelD
c2e0: 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  one;            
c2f0: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
c300: 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  exit loop */.  i
c310: 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 20  nt addrContinue 
c320: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
c330: 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 4a  eLabel(v);  /* J
c340: 75 6d 70 20 68 65 72 65 20 66 6f 72 20 6e 65 78  ump here for nex
c350: 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74  t cycle */.  int
c360: 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20   addr;          
c370: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c380: 54 6f 70 20 6f 66 20 6f 75 74 70 75 74 20 6c 6f  Top of output lo
c390: 6f 70 2e 20 4a 75 6d 70 20 66 6f 72 20 4e 65 78  op. Jump for Nex
c3a0: 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  t. */.  int addr
c3b0: 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Once = 0;.  int 
c3c0: 69 54 61 62 3b 0a 20 20 45 78 70 72 4c 69 73 74  iTab;.  ExprList
c3d0: 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53 6f   *pOrderBy = pSo
c3e0: 72 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  rt->pOrderBy;.  
c3f0: 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73  int eDest = pDes
c400: 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74 20  t->eDest;.  int 
c410: 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69  iParm = pDest->i
c420: 53 44 50 61 72 6d 3b 0a 20 20 69 6e 74 20 72 65  SDParm;.  int re
c430: 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52  gRow;.  int regR
c440: 6f 77 69 64 3b 0a 20 20 69 6e 74 20 69 43 6f 6c  owid;.  int iCol
c450: 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20  ;.  int nKey;   
c460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c470: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
c480: 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   key columns in 
c490: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f  sorter record */
c4a0: 0a 20 20 69 6e 74 20 69 53 6f 72 74 54 61 62 3b  .  int iSortTab;
c4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4c0: 20 20 20 2f 2a 20 53 6f 72 74 65 72 20 63 75 72     /* Sorter cur
c4d0: 73 6f 72 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  sor to read from
c4e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   */.  int i;.  i
c4f0: 6e 74 20 62 53 65 71 3b 20 20 20 20 20 20 20 20  nt bSeq;        
c500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c510: 2a 20 54 72 75 65 20 69 66 20 73 6f 72 74 65 72  * True if sorter
c520: 20 72 65 63 6f 72 64 20 69 6e 63 6c 75 64 65 73   record includes
c530: 20 73 65 71 2e 20 6e 6f 2e 20 2a 2f 0a 20 20 69   seq. no. */.  i
c540: 6e 74 20 6e 52 65 66 4b 65 79 20 3d 20 30 3b 0a  nt nRefKey = 0;.
c550: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
c560: 74 5f 69 74 65 6d 20 2a 61 4f 75 74 45 78 20 3d  t_item *aOutEx =
c570: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 0a   p->pEList->a;..
c580: 20 20 61 73 73 65 72 74 28 20 61 64 64 72 42 72    assert( addrBr
c590: 65 61 6b 3c 30 20 29 3b 0a 20 20 69 66 28 20 70  eak<0 );.  if( p
c5a0: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
c5b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
c5c0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
c5d0: 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65  Gosub, pSort->re
c5e0: 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e  gReturn, pSort->
c5f0: 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20  labelBkOut);.   
c600: 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
c610: 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  (v, addrBreak);.
c620: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
c630: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
c640: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
c650: 29 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  );.  }..#ifdef S
c660: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52  QLITE_ENABLE_SOR
c670: 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20  TER_REFERENCES. 
c680: 20 2f 2a 20 4f 70 65 6e 20 61 6e 79 20 63 75 72   /* Open any cur
c690: 73 6f 72 73 20 6e 65 65 64 65 64 20 66 6f 72 20  sors needed for 
c6a0: 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e 63 65  sorter-reference
c6b0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a   expressions */.
c6c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 6f    for(i=0; i<pSo
c6d0: 72 74 2d 3e 6e 44 65 66 65 72 3b 20 69 2b 2b 29  rt->nDefer; i++)
c6e0: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
c6f0: 62 20 3d 20 70 53 6f 72 74 2d 3e 61 44 65 66 65  b = pSort->aDefe
c700: 72 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20 69  r[i].pTab;.    i
c710: 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
c720: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
c730: 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
c740: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 73 71  pSchema);.    sq
c750: 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
c760: 50 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e 61 44  Parse, pSort->aD
c770: 65 66 65 72 5b 69 5d 2e 69 43 73 72 2c 20 69 44  efer[i].iCsr, iD
c780: 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  b, pTab, OP_Open
c790: 52 65 61 64 29 3b 0a 20 20 20 20 6e 52 65 66 4b  Read);.    nRefK
c7a0: 65 79 20 3d 20 4d 41 58 28 6e 52 65 66 4b 65 79  ey = MAX(nRefKey
c7b0: 2c 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b  , pSort->aDefer[
c7c0: 69 5d 2e 6e 4b 65 79 29 3b 0a 20 20 7d 0a 23 65  i].nKey);.  }.#e
c7d0: 6e 64 69 66 0a 0a 20 20 69 54 61 62 20 3d 20 70  ndif..  iTab = p
c7e0: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 3b 0a  Sort->iECursor;.
c7f0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
c800: 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74  _Output || eDest
c810: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
c820: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65  || eDest==SRT_Me
c830: 6d 20 29 7b 0a 20 20 20 20 72 65 67 52 6f 77 69  m ){.    regRowi
c840: 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 67 52 6f  d = 0;.    regRo
c850: 77 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74  w = pDest->iSdst
c860: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
c870: 65 67 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65  egRowid = sqlite
c880: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
c890: 73 65 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 20  se);.    regRow 
c8a0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
c8b0: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43  Range(pParse, nC
c8c0: 6f 6c 75 6d 6e 29 3b 0a 20 20 7d 0a 20 20 6e 4b  olumn);.  }.  nK
c8d0: 65 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  ey = pOrderBy->n
c8e0: 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f  Expr - pSort->nO
c8f0: 42 53 61 74 3b 0a 20 20 69 66 28 20 70 53 6f 72  BSat;.  if( pSor
c900: 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53  t->sortFlags & S
c910: 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65  ORTFLAG_UseSorte
c920: 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67  r ){.    int reg
c930: 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70 50 61 72  SortOut = ++pPar
c940: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 53  se->nMem;.    iS
c950: 6f 72 74 54 61 62 20 3d 20 70 50 61 72 73 65 2d  ortTab = pParse-
c960: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 69 66 28  >nTab++;.    if(
c970: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f   pSort->labelBkO
c980: 75 74 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  ut ){.      addr
c990: 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Once = sqlite3Vd
c9a0: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f  beAddOp0(v, OP_O
c9b0: 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  nce); VdbeCovera
c9c0: 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ge(v);.    }.   
c9d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c9e0: 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65  p3(v, OP_OpenPse
c9f0: 75 64 6f 2c 20 69 53 6f 72 74 54 61 62 2c 20 72  udo, iSortTab, r
ca00: 65 67 53 6f 72 74 4f 75 74 2c 20 0a 20 20 20 20  egSortOut, .    
ca10: 20 20 20 20 6e 4b 65 79 2b 31 2b 6e 43 6f 6c 75      nKey+1+nColu
ca20: 6d 6e 2b 6e 52 65 66 4b 65 79 29 3b 0a 20 20 20  mn+nRefKey);.   
ca30: 20 69 66 28 20 61 64 64 72 4f 6e 63 65 20 29 20   if( addrOnce ) 
ca40: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
ca50: 65 72 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29  ere(v, addrOnce)
ca60: 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b  ;.    addr = 1 +
ca70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ca80: 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53  p2(v, OP_SorterS
ca90: 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42  ort, iTab, addrB
caa0: 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43  reak);.    VdbeC
cab0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
cac0: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d  codeOffset(v, p-
cad0: 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f  >iOffset, addrCo
cae0: 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c  ntinue);.    sql
caf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
cb00: 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c  , OP_SorterData,
cb10: 20 69 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75   iTab, regSortOu
cb20: 74 2c 20 69 53 6f 72 74 54 61 62 29 3b 0a 20 20  t, iSortTab);.  
cb30: 20 20 62 53 65 71 20 3d 20 30 3b 0a 20 20 7d 65    bSeq = 0;.  }e
cb40: 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 20 3d 20  lse{.    addr = 
cb50: 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 + sqlite3VdbeA
cb60: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
cb70: 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65 61  , iTab, addrBrea
cb80: 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
cb90: 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66  (v);.    codeOff
cba0: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
cbb0: 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  t, addrContinue)
cbc0: 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d  ;.    iSortTab =
cbd0: 20 69 54 61 62 3b 0a 20 20 20 20 62 53 65 71 20   iTab;.    bSeq 
cbe0: 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  = 1;.  }.  for(i
cbf0: 3d 30 2c 20 69 43 6f 6c 3d 6e 4b 65 79 2b 62 53  =0, iCol=nKey+bS
cc00: 65 71 2d 31 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b  eq-1; i<nColumn;
cc10: 20 69 2b 2b 29 7b 0a 23 69 66 64 65 66 20 53 51   i++){.#ifdef SQ
cc20: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
cc30: 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20  ER_REFERENCES.  
cc40: 20 20 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e    if( aOutEx[i].
cc50: 62 53 6f 72 74 65 72 52 65 66 20 29 20 63 6f 6e  bSorterRef ) con
cc60: 74 69 6e 75 65 3b 0a 23 65 6e 64 69 66 0a 20 20  tinue;.#endif.  
cc70: 20 20 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e    if( aOutEx[i].
cc80: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d  u.x.iOrderByCol=
cc90: 3d 30 20 29 20 69 43 6f 6c 2b 2b 3b 0a 20 20 7d  =0 ) iCol++;.  }
cca0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
ccb0: 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
ccc0: 45 52 45 4e 43 45 53 0a 20 20 69 66 28 20 70 53  ERENCES.  if( pS
ccd0: 6f 72 74 2d 3e 6e 44 65 66 65 72 20 29 7b 0a 20  ort->nDefer ){. 
cce0: 20 20 20 69 6e 74 20 69 4b 65 79 20 3d 20 69 43     int iKey = iC
ccf0: 6f 6c 2b 31 3b 0a 20 20 20 20 69 6e 74 20 72 65  ol+1;.    int re
cd00: 67 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 47 65  gKey = sqlite3Ge
cd10: 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
cd20: 65 2c 20 6e 52 65 66 4b 65 79 29 3b 0a 0a 20 20  e, nRefKey);..  
cd30: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 6f    for(i=0; i<pSo
cd40: 72 74 2d 3e 6e 44 65 66 65 72 3b 20 69 2b 2b 29  rt->nDefer; i++)
cd50: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 73 72  {.      int iCsr
cd60: 20 3d 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72   = pSort->aDefer
cd70: 5b 69 5d 2e 69 43 73 72 3b 0a 20 20 20 20 20 20  [i].iCsr;.      
cd80: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 53  Table *pTab = pS
cd90: 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 70  ort->aDefer[i].p
cda0: 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  Tab;.      int n
cdb0: 4b 65 79 20 3d 20 70 53 6f 72 74 2d 3e 61 44 65  Key = pSort->aDe
cdc0: 66 65 72 5b 69 5d 2e 6e 4b 65 79 3b 0a 0a 20 20  fer[i].nKey;..  
cdd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
cde0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp1(v, OP_Null
cdf0: 52 6f 77 2c 20 69 43 73 72 29 3b 0a 20 20 20 20  Row, iCsr);.    
ce00: 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70    if( HasRowid(p
ce10: 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
ce20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ce30: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
ce40: 69 53 6f 72 74 54 61 62 2c 20 69 4b 65 79 2b 2b  iSortTab, iKey++
ce50: 2c 20 72 65 67 4b 65 79 29 3b 0a 20 20 20 20 20  , regKey);.     
ce60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ce70: 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52  dOp3(v, OP_SeekR
ce80: 6f 77 69 64 2c 20 69 43 73 72 2c 20 0a 20 20 20  owid, iCsr, .   
ce90: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
cea0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
ceb0: 76 29 2b 31 2c 20 72 65 67 4b 65 79 29 3b 0a 20  v)+1, regKey);. 
cec0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ced0: 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
cee0: 20 20 20 69 6e 74 20 69 4a 6d 70 3b 0a 20 20 20     int iJmp;.   
cef0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
cf00: 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
cf10: 64 65 78 28 70 54 61 62 29 2d 3e 6e 4b 65 79 43  dex(pTab)->nKeyC
cf20: 6f 6c 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 20 20  ol==nKey );.    
cf30: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e      for(k=0; k<n
cf40: 4b 65 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  Key; k++){.     
cf50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cf60: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
cf70: 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20 69  umn, iSortTab, i
cf80: 4b 65 79 2b 2b 2c 20 72 65 67 4b 65 79 2b 6b 29  Key++, regKey+k)
cf90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
cfa0: 20 20 20 20 69 4a 6d 70 20 3d 20 73 71 6c 69 74      iJmp = sqlit
cfb0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
cfc0: 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  r(v);.        sq
cfd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
cfe0: 6e 74 28 76 2c 20 4f 50 5f 53 65 65 6b 47 45 2c  nt(v, OP_SeekGE,
cff0: 20 69 43 73 72 2c 20 69 4a 6d 70 2b 32 2c 20 72   iCsr, iJmp+2, r
d000: 65 67 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20  egKey, nKey);.  
d010: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d020: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
d030: 5f 49 64 78 4c 45 2c 20 69 43 73 72 2c 20 69 4a  _IdxLE, iCsr, iJ
d040: 6d 70 2b 33 2c 20 72 65 67 4b 65 79 2c 20 6e 4b  mp+3, regKey, nK
d050: 65 79 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ey);.        sql
d060: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
d070: 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43  , OP_NullRow, iC
d080: 73 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  sr);.      }.   
d090: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65   }.    sqlite3Re
d0a0: 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
d0b0: 50 61 72 73 65 2c 20 72 65 67 4b 65 79 2c 20 6e  Parse, regKey, n
d0c0: 52 65 66 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e  RefKey);.  }.#en
d0d0: 64 69 66 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 6c  dif.  for(i=nCol
d0e0: 75 6d 6e 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  umn-1; i>=0; i--
d0f0: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
d100: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
d110: 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66  EFERENCES.    if
d120: 28 20 61 4f 75 74 45 78 5b 69 5d 2e 62 53 6f 72  ( aOutEx[i].bSor
d130: 74 65 72 52 65 66 20 29 7b 0a 20 20 20 20 20 20  terRef ){.      
d140: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
d150: 70 50 61 72 73 65 2c 20 61 4f 75 74 45 78 5b 69  pParse, aOutEx[i
d160: 5d 2e 70 45 78 70 72 2c 20 72 65 67 52 6f 77 2b  ].pExpr, regRow+
d170: 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  i);.    }else.#e
d180: 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
d190: 20 69 6e 74 20 69 52 65 61 64 3b 0a 20 20 20 20   int iRead;.    
d1a0: 20 20 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e    if( aOutEx[i].
d1b0: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
d1c0: 29 7b 0a 20 20 20 20 20 20 20 20 69 52 65 61 64  ){.        iRead
d1d0: 20 3d 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78   = aOutEx[i].u.x
d1e0: 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 3b 0a  .iOrderByCol-1;.
d1f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d200: 20 20 20 20 20 69 52 65 61 64 20 3d 20 69 43 6f       iRead = iCo
d210: 6c 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  l--;.      }.   
d220: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d230: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
d240: 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20 69 52 65  n, iSortTab, iRe
d250: 61 64 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20  ad, regRow+i);. 
d260: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
d270: 28 28 76 2c 20 22 25 73 22 2c 20 61 4f 75 74 45  ((v, "%s", aOutE
d280: 78 5b 69 5d 2e 7a 4e 61 6d 65 3f 61 4f 75 74 45  x[i].zName?aOutE
d290: 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3a 20 61 4f 75  x[i].zName : aOu
d2a0: 74 45 78 5b 69 5d 2e 7a 53 70 61 6e 29 29 3b 0a  tEx[i].zSpan));.
d2b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 77 69 74      }.  }.  swit
d2c0: 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20  ch( eDest ){.   
d2d0: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
d2e0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
d2f0: 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
d300: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d310: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
d320: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69  , iParm, regRowi
d330: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
d340: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
d350: 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  P_Insert, iParm,
d360: 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69   regRow, regRowi
d370: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
d380: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
d390: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
d3a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
d3b0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
d3c0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
d3d0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
d3e0: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
d3f0: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 73 71 6c 69  t( nColumn==sqli
d400: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44 65 73  te3Strlen30(pDes
d410: 74 2d 3e 7a 41 66 66 53 64 73 74 29 20 29 3b 0a  t->zAffSdst) );.
d420: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d430: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
d440: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77  keRecord, regRow
d450: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 6f  , nColumn, regRo
d460: 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  wid,.           
d470: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65               pDe
d480: 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20 6e 43  st->zAffSdst, nC
d490: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71  olumn);.      sq
d4a0: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
d4b0: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
d4c0: 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f  rse, regRow, nCo
d4d0: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  lumn);.      sql
d4e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
d4f0: 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  t(v, OP_IdxInser
d500: 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77  t, iParm, regRow
d510: 69 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c  id, regRow, nCol
d520: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  umn);.      brea
d530: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
d540: 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
d550: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
d560: 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d  clause will term
d570: 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66  inate the loop f
d580: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
d590: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
d5a0: 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  if.    default: 
d5b0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
d5c0: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
d5d0: 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  t || eDest==SRT_
d5e0: 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20  Coroutine ); .  
d5f0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
d600: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
d610: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
d620: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  e( eDest==SRT_Co
d630: 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20  routine );.     
d640: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
d650: 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20  Output ){.      
d660: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d670: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
d680: 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53 64 73  Row, pDest->iSds
d690: 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t, nColumn);.   
d6a0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
d6b0: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
d6c0: 6e 67 65 28 70 50 61 72 73 65 2c 20 70 44 65 73  nge(pParse, pDes
d6d0: 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d  t->iSdst, nColum
d6e0: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
d6f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d700: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
d710: 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69  _Yield, pDest->i
d720: 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d  SDParm);.      }
d730: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
d740: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 65    }.  }.  if( re
d750: 67 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 69 66  gRowid ){.    if
d760: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74  ( eDest==SRT_Set
d770: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
d780: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
d790: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  e(pParse, regRow
d7a0: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
d7b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
d7c0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
d7d0: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  eg(pParse, regRo
d7e0: 77 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  w);.    }.    sq
d7f0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
d800: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
d810: 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  owid);.  }.  /* 
d820: 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68  The bottom of th
d830: 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71  e loop.  */.  sq
d840: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
d850: 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e  Label(v, addrCon
d860: 74 69 6e 75 65 29 3b 0a 20 20 69 66 28 20 70 53  tinue);.  if( pS
d870: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
d880: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
d890: 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ter ){.    sqlit
d8a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d8b0: 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69  OP_SorterNext, i
d8c0: 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62 65  Tab, addr); Vdbe
d8d0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
d8e0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
d8f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d900: 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  P_Next, iTab, ad
d910: 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  dr); VdbeCoverag
d920: 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  e(v);.  }.  if( 
d930: 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e  pSort->regReturn
d940: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   ) sqlite3VdbeAd
d950: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
d960: 6e 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74  n, pSort->regRet
d970: 75 72 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  urn);.  sqlite3V
d980: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
d990: 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 7d  v, addrBreak);.}
d9a0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
d9b0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
d9c0: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
d9d0: 74 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e  the 'declaration
d9e0: 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a   type' of the.**
d9f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
da00: 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61  r. The string ma
da10: 79 20 62 65 20 74 72 65 61 74 65 64 20 61 73 20  y be treated as 
da20: 73 74 61 74 69 63 20 62 79 20 74 68 65 20 63 61  static by the ca
da30: 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  ller..**.** Also
da40: 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65   try to estimate
da50: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
da60: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
da70: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61 74 0a  and return that.
da80: 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 2a 70 45  ** result in *pE
da90: 73 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a 2a 20 54  stWidth..**.** T
daa0: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
dab0: 79 70 65 20 69 73 20 74 68 65 20 65 78 61 63 74  ype is the exact
dac0: 20 64 61 74 61 74 79 70 65 20 64 65 66 69 6e 69   datatype defini
dad0: 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20 66  tion extracted f
dae0: 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69  rom the.** origi
daf0: 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c 45  nal CREATE TABLE
db00: 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74 68   statement if th
db10: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
db20: 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a  a column. The.**
db30: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
db40: 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69  e for a ROWID fi
db50: 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e 20  eld is INTEGER. 
db60: 45 78 61 63 74 6c 79 20 77 68 65 6e 20 61 6e 20  Exactly when an 
db70: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
db80: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f   considered a co
db90: 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70  lumn can be comp
dba0: 6c 65 78 20 69 6e 20 74 68 65 20 70 72 65 73 65  lex in the prese
dbb0: 6e 63 65 20 6f 66 20 73 75 62 71 75 65 72 69 65  nce of subquerie
dbc0: 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74  s. The.** result
dbd0: 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20  -set expression 
dbe0: 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  in all of the fo
dbf0: 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54 20 73  llowing SELECT s
dc00: 74 61 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a  tatements is .**
dc10: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f   considered a co
dc20: 6c 75 6d 6e 20 62 79 20 74 68 69 73 20 66 75 6e  lumn by this fun
dc30: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53  ction..**.**   S
dc40: 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74  ELECT col FROM t
dc50: 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  bl;.**   SELECT 
dc60: 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d  (SELECT col FROM
dc70: 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43   tbl;.**   SELEC
dc80: 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52  T (SELECT col FR
dc90: 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45  OM tbl);.**   SE
dca0: 4c 45 43 54 20 61 62 63 20 46 52 4f 4d 20 28 53  LECT abc FROM (S
dcb0: 45 4c 45 43 54 20 63 6f 6c 20 41 53 20 61 62 63  ELECT col AS abc
dcc0: 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a   FROM tbl);.** .
dcd0: 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69  ** The declarati
dce0: 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 79 20  on type for any 
dcf0: 65 78 70 72 65 73 73 69 6f 6e 20 6f 74 68 65 72  expression other
dd00: 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69   than a column i
dd10: 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  s NULL..**.** Th
dd20: 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 65  is routine has e
dd30: 69 74 68 65 72 20 33 20 6f 72 20 36 20 70 61 72  ither 3 or 6 par
dd40: 61 6d 65 74 65 72 73 20 64 65 70 65 6e 64 69 6e  ameters dependin
dd50: 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  g on whether or 
dd60: 6e 6f 74 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54  not.** the SQLIT
dd70: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
dd80: 4d 45 54 41 44 41 54 41 20 63 6f 6d 70 69 6c 65  METADATA compile
dd90: 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  -time option is 
dda0: 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  used..*/.#ifdef 
ddb0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
ddc0: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 23 20  LUMN_METADATA.# 
ddd0: 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70  define columnTyp
dde0: 65 28 41 2c 42 2c 43 2c 44 2c 45 29 20 63 6f 6c  e(A,B,C,D,E) col
ddf0: 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c  umnTypeImpl(A,B,
de00: 43 2c 44 2c 45 29 0a 23 65 6c 73 65 20 2f 2a 20  C,D,E).#else /* 
de10: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
de20: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
de30: 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a 23 20  _METADATA) */.# 
de40: 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70  define columnTyp
de50: 65 28 41 2c 42 2c 43 2c 44 2c 45 29 20 63 6f 6c  e(A,B,C,D,E) col
de60: 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 29  umnTypeImpl(A,B)
de70: 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 63  .#endif.static c
de80: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d  onst char *colum
de90: 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d  nTypeImpl(.  Nam
dea0: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a  eContext *pNC, .
deb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45  #ifndef SQLITE_E
dec0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
ded0: 41 44 41 54 41 0a 20 20 45 78 70 72 20 2a 70 45  ADATA.  Expr *pE
dee0: 78 70 72 0a 23 65 6c 73 65 0a 20 20 45 78 70 72  xpr.#else.  Expr
def0: 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74   *pExpr,.  const
df00: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 44 62   char **pzOrigDb
df10: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
df20: 2a 70 7a 4f 72 69 67 54 61 62 2c 0a 20 20 63 6f  *pzOrigTab,.  co
df30: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
df40: 67 43 6f 6c 0a 23 65 6e 64 69 66 0a 29 7b 0a 20  gCol.#endif.){. 
df50: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79   char const *zTy
df60: 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b  pe = 0;.  int j;
df70: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
df80: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
df90: 41 44 41 54 41 0a 20 20 63 68 61 72 20 63 6f 6e  ADATA.  char con
dfa0: 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b  st *zOrigDb = 0;
dfb0: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
dfc0: 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 63  OrigTab = 0;.  c
dfd0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
dfe0: 43 6f 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  Col = 0;.#endif.
dff0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
e000: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
e010: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d   pNC->pSrcList!=
e020: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
e030: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
e040: 5f 43 4f 4c 55 4d 4e 20 29 3b 20 20 2f 2a 20 54  _COLUMN );  /* T
e050: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 65  his routine rune
e060: 73 20 62 65 66 6f 72 65 20 61 67 67 72 65 67 61  s before aggrega
e070: 74 65 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  tes.            
e080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e090: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 72             ** ar
e0a0: 65 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20  e processed */. 
e0b0: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
e0c0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
e0d0: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
e0e0: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
e0f0: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  ion is a column.
e100: 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c   Locate the tabl
e110: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  e the column is 
e120: 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65  being.      ** e
e130: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e  xtracted from in
e140: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72   NameContext.pSr
e150: 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c  cList. This tabl
e160: 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20  e may be real.  
e170: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
e180: 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75  table or a subqu
e190: 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ery..      */.  
e1a0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
e1b0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
e1c0: 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  /* Table structu
e1d0: 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74  re column is ext
e1e0: 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20  racted from */. 
e1f0: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20       Select *pS 
e200: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
e210: 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63   /* Select the c
e220: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
e230: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
e240: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70   int iCol = pExp
e250: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20  r->iColumn;  /* 
e260: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
e270: 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20  in pTab */.     
e280: 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21   while( pNC && !
e290: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
e2a0: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
e2b0: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
e2c0: 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  t;.        for(j
e2d0: 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  =0;j<pTabList->n
e2e0: 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d  Src && pTabList-
e2f0: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70  >a[j].iCursor!=p
e300: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b  Expr->iTable;j++
e310: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  );.        if( j
e320: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
e330: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  ){.          pTa
e340: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
e350: 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  j].pTab;.       
e360: 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74     pS = pTabList
e370: 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a  ->a[j].pSelect;.
e380: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
e390: 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70           pNC = p
e3a0: 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  NC->pNext;.     
e3b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
e3c0: 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
e3d0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74  ){.        /* At
e3e0: 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f 64 65 20   one time, code 
e3f0: 73 75 63 68 20 61 73 20 22 53 45 4c 45 43 54 20  such as "SELECT 
e400: 6e 65 77 2e 78 22 20 77 69 74 68 69 6e 20 61 20  new.x" within a 
e410: 74 72 69 67 67 65 72 20 77 6f 75 6c 64 0a 20 20  trigger would.  
e420: 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74        ** cause t
e430: 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f  his condition to
e440: 20 72 75 6e 2e 20 20 53 69 6e 63 65 20 74 68 65   run.  Since the
e450: 6e 2c 20 77 65 20 68 61 76 65 20 72 65 73 74 72  n, we have restr
e460: 75 63 74 75 72 65 64 20 68 6f 77 0a 20 20 20 20  uctured how.    
e470: 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 63      ** trigger c
e480: 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ode is generated
e490: 20 61 6e 64 20 73 6f 20 74 68 69 73 20 63 6f 6e   and so this con
e4a0: 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e  dition is no lon
e4b0: 67 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ger .        ** 
e4c0: 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65 76 65  possible. Howeve
e4d0: 72 2c 20 69 74 20 63 61 6e 20 73 74 69 6c 6c 20  r, it can still 
e4e0: 62 65 20 74 72 75 65 20 66 6f 72 20 73 74 61 74  be true for stat
e4f0: 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20 20 20  ements like.    
e500: 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f      ** the follo
e510: 77 69 6e 67 3a 0a 20 20 20 20 20 20 20 20 2a 2a  wing:.        **
e520: 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 43 52  .        **   CR
e530: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 63 6f  EATE TABLE t1(co
e540: 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 20 20  l INTEGER);.    
e550: 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
e560: 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 20  (SELECT t1.col) 
e570: 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a 20 20  FROM FROM t1;.  
e580: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
e590: 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75 6d 6e 54   ** when columnT
e5a0: 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ype() is called 
e5b0: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
e5c0: 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e 20 74 68  n "t1.col" in th
e5d0: 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75  e .        ** su
e5e0: 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20 74 68 69  b-select. In thi
e5f0: 73 20 63 61 73 65 2c 20 73 65 74 20 74 68 65 20  s case, set the 
e600: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74 6f 20 4e  column type to N
e610: 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20 20 20 20  ULL, even.      
e620: 20 20 2a 2a 20 74 68 6f 75 67 68 20 69 74 20 73    ** though it s
e630: 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20 62 65 20  hould really be 
e640: 22 49 4e 54 45 47 45 52 22 2e 0a 20 20 20 20 20  "INTEGER"..     
e650: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
e660: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 70   This is not a p
e670: 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68 65 20 63  roblem, as the c
e680: 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66 20 22 74  olumn type of "t
e690: 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76 65 72 0a  1.col" is never.
e6a0: 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 64 2e          ** used.
e6b0: 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65   When columnType
e6c0: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
e6d0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a  the expression .
e6e0: 20 20 20 20 20 20 20 20 2a 2a 20 22 28 53 45 4c          ** "(SEL
e6f0: 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c 20 74 68  ECT t1.col)", th
e700: 65 20 63 6f 72 72 65 63 74 20 74 79 70 65 20 69  e correct type i
e710: 73 20 72 65 74 75 72 6e 65 64 20 28 73 65 65 20  s returned (see 
e720: 74 68 65 20 54 4b 5f 53 45 4c 45 43 54 0a 20 20  the TK_SELECT.  
e730: 20 20 20 20 20 20 2a 2a 20 62 72 61 6e 63 68 20        ** branch 
e740: 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20  below.  */.     
e750: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
e760: 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
e770: 20 70 54 61 62 20 26 26 20 70 45 78 70 72 2d 3e   pTab && pExpr->
e780: 70 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20  pTab==pTab );.  
e790: 20 20 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20      if( pS ){.  
e7a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61        /* The "ta
e7b0: 62 6c 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79  ble" is actually
e7c0: 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72   a sub-select or
e7d0: 20 61 20 76 69 65 77 20 69 6e 20 74 68 65 20 46   a view in the F
e7e0: 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20  ROM clause.     
e7f0: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c     ** of the SEL
e800: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52  ECT statement. R
e810: 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72  eturn the declar
e820: 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f  ation type and o
e830: 72 69 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  rigin.        **
e840: 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 72 65   data for the re
e850: 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20  sult-set column 
e860: 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  of the sub-selec
e870: 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
e880: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d        if( iCol>=
e890: 30 20 26 26 20 69 43 6f 6c 3c 70 53 2d 3e 70 45  0 && iCol<pS->pE
e8a0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
e8b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69           /* If i
e8c0: 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e  Col is less than
e8d0: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
e8e0: 65 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65  expression reque
e8f0: 73 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20  sts the.        
e900: 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68    ** rowid of th
e910: 65 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  e sub-select or 
e920: 76 69 65 77 2e 20 54 68 69 73 20 65 78 70 72 65  view. This expre
e930: 73 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28  ssion is legal (
e940: 73 65 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a  see .          *
e950: 2a 20 74 65 73 74 20 63 61 73 65 20 6d 69 73 63  * test case misc
e960: 32 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61  2.2.2) - it alwa
e970: 79 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  ys evaluates to 
e980: 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20  NULL..          
e990: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d  */.          Nam
e9a0: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
e9b0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 20          Expr *p 
e9c0: 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  = pS->pEList->a[
e9d0: 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20  iCol].pExpr;.   
e9e0: 20 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c         sNC.pSrcL
e9f0: 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a  ist = pS->pSrc;.
ea00: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e            sNC.pN
ea10: 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20  ext = pNC;.     
ea20: 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20       sNC.pParse 
ea30: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pNC->pParse;. 
ea40: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
ea50: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
ea60: 2c 20 70 2c 26 7a 4f 72 69 67 44 62 2c 26 7a 4f  , p,&zOrigDb,&zO
ea70: 72 69 67 54 61 62 2c 26 7a 4f 72 69 67 43 6f 6c  rigTab,&zOrigCol
ea80: 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ); .        }.  
ea90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
eaa0: 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62     /* A real tab
eab0: 6c 65 20 6f 72 20 61 20 43 54 45 20 74 61 62 6c  le or a CTE tabl
eac0: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  e */.        ass
ead0: 65 72 74 28 20 21 70 53 20 29 3b 0a 23 69 66 64  ert( !pS );.#ifd
eae0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
eaf0: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
eb00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
eb10: 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61  l<0 ) iCol = pTa
eb20: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
eb30: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
eb40: 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 28 69 43 6f  XN_ROWID || (iCo
eb50: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
eb60: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20  b->nCol) );.    
eb70: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
eb80: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
eb90: 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
eba0: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f           zOrigCo
ebb0: 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20  l = "rowid";.   
ebc0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ebd0: 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d        zOrigCol =
ebe0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
ebf0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
ec00: 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74     zType = sqlit
ec10: 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54  e3ColumnType(&pT
ec20: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30  ab->aCol[iCol],0
ec30: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
ec40: 20 20 20 20 20 7a 4f 72 69 67 54 61 62 20 3d 20       zOrigTab = 
ec50: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
ec60: 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50       if( pNC->pP
ec70: 61 72 73 65 20 26 26 20 70 54 61 62 2d 3e 70 53  arse && pTab->pS
ec80: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20  chema ){.       
ec90: 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
eca0: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
ecb0: 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64  x(pNC->pParse->d
ecc0: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
ecd0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  );.          zOr
ece0: 69 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72  igDb = pNC->pPar
ecf0: 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
ed00: 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 20  .zDbSName;.     
ed10: 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20     }.#else.     
ed20: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
ed30: 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 28 69 43  =XN_ROWID || (iC
ed40: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
ed50: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20  ab->nCol) );.   
ed60: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
ed70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  ){.          zTy
ed80: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
ed90: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
eda0: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
edb0: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79   sqlite3ColumnTy
edc0: 70 65 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  pe(&pTab->aCol[i
edd0: 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20  Col],0);.       
ede0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
edf0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
ee00: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
ee10: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
ee20: 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  Y.    case TK_SE
ee30: 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LECT: {.      /*
ee40: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
ee50: 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e  is a sub-select.
ee60: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c   Return the decl
ee70: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64  aration type and
ee80: 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e  .      ** origin
ee90: 20 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69   info for the si
eea0: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ngle column in t
eeb0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
eec0: 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20   the SELECT.    
eed0: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a    ** statement..
eee0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e        */.      N
eef0: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
ef00: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
ef10: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   = pExpr->x.pSel
ef20: 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  ect;.      Expr 
ef30: 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d  *p = pS->pEList-
ef40: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
ef50: 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48     assert( ExprH
ef60: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
ef70: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
ef80: 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72  );.      sNC.pSr
ef90: 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63  cList = pS->pSrc
efa0: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78  ;.      sNC.pNex
efb0: 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73  t = pNC;.      s
efc0: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  NC.pParse = pNC-
efd0: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a  >pParse;.      z
efe0: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
eff0: 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69  e(&sNC, p, &zOri
f000: 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20  gDb, &zOrigTab, 
f010: 26 7a 4f 72 69 67 43 6f 6c 29 3b 20 0a 20 20 20  &zOrigCol); .   
f020: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f030: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64  #endif.  }..#ifd
f040: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
f050: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
f060: 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 44    .  if( pzOrigD
f070: 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
f080: 20 70 7a 4f 72 69 67 54 61 62 20 26 26 20 70 7a   pzOrigTab && pz
f090: 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a  OrigCol );.    *
f0a0: 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69 67  pzOrigDb = zOrig
f0b0: 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54  Db;.    *pzOrigT
f0c0: 61 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20  ab = zOrigTab;. 
f0d0: 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20     *pzOrigCol = 
f0e0: 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65  zOrigCol;.  }.#e
f0f0: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 7a 54  ndif.  return zT
f100: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ype;.}../*.** Ge
f110: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
f120: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
f130: 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61 74  DBE the declarat
f140: 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c  ion types of col
f150: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
f160: 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74  esult set..*/.st
f170: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
f180: 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20  teColumnTypes(. 
f190: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
f1a0: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
f1b0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
f1c0: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
f1d0: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
f1e0: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
f1f0: 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78  *pEList    /* Ex
f200: 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69  pressions defini
f210: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ng the result se
f220: 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20  t */.){.#ifndef 
f230: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
f240: 54 59 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d  TYPE.  Vdbe *v =
f250: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
f260: 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43    int i;.  NameC
f270: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e  ontext sNC;.  sN
f280: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61  C.pSrcList = pTa
f290: 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61  bList;.  sNC.pPa
f2a0: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
f2b0: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  sNC.pNext = 0;. 
f2c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
f2d0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
f2e0: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70  .    Expr *p = p
f2f0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
f300: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  r;.    const cha
f310: 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66  r *zType;.#ifdef
f320: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
f330: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
f340: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
f350: 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20  OrigDb = 0;.    
f360: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
f370: 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  gTab = 0;.    co
f380: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43  nst char *zOrigC
f390: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70  ol = 0;.    zTyp
f3a0: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
f3b0: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62  sNC, p, &zOrigDb
f3c0: 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f  , &zOrigTab, &zO
f3d0: 72 69 67 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a  rigCol);..    /*
f3e0: 20 54 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d   The vdbe must m
f3f0: 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79  ake its own copy
f400: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74   of the column-t
f410: 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20  ype and other . 
f420: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65     ** column spe
f430: 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69  cific strings, i
f440: 6e 20 63 61 73 65 20 74 68 65 20 73 63 68 65 6d  n case the schem
f450: 61 20 69 73 20 72 65 73 65 74 20 62 65 66 6f 72  a is reset befor
f460: 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69  e this.    ** vi
f470: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73  rtual machine is
f480: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
f490: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f4a0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
f4b0: 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53   COLNAME_DATABAS
f4c0: 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49  E, zOrigDb, SQLI
f4d0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
f4e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
f4f0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
f500: 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f  OLNAME_TABLE, zO
f510: 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45 5f 54  rigTab, SQLITE_T
f520: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
f530: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
f540: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
f550: 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67  ME_COLUMN, zOrig
f560: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Col, SQLITE_TRAN
f570: 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20  SIENT);.#else.  
f580: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
f590: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c  Type(&sNC, p, 0,
f5a0: 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20   0, 0);.#endif. 
f5b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
f5c0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
f5d0: 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c  OLNAME_DECLTYPE,
f5e0: 20 7a 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54   zType, SQLITE_T
f5f0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23  RANSIENT);.  }.#
f600: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
f610: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  d(SQLITE_OMIT_DE
f620: 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 0a 2f  CLTYPE) */.}.../
f630: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
f640: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f   column names fo
f650: 72 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  r a SELECT state
f660: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
f670: 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65 65 20 74  only guarantee t
f680: 68 61 74 20 53 51 4c 69 74 65 20 6d 61 6b 65 73  hat SQLite makes
f690: 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61   about column na
f6a0: 6d 65 73 20 69 73 20 74 68 61 74 20 69 66 20 74  mes is that if t
f6b0: 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61 73  he.** column has
f6c0: 20 61 6e 20 41 53 20 63 6c 61 75 73 65 20 61 73   an AS clause as
f6d0: 73 69 67 6e 69 6e 67 20 69 74 20 61 20 6e 61 6d  signing it a nam
f6e0: 65 2c 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  e, that will be 
f6f0: 74 68 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a 2a  the name used..*
f700: 2a 20 54 68 61 74 20 69 73 20 74 68 65 20 6f 6e  * That is the on
f710: 6c 79 20 64 6f 63 75 6d 65 6e 74 65 64 20 67 75  ly documented gu
f720: 61 72 61 6e 74 65 65 2e 20 20 48 6f 77 65 76 65  arantee.  Howeve
f730: 72 2c 20 63 6f 75 6e 74 6c 65 73 73 20 61 70 70  r, countless app
f740: 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65 76  lications.** dev
f750: 65 6c 6f 70 65 64 20 6f 76 65 72 20 74 68 65 20  eloped over the 
f760: 79 65 61 72 73 20 68 61 76 65 20 6d 61 64 65 20  years have made 
f770: 62 61 73 65 6c 65 73 73 20 61 73 73 75 6d 70 74  baseless assumpt
f780: 69 6f 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d  ions about colum
f790: 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20 77  n names.** and w
f7a0: 69 6c 6c 20 62 72 65 61 6b 20 69 66 20 74 68 6f  ill break if tho
f7b0: 73 65 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 63  se assumptions c
f7c0: 68 61 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c 20  hanges.  Hence, 
f7d0: 75 73 65 20 65 78 74 72 65 6d 65 20 63 61 75 74  use extreme caut
f7e0: 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64 69  ion.** when modi
f7f0: 66 79 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  fying this routi
f800: 6e 65 20 74 6f 20 61 76 6f 69 64 20 62 72 65 61  ne to avoid brea
f810: 6b 69 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a  king legacy..**.
f820: 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20 73 71 6c  ** See Also: sql
f830: 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  ite3ColumnsFromE
f840: 78 70 72 4c 69 73 74 28 29 0a 2a 2a 0a 2a 2a 20  xprList().**.** 
f850: 54 68 65 20 50 52 41 47 4d 41 20 73 68 6f 72 74  The PRAGMA short
f860: 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20 61 6e  _column_names an
f870: 64 20 50 52 41 47 4d 41 20 66 75 6c 6c 5f 63 6f  d PRAGMA full_co
f880: 6c 75 6d 6e 5f 6e 61 6d 65 73 20 73 65 74 74 69  lumn_names setti
f890: 6e 67 73 20 61 72 65 0a 2a 2a 20 64 65 70 72 65  ngs are.** depre
f8a0: 63 61 74 65 64 2e 20 20 54 68 65 20 64 65 66 61  cated.  The defa
f8b0: 75 6c 74 20 73 65 74 74 69 6e 67 20 69 73 20 73  ult setting is s
f8c0: 68 6f 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f 46  hort=ON, full=OF
f8d0: 46 2e 20 20 39 39 2e 39 25 20 6f 66 20 61 6c 6c  F.  99.9% of all
f8e0: 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  .** applications
f8f0: 20 73 68 6f 75 6c 64 20 6f 70 65 72 61 74 65 20   should operate 
f900: 74 68 69 73 20 77 61 79 2e 20 20 4e 65 76 65 72  this way.  Never
f910: 74 68 65 6c 65 73 73 2c 20 77 65 20 6e 65 65 64  theless, we need
f920: 20 74 6f 20 73 75 70 70 6f 72 74 20 74 68 65 0a   to support the.
f930: 2a 2a 20 6f 74 68 65 72 20 6d 6f 64 65 73 20 66  ** other modes f
f940: 6f 72 20 6c 65 67 61 63 79 3a 0a 2a 2a 0a 2a 2a  or legacy:.**.**
f950: 20 20 20 20 73 68 6f 72 74 3d 4f 46 46 2c 20 66      short=OFF, f
f960: 75 6c 6c 3d 4f 46 46 3a 20 20 20 20 20 20 43 6f  ull=OFF:      Co
f970: 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 74 68 65  lumn name is the
f980: 20 74 65 78 74 20 6f 66 20 74 68 65 20 65 78 70   text of the exp
f990: 72 65 73 73 69 6f 6e 20 68 61 73 20 69 74 0a 2a  ression has it.*
f9a0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
f9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
f9c0: 72 69 67 69 6e 61 6c 6c 79 20 61 70 70 65 61 72  riginally appear
f9d0: 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20  s in the SELECT 
f9e0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 0a 2a  statement.  In.*
f9f0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
fa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
fa10: 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
fa20: 7a 53 70 61 6e 20 6f 66 20 74 68 65 20 72 65 73  zSpan of the res
fa30: 75 6c 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ult expression..
fa40: 2a 2a 0a 2a 2a 20 20 20 20 73 68 6f 72 74 3d 4f  **.**    short=O
fa50: 4e 2c 20 66 75 6c 6c 3d 4f 46 46 3a 20 20 20 20  N, full=OFF:    
fa60: 20 20 20 28 54 68 69 73 20 69 73 20 74 68 65 20     (This is the 
fa70: 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 29  default setting)
fa80: 2e 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74  .  If the result
fa90: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
faa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fab0: 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79   refers directly
fac0: 20 74 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c 75   to a table colu
fad0: 6d 6e 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  mn, then the.** 
fae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
faf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
fb00: 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ult column name 
fb10: 69 73 20 6a 75 73 74 20 74 68 65 20 74 61 62 6c  is just the tabl
fb20: 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 20 20  e column.**     
fb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb40: 20 20 20 20 20 20 20 20 20 6e 61 6d 65 3a 20 43           name: C
fb50: 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65 72 77 69 73  OLUMN.  Otherwis
fb60: 65 20 75 73 65 20 7a 53 70 61 6e 2e 0a 2a 2a 0a  e use zSpan..**.
fb70: 2a 2a 20 20 20 20 66 75 6c 6c 3d 4f 4e 2c 20 73  **    full=ON, s
fb80: 68 6f 72 74 3d 41 4e 59 3a 20 20 20 20 20 20 20  hort=ANY:       
fb90: 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 72 65  If the result re
fba0: 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f  fers directly to
fbb0: 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c   a table column,
fbc0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
fbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbe0: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
fbf0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 69 74   column name wit
fc00: 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  h the table name
fc10: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
fc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc30: 20 70 72 65 66 69 78 2c 20 65 78 3a 20 54 41 42   prefix, ex: TAB
fc40: 4c 45 2e 43 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65  LE.COLUMN.  Othe
fc50: 72 77 69 73 65 20 75 73 65 20 7a 53 70 61 6e 2e  rwise use zSpan.
fc60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
fc70: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
fc80: 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  mes(.  Parse *pP
fc90: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
fca0: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
fcb0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
fcc0: 74 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  t     /* Generat
fcd0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  e column names f
fce0: 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 73  or this SELECT s
fcf0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  tatement */.){. 
fd00: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
fd10: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
fd20: 69 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  i;.  Table *pTab
fd30: 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
fd40: 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73  bList;.  ExprLis
fd50: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c  t *pEList;.  sql
fd60: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
fd70: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c  e->db;.  int ful
fd80: 6c 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 54 41 42  lName;    /* TAB
fd90: 4c 45 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e 6f 20  LE.COLUMN if no 
fda0: 41 53 20 63 6c 61 75 73 65 20 61 6e 64 20 69 73  AS clause and is
fdb0: 20 61 20 64 69 72 65 63 74 20 74 61 62 6c 65 20   a direct table 
fdc0: 72 65 66 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63  ref */.  int src
fdd0: 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 43 4f 4c  Name;     /* COL
fde0: 55 4d 4e 20 6f 72 20 54 41 42 4c 45 2e 43 4f 4c  UMN or TABLE.COL
fdf0: 55 4d 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c 61  UMN if no AS cla
fe00: 75 73 65 20 61 6e 64 20 69 73 20 64 69 72 65 63  use and is direc
fe10: 74 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  t */..#ifndef SQ
fe20: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
fe30: 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  N.  /* If this i
fe40: 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b  s an EXPLAIN, sk
fe50: 69 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a  ip this step */.
fe60: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
fe70: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74  plain ){.    ret
fe80: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
fe90: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
fea0: 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 64 62  olNamesSet || db
feb0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
fec0: 20 72 65 74 75 72 6e 3b 0a 20 20 2f 2a 20 43 6f   return;.  /* Co
fed0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 64  lumn names are d
fee0: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
fef0: 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20   left-most term 
ff00: 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
ff10: 6c 65 63 74 20 2a 2f 0a 20 20 77 68 69 6c 65 28  lect */.  while(
ff20: 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
ff30: 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65   ) pSelect = pSe
ff40: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  lect->pPrior;.  
ff50: 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50  SELECTTRACE(1,pP
ff60: 61 72 73 65 2c 70 53 65 6c 65 63 74 2c 28 22 67  arse,pSelect,("g
ff70: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6c 75 6d 6e  enerating column
ff80: 20 6e 61 6d 65 73 5c 6e 22 29 29 3b 0a 20 20 70   names\n"));.  p
ff90: 54 61 62 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  TabList = pSelec
ffa0: 74 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  t->pSrc;.  pELis
ffb0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
ffc0: 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 76  ist;.  assert( v
ffd0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
ffe0: 20 70 54 61 62 4c 69 73 74 21 3d 30 20 29 3b 0a   pTabList!=0 );.
fff0: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d    pParse->colNam
10000 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c  esSet = 1;.  ful
10010 6c 4e 61 6d 65 20 3d 20 28 64 62 2d 3e 66 6c 61  lName = (db->fla
10020 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c  gs & SQLITE_Full
10030 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20  ColNames)!=0;.  
10040 73 72 63 4e 61 6d 65 20 3d 20 28 64 62 2d 3e 66  srcName = (db->f
10050 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68  lags & SQLITE_Sh
10060 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 20  ortColNames)!=0 
10070 7c 7c 20 66 75 6c 6c 4e 61 6d 65 3b 0a 20 20 73  || fullName;.  s
10080 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
10090 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e  Cols(v, pEList->
100a0 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d  nExpr);.  for(i=
100b0 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
100c0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
100d0 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e  pr *p = pEList->
100e0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 0a 20 20 20  a[i].pExpr;..   
100f0 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
10100 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
10110 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op!=TK_AGG_COLUM
10120 4e 20 29 3b 20 20 2f 2a 20 41 67 67 20 70 72 6f  N );  /* Agg pro
10130 63 65 73 73 69 6e 67 20 68 61 73 20 6e 6f 74 20  cessing has not 
10140 72 75 6e 20 79 65 74 20 2a 2f 0a 20 20 20 20 61  run yet */.    a
10150 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b  ssert( p->op!=TK
10160 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 70 54  _COLUMN || p->pT
10170 61 62 21 3d 30 20 29 3b 20 2f 2a 20 43 6f 76 65  ab!=0 ); /* Cove
10180 72 69 6e 67 20 69 64 78 20 6e 6f 74 20 79 65 74  ring idx not yet
10190 20 63 6f 64 65 64 20 2a 2f 0a 20 20 20 20 69 66   coded */.    if
101a0 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ( pEList->a[i].z
101b0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Name ){.      /*
101c0 20 41 6e 20 41 53 20 63 6c 61 75 73 65 20 61 6c   An AS clause al
101d0 77 61 79 73 20 74 61 6b 65 73 20 66 69 72 73 74  ways takes first
101e0 20 70 72 69 6f 72 69 74 79 20 2a 2f 0a 20 20 20   priority */.   
101f0 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
10200 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
10210 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ame;.      sqlit
10220 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
10230 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
10240 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49  AME, zName, SQLI
10250 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
10260 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 72 63     }else if( src
10270 4e 61 6d 65 20 26 26 20 70 2d 3e 6f 70 3d 3d 54  Name && p->op==T
10280 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
10290 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20    char *zCol;.  
102a0 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
102b0 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
102c0 20 70 54 61 62 20 3d 20 70 2d 3e 70 54 61 62 3b   pTab = p->pTab;
102d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
102e0 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab!=0 );.      
102f0 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
10300 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
10310 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
10320 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c  Col==-1 || (iCol
10330 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
10340 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
10350 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
10360 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72         zCol = "r
10370 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c  owid";.      }el
10380 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c  se{.        zCol
10390 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
103a0 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ol].zName;.     
103b0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 66 75 6c   }.      if( ful
103c0 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  lName ){.       
103d0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
103e0 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
103f0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
10400 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54  (db, "%s.%s", pT
10410 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  ab->zName, zCol)
10420 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10430 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
10440 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
10450 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54  ME, zName, SQLIT
10460 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  E_DYNAMIC);.    
10470 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10480 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
10490 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
104a0 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c  NAME_NAME, zCol,
104b0 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
104c0 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T);.      }.    
104d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e  }else{.      con
104e0 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 4c  st char *z = pEL
104f0 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b  ist->a[i].zSpan;
10500 0a 20 20 20 20 20 20 7a 20 3d 20 7a 3d 3d 30 20  .      z = z==0 
10510 3f 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  ? sqlite3MPrintf
10520 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c  (db, "column%d",
10530 20 69 2b 31 29 20 3a 20 73 71 6c 69 74 65 33 44   i+1) : sqlite3D
10540 62 53 74 72 44 75 70 28 64 62 2c 20 7a 29 3b 0a  bStrDup(db, z);.
10550 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10560 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
10570 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
10580 7a 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  z, SQLITE_DYNAMI
10590 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  C);.    }.  }.  
105a0 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79  generateColumnTy
105b0 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  pes(pParse, pTab
105c0 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d  List, pEList);.}
105d0 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e  ../*.** Given an
105e0 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
105f0 20 28 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c   (which is reall
10600 79 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78  y the list of ex
10610 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61  pressions.** tha
10620 74 20 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c  t form the resul
10630 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43  t set of a SELEC
10640 54 20 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d  T statement) com
10650 70 75 74 65 20 61 70 70 72 6f 70 72 69 61 74 65  pute appropriate
10660 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  .** column names
10670 20 66 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61   for a table tha
10680 74 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65  t would hold the
10690 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
106a0 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75  ..**.** All colu
106b0 6d 6e 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65  mn names will be
106c0 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f   unique..**.** O
106d0 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  nly the column n
106e0 61 6d 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65  ames are compute
106f0 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65  d.  Column.zType
10700 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a  , Column.zColl,.
10710 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65  ** and other fie
10720 6c 64 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72  lds of Column ar
10730 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20  e zeroed..**.** 
10740 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
10750 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
10760 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
10770 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
10780 73 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c  s,.** store NULL
10790 20 69 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30   in *paCol and 0
107a0 20 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72   in *pnCol and r
107b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
107c0 45 4d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e  EM..**.** The on
107d0 6c 79 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  ly guarantee tha
107e0 74 20 53 51 4c 69 74 65 20 6d 61 6b 65 73 20 61  t SQLite makes a
107f0 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  bout column name
10800 73 20 69 73 20 74 68 61 74 20 69 66 20 74 68 65  s is that if the
10810 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61  .** column has a
10820 6e 20 41 53 20 63 6c 61 75 73 65 20 61 73 73 69  n AS clause assi
10830 67 6e 69 6e 67 20 69 74 20 61 20 6e 61 6d 65 2c  gning it a name,
10840 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 74 68   that will be th
10850 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a 2a 2a 20  e name used..** 
10860 54 68 61 74 20 69 73 20 74 68 65 20 6f 6e 6c 79  That is the only
10870 20 64 6f 63 75 6d 65 6e 74 65 64 20 67 75 61 72   documented guar
10880 61 6e 74 65 65 2e 20 20 48 6f 77 65 76 65 72 2c  antee.  However,
10890 20 63 6f 75 6e 74 6c 65 73 73 20 61 70 70 6c 69   countless appli
108a0 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c  cations.** devel
108b0 6f 70 65 64 20 6f 76 65 72 20 74 68 65 20 79 65  oped over the ye
108c0 61 72 73 20 68 61 76 65 20 6d 61 64 65 20 62 61  ars have made ba
108d0 73 65 6c 65 73 73 20 61 73 73 75 6d 70 74 69 6f  seless assumptio
108e0 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20  ns about column 
108f0 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20 77 69 6c  names.** and wil
10900 6c 20 62 72 65 61 6b 20 69 66 20 74 68 6f 73 65  l break if those
10910 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 63 68 61   assumptions cha
10920 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c 20 75 73  nges.  Hence, us
10930 65 20 65 78 74 72 65 6d 65 20 63 61 75 74 69 6f  e extreme cautio
10940 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64 69 66 79  n.** when modify
10950 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
10960 20 74 6f 20 61 76 6f 69 64 20 62 72 65 61 6b 69   to avoid breaki
10970 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a  ng legacy..**.**
10980 20 53 65 65 20 41 6c 73 6f 3a 20 67 65 6e 65 72   See Also: gener
10990 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29  ateColumnNames()
109a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
109b0 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
109c0 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
109d0 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
109e0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
109f0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
10a00 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  pEList,       /*
10a10 20 45 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20   Expr list from 
10a20 77 68 69 63 68 20 74 6f 20 64 65 72 69 76 65 20  which to derive 
10a30 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
10a40 20 20 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20    i16 *pnCol,   
10a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
10a60 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
10a70 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f   columns here */
10a80 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f  .  Column **paCo
10a90 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  l          /* Wr
10aa0 69 74 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75  ite the new colu
10ab0 6d 6e 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a  mn list here */.
10ac0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
10ad0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
10ae0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
10af0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
10b00 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
10b10 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
10b20 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 75   counters */.  u
10b30 33 32 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20  32 cnt;         
10b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
10b50 64 65 78 20 61 64 64 65 64 20 74 6f 20 6d 61 6b  dex added to mak
10b60 65 20 74 68 65 20 6e 61 6d 65 20 75 6e 69 71 75  e the name uniqu
10b70 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61  e */.  Column *a
10b80 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20  Col, *pCol;     
10b90 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
10ba0 67 20 6f 76 65 72 20 72 65 73 75 6c 74 20 63 6f  g over result co
10bb0 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  lumns */.  int n
10bc0 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
10bd0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
10be0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
10bf0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
10c00 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20  .  char *zName; 
10c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10c20 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  * Column name */
10c30 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20  .  int nName;   
10c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10c50 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69  * Size of name i
10c60 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 20 20 48  n zName[] */.  H
10c70 61 73 68 20 68 74 3b 20 20 20 20 20 20 20 20 20  ash ht;         
10c80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
10c90 73 68 20 74 61 62 6c 65 20 6f 66 20 63 6f 6c 75  sh table of colu
10ca0 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 73  mn names */..  s
10cb0 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26  qlite3HashInit(&
10cc0 68 74 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  ht);.  if( pELis
10cd0 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  t ){.    nCol = 
10ce0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
10cf0 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65     aCol = sqlite
10d00 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
10d10 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d  , sizeof(aCol[0]
10d20 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73  )*nCol);.    tes
10d30 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29  tcase( aCol==0 )
10d40 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e 33  ;.    if( nCol>3
10d50 32 37 36 37 20 29 20 6e 43 6f 6c 20 3d 20 33 32  2767 ) nCol = 32
10d60 37 36 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  767;.  }else{.  
10d70 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20    nCol = 0;.    
10d80 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  aCol = 0;.  }.  
10d90 61 73 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 28 69  assert( nCol==(i
10da0 31 36 29 6e 43 6f 6c 20 29 3b 0a 20 20 2a 70 6e  16)nCol );.  *pn
10db0 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70  Col = nCol;.  *p
10dc0 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20  aCol = aCol;..  
10dd0 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43  for(i=0, pCol=aC
10de0 6f 6c 3b 20 69 3c 6e 43 6f 6c 20 26 26 20 21 64  ol; i<nCol && !d
10df0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b  b->mallocFailed;
10e00 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
10e10 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70     /* Get an app
10e20 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f  ropriate name fo
10e30 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20  r the column.   
10e40 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 7a 4e 61   */.    if( (zNa
10e50 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  me = pEList->a[i
10e60 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  ].zName)!=0 ){. 
10e70 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63       /* If the c
10e80 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61  olumn contains a
10e90 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68  n "AS <name>" ph
10ea0 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e  rase, use <name>
10eb0 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a   as the name */.
10ec0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10ed0 20 45 78 70 72 20 2a 70 43 6f 6c 45 78 70 72 20   Expr *pColExpr 
10ee0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
10ef0 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69 73 74 2d  pCollate(pEList-
10f00 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
10f10 20 20 20 20 77 68 69 6c 65 28 20 70 43 6f 6c 45      while( pColE
10f20 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20  xpr->op==TK_DOT 
10f30 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 45  ){.        pColE
10f40 78 70 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e  xpr = pColExpr->
10f50 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
10f60 61 73 73 65 72 74 28 20 70 43 6f 6c 45 78 70 72  assert( pColExpr
10f70 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  !=0 );.      }. 
10f80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f       assert( pCo
10f90 6c 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47  lExpr->op!=TK_AG
10fa0 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  G_COLUMN );.    
10fb0 20 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e    if( pColExpr->
10fc0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
10fd0 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  .        /* For 
10fe0 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20  columns use the 
10ff0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65  column name name
11000 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
11010 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d  iCol = pColExpr-
11020 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
11030 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
11040 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62 3b 0a  pColExpr->pTab;.
11050 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
11060 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20  pTab!=0 );.     
11070 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
11080 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
11090 65 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  ey;.        zNam
110a0 65 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54  e = iCol>=0 ? pT
110b0 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
110c0 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22 3b 0a  Name : "rowid";.
110d0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
110e0 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
110f0 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _ID ){.        a
11100 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
11110 72 6f 70 65 72 74 79 28 70 43 6f 6c 45 78 70 72  roperty(pColExpr
11120 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
11130 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
11140 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54  = pColExpr->u.zT
11150 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73  oken;.      }els
11160 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73  e{.        /* Us
11170 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74  e the original t
11180 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ext of the colum
11190 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20  n expression as 
111a0 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  its name */.    
111b0 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69      zName = pELi
111c0 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a  st->a[i].zSpan;.
111d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
111e0 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
111f0 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
11200 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
11210 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
11220 73 65 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20  se{.      zName 
11230 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
11240 28 64 62 2c 22 63 6f 6c 75 6d 6e 25 64 22 2c 69  (db,"column%d",i
11250 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  +1);.    }..    
11260 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
11270 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
11280 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65 20  unique.  If the 
11290 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71  name is not uniq
112a0 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e  ue,.    ** appen
112b0 64 20 61 6e 20 69 6e 74 65 67 65 72 20 74 6f 20  d an integer to 
112c0 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74  the name so that
112d0 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71   it becomes uniq
112e0 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ue..    */.    c
112f0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  nt = 0;.    whil
11300 65 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69  e( zName && sqli
11310 74 65 33 48 61 73 68 46 69 6e 64 28 26 68 74 2c  te3HashFind(&ht,
11320 20 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20   zName)!=0 ){.  
11330 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69      nName = sqli
11340 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
11350 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e  e);.      if( nN
11360 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ame>0 ){.       
11370 20 66 6f 72 28 6a 3d 6e 4e 61 6d 65 2d 31 3b 20   for(j=nName-1; 
11380 6a 3e 30 20 26 26 20 73 71 6c 69 74 65 33 49 73  j>0 && sqlite3Is
11390 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6a 5d 29 3b  digit(zName[j]);
113a0 20 6a 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20   j--){}.        
113b0 69 66 28 20 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a  if( zName[j]==':
113c0 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6a 3b 0a 20  ' ) nName = j;. 
113d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4e 61       }.      zNa
113e0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
113f0 6e 74 66 28 64 62 2c 20 22 25 2e 2a 7a 3a 25 75  ntf(db, "%.*z:%u
11400 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  ", nName, zName,
11410 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 69   ++cnt);.      i
11420 66 28 20 63 6e 74 3e 33 20 29 20 73 71 6c 69 74  f( cnt>3 ) sqlit
11430 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
11440 7a 65 6f 66 28 63 6e 74 29 2c 20 26 63 6e 74 29  zeof(cnt), &cnt)
11450 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c  ;.    }.    pCol
11460 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
11470 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  .    sqlite3Colu
11480 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d  mnPropertiesFrom
11490 4e 61 6d 65 28 30 2c 20 70 43 6f 6c 29 3b 0a 20  Name(0, pCol);. 
114a0 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 26 26 20     if( zName && 
114b0 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
114c0 74 28 26 68 74 2c 20 7a 4e 61 6d 65 2c 20 70 43  t(&ht, zName, pC
114d0 6f 6c 29 3d 3d 70 43 6f 6c 20 29 7b 0a 20 20 20  ol)==pCol ){.   
114e0 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
114f0 6c 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  lt(db);.    }.  
11500 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43  }.  sqlite3HashC
11510 6c 65 61 72 28 26 68 74 29 3b 0a 20 20 69 66 28  lear(&ht);.  if(
11520 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
11530 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  d ){.    for(j=0
11540 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<i; j++){.   
11550 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
11560 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  (db, aCol[j].zNa
11570 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  me);.    }.    s
11580 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
11590 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43   aCol);.    *paC
115a0 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43  ol = 0;.    *pnC
115b0 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  ol = 0;.    retu
115c0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
115d0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
115e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
115f0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20  ./*.** Add type 
11600 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e  and collation in
11610 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63  formation to a c
11620 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64  olumn list based
11630 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20   on.** a SELECT 
11640 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a  statement..** .*
11650 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  * The column lis
11660 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d  t presumably cam
11670 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c  e from selectCol
11680 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72  umnNamesFromExpr
11690 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63  List()..** The c
116a0 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f  olumn list has o
116b0 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74  nly names, not t
116c0 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f  ypes or collatio
116d0 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  ns.  This.** rou
116e0 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67  tine goes throug
116f0 68 20 61 6e 64 20 61 64 64 73 20 74 68 65 20 74  h and adds the t
11700 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69  ypes and collati
11710 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
11720 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65 73  routine requires
11730 20 74 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69   that all identi
11740 66 69 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c  fiers in the SEL
11750 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ECT.** statement
11760 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f   be resolved..*/
11770 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
11780 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
11790 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20  AndCollation(.  
117a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
117b0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
117c0 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54   contexts */.  T
117d0 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
117e0 20 20 20 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75       /* Add colu
117f0 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d 61 74  mn type informat
11800 69 6f 6e 20 74 6f 20 74 68 69 73 20 74 61 62 6c  ion to this tabl
11810 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
11820 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20  Select       /* 
11830 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64  SELECT used to d
11840 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61  etermine types a
11850 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f  nd collations */
11860 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
11870 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
11880 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
11890 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  C;.  Column *pCo
118a0 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  l;.  CollSeq *pC
118b0 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  oll;.  int i;.  
118c0 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63  Expr *p;.  struc
118d0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
118e0 2a 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *a;..  assert( p
118f0 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61  Select!=0 );.  a
11900 73 73 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d  ssert( (pSelect-
11910 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
11920 65 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20  esolved)!=0 );. 
11930 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
11940 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45  Col==pSelect->pE
11950 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64  List->nExpr || d
11960 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
11970 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
11980 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
11990 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e  rn;.  memset(&sN
119a0 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
119b0 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  ));.  sNC.pSrcLi
119c0 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53  st = pSelect->pS
119d0 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63  rc;.  a = pSelec
119e0 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20  t->pEList->a;.  
119f0 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54  for(i=0, pCol=pT
11a00 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62  ab->aCol; i<pTab
11a10 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
11a20 6c 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  l++){.    const 
11a30 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20  char *zType;.   
11a40 20 69 6e 74 20 6e 2c 20 6d 3b 0a 20 20 20 20 70   int n, m;.    p
11a50 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20   = a[i].pExpr;. 
11a60 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
11a70 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30  nType(&sNC, p, 0
11a80 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20  , 0, 0);.    /* 
11a90 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20 2e 2e  pCol->szEst = ..
11aa0 2e 20 2f 2f 20 43 6f 6c 75 6d 6e 20 73 69 7a 65  . // Column size
11ab0 20 65 73 74 20 66 6f 72 20 53 45 4c 45 43 54 20   est for SELECT 
11ac0 74 61 62 6c 65 73 20 6e 65 76 65 72 20 75 73 65  tables never use
11ad0 64 20 2a 2f 0a 20 20 20 20 70 43 6f 6c 2d 3e 61  d */.    pCol->a
11ae0 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
11af0 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29  3ExprAffinity(p)
11b00 3b 0a 20 20 20 20 69 66 28 20 7a 54 79 70 65 20  ;.    if( zType 
11b10 29 7b 0a 20 20 20 20 20 20 6d 20 3d 20 73 71 6c  ){.      m = sql
11b20 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79  ite3Strlen30(zTy
11b30 70 65 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73  pe);.      n = s
11b40 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
11b50 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
11b60 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d     pCol->zName =
11b70 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
11b80 63 4f 72 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  cOrFree(db, pCol
11b90 2d 3e 7a 4e 61 6d 65 2c 20 6e 2b 6d 2b 32 29 3b  ->zName, n+m+2);
11ba0 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d  .      if( pCol-
11bb0 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  >zName ){.      
11bc0 20 20 6d 65 6d 63 70 79 28 26 70 43 6f 6c 2d 3e    memcpy(&pCol->
11bd0 7a 4e 61 6d 65 5b 6e 2b 31 5d 2c 20 7a 54 79 70  zName[n+1], zTyp
11be0 65 2c 20 6d 2b 31 29 3b 0a 20 20 20 20 20 20 20  e, m+1);.       
11bf0 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
11c00 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 41 53 54 59  |= COLFLAG_HASTY
11c10 50 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PE;.      }.    
11c20 7d 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e  }.    if( pCol->
11c30 61 66 66 69 6e 69 74 79 3d 3d 30 20 29 20 70 43  affinity==0 ) pC
11c40 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53  ol->affinity = S
11c50 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a  QLITE_AFF_BLOB;.
11c60 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
11c70 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
11c80 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69  Parse, p);.    i
11c90 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c  f( pColl && pCol
11ca0 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20  ->zColl==0 ){.  
11cb0 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20      pCol->zColl 
11cc0 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
11cd0 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  p(db, pColl->zNa
11ce0 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
11cf0 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20   pTab->szTabRow 
11d00 3d 20 31 3b 20 2f 2a 20 41 6e 79 20 6e 6f 6e 2d  = 1; /* Any non-
11d10 7a 65 72 6f 20 76 61 6c 75 65 20 77 6f 72 6b 73  zero value works
11d20 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   */.}../*.** Giv
11d30 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  en a SELECT stat
11d40 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20  ement, generate 
11d50 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
11d60 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
11d70 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
11d80 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43  et of that SELEC
11d90 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  T..*/.Table *sql
11da0 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
11db0 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
11dc0 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
11dd0 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  lect){.  Table *
11de0 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20  pTab;.  sqlite3 
11df0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
11e00 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c 61  ;.  int savedFla
11e10 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61 67  gs;..  savedFlag
11e20 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20  s = db->flags;. 
11e30 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
11e40 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
11e50 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  es;.  db->flags 
11e60 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43  |= SQLITE_ShortC
11e70 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74  olNames;.  sqlit
11e80 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
11e90 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29  rse, pSelect, 0)
11ea0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
11eb0 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b  nErr ) return 0;
11ec0 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63  .  while( pSelec
11ed0 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c  t->pPrior ) pSel
11ee0 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ect = pSelect->p
11ef0 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c 61  Prior;.  db->fla
11f00 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b  gs = savedFlags;
11f10 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
11f20 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
11f30 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20  , sizeof(Table) 
11f40 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  );.  if( pTab==0
11f50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
11f60 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73  ;.  }.  /* The s
11f70 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
11f80 66 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e 6c  fSelect() is onl
11f90 79 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78 74  y used n context
11fa0 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69 64  s where lookasid
11fb0 65 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c  e.  ** is disabl
11fc0 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ed */.  assert( 
11fd0 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44  db->lookaside.bD
11fe0 69 73 61 62 6c 65 20 29 3b 0a 20 20 70 54 61 62  isable );.  pTab
11ff0 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20  ->nTabRef = 1;. 
12000 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30   pTab->zName = 0
12010 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  ;.  pTab->nRowLo
12020 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65  gEst = 200; asse
12030 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33  rt( 200==sqlite3
12040 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20  LogEst(1048576) 
12050 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  );.  sqlite3Colu
12060 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
12070 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d  pParse, pSelect-
12080 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e  >pEList, &pTab->
12090 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f  nCol, &pTab->aCo
120a0 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  l);.  sqlite3Sel
120b0 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
120c0 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61  AndCollation(pPa
120d0 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 65  rse, pTab, pSele
120e0 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b  ct);.  pTab->iPK
120f0 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64  ey = -1;.  if( d
12100 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
12110 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
12120 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54  leteTable(db, pT
12130 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ab);.    return 
12140 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
12150 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  pTab;.}../*.** G
12160 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74 68  et a VDBE for th
12170 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20 63  e given parser c
12180 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65 20  ontext.  Create 
12190 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
121a0 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e  essary..** If an
121b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
121c0 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c  eturn NULL and l
121d0 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20 69  eave a message i
121e0 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62  n pParse..*/.Vdb
121f0 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62  e *sqlite3GetVdb
12200 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
12210 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
12220 70 56 64 62 65 20 29 7b 0a 20 20 20 20 72 65 74  pVdbe ){.    ret
12230 75 72 6e 20 70 50 61 72 73 65 2d 3e 70 56 64 62  urn pParse->pVdb
12240 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  e;.  }.  if( pPa
12250 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d  rse->pToplevel==
12260 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61  0.   && Optimiza
12270 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61 72  tionEnabled(pPar
12280 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 46 61  se->db,SQLITE_Fa
12290 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29 0a 20 20  ctorOutConst).  
122a0 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6f  ){.    pParse->o
122b0 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d 20 31  kConstFactor = 1
122c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
122d0 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65  qlite3VdbeCreate
122e0 28 70 50 61 72 73 65 29 3b 0a 7d 0a 0a 0a 2f 2a  (pParse);.}.../*
122f0 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
12300 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
12310 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  et fields of the
12320 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e   SELECT based on
12330 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 65   the.** pLimit e
12340 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69  xpressions.  pLi
12350 6d 69 74 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70  mit->pLeft and p
12360 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 20 68 6f  Limit->pRight ho
12370 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ld the expressio
12380 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61  ns.** that appea
12390 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  r in the origina
123a0 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  l SQL statement 
123b0 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20  after the LIMIT 
123c0 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65  and OFFSET.** ke
123d0 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c  ywords.  Or NULL
123e0 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72   if those keywor
123f0 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20  ds are omitted. 
12400 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
12410 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69  et .** are the i
12420 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65  nteger memory re
12430 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66  gister numbers f
12440 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  or counters used
12450 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20   to compute .** 
12460 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66  the limit and of
12470 66 73 65 74 2e 20 20 49 66 20 74 68 65 72 65 20  fset.  If there 
12480 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f  is no limit and/
12490 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20  or offset, then 
124a0 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  .** iLimit and i
124b0 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67 61 74  Offset are negat
124c0 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ive..**.** This 
124d0 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20  routine changes 
124e0 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c  the values of iL
124f0 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
12500 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69   only if.** a li
12510 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73  mit or offset is
12520 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d   defined by pLim
12530 69 74 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4c  it->pLeft and pL
12540 69 6d 69 74 2d 3e 70 52 69 67 68 74 2e 20 20 69  imit->pRight.  i
12550 4c 69 6d 69 74 0a 2a 2a 20 61 6e 64 20 69 4f 66  Limit.** and iOf
12560 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65  fset should have
12570 20 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20   been preset to 
12580 61 70 70 72 6f 70 72 69 61 74 65 20 64 65 66 61  appropriate defa
12590 75 6c 74 20 76 61 6c 75 65 73 20 28 7a 65 72 6f  ult values (zero
125a0 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61  ).** prior to ca
125b0 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
125c0 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 4f  ne..**.** The iO
125d0 66 66 73 65 74 20 72 65 67 69 73 74 65 72 20 28  ffset register (
125e0 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73  if it exists) is
125f0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
12600 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  the value.** of 
12610 74 68 65 20 4f 46 46 53 45 54 2e 20 20 54 68 65  the OFFSET.  The
12620 20 69 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72   iLimit register
12630 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
12640 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67 69 73  to LIMIT.  Regis
12650 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74 2b 31  ter.** iOffset+1
12660 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
12670 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e  to LIMIT+OFFSET.
12680 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70  .**.** Only if p
12690 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 21 3d 30 20  Limit->pLeft!=0 
126a0 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67  do the limit reg
126b0 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65  isters get.** re
126c0 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e  defined.  The UN
126d0 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
126e0 20 75 73 65 73 20 74 68 69 73 20 70 72 6f 70 65   uses this prope
126f0 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20  rty to force.** 
12700 74 68 65 20 72 65 75 73 65 20 6f 66 20 74 68 65  the reuse of the
12710 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20   same limit and 
12720 6f 66 66 73 65 74 20 72 65 67 69 73 74 65 72 73  offset registers
12730 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65   across multiple
12740 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
12750 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ments..*/.static
12760 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d   void computeLim
12770 69 74 52 65 67 69 73 74 65 72 73 28 50 61 72 73  itRegisters(Pars
12780 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
12790 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65 61 6b  t *p, int iBreak
127a0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 30  ){.  Vdbe *v = 0
127b0 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d  ;.  int iLimit =
127c0 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65   0;.  int iOffse
127d0 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 45 78  t;.  int n;.  Ex
127e0 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e  pr *pLimit = p->
127f0 70 4c 69 6d 69 74 3b 0a 0a 20 20 69 66 28 20 70  pLimit;..  if( p
12800 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->iLimit ) retur
12810 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22  n;..  /* .  ** "
12820 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73  LIMIT -1" always
12830 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e   shows all rows.
12840 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a    There is some.
12850 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65 72 73 79    ** controversy
12860 20 61 62 6f 75 74 20 77 68 61 74 20 74 68 65 20   about what the 
12870 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72  correct behavior
12880 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a   should be..  **
12890 20 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   The current imp
128a0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65  lementation inte
128b0 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22  rprets "LIMIT 0"
128c0 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f   to mean.  ** no
128d0 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71   rows..  */.  sq
128e0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
128f0 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 69  ear(pParse);.  i
12900 66 28 20 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  f( pLimit ){.   
12910 20 61 73 73 65 72 74 28 20 70 4c 69 6d 69 74 2d   assert( pLimit-
12920 3e 6f 70 3d 3d 54 4b 5f 4c 49 4d 49 54 20 29 3b  >op==TK_LIMIT );
12930 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
12940 6d 69 74 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b  mit->pLeft!=0 );
12950 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  .    p->iLimit =
12960 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72   iLimit = ++pPar
12970 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20  se->nMem;.    v 
12980 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
12990 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 61 73  (pParse);.    as
129a0 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
129b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
129c0 72 49 73 49 6e 74 65 67 65 72 28 70 4c 69 6d 69  rIsInteger(pLimi
129d0 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 29 20 29 7b  t->pLeft, &n) ){
129e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
129f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
12a00 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69  nteger, n, iLimi
12a10 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
12a20 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
12a30 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
12a40 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20     if( n==0 ){. 
12a50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
12a60 62 65 47 6f 74 6f 28 76 2c 20 69 42 72 65 61 6b  beGoto(v, iBreak
12a70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
12a80 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d 3e 6e 53  f( n>=0 && p->nS
12a90 65 6c 65 63 74 52 6f 77 3e 73 71 6c 69 74 65 33  electRow>sqlite3
12aa0 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 29 20 29  LogEst((u64)n) )
12ab0 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65  {.        p->nSe
12ac0 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  lectRow = sqlite
12ad0 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 29 3b  3LogEst((u64)n);
12ae0 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46  .        p->selF
12af0 6c 61 67 73 20 7c 3d 20 53 46 5f 46 69 78 65 64  lags |= SF_Fixed
12b00 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Limit;.      }. 
12b10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12b20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
12b30 70 50 61 72 73 65 2c 20 70 4c 69 6d 69 74 2d 3e  pParse, pLimit->
12b40 70 4c 65 66 74 2c 20 69 4c 69 6d 69 74 29 3b 0a  pLeft, iLimit);.
12b50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12b60 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75  eAddOp1(v, OP_Mu
12b70 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29  stBeInt, iLimit)
12b80 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
12b90 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
12ba0 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20  ment((v, "LIMIT 
12bb0 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
12bc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12bd0 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op2(v, OP_IfNot,
12be0 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29   iLimit, iBreak)
12bf0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
12c00 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
12c10 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 20   pLimit->pRight 
12c20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  ){.      p->iOff
12c30 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d 20  set = iOffset = 
12c40 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
12c50 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
12c60 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63  em++;   /* Alloc
12c70 61 74 65 20 61 6e 20 65 78 74 72 61 20 72 65 67  ate an extra reg
12c80 69 73 74 65 72 20 66 6f 72 20 6c 69 6d 69 74 2b  ister for limit+
12c90 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20  offset */.      
12ca0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
12cb0 70 50 61 72 73 65 2c 20 70 4c 69 6d 69 74 2d 3e  pParse, pLimit->
12cc0 70 52 69 67 68 74 2c 20 69 4f 66 66 73 65 74 29  pRight, iOffset)
12cd0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
12ce0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
12cf0 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73  MustBeInt, iOffs
12d00 65 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  et); VdbeCoverag
12d10 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
12d20 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46  Comment((v, "OFF
12d30 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  SET counter"));.
12d40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12d50 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66  eAddOp3(v, OP_Of
12d60 66 73 65 74 4c 69 6d 69 74 2c 20 69 4c 69 6d 69  fsetLimit, iLimi
12d70 74 2c 20 69 4f 66 66 73 65 74 2b 31 2c 20 69 4f  t, iOffset+1, iO
12d80 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64  ffset);.      Vd
12d90 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
12da0 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a  IMIT+OFFSET"));.
12db0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66      }.  }.}..#if
12dc0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12dd0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
12de0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
12df0 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f  e appropriate co
12e00 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
12e10 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68   for the iCol-th
12e20 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68   column of.** th
12e30 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72  e result set for
12e40 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65   the compound-se
12e50 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22  lect statement "
12e60 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  p".  Return NULL
12e70 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   if.** the colum
12e80 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74  n has no default
12e90 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
12ea0 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  nce..**.** The c
12eb0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
12ec0 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75  e for the compou
12ed0 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b  nd select is tak
12ee0 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c  en from the.** l
12ef0 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66  eft-most term of
12f00 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74   the select that
12f10 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
12f20 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74   sequence..*/.st
12f30 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75  atic CollSeq *mu
12f40 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
12f50 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
12f60 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
12f70 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  Col){.  CollSeq 
12f80 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e  *pRet;.  if( p->
12f90 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52  pPrior ){.    pR
12fa0 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  et = multiSelect
12fb0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
12fc0 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29  p->pPrior, iCol)
12fd0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
12fe0 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  Ret = 0;.  }.  a
12ff0 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29  ssert( iCol>=0 )
13000 3b 0a 20 20 2f 2a 20 69 43 6f 6c 20 6d 75 73 74  ;.  /* iCol must
13010 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 70 2d   be less than p-
13020 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2e 20  >pEList->nExpr. 
13030 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72   Otherwise an er
13040 72 6f 72 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 68  ror would.  ** h
13050 61 76 65 20 62 65 65 6e 20 74 68 72 6f 77 6e 20  ave been thrown 
13060 64 75 72 69 6e 67 20 6e 61 6d 65 20 72 65 73 6f  during name reso
13070 6c 75 74 69 6f 6e 20 61 6e 64 20 77 65 20 77 6f  lution and we wo
13080 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 67 6f 74  uld not have got
13090 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20 66 61  ten.  ** this fa
130a0 72 20 2a 2f 0a 20 20 69 66 28 20 70 52 65 74 3d  r */.  if( pRet=
130b0 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69 43 6f  =0 && ALWAYS(iCo
130c0 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  l<p->pEList->nEx
130d0 70 72 29 20 29 7b 0a 20 20 20 20 70 52 65 74 20  pr) ){.    pRet 
130e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
130f0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
13100 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
13110 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65  pExpr);.  }.  re
13120 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
13130 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73  .** The select s
13140 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
13150 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  as the second pa
13160 72 61 6d 65 74 65 72 20 69 73 20 61 20 63 6f 6d  rameter is a com
13170 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a 2a 2a 20  pound SELECT.** 
13180 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  with an ORDER BY
13190 20 63 6c 61 75 73 65 2e 20 54 68 69 73 20 66 75   clause. This fu
131a0 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73  nction allocates
131b0 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 4b   and returns a K
131c0 65 79 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74  eyInfo.** struct
131d0 75 72 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ure suitable for
131e0 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
131f0 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2a 0a 2a  e ORDER BY..**.*
13200 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
13210 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
13220 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e 65  cture is obtaine
13230 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 54  d from malloc. T
13240 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
13250 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e  nction is respon
13260 73 69 62 6c 65 20 66 6f 72 20 65 6e 73 75 72 69  sible for ensuri
13270 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72  ng that this str
13280 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75  ucture is eventu
13290 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a  ally.** freed..*
132a0 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f  /.static KeyInfo
132b0 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64   *multiSelectOrd
132c0 65 72 42 79 4b 65 79 49 6e 66 6f 28 50 61 72 73  erByKeyInfo(Pars
132d0 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
132e0 74 20 2a 70 2c 20 69 6e 74 20 6e 45 78 74 72 61  t *p, int nExtra
132f0 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
13300 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
13310 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e 4f 72  derBy;.  int nOr
13320 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
13330 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 71  rBy->nExpr;.  sq
13340 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
13350 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79 49 6e 66  se->db;.  KeyInf
13360 6f 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65  o *pRet = sqlite
13370 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
13380 2c 20 6e 4f 72 64 65 72 42 79 2b 6e 45 78 74 72  , nOrderBy+nExtr
13390 61 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 52 65  a, 1);.  if( pRe
133a0 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ){.    int i;.
133b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
133c0 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
133d0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
133e0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
133f0 20 3d 20 26 70 4f 72 64 65 72 42 79 2d 3e 61 5b   = &pOrderBy->a[
13400 69 5d 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  i];.      Expr *
13410 70 54 65 72 6d 20 3d 20 70 49 74 65 6d 2d 3e 70  pTerm = pItem->p
13420 45 78 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c 6c  Expr;.      Coll
13430 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 20  Seq *pColl;..   
13440 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c     if( pTerm->fl
13450 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
13460 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
13470 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
13480 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
13490 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Term);.      }el
134a0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  se{.        pCol
134b0 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  l = multiSelectC
134c0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
134d0 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  , pItem->u.x.iOr
134e0 64 65 72 42 79 43 6f 6c 2d 31 29 3b 0a 20 20 20  derByCol-1);.   
134f0 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d       if( pColl==
13500 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  0 ) pColl = db->
13510 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
13520 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69     pOrderBy->a[i
13530 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20 20 20 20  ].pExpr =.      
13540 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
13550 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28  ddCollateString(
13560 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
13570 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
13580 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
13590 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
135a0 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 52  foIsWriteable(pR
135b0 65 74 29 20 29 3b 0a 20 20 20 20 20 20 70 52 65  et) );.      pRe
135c0 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43  t->aColl[i] = pC
135d0 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 52 65 74 2d  oll;.      pRet-
135e0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
135f0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
13600 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d  sortOrder;.    }
13610 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
13620 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  Ret;.}..#ifndef 
13630 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
13640 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
13650 6e 65 20 67 65 6e 65 72 61 74 65 73 20 56 44 42  ne generates VDB
13660 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74  E code to comput
13670 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
13680 20 61 20 57 49 54 48 20 52 45 43 55 52 53 49 56   a WITH RECURSIV
13690 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74 68  E.** query of th
136a0 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
136b0 3c 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65  <recursive-table
136c0 3e 20 41 53 20 28 3c 73 65 74 75 70 2d 71 75 65  > AS (<setup-que
136d0 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20  ry> UNION [ALL] 
136e0 3c 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79  <recursive-query
136f0 3e 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  >).**           
13700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f                \_
13710 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
13720 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
13730 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20  ________/.**    
13740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13750 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
13760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13770 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a        p.**.**.**
13780 20 54 68 65 72 65 20 69 73 20 65 78 61 63 74 6c   There is exactl
13790 79 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20  y one reference 
137a0 74 6f 20 74 68 65 20 72 65 63 75 72 73 69 76 65  to the recursive
137b0 2d 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52  -table in the FR
137c0 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 6f 66 20  OM clause.** of 
137d0 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 2c  recursive-query,
137e0 20 6d 61 72 6b 65 64 20 77 69 74 68 20 74 68 65   marked with the
137f0 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d 2e 66 67   SrcList->a[].fg
13800 2e 69 73 52 65 63 75 72 73 69 76 65 20 66 6c 61  .isRecursive fla
13810 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 74  g..**.** The set
13820 75 70 2d 71 75 65 72 79 20 72 75 6e 73 20 6f 6e  up-query runs on
13830 63 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ce to generate a
13840 6e 20 69 6e 69 74 69 61 6c 20 73 65 74 20 6f 66  n initial set of
13850 20 72 6f 77 73 20 74 68 61 74 20 67 6f 0a 2a 2a   rows that go.**
13860 20 69 6e 74 6f 20 61 20 51 75 65 75 65 20 74 61   into a Queue ta
13870 62 6c 65 2e 20 20 52 6f 77 73 20 61 72 65 20 65  ble.  Rows are e
13880 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
13890 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 6f 6e  e Queue table on
138a0 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45 61  e by.** one.  Ea
138b0 63 68 20 72 6f 77 20 65 78 74 72 61 63 74 65 64  ch row extracted
138c0 20 66 72 6f 6d 20 51 75 65 75 65 20 69 73 20 6f   from Queue is o
138d0 75 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20  utput to pDest. 
138e0 20 54 68 65 6e 20 74 68 65 20 73 69 6e 67 6c 65   Then the single
138f0 0a 2a 2a 20 65 78 74 72 61 63 74 65 64 20 72 6f  .** extracted ro
13900 77 20 28 6e 6f 77 20 69 6e 20 74 68 65 20 69 43  w (now in the iC
13910 75 72 72 65 6e 74 20 74 61 62 6c 65 29 20 62 65  urrent table) be
13920 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e 74 65 6e  comes the conten
13930 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63 75  t of the.** recu
13940 72 73 69 76 65 2d 74 61 62 6c 65 20 66 6f 72 20  rsive-table for 
13950 61 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72  a recursive-quer
13960 79 20 72 75 6e 2e 20 20 54 68 65 20 6f 75 74 70  y run.  The outp
13970 75 74 20 6f 66 20 74 68 65 20 72 65 63 75 72 73  ut of the recurs
13980 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20 69 73 20  ive-query.** is 
13990 61 64 64 65 64 20 62 61 63 6b 20 69 6e 74 6f 20  added back into 
139a0 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e  the Queue table.
139b0 20 20 54 68 65 6e 20 61 6e 6f 74 68 65 72 20 72    Then another r
139c0 6f 77 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ow is extracted 
139d0 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a 20 61 6e  from Queue.** an
139e0 64 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20  d the iteration 
139f0 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74 69 6c 20  continues until 
13a00 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
13a10 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20  is empty..**.** 
13a20 49 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  If the compound 
13a30 71 75 65 72 79 20 6f 70 65 72 61 74 6f 72 20 69  query operator i
13a40 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f 20  s UNION then no 
13a50 64 75 70 6c 69 63 61 74 65 20 72 6f 77 73 20 61  duplicate rows a
13a60 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e 73 65 72  re ever.** inser
13a70 74 65 64 20 69 6e 74 6f 20 74 68 65 20 51 75 65  ted into the Que
13a80 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 69  ue table.  The i
13a90 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6b  Distinct table k
13aa0 65 65 70 73 20 61 20 63 6f 70 79 20 6f 66 20 61  eeps a copy of a
13ab0 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68 61 74 20  ll rows.** that 
13ac0 68 61 76 65 20 65 76 65 72 20 62 65 65 6e 20 69  have ever been i
13ad0 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 51 75 65  nserted into Que
13ae0 75 65 20 61 6e 64 20 63 61 75 73 65 73 20 64 75  ue and causes du
13af0 70 6c 69 63 61 74 65 73 20 74 6f 20 62 65 0a 2a  plicates to be.*
13b00 2a 20 64 69 73 63 61 72 64 65 64 2e 20 20 49 66  * discarded.  If
13b10 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73   the operator is
13b20 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74 68 65 6e   UNION ALL, then
13b30 20 64 75 70 6c 69 63 61 74 65 73 20 61 72 65 20   duplicates are 
13b40 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a 20  allowed..** .** 
13b50 49 66 20 74 68 65 20 71 75 65 72 79 20 68 61 73  If the query has
13b60 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68   an ORDER BY, th
13b70 65 6e 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  en entries in th
13b80 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 61 72  e Queue table ar
13b90 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20 4f 52 44  e kept in.** ORD
13ba0 45 52 20 42 59 20 6f 72 64 65 72 20 61 6e 64 20  ER BY order and 
13bb0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
13bc0 69 73 20 65 78 74 72 61 63 74 65 64 20 66 6f 72  is extracted for
13bd0 20 65 61 63 68 20 63 79 63 6c 65 2e 20 20 57 69   each cycle.  Wi
13be0 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f 52 44 45  thout.** an ORDE
13bf0 52 20 42 59 2c 20 74 68 65 20 51 75 65 75 65 20  R BY, the Queue 
13c00 74 61 62 6c 65 20 69 73 20 6a 75 73 74 20 61 20  table is just a 
13c10 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  FIFO..**.** If a
13c20 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 69 73   LIMIT clause is
13c30 20 70 72 6f 76 69 64 65 64 2c 20 74 68 65 6e 20   provided, then 
13c40 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20 73 74  the iteration st
13c50 6f 70 73 20 61 66 74 65 72 20 4c 49 4d 49 54 20  ops after LIMIT 
13c60 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20 62 65 65  rows.** have bee
13c70 6e 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73  n output to pDes
13c80 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f 66 20 7a  t.  A LIMIT of z
13c90 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74  ero means to out
13ca0 70 75 74 20 6e 6f 20 72 6f 77 73 20 61 6e 64 20  put no rows and 
13cb0 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 4c 49  a.** negative LI
13cc0 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74  MIT means to out
13cd0 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49  put all rows.  I
13ce0 66 20 74 68 65 72 65 20 69 73 20 61 6c 73 6f 20  f there is also 
13cf0 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  an OFFSET clause
13d00 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f 73 69 74  .** with a posit
13d10 69 76 65 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  ive value, then 
13d20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54  the first OFFSET
13d30 20 6f 75 74 70 75 74 73 20 61 72 65 20 64 69 73   outputs are dis
13d40 63 61 72 64 65 64 20 72 61 74 68 65 72 0a 2a 2a  carded rather.**
13d50 20 74 68 61 6e 20 62 65 69 6e 67 20 73 65 6e 74   than being sent
13d60 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65 20   to pDest.  The 
13d70 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64 6f 65 73  LIMIT count does
13d80 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e 74 69 6c   not begin until
13d90 20 61 66 74 65 72 20 4f 46 46 53 45 54 0a 2a 2a   after OFFSET.**
13da0 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20   rows have been 
13db0 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74  skipped..*/.stat
13dc0 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
13dd0 57 69 74 68 52 65 63 75 72 73 69 76 65 51 75 65  WithRecursiveQue
13de0 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ry(.  Parse *pPa
13df0 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
13e00 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
13e10 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
13e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
13e30 20 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43   recursive SELEC
13e40 54 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  T to be coded */
13e50 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
13e60 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
13e70 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
13e80 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
13e90 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20    SrcList *pSrc 
13ea0 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20 20 20 20  = p->pSrc;      
13eb0 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
13ec0 73 65 20 6f 66 20 74 68 65 20 72 65 63 75 72 73  se of the recurs
13ed0 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ive query */.  i
13ee0 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c  nt nCol = p->pEL
13ef0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a 20  ist->nExpr;  /* 
13f00 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
13f10 73 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69  s in the recursi
13f20 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 56 64  ve table */.  Vd
13f30 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
13f40 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54  pVdbe;      /* T
13f50 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
13f60 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73  ement under cons
13f70 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65  truction */.  Se
13f80 6c 65 63 74 20 2a 70 53 65 74 75 70 20 3d 20 70  lect *pSetup = p
13f90 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f 2a 20 54  ->pPrior;   /* T
13fa0 68 65 20 73 65 74 75 70 20 71 75 65 72 79 20 2a  he setup query *
13fb0 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b  /.  int addrTop;
13fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fd0 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
13fe0 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
13ff0 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61  drCont, addrBrea
14000 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f 4e 54 49  k;      /* CONTI
14010 4e 55 45 20 61 6e 64 20 42 52 45 41 4b 20 61 64  NUE and BREAK ad
14020 64 72 65 73 73 65 73 20 2a 2f 0a 20 20 69 6e 74  dresses */.  int
14030 20 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 20 20   iCurrent = 0;  
14040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
14050 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e Current table 
14060 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43 75 72 72  */.  int regCurr
14070 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ent;            
14080 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
14090 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e 74 20 74  olding Current t
140a0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 51  able */.  int iQ
140b0 75 65 75 65 3b 20 20 20 20 20 20 20 20 20 20 20  ueue;           
140c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 51          /* The Q
140d0 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ueue table */.  
140e0 69 6e 74 20 69 44 69 73 74 69 6e 63 74 20 3d 20  int iDistinct = 
140f0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
14100 20 54 6f 20 65 6e 73 75 72 65 20 75 6e 69 71 75   To ensure uniqu
14110 65 20 72 65 73 75 6c 74 73 20 69 66 20 55 4e 49  e results if UNI
14120 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  ON */.  int eDes
14130 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b 20 20 20  t = SRT_Fifo;   
14140 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
14150 77 72 69 74 65 20 74 6f 20 51 75 65 75 65 20 2a  write to Queue *
14160 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
14170 65 73 74 51 75 65 75 65 3b 20 20 20 20 20 20 20  estQueue;       
14180 20 20 2f 2a 20 53 65 6c 65 63 74 44 65 73 74 20    /* SelectDest 
14190 74 61 72 67 65 74 74 69 6e 67 20 74 68 65 20 51  targetting the Q
141a0 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ueue table */.  
141b0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
141c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
141d0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
141e0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
141f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14200 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
14210 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
14220 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
14230 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
14240 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  BY clause */.  E
14250 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20  xpr *pLimit;    
14260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14270 53 61 76 65 64 20 4c 49 4d 49 54 20 61 6e 64 20  Saved LIMIT and 
14280 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 6e 74 20  OFFSET */.  int 
14290 72 65 67 4c 69 6d 69 74 2c 20 72 65 67 4f 66 66  regLimit, regOff
142a0 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 52 65 67  set;      /* Reg
142b0 69 73 74 65 72 73 20 75 73 65 64 20 62 79 20 4c  isters used by L
142c0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
142d0 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20  */..  /* Obtain 
142e0 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f  authorization to
142f0 20 64 6f 20 61 20 72 65 63 75 72 73 69 76 65 20   do a recursive 
14300 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 73  query */.  if( s
14310 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
14320 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52  pParse, SQLITE_R
14330 45 43 55 52 53 49 56 45 2c 20 30 2c 20 30 2c 20  ECURSIVE, 0, 0, 
14340 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  0) ) return;..  
14350 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20 4c  /* Process the L
14360 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
14370 63 6c 61 75 73 65 73 2c 20 69 66 20 74 68 65 79  clauses, if they
14380 20 65 78 69 73 74 20 2a 2f 0a 20 20 61 64 64 72   exist */.  addr
14390 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
143a0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
143b0 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  .  p->nSelectRow
143c0 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20 62 69   = 320;  /* 4 bi
143d0 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a 20 20  llion rows */.  
143e0 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
143f0 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
14400 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 70   addrBreak);.  p
14410 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
14420 74 3b 0a 20 20 72 65 67 4c 69 6d 69 74 20 3d 20  t;.  regLimit = 
14430 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 72 65 67  p->iLimit;.  reg
14440 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66  Offset = p->iOff
14450 73 65 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74  set;.  p->pLimit
14460 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69   = 0;.  p->iLimi
14470 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  t = p->iOffset =
14480 20 30 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d   0;.  pOrderBy =
14490 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20   p->pOrderBy;.. 
144a0 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63   /* Locate the c
144b0 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
144c0 74 68 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c  the Current tabl
144d0 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  e */.  for(i=0; 
144e0 41 4c 57 41 59 53 28 69 3c 70 53 72 63 2d 3e 6e  ALWAYS(i<pSrc->n
144f0 53 72 63 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Src); i++){.    
14500 69 66 28 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 66  if( pSrc->a[i].f
14510 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 29 7b  g.isRecursive ){
14520 0a 20 20 20 20 20 20 69 43 75 72 72 65 6e 74 20  .      iCurrent 
14530 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75  = pSrc->a[i].iCu
14540 72 73 6f 72 3b 0a 20 20 20 20 20 20 62 72 65 61  rsor;.      brea
14550 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
14560 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73  /* Allocate curs
14570 6f 72 73 20 6e 75 6d 62 65 72 73 20 66 6f 72 20  ors numbers for 
14580 51 75 65 75 65 20 61 6e 64 20 44 69 73 74 69 6e  Queue and Distin
14590 63 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  ct.  The cursor 
145a0 6e 75 6d 62 65 72 20 66 6f 72 0a 20 20 2a 2a 20  number for.  ** 
145b0 74 68 65 20 44 69 73 74 69 6e 63 74 20 74 61 62  the Distinct tab
145c0 6c 65 20 6d 75 73 74 20 62 65 20 65 78 61 63 74  le must be exact
145d0 6c 79 20 6f 6e 65 20 67 72 65 61 74 65 72 20 74  ly one greater t
145e0 68 61 6e 20 51 75 65 75 65 20 69 6e 20 6f 72 64  han Queue in ord
145f0 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  er.  ** for the 
14600 53 52 54 5f 44 69 73 74 46 69 66 6f 20 61 6e 64  SRT_DistFifo and
14610 20 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 64   SRT_DistQueue d
14620 65 73 74 69 6e 61 74 69 6f 6e 73 20 74 6f 20 77  estinations to w
14630 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51 75 65 75 65  ork. */.  iQueue
14640 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
14650 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  +;.  if( p->op==
14660 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20  TK_UNION ){.    
14670 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79  eDest = pOrderBy
14680 20 3f 20 53 52 54 5f 44 69 73 74 51 75 65 75 65   ? SRT_DistQueue
14690 20 3a 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3b   : SRT_DistFifo;
146a0 0a 20 20 20 20 69 44 69 73 74 69 6e 63 74 20 3d  .    iDistinct =
146b0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
146c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 44  .  }else{.    eD
146d0 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20 3f  est = pOrderBy ?
146e0 20 53 52 54 5f 51 75 65 75 65 20 3a 20 53 52 54   SRT_Queue : SRT
146f0 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20 20 73 71 6c  _Fifo;.  }.  sql
14700 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
14710 69 74 28 26 64 65 73 74 51 75 65 75 65 2c 20 65  it(&destQueue, e
14720 44 65 73 74 2c 20 69 51 75 65 75 65 29 3b 0a 0a  Dest, iQueue);..
14730 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75    /* Allocate cu
14740 72 73 6f 72 73 20 66 6f 72 20 43 75 72 72 65 6e  rsors for Curren
14750 74 2c 20 51 75 65 75 65 2c 20 61 6e 64 20 44 69  t, Queue, and Di
14760 73 74 69 6e 63 74 2e 20 2a 2f 0a 20 20 72 65 67  stinct. */.  reg
14770 43 75 72 72 65 6e 74 20 3d 20 2b 2b 70 50 61 72  Current = ++pPar
14780 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69  se->nMem;.  sqli
14790 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
147a0 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20   OP_OpenPseudo, 
147b0 69 43 75 72 72 65 6e 74 2c 20 72 65 67 43 75 72  iCurrent, regCur
147c0 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 69  rent, nCol);.  i
147d0 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
147e0 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
147f0 49 6e 66 6f 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Info = multiSele
14800 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f  ctOrderByKeyInfo
14810 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a  (pParse, p, 1);.
14820 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14830 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
14840 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75  Ephemeral, iQueu
14850 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  e, pOrderBy->nEx
14860 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20 20  pr+2, 0,.       
14870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
14880 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
14890 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
148a0 20 64 65 73 74 51 75 65 75 65 2e 70 4f 72 64 65   destQueue.pOrde
148b0 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
148c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
148d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
148e0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
148f0 61 6c 2c 20 69 51 75 65 75 65 2c 20 6e 43 6f 6c  al, iQueue, nCol
14900 29 3b 0a 20 20 7d 0a 20 20 56 64 62 65 43 6f 6d  );.  }.  VdbeCom
14910 6d 65 6e 74 28 28 76 2c 20 22 51 75 65 75 65 20  ment((v, "Queue 
14920 74 61 62 6c 65 22 29 29 3b 0a 20 20 69 66 28 20  table"));.  if( 
14930 69 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  iDistinct ){.   
14940 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
14950 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62  [0] = sqlite3Vdb
14960 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
14970 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 44 69  enEphemeral, iDi
14980 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20 20 20  stinct, 0);.    
14990 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
149a0 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
149b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 61 63  .  }..  /* Detac
149c0 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  h the ORDER BY c
149d0 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 63  lause from the c
149e0 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a  ompound SELECT *
149f0 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  /.  p->pOrderBy 
14a00 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 74 6f 72 65  = 0;..  /* Store
14a10 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
14a20 74 68 65 20 73 65 74 75 70 2d 71 75 65 72 79 20  the setup-query 
14a30 69 6e 20 51 75 65 75 65 2e 20 2a 2f 0a 20 20 70  in Queue. */.  p
14a40 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20 30  Setup->pNext = 0
14a50 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
14a60 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
14a70 53 65 74 75 70 2c 20 26 64 65 73 74 51 75 65 75  Setup, &destQueu
14a80 65 29 3b 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e  e);.  pSetup->pN
14a90 65 78 74 20 3d 20 70 3b 0a 20 20 69 66 28 20 72  ext = p;.  if( r
14aa0 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f  c ) goto end_of_
14ab0 72 65 63 75 72 73 69 76 65 5f 71 75 65 72 79 3b  recursive_query;
14ac0 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20  ..  /* Find the 
14ad0 6e 65 78 74 20 72 6f 77 20 69 6e 20 74 68 65 20  next row in the 
14ae0 51 75 65 75 65 20 61 6e 64 20 6f 75 74 70 75 74  Queue and output
14af0 20 74 68 61 74 20 72 6f 77 20 2a 2f 0a 20 20 61   that row */.  a
14b00 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ddrTop = sqlite3
14b10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14b20 5f 52 65 77 69 6e 64 2c 20 69 51 75 65 75 65 2c  _Rewind, iQueue,
14b30 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62   addrBreak); Vdb
14b40 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
14b50 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65   /* Transfer the
14b60 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 51 75 65   next row in Que
14b70 75 65 20 6f 76 65 72 20 74 6f 20 43 75 72 72 65  ue over to Curre
14b80 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  nt */.  sqlite3V
14b90 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
14ba0 4e 75 6c 6c 52 6f 77 2c 20 69 43 75 72 72 65 6e  NullRow, iCurren
14bb0 74 29 3b 20 2f 2a 20 54 6f 20 72 65 73 65 74 20  t); /* To reset 
14bc0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 2a 2f 0a  column cache */.
14bd0 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
14be0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
14bf0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
14c00 6c 75 6d 6e 2c 20 69 51 75 65 75 65 2c 20 70 4f  lumn, iQueue, pO
14c10 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c  rderBy->nExpr+1,
14c20 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20   regCurrent);.  
14c30 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
14c40 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14c50 4f 50 5f 52 6f 77 44 61 74 61 2c 20 69 51 75 65  OP_RowData, iQue
14c60 75 65 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b  ue, regCurrent);
14c70 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
14c80 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44  beAddOp1(v, OP_D
14c90 65 6c 65 74 65 2c 20 69 51 75 65 75 65 29 3b 0a  elete, iQueue);.
14ca0 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65  .  /* Output the
14cb0 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43   single row in C
14cc0 75 72 72 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72  urrent */.  addr
14cd0 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
14ce0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
14cf0 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
14d00 72 65 67 4f 66 66 73 65 74 2c 20 61 64 64 72 43  regOffset, addrC
14d10 6f 6e 74 29 3b 0a 20 20 73 65 6c 65 63 74 49 6e  ont);.  selectIn
14d20 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
14d30 70 2c 20 69 43 75 72 72 65 6e 74 2c 0a 20 20 20  p, iCurrent,.   
14d40 20 20 20 30 2c 20 30 2c 20 70 44 65 73 74 2c 20     0, 0, pDest, 
14d50 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72  addrCont, addrBr
14d60 65 61 6b 29 3b 0a 20 20 69 66 28 20 72 65 67 4c  eak);.  if( regL
14d70 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
14d80 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14d90 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f   OP_DecrJumpZero
14da0 2c 20 72 65 67 4c 69 6d 69 74 2c 20 61 64 64 72  , regLimit, addr
14db0 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62 65  Break);.    Vdbe
14dc0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
14dd0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
14de0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
14df0 64 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20 45  drCont);..  /* E
14e00 78 65 63 75 74 65 20 74 68 65 20 72 65 63 75 72  xecute the recur
14e10 73 69 76 65 20 53 45 4c 45 43 54 20 74 61 6b 69  sive SELECT taki
14e20 6e 67 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f  ng the single ro
14e30 77 20 69 6e 20 43 75 72 72 65 6e 74 20 61 73 0a  w in Current as.
14e40 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 66    ** the value f
14e50 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65  or the recursive
14e60 2d 74 61 62 6c 65 2e 20 53 74 6f 72 65 20 74 68  -table. Store th
14e70 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  e results in the
14e80 20 51 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20 69   Queue..  */.  i
14e90 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
14ea0 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 7b   SF_Aggregate ){
14eb0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
14ec0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 65  rMsg(pParse, "re
14ed0 63 75 72 73 69 76 65 20 61 67 67 72 65 67 61 74  cursive aggregat
14ee0 65 20 71 75 65 72 69 65 73 20 6e 6f 74 20 73 75  e queries not su
14ef0 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 7d 65 6c  pported");.  }el
14f00 73 65 7b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f  se{.    p->pPrio
14f10 72 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  r = 0;.    sqlit
14f20 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
14f30 20 70 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b   p, &destQueue);
14f40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
14f50 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 20  pPrior==0 );.   
14f60 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 53 65   p->pPrior = pSe
14f70 74 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4b  tup;.  }..  /* K
14f80 65 65 70 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  eep running the 
14f90 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68 65 20 51  loop until the Q
14fa0 75 65 75 65 20 69 73 20 65 6d 70 74 79 20 2a 2f  ueue is empty */
14fb0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f  .  sqlite3VdbeGo
14fc0 74 6f 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a  to(v, addrTop);.
14fd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
14fe0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
14ff0 72 42 72 65 61 6b 29 3b 0a 0a 65 6e 64 5f 6f 66  rBreak);..end_of
15000 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65 72 79  _recursive_query
15010 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  :.  sqlite3ExprL
15020 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
15030 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  ->db, p->pOrderB
15040 79 29 3b 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42  y);.  p->pOrderB
15050 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
15060 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
15070 69 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  it;.  return;.}.
15080 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
15090 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 2f 2a  _OMIT_CTE */../*
150a0 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
150b0 63 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ces */.static in
150c0 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  t multiSelectOrd
150d0 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70  erBy(.  Parse *p
150e0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
150f0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
15100 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
15110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15120 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
15130 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
15140 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
15150 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
15160 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
15170 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
15180 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 48 61   */.);../*.** Ha
15190 6e 64 6c 65 20 74 68 65 20 73 70 65 63 69 61 6c  ndle the special
151a0 20 63 61 73 65 20 6f 66 20 61 20 63 6f 6d 70 6f   case of a compo
151b0 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20  und-select that 
151c0 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20  originates from 
151d0 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63 6c 61 75  a.** VALUES clau
151e0 73 65 2e 20 20 42 79 20 68 61 6e 64 6c 69 6e 67  se.  By handling
151f0 20 74 68 69 73 20 61 73 20 61 20 73 70 65 63 69   this as a speci
15200 61 6c 20 63 61 73 65 2c 20 77 65 20 61 76 6f 69  al case, we avoi
15210 64 20 64 65 65 70 0a 2a 2a 20 72 65 63 75 72 73  d deep.** recurs
15220 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73 20 64 6f  ion, and thus do
15230 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 65 6e 66   not need to enf
15240 6f 72 63 65 20 74 68 65 20 53 51 4c 49 54 45 5f  orce the SQLITE_
15250 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  LIMIT_COMPOUND_S
15260 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61 20 56 41  ELECT.** on a VA
15270 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  LUES clause..**.
15280 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 53  ** Because the S
15290 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 6f 72 69  elect object ori
152a0 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 20 56  ginates from a V
152b0 41 4c 55 45 53 20 63 6c 61 75 73 65 3a 0a 2a 2a  ALUES clause:.**
152c0 20 20 20 28 31 29 20 54 68 65 72 65 20 69 73 20     (1) There is 
152d0 6e 6f 20 4c 49 4d 49 54 20 6f 72 20 4f 46 46 53  no LIMIT or OFFS
152e0 45 54 20 6f 72 20 65 6c 73 65 20 74 68 65 72 65  ET or else there
152f0 20 69 73 20 61 20 4c 49 4d 49 54 20 6f 66 20 65   is a LIMIT of e
15300 78 61 63 74 6c 79 20 31 0a 2a 2a 20 20 20 28 32  xactly 1.**   (2
15310 29 20 41 6c 6c 20 74 65 72 6d 73 20 61 72 65 20  ) All terms are 
15320 55 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a 20 20 20 28  UNION ALL.**   (
15330 33 29 20 54 68 65 72 65 20 69 73 20 6e 6f 20 4f  3) There is no O
15340 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a  RDER BY clause.*
15350 2a 0a 2a 2a 20 54 68 65 20 22 4c 49 4d 49 54 20  *.** The "LIMIT 
15360 6f 66 20 65 78 61 63 74 6c 79 20 31 22 20 63 61  of exactly 1" ca
15370 73 65 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e 20  se of condition 
15380 28 31 29 20 63 6f 6d 65 73 20 61 62 6f 75 74 20  (1) comes about 
15390 77 68 65 6e 20 61 20 56 41 4c 55 45 53 0a 2a 2a  when a VALUES.**
153a0 20 63 6c 61 75 73 65 20 6f 63 63 75 72 73 20 77   clause occurs w
153b0 69 74 68 69 6e 20 73 63 61 6c 61 72 20 65 78 70  ithin scalar exp
153c0 72 65 73 73 69 6f 6e 20 28 65 78 3a 20 22 53 45  ression (ex: "SE
153d0 4c 45 43 54 20 28 56 41 4c 55 45 53 28 31 29 2c  LECT (VALUES(1),
153e0 28 32 29 2c 28 33 29 29 22 29 2e 0a 2a 2a 20 54  (2),(3))")..** T
153f0 68 65 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75  he sqlite3CodeSu
15400 62 73 65 6c 65 63 74 20 77 69 6c 6c 20 68 61 76  bselect will hav
15410 65 20 61 64 64 65 64 20 74 68 65 20 4c 49 4d 49  e added the LIMI
15420 54 20 31 20 63 6c 61 75 73 65 20 69 6e 20 74 68  T 1 clause in th
15430 74 20 63 61 73 65 2e 0a 2a 2a 20 53 69 6e 63 65  t case..** Since
15440 20 74 68 65 20 6c 69 6d 69 74 20 69 73 20 65 78   the limit is ex
15450 61 63 74 6c 79 20 31 2c 20 77 65 20 6f 6e 6c 79  actly 1, we only
15460 20 6e 65 65 64 20 74 6f 20 65 76 61 6c 75 74 65   need to evalute
15470 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  s the left-most 
15480 56 41 4c 55 45 53 2e 0a 2a 2f 0a 73 74 61 74 69  VALUES..*/.stati
15490 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
154a0 74 56 61 6c 75 65 73 28 0a 20 20 50 61 72 73 65  tValues(.  Parse
154b0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
154c0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
154d0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
154e0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
154f0 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
15500 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
15510 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
15520 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
15530 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
15540 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
15550 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65  lts */.){.  Sele
15560 63 74 20 2a 70 50 72 69 6f 72 3b 0a 20 20 53 65  ct *pPrior;.  Se
15570 6c 65 63 74 20 2a 70 52 69 67 68 74 6d 6f 73 74  lect *pRightmost
15580 20 3d 20 70 3b 0a 20 20 69 6e 74 20 6e 52 6f 77   = p;.  int nRow
15590 20 3d 20 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 1;.  int rc =
155a0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   0;.  assert( p-
155b0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d  >selFlags & SF_M
155c0 75 6c 74 69 56 61 6c 75 65 20 29 3b 0a 20 20 64  ultiValue );.  d
155d0 6f 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  o{.    assert( p
155e0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
155f0 56 61 6c 75 65 73 20 29 3b 0a 20 20 20 20 61 73  Values );.    as
15600 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  sert( p->op==TK_
15610 41 4c 4c 20 7c 7c 20 28 70 2d 3e 6f 70 3d 3d 54  ALL || (p->op==T
15620 4b 5f 53 45 4c 45 43 54 20 26 26 20 70 2d 3e 70  K_SELECT && p->p
15630 50 72 69 6f 72 3d 3d 30 29 20 29 3b 0a 20 20 20  Prior==0) );.   
15640 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4e 65 78   assert( p->pNex
15650 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 45 4c 69 73  t==0 || p->pELis
15660 74 2d 3e 6e 45 78 70 72 3d 3d 70 2d 3e 70 4e 65  t->nExpr==p->pNe
15670 78 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  xt->pEList->nExp
15680 72 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  r );.    if( p->
15690 70 50 72 69 6f 72 3d 3d 30 20 29 20 62 72 65 61  pPrior==0 ) brea
156a0 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  k;.    assert( p
156b0 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 3d  ->pPrior->pNext=
156c0 3d 70 20 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  =p );.    p = p-
156d0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 6e 52 6f  >pPrior;.    nRo
156e0 77 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 31 29  w++;.  }while(1)
156f0 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
15700 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e      pPrior = p->
15710 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70  pPrior;.    p->p
15720 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 72  Prior = 0;.    r
15730 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
15740 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65  t(pParse, p, pDe
15750 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69  st);.    p->pPri
15760 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
15770 20 69 66 28 20 72 63 20 7c 7c 20 70 52 69 67 68   if( rc || pRigh
15780 74 6d 6f 73 74 2d 3e 70 4c 69 6d 69 74 20 29 20  tmost->pLimit ) 
15790 62 72 65 61 6b 3b 0a 20 20 20 20 70 2d 3e 6e 53  break;.    p->nS
157a0 65 6c 65 63 74 52 6f 77 20 3d 20 6e 52 6f 77 3b  electRow = nRow;
157b0 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
157c0 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
157d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
157e0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
157f0 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61  led to process a
15800 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
15810 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f  form from.** two
15820 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74   or more separat
15830 65 20 71 75 65 72 69 65 73 20 75 73 69 6e 67 20  e queries using 
15840 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c  UNION, UNION ALL
15850 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20  , EXCEPT, or.** 
15860 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20  INTERSECT.**.** 
15870 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  "p" points to th
15880 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
15890 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e  the two queries.
158a0 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74    the query on t
158b0 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d  he.** left is p-
158c0 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65  >pPrior.  The le
158d0 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61  ft query could a
158e0 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e  lso be a compoun
158f0 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68  d query.** in wh
15900 69 63 68 20 63 61 73 65 20 74 68 69 73 20 72 6f  ich case this ro
15910 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61  utine will be ca
15920 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
15930 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  . .**.** The res
15940 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61  ults of the tota
15950 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f 20 62  l query are to b
15960 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61  e written into a
15970 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20   destination.** 
15980 6f 66 20 74 79 70 65 20 65 44 65 73 74 20 77 69  of type eDest wi
15990 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 50 61  th parameter iPa
159a0 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  rm..**.** Exampl
159b0 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61  e 1:  Consider a
159c0 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f   three-way compo
159d0 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  und SQL statemen
159e0 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  t..**.**     SEL
159f0 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e  ECT a FROM t1 UN
15a00 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ION SELECT b FRO
15a10 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t2 UNION SELEC
15a20 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a  T c FROM t3.**.*
15a30 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
15a40 20 69 73 20 70 61 72 73 65 64 20 75 70 20 61 73   is parsed up as
15a50 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
15a60 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f      SELECT c FRO
15a70 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a  M t3.**      |.*
15a80 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20  *      `----->  
15a90 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
15aa0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
15ab0 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
15ac0 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20         `------> 
15ad0 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
15ae0 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f  1.**.** The arro
15af0 77 73 20 69 6e 20 74 68 65 20 64 69 61 67 72 61  ws in the diagra
15b00 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e  m above represen
15b10 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72  t the Select.pPr
15b20 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20  ior pointer..** 
15b30 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
15b40 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74  ne is called wit
15b50 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65  h p equal to the
15b60 20 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a   t3 query, then.
15b70 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62  ** pPrior will b
15b80 65 20 74 68 65 20 74 32 20 71 75 65 72 79 2e 20  e the t2 query. 
15b90 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54   p->op will be T
15ba0 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20  K_UNION in this 
15bb0 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69  case..**.** Noti
15bc0 63 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20  ce that because 
15bd0 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c 69 74  of the way SQLit
15be0 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e  e parses compoun
15bf0 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a  d SELECTs, the.*
15c00 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c  * individual sel
15c10 65 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75  ects always grou
15c20 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  p from left to r
15c30 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ight..*/.static 
15c40 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  int multiSelect(
15c50 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
15c60 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
15c70 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
15c80 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
15c90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
15ca0 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
15cb0 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
15cc0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
15cd0 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
15ce0 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
15cf0 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
15d00 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
15d10 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63  ITE_OK;   /* Suc
15d20 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61  cess code from a
15d30 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
15d40 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b   Select *pPrior;
15d50 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65         /* Anothe
15d60 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61  r SELECT immedia
15d70 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74  tely to our left
15d80 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
15d90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
15da0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
15db0 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53  this VDBE */.  S
15dc0 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20  electDest dest; 
15dd0 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74       /* Alternat
15de0 69 76 65 20 64 61 74 61 20 64 65 73 74 69 6e 61  ive data destina
15df0 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tion */.  Select
15e00 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b 20 20   *pDelete = 0;  
15e10 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73 69 6d 70  /* Chain of simp
15e20 6c 65 20 73 65 6c 65 63 74 73 20 74 6f 20 64 65  le selects to de
15e30 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lete */.  sqlite
15e40 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
15e50 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
15e60 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66 6e 64 65  ection */.#ifnde
15e70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
15e80 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62  PLAIN.  int iSub
15e90 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  1 = 0;        /*
15ea0 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d   EQP id of left-
15eb0 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20  hand query */.  
15ec0 69 6e 74 20 69 53 75 62 32 20 3d 20 30 3b 20 20  int iSub2 = 0;  
15ed0 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20        /* EQP id 
15ee0 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75  of right-hand qu
15ef0 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ery */.#endif.. 
15f00 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
15f10 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
15f20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75  BY or LIMIT clau
15f30 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45  se on prior SELE
15f40 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20  CTs.  Only.  ** 
15f50 74 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d  the last (right-
15f60 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20  most) SELECT in 
15f70 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68  the series may h
15f80 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ave an ORDER BY 
15f90 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20  or LIMIT..  */. 
15fa0 20 61 73 73 65 72 74 28 20 70 20 26 26 20 70 2d   assert( p && p-
15fb0 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43  >pPrior );  /* C
15fc0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
15fd0 67 75 61 72 61 6e 74 65 65 73 20 74 68 69 73 20  guarantees this 
15fe0 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73 65 72 74  much */.  assert
15ff0 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
16000 20 53 46 5f 52 65 63 75 72 73 69 76 65 29 3d 3d   SF_Recursive)==
16010 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41  0 || p->op==TK_A
16020 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  LL || p->op==TK_
16030 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62 20 3d 20  UNION );.  db = 
16040 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50  pParse->db;.  pP
16050 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
16060 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73  ;.  dest = *pDes
16070 74 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d  t;.  if( pPrior-
16080 3e 70 4f 72 64 65 72 42 79 20 7c 7c 20 70 50 72  >pOrderBy || pPr
16090 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  ior->pLimit ){. 
160a0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
160b0 73 67 28 70 50 61 72 73 65 2c 22 25 73 20 63 6c  sg(pParse,"%s cl
160c0 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65  ause should come
160d0 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65   after %s not be
160e0 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 70 50 72  fore",.      pPr
160f0 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30  ior->pOrderBy!=0
16100 20 3f 20 22 4f 52 44 45 52 20 42 59 22 20 3a 20   ? "ORDER BY" : 
16110 22 4c 49 4d 49 54 22 2c 20 73 65 6c 65 63 74 4f  "LIMIT", selectO
16120 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
16130 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
16140 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
16150 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d  _end;.  }..  v =
16160 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
16170 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
16180 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54  t( v!=0 );  /* T
16190 68 65 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  he VDBE already 
161a0 63 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c 69  created by calli
161b0 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a  ng function */..
161c0 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
161d0 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70  destination temp
161e0 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e  orary table if n
161f0 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20  ecessary.  */.  
16200 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
16210 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a  SRT_EphemTab ){.
16220 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
16230 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c  EList );.    sql
16240 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16250 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
16260 61 6c 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d  al, dest.iSDParm
16270 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
16280 70 72 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44  pr);.    dest.eD
16290 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b  est = SRT_Table;
162a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69  .  }..  /* Speci
162b0 61 6c 20 68 61 6e 64 6c 69 6e 67 20 66 6f 72 20  al handling for 
162c0 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63  a compound-selec
162d0 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65  t that originate
162e0 73 20 61 73 20 61 20 56 41 4c 55 45 53 20 63 6c  s as a VALUES cl
162f0 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ause..  */.  if(
16300 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
16310 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29 7b 0a  F_MultiValue ){.
16320 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65      rc = multiSe
16330 6c 65 63 74 56 61 6c 75 65 73 28 70 50 61 72 73  lectValues(pPars
16340 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20  e, p, &dest);.  
16350 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
16360 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
16370 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  /* Make sure all
16380 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20   SELECTs in the 
16390 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74  statement have t
163a0 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
163b0 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20  f elements.  ** 
163c0 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20  in their result 
163d0 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sets..  */.  ass
163e0 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26  ert( p->pEList &
163f0 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  & pPrior->pEList
16400 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
16410 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  >pEList->nExpr==
16420 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e  pPrior->pEList->
16430 6e 45 78 70 72 20 29 3b 0a 0a 23 69 66 6e 64 65  nExpr );..#ifnde
16440 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
16450 45 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  E.  if( p->selFl
16460 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
16470 76 65 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  ve ){.    genera
16480 74 65 57 69 74 68 52 65 63 75 72 73 69 76 65 51  teWithRecursiveQ
16490 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20  uery(pParse, p, 
164a0 26 64 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a  &dest);.  }else.
164b0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d  #endif..  /* Com
164c0 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74 68  pound SELECTs th
164d0 61 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  at have an ORDER
164e0 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 68   BY clause are h
164f0 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c  andled separatel
16500 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  y..  */.  if( p-
16510 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
16520 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c   return multiSel
16530 65 63 74 4f 72 64 65 72 42 79 28 70 50 61 72 73  ectOrderBy(pPars
16540 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20  e, p, pDest);.  
16550 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 47 65 6e 65  }else..  /* Gene
16560 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
16570 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
16580 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
16590 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63  ts..  */.  switc
165a0 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
165b0 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20  case TK_ALL: {. 
165c0 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
165d0 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69  0;.      int nLi
165e0 6d 69 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  mit;.      asser
165f0 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  t( !pPrior->pLim
16600 69 74 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69  it );.      pPri
16610 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e  or->iLimit = p->
16620 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50  iLimit;.      pP
16630 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 20 3d 20  rior->iOffset = 
16640 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->iOffset;.    
16650 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74    pPrior->pLimit
16660 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
16670 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
16680 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61  teger(iSub1, pPa
16690 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
166a0 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
166b0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
166c0 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64  arse, pPrior, &d
166d0 65 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  est);.      p->p
166e0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
166f0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
16700 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
16710 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
16720 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  }.      p->pPrio
16730 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  r = 0;.      p->
16740 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d  iLimit = pPrior-
16750 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >iLimit;.      p
16760 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69  ->iOffset = pPri
16770 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20  or->iOffset;.   
16780 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74     if( p->iLimit
16790 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72   ){.        addr
167a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
167b0 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
167c0 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 20 56 64  , p->iLimit); Vd
167d0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
167e0 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
167f0 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61 68 65  nt((v, "Jump ahe
16800 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63  ad if LIMIT reac
16810 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20  hed"));.        
16820 69 66 28 20 70 2d 3e 69 4f 66 66 73 65 74 20 29  if( p->iOffset )
16830 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
16840 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
16850 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c   OP_OffsetLimit,
16860 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16870 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
16880 69 4c 69 6d 69 74 2c 20 70 2d 3e 69 4f 66 66 73  iLimit, p->iOffs
16890 65 74 2b 31 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et+1, p->iOffset
168a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
168b0 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70 6c 61     }.      expla
168c0 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
168d0 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b2, pParse->iNex
168e0 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
168f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
16900 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
16910 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65  &dest);.      te
16920 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
16930 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70  TE_OK );.      p
16940 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69  Delete = p->pPri
16950 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  or;.      p->pPr
16960 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
16970 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
16980 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w = sqlite3LogEs
16990 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52  tAdd(p->nSelectR
169a0 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  ow, pPrior->nSel
169b0 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 69  ectRow);.      i
169c0 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  f( pPrior->pLimi
169d0 74 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  t.       && sqli
169e0 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
169f0 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2d  (pPrior->pLimit-
16a00 3e 70 4c 65 66 74 2c 20 26 6e 4c 69 6d 69 74 29  >pLeft, &nLimit)
16a10 0a 20 20 20 20 20 20 20 26 26 20 6e 4c 69 6d 69  .       && nLimi
16a20 74 3e 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63  t>0 && p->nSelec
16a30 74 52 6f 77 20 3e 20 73 71 6c 69 74 65 33 4c 6f  tRow > sqlite3Lo
16a40 67 45 73 74 28 28 75 36 34 29 6e 4c 69 6d 69 74  gEst((u64)nLimit
16a50 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ) .      ){.    
16a60 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
16a70 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w = sqlite3LogEs
16a80 74 28 28 75 36 34 29 6e 4c 69 6d 69 74 29 3b 0a  t((u64)nLimit);.
16a90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
16aa0 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20  ( addr ){.      
16ab0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
16ac0 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
16ad0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
16ae0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
16af0 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20  ase TK_EXCEPT:. 
16b00 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e     case TK_UNION
16b10 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e  : {.      int un
16b20 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75  ionTab;    /* Cu
16b30 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
16b40 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
16b50 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c  le holding resul
16b60 74 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 6f 70  t */.      u8 op
16b70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f   = 0;       /* O
16b80 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f  ne of the SRT_ o
16b90 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70  perations to app
16ba0 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20  ly to self */.  
16bb0 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b      int priorOp;
16bc0 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f       /* The SRT_
16bd0 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70   operation to ap
16be0 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c  ply to prior sel
16bf0 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78  ects */.      Ex
16c00 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20 2f  pr *pLimit;    /
16c10 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f  * Saved values o
16c20 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 20 2a 2f 0a  f p->nLimit  */.
16c30 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
16c40 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
16c50 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20   uniondest;..   
16c60 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
16c70 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 3b  op==TK_EXCEPT );
16c80 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16c90 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
16ca0 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 4f   );.      priorO
16cb0 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  p = SRT_Union;. 
16cc0 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
16cd0 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 29 7b 0a  est==priorOp ){.
16ce0 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61          /* We ca
16cf0 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72  n reuse a tempor
16d00 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61  ary table genera
16d10 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20  ted by a SELECT 
16d20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a  to our.        *
16d30 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20  * right..       
16d40 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
16d50 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30  rt( p->pLimit==0
16d60 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20   );      /* Not 
16d70 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77  allowed on leftw
16d80 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a  ard elements */.
16d90 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
16da0 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b   = dest.iSDParm;
16db0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16dc0 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c        /* We will
16dd0 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
16de0 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72  our own temporar
16df0 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  y table to hold 
16e00 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  the.        ** i
16e10 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
16e20 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  lts..        */.
16e30 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
16e40 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
16e50 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  +;.        asser
16e60 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
16e70 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64  0 );.        add
16e80 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
16e90 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
16ea0 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e  Ephemeral, union
16eb0 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Tab, 0);.       
16ec0 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
16ed0 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d  OpenEphm[0] == -
16ee0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  1 );.        p->
16ef0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
16f00 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20  = addr;.        
16f10 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29  findRightmost(p)
16f20 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
16f30 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
16f40 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16f50 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
16f60 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
16f70 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ode the SELECT s
16f80 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72  tatements to our
16f90 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20   left.      */. 
16fa0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
16fb0 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
16fc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
16fd0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 75  electDestInit(&u
16fe0 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f  niondest, priorO
16ff0 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20  p, unionTab);.  
17000 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
17010 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61  teger(iSub1, pPa
17020 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
17030 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
17040 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
17050 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75  arse, pPrior, &u
17060 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20  niondest);.     
17070 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
17080 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
17090 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
170a0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
170b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
170c0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ECT statement.  
170d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
170e0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50   p->op==TK_EXCEP
170f0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20  T ){.        op 
17100 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20  = SRT_Except;.  
17110 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17120 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
17130 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
17140 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55        op = SRT_U
17150 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nion;.      }.  
17160 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
17170 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20  0;.      pLimit 
17180 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
17190 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
171a0 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73  ;.      uniondes
171b0 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20  t.eDest = op;.  
171c0 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
171d0 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61  teger(iSub2, pPa
171e0 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
171f0 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
17200 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
17210 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64  arse, p, &uniond
17220 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
17230 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
17240 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  _OK );.      /* 
17250 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  Query flattening
17260 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63   in sqlite3Selec
17270 74 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c  t() might refill
17280 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20   p->pOrderBy..  
17290 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74      ** Be sure t
172a0 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64  o delete p->pOrd
172b0 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c  erBy, therefore,
172c0 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f   to avoid a memo
172d0 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20  ry leak. */.    
172e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
172f0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
17300 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
17310 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72  pDelete = p->pPr
17320 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ior;.      p->pP
17330 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
17340 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
17350 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
17360 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
17370 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53  ){.        p->nS
17380 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
17390 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e  e3LogEstAdd(p->n
173a0 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f  SelectRow, pPrio
173b0 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a  r->nSelectRow);.
173c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
173d0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
173e0 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
173f0 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
17400 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = pLimit;.      
17410 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->iLimit = 0;. 
17420 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20       p->iOffset 
17430 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  = 0;..      /* C
17440 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20  onvert the data 
17450 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
17460 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74   table into what
17470 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20  ever form.      
17480 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20 77 65  ** it is that we
17490 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e   currently need.
174a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
174b0 61 73 73 65 72 74 28 20 75 6e 69 6f 6e 54 61 62  assert( unionTab
174c0 3d 3d 64 65 73 74 2e 69 53 44 50 61 72 6d 20 7c  ==dest.iSDParm |
174d0 7c 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72  | dest.eDest!=pr
174e0 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20 20 69  iorOp );.      i
174f0 66 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70  f( dest.eDest!=p
17500 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20  riorOp ){.      
17510 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
17520 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
17530 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
17540 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
17550 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74    iBreak = sqlit
17560 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
17570 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e  v);.        iCon
17580 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
17590 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
175a0 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
175b0 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
175c0 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20  e, p, iBreak);. 
175d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
175e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
175f0 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c  ewind, unionTab,
17600 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
17610 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
17620 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
17630 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
17640 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  dr(v);.        s
17650 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
17660 50 61 72 73 65 2c 20 70 2c 20 75 6e 69 6f 6e 54  Parse, p, unionT
17670 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab,.            
17680 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30              0, 0
17690 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20  , &dest, iCont, 
176a0 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
176b0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
176c0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
176d0 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
176e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
176f0 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54   OP_Next, unionT
17700 61 62 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62  ab, iStart); Vdb
17710 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
17720 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17730 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
17740 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
17750 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17760 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
17770 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
17780 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
17790 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
177a0 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70  fault: assert( p
177b0 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  ->op==TK_INTERSE
177c0 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e  CT ); {.      in
177d0 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20  t tab1, tab2;.  
177e0 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
177f0 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20  Break, iStart;. 
17800 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
17810 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  t;.      int add
17820 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  r;.      SelectD
17830 65 73 74 20 69 6e 74 65 72 73 65 63 74 64 65 73  est intersectdes
17840 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b  t;.      int r1;
17850 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52  ..      /* INTER
17860 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e  SECT is differen
17870 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  t from the other
17880 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69  s since it requi
17890 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  res.      ** two
178a0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
178b0 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61 73  s.  Hence it has
178c0 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20   its own case.  
178d0 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62  Begin.      ** b
178e0 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65  y allocating the
178f0 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20   tables we will 
17900 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  need..      */. 
17910 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61 72       tab1 = pPar
17920 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
17930 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d    tab2 = pParse-
17940 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61  >nTab++;.      a
17950 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
17960 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  By==0 );..      
17970 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
17980 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
17990 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
179a0 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  b1, 0);.      as
179b0 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
179c0 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29  nEphm[0] == -1 )
179d0 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
179e0 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64  penEphm[0] = add
179f0 72 3b 0a 20 20 20 20 20 20 66 69 6e 64 52 69 67  r;.      findRig
17a00 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c  htmost(p)->selFl
17a10 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
17a20 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 61  hemeral;.      a
17a30 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
17a40 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f   );..      /* Co
17a50 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74  de the SELECTs t
17a60 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20  o our left into 
17a70 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
17a80 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f  "tab1"..      */
17a90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
17aa0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69 6e  lectDestInit(&in
17ab0 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52 54  tersectdest, SRT
17ac0 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20  _Union, tab1);. 
17ad0 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
17ae0 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
17af0 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
17b00 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
17b10 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
17b20 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
17b30 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a  intersectdest);.
17b40 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
17b50 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
17b60 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
17b70 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
17b80 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
17b90 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65  t SELECT into te
17ba0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
17bb0 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ab2".      */.  
17bc0 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
17bd0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17be0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
17bf0 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
17c00 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
17c10 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20  rOpenEphm[1] == 
17c20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  -1 );.      p->a
17c30 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
17c40 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e   addr;.      p->
17c50 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
17c60 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
17c70 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
17c80 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
17c90 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69   intersectdest.i
17ca0 53 44 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20  SDParm = tab2;. 
17cb0 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
17cc0 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50  nteger(iSub2, pP
17cd0 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
17ce0 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
17cf0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
17d00 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72  Parse, p, &inter
17d10 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20  sectdest);.     
17d20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
17d30 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
17d40 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
17d50 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
17d60 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
17d70 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  .      if( p->nS
17d80 65 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d  electRow>pPrior-
17d90 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d  >nSelectRow ) p-
17da0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50  >nSelectRow = pP
17db0 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
17dc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
17dd0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
17de0 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
17df0 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
17e00 69 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  it;..      /* Ge
17e10 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
17e20 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63  ake the intersec
17e30 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20  tion of the two 
17e40 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20  temporary.      
17e50 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20  ** tables..     
17e60 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
17e70 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
17e80 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
17e90 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
17ea0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f  el(v);.      iCo
17eb0 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
17ec0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
17ed0 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74      computeLimit
17ee0 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
17ef0 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  , p, iBreak);.  
17f00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17f10 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
17f20 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b  nd, tab1, iBreak
17f30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
17f40 76 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  v);.      r1 = s
17f50 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
17f60 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
17f70 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  iStart = sqlite3
17f80 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17f90 5f 52 6f 77 44 61 74 61 2c 20 74 61 62 31 2c 20  _RowData, tab1, 
17fa0 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
17fb0 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
17fc0 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
17fd0 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c  tab2, iCont, r1,
17fe0 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   0); VdbeCoverag
17ff0 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
18000 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
18010 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
18020 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
18030 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
18040 74 61 62 31 2c 0a 20 20 20 20 20 20 20 20 20 20  tab1,.          
18050 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30              0, 0
18060 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20  , &dest, iCont, 
18070 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
18080 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
18090 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
180a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
180b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
180c0 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61  Next, tab1, iSta
180d0 72 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  rt); VdbeCoverag
180e0 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
180f0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
18100 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
18110 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18120 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
18130 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ose, tab2, 0);. 
18140 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18150 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
18160 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  se, tab1, 0);.  
18170 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
18180 0a 20 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e 43  .  }..  explainC
18190 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c  omposite(pParse,
181a0 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69   p->op, iSub1, i
181b0 53 75 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f  Sub2, p->op!=TK_
181c0 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ALL);..  /* Comp
181d0 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ute collating se
181e0 71 75 65 6e 63 65 73 20 75 73 65 64 20 62 79 20  quences used by 
181f0 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  .  ** temporary 
18200 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f  tables needed to
18210 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63   implement the c
18220 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a  ompound select..
18230 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20    ** Attach the 
18240 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
18250 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61  e to all tempora
18260 72 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  ry tables..  **.
18270 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f    ** This sectio
18280 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65 20  n is run by the 
18290 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43  right-most SELEC
182a0 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79  T statement only
182b0 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74  ..  ** SELECT st
182c0 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  atements to the 
182d0 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70  left always skip
182e0 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68 65   this part.  The
182f0 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a   right-most.  **
18300 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c   SELECT might al
18310 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  so skip this par
18320 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f  t if it has no O
18330 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
18340 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20  nd.  ** no temp 
18350 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75 69  tables are requi
18360 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  red..  */.  if( 
18370 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
18380 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29  _UsesEphemeral )
18390 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  {.    int i;    
183a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
183b0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
183c0 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e  ter */.    KeyIn
183d0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20  fo *pKeyInfo;   
183e0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
183f0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
18400 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  or the result se
18410 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20  t */.    Select 
18420 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20  *pLoop;         
18430 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
18440 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45  oping through SE
18450 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
18460 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  */.    CollSeq *
18470 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20  *apColl;        
18480 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
18490 69 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79  ing through pKey
184a0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f  Info->aColl[] */
184b0 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  .    int nCol;  
184c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
184e0 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c  columns in resul
184f0 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73  t set */..    as
18500 73 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d  sert( p->pNext==
18510 30 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  0 );.    nCol = 
18520 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
18530 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
18540 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
18550 6c 6c 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c 20 31  lloc(db, nCol, 1
18560 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79  );.    if( !pKey
18570 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63  Info ){.      rc
18580 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
18590 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
185a0 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
185b0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  d;.    }.    for
185c0 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65  (i=0, apColl=pKe
185d0 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c  yInfo->aColl; i<
185e0 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c  nCol; i++, apCol
185f0 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43  l++){.      *apC
18600 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  oll = multiSelec
18610 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
18620 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66   p, i);.      if
18630 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a  ( 0==*apColl ){.
18640 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20          *apColl 
18650 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
18660 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
18670 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b      for(pLoop=p;
18680 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
18690 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  oop->pPrior){.  
186a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32      for(i=0; i<2
186b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
186c0 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70  int addr = pLoop
186d0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69  ->addrOpenEphm[i
186e0 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ];.        if( a
186f0 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ddr<0 ){.       
18700 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20     /* If [0] is 
18710 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20  unused then [1] 
18720 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20  is also unused. 
18730 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20   So we can.     
18740 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73       ** always s
18750 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73  afely abort as s
18760 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73 74  oon as the first
18770 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20   unused slot is 
18780 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20  found */.       
18790 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70     assert( pLoop
187a0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
187b0 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ]<0 );.         
187c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
187d0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
187e0 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
187f0 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20   addr, nCol);.  
18800 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18810 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64  eChangeP4(v, add
18820 72 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65  r, (char*)sqlite
18830 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79  3KeyInfoRef(pKey
18840 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20  Info),.         
18850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18860 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a     P4_KEYINFO);.
18870 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61          pLoop->a
18880 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d  ddrOpenEphm[i] =
18890 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
188a0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4b 65   }.    sqlite3Ke
188b0 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49  yInfoUnref(pKeyI
188c0 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69  nfo);.  }..multi
188d0 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70  _select_end:.  p
188e0 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 64 65  Dest->iSdst = de
188f0 73 74 2e 69 53 64 73 74 3b 0a 20 20 70 44 65 73  st.iSdst;.  pDes
18900 74 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73 74 2e  t->nSdst = dest.
18910 6e 53 64 73 74 3b 0a 20 20 73 71 6c 69 74 65 33  nSdst;.  sqlite3
18920 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
18930 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74   pDelete);.  ret
18940 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
18950 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
18960 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
18970 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20  */../*.** Error 
18980 6d 65 73 73 61 67 65 20 66 6f 72 20 77 68 65 6e  message for when
18990 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72   two or more ter
189a0 6d 73 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  ms of a compound
189b0 20 73 65 6c 65 63 74 20 68 61 76 65 20 64 69 66   select have dif
189c0 66 65 72 65 6e 74 0a 2a 2a 20 73 69 7a 65 20 72  ferent.** size r
189d0 65 73 75 6c 74 20 73 65 74 73 2e 0a 2a 2f 0a 76  esult sets..*/.v
189e0 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
189f0 74 57 72 6f 6e 67 4e 75 6d 54 65 72 6d 73 45 72  tWrongNumTermsEr
18a00 72 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ror(Parse *pPars
18a10 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
18a20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
18a30 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a   & SF_Values ){.
18a40 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
18a50 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 6c 6c  Msg(pParse, "all
18a60 20 56 41 4c 55 45 53 20 6d 75 73 74 20 68 61 76   VALUES must hav
18a70 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
18a80 72 20 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20 20  r of terms");.  
18a90 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
18aa0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
18ab0 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74  e, "SELECTs to t
18ac0 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
18ad0 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22  t of %s".      "
18ae0 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65   do not have the
18af0 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
18b00 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c  result columns",
18b10 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
18b20 3e 6f 70 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  >op));.  }.}../*
18b30 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70  .** Code an outp
18b40 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f  ut subroutine fo
18b50 72 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d  r a coroutine im
18b60 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
18b70 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  a.** SELECT stat
18b80 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
18b90 64 61 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75  data to be outpu
18ba0 74 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  t is contained i
18bb0 6e 20 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54  n pIn->iSdst.  T
18bc0 68 65 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d  here are.** pIn-
18bd0 3e 6e 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74  >nSdst columns t
18be0 6f 20 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44  o be output.  pD
18bf0 65 73 74 20 69 73 20 77 68 65 72 65 20 74 68 65  est is where the
18c00 20 6f 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a   output should.*
18c10 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a  * be sent..**.**
18c20 20 72 65 67 52 65 74 75 72 6e 20 69 73 20 74 68   regReturn is th
18c30 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
18c40 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  register holding
18c50 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a   the subroutine.
18c60 2a 2a 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  ** return addres
18c70 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50  s..**.** If regP
18c80 72 65 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73  rev>0 then it is
18c90 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73   the first regis
18ca0 74 65 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20  ter in a vector 
18cb0 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20  that.** records 
18cc0 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74  the previous out
18cd0 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65  put.  mem[regPre
18ce0 76 5d 20 69 73 20 61 20 66 6c 61 67 20 74 68 61  v] is a flag tha
18cf0 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66  t is false.** if
18d00 20 74 68 65 72 65 20 68 61 73 20 62 65 65 6e 20   there has been 
18d10 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70  no previous outp
18d20 75 74 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e  ut.  If regPrev>
18d30 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a  0 then code is.*
18d40 2a 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73  * generated to s
18d50 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74  uppress duplicat
18d60 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73  es.  pKeyInfo is
18d70 20 75 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72   used for compar
18d80 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a  ing.** keys..**.
18d90 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20  ** If the LIMIT 
18da0 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d  found in p->iLim
18db0 69 74 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a  it is reached, j
18dc0 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ump immediately 
18dd0 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f  to.** iBreak..*/
18de0 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65  .static int gene
18df0 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75  rateOutputSubrou
18e00 74 69 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70  tine(.  Parse *p
18e10 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
18e20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
18e30 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
18e40 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
18e50 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
18e60 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c  atement */.  Sel
18e70 65 63 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20  ectDest *pIn,   
18e80 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e       /* Coroutin
18e90 65 20 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61  e supplying data
18ea0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
18eb0 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a   *pDest,      /*
18ec0 20 57 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74   Where to send t
18ed0 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  he data */.  int
18ee0 20 72 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20   regReturn,     
18ef0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
18f00 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73  rn address regis
18f10 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ter */.  int reg
18f20 50 72 65 76 2c 20 20 20 20 20 20 20 20 20 20 20  Prev,           
18f30 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73   /* Previous res
18f40 75 6c 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e  ult register.  N
18f50 6f 20 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20  o uniqueness if 
18f60 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  0 */.  KeyInfo *
18f70 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f  pKeyInfo,      /
18f80 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20  * For comparing 
18f90 77 69 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e  with previous en
18fa0 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72  try */.  int iBr
18fb0 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  eak             
18fc0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
18fd0 20 77 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49   we hit the LIMI
18fe0 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  T */.){.  Vdbe *
18ff0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
19000 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  e;.  int iContin
19010 75 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  ue;.  int addr;.
19020 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  .  addr = sqlite
19030 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
19040 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65  (v);.  iContinue
19050 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
19060 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f  keLabel(v);..  /
19070 2a 20 53 75 70 70 72 65 73 73 20 64 75 70 6c 69  * Suppress dupli
19080 63 61 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c  cates for UNION,
19090 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54   EXCEPT, and INT
190a0 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69  ERSECT .  */.  i
190b0 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20  f( regPrev ){.  
190c0 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64    int addr1, add
190d0 72 32 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20  r2;.    addr1 = 
190e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
190f0 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72  1(v, OP_IfNot, r
19100 65 67 50 72 65 76 29 3b 20 56 64 62 65 43 6f 76  egPrev); VdbeCov
19110 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 61 64  erage(v);.    ad
19120 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
19130 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
19140 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 53 64 73  mpare, pIn->iSds
19150 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49  t, regPrev+1, pI
19160 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20 20 20 20 20  n->nSdst,.      
19170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19180 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 73          (char*)s
19190 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66  qlite3KeyInfoRef
191a0 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b  (pKeyInfo), P4_K
191b0 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c  EYINFO);.    sql
191c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
191d0 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 32  , OP_Jump, addr2
191e0 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 61  +2, iContinue, a
191f0 64 64 72 32 2b 32 29 3b 20 56 64 62 65 43 6f 76  ddr2+2); VdbeCov
19200 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
19210 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
19220 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20  e(v, addr1);.   
19230 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19240 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  p3(v, OP_Copy, p
19250 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72  In->iSdst, regPr
19260 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  ev+1, pIn->nSdst
19270 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  -1);.    sqlite3
19280 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19290 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67  _Integer, 1, reg
192a0 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Prev);.  }.  if(
192b0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
192c0 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
192d0 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70  rn 0;..  /* Supp
192e0 72 65 73 73 20 74 68 65 20 66 69 72 73 74 20 4f  ress the first O
192f0 46 46 53 45 54 20 65 6e 74 72 69 65 73 20 69 66  FFSET entries if
19300 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46   there is an OFF
19310 53 45 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  SET clause.  */.
19320 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
19330 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e  p->iOffset, iCon
19340 74 69 6e 75 65 29 3b 0a 0a 20 20 61 73 73 65 72  tinue);..  asser
19350 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  t( pDest->eDest!
19360 3d 53 52 54 5f 45 78 69 73 74 73 20 29 3b 0a 20  =SRT_Exists );. 
19370 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e   assert( pDest->
19380 65 44 65 73 74 21 3d 53 52 54 5f 54 61 62 6c 65  eDest!=SRT_Table
19390 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 44   );.  switch( pD
193a0 65 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20  est->eDest ){.  
193b0 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72    /* Store the r
193c0 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73  esult as data us
193d0 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79  ing a unique key
193e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
193f0 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20  e SRT_EphemTab: 
19400 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d  {.      int r1 =
19410 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
19420 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
19430 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74    int r2 = sqlit
19440 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
19450 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
19460 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
19470 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
19480 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d  pIn->iSdst, pIn-
19490 3e 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20 20 20  >nSdst, r1);.   
194a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
194b0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
194c0 77 69 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  wid, pDest->iSDP
194d0 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  arm, r2);.      
194e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
194f0 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
19500 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
19510 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  r1, r2);.      s
19520 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
19530 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
19540 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  END);.      sqli
19550 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
19560 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
19570 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
19580 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
19590 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
195a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
195b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
195c0 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20  SUBQUERY.    /* 
195d0 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69  If we are creati
195e0 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20  ng a set for an 
195f0 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54  "expr IN (SELECT
19600 20 2e 2e 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a 20   ...)"..    */. 
19610 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
19620 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b   {.      int r1;
19630 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19640 20 70 49 6e 2d 3e 6e 53 64 73 74 3e 31 20 29 3b   pIn->nSdst>1 );
19650 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
19660 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
19670 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
19680 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
19690 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
196a0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e   pIn->iSdst, pIn
196b0 2d 3e 6e 53 64 73 74 2c 20 0a 20 20 20 20 20 20  ->nSdst, .      
196c0 20 20 20 20 72 31 2c 20 70 44 65 73 74 2d 3e 7a      r1, pDest->z
196d0 41 66 66 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  AffSdst, pIn->nS
196e0 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dst);.      sqli
196f0 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
19700 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
19710 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  e, pIn->iSdst, p
19720 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20  In->nSdst);.    
19730 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19740 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78  Op4Int(v, OP_Idx
19750 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69  Insert, pDest->i
19760 53 44 50 61 72 6d 2c 20 72 31 2c 0a 20 20 20 20  SDParm, r1,.    
19770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19780 20 20 20 20 20 20 20 70 49 6e 2d 3e 69 53 64 73         pIn->iSds
19790 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  t, pIn->nSdst);.
197a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
197b0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
197c0 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
197d0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
197e0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
197f0 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74   scalar select t
19800 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
19810 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  n expression, th
19820 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  en.    ** store 
19830 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
19840 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
19850 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62  emory cell and b
19860 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20  reak out.    ** 
19870 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70  of the scan loop
19880 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
19890 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
198a0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e     assert( pIn->
198b0 6e 53 64 73 74 3d 3d 31 20 7c 7c 20 70 50 61 72  nSdst==1 || pPar
198c0 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 20 20 74  se->nErr>0 );  t
198d0 65 73 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53  estcase( pIn->nS
198e0 64 73 74 21 3d 31 20 29 3b 0a 20 20 20 20 20 20  dst!=1 );.      
198f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
19900 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  ove(pParse, pIn-
19910 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69  >iSdst, pDest->i
19920 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20  SDParm, 1);.    
19930 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
19940 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20  lause will jump 
19950 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
19960 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
19970 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
19980 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
19990 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
199a0 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54  ERY */..    /* T
199b0 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73  he results are s
199c0 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65  tored in a seque
199d0 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nce of registers
199e0 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67  .    ** starting
199f0 20 61 74 20 70 44 65 73 74 2d 3e 69 53 64 73 74   at pDest->iSdst
19a00 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d 72  .  Then the co-r
19a10 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20  outine yields.. 
19a20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
19a30 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a  RT_Coroutine: {.
19a40 20 20 20 20 20 20 69 66 28 20 70 44 65 73 74 2d        if( pDest-
19a50 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20  >iSdst==0 ){.   
19a60 20 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73       pDest->iSds
19a70 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  t = sqlite3GetTe
19a80 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
19a90 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
19aa0 20 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64 73       pDest->nSds
19ab0 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a  t = pIn->nSdst;.
19ac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
19ad0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
19ae0 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
19af0 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 64  Sdst, pDest->iSd
19b00 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
19b10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19b20 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
19b30 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44  ield, pDest->iSD
19b40 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72 65  Parm);.      bre
19b50 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
19b60 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65  * If none of the
19b70 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65   above, then the
19b80 20 72 65 73 75 6c 74 20 64 65 73 74 69 6e 61 74   result destinat
19b90 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20 20 20  ion must be.    
19ba0 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e 20 20  ** SRT_Output.  
19bb0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
19bc0 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74  never called wit
19bd0 68 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 20 20  h any other.    
19be0 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f  ** destination o
19bf0 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e  ther than the on
19c00 65 73 20 68 61 6e 64 6c 65 64 20 61 62 6f 76 65  es handled above
19c10 20 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a   or SRT_Output..
19c20 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
19c30 72 20 53 52 54 5f 4f 75 74 70 75 74 2c 20 72 65  r SRT_Output, re
19c40 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64  sults are stored
19c50 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f   in a sequence o
19c60 66 20 72 65 67 69 73 74 65 72 73 2e 20 20 0a 20  f registers.  . 
19c70 20 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f     ** Then the O
19c80 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f  P_ResultRow opco
19c90 64 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 61  de is used to ca
19ca0 75 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  use sqlite3_step
19cb0 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74  () to.    ** ret
19cc0 75 72 6e 20 74 68 65 20 6e 65 78 74 20 72 6f 77  urn the next row
19cd0 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20 20   of result..    
19ce0 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  */.    default: 
19cf0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
19d00 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
19d10 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20  T_Output );.    
19d20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19d30 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
19d40 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  Row, pIn->iSdst,
19d50 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
19d60 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
19d70 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
19d80 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ge(pParse, pIn->
19d90 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
19da0 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
19db0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
19dc0 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64   Jump to the end
19dd0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20   of the loop if 
19de0 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61  the LIMIT is rea
19df0 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ched..  */.  if(
19e00 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20   p->iLimit ){.  
19e10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19e20 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75  Op2(v, OP_DecrJu
19e30 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69  mpZero, p->iLimi
19e40 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65  t, iBreak); Vdbe
19e50 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
19e60 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
19e70 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72  the subroutine r
19e80 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c  eturn.  */.  sql
19e90 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
19ea0 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75  abel(v, iContinu
19eb0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
19ec0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
19ed0 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72 6e 29  turn, regReturn)
19ee0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  ;..  return addr
19ef0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72  ;.}../*.** Alter
19f00 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20  native compound 
19f10 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65 6e 65  select code gene
19f20 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65 73 20  rator for cases 
19f30 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73  when there.** is
19f40 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
19f50 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73  use..**.** We as
19f60 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f 66 20  sume a query of 
19f70 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f  the following fo
19f80 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c  rm:.**.**      <
19f90 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72 61  selectA>  <opera
19fa0 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20  tor>  <selectB> 
19fb0 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64 65 72   ORDER BY <order
19fc0 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f  bylist>.**.** <o
19fd0 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20  perator> is one 
19fe0 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e  of UNION ALL, UN
19ff0 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20  ION, EXCEPT, or 
1a000 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68 65 20  INTERSECT.  The 
1a010 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f  idea.** is to co
1a020 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63 74 41  de both <selectA
1a030 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20  > and <selectB> 
1a040 77 69 74 68 20 74 68 65 20 4f 52 44 45 52 20 42  with the ORDER B
1a050 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63  Y clause as.** c
1a060 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54 68 65  o-routines.  The
1a070 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75  n run the co-rou
1a080 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c 65  tines in paralle
1a090 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20  l and merge the 
1a0a0 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20  results.** into 
1a0b0 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49 6e 20  the output.  In 
1a0c0 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 20  addition to the 
1a0d0 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 28  two coroutines (
1a0e0 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41 20 61  called selectA a
1a0f0 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20 74  nd.** selectB) t
1a100 68 65 72 65 20 61 72 65 20 37 20 73 75 62 72 6f  here are 7 subro
1a110 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  utines:.**.**   
1a120 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65 20 74   outA:    Move t
1a130 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65  he output of the
1a140 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75 74 69   selectA corouti
1a150 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  ne into the outp
1a160 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
1a170 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e    of the compoun
1a180 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  d query..**.**  
1a190 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65 20    outB:    Move 
1a1a0 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68  the output of th
1a1b0 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f 75 74  e selectB corout
1a1c0 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ine into the out
1a1d0 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  put.**          
1a1e0 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75     of the compou
1a1f0 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79  nd query.  (Only
1a200 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 55   generated for U
1a210 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20  NION and.**     
1a220 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
1a230 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64 20 49  L.  EXCEPT and I
1a240 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65 72 20  NSERTSECT never 
1a250 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74 68 61  output a row tha
1a260 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1a270 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e   appears only in
1a280 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c   B.).**.**    Al
1a290 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  tB:    Called wh
1a2a0 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61  en there is data
1a2b0 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75   from both corou
1a2c0 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a  tines and A<B..*
1a2d0 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 20 20  *.**    AeqB:   
1a2e0 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
1a2f0 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20  re is data from 
1a300 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20  both coroutines 
1a310 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20  and A==B..**.** 
1a320 20 20 20 41 67 74 42 3a 20 20 20 20 43 61 6c 6c     AgtB:    Call
1a330 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
1a340 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20   data from both 
1a350 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41  coroutines and A
1a360 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66  >B..**.**    Eof
1a370 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  A:    Called whe
1a380 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73  n data is exhaus
1a390 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 41  ted from selectA
1a3a0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a  ..**.**    EofB:
1a3b0 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
1a3c0 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65  data is exhauste
1a3d0 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a  d from selectB..
1a3e0 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  **.** The implem
1a3f0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
1a400 6c 61 74 74 65 72 20 66 69 76 65 20 73 75 62 72  latter five subr
1a410 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64 20 6f  outines depend o
1a420 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65  n which .** <ope
1a430 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a  rator> is used:.
1a440 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  **.**.**        
1a450 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20       UNION ALL  
1a460 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20 20 20         UNION    
1a470 20 20 20 20 20 20 20 20 45 58 43 45 50 54 20 20          EXCEPT  
1a480 20 20 20 20 20 20 20 20 49 4e 54 45 52 53 45 43          INTERSEC
1a490 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d 2d  T.**          --
1a4a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d  -----------  ---
1a4b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
1a4c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
1a4d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a4e0 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f  -.**   AltB:   o
1a4f0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
1a500 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
1a510 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
1a520 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a        nextA.**.*
1a530 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74 41  *   AeqB:   outA
1a540 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
1a550 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 20 20  nextA           
1a560 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20    nextA         
1a570 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a  outA, nextA.**.*
1a580 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75 74 42  *   AgtB:   outB
1a590 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74  , nextB      out
1a5a0 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20  B, nextB        
1a5b0 20 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20    nextB         
1a5c0 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20     nextB.**.**  
1a5d0 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e   EofA:   outB, n
1a5e0 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20  extB      outB, 
1a5f0 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20 68  nextB          h
1a600 61 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20  alt             
1a610 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66  halt.**.**   Eof
1a620 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41  B:   outA, nextA
1a630 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
1a640 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  A       outA, ne
1a650 78 74 41 20 20 20 20 20 20 20 20 20 68 61 6c 74  xtA         halt
1a660 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c  .**.** In the Al
1a670 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20 41 67  tB, AeqB, and Ag
1a680 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73 2c 20  tB subroutines, 
1a690 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c  an EOF on A foll
1a6a0 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63  owing nextA.** c
1a6b0 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64 69 61  auses an immedia
1a6c0 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20  te jump to EofA 
1a6d0 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20  and an EOF on B 
1a6e0 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20  following nextB 
1a6f0 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d  causes.** an imm
1a700 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45  ediate jump to E
1a710 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45 6f 66  ofB.  Within Eof
1a720 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20  A and EofB, and 
1a730 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a  EOF on entry or.
1a740 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78  ** following nex
1a750 74 58 20 63 61 75 73 65 73 20 61 20 6a 75 6d 70  tX causes a jump
1a760 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
1a770 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63 65 73  he select proces
1a780 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c  sing..**.** Dupl
1a790 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e  icate removal in
1a7a0 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45   the UNION, EXCE
1a7b0 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43  PT, and INTERSEC
1a7c0 54 20 63 61 73 65 73 20 69 73 20 68 61 6e 64 6c  T cases is handl
1a7d0 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ed.** within the
1a7e0 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
1a7f0 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72 65 76  ne.  The regPrev
1a800 20 72 65 67 69 73 74 65 72 20 73 65 74 20 68 6f   register set ho
1a810 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  lds the previous
1a820 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c  ly.** output val
1a830 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69 73 6f  ue.  A compariso
1a840 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69 6e 73  n is made agains
1a850 74 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e 64  t this value and
1a860 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69   the output.** i
1a870 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65  s skipped if the
1a880 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20 77 6f   next results wo
1a890 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65 20  uld be the same 
1a8a0 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e  as the previous.
1a8b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  .**.** The imple
1a8c0 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69  mentation plan i
1a8d0 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  s to implement t
1a8e0 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65  he two coroutine
1a8f0 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73  s and seven.** s
1a900 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72 73 74  ubroutines first
1a910 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65 20 63  , then put the c
1a920 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20  ontrol logic at 
1a930 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b  the bottom.  Lik
1a940 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
1a950 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e 69 74         goto Init
1a960 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f 72  .**     coA: cor
1a970 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20  outine for left 
1a980 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20 20 20  query (A).**    
1a990 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20   coB: coroutine 
1a9a0 66 6f 72 20 72 69 67 68 74 20 71 75 65 72 79 20  for right query 
1a9b0 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20  (B).**    outA: 
1a9c0 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f  output one row o
1a9d0 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20  f A.**    outB: 
1a9e0 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f  output one row o
1a9f0 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55  f B (UNION and U
1aa00 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a  NION ALL only).*
1aa10 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a  *    EofA: ....*
1aa20 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a  *    EofB: ....*
1aa30 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a  *    AltB: ....*
1aa40 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a  *    AeqB: ....*
1aa50 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a  *    AgtB: ....*
1aa60 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69 74 69  *    Init: initi
1aa70 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20  alize coroutine 
1aa80 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20 20  registers.**    
1aa90 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 41 0a        yield coA.
1aaa0 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65  **          if e
1aab0 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a  of(A) goto EofA.
1aac0 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c  **          yiel
1aad0 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20  d coB.**        
1aae0 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f 74 6f    if eof(B) goto
1aaf0 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72   EofB.**    Cmpr
1ab00 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a  : Compare A, B.*
1ab10 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20  *          Jump 
1ab20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42  AltB, AeqB, AgtB
1ab30 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e  .**     End: ...
1ab40 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41  .**.** We call A
1ab50 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 2c  ltB, AeqB, AgtB,
1ab60 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42 20   EofA, and EofB 
1ab70 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20 62 75  "subroutines" bu
1ab80 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a  t they are not.*
1ab90 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65  * actually calle
1aba0 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20 61 6e  d using Gosub an
1abb0 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 52 65  d they do not Re
1abc0 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20  turn.  EofA and 
1abd0 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74  EofB loop.** unt
1abe0 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73 20 65  il all data is e
1abf0 78 68 61 75 73 74 65 64 20 74 68 65 6e 20 6a 75  xhausted then ju
1ac00 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64 22 20  mp to the "end" 
1ac10 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41 65 71  labe.  AltB, Aeq
1ac20 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a  B,.** and AgtB j
1ac30 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20 4c 32  ump to either L2
1ac40 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f   or to one of Eo
1ac50 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23  fA or EofB..*/.#
1ac60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1ac70 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
1ac80 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  CT.static int mu
1ac90 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
1aca0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1acb0 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
1acc0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1acd0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
1ace0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
1acf0 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  ight-most of SEL
1ad00 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64  ECTs to be coded
1ad10 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
1ad20 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
1ad30 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
1ad40 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
1ad50 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  ){.  int i, j;  
1ad60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1ad70 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
1ad80 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b   Select *pPrior;
1ad90 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65         /* Anothe
1ada0 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61  r SELECT immedia
1adb0 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74  tely to our left
1adc0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
1add0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
1ade0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1adf0 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53  this VDBE */.  S
1ae00 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 41 3b  electDest destA;
1ae10 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74       /* Destinat
1ae20 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e  ion for coroutin
1ae30 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  e A */.  SelectD
1ae40 65 73 74 20 64 65 73 74 42 3b 20 20 20 20 20 2f  est destB;     /
1ae50 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f  * Destination fo
1ae60 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f  r coroutine B */
1ae70 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 41 3b  .  int regAddrA;
1ae80 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
1ae90 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
1aea0 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74   select-A corout
1aeb0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
1aec0 41 64 64 72 42 3b 20 20 20 20 20 20 20 20 20 2f  AddrB;         /
1aed0 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
1aee0 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 42 20  er for select-B 
1aef0 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  coroutine */.  i
1af00 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41 3b 20  nt addrSelectA; 
1af10 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1af20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 20  of the select-A 
1af30 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  coroutine */.  i
1af40 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42 3b 20  nt addrSelectB; 
1af50 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1af60 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 20  of the select-B 
1af70 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  coroutine */.  i
1af80 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20 20 20  nt regOutA;     
1af90 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1afa0 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65  register for the
1afb0 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75   output-A subrou
1afc0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
1afd0 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20 20 20  gOutB;          
1afe0 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
1aff0 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70  ter for the outp
1b000 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-B subroutine 
1b010 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74  */.  int addrOut
1b020 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  A;         /* Ad
1b030 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74  dress of the out
1b040 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65  put-A subroutine
1b050 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75   */.  int addrOu
1b060 74 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41  tB = 0;     /* A
1b070 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75  ddress of the ou
1b080 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  tput-B subroutin
1b090 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45  e */.  int addrE
1b0a0 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ofA;         /* 
1b0b0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73  Address of the s
1b0c0 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73 74 65  elect-A-exhauste
1b0d0 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  d subroutine */.
1b0e0 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41 5f 6e    int addrEofA_n
1b0f0 6f 42 3b 20 20 20 20 20 2f 2a 20 41 6c 74 65 72  oB;     /* Alter
1b100 6e 61 74 65 20 61 64 64 72 45 6f 66 41 20 69 66  nate addrEofA if
1b110 20 42 20 69 73 20 75 6e 69 6e 69 74 69 61 6c 69   B is uninitiali
1b120 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  zed */.  int add
1b130 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20 2f  rEofB;         /
1b140 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
1b150 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61 75 73   select-B-exhaus
1b160 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ted subroutine *
1b170 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c 74 42  /.  int addrAltB
1b180 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
1b190 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c 42 20  ress of the A<B 
1b1a0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
1b1b0 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20 20 20  int addrAeqB;   
1b1c0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1b1d0 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73 75 62   of the A==B sub
1b1e0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1b1f0 20 61 64 64 72 41 67 74 42 3b 20 20 20 20 20 20   addrAgtB;      
1b200 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
1b210 20 74 68 65 20 41 3e 42 20 73 75 62 72 6f 75 74   the A>B subrout
1b220 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
1b230 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20 20 2f  LimitA;        /
1b240 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72  * Limit register
1b250 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f   for select-A */
1b260 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 42  .  int regLimitB
1b270 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69  ;        /* Limi
1b280 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  t register for s
1b290 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74  elect-A */.  int
1b2a0 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20 20   regPrev;       
1b2b0 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66     /* A range of
1b2c0 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f   registers to ho
1b2d0 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70  ld previous outp
1b2e0 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65  ut */.  int save
1b2f0 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a  dLimit;       /*
1b300 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20   Saved value of 
1b310 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69  p->iLimit */.  i
1b320 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74 3b 20  nt savedOffset; 
1b330 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61       /* Saved va
1b340 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65  lue of p->iOffse
1b350 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c  t */.  int label
1b360 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  Cmpr;        /* 
1b370 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 73 74  Label for the st
1b380 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72 67 65  art of the merge
1b390 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20   algorithm */.  
1b3a0 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20  int labelEnd;   
1b3b0 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66        /* Label f
1b3c0 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  or the end of th
1b3d0 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43 54  e overall SELECT
1b3e0 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 61   stmt */.  int a
1b3f0 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  ddr1;           
1b400 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75 63   /* Jump instruc
1b410 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74 20 72  tions that get r
1b420 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a 20 20  etargetted */.  
1b430 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
1b440 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
1b450 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e  TK_ALL, TK_UNION
1b460 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f  , TK_EXCEPT, TK_
1b470 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b  INTERSECT */.  K
1b480 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20  eyInfo *pKeyDup 
1b490 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73  = 0; /* Comparis
1b4a0 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  on information f
1b4b0 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72 65 6d  or duplicate rem
1b4c0 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  oval */.  KeyInf
1b4d0 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20 20  o *pKeyMerge;   
1b4e0 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e  /* Comparison in
1b4f0 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65  formation for me
1b500 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20  rging rows */.  
1b510 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
1b520 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1b530 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
1b540 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
1b550 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f  erBy;   /* The O
1b560 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
1b570 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79  /.  int nOrderBy
1b580 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
1b590 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
1b5a0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1b5b0 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50  use */.  int *aP
1b5c0 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20 20 2f  ermute;        /
1b5d0 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f  * Mapping from O
1b5e0 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f  RDER BY terms to
1b5f0 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75   result set colu
1b600 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  mns */.#ifndef S
1b610 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
1b620 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 3b 20  IN.  int iSub1; 
1b630 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51             /* EQ
1b640 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e  P id of left-han
1b650 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  d query */.  int
1b660 20 69 53 75 62 32 3b 20 20 20 20 20 20 20 20 20   iSub2;         
1b670 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20     /* EQP id of 
1b680 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72 79  right-hand query
1b690 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73   */.#endif..  as
1b6a0 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
1b6b0 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y!=0 );.  assert
1b6c0 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b 20  ( pKeyDup==0 ); 
1b6d0 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63 6f 64  /* "Managed" cod
1b6e0 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20 20 54  e needs this.  T
1b6f0 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f 0a  icket #3382. */.
1b700 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
1b710 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  b;.  v = pParse-
1b720 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
1b730 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20  ( v!=0 );       
1b740 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72 6f 77  /* Already throw
1b750 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66 20 56  n the error if V
1b760 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65 64  DBE alloc failed
1b770 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d   */.  labelEnd =
1b780 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1b790 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65  Label(v);.  labe
1b7a0 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56  lCmpr = sqlite3V
1b7b0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1b7c0 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75 70  ...  /* Patch up
1b7d0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1b7e0 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d  ause.  */.  op =
1b7f0 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69   p->op;  .  pPri
1b800 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  or = p->pPrior;.
1b810 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
1b820 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
1b830 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  .  pOrderBy = p-
1b840 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73  >pOrderBy;.  ass
1b850 65 72 74 28 20 70 4f 72 64 65 72 42 79 20 29 3b  ert( pOrderBy );
1b860 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f  .  nOrderBy = pO
1b870 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a  rderBy->nExpr;..
1b880 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f    /* For operato
1b890 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e  rs other than UN
1b8a0 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20  ION ALL we have 
1b8b0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
1b8c0 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52  t.  ** the ORDER
1b8d0 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72   BY clause cover
1b8e0 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20  s every term of 
1b8f0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
1b900 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20   Add.  ** terms 
1b910 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
1b920 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73 73  clause as necess
1b930 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ary..  */.  if( 
1b940 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op!=TK_ALL ){.  
1b950 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d    for(i=1; db->m
1b960 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26  allocFailed==0 &
1b970 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  & i<=p->pEList->
1b980 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
1b990 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
1b9a0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1b9b0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
1b9c0 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61  Item=pOrderBy->a
1b9d0 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b  ; j<nOrderBy; j+
1b9e0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
1b9f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
1ba00 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
1ba10 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Col>0 );.       
1ba20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e   if( pItem->u.x.
1ba30 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 69 20 29  iOrderByCol==i )
1ba40 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1ba50 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72        if( j==nOr
1ba60 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
1ba70 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71   Expr *pNew = sq
1ba80 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
1ba90 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20 20  _INTEGER, 0);.  
1baa0 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d        if( pNew==
1bab0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
1bac0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
1bad0 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67        pNew->flag
1bae0 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65  s |= EP_IntValue
1baf0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
1bb00 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20  u.iValue = i;.  
1bb10 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
1bb20 79 20 3d 20 70 4f 72 64 65 72 42 79 20 3d 20 73  y = pOrderBy = s
1bb30 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
1bb40 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72  pend(pParse, pOr
1bb50 64 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20  derBy, pNew);.  
1bb60 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
1bb70 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61  By ) pOrderBy->a
1bb80 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78  [nOrderBy++].u.x
1bb90 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28  .iOrderByCol = (
1bba0 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20  u16)i;.      }. 
1bbb0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
1bbc0 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61  ompute the compa
1bbd0 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f  rison permutatio
1bbe0 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68  n and keyinfo th
1bbf0 61 74 20 69 73 20 75 73 65 64 20 77 69 74 68 0a  at is used with.
1bc00 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61    ** the permuta
1bc10 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74  tion used to det
1bc20 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65  ermine if the ne
1bc30 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72  xt.  ** row of r
1bc40 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f  esults comes fro
1bc50 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c  m selectA or sel
1bc60 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20  ectB.  Also add 
1bc70 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f  explicit.  ** co
1bc80 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  llations to the 
1bc90 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1bca0 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68  terms so that wh
1bcb0 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 69 65  en the subquerie
1bcc0 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69  s.  ** to the ri
1bcd0 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74  ght and the left
1bce0 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20   are evaluated, 
1bcf0 74 68 65 79 20 75 73 65 20 74 68 65 20 63 6f 72  they use the cor
1bd00 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74  rect.  ** collat
1bd10 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72  ion..  */.  aPer
1bd20 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62  mute = sqlite3Db
1bd30 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
1bd40 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 4f 72  sizeof(int)*(nOr
1bd50 64 65 72 42 79 20 2b 20 31 29 29 3b 0a 20 20 69  derBy + 1));.  i
1bd60 66 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20  f( aPermute ){. 
1bd70 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
1bd80 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1bd90 20 20 20 20 61 50 65 72 6d 75 74 65 5b 30 5d 20      aPermute[0] 
1bda0 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = nOrderBy;.    
1bdb0 66 6f 72 28 69 3d 31 2c 20 70 49 74 65 6d 3d 70  for(i=1, pItem=p
1bdc0 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 3d 6e  OrderBy->a; i<=n
1bdd0 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49  OrderBy; i++, pI
1bde0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  tem++){.      as
1bdf0 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78  sert( pItem->u.x
1be00 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29  .iOrderByCol>0 )
1be10 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1be20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
1be30 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73  rByCol<=p->pELis
1be40 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
1be50 20 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20    aPermute[i] = 
1be60 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
1be70 72 42 79 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20  rByCol - 1;.    
1be80 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20  }.    pKeyMerge 
1be90 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  = multiSelectOrd
1bea0 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72  erByKeyInfo(pPar
1beb0 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 7d 65 6c  se, p, 1);.  }el
1bec0 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67  se{.    pKeyMerg
1bed0 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
1bee0 20 52 65 61 74 74 61 63 68 20 74 68 65 20 4f 52   Reattach the OR
1bef0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f  DER BY clause to
1bf00 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f   the query..  */
1bf10 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d  .  p->pOrderBy =
1bf20 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72   pOrderBy;.  pPr
1bf30 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  ior->pOrderBy = 
1bf40 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
1bf50 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
1bf60 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20  OrderBy, 0);..  
1bf70 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61  /* Allocate a ra
1bf80 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79  nge of temporary
1bf90 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74   registers and t
1bfa0 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65  he KeyInfo neede
1bfb0 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c  d.  ** for the l
1bfc0 6f 67 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65  ogic that remove
1bfd0 73 20 64 75 70 6c 69 63 61 74 65 20 72 65 73 75  s duplicate resu
1bfe0 6c 74 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65  lt rows when the
1bff0 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69  .  ** operator i
1c000 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  s UNION, EXCEPT,
1c010 20 6f 72 20 49 4e 54 45 52 53 45 43 54 20 28 62   or INTERSECT (b
1c020 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c  ut not UNION ALL
1c030 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  )..  */.  if( op
1c040 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
1c050 72 65 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d  regPrev = 0;.  }
1c060 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45  else{.    int nE
1c070 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
1c080 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  >nExpr;.    asse
1c090 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45  rt( nOrderBy>=nE
1c0a0 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  xpr || db->mallo
1c0b0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72  cFailed );.    r
1c0c0 65 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d  egPrev = pParse-
1c0d0 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
1c0e0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78  rse->nMem += nEx
1c0f0 70 72 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  pr+1;.    sqlite
1c100 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1c110 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
1c120 67 50 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79  gPrev);.    pKey
1c130 44 75 70 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  Dup = sqlite3Key
1c140 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45  InfoAlloc(db, nE
1c150 78 70 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  xpr, 1);.    if(
1c160 20 70 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20   pKeyDup ){.    
1c170 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1c180 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
1c190 62 6c 65 28 70 4b 65 79 44 75 70 29 20 29 3b 0a  ble(pKeyDup) );.
1c1a0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1c1b0 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  <nExpr; i++){.  
1c1c0 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61        pKeyDup->a
1c1d0 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53  Coll[i] = multiS
1c1e0 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
1c1f0 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20  rse, p, i);.    
1c200 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f      pKeyDup->aSo
1c210 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a  rtOrder[i] = 0;.
1c220 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1c230 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72 61 74  }. .  /* Separat
1c240 65 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 74  e the left and t
1c250 68 65 20 72 69 67 68 74 20 71 75 65 72 79 20 66  he right query f
1c260 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a  rom one another.
1c270 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72    */.  p->pPrior
1c280 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e   = 0;.  pPrior->
1c290 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c  pNext = 0;.  sql
1c2a0 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72  ite3ResolveOrder
1c2b0 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20  GroupBy(pParse, 
1c2c0 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  p, p->pOrderBy, 
1c2d0 22 4f 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20  "ORDER");.  if( 
1c2e0 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d  pPrior->pPrior==
1c2f0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1c300 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75  ResolveOrderGrou
1c310 70 42 79 28 70 50 61 72 73 65 2c 20 70 50 72 69  pBy(pParse, pPri
1c320 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  or, pPrior->pOrd
1c330 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a  erBy, "ORDER");.
1c340 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
1c350 65 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69  e the limit regi
1c360 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75  sters */.  compu
1c370 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
1c380 28 70 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65  (pParse, p, labe
1c390 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e  lEnd);.  if( p->
1c3a0 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b  iLimit && op==TK
1c3b0 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c  _ALL ){.    regL
1c3c0 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65  imitA = ++pParse
1c3d0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c  ->nMem;.    regL
1c3e0 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65  imitB = ++pParse
1c3f0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
1c400 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1c410 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66   OP_Copy, p->iOf
1c420 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65  fset ? p->iOffse
1c430 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c  t+1 : p->iLimit,
1c440 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c460 20 20 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20     regLimitA);. 
1c470 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c480 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
1c490 20 72 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c   regLimitA, regL
1c4a0 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b  imitB);.  }else{
1c4b0 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d  .    regLimitA =
1c4c0 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a   regLimitB = 0;.
1c4d0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
1c4e0 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
1c4f0 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69  Limit);.  p->pLi
1c500 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41  mit = 0;..  regA
1c510 64 64 72 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ddrA = ++pParse-
1c520 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72  >nMem;.  regAddr
1c530 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  B = ++pParse->nM
1c540 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20  em;.  regOutA = 
1c550 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1c560 20 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50    regOutB = ++pP
1c570 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71  arse->nMem;.  sq
1c580 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
1c590 6e 69 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f  nit(&destA, SRT_
1c5a0 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
1c5b0 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  drA);.  sqlite3S
1c5c0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
1c5d0 65 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74  estB, SRT_Corout
1c5e0 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a  ine, regAddrB);.
1c5f0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1c600 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76   coroutine to ev
1c610 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43  aluate the SELEC
1c620 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74  T statement to t
1c630 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20  he.  ** left of 
1c640 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65  the compound ope
1c650 72 61 74 6f 72 20 2d 20 74 68 65 20 22 41 22 20  rator - the "A" 
1c660 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 61  select..  */.  a
1c670 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c  ddrSelectA = sql
1c680 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1c690 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 61 64  ddr(v) + 1;.  ad
1c6a0 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
1c6b0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
1c6c0 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  itCoroutine, reg
1c6d0 41 64 64 72 41 2c 20 30 2c 20 61 64 64 72 53 65  AddrA, 0, addrSe
1c6e0 6c 65 63 74 41 29 3b 0a 20 20 56 64 62 65 43 6f  lectA);.  VdbeCo
1c6f0 6d 6d 65 6e 74 28 28 76 2c 20 22 6c 65 66 74 20  mment((v, "left 
1c700 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 70 50 72  SELECT"));.  pPr
1c710 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65  ior->iLimit = re
1c720 67 4c 69 6d 69 74 41 3b 0a 20 20 65 78 70 6c 61  gLimitA;.  expla
1c730 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
1c740 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b1, pParse->iNex
1c750 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71  tSelectId);.  sq
1c760 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
1c770 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73  se, pPrior, &des
1c780 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  tA);.  sqlite3Vd
1c790 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76  beEndCoroutine(v
1c7a0 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73  , regAddrA);.  s
1c7b0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
1c7c0 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20  re(v, addr1);.. 
1c7d0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63   /* Generate a c
1c7e0 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c  oroutine to eval
1c7f0 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20  uate the SELECT 
1c800 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20  statement on .  
1c810 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20 74  ** the right - t
1c820 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20 20  he "B" select.  
1c830 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74 42  */.  addrSelectB
1c840 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
1c850 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31  rrentAddr(v) + 1
1c860 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ;.  addr1 = sqli
1c870 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1c880 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e   OP_InitCoroutin
1c890 65 2c 20 72 65 67 41 64 64 72 42 2c 20 30 2c 20  e, regAddrB, 0, 
1c8a0 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20  addrSelectB);.  
1c8b0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1c8c0 22 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29  "right SELECT"))
1c8d0 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d  ;.  savedLimit =
1c8e0 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61   p->iLimit;.  sa
1c8f0 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69  vedOffset = p->i
1c900 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69  Offset;.  p->iLi
1c910 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b  mit = regLimitB;
1c920 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20  .  p->iOffset = 
1c930 30 3b 20 20 0a 20 20 65 78 70 6c 61 69 6e 53 65  0;  .  explainSe
1c940 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20  tInteger(iSub2, 
1c950 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
1c960 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65  ectId);.  sqlite
1c970 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
1c980 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d  p, &destB);.  p-
1c990 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c  >iLimit = savedL
1c9a0 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73  imit;.  p->iOffs
1c9b0 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74  et = savedOffset
1c9c0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 45  ;.  sqlite3VdbeE
1c9d0 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72  ndCoroutine(v, r
1c9e0 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20  egAddrB);..  /* 
1c9f0 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
1ca00 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
1ca10 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ts the current r
1ca20 6f 77 20 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a  ow of the A.  **
1ca30 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e   select as the n
1ca40 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f  ext output row o
1ca50 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
1ca60 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64  elect..  */.  Vd
1ca70 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
1ca80 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e  , "Output routin
1ca90 65 20 66 6f 72 20 41 22 29 29 3b 0a 20 20 61 64  e for A"));.  ad
1caa0 64 72 4f 75 74 41 20 3d 20 67 65 6e 65 72 61 74  drOutA = generat
1cab0 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
1cac0 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
1cad0 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64             p, &d
1cae0 65 73 74 41 2c 20 70 44 65 73 74 2c 20 72 65 67  estA, pDest, reg
1caf0 4f 75 74 41 2c 0a 20 20 20 20 20 20 20 20 20 20  OutA,.          
1cb00 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20         regPrev, 
1cb10 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e  pKeyDup, labelEn
1cb20 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65  d);.  .  /* Gene
1cb30 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
1cb40 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 74  e that outputs t
1cb50 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f  he current row o
1cb60 66 20 74 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c  f the B.  ** sel
1cb70 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74 20  ect as the next 
1cb80 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68  output row of th
1cb90 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
1cba0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  t..  */.  if( op
1cbb0 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d  ==TK_ALL || op==
1cbc0 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20  TK_UNION ){.    
1cbd0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1cbe0 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74  (v, "Output rout
1cbf0 69 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a 20 20  ine for B"));.  
1cc00 20 20 61 64 64 72 4f 75 74 42 20 3d 20 67 65 6e    addrOutB = gen
1cc10 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f  erateOutputSubro
1cc20 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20  utine(pParse,.  
1cc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1cc40 2c 20 26 64 65 73 74 42 2c 20 70 44 65 73 74 2c  , &destB, pDest,
1cc50 20 72 65 67 4f 75 74 42 2c 0a 20 20 20 20 20 20   regOutB,.      
1cc60 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50 72             regPr
1cc70 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62  ev, pKeyDup, lab
1cc80 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 20 20 73 71  elEnd);.  }.  sq
1cc90 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
1cca0 66 28 70 4b 65 79 44 75 70 29 3b 0a 0a 20 20 2f  f(pKeyDup);..  /
1ccb0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
1ccc0 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77  routine to run w
1ccd0 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  hen the results 
1cce0 66 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20 20  from select A.  
1ccf0 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64  ** are exhausted
1cd00 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69   and only data i
1cd10 6e 20 73 65 6c 65 63 74 20 42 20 72 65 6d 61 69  n select B remai
1cd20 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ns..  */.  if( o
1cd30 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20  p==TK_EXCEPT || 
1cd40 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
1cd50 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 41   ){.    addrEofA
1cd60 5f 6e 6f 42 20 3d 20 61 64 64 72 45 6f 66 41 20  _noB = addrEofA 
1cd70 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a 20 20 7d 65  = labelEnd;.  }e
1cd80 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e  lse{  .    VdbeN
1cd90 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1cda0 65 6f 66 2d 41 20 73 75 62 72 6f 75 74 69 6e 65  eof-A subroutine
1cdb0 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66  "));.    addrEof
1cdc0 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  A = sqlite3VdbeA
1cdd0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
1cde0 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72  b, regOutB, addr
1cdf0 4f 75 74 42 29 3b 0a 20 20 20 20 61 64 64 72 45  OutB);.    addrE
1ce00 6f 66 41 5f 6e 6f 42 20 3d 20 73 71 6c 69 74 65  ofA_noB = sqlite
1ce10 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1ce20 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1ce30 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  B, labelEnd);.  
1ce40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce60 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
1ce70 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
1ce80 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 45  dbeGoto(v, addrE
1ce90 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53 65  ofA);.    p->nSe
1cea0 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  lectRow = sqlite
1ceb0 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53  3LogEstAdd(p->nS
1cec0 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72  electRow, pPrior
1ced0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20  ->nSelectRow);. 
1cee0 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
1cef0 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
1cf00 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72  o run when the r
1cf10 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65  esults from sele
1cf20 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20 65 78  ct B.  ** are ex
1cf30 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79  hausted and only
1cf40 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20   data in select 
1cf50 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a  A remains..  */.
1cf60 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54    if( op==TK_INT
1cf70 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64  ERSECT ){.    ad
1cf80 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45 6f 66  drEofB = addrEof
1cf90 41 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  A;.    if( p->nS
1cfa0 65 6c 65 63 74 52 6f 77 20 3e 20 70 50 72 69 6f  electRow > pPrio
1cfb0 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20  r->nSelectRow ) 
1cfc0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
1cfd0 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
1cfe0 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20  ow;.  }else{  . 
1cff0 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
1d000 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20 73 75  nt((v, "eof-B su
1d010 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
1d020 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71 6c 69   addrEofB = sqli
1d030 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1d040 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
1d050 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20  tA, addrOutA);. 
1d060 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1d070 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1d080 2c 20 72 65 67 41 64 64 72 41 2c 20 6c 61 62 65  , regAddrA, labe
1d090 6c 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65 72  lEnd); VdbeCover
1d0a0 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
1d0b0 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
1d0c0 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20  ddrEofB);.  }.. 
1d0d0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1d0e0 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  e to handle the 
1d0f0 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f  case of A<B.  */
1d100 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
1d110 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73  nt((v, "A-lt-B s
1d120 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
1d130 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74  addrAltB = sqlit
1d140 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d150 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
1d160 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20  A, addrOutA);.  
1d170 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d180 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1d190 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66  egAddrA, addrEof
1d1a0 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  A); VdbeCoverage
1d1b0 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
1d1c0 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43  beGoto(v, labelC
1d1d0 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  mpr);..  /* Gene
1d1e0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e  rate code to han
1d1f0 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20  dle the case of 
1d200 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20  A==B.  */.  if( 
1d210 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op==TK_ALL ){.  
1d220 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64    addrAeqB = add
1d230 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69  rAltB;.  }else i
1d240 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  f( op==TK_INTERS
1d250 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 41  ECT ){.    addrA
1d260 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a  eqB = addrAltB;.
1d270 20 20 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a      addrAltB++;.
1d280 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62    }else{.    Vdb
1d290 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1d2a0 20 22 41 2d 65 71 2d 42 20 73 75 62 72 6f 75 74   "A-eq-B subrout
1d2b0 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72  ine"));.    addr
1d2c0 41 65 71 42 20 3d 0a 20 20 20 20 73 71 6c 69 74  AeqB =.    sqlit
1d2d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d2e0 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1d2f0 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56  rA, addrEofA); V
1d300 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1d310 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
1d320 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72  oto(v, labelCmpr
1d330 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
1d340 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
1d350 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
1d360 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65   A>B.  */.  Vdbe
1d370 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1d380 22 41 2d 67 74 2d 42 20 73 75 62 72 6f 75 74 69  "A-gt-B subrouti
1d390 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 67 74  ne"));.  addrAgt
1d3a0 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  B = sqlite3VdbeC
1d3b0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
1d3c0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
1d3d0 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  || op==TK_UNION 
1d3e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1d3f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1d400 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61  osub, regOutB, a
1d410 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20  ddrOutB);.  }.  
1d420 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d430 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1d440 65 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66  egAddrB, addrEof
1d450 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  B); VdbeCoverage
1d460 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
1d470 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43  beGoto(v, labelC
1d480 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  mpr);..  /* This
1d490 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65 20   code runs once 
1d4a0 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65 76  to initialize ev
1d4b0 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20  erything..  */. 
1d4c0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
1d4d0 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
1d4e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d4f0 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1d500 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45   regAddrA, addrE
1d510 6f 66 41 5f 6e 6f 42 29 3b 20 56 64 62 65 43 6f  ofA_noB); VdbeCo
1d520 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
1d530 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1d540 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
1d550 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b  ddrB, addrEofB);
1d560 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1d570 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e  ;..  /* Implemen
1d580 74 20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67 65  t the main merge
1d590 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c   loop.  */.  sql
1d5a0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1d5b0 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70  abel(v, labelCmp
1d5c0 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r);.  sqlite3Vdb
1d5d0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65  eAddOp4(v, OP_Pe
1d5e0 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c  rmutation, 0, 0,
1d5f0 20 30 2c 20 28 63 68 61 72 2a 29 61 50 65 72 6d   0, (char*)aPerm
1d600 75 74 65 2c 20 50 34 5f 49 4e 54 41 52 52 41 59  ute, P4_INTARRAY
1d610 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1d620 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp4(v, OP_Com
1d630 70 61 72 65 2c 20 64 65 73 74 41 2e 69 53 64 73  pare, destA.iSds
1d640 74 2c 20 64 65 73 74 42 2e 69 53 64 73 74 2c 20  t, destB.iSdst, 
1d650 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20  nOrderBy,.      
1d660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d670 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d 65     (char*)pKeyMe
1d680 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  rge, P4_KEYINFO)
1d690 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
1d6a0 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
1d6b0 47 5f 50 45 52 4d 55 54 45 29 3b 0a 20 20 73 71  G_PERMUTE);.  sq
1d6c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1d6d0 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72  v, OP_Jump, addr
1d6e0 41 6c 74 42 2c 20 61 64 64 72 41 65 71 42 2c 20  AltB, addrAeqB, 
1d6f0 61 64 64 72 41 67 74 42 29 3b 20 56 64 62 65 43  addrAgtB); VdbeC
1d700 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f  overage(v);..  /
1d710 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 74 68  * Jump to the th
1d720 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65  is point in orde
1d730 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  r to terminate t
1d740 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  he query..  */. 
1d750 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1d760 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65  lveLabel(v, labe
1d770 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 52 65 61  lEnd);..  /* Rea
1d780 73 73 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70  ssembly the comp
1d790 6f 75 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68  ound query so th
1d7a0 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72  at it will be fr
1d7b0 65 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20  eed correctly.  
1d7c0 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ** by the callin
1d7d0 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  g function */.  
1d7e0 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
1d7f0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
1d800 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  ctDelete(db, p->
1d810 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70  pPrior);.  }.  p
1d820 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
1d830 72 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65  r;.  pPrior->pNe
1d840 78 74 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a 20  xt = p;..  /*** 
1d850 54 42 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62  TBD:  Insert sub
1d860 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f  routine calls to
1d870 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f   close cursors o
1d880 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a  n incomplete.  *
1d890 2a 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a  *** subqueries *
1d8a0 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61 69 6e 43 6f  ***/.  explainCo
1d8b0 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20  mposite(pParse, 
1d8c0 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53  p->op, iSub1, iS
1d8d0 75 62 32 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  ub2, 0);.  retur
1d8e0 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 21 3d  n pParse->nErr!=
1d8f0 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0;.}.#endif..#if
1d900 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1d910 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
1d920 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
1d930 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 0a 2f  TE_OMIT_VIEW)../
1d940 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
1d950 20 74 68 65 20 53 75 62 73 74 43 6f 6e 74 65 78   the SubstContex
1d960 74 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69 62  t object describ
1d970 65 73 20 61 6e 20 73 75 62 73 74 69 74 75 74 69  es an substituti
1d980 6f 6e 20 65 64 69 74 0a 2a 2a 20 74 6f 20 62 65  on edit.** to be
1d990 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 61 20   performed on a 
1d9a0 70 61 72 73 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a  parse tree..**.*
1d9b0 2a 20 41 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  * All references
1d9c0 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   to columns in t
1d9d0 61 62 6c 65 20 69 54 61 62 6c 65 20 61 72 65 20  able iTable are 
1d9e0 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20 62  to be replaced b
1d9f0 79 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  y corresponding.
1da00 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  ** expressions i
1da10 6e 20 70 45 4c 69 73 74 2e 0a 2a 2f 0a 74 79 70  n pEList..*/.typ
1da20 65 64 65 66 20 73 74 72 75 63 74 20 53 75 62 73  edef struct Subs
1da30 74 43 6f 6e 74 65 78 74 20 7b 0a 20 20 50 61 72  tContext {.  Par
1da40 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
1da50 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1da60 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1da70 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 3b 20 20  .  int iTable;  
1da80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1da90 52 65 70 6c 61 63 65 20 72 65 66 65 72 65 6e 63  Replace referenc
1daa0 65 73 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  es to this table
1dab0 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77 54 61   */.  int iNewTa
1dac0 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ble;            
1dad0 2f 2a 20 4e 65 77 20 74 61 62 6c 65 20 6e 75 6d  /* New table num
1dae0 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c  ber */.  int isL
1daf0 65 66 74 4a 6f 69 6e 3b 20 20 20 20 20 20 20 20  eftJoin;        
1db00 20 20 20 2f 2a 20 41 64 64 20 54 4b 5f 49 46 5f     /* Add TK_IF_
1db10 4e 55 4c 4c 5f 52 4f 57 20 6f 70 63 6f 64 65 73  NULL_ROW opcodes
1db20 20 6f 6e 20 65 61 63 68 20 72 65 70 6c 61 63 65   on each replace
1db30 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ment */.  ExprLi
1db40 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20  st *pEList;     
1db50 20 20 20 20 2f 2a 20 52 65 70 6c 61 63 65 6d 65      /* Replaceme
1db60 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a  nt expressions *
1db70 2f 0a 7d 20 53 75 62 73 74 43 6f 6e 74 65 78 74  /.} SubstContext
1db80 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65  ;../* Forward De
1db90 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74  clarations */.st
1dba0 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
1dbb0 78 70 72 4c 69 73 74 28 53 75 62 73 74 43 6f 6e  xprList(SubstCon
1dbc0 74 65 78 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a  text*, ExprList*
1dbd0 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  );.static void s
1dbe0 75 62 73 74 53 65 6c 65 63 74 28 53 75 62 73 74  ubstSelect(Subst
1dbf0 43 6f 6e 74 65 78 74 2a 2c 20 53 65 6c 65 63 74  Context*, Select
1dc00 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
1dc10 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65  Scan through the
1dc20 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
1dc30 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72  r.  Replace ever
1dc40 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a  y reference to.*
1dc50 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61  * a column in ta
1dc60 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c  ble number iTabl
1dc70 65 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  e with a copy of
1dc80 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a   the iColumn-th.
1dc90 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69  ** entry in pELi
1dca0 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20  st.  (But leave 
1dcb0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
1dcc0 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a  e ROWID column .
1dcd0 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a  ** unchanged.).*
1dce0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1dcf0 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  e is part of the
1dd00 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63   flattening proc
1dd10 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65  edure.  A subque
1dd20 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75  ry.** whose resu
1dd30 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65  lt set is define
1dd40 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65  d by pEList appe
1dd50 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20  ars as entry in 
1dd60 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75  the.** FROM clau
1dd70 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  se of a SELECT s
1dd80 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42  uch that the VDB
1dd90 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65  E cursor assigne
1dda0 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52  d to that.** FOR
1ddb0 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69  M clause entry i
1ddc0 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20  s iTable.  This 
1ddd0 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 74 68  routine makes th
1dde0 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20  e necessary .** 
1ddf0 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72  changes to pExpr
1de00 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66 65   so that it refe
1de10 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74  rs directly to t
1de20 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a  he source table.
1de30 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ** of the subque
1de40 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72 65  ry rather the re
1de50 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
1de60 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61  subquery..*/.sta
1de70 74 69 63 20 45 78 70 72 20 2a 73 75 62 73 74 45  tic Expr *substE
1de80 78 70 72 28 0a 20 20 53 75 62 73 74 43 6f 6e 74  xpr(.  SubstCont
1de90 65 78 74 20 2a 70 53 75 62 73 74 2c 20 20 2f 2a  ext *pSubst,  /*
1dea0 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
1deb0 74 68 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e  the substitution
1dec0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
1ded0 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r            /* 
1dee0 45 78 70 72 20 69 6e 20 77 68 69 63 68 20 73 75  Expr in which su
1def0 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72  bstitution occur
1df00 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45  s */.){.  if( pE
1df10 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  xpr==0 ) return 
1df20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  0;.  if( ExprHas
1df30 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1df40 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20  EP_FromJoin).   
1df50 26 26 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74  && pExpr->iRight
1df60 4a 6f 69 6e 54 61 62 6c 65 3d 3d 70 53 75 62 73  JoinTable==pSubs
1df70 74 2d 3e 69 54 61 62 6c 65 0a 20 20 29 7b 0a 20  t->iTable.  ){. 
1df80 20 20 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74     pExpr->iRight
1df90 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 53 75 62  JoinTable = pSub
1dfa0 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20  st->iNewTable;. 
1dfb0 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e   }.  if( pExpr->
1dfc0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
1dfd0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
1dfe0 70 53 75 62 73 74 2d 3e 69 54 61 62 6c 65 20 29  pSubst->iTable )
1dff0 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  {.    if( pExpr-
1e000 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  >iColumn<0 ){.  
1e010 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
1e020 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c  TK_NULL;.    }el
1e030 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
1e040 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72  pNew;.      Expr
1e050 20 2a 70 43 6f 70 79 20 3d 20 70 53 75 62 73 74   *pCopy = pSubst
1e060 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70  ->pEList->a[pExp
1e070 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70  r->iColumn].pExp
1e080 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20 69 66  r;.      Expr if
1e090 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20 20 20 61  NullRow;.      a
1e0a0 73 73 65 72 74 28 20 70 53 75 62 73 74 2d 3e 70  ssert( pSubst->p
1e0b0 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70  EList!=0 && pExp
1e0c0 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 53 75 62 73  r->iColumn<pSubs
1e0d0 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
1e0e0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1e0f0 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  ( pExpr->pLeft==
1e100 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67  0 && pExpr->pRig
1e110 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ht==0 );.      i
1e120 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
1e130 56 65 63 74 6f 72 28 70 43 6f 70 79 29 20 29 7b  Vector(pCopy) ){
1e140 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1e150 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 70  VectorErrorMsg(p
1e160 53 75 62 73 74 2d 3e 70 50 61 72 73 65 2c 20 70  Subst->pParse, p
1e170 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Copy);.      }el
1e180 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
1e190 74 65 33 20 2a 64 62 20 3d 20 70 53 75 62 73 74  te3 *db = pSubst
1e1a0 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  ->pParse->db;.  
1e1b0 20 20 20 20 20 20 69 66 28 20 70 53 75 62 73 74        if( pSubst
1e1c0 2d 3e 69 73 4c 65 66 74 4a 6f 69 6e 20 26 26 20  ->isLeftJoin && 
1e1d0 70 43 6f 70 79 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pCopy->op!=TK_CO
1e1e0 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
1e1f0 20 20 6d 65 6d 73 65 74 28 26 69 66 4e 75 6c 6c    memset(&ifNull
1e200 52 6f 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69  Row, 0, sizeof(i
1e210 66 4e 75 6c 6c 52 6f 77 29 29 3b 0a 20 20 20 20  fNullRow));.    
1e220 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e        ifNullRow.
1e230 6f 70 20 3d 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f  op = TK_IF_NULL_
1e240 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ROW;.          i
1e250 66 4e 75 6c 6c 52 6f 77 2e 70 4c 65 66 74 20 3d  fNullRow.pLeft =
1e260 20 70 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20   pCopy;.        
1e270 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 69 54 61 62    ifNullRow.iTab
1e280 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65  le = pSubst->iNe
1e290 77 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20  wTable;.        
1e2a0 20 20 70 43 6f 70 79 20 3d 20 26 69 66 4e 75 6c    pCopy = &ifNul
1e2b0 6c 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lRow;.        }.
1e2c0 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
1e2d0 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
1e2e0 2c 20 70 43 6f 70 79 2c 20 30 29 3b 0a 20 20 20  , pCopy, 0);.   
1e2f0 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26 26       if( pNew &&
1e300 20 70 53 75 62 73 74 2d 3e 69 73 4c 65 66 74 4a   pSubst->isLeftJ
1e310 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oin ){.         
1e320 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
1e330 28 70 4e 65 77 2c 20 45 50 5f 43 61 6e 42 65 4e  (pNew, EP_CanBeN
1e340 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ull);.        }.
1e350 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
1e360 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65   && ExprHasPrope
1e370 72 74 79 28 70 45 78 70 72 2c 45 50 5f 46 72 6f  rty(pExpr,EP_Fro
1e380 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  mJoin) ){.      
1e390 20 20 20 20 70 4e 65 77 2d 3e 69 52 69 67 68 74      pNew->iRight
1e3a0 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 45 78 70  JoinTable = pExp
1e3b0 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  r->iRightJoinTab
1e3c0 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78  le;.          Ex
1e3d0 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 4e  prSetProperty(pN
1e3e0 65 77 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  ew, EP_FromJoin)
1e3f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1e400 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1e410 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
1e420 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 20  ;.        pExpr 
1e430 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a  = pNew;.      }.
1e440 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1e450 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
1e460 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57  ==TK_IF_NULL_ROW
1e470 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
1e480 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c  e==pSubst->iTabl
1e490 65 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  e ){.      pExpr
1e4a0 2d 3e 69 54 61 62 6c 65 20 3d 20 70 53 75 62 73  ->iTable = pSubs
1e4b0 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20  t->iNewTable;.  
1e4c0 20 20 7d 0a 20 20 20 20 70 45 78 70 72 2d 3e 70    }.    pExpr->p
1e4d0 4c 65 66 74 20 3d 20 73 75 62 73 74 45 78 70 72  Left = substExpr
1e4e0 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e  (pSubst, pExpr->
1e4f0 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 45 78 70  pLeft);.    pExp
1e500 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62 73  r->pRight = subs
1e510 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70 45  tExpr(pSubst, pE
1e520 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
1e530 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1e540 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1e550 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
1e560 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28      substSelect(
1e570 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 78  pSubst, pExpr->x
1e580 2e 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20 20  .pSelect, 1);.  
1e590 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1e5a0 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75  ubstExprList(pSu
1e5b0 62 73 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  bst, pExpr->x.pL
1e5c0 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ist);.    }.  }.
1e5d0 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a    return pExpr;.
1e5e0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
1e5f0 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20 53  bstExprList(.  S
1e600 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75  ubstContext *pSu
1e610 62 73 74 2c 20 2f 2a 20 44 65 73 63 72 69 70 74  bst, /* Descript
1e620 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74  ion of the subst
1e630 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  itution */.  Exp
1e640 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 20 20 20  rList *pList    
1e650 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63     /* List to sc
1e660 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20  an and in which 
1e670 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75  to make substitu
1e680 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tes */.){.  int 
1e690 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
1e6a0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
1e6b0 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
1e6c0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
1e6d0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
1e6e0 70 72 20 3d 20 73 75 62 73 74 45 78 70 72 28 70  pr = substExpr(p
1e6f0 53 75 62 73 74 2c 20 70 4c 69 73 74 2d 3e 61 5b  Subst, pList->a[
1e700 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 7d  i].pExpr);.  }.}
1e710 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
1e720 73 74 53 65 6c 65 63 74 28 0a 20 20 53 75 62 73  stSelect(.  Subs
1e730 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74  tContext *pSubst
1e740 2c 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e  , /* Description
1e750 20 6f 66 20 74 68 65 20 73 75 62 73 74 69 74 75   of the substitu
1e760 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tion */.  Select
1e770 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1e780 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  /* SELECT statem
1e790 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ent in which to 
1e7a0 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f  make substitutio
1e7b0 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 50 72  ns */.  int doPr
1e7c0 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ior           /*
1e7d0 20 44 6f 20 73 75 62 73 74 69 74 75 74 65 73 20   Do substitutes 
1e7e0 6f 6e 20 70 2d 3e 70 50 72 69 6f 72 20 74 6f 6f  on p->pPrior too
1e7f0 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74   */.){.  SrcList
1e800 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74   *pSrc;.  struct
1e810 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1e820 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
1e830 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
1e840 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 75 62 73  ;.  do{.    subs
1e850 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74  tExprList(pSubst
1e860 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
1e870 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1e880 70 53 75 62 73 74 2c 20 70 2d 3e 70 47 72 6f 75  pSubst, p->pGrou
1e890 70 42 79 29 3b 0a 20 20 20 20 73 75 62 73 74 45  pBy);.    substE
1e8a0 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20  xprList(pSubst, 
1e8b0 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
1e8c0 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73    p->pHaving = s
1e8d0 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c  ubstExpr(pSubst,
1e8e0 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
1e8f0 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75    p->pWhere = su
1e900 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20  bstExpr(pSubst, 
1e910 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  p->pWhere);.    
1e920 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
1e930 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
1e940 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  !=0 );.    for(i
1e950 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74  =pSrc->nSrc, pIt
1e960 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b  em=pSrc->a; i>0;
1e970 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
1e980 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63        substSelec
1e990 74 28 70 53 75 62 73 74 2c 20 70 49 74 65 6d 2d  t(pSubst, pItem-
1e9a0 3e 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20 20  >pSelect, 1);.  
1e9b0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66      if( pItem->f
1e9c0 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20  g.isTabFunc ){. 
1e9d0 20 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72         substExpr
1e9e0 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 49 74  List(pSubst, pIt
1e9f0 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 29  em->u1.pFuncArg)
1ea00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ea10 20 20 7d 77 68 69 6c 65 28 20 64 6f 50 72 69 6f    }while( doPrio
1ea20 72 20 26 26 20 28 70 20 3d 20 70 2d 3e 70 50 72  r && (p = p->pPr
1ea30 69 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a 23 65 6e  ior)!=0 );.}.#en
1ea40 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
1ea50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1ea60 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
1ea70 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
1ea80 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  EW) */..#if !def
1ea90 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1eaa0 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1eab0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1eac0 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54  IT_VIEW)./*.** T
1ead0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
1eae0 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20  mpts to flatten 
1eaf0 73 75 62 71 75 65 72 69 65 73 20 61 73 20 61 20  subqueries as a 
1eb00 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69  performance opti
1eb10 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  mization..** Thi
1eb20 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1eb30 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20  s 1 if it makes 
1eb40 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66  changes and 0 if
1eb50 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f   no flattening o
1eb60 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ccurs..**.** To 
1eb70 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63  understand the c
1eb80 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65  oncept of flatte
1eb90 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74  ning, consider t
1eba0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1ebb0 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
1ebc0 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28   SELECT a FROM (
1ebd0 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
1ebe0 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
1ebf0 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a  100) WHERE a>5.*
1ec00 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74  *.** The default
1ec10 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e   way of implemen
1ec20 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20  ting this query 
1ec30 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  is to execute th
1ec40 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69  e.** subquery fi
1ec50 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68  rst and store th
1ec60 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74  e results in a t
1ec70 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
1ec80 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20  then.** run the 
1ec90 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74  outer query on t
1eca0 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61  hat temporary ta
1ecb0 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69  ble.  This requi
1ecc0 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65  res two.** passe
1ecd0 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e  s over the data.
1ece0 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62    Furthermore, b
1ecf0 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f  ecause the tempo
1ed00 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61  rary table.** ha
1ed10 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68  s no indices, th
1ed20 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
1ed30 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1ed40 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f  y cannot be.** o
1ed50 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20  ptimized..**.** 
1ed60 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
1ed70 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65  empts to rewrite
1ed80 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73   queries such as
1ed90 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a   the above into.
1eda0 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74  ** a single flat
1edb0 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68   select, like th
1edc0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  is:.**.**     SE
1edd0 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
1ede0 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
1edf0 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  0 AND a>5.**.** 
1ee00 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
1ee10 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70  ed for this simp
1ee20 6c 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73  lification gives
1ee30 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
1ee40 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73  .** but only has
1ee50 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74   to scan the dat
1ee60 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63  a once.  And bec
1ee70 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67  ause indices mig
1ee80 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20  ht .** exist on 
1ee90 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20  the table t1, a 
1eea0 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66  complete scan of
1eeb0 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   the data might 
1eec0 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a  be.** avoided..*
1eed0 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20  *.** Flattening 
1eee0 69 73 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68  is subject to th
1eef0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73  e following cons
1ef00 74 72 61 69 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20  traints:.**.**  
1ef10 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67  (**)  We no long
1ef20 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c  er attempt to fl
1ef30 61 74 74 65 6e 20 61 67 67 72 65 67 61 74 65 20  atten aggregate 
1ef40 73 75 62 71 75 65 72 69 65 73 2e 20 57 61 73 3a  subqueries. Was:
1ef50 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 73  .**        The s
1ef60 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
1ef70 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e  outer query cann
1ef80 6f 74 20 62 6f 74 68 20 62 65 20 61 67 67 72 65  ot both be aggre
1ef90 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  gates..**.**  (*
1efa0 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72  *)  We no longer
1efb0 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74   attempt to flat
1efc0 74 65 6e 20 61 67 67 72 65 67 61 74 65 20 73 75  ten aggregate su
1efd0 62 71 75 65 72 69 65 73 2e 20 57 61 73 3a 0a 2a  bqueries. Was:.*
1efe0 2a 20 20 20 20 20 20 20 20 28 32 29 20 49 66 20  *        (2) If 
1eff0 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
1f000 61 6e 20 61 67 67 72 65 67 61 74 65 20 74 68 65  an aggregate the
1f010 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 32 61 29  n.**        (2a)
1f020 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1f030 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 20 6a   must not be a j
1f040 6f 69 6e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  oin and.**      
1f050 20 20 28 32 62 29 20 74 68 65 20 6f 75 74 65 72    (2b) the outer
1f060 20 71 75 65 72 79 20 6d 75 73 74 20 6e 6f 74 20   query must not 
1f070 75 73 65 20 73 75 62 71 75 65 72 69 65 73 0a 2a  use subqueries.*
1f080 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 74  *             ot
1f090 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65  her than the one
1f0a0 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
1f0b0 71 75 65 72 79 20 74 68 61 74 20 69 73 20 61 20  query that is a 
1f0c0 63 61 6e 64 69 64 61 74 65 0a 2a 2a 20 20 20 20  candidate.**    
1f0d0 20 20 20 20 20 20 20 20 20 66 6f 72 20 66 6c 61           for fla
1f0e0 74 74 65 6e 69 6e 67 2e 20 20 28 54 68 69 73 20  ttening.  (This 
1f0f0 69 73 20 64 75 65 20 74 6f 20 74 69 63 6b 65 74  is due to ticket
1f100 20 5b 32 66 37 31 37 30 64 37 33 62 66 39 61 62   [2f7170d73bf9ab
1f110 66 38 30 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20  f80].**         
1f120 20 20 20 20 66 72 6f 6d 20 32 30 31 35 2d 30 32      from 2015-02
1f130 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 33  -09.).**.**   (3
1f140 29 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  )  If the subque
1f150 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
1f160 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46  operand of a LEF
1f170 54 20 4a 4f 49 4e 20 74 68 65 6e 0a 2a 2a 20 20  T JOIN then.**  
1f180 20 20 20 20 20 20 28 33 61 29 20 74 68 65 20 73        (3a) the s
1f190 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  ubquery may not 
1f1a0 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a 2a  be a join and.**
1f1b0 20 20 20 20 20 20 20 20 28 33 62 29 20 74 68 65          (3b) the
1f1c0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1f1d0 74 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79  the subquery may
1f1e0 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 76   not contain a v
1f1f0 69 72 74 75 61 6c 0a 2a 2a 20 20 20 20 20 20 20  irtual.**       
1f200 20 20 20 20 20 20 74 61 62 6c 65 20 61 6e 64 0a        table and.
1f210 2a 2a 20 20 20 20 20 20 20 20 28 33 63 29 20 74  **        (3c) t
1f220 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d  he outer query m
1f230 61 79 20 6e 6f 74 20 62 65 20 61 6e 20 61 67 67  ay not be an agg
1f240 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  regate..**.**   
1f250 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (4)  The subquer
1f260 79 20 63 61 6e 20 6e 6f 74 20 62 65 20 44 49 53  y can not be DIS
1f270 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  TINCT..**.**  (*
1f280 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74  *)  At one point
1f290 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34   restrictions (4
1f2a0 29 20 61 6e 64 20 28 35 29 20 64 65 66 69 6e 65  ) and (5) define
1f2b0 64 20 61 20 73 75 62 73 65 74 20 6f 66 20 44 49  d a subset of DI
1f2c0 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20 20 20  STINCT.**       
1f2d0 20 73 75 62 2d 71 75 65 72 69 65 73 20 74 68 61   sub-queries tha
1f2e0 74 20 77 65 72 65 20 65 78 63 6c 75 64 65 64 20  t were excluded 
1f2f0 66 72 6f 6d 20 74 68 69 73 20 6f 70 74 69 6d 69  from this optimi
1f300 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72 69 63 74  zation. Restrict
1f310 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 28  ion .**        (
1f320 34 29 20 68 61 73 20 73 69 6e 63 65 20 62 65 65  4) has since bee
1f330 6e 20 65 78 70 61 6e 64 65 64 20 74 6f 20 65 78  n expanded to ex
1f340 63 6c 75 64 65 20 61 6c 6c 20 44 49 53 54 49 4e  clude all DISTIN
1f350 43 54 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  CT subqueries..*
1f360 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e  *.**  (**)  We n
1f370 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74  o longer attempt
1f380 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72   to flatten aggr
1f390 65 67 61 74 65 20 73 75 62 71 75 65 72 69 65 73  egate subqueries
1f3a0 2e 20 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20  .  Was:.**      
1f3b0 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
1f3c0 79 20 69 73 20 61 67 67 72 65 67 61 74 65 2c 20  y is aggregate, 
1f3d0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1f3e0 6d 61 79 20 6e 6f 74 20 62 65 20 44 49 53 54 49  may not be DISTI
1f3f0 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29  NCT..**.**   (7)
1f400 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 6d    The subquery m
1f410 75 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d 20  ust have a FROM 
1f420 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20  clause.  TODO:  
1f430 46 6f 72 20 73 75 62 71 75 65 72 69 65 73 20 77  For subqueries w
1f440 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20  ithout.**       
1f450 20 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20   A FROM clause, 
1f460 63 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20  consider adding 
1f470 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 69  a FROM clause wi
1f480 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a  th the special.*
1f490 2a 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 73  *        table s
1f4a0 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74 20  qlite_once that 
1f4b0 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73 69  consists of a si
1f4c0 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e  ngle row contain
1f4d0 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  ing a.**        
1f4e0 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a  single NULL..**.
1f4f0 2a 2a 20 20 20 28 38 29 20 20 49 66 20 74 68 65  **   (8)  If the
1f500 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c   subquery uses L
1f510 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75  IMIT then the ou
1f520 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f  ter query may no
1f530 74 20 62 65 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a  t be a join..**.
1f540 2a 2a 20 20 20 28 39 29 20 20 49 66 20 74 68 65  **   (9)  If the
1f550 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c   subquery uses L
1f560 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75  IMIT then the ou
1f570 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f  ter query may no
1f580 74 20 62 65 20 61 67 67 72 65 67 61 74 65 2e 0a  t be aggregate..
1f590 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 52 65 73  **.**  (**)  Res
1f5a0 74 72 69 63 74 69 6f 6e 20 28 31 30 29 20 77 61  triction (10) wa
1f5b0 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  s removed from t
1f5c0 68 65 20 63 6f 64 65 20 6f 6e 20 32 30 30 35 2d  he code on 2005-
1f5d0 30 32 2d 30 35 20 62 75 74 20 77 65 0a 2a 2a 20  02-05 but we.** 
1f5e0 20 20 20 20 20 20 20 61 63 63 69 64 65 6e 74 6c         accidentl
1f5f0 79 20 63 61 72 72 69 65 64 20 74 68 65 20 63 6f  y carried the co
1f600 6d 6d 65 6e 74 20 66 6f 72 77 61 72 64 20 75 6e  mment forward un
1f610 74 69 6c 20 32 30 31 34 2d 30 39 2d 31 35 2e 20  til 2014-09-15. 
1f620 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20   Original.**    
1f630 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 3a 20      constraint: 
1f640 22 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79  "If the subquery
1f650 20 69 73 20 61 67 67 72 65 67 61 74 65 20 74 68   is aggregate th
1f660 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  en the outer que
1f670 72 79 20 0a 2a 2a 20 20 20 20 20 20 20 20 6d 61  ry .**        ma
1f680 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 2e  y not use LIMIT.
1f690 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54  ".**.**  (11)  T
1f6a0 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
1f6b0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1f6c0 6d 61 79 20 6e 6f 74 20 62 6f 74 68 20 68 61 76  may not both hav
1f6d0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1f6e0 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20  es..**.**  (**) 
1f6f0 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64   Not implemented
1f700 2e 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f  .  Subsumed into
1f710 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29   restriction (3)
1f720 2e 20 20 57 61 73 20 70 72 65 76 69 6f 75 73 6c  .  Was previousl
1f730 79 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73 65  y.**        a se
1f740 70 61 72 61 74 65 20 72 65 73 74 72 69 63 74 69  parate restricti
1f750 6f 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f 6d  on deriving from
1f760 20 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a   ticket #350..**
1f770 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20 73  .**  (13)  The s
1f780 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65  ubquery and oute
1f790 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  r query may not 
1f7a0 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 2e 0a  both use LIMIT..
1f7b0 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65  **.**  (14)  The
1f7c0 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f   subquery may no
1f7d0 74 20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a  t use OFFSET..**
1f7e0 0a 2a 2a 20 20 28 31 35 29 20 20 49 66 20 74 68  .**  (15)  If th
1f7f0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
1f800 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f   part of a compo
1f810 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
1f820 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73   the.**        s
1f830 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  ubquery may not 
1f840 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 20 20 20  use LIMIT..**   
1f850 20 20 20 20 20 28 53 65 65 20 74 69 63 6b 65 74       (See ticket
1f860 20 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65   #2339 and ticke
1f870 74 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e  t [02a8e81d44]).
1f880 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 49 66  .**.**  (16)  If
1f890 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1f8a0 20 69 73 20 61 67 67 72 65 67 61 74 65 2c 20 74   is aggregate, t
1f8b0 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 79  hen the subquery
1f8c0 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20 20 20 20 20   may not.**     
1f8d0 20 20 20 75 73 65 20 4f 52 44 45 52 20 42 59 2e     use ORDER BY.
1f8e0 20 20 28 54 69 63 6b 65 74 20 23 32 39 34 32 29    (Ticket #2942)
1f8f0 20 20 54 68 69 73 20 75 73 65 64 20 74 6f 20 6e    This used to n
1f900 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20  ot matter.**    
1f910 20 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e 74      until we int
1f920 72 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f 75  roduced the grou
1f930 70 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63 74  p_concat() funct
1f940 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31  ion.  .**.**  (1
1f950 37 29 20 20 49 66 20 74 68 65 20 73 75 62 71 75  7)  If the subqu
1f960 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
1f970 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 0a 2a  d select, then.*
1f980 2a 20 20 20 20 20 20 20 20 28 31 37 61 29 20 61  *        (17a) a
1f990 6c 6c 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72  ll compound oper
1f9a0 61 74 6f 72 73 20 6d 75 73 74 20 62 65 20 61 20  ators must be a 
1f9b0 55 4e 49 4f 4e 20 41 4c 4c 2c 20 61 6e 64 0a 2a  UNION ALL, and.*
1f9c0 2a 20 20 20 20 20 20 20 20 28 31 37 62 29 20 6e  *        (17b) n
1f9d0 6f 20 74 65 72 6d 73 20 77 69 74 68 69 6e 20 74  o terms within t
1f9e0 68 65 20 73 75 62 71 75 65 72 79 20 63 6f 6d 70  he subquery comp
1f9f0 6f 75 6e 64 20 6d 61 79 20 62 65 20 61 67 67 72  ound may be aggr
1fa00 65 67 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 20  egate.**        
1fa10 20 20 20 20 20 20 6f 72 20 44 49 53 54 49 4e 43        or DISTINC
1fa20 54 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  T, and.**       
1fa30 20 28 31 37 63 29 20 65 76 65 72 79 20 74 65 72   (17c) every ter
1fa40 6d 20 77 69 74 68 69 6e 20 74 68 65 20 73 75 62  m within the sub
1fa50 71 75 65 72 79 20 63 6f 6d 70 6f 75 6e 64 20 6d  query compound m
1fa60 75 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d 20  ust have a FROM 
1fa70 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  clause.**       
1fa80 20 28 31 37 64 29 20 74 68 65 20 6f 75 74 65 72   (17d) the outer
1fa90 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62   query may not b
1faa0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
1fab0 20 20 28 31 37 64 31 29 20 61 67 67 72 65 67 61    (17d1) aggrega
1fac0 74 65 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  te, or.**       
1fad0 20 20 20 20 20 20 20 28 31 37 64 32 29 20 44 49         (17d2) DI
1fae0 53 54 49 4e 43 54 2c 20 6f 72 0a 2a 2a 20 20 20  STINCT, or.**   
1faf0 20 20 20 20 20 20 20 20 20 20 20 28 31 37 64 33             (17d3
1fb00 29 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ) a join..**.** 
1fb10 20 20 20 20 20 20 20 54 68 65 20 70 61 72 65 6e         The paren
1fb20 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79 20  t and sub-query 
1fb30 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45 52  may contain WHER
1fb40 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a 65  E clauses. Subje
1fb50 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20  ct to.**        
1fb60 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33 29  rules (11), (13)
1fb70 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79 20   and (14), they 
1fb80 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e  may also contain
1fb90 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20   ORDER BY,.**   
1fba0 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f       LIMIT and O
1fbb0 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 20  FFSET clauses.  
1fbc0 54 68 65 20 73 75 62 71 75 65 72 79 20 63 61 6e  The subquery can
1fbd0 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f 6d 70  not use any comp
1fbe0 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f  ound.**        o
1fbf0 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20 74 68  perator other th
1fc00 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65 63  an UNION ALL bec
1fc10 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f 74 68  ause all the oth
1fc20 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  er compound.**  
1fc30 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73 20        operators 
1fc40 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65 64 20  have an implied 
1fc50 44 49 53 54 49 4e 43 54 20 77 68 69 63 68 20 69  DISTINCT which i
1fc60 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62 79 0a  s disallowed by.
1fc70 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74 72 69  **        restri
1fc80 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a  ction (4)..**.**
1fc90 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20 65 61          Also, ea
1fca0 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20  ch component of 
1fcb0 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d 75  the sub-query mu
1fcc0 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  st return the sa
1fcd0 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20  me number.**    
1fce0 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20 63 6f      of result co
1fcf0 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73 20 61  lumns. This is a
1fd00 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75 69 72  ctually a requir
1fd10 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 6f  ement for any co
1fd20 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20  mpound.**       
1fd30 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1fd40 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20 63  t, but all the c
1fd50 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20 69 73  ode here does is
1fd60 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1fd70 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 63  no.**        suc
1fd80 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75 62 2d  h (illegal) sub-
1fd90 71 75 65 72 79 20 69 73 20 66 6c 61 74 74 65 6e  query is flatten
1fda0 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  ed. The caller w
1fdb0 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65 0a 2a  ill detect the.*
1fdc0 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61 78 20  *        syntax 
1fdd0 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72 6e  error and return
1fde0 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65 73 73   a detailed mess
1fdf0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29  age..**.**  (18)
1fe00 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65    If the sub-que
1fe10 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
1fe20 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c   select, then al
1fe30 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  l terms of the.*
1fe40 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20 42  *        ORDER B
1fe50 59 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  Y clause of the 
1fe60 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20 73  parent must be s
1fe70 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73  imple references
1fe80 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 63   to .**        c
1fe90 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 75  olumns of the su
1fea0 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  b-query..**.**  
1feb0 28 31 39 29 20 20 49 66 20 74 68 65 20 73 75 62  (19)  If the sub
1fec0 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54  query uses LIMIT
1fed0 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20   then the outer 
1fee0 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 0a 2a 2a  query may not.**
1fef0 20 20 20 20 20 20 20 20 68 61 76 65 20 61 20 57          have a W
1ff00 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  HERE clause..**.
1ff10 2a 2a 20 20 28 32 30 29 20 20 49 66 20 74 68 65  **  (20)  If the
1ff20 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
1ff30 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
1ff40 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f   then it must no
1ff50 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  t use.**        
1ff60 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
1ff70 73 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37 37  se.  Ticket #377
1ff80 33 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65 6c  3.  We could rel
1ff90 61 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  ax this constrai
1ffa0 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d  nt.**        som
1ffb0 65 77 68 61 74 20 62 79 20 73 61 79 69 6e 67 20  ewhat by saying 
1ffc0 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 6f  that the terms o
1ffd0 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
1ffe0 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20  lause must.**   
1fff0 20 20 20 20 20 61 70 70 65 61 72 20 61 73 20 75       appear as u
20000 6e 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c 74  nmodified result
20010 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
20020 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 75  outer query.  Bu
20030 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 68  t we.**        h
20040 61 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69  ave other optimi
20050 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20  zations in mind 
20060 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 61  to deal with tha
20070 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  t case..**.**  (
20080 32 31 29 20 20 49 66 20 74 68 65 20 73 75 62 71  21)  If the subq
20090 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54 20  uery uses LIMIT 
200a0 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71  then the outer q
200b0 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 0a  uery may not be.
200c0 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e  **        DISTIN
200d0 43 54 2e 20 20 28 53 65 65 20 74 69 63 6b 65 74  CT.  (See ticket
200e0 20 5b 37 35 32 65 31 36 34 36 66 63 5d 29 2e 0a   [752e1646fc])..
200f0 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20 54 68 65  **.**  (22)  The
20100 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f   subquery may no
20110 74 20 62 65 20 61 20 72 65 63 75 72 73 69 76 65  t be a recursive
20120 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a   CTE..**.**  (**
20130 29 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f  )  Subsumed into
20140 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37   restriction (17
20150 64 33 29 2e 20 20 57 61 73 3a 20 49 66 20 74 68  d3).  Was: If th
20160 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
20170 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 72 65 63  .**        a rec
20180 75 72 73 69 76 65 20 43 54 45 2c 20 74 68 65 6e  ursive CTE, then
20190 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d   the sub-query m
201a0 61 79 20 6e 6f 74 20 62 65 20 61 20 63 6f 6d 70  ay not be a comp
201b0 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 20 20  ound query..**  
201c0 20 20 20 20 20 20 54 68 69 73 20 72 65 73 74 72        This restr
201d0 69 63 74 69 6f 6e 20 69 73 20 62 65 63 61 75 73  iction is becaus
201e0 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74  e transforming t
201f0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 70 61 72  he.**        par
20200 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70 6f 75 6e  ent to a compoun
20210 64 20 71 75 65 72 79 20 63 6f 6e 66 75 73 65 73  d query confuses
20220 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 68   the code that h
20230 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20  andles.**       
20240 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72 69   recursive queri
20250 65 73 20 69 6e 20 6d 75 6c 74 69 53 65 6c 65 63  es in multiSelec
20260 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  t()..**.**  (**)
20270 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61    We no longer a
20280 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74 65  ttempt to flatte
20290 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62 71  n aggregate subq
202a0 75 65 72 69 65 73 2e 20 20 57 61 73 3a 0a 2a 2a  ueries.  Was:.**
202b0 20 20 20 20 20 20 20 20 54 68 65 20 73 75 62 71          The subq
202c0 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20  uery may not be 
202d0 61 6e 20 61 67 67 72 65 67 61 74 65 20 74 68 61  an aggregate tha
202e0 74 20 75 73 65 73 20 74 68 65 20 62 75 69 6c 74  t uses the built
202f0 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20 0a 2a 2a  -in min() or .**
20300 20 20 20 20 20 20 20 20 6f 72 20 6d 61 78 28 29          or max()
20310 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 28 57 69   functions.  (Wi
20320 74 68 6f 75 74 20 74 68 69 73 20 72 65 73 74 72  thout this restr
20330 69 63 74 69 6f 6e 2c 20 61 20 71 75 65 72 79 20  iction, a query 
20340 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20 20 20 20  like:.**        
20350 22 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 28  "SELECT x FROM (
20360 53 45 4c 45 43 54 20 6d 61 78 28 79 29 2c 20 78  SELECT max(y), x
20370 20 46 52 4f 4d 20 74 31 29 22 20 77 6f 75 6c 64   FROM t1)" would
20380 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
20390 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 74 75 72  .**        retur
203a0 6e 20 74 68 65 20 76 61 6c 75 65 20 58 20 66 6f  n the value X fo
203b0 72 20 77 68 69 63 68 20 59 20 77 61 73 20 6d 61  r which Y was ma
203c0 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 0a 2a 2a  ximal.).**.**.**
203d0 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65   In this routine
203e0 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d 65  , the "p" parame
203f0 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ter is a pointer
20400 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75   to the outer qu
20410 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71  ery..** The subq
20420 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d  uery is p->pSrc-
20430 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67  >a[iFrom].  isAg
20440 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
20450 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20   outer query.** 
20460 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73 2e  uses aggregates.
20470 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65  .**.** If flatte
20480 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65  ning is not atte
20490 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74  mpted, this rout
204a0 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61  ine is a no-op a
204b0 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a  nd returns 0..**
204c0 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
204d0 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69 73  s attempted this
204e0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
204f0 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66   1..**.** All of
20500 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
20510 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63  analysis must oc
20520 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20  cur on both the 
20530 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a  outer query and.
20540 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79 20  ** the subquery 
20550 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
20560 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61  ine runs..*/.sta
20570 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53  tic int flattenS
20580 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73 65  ubquery(.  Parse
20590 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
205a0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
205b0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
205c0 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p,           /* 
205d0 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75  The parent or ou
205e0 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  ter SELECT state
205f0 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46  ment */.  int iF
20600 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rom,           /
20610 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53  * Index in p->pS
20620 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69  rc->a[] of the i
20630 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f  nner subquery */
20640 0a 20 20 69 6e 74 20 69 73 41 67 67 20 20 20 20  .  int isAgg    
20650 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
20660 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  if outer SELECT 
20670 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
20680 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  unctions */.){. 
20690 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61   const char *zSa
206a0 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  vedAuthContext =
206b0 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
206c0 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20  ntext;.  Select 
206d0 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 2f 2a 20  *pParent;    /* 
206e0 43 75 72 72 65 6e 74 20 55 4e 49 4f 4e 20 41 4c  Current UNION AL
206f0 4c 20 74 65 72 6d 20 6f 66 20 74 68 65 20 6f 74  L term of the ot
20700 68 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53  her query */.  S
20710 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20  elect *pSub;    
20720 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20     /* The inner 
20730 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75 65  query or "subque
20740 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ry" */.  Select 
20750 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a 20  *pSub1;      /* 
20760 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72  Pointer to the r
20770 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74 20  ightmost select 
20780 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a  in sub-query */.
20790 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
207a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
207b0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
207c0 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
207d0 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72   SrcList *pSubSr
207e0 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
207f0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
20800 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  ubquery */.  int
20810 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20   iParent;       
20820 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20   /* VDBE cursor 
20830 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53  number of the pS
20840 75 62 20 72 65 73 75 6c 74 20 73 65 74 20 74 65  ub result set te
20850 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  mp table */.  in
20860 74 20 69 4e 65 77 50 61 72 65 6e 74 20 3d 20 2d  t iNewParent = -
20870 31 3b 2f 2a 20 52 65 70 6c 61 63 65 6d 65 6e 74  1;/* Replacement
20880 20 74 61 62 6c 65 20 66 6f 72 20 69 50 61 72 65   table for iPare
20890 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c 65  nt */.  int isLe
208a0 66 74 4a 6f 69 6e 20 3d 20 30 3b 20 2f 2a 20 54  ftJoin = 0; /* T
208b0 72 75 65 20 69 66 20 70 53 75 62 20 69 73 20 74  rue if pSub is t
208c0 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f 66  he right side of
208d0 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 20   a LEFT JOIN */ 
208e0 20 20 20 0a 20 20 69 6e 74 20 69 3b 20 20 20 20     .  int i;    
208f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
20900 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45  p counter */.  E
20910 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20  xpr *pWhere;    
20920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20930 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
20940 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
20950 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
20960 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65  ubitem;   /* The
20970 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 73   subquery */.  s
20980 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
20990 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43  rse->db;..  /* C
209a0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66  heck to see if f
209b0 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72  lattening is per
209c0 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20  mitted.  Return 
209d0 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20  0 if not..  */. 
209e0 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
209f0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
20a00 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28  rior==0 );.  if(
20a10 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73   OptimizationDis
20a20 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
20a30 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72 29  _QueryFlattener)
20a40 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
20a50 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
20a60 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26 26   assert( pSrc &&
20a70 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72   iFrom>=0 && iFr
20a80 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b  om<pSrc->nSrc );
20a90 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70  .  pSubitem = &p
20aa0 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20  Src->a[iFrom];. 
20ab0 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62 69   iParent = pSubi
20ac0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
20ad0 70 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d 2d  pSub = pSubitem-
20ae0 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65  >pSelect;.  asse
20af0 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 0a  rt( pSub!=0 );..
20b00 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62    pSubSrc = pSub
20b10 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
20b20 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f  ( pSubSrc );.  /
20b30 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69  * Prior to versi
20b40 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c  on 3.1.2, when L
20b50 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
20b60 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65  had to be simple
20b70 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a   constants,.  **
20b80 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20 65   not arbitrary e
20b90 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 61  xpressions, we a
20ba0 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62  llowed some comb
20bb0 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61  ining of LIMIT a
20bc0 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62  nd OFFSET.  ** b
20bd0 65 63 61 75 73 65 20 74 68 65 79 20 63 6f 75 6c  ecause they coul
20be0 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61 74  d be computed at
20bf0 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20   compile-time.  
20c00 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 61  But when LIMIT a
20c10 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62  nd OFFSET.  ** b
20c20 65 63 61 6d 65 20 61 72 62 69 74 72 61 72 79 20  ecame arbitrary 
20c30 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20  expressions, we 
20c40 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20 61  were forced to a
20c50 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  dd restrictions 
20c60 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31  (13).  ** and (1
20c70 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  4). */.  if( pSu
20c80 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e  b->pLimit && p->
20c90 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20  pLimit ) return 
20ca0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
20cb0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
20cc0 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  13) */.  if( pSu
20cd0 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 53 75  b->pLimit && pSu
20ce0 62 2d 3e 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68  b->pLimit->pRigh
20cf0 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
20d00 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
20d10 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d  14) */.  if( (p-
20d20 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43  >selFlags & SF_C
20d30 6f 6d 70 6f 75 6e 64 29 21 3d 30 20 26 26 20 70  ompound)!=0 && p
20d40 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  Sub->pLimit ){. 
20d50 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
20d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d80 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
20d90 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20  iction (15) */. 
20da0 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53 72 63   }.  if( pSubSrc
20db0 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75  ->nSrc==0 ) retu
20dc0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
20dd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
20de0 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20  estriction (7)  
20df0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73  */.  if( pSub->s
20e00 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
20e10 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30  tinct ) return 0
20e20 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
20e30 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29 20 20  estriction (4)  
20e40 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
20e50 4c 69 6d 69 74 20 26 26 20 28 70 53 72 63 2d 3e  Limit && (pSrc->
20e60 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29  nSrc>1 || isAgg)
20e70 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
20e80 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;         /* Re
20e90 73 74 72 69 63 74 69 6f 6e 73 20 28 38 29 28 39  strictions (8)(9
20ea0 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  ) */.  }.  if( p
20eb0 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70 53  ->pOrderBy && pS
20ec0 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
20ed0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
20ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f00 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
20f10 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a  riction (11) */.
20f20 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20    }.  if( isAgg 
20f30 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
20f40 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  y ) return 0;   
20f50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20f60 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 36 29  Restriction (16)
20f70 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
20f80 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 57 68  pLimit && p->pWh
20f90 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ere ) return 0; 
20fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20fb0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 39 29  Restriction (19)
20fc0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
20fd0 70 4c 69 6d 69 74 20 26 26 20 28 70 2d 3e 73 65  pLimit && (p->se
20fe0 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
20ff0 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  inct)!=0 ){.    
21000 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
21010 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
21020 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 20 20  n (21) */.  }.  
21030 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61  if( pSub->selFla
21040 67 73 20 26 20 28 53 46 5f 52 65 63 75 72 73 69  gs & (SF_Recursi
21050 76 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ve) ){.    retur
21060 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69 63 74  n 0; /* Restrict
21070 69 6f 6e 73 20 28 32 32 29 20 2a 2f 0a 20 20 7d  ions (22) */.  }
21080 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  /*.  ** If t
21090 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74  he subquery is t
210a0 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
210b0 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c   of a LEFT JOIN,
210c0 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 73   then the.  ** s
210d0 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  ubquery may not 
210e0 62 65 20 61 20 6a 6f 69 6e 20 69 74 73 65 6c 66  be a join itself
210f0 20 28 33 61 29 2e 20 45 78 61 6d 70 6c 65 20 6f   (3a). Example o
21100 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f  f why this is no
21110 74 0a 20 20 2a 2a 20 61 6c 6c 6f 77 65 64 3a 0a  t.  ** allowed:.
21120 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
21130 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20    t1 LEFT OUTER 
21140 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33  JOIN (t2 JOIN t3
21150 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77  ).  **.  ** If w
21160 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62  e flatten the ab
21170 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65  ove, we would ge
21180 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  t.  **.  **     
21190 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54      (t1 LEFT OUT
211a0 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e  ER JOIN t2) JOIN
211b0 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68   t3.  **.  ** wh
211c0 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c  ich is not at al
211d0 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  l the same thing
211e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
211f0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74  he subquery is t
21200 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
21210 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c   of a LEFT JOIN,
21220 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 0a   then the outer.
21230 20 20 2a 2a 20 71 75 65 72 79 20 63 61 6e 6e 6f    ** query canno
21240 74 20 62 65 20 61 6e 20 61 67 67 72 65 67 61 74  t be an aggregat
21250 65 2e 20 28 33 63 29 20 20 54 68 69 73 20 69 73  e. (3c)  This is
21260 20 61 6e 20 61 72 74 69 66 61 63 74 20 6f 66 20   an artifact of 
21270 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 61 67 67  the way.  ** agg
21280 72 65 67 61 74 65 73 20 61 72 65 20 70 72 6f 63  regates are proc
21290 65 73 73 65 64 20 2d 20 74 68 65 72 65 20 69 73  essed - there is
212a0 20 6e 6f 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f   no mechanism to
212b0 20 64 65 74 65 72 6d 69 6e 65 20 69 66 0a 20 20   determine if.  
212c0 2a 2a 20 74 68 65 20 4c 45 46 54 20 4a 4f 49 4e  ** the LEFT JOIN
212d0 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65   table should be
212e0 20 61 6c 6c 2d 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a   all-NULL..  **.
212f0 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 69    ** See also ti
21300 63 6b 65 74 73 20 23 33 30 36 2c 20 23 33 35 30  ckets #306, #350
21310 2c 20 61 6e 64 20 23 33 33 30 30 2e 0a 20 20 2a  , and #3300..  *
21320 2f 0a 20 20 69 66 28 20 28 70 53 75 62 69 74 65  /.  if( (pSubite
21330 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  m->fg.jointype &
21340 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b   JT_OUTER)!=0 ){
21350 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f 69 6e 20  .    isLeftJoin 
21360 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 53 75  = 1;.    if( pSu
21370 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20  bSrc->nSrc>1 || 
21380 69 73 41 67 67 20 7c 7c 20 49 73 56 69 72 74 75  isAgg || IsVirtu
21390 61 6c 28 70 53 75 62 53 72 63 2d 3e 61 5b 30 5d  al(pSubSrc->a[0]
213a0 2e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  .pTab) ){.      
213b0 2f 2a 20 20 28 33 61 29 20 20 20 20 20 20 20 20  /*  (3a)        
213c0 20 20 20 20 20 28 33 63 29 20 20 20 20 20 28 33       (3c)     (3
213d0 62 29 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  b) */.      retu
213e0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
213f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58  #ifdef SQLITE_EX
21400 54 52 41 5f 49 46 4e 55 4c 4c 52 4f 57 0a 20 20  TRA_IFNULLROW.  
21410 65 6c 73 65 20 69 66 28 20 69 46 72 6f 6d 3e 30  else if( iFrom>0
21420 20 26 26 20 21 69 73 41 67 67 20 29 7b 0a 20 20   && !isAgg ){.  
21430 20 20 2f 2a 20 53 65 74 74 69 6e 67 20 69 73 4c    /* Setting isL
21440 65 66 74 4a 6f 69 6e 20 74 6f 20 2d 31 20 63 61  eftJoin to -1 ca
21450 75 73 65 73 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f  uses OP_IfNullRo
21460 77 20 6f 70 63 6f 64 65 73 20 74 6f 20 62 65 20  w opcodes to be 
21470 67 65 6e 65 72 61 74 65 64 20 66 6f 72 0a 20 20  generated for.  
21480 20 20 2a 2a 20 65 76 65 72 79 20 72 65 66 65 72    ** every refer
21490 65 6e 63 65 20 74 6f 20 61 6e 79 20 72 65 73 75  ence to any resu
214a0 6c 74 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 73  lt column from s
214b0 75 62 71 75 65 72 79 20 69 6e 20 61 20 6a 6f 69  ubquery in a joi
214c0 6e 2c 20 65 76 65 6e 0a 20 20 20 20 2a 2a 20 74  n, even.    ** t
214d0 68 6f 75 67 68 20 74 68 65 79 20 61 72 65 20 6e  hough they are n
214e0 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  ot necessary.  T
214f0 68 69 73 20 77 69 6c 6c 20 73 74 72 65 73 73 2d  his will stress-
21500 74 65 73 74 20 74 68 65 20 4f 50 5f 49 66 4e 75  test the OP_IfNu
21510 6c 6c 52 6f 77 20 0a 20 20 20 20 2a 2a 20 6f 70  llRow .    ** op
21520 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 69 73 4c  code. */.    isL
21530 65 66 74 4a 6f 69 6e 20 3d 20 2d 31 3b 0a 20 20  eftJoin = -1;.  
21540 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  }.#endif..  /* R
21550 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37 29 3a  estriction (17):
21560 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
21570 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
21580 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74 20  SELECT, then it 
21590 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e  must.  ** use on
215a0 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  ly the UNION ALL
215b0 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e   operator. And n
215c0 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70 6c  one of the simpl
215d0 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65 73  e select queries
215e0 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20  .  ** that make 
215f0 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  up the compound 
21600 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f 77  SELECT are allow
21610 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67 61  ed to be aggrega
21620 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a 20  te or distinct. 
21630 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a   ** queries..  *
21640 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50  /.  if( pSub->pP
21650 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20  rior ){.    if( 
21660 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
21670 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
21680 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  ;  /* Restrictio
21690 6e 20 28 32 30 29 20 2a 2f 0a 20 20 20 20 7d 0a  n (20) */.    }.
216a0 20 20 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c      if( isAgg ||
216b0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
216c0 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20  SF_Distinct)!=0 
216d0 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  || pSrc->nSrc!=1
216e0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
216f0 20 30 3b 20 2f 2a 20 28 31 37 64 31 29 2c 20 28   0; /* (17d1), (
21700 31 37 64 32 29 2c 20 6f 72 20 28 31 37 64 33 29  17d2), or (17d3)
21710 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f   */.    }.    fo
21720 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53  r(pSub1=pSub; pS
21730 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31  ub1; pSub1=pSub1
21740 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20  ->pPrior){.     
21750 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62   testcase( (pSub
21760 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
21770 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
21780 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69  gregate))==SF_Di
21790 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20  stinct );.      
217a0 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31  testcase( (pSub1
217b0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
217c0 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
217d0 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67  regate))==SF_Agg
217e0 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20  regate );.      
217f0 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 53  assert( pSub->pS
21800 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  rc!=0 );.      a
21810 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 45 4c  ssert( pSub->pEL
21820 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 53 75 62  ist->nExpr==pSub
21830 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  1->pEList->nExpr
21840 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   );.      if( (p
21850 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Sub1->selFlags &
21860 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
21870 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d 30 20  _Aggregate))!=0 
21880 20 20 20 2f 2a 20 28 31 37 62 29 20 2a 2f 0a 20     /* (17b) */. 
21890 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d        || (pSub1-
218a0 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62 31  >pPrior && pSub1
218b0 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 20 20  ->op!=TK_ALL)   
218c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
218d0 20 28 31 37 61 29 20 2a 2f 0a 20 20 20 20 20 20   (17a) */.      
218e0 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72 63 2d   || pSub1->pSrc-
218f0 3e 6e 53 72 63 3c 31 20 20 20 20 20 20 20 20 20  >nSrc<1         
21900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21910 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 37 63           /* (17c
21920 29 20 2a 2f 0a 20 20 20 20 20 20 29 7b 0a 20 20  ) */.      ){.  
21930 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
21940 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
21950 73 74 63 61 73 65 28 20 70 53 75 62 31 2d 3e 70  stcase( pSub1->p
21960 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20  Src->nSrc>1 );. 
21970 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73     }..    /* Res
21980 74 72 69 63 74 69 6f 6e 20 28 31 38 29 2e 20 2a  triction (18). *
21990 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72  /.    if( p->pOr
219a0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69  derBy ){.      i
219b0 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72  nt ii;.      for
219c0 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72  (ii=0; ii<p->pOr
219d0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69  derBy->nExpr; ii
219e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
219f0 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b   p->pOrderBy->a[
21a00 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  ii].u.x.iOrderBy
21a10 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Col==0 ) return 
21a20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
21a30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 2d 72 65  .  }..  /* Ex-re
21a40 73 74 72 69 63 74 69 6f 6e 20 28 32 33 29 3a 0a  striction (23):.
21a50 20 20 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 77 61    ** The only wa
21a60 79 20 74 68 61 74 20 74 68 65 20 72 65 63 75 72  y that the recur
21a70 73 69 76 65 20 70 61 72 74 20 6f 66 20 61 20 43  sive part of a C
21a80 54 45 20 63 61 6e 20 63 6f 6e 74 61 69 6e 20 61  TE can contain a
21a90 20 63 6f 6d 70 6f 75 6e 64 0a 20 20 2a 2a 20 73   compound.  ** s
21aa0 75 62 71 75 65 72 79 20 69 73 20 66 6f 72 20 74  ubquery is for t
21ab0 68 65 20 73 75 62 71 75 65 72 79 20 74 6f 20 62  he subquery to b
21ac0 65 20 6f 6e 65 20 74 65 72 6d 20 6f 66 20 61 20  e one term of a 
21ad0 6a 6f 69 6e 2e 20 20 42 75 74 20 69 66 20 74 68  join.  But if th
21ae0 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20  e.  ** subquery 
21af0 69 73 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20  is a join, then 
21b00 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 68  the flattening h
21b10 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
21b20 73 74 6f 70 70 65 64 20 62 79 0a 20 20 2a 2a 20  stopped by.  ** 
21b30 72 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37 64  restriction (17d
21b40 33 29 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  3).  */.  assert
21b50 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
21b60 20 53 46 5f 52 65 63 75 72 73 69 76 65 29 3d 3d   SF_Recursive)==
21b70 30 20 7c 7c 20 70 53 75 62 2d 3e 70 50 72 69 6f  0 || pSub->pPrio
21b80 72 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 2a 2a 2a  r==0 );..  /****
21b90 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
21ba0 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65  is point, flatte
21bb0 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
21bc0 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45 4c 45  d. *****/.  SELE
21bd0 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65  CTTRACE(1,pParse
21be0 2c 70 2c 28 22 66 6c 61 74 74 65 6e 20 25 73 2e  ,p,("flatten %s.
21bf0 25 70 20 66 72 6f 6d 20 74 65 72 6d 20 25 64 5c  %p from term %d\
21c00 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
21c10 20 20 20 20 20 20 20 70 53 75 62 2d 3e 7a 53 65         pSub->zSe
21c20 6c 4e 61 6d 65 2c 20 70 53 75 62 2c 20 69 46 72  lName, pSub, iFr
21c30 6f 6d 29 29 3b 0a 0a 20 20 2f 2a 20 41 75 74 68  om));..  /* Auth
21c40 6f 72 69 7a 65 20 74 68 65 20 73 75 62 71 75 65  orize the subque
21c50 72 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e  ry */.  pParse->
21c60 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  zAuthContext = p
21c70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a  Subitem->zName;.
21c80 20 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20    TESTONLY(i =) 
21c90 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
21ca0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
21cb0 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
21cc0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 3d  ;.  testcase( i=
21cd0 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a  =SQLITE_DENY );.
21ce0 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
21cf0 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41  ontext = zSavedA
21d00 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f  uthContext;..  /
21d10 2a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  * If the sub-que
21d20 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
21d30 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
21d40 74 2c 20 74 68 65 6e 20 28 62 79 20 72 65 73 74  t, then (by rest
21d50 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37  rictions.  ** 17
21d60 20 61 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69   and 18 above) i
21d70 74 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f  t must be a UNIO
21d80 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61  N ALL and the pa
21d90 72 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20  rent query must 
21da0 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20  .  ** be of the 
21db0 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  form:.  **.  ** 
21dc0 20 20 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72      SELECT <expr
21dd0 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75  -list> FROM (<su
21de0 62 2d 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65  b-query>) <where
21df0 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20  -clause> .  **. 
21e00 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20   ** followed by 
21e10 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49  any ORDER BY, LI
21e20 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45  MIT and/or OFFSE
21e30 54 20 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20  T clauses. This 
21e40 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74  block.  ** creat
21e50 65 73 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66  es N-1 copies of
21e60 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
21e70 79 20 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52  y without any OR
21e80 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72  DER BY, LIMIT or
21e90 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c   .  ** OFFSET cl
21ea0 61 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20  auses and joins 
21eb0 74 68 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74  them to the left
21ec0 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68  -hand-side of th
21ed0 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  e original.  ** 
21ee0 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20  using UNION ALL 
21ef0 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68  operators. In th
21f00 69 73 20 63 61 73 65 20 4e 20 69 73 20 74 68 65  is case N is the
21f10 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c   number of simpl
21f20 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74  e.  ** select st
21f30 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  atements in the 
21f40 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65  compound sub-que
21f50 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78  ry..  **.  ** Ex
21f60 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
21f70 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20       SELECT a+1 
21f80 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20  FROM (.  **     
21f90 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
21fa0 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20   tab.  **       
21fb0 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
21fc0 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 79 20         SELECT y 
21fd0 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20  FROM tab.  **   
21fe0 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
21ff0 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43   **        SELEC
22000 54 20 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20  T abs(z*2) FROM 
22010 74 61 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20  tab2.  **     ) 
22020 57 48 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52  WHERE a!=5 ORDER
22030 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20   BY 1.  **.  ** 
22040 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  Transformed into
22050 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
22060 53 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20  SELECT x+1 FROM 
22070 74 61 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35  tab WHERE x+1!=5
22080 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20  .  **     UNION 
22090 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c  ALL.  **     SEL
220a0 45 43 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62  ECT y+1 FROM tab
220b0 20 57 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20   WHERE y+1!=5.  
220c0 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c  **     UNION ALL
220d0 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
220e0 20 61 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d   abs(z*2)+1 FROM
220f0 20 74 61 62 32 20 57 48 45 52 45 20 61 62 73 28   tab2 WHERE abs(
22100 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  z*2)+1!=5.  **  
22110 20 20 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20     ORDER BY 1.  
22120 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20  **.  ** We call 
22130 74 68 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75  this the "compou
22140 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74  nd-subquery flat
22150 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20  tening"..  */.  
22160 66 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70  for(pSub=pSub->p
22170 50 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75  Prior; pSub; pSu
22180 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b  b=pSub->pPrior){
22190 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  .    Select *pNe
221a0 77 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  w;.    ExprList 
221b0 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70  *pOrderBy = p->p
221c0 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70  OrderBy;.    Exp
221d0 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  r *pLimit = p->p
221e0 4c 69 6d 69 74 3b 0a 20 20 20 20 53 65 6c 65 63  Limit;.    Selec
221f0 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  t *pPrior = p->p
22200 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f  Prior;.    p->pO
22210 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
22220 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20  p->pSrc = 0;.   
22230 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
22240 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
22250 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  0;.    pNew = sq
22260 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
22270 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 73 71  b, p, 0);.    sq
22280 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61  lite3SelectSetNa
22290 6d 65 28 70 4e 65 77 2c 20 70 53 75 62 2d 3e 7a  me(pNew, pSub->z
222a0 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d  SelName);.    p-
222b0 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
222c0 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
222d0 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
222e0 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63    p->pSrc = pSrc
222f0 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b  ;.    p->op = TK
22300 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 70 4e  _ALL;.    if( pN
22310 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ew==0 ){.      p
22320 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
22330 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
22340 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72      pNew->pPrior
22350 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
22360 20 69 66 28 20 70 50 72 69 6f 72 20 29 20 70 50   if( pPrior ) pP
22370 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e  rior->pNext = pN
22380 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ew;.      pNew->
22390 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20  pNext = p;.     
223a0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65   p->pPrior = pNe
223b0 77 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54  w;.      SELECTT
223c0 52 41 43 45 28 32 2c 70 50 61 72 73 65 2c 70 2c  RACE(2,pParse,p,
223d0 0a 20 20 20 20 20 20 20 20 20 28 22 63 6f 6d 70  .         ("comp
223e0 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c  ound-subquery fl
223f0 61 74 74 65 6e 65 72 20 63 72 65 61 74 65 73 20  attener creates 
22400 25 73 2e 25 70 20 61 73 20 70 65 65 72 5c 6e 22  %s.%p as peer\n"
22410 2c 0a 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ,.         pNew-
22420 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 4e 65 77 29  >zSelName, pNew)
22430 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
22440 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
22450 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  d ) return 1;.  
22460 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c  }..  /* Begin fl
22470 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72  attening the iFr
22480 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74  om-th entry of t
22490 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a  he FROM clause .
224a0 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65    ** in the oute
224b0 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  r query..  */.  
224c0 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70  pSub = pSub1 = p
224d0 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
224e0 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  ;..  /* Delete t
224f0 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62  he transient tab
22500 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 73 73  le structure ass
22510 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
22520 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a 20  .  ** subquery. 
22530 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46   */.  sqlite3DbF
22540 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
22550 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
22560 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
22570 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d  , pSubitem->zNam
22580 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
22590 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
225a0 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53 75  ->zAlias);.  pSu
225b0 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  bitem->zDatabase
225c0 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
225d0 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70  ->zName = 0;.  p
225e0 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  Subitem->zAlias 
225f0 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  = 0;.  pSubitem-
22600 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20  >pSelect = 0;.. 
22610 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74 69   /* Defer deleti
22620 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  ng the Table obj
22630 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ect associated w
22640 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62  ith the.  ** sub
22650 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64 65  query until code
22660 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20   generation is. 
22670 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69   ** complete, si
22680 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20 73 74  nce there may st
22690 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e 70  ill exist Expr.p
226a0 54 61 62 20 65 6e 74 72 69 65 73 20 74 68 61 74  Tab entries that
226b0 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74  .  ** refer to t
226c0 68 65 20 73 75 62 71 75 65 72 79 20 65 76 65 6e  he subquery even
226d0 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e   after flattenin
226e0 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34 36  g.  Ticket #3346
226f0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62  ..  **.  ** pSub
22700 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c  item->pTab is al
22710 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79  ways non-NULL by
22720 20 74 65 73 74 20 72 65 73 74 72 69 63 74 69 6f   test restrictio
22730 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61 62 6f  ns and tests abo
22740 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41  ve..  */.  if( A
22750 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d 2d 3e  LWAYS(pSubitem->
22760 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20  pTab!=0) ){.    
22770 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c  Table *pTabToDel
22780 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61   = pSubitem->pTa
22790 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 54  b;.    if( pTabT
227a0 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66 3d 3d 31  oDel->nTabRef==1
227b0 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20   ){.      Parse 
227c0 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
227d0 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
227e0 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
227f0 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78   pTabToDel->pNex
22800 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65  tZombie = pTople
22810 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b  vel->pZombieTab;
22820 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c  .      pToplevel
22830 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70  ->pZombieTab = p
22840 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65  TabToDel;.    }e
22850 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54  lse{.      pTabT
22860 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66 2d 2d 3b  oDel->nTabRef--;
22870 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69  .    }.    pSubi
22880 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20  tem->pTab = 0;. 
22890 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
228a0 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73  lowing loop runs
228b0 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
228c0 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e  erm in a compoun
228d0 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  d-subquery.  ** 
228e0 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64  flattening (as d
228f0 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e  escribed above).
22900 20 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e    If we are doin
22910 67 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69  g a different ki
22920 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74  nd.  ** of flatt
22930 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65  ening - a flatte
22940 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  ning other than 
22950 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75  a compound-subqu
22960 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d  ery flattening -
22970 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  .  ** then this 
22980 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f  loop only runs o
22990 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nce..  **.  ** T
229a0 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61  his loop moves a
229b0 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65  ll of the FROM e
229c0 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73  lements of the s
229d0 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65  ubquery into the
229e0 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
229f0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
22a00 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72  er query.  Befor
22a10 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65  e doing this, re
22a20 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20  member.  ** the 
22a30 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
22a40 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f  r the original o
22a50 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20  uter query FROM 
22a60 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20  element in.  ** 
22a70 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50  iParent.  The iP
22a80 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c  arent cursor wil
22a90 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e  l never be used.
22aa0 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64    Subsequent cod
22ab0 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e  e.  ** will scan
22ac0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f   expressions loo
22ad0 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74  king for iParent
22ae0 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
22af0 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f  replace.  ** tho
22b00 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69  se references wi
22b10 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  th expressions t
22b20 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74  hat resolve to t
22b30 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  he subquery FROM
22b40 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77  .  ** elements w
22b50 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e  e are now copyin
22b60 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  g in..  */.  for
22b70 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72  (pParent=p; pPar
22b80 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61  ent; pParent=pPa
22b90 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53  rent->pPrior, pS
22ba0 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29  ub=pSub->pPrior)
22bb0 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72  {.    int nSubSr
22bc0 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79  c;.    u8 jointy
22bd0 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62  pe = 0;.    pSub
22be0 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
22bf0 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ;     /* FROM cl
22c00 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79  ause of subquery
22c10 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20   */.    nSubSrc 
22c20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b  = pSubSrc->nSrc;
22c30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
22c40 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79  erms in subquery
22c50 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
22c60 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65      pSrc = pPare
22c70 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a  nt->pSrc;     /*
22c80 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
22c90 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
22ca0 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63  */..    if( pSrc
22cb0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
22cc0 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20  ( pParent==p ); 
22cd0 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74   /* First time t
22ce0 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
22cf0 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  */.      jointyp
22d00 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 66 67  e = pSubitem->fg
22d10 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d  .jointype;.    }
22d20 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
22d30 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29  rt( pParent!=p )
22d40 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75  ;  /* 2nd and su
22d50 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74  bsequent times t
22d60 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
22d70 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  */.      pSrc = 
22d80 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20  pParent->pSrc = 
22d90 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
22da0 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30  pend(db, 0, 0, 0
22db0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72  );.      if( pSr
22dc0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
22dd0 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
22de0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
22df0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
22e00 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
22e10 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75 73   The subquery us
22e20 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74  es a single slot
22e30 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
22e40 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
22e50 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20  .    ** query.  
22e60 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
22e70 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
22e80 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73  e element in its
22e90 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20   FROM clause,.  
22ea0 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64    ** then expand
22eb0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
22ec0 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66   to make space f
22ed0 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c  or it to hold al
22ee0 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a  l elements.    *
22ef0 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
22f00 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
22f10 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
22f20 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43  .    **    SELEC
22f30 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28  T * FROM tabA, (
22f40 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75  SELECT * FROM su
22f50 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b  b1, sub2), tabB;
22f60 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
22f70 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68  he outer query h
22f80 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74  as 3 slots in it
22f90 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
22fa0 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a  One slot of the.
22fb0 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
22fc0 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73  ry (the middle s
22fd0 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79 20  lot) is used by 
22fe0 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54  the subquery.  T
22ff0 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62  he next.    ** b
23000 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c  lock of code wil
23010 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74  l expand the out
23020 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 63 6c  er query FROM cl
23030 61 75 73 65 20 74 6f 20 34 20 73 6c 6f 74 73 2e  ause to 4 slots.
23040 0a 20 20 20 20 2a 2a 20 54 68 65 20 6d 69 64 64  .    ** The midd
23050 6c 65 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e  le slot is expan
23060 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73  ded to two slots
23070 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b   in order to mak
23080 65 20 73 70 61 63 65 0a 20 20 20 20 2a 2a 20 66  e space.    ** f
23090 6f 72 20 74 68 65 20 74 77 6f 20 65 6c 65 6d 65  or the two eleme
230a0 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  nts in the FROM 
230b0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75  clause of the su
230c0 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20  bquery..    */. 
230d0 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31     if( nSubSrc>1
230e0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   ){.      pParen
230f0 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d  t->pSrc = pSrc =
23100 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45   sqlite3SrcListE
23110 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c  nlarge(db, pSrc,
23120 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d   nSubSrc-1,iFrom
23130 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  +1);.      if( d
23140 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
23150 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
23160 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
23170 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72  .    /* Transfer
23180 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
23190 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20   terms from the 
231a0 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
231b0 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
231c0 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uery..    */.   
231d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
231e0 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
231f0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
23200 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61  lete(db, pSrc->a
23210 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67  [i+iFrom].pUsing
23220 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
23230 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d   pSrc->a[i+iFrom
23240 5d 2e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d  ].fg.isTabFunc==
23250 30 20 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d  0 );.      pSrc-
23260 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53  >a[i+iFrom] = pS
23270 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  ubSrc->a[i];.   
23280 20 20 20 69 4e 65 77 50 61 72 65 6e 74 20 3d 20     iNewParent = 
23290 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2e 69 43  pSubSrc->a[i].iC
232a0 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 6d 65 6d  ursor;.      mem
232b0 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b  set(&pSubSrc->a[
232c0 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53  i], 0, sizeof(pS
232d0 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20  ubSrc->a[i]));. 
232e0 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61     }.    pSrc->a
232f0 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a 6f 69 6e 74  [iFrom].fg.joint
23300 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a  ype = jointype;.
23310 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65    .    /* Now be
23320 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67  gin substituting
23330 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74   subquery result
23340 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73   set expressions
23350 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65 66   for .    ** ref
23360 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69  erences to the i
23370 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75  Parent in the ou
23380 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a  ter query..    *
23390 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c  * .    ** Exampl
233a0 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
233b0 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62     SELECT a+5, b
233c0 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  *10 FROM (SELECT
233d0 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20   x*3 AS a, y+10 
233e0 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48  AS b FROM t1) WH
233f0 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20  ERE a>b;.    ** 
23400 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
23410 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
23420 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20  ______ subquery 
23430 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
23440 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20       /.    **   
23450 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
23460 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75  _______ outer qu
23470 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ery ____________
23480 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23490 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  __/.    **.    *
234a0 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65  * We look at eve
234b0 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
234c0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
234d0 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65   and every place
234e0 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20 22   we see.    ** "
234f0 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  a" we substitute
23500 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79   "x*3" and every
23510 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62   place we see "b
23520 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
23530 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20  "y+10"..    */. 
23540 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72     if( pSub->pOr
23550 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 2f  derBy ){.      /
23560 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
23570 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f   any non-zero iO
23580 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65 73  rderByCol values
23590 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
235a0 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44 45  he.      ** ORDE
235b0 52 20 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70 72  R BY column expr
235c0 65 73 73 69 6f 6e 20 69 73 20 69 64 65 6e 74 69  ession is identi
235d0 63 61 6c 20 74 6f 20 74 68 65 20 69 4f 72 64 65  cal to the iOrde
235e0 72 42 79 43 6f 6c 27 74 68 0a 20 20 20 20 20 20  rByCol'th.      
235f0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  ** expression re
23600 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54  turned by SELECT
23610 20 73 74 61 74 65 6d 65 6e 74 20 70 53 75 62 2e   statement pSub.
23620 20 53 69 6e 63 65 20 74 68 65 73 65 20 76 61 6c   Since these val
23630 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20  ues.      ** do 
23640 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
23650 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 63 6f  correspond to co
23660 6c 75 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54 20  lumns in SELECT 
23670 73 74 61 74 65 6d 65 6e 74 20 70 50 61 72 65 6e  statement pParen
23680 74 2c 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  t,.      ** zero
23690 20 74 68 65 6d 20 62 65 66 6f 72 65 20 74 72 61   them before tra
236a0 6e 73 66 65 72 69 6e 67 20 74 68 65 20 4f 52 44  nsfering the ORD
236b0 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20  ER BY clause..  
236c0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
236d0 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69 73 20 6d  Not doing this m
236e0 61 79 20 63 61 75 73 65 20 61 6e 20 65 72 72 6f  ay cause an erro
236f0 72 20 69 66 20 61 20 73 75 62 73 65 71 75 65 6e  r if a subsequen
23700 74 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20  t call to this. 
23710 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
23720 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61   attempts to fla
23730 74 74 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20  tten a compound 
23740 73 75 62 2d 71 75 65 72 79 20 69 6e 74 6f 20 70  sub-query into p
23750 50 61 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  Parent.      ** 
23760 28 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68  (the only way th
23770 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 69 73  is can happen is
23780 20 69 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   if the compound
23790 20 73 75 62 2d 71 75 65 72 79 20 69 73 0a 20 20   sub-query is.  
237a0 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79      ** currently
237b0 20 70 61 72 74 20 6f 66 20 70 53 75 62 2d 3e 70   part of pSub->p
237c0 53 72 63 29 2e 20 53 65 65 20 74 69 63 6b 65 74  Src). See ticket
237d0 20 5b 64 31 31 61 36 65 39 30 38 66 5d 2e 20 20   [d11a6e908f].  
237e0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
237f0 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53  t *pOrderBy = pS
23800 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  ub->pOrderBy;.  
23810 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
23820 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
23830 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4f  i++){.        pO
23840 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78  rderBy->a[i].u.x
23850 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 30  .iOrderByCol = 0
23860 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23870 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
23880 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
23890 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
238a0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
238b0 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e  By;.      pSub->
238c0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
238d0 20 20 7d 0a 20 20 20 20 70 57 68 65 72 65 20 3d    }.    pWhere =
238e0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
238f0 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65  db, pSub->pWhere
23900 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 69 73  , 0);.    if( is
23910 4c 65 66 74 4a 6f 69 6e 3e 30 20 29 7b 0a 20 20  LeftJoin>0 ){.  
23920 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28      setJoinExpr(
23930 70 57 68 65 72 65 2c 20 69 4e 65 77 50 61 72 65  pWhere, iNewPare
23940 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nt);.    }.    p
23950 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d  Parent->pWhere =
23960 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
23970 64 62 2c 20 70 57 68 65 72 65 2c 20 70 50 61 72  db, pWhere, pPar
23980 65 6e 74 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  ent->pWhere);.  
23990 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
239a0 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Failed==0 ){.   
239b0 20 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20     SubstContext 
239c0 78 3b 0a 20 20 20 20 20 20 78 2e 70 50 61 72 73  x;.      x.pPars
239d0 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20  e = pParse;.    
239e0 20 20 78 2e 69 54 61 62 6c 65 20 3d 20 69 50 61    x.iTable = iPa
239f0 72 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e 69 4e  rent;.      x.iN
23a00 65 77 54 61 62 6c 65 20 3d 20 69 4e 65 77 50 61  ewTable = iNewPa
23a10 72 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e 69 73  rent;.      x.is
23a20 4c 65 66 74 4a 6f 69 6e 20 3d 20 69 73 4c 65 66  LeftJoin = isLef
23a30 74 4a 6f 69 6e 3b 0a 20 20 20 20 20 20 78 2e 70  tJoin;.      x.p
23a40 45 4c 69 73 74 20 3d 20 70 53 75 62 2d 3e 70 45  EList = pSub->pE
23a50 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 75 62 73  List;.      subs
23a60 74 53 65 6c 65 63 74 28 26 78 2c 20 70 50 61 72  tSelect(&x, pPar
23a70 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ent, 0);.    }. 
23a80 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61   .    /* The fla
23a90 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73 20  ttened query is 
23aa0 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74 68  distinct if eith
23ab0 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20  er the inner or 
23ac0 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72  the.    ** outer
23ad0 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e   query is distin
23ae0 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ct. .    */.    
23af0 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67  pParent->selFlag
23b00 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c  s |= pSub->selFl
23b10 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
23b20 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20  t;.  .    /*.   
23b30 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46   ** SELECT ... F
23b40 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20  ROM (SELECT ... 
23b50 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62  LIMIT a OFFSET b
23b60 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54  ) LIMIT x OFFSET
23b70 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   y;.    **.    *
23b80 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64  * One is tempted
23b90 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61   to try to add a
23ba0 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e   and b to combin
23bb0 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42  e the limits.  B
23bc0 75 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64  ut this.    ** d
23bd0 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20  oes not work if 
23be0 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20  either limit is 
23bf0 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f  negative..    */
23c00 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
23c10 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70  Limit ){.      p
23c20 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d  Parent->pLimit =
23c30 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20   pSub->pLimit;. 
23c40 20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69       pSub->pLimi
23c50 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 0;.    }.  }
23c60 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c  ..  /* Finially,
23c70 20 64 65 6c 65 74 65 20 77 68 61 74 20 69 73 20   delete what is 
23c80 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75 62 71  left of the subq
23c90 75 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a  uery and return.
23ca0 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20    ** success..  
23cb0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  */.  sqlite3Sele
23cc0 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75  ctDelete(db, pSu
23cd0 62 31 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54  b1);..#if SELECT
23ce0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
23cf0 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
23d00 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29  tTrace & 0x100 )
23d10 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  {.    SELECTTRAC
23d20 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70  E(0x100,pParse,p
23d30 2c 28 22 41 66 74 65 72 20 66 6c 61 74 74 65 6e  ,("After flatten
23d40 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73  ing:\n"));.    s
23d50 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
23d60 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
23d70 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
23d80 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
23d90 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
23da0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
23db0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
23dc0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
23dd0 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e  */....#if !defin
23de0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
23df0 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
23e00 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
23e10 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 4d 61 6b  _VIEW)./*.** Mak
23e20 65 20 63 6f 70 69 65 73 20 6f 66 20 72 65 6c 65  e copies of rele
23e30 76 61 6e 74 20 57 48 45 52 45 20 63 6c 61 75 73  vant WHERE claus
23e40 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6f  e terms of the o
23e50 75 74 65 72 20 71 75 65 72 79 20 69 6e 74 6f 0a  uter query into.
23e60 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ** the WHERE cla
23e70 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79 2e  use of subquery.
23e80 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a    Example:.**.**
23e90 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
23ea0 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53 20 78  M (SELECT a AS x
23eb0 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f 4d 20  , c-d AS y FROM 
23ec0 74 31 29 20 57 48 45 52 45 20 78 3d 35 20 41 4e  t1) WHERE x=5 AN
23ed0 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 72  D y=10;.**.** Tr
23ee0 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a  ansformed into:.
23ef0 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
23f00 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61  * FROM (SELECT a
23f10 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20 79 20   AS x, c-d AS y 
23f20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d  FROM t1 WHERE a=
23f30 35 20 41 4e 44 20 63 2d 64 3d 31 30 29 0a 2a 2a  5 AND c-d=10).**
23f40 20 20 20 20 20 57 48 45 52 45 20 78 3d 35 20 41       WHERE x=5 A
23f50 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54  ND y=10;.**.** T
23f60 68 65 20 68 6f 70 65 20 69 73 20 74 68 61 74 20  he hope is that 
23f70 74 68 65 20 74 65 72 6d 73 20 61 64 64 65 64 20  the terms added 
23f80 74 6f 20 74 68 65 20 69 6e 6e 65 72 20 71 75 65  to the inner que
23f90 72 79 20 77 69 6c 6c 20 6d 61 6b 65 20 69 74 20  ry will make it 
23fa0 6d 6f 72 65 0a 2a 2a 20 65 66 66 69 63 69 65 6e  more.** efficien
23fb0 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20  t..**.** Do not 
23fc0 61 74 74 65 6d 70 74 20 74 68 69 73 20 6f 70 74  attempt this opt
23fd0 69 6d 69 7a 61 74 69 6f 6e 20 69 66 3a 0a 2a 2a  imization if:.**
23fe0 0a 2a 2a 20 20 20 28 31 29 20 28 2a 2a 20 54 68  .**   (1) (** Th
23ff0 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20 77  is restriction w
24000 61 73 20 72 65 6d 6f 76 65 64 20 6f 6e 20 32 30  as removed on 20
24010 31 37 2d 30 39 2d 32 39 2e 20 20 57 65 20 75 73  17-09-29.  We us
24020 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20  ed to.**        
24030 20 20 20 64 69 73 61 6c 6c 6f 77 20 74 68 69 73     disallow this
24040 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f   optimization fo
24050 72 20 61 67 67 72 65 67 61 74 65 20 73 75 62 71  r aggregate subq
24060 75 65 72 69 65 73 2c 20 62 75 74 20 6e 6f 77 0a  ueries, but now.
24070 2a 2a 20 20 20 20 20 20 20 20 20 20 20 69 74 20  **           it 
24080 69 73 20 61 6c 6c 6f 77 65 64 20 62 79 20 70 75  is allowed by pu
24090 74 74 69 6e 67 20 74 68 65 20 65 78 74 72 61 20  tting the extra 
240a0 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 48 41 56  terms on the HAV
240b0 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20  ING clause..**  
240c0 20 20 20 20 20 20 20 20 20 54 68 65 20 61 64 64           The add
240d0 65 64 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  ed HAVING clause
240e0 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 20 69 66   is pointless if
240f0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 6c 61   the subquery la
24100 63 6b 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  cks.**          
24110 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75   a GROUP BY clau
24120 73 65 2e 20 20 42 75 74 20 73 75 63 68 20 61 20  se.  But such a 
24130 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 69 73  HAVING clause is
24140 20 61 6c 73 6f 20 68 61 72 6d 6c 65 73 73 0a 2a   also harmless.*
24150 2a 20 20 20 20 20 20 20 20 20 20 20 73 6f 20 74  *           so t
24160 68 65 72 65 20 64 6f 65 73 20 6e 6f 74 20 61 70  here does not ap
24170 70 65 61 72 20 74 6f 20 62 65 20 61 6e 79 20 72  pear to be any r
24180 65 61 73 6f 6e 20 74 6f 20 61 64 64 20 65 78 74  eason to add ext
24190 72 61 20 6c 6f 67 69 63 0a 2a 2a 20 20 20 20 20  ra logic.**     
241a0 20 20 20 20 20 20 74 6f 20 73 75 70 70 72 65 73        to suppres
241b0 73 20 69 74 2e 20 2a 2a 29 0a 2a 2a 0a 2a 2a 20  s it. **).**.** 
241c0 20 20 28 32 29 20 54 68 65 20 69 6e 6e 65 72 20    (2) The inner 
241d0 71 75 65 72 79 20 69 73 20 74 68 65 20 72 65 63  query is the rec
241e0 75 72 73 69 76 65 20 70 61 72 74 20 6f 66 20 61  ursive part of a
241f0 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78   common table ex
24200 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
24210 20 20 28 33 29 20 54 68 65 20 69 6e 6e 65 72 20    (3) The inner 
24220 71 75 65 72 79 20 68 61 73 20 61 20 4c 49 4d 49  query has a LIMI
24230 54 20 63 6c 61 75 73 65 20 28 73 69 6e 63 65 20  T clause (since 
24240 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74  the changes to t
24250 68 65 20 57 48 45 52 45 0a 2a 2a 20 20 20 20 20  he WHERE.**     
24260 20 20 63 6c 6f 73 65 20 77 6f 75 6c 64 20 63 68    close would ch
24270 61 6e 67 65 20 74 68 65 20 6d 65 61 6e 69 6e 67  ange the meaning
24280 20 6f 66 20 74 68 65 20 4c 49 4d 49 54 29 2e 0a   of the LIMIT)..
24290 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 54 68 65 20  **.**   (4) The 
242a0 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20 74  inner query is t
242b0 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
242c0 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
242d0 61 6e 64 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  and the.**      
242e0 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62   expression to b
242f0 65 20 70 75 73 68 65 64 20 64 6f 77 6e 20 64 6f  e pushed down do
24300 65 73 20 6e 6f 74 20 63 6f 6d 65 20 66 72 6f 6d  es not come from
24310 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 0a 2a   the ON clause.*
24320 2a 20 20 20 20 20 20 20 6f 6e 20 74 68 61 74 20  *       on that 
24330 4c 45 46 54 20 4a 4f 49 4e 2e 0a 2a 2a 0a 2a 2a  LEFT JOIN..**.**
24340 20 20 20 28 35 29 20 54 68 65 20 57 48 45 52 45     (5) The WHERE
24350 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69   clause expressi
24360 6f 6e 20 6f 72 69 67 69 6e 61 74 65 73 20 69 6e  on originates in
24370 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
24380 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20   clause.**      
24390 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
243a0 77 68 65 72 65 20 69 43 75 72 73 6f 72 20 69 73  where iCursor is
243b0 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d 68   not the right-h
243c0 61 6e 64 20 74 61 62 6c 65 20 6f 66 20 74 68 61  and table of tha
243d0 74 0a 2a 2a 20 20 20 20 20 20 20 6c 65 66 74 20  t.**       left 
243e0 6a 6f 69 6e 2e 20 20 41 6e 20 65 78 61 6d 70 6c  join.  An exampl
243f0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
24400 20 20 20 53 45 4c 45 43 54 20 2a 0a 2a 2a 20 20     SELECT *.**  
24410 20 20 20 20 20 20 20 20 20 46 52 4f 4d 20 28 53           FROM (S
24420 45 4c 45 43 54 20 31 20 41 53 20 61 31 20 55 4e  ELECT 1 AS a1 UN
24430 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 32  ION ALL SELECT 2
24440 29 20 41 53 20 61 61 0a 2a 2a 20 20 20 20 20 20  ) AS aa.**      
24450 20 20 20 20 20 4a 4f 49 4e 20 28 53 45 4c 45 43       JOIN (SELEC
24460 54 20 31 20 41 53 20 62 32 20 55 4e 49 4f 4e 20  T 1 AS b2 UNION 
24470 41 4c 4c 20 53 45 4c 45 43 54 20 32 29 20 41 53  ALL SELECT 2) AS
24480 20 62 62 20 4f 4e 20 28 61 31 3d 62 32 29 0a 2a   bb ON (a1=b2).*
24490 2a 20 20 20 20 20 20 20 20 20 20 20 4c 45 46 54  *           LEFT
244a0 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 38 20   JOIN (SELECT 8 
244b0 41 53 20 63 33 20 55 4e 49 4f 4e 20 41 4c 4c 20  AS c3 UNION ALL 
244c0 53 45 4c 45 43 54 20 39 29 20 41 53 20 63 63 20  SELECT 9) AS cc 
244d0 4f 4e 20 28 62 32 3d 32 29 3b 0a 2a 2a 0a 2a 2a  ON (b2=2);.**.**
244e0 20 20 20 20 20 20 20 54 68 65 20 63 6f 72 72 65         The corre
244f0 63 74 20 61 6e 73 77 65 72 20 69 73 20 74 68 72  ct answer is thr
24500 65 65 20 72 6f 77 73 3a 20 20 28 31 2c 31 2c 4e  ee rows:  (1,1,N
24510 55 4c 4c 29 2c 28 32 2c 32 2c 38 29 2c 28 32 2c  ULL),(2,2,8),(2,
24520 32 2c 39 29 2e 0a 2a 2a 20 20 20 20 20 20 20 42  2,9)..**       B
24530 75 74 20 69 66 20 74 68 65 20 28 62 32 3d 32 29  ut if the (b2=2)
24540 20 74 65 72 6d 20 77 65 72 65 20 74 6f 20 62 65   term were to be
24550 20 70 75 73 68 65 64 20 64 6f 77 6e 20 69 6e 74   pushed down int
24560 6f 20 74 68 65 20 62 62 20 73 75 62 71 75 65 72  o the bb subquer
24570 79 2c 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 6e  y,.**       then
24580 20 74 68 65 20 28 31 2c 31 2c 4e 55 4c 4c 29 20   the (1,1,NULL) 
24590 72 6f 77 20 77 6f 75 6c 64 20 62 65 20 73 75 70  row would be sup
245a0 70 72 65 73 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 52  pressed..**.** R
245b0 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 20 63 68  eturn 0 if no ch
245c0 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 61  anges are made a
245d0 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f  nd non-zero if o
245e0 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48 45 52 45  ne or more WHERE
245f0 20 63 6c 61 75 73 65 0a 2a 2a 20 74 65 72 6d 73   clause.** terms
24600 20 61 72 65 20 64 75 70 6c 69 63 61 74 65 64 20   are duplicated 
24610 69 6e 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  into the subquer
24620 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
24630 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65   pushDownWhereTe
24640 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rms(.  Parse *pP
24650 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
24660 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 28 66  Parse context (f
24670 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  or malloc() and 
24680 65 72 72 6f 72 20 72 65 70 6f 72 74 69 6e 67 29  error reporting)
24690 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
246a0 75 62 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ubq,        /* T
246b0 68 65 20 73 75 62 71 75 65 72 79 20 77 68 6f 73  he subquery whos
246c0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
246d0 73 20 74 6f 20 62 65 20 61 75 67 6d 65 6e 74 65  s to be augmente
246e0 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  d */.  Expr *pWh
246f0 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ere,         /* 
24700 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
24710 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
24720 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  ery */.  int iCu
24730 72 73 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f  rsor,          /
24740 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
24750 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
24760 2a 2f 0a 20 20 69 6e 74 20 69 73 4c 65 66 74 4a  */.  int isLeftJ
24770 6f 69 6e 20 20 20 20 20 20 20 20 2f 2a 20 54 72  oin        /* Tr
24780 75 65 20 69 66 20 70 53 75 62 71 20 69 73 20 74  ue if pSubq is t
24790 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66  he right term of
247a0 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a   a LEFT JOIN */.
247b0 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
247c0 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20 3d 20 30  .  int nChng = 0
247d0 3b 0a 20 20 69 66 28 20 70 57 68 65 72 65 3d 3d  ;.  if( pWhere==
247e0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
247f0 69 66 28 20 70 53 75 62 71 2d 3e 73 65 6c 46 6c  if( pSubq->selFl
24800 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
24810 76 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ve ) return 0;  
24820 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28  /* restriction (
24830 32 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  2) */..#ifdef SQ
24840 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
24850 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 74  Only the first t
24860 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  erm of a compoun
24870 64 20 63 61 6e 20 68 61 76 65 20 61 20 57 49 54  d can have a WIT
24880 48 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20 6d  H clause.  But m
24890 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 6e 6f  ake.  ** sure no
248a0 20 6f 74 68 65 72 20 74 65 72 6d 73 20 61 72 65   other terms are
248b0 20 6d 61 72 6b 65 64 20 53 46 5f 52 65 63 75 72   marked SF_Recur
248c0 73 69 76 65 20 69 6e 20 63 61 73 65 20 73 6f 6d  sive in case som
248d0 65 74 68 69 6e 67 20 63 68 61 6e 67 65 73 0a 20  ething changes. 
248e0 20 2a 2a 20 69 6e 20 74 68 65 20 66 75 74 75 72   ** in the futur
248f0 65 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20  e..  */.  {.    
24900 53 65 6c 65 63 74 20 2a 70 58 3b 20 20 0a 20 20  Select *pX;  .  
24910 20 20 66 6f 72 28 70 58 3d 70 53 75 62 71 3b 20    for(pX=pSubq; 
24920 70 58 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f  pX; pX=pX->pPrio
24930 72 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r){.      assert
24940 28 20 28 70 58 2d 3e 73 65 6c 46 6c 61 67 73 20  ( (pX->selFlags 
24950 26 20 28 53 46 5f 52 65 63 75 72 73 69 76 65 29  & (SF_Recursive)
24960 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  )==0 );.    }.  
24970 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
24980 70 53 75 62 71 2d 3e 70 4c 69 6d 69 74 21 3d 30  pSubq->pLimit!=0
24990 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
249a0 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e  ; /* restriction
249b0 20 28 33 29 20 2a 2f 0a 20 20 7d 0a 20 20 77 68   (3) */.  }.  wh
249c0 69 6c 65 28 20 70 57 68 65 72 65 2d 3e 6f 70 3d  ile( pWhere->op=
249d0 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 6e  =TK_AND ){.    n
249e0 43 68 6e 67 20 2b 3d 20 70 75 73 68 44 6f 77 6e  Chng += pushDown
249f0 57 68 65 72 65 54 65 72 6d 73 28 70 50 61 72 73  WhereTerms(pPars
24a00 65 2c 20 70 53 75 62 71 2c 20 70 57 68 65 72 65  e, pSubq, pWhere
24a10 2d 3e 70 52 69 67 68 74 2c 0a 20 20 20 20 20 20  ->pRight,.      
24a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a30 20 20 20 20 20 20 20 20 20 20 69 43 75 72 73 6f            iCurso
24a40 72 2c 20 69 73 4c 65 66 74 4a 6f 69 6e 29 3b 0a  r, isLeftJoin);.
24a50 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 57 68      pWhere = pWh
24a60 65 72 65 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a  ere->pLeft;.  }.
24a70 20 20 69 66 28 20 69 73 4c 65 66 74 4a 6f 69 6e    if( isLeftJoin
24a80 0a 20 20 20 26 26 20 28 45 78 70 72 48 61 73 50  .   && (ExprHasP
24a90 72 6f 70 65 72 74 79 28 70 57 68 65 72 65 2c 45  roperty(pWhere,E
24aa0 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3d 3d 30 0a 20  P_FromJoin)==0. 
24ab0 20 20 20 20 20 20 20 20 7c 7c 20 70 57 68 65 72          || pWher
24ac0 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  e->iRightJoinTab
24ad0 6c 65 21 3d 69 43 75 72 73 6f 72 29 0a 20 20 29  le!=iCursor).  )
24ae0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
24af0 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28  /* restriction (
24b00 34 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  4) */.  }.  if( 
24b10 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
24b20 70 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a 6f  pWhere,EP_FromJo
24b30 69 6e 29 20 26 26 20 70 57 68 65 72 65 2d 3e 69  in) && pWhere->i
24b40 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d  RightJoinTable!=
24b50 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 72  iCursor ){.    r
24b60 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74  eturn 0; /* rest
24b70 72 69 63 74 69 6f 6e 20 28 35 29 20 2a 2f 0a 20  riction (5) */. 
24b80 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
24b90 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74  ExprIsTableConst
24ba0 61 6e 74 28 70 57 68 65 72 65 2c 20 69 43 75 72  ant(pWhere, iCur
24bb0 73 6f 72 29 20 29 7b 0a 20 20 20 20 6e 43 68 6e  sor) ){.    nChn
24bc0 67 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  g++;.    while( 
24bd0 70 53 75 62 71 20 29 7b 0a 20 20 20 20 20 20 53  pSubq ){.      S
24be0 75 62 73 74 43 6f 6e 74 65 78 74 20 78 3b 0a 20  ubstContext x;. 
24bf0 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
24c00 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73  te3ExprDup(pPars
24c10 65 2d 3e 64 62 2c 20 70 57 68 65 72 65 2c 20 30  e->db, pWhere, 0
24c20 29 3b 0a 20 20 20 20 20 20 75 6e 73 65 74 4a 6f  );.      unsetJo
24c30 69 6e 45 78 70 72 28 70 4e 65 77 2c 20 2d 31 29  inExpr(pNew, -1)
24c40 3b 0a 20 20 20 20 20 20 78 2e 70 50 61 72 73 65  ;.      x.pParse
24c50 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 20   = pParse;.     
24c60 20 78 2e 69 54 61 62 6c 65 20 3d 20 69 43 75 72   x.iTable = iCur
24c70 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e 69 4e 65  sor;.      x.iNe
24c80 77 54 61 62 6c 65 20 3d 20 69 43 75 72 73 6f 72  wTable = iCursor
24c90 3b 0a 20 20 20 20 20 20 78 2e 69 73 4c 65 66 74  ;.      x.isLeft
24ca0 4a 6f 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Join = 0;.      
24cb0 78 2e 70 45 4c 69 73 74 20 3d 20 70 53 75 62 71  x.pEList = pSubq
24cc0 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  ->pEList;.      
24cd0 70 4e 65 77 20 3d 20 73 75 62 73 74 45 78 70 72  pNew = substExpr
24ce0 28 26 78 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  (&x, pNew);.    
24cf0 20 20 69 66 28 20 70 53 75 62 71 2d 3e 73 65 6c    if( pSubq->sel
24d00 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
24d10 67 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  gate ){.        
24d20 70 53 75 62 71 2d 3e 70 48 61 76 69 6e 67 20 3d  pSubq->pHaving =
24d30 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
24d40 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 75 62  pParse->db, pSub
24d50 71 2d 3e 70 48 61 76 69 6e 67 2c 20 70 4e 65 77  q->pHaving, pNew
24d60 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
24d70 20 20 20 20 20 20 20 20 70 53 75 62 71 2d 3e 70          pSubq->p
24d80 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
24d90 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64  xprAnd(pParse->d
24da0 62 2c 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65  b, pSubq->pWhere
24db0 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d  , pNew);.      }
24dc0 0a 20 20 20 20 20 20 70 53 75 62 71 20 3d 20 70  .      pSubq = p
24dd0 53 75 62 71 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  Subq->pPrior;.  
24de0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
24df0 20 6e 43 68 6e 67 3b 0a 7d 0a 23 65 6e 64 69 66   nChng;.}.#endif
24e00 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
24e10 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
24e20 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
24e30 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
24e40 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70   */../*.** The p
24e50 46 75 6e 63 20 69 73 20 74 68 65 20 6f 6e 6c 79  Func is the only
24e60 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
24e70 69 6f 6e 20 69 6e 20 74 68 65 20 71 75 65 72 79  ion in the query
24e80 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 0a  .  Check to see.
24e90 2a 2a 20 69 66 20 74 68 65 20 71 75 65 72 79 20  ** if the query 
24ea0 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  is a candidate f
24eb0 6f 72 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f  or the min/max o
24ec0 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 0a 2a 2a  ptimization. .**
24ed0 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79  .** If the query
24ee0 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
24ef0 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20  for the min/max 
24f00 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 68  optimization, th
24f10 65 6e 20 73 65 74 0a 2a 2a 20 2a 70 70 4d 69 6e  en set.** *ppMin
24f20 4d 61 78 20 74 6f 20 62 65 20 61 6e 20 4f 52 44  Max to be an ORD
24f30 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20  ER BY clause to 
24f40 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  be used for the 
24f50 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20  optimization.** 
24f60 61 6e 64 20 72 65 74 75 72 6e 20 65 69 74 68 65  and return eithe
24f70 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  r WHERE_ORDERBY_
24f80 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44  MIN or WHERE_ORD
24f90 45 52 42 59 5f 4d 41 58 20 64 65 70 65 6e 64 69  ERBY_MAX dependi
24fa0 6e 67 20 6f 6e 0a 2a 2a 20 77 68 65 74 68 65 72  ng on.** whether
24fb0 20 70 46 75 6e 63 20 69 73 20 61 20 6d 69 6e 28   pFunc is a min(
24fc0 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74  ) or max() funct
24fd0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ion..**.** If th
24fe0 65 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  e query is not a
24ff0 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 74   candidate for t
25000 68 65 20 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d  he min/max optim
25010 69 7a 61 74 69 6f 6e 2c 20 72 65 74 75 72 6e 0a  ization, return.
25020 2a 2a 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  ** WHERE_ORDERBY
25030 5f 4e 4f 52 4d 41 4c 20 28 77 68 69 63 68 20 6d  _NORMAL (which m
25040 75 73 74 20 62 65 20 7a 65 72 6f 29 2e 0a 2a 2a  ust be zero)..**
25050 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
25060 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
25070 61 66 74 65 72 20 61 67 67 72 65 67 61 74 65 20  after aggregate 
25080 66 75 6e 63 74 69 6f 6e 73 20 68 61 76 65 20 62  functions have b
25090 65 65 6e 0a 2a 2a 20 6c 6f 63 61 74 65 64 20 62  een.** located b
250a0 75 74 20 62 65 66 6f 72 65 20 74 68 65 69 72 20  ut before their 
250b0 61 72 67 75 6d 65 6e 74 73 20 68 61 76 65 20 62  arguments have b
250c0 65 65 6e 20 73 75 62 6a 65 63 74 65 64 20 74 6f  een subjected to
250d0 20 61 67 67 72 65 67 61 74 65 0a 2a 2a 20 61 6e   aggregate.** an
250e0 61 6c 79 73 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  alysis..*/.stati
250f0 63 20 75 38 20 6d 69 6e 4d 61 78 51 75 65 72 79  c u8 minMaxQuery
25100 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
25110 70 72 20 2a 70 46 75 6e 63 2c 20 45 78 70 72 4c  pr *pFunc, ExprL
25120 69 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b  ist **ppMinMax){
25130 0a 20 20 69 6e 74 20 65 52 65 74 20 3d 20 57 48  .  int eRet = WH
25140 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
25150 41 4c 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  AL;      /* Retu
25160 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 45 78  rn value */.  Ex
25170 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
25180 20 70 46 75 6e 63 2d 3e 78 2e 70 4c 69 73 74 3b   pFunc->x.pList;
25190 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73      /* Arguments
251a0 20 74 6f 20 61 67 67 20 66 75 6e 63 74 69 6f 6e   to agg function
251b0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
251c0 20 2a 7a 46 75 6e 63 3b 20 20 20 20 20 20 20 20   *zFunc;        
251d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
251e0 61 6d 65 20 6f 66 20 61 67 67 72 65 67 61 74 65  ame of aggregate
251f0 20 66 75 6e 63 74 69 6f 6e 20 70 46 75 6e 63 20   function pFunc 
25200 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
25210 4f 72 64 65 72 42 79 3b 0a 20 20 75 38 20 73 6f  OrderBy;.  u8 so
25220 72 74 4f 72 64 65 72 3b 0a 0a 20 20 61 73 73 65  rtOrder;..  asse
25230 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30  rt( *ppMinMax==0
25240 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46   );.  assert( pF
25250 75 6e 63 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  unc->op==TK_AGG_
25260 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 69 66  FUNCTION );.  if
25270 28 20 70 45 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  ( pEList==0 || p
25280 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  EList->nExpr!=1 
25290 29 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 20  ) return eRet;. 
252a0 20 7a 46 75 6e 63 20 3d 20 70 46 75 6e 63 2d 3e   zFunc = pFunc->
252b0 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20  u.zToken;.  if( 
252c0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
252d0 46 75 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20  Func, "min")==0 
252e0 29 7b 0a 20 20 20 20 65 52 65 74 20 3d 20 57 48  ){.    eRet = WH
252f0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b  ERE_ORDERBY_MIN;
25300 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d  .    sortOrder =
25310 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3b 0a   SQLITE_SO_ASC;.
25320 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
25330 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63  te3StrICmp(zFunc
25340 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20  , "max")==0 ){. 
25350 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f     eRet = WHERE_
25360 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 20  ORDERBY_MAX;.   
25370 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c   sortOrder = SQL
25380 49 54 45 5f 53 4f 5f 44 45 53 43 3b 0a 20 20 7d  ITE_SO_DESC;.  }
25390 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
253a0 20 65 52 65 74 3b 0a 20 20 7d 0a 20 20 2a 70 70   eRet;.  }.  *pp
253b0 4d 69 6e 4d 61 78 20 3d 20 70 4f 72 64 65 72 42  MinMax = pOrderB
253c0 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
253d0 69 73 74 44 75 70 28 64 62 2c 20 70 45 4c 69 73  istDup(db, pELis
253e0 74 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  t, 0);.  assert(
253f0 20 70 4f 72 64 65 72 42 79 21 3d 30 20 7c 7c 20   pOrderBy!=0 || 
25400 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
25410 20 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72   );.  if( pOrder
25420 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61  By ) pOrderBy->a
25430 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  [0].sortOrder = 
25440 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 72 65 74  sortOrder;.  ret
25450 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn eRet;.}../*.
25460 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73 74  ** The select st
25470 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
25480 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
25490 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65  ment is an aggre
254a0 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54  gate query..** T
254b0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
254c0 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f 63 69  nt is the associ
254d0 61 74 65 64 20 61 67 67 72 65 67 61 74 65 2d 69  ated aggregate-i
254e0 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73  nfo object. This
254f0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65   .** function te
25500 73 74 73 20 69 66 20 74 68 65 20 53 45 4c 45 43  sts if the SELEC
25510 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  T is of the form
25520 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  :.**.**   SELECT
25530 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c   count(*) FROM <
25540 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  tbl>.**.** where
25550 20 74 61 62 6c 65 20 69 73 20 61 20 64 61 74 61   table is a data
25560 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20  base table, not 
25570 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  a sub-select or 
25580 76 69 65 77 2e 20 49 66 20 74 68 65 20 71 75 65  view. If the que
25590 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68  ry.** does match
255a0 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74   this pattern, t
255b0 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  hen a pointer to
255c0 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63   the Table objec
255d0 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a  t representing.*
255e0 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72  * <tbl> is retur
255f0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
25600 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  0 is returned..*
25610 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a  /.static Table *
25620 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65  isSimpleCount(Se
25630 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f  lect *p, AggInfo
25640 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54   *pAggInfo){.  T
25650 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78  able *pTab;.  Ex
25660 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73  pr *pExpr;..  as
25670 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70  sert( !p->pGroup
25680 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  By );..  if( p->
25690 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c  pWhere || p->pEL
256a0 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20  ist->nExpr!=1 . 
256b0 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53    || p->pSrc->nS
256c0 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63  rc!=1 || p->pSrc
256d0 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20  ->a[0].pSelect. 
256e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
256f0 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70  ;.  }.  pTab = p
25700 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  ->pSrc->a[0].pTa
25710 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e  b;.  pExpr = p->
25720 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
25730 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  pr;.  assert( pT
25740 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65  ab && !pTab->pSe
25750 6c 65 63 74 20 26 26 20 70 45 78 70 72 20 29 3b  lect && pExpr );
25760 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  ..  if( IsVirtua
25770 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
25780 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
25790 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op!=TK_AGG_FUNC
257a0 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  TION ) return 0;
257b0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 41 67  .  if( NEVER(pAg
257c0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29  gInfo->nFunc==0)
257d0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
257e0 66 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46  f( (pAggInfo->aF
257f0 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 75  unc[0].pFunc->fu
25800 6e 63 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46  ncFlags&SQLITE_F
25810 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20  UNC_COUNT)==0 ) 
25820 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
25830 70 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f  pExpr->flags&EP_
25840 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
25850 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70  n 0;..  return p
25860 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  Tab;.}../*.** If
25870 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74   the source-list
25880 20 69 74 65 6d 20 70 61 73 73 65 64 20 61 73 20   item passed as 
25890 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  an argument was 
258a0 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61  augmented with a
258b0 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20  n.** INDEXED BY 
258c0 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79  clause, then try
258d0 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73   to locate the s
258e0 70 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20  pecified index. 
258f0 49 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20  If there.** was 
25900 73 75 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e  such a clause an
25910 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65  d the named inde
25920 78 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  x cannot be foun
25930 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  d, return .** SQ
25940 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c  LITE_ERROR and l
25950 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
25960 20 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69   pParse. Otherwi
25970 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a  se, populate .**
25980 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61   pFrom->pIndex a
25990 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
259a0 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
259b0 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b  te3IndexedByLook
259c0 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  up(Parse *pParse
259d0 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74  , struct SrcList
259e0 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20  _item *pFrom){. 
259f0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
25a00 20 26 26 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73   && pFrom->fg.is
25a10 49 6e 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20  IndexedBy ){.   
25a20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
25a30 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
25a40 63 68 61 72 20 2a 7a 49 6e 64 65 78 65 64 42 79  char *zIndexedBy
25a50 20 3d 20 70 46 72 6f 6d 2d 3e 75 31 2e 7a 49 6e   = pFrom->u1.zIn
25a60 64 65 78 65 64 42 79 3b 0a 20 20 20 20 49 6e 64  dexedBy;.    Ind
25a70 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f  ex *pIdx;.    fo
25a80 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
25a90 64 65 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49  dex; .        pI
25aa0 64 78 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  dx && sqlite3Str
25ab0 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65  ICmp(pIdx->zName
25ac0 2c 20 7a 49 6e 64 65 78 65 64 42 79 29 3b 20 0a  , zIndexedBy); .
25ad0 20 20 20 20 20 20 20 20 70 49 64 78 3d 70 49 64          pIdx=pId
25ae0 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a  x->pNext.    );.
25af0 20 20 20 20 69 66 28 20 21 70 49 64 78 20 29 7b      if( !pIdx ){
25b00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
25b10 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
25b20 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25  no such index: %
25b30 73 22 2c 20 7a 49 6e 64 65 78 65 64 42 79 2c 20  s", zIndexedBy, 
25b40 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
25b50 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
25b60 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
25b70 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
25b80 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70    }.    pFrom->p
25b90 49 42 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a  IBIndex = pIdx;.
25ba0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
25bb0 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  ITE_OK;.}./*.** 
25bc0 44 65 74 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20  Detect compound 
25bd0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
25be0 73 20 74 68 61 74 20 75 73 65 20 61 6e 20 4f 52  s that use an OR
25bf0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 77 69  DER BY clause wi
25c00 74 68 20 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e  th .** an altern
25c10 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20  ative collating 
25c20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  sequence..**.** 
25c30 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52     SELECT ... FR
25c40 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c  OM t1 EXCEPT SEL
25c50 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20  ECT ... FROM t2 
25c60 4f 52 44 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c  ORDER BY .. COLL
25c70 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ATE ....**.** Th
25c80 65 73 65 20 61 72 65 20 72 65 77 72 69 74 74 65  ese are rewritte
25c90 6e 20 61 73 20 61 20 73 75 62 71 75 65 72 79 3a  n as a subquery:
25ca0 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
25cb0 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   * FROM (SELECT 
25cc0 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45  ... FROM t1 EXCE
25cd0 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  PT SELECT ... FR
25ce0 4f 4d 20 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52  OM t2).**     OR
25cf0 44 45 52 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41  DER BY ... COLLA
25d00 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  TE ....**.** Thi
25d10 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  s transformation
25d20 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
25d30 63 61 75 73 65 20 74 68 65 20 6d 75 6c 74 69 53  cause the multiS
25d40 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 72  electOrderBy() r
25d50 6f 75 74 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20  outine.** above 
25d60 74 68 61 74 20 67 65 6e 65 72 61 74 65 73 20 74  that generates t
25d70 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f  he code for a co
25d80 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 77 69  mpound SELECT wi
25d90 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  th an ORDER BY c
25da0 6c 61 75 73 65 0a 2a 2a 20 75 73 65 73 20 61 20  lause.** uses a 
25db0 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20  merge algorithm 
25dc0 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68  that requires th
25dd0 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67  e same collating
25de0 20 73 65 71 75 65 6e 63 65 20 6f 6e 20 74 68 65   sequence on the
25df0 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  .** result colum
25e00 6e 73 20 61 73 20 6f 6e 20 74 68 65 20 4f 52 44  ns as on the ORD
25e10 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 53  ER BY clause.  S
25e20 65 65 20 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74  ee ticket.** htt
25e30 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f  p://www.sqlite.o
25e40 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39  rg/src/info/6709
25e50 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69  574d2a.**.** Thi
25e60 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  s transformation
25e70 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20   is only needed 
25e80 66 6f 72 20 45 58 43 45 50 54 2c 20 49 4e 54 45  for EXCEPT, INTE
25e90 52 53 45 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e  RSECT, and UNION
25ea0 2e 0a 2a 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41  ..** The UNION A
25eb0 4c 4c 20 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b  LL operator work
25ec0 73 20 66 69 6e 65 20 77 69 74 68 20 6d 75 6c 74  s fine with mult
25ed0 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29  iSelectOrderBy()
25ee0 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68   even when.** th
25ef0 65 72 65 20 61 72 65 20 43 4f 4c 4c 41 54 45 20  ere are COLLATE 
25f00 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44  terms in the ORD
25f10 45 52 20 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63  ER BY..*/.static
25f20 20 69 6e 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70   int convertComp
25f30 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71  oundSelectToSubq
25f40 75 65 72 79 28 57 61 6c 6b 65 72 20 2a 70 57 61  uery(Walker *pWa
25f50 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
25f60 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c  {.  int i;.  Sel
25f70 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c  ect *pNew;.  Sel
25f80 65 63 74 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74  ect *pX;.  sqlit
25f90 65 33 20 2a 64 62 3b 0a 20 20 73 74 72 75 63 74  e3 *db;.  struct
25fa0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
25fb0 61 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e  a;.  SrcList *pN
25fc0 65 77 53 72 63 3b 0a 20 20 50 61 72 73 65 20 2a  ewSrc;.  Parse *
25fd0 70 50 61 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20  pParse;.  Token 
25fe0 64 75 6d 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d  dummy;..  if( p-
25ff0 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74  >pPrior==0 ) ret
26000 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
26010 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  ;.  if( p->pOrde
26020 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  rBy==0 ) return 
26030 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
26040 66 6f 72 28 70 58 3d 70 3b 20 70 58 20 26 26 20  for(pX=p; pX && 
26050 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  (pX->op==TK_ALL 
26060 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  || pX->op==TK_SE
26070 4c 45 43 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50  LECT); pX=pX->pP
26080 72 69 6f 72 29 7b 7d 0a 20 20 69 66 28 20 70 58  rior){}.  if( pX
26090 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
260a0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d  _Continue;.  a =
260b0 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b   p->pOrderBy->a;
260c0 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64  .  for(i=p->pOrd
260d0 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69  erBy->nExpr-1; i
260e0 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
260f0 66 28 20 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66  f( a[i].pExpr->f
26100 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
26110 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  e ) break;.  }. 
26120 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72   if( i<0 ) retur
26130 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
26140 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
26150 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  h this point, th
26160 61 74 20 6d 65 61 6e 73 20 74 68 65 20 74 72 61  at means the tra
26170 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72  nsformation is r
26180 65 71 75 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70  equired. */..  p
26190 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
261a0 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20  >pParse;.  db = 
261b0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e  pParse->db;.  pN
261c0 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
261d0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
261e0 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
261f0 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
26200 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
26210 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c    memset(&dummy,
26220 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79   0, sizeof(dummy
26230 29 29 3b 0a 20 20 70 4e 65 77 53 72 63 20 3d 20  ));.  pNewSrc = 
26240 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
26250 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61  pendFromTerm(pPa
26260 72 73 65 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79  rse,0,0,0,&dummy
26270 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66  ,pNew,0,0);.  if
26280 28 20 70 4e 65 77 53 72 63 3d 3d 30 20 29 20 72  ( pNewSrc==0 ) r
26290 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
262a0 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20  .  *pNew = *p;. 
262b0 20 70 2d 3e 70 53 72 63 20 3d 20 70 4e 65 77 53   p->pSrc = pNewS
262c0 72 63 3b 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20  rc;.  p->pEList 
262d0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
262e0 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
262f0 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64  0, sqlite3Expr(d
26300 62 2c 20 54 4b 5f 41 53 54 45 52 49 53 4b 2c 20  b, TK_ASTERISK, 
26310 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54  0));.  p->op = T
26320 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70  K_SELECT;.  p->p
26330 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65  Where = 0;.  pNe
26340 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b  w->pGroupBy = 0;
26350 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67  .  pNew->pHaving
26360 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f   = 0;.  pNew->pO
26370 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d  rderBy = 0;.  p-
26380 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70  >pPrior = 0;.  p
26390 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70  ->pNext = 0;.  p
263a0 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20 20 70  ->pWith = 0;.  p
263b0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
263c0 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 61 73  F_Compound;.  as
263d0 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61  sert( (p->selFla
263e0 67 73 20 26 20 53 46 5f 43 6f 6e 76 65 72 74 65  gs & SF_Converte
263f0 64 29 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 65  d)==0 );.  p->se
26400 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6e  lFlags |= SF_Con
26410 76 65 72 74 65 64 3b 0a 20 20 61 73 73 65 72 74  verted;.  assert
26420 28 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 21 3d  ( pNew->pPrior!=
26430 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72  0 );.  pNew->pPr
26440 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65  ior->pNext = pNe
26450 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69  w;.  pNew->pLimi
26460 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
26470 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
26480 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
26490 73 65 65 20 69 66 20 74 68 65 20 46 52 4f 4d 20  see if the FROM 
264a0 63 6c 61 75 73 65 20 74 65 72 6d 20 70 46 72 6f  clause term pFro
264b0 6d 20 68 61 73 20 74 61 62 6c 65 2d 76 61 6c 75  m has table-valu
264c0 65 64 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  ed function.** a
264d0 72 67 75 6d 65 6e 74 73 2e 20 20 49 66 20 69 74  rguments.  If it
264e0 20 64 6f 65 73 2c 20 6c 65 61 76 65 20 61 6e 20   does, leave an 
264f0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
26500 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
26510 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  rn.** non-zero, 
26520 73 69 6e 63 65 20 70 46 72 6f 6d 20 69 73 20 6e  since pFrom is n
26530 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  ot allowed to be
26540 20 61 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 20   a table-valued 
26550 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
26560 74 69 63 20 69 6e 74 20 63 61 6e 6e 6f 74 42 65  tic int cannotBe
26570 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  Function(Parse *
26580 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53  pParse, struct S
26590 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
265a0 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d  om){.  if( pFrom
265b0 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29  ->fg.isTabFunc )
265c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
265d0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 27  orMsg(pParse, "'
265e0 25 73 27 20 69 73 20 6e 6f 74 20 61 20 66 75 6e  %s' is not a fun
265f0 63 74 69 6f 6e 22 2c 20 70 46 72 6f 6d 2d 3e 7a  ction", pFrom->z
26600 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
26610 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
26620 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  n 0;.}..#ifndef 
26630 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
26640 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
26650 57 69 74 68 20 28 77 68 69 63 68 20 6d 61 79 20  With (which may 
26660 62 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73 20  be NULL) points 
26670 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  to a linked list
26680 20 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20 57   of nested .** W
26690 49 54 48 20 63 6f 6e 74 65 78 74 73 2c 20 66 72  ITH contexts, fr
266a0 6f 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74 65  om inner to oute
266b0 72 6d 6f 73 74 2e 20 49 66 20 74 68 65 20 74 61  rmost. If the ta
266c0 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  ble identified b
266d0 79 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73  y .** FROM claus
266e0 65 20 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d 20  e element pItem 
266f0 69 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d 6d  is really a comm
26700 6f 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65 73 73  on-table-express
26710 69 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74 68  ion (CTE) .** th
26720 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  en return a poin
26730 74 65 72 20 74 6f 20 74 68 65 20 43 54 45 20 64  ter to the CTE d
26740 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74 68  efinition for th
26750 61 74 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 77  at table. Otherw
26760 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e 55  ise.** return NU
26770 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e  LL..**.** If a n
26780 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73  on-NULL value is
26790 20 72 65 74 75 72 6e 65 64 2c 20 73 65 74 20 2a   returned, set *
267a0 70 70 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f 69  ppContext to poi
267b0 6e 74 20 74 6f 20 74 68 65 20 57 69 74 68 0a 2a  nt to the With.*
267c0 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68  * object that th
267d0 65 20 72 65 74 75 72 6e 65 64 20 43 54 45 20 62  e returned CTE b
267e0 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74  elongs to..*/.st
267f0 61 74 69 63 20 73 74 72 75 63 74 20 43 74 65 20  atic struct Cte 
26800 2a 73 65 61 72 63 68 57 69 74 68 28 0a 20 20 57  *searchWith(.  W
26810 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20  ith *pWith,     
26820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26830 2a 20 43 75 72 72 65 6e 74 20 69 6e 6e 65 72 6d  * Current innerm
26840 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65 20  ost WITH clause 
26850 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
26860 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c  ist_item *pItem,
26870 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
26880 75 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20 72  use element to r
26890 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74 68  esolve */.  With
268a0 20 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20 20 20   **ppContext    
268b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
268c0 55 54 3a 20 57 49 54 48 20 63 6c 61 75 73 65 20  UT: WITH clause 
268d0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 62 65 6c  return value bel
268e0 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20  ongs to */.){.  
268f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
26900 65 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  e;.  if( pItem->
26910 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 26 26 20  zDatabase==0 && 
26920 28 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e  (zName = pItem->
26930 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
26940 20 57 69 74 68 20 2a 70 3b 0a 20 20 20 20 66 6f   With *p;.    fo
26950 72 28 70 3d 70 57 69 74 68 3b 20 70 3b 20 70 3d  r(p=pWith; p; p=
26960 70 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20 20  p->pOuter){.    
26970 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
26980 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74  or(i=0; i<p->nCt
26990 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
269a0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
269b0 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b  Cmp(zName, p->a[
269c0 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
269d0 20 20 20 20 20 20 20 20 20 20 2a 70 70 43 6f 6e            *ppCon
269e0 74 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  text = p;.      
269f0 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61      return &p->a
26a00 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  [i];.        }. 
26a10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
26a20 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
26a30 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  /* The code gene
26a40 72 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73 20  rator maintains 
26a50 61 20 73 74 61 63 6b 20 6f 66 20 61 63 74 69 76  a stack of activ
26a60 65 20 57 49 54 48 20 63 6c 61 75 73 65 73 0a 2a  e WITH clauses.*
26a70 2a 20 77 69 74 68 20 74 68 65 20 69 6e 6e 65 72  * with the inner
26a80 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73  -most WITH claus
26a90 65 20 62 65 69 6e 67 20 61 74 20 74 68 65 20 74  e being at the t
26aa0 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  op of the stack.
26ab0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
26ac0 69 6e 65 20 70 75 73 68 65 73 20 74 68 65 20 57  ine pushes the W
26ad0 49 54 48 20 63 6c 61 75 73 65 20 70 61 73 73 65  ITH clause passe
26ae0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
26af0 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f  argument.** onto
26b00 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
26b10 73 74 61 63 6b 2e 20 49 66 20 61 72 67 75 6d 65  stack. If argume
26b20 6e 74 20 62 46 72 65 65 20 69 73 20 74 72 75 65  nt bFree is true
26b30 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 57  , then this.** W
26b40 49 54 48 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  ITH clause will 
26b50 6e 65 76 65 72 20 62 65 20 70 6f 70 70 65 64 20  never be popped 
26b60 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20  from the stack. 
26b70 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 0a  In this case it.
26b80 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65  ** should be fre
26b90 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
26ba0 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 20  e Parse object. 
26bb0 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20  In other cases, 
26bc0 77 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d 30  when.** bFree==0
26bd0 2c 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63  , the With objec
26be0 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  t will be freed 
26bf0 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 53  along with the S
26c00 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74 65 6d  ELECT .** statem
26c10 65 6e 74 20 77 69 74 68 20 77 68 69 63 68 20 69  ent with which i
26c20 74 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 2e  t is associated.
26c30 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
26c40 57 69 74 68 50 75 73 68 28 50 61 72 73 65 20 2a  WithPush(Parse *
26c50 70 50 61 72 73 65 2c 20 57 69 74 68 20 2a 70 57  pParse, With *pW
26c60 69 74 68 2c 20 75 38 20 62 46 72 65 65 29 7b 0a  ith, u8 bFree){.
26c70 20 20 61 73 73 65 72 74 28 20 62 46 72 65 65 3d    assert( bFree=
26c80 3d 30 20 7c 7c 20 28 70 50 61 72 73 65 2d 3e 70  =0 || (pParse->p
26c90 57 69 74 68 3d 3d 30 20 26 26 20 70 50 61 72 73  With==0 && pPars
26ca0 65 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 3d 3d  e->pWithToFree==
26cb0 30 29 20 29 3b 0a 20 20 69 66 28 20 70 57 69 74  0) );.  if( pWit
26cc0 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  h ){.    assert(
26cd0 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 21 3d   pParse->pWith!=
26ce0 70 57 69 74 68 20 29 3b 0a 20 20 20 20 70 57 69  pWith );.    pWi
26cf0 74 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50 61  th->pOuter = pPa
26d00 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20  rse->pWith;.    
26d10 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
26d20 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20 62  pWith;.    if( b
26d30 46 72 65 65 20 29 20 70 50 61 72 73 65 2d 3e 70  Free ) pParse->p
26d40 57 69 74 68 54 6f 46 72 65 65 20 3d 20 70 57 69  WithToFree = pWi
26d50 74 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  th;.  }.}../*.**
26d60 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
26d70 68 65 63 6b 73 20 69 66 20 61 72 67 75 6d 65 6e  hecks if argumen
26d80 74 20 70 46 72 6f 6d 20 72 65 66 65 72 73 20 74  t pFrom refers t
26d90 6f 20 61 20 43 54 45 20 64 65 63 6c 61 72 65 64  o a CTE declared
26da0 20 62 79 20 0a 2a 2a 20 61 20 57 49 54 48 20 63   by .** a WITH c
26db0 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 73 74 61  lause on the sta
26dc0 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 6d 61 69  ck currently mai
26dd0 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65 20 70  ntained by the p
26de0 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69  arser. And,.** i
26df0 66 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63  f currently proc
26e00 65 73 73 69 6e 67 20 61 20 43 54 45 20 65 78 70  essing a CTE exp
26e10 72 65 73 73 69 6f 6e 2c 20 69 66 20 69 74 20 69  ression, if it i
26e20 73 20 61 20 72 65 63 75 72 73 69 76 65 0a 2a 2a  s a recursive.**
26e30 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
26e40 65 20 63 75 72 72 65 6e 74 20 43 54 45 2e 0a 2a  e current CTE..*
26e50 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 66 61  *.** If pFrom fa
26e60 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68 65 72 20  lls into either 
26e70 6f 66 20 74 68 65 20 74 77 6f 20 63 61 74 65 67  of the two categ
26e80 6f 72 69 65 73 20 61 62 6f 76 65 2c 20 70 46 72  ories above, pFr
26e90 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e 64 20  om->pTab.** and 
26ea0 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65  other fields are
26eb0 20 70 6f 70 75 6c 61 74 65 64 20 61 63 63 6f 72   populated accor
26ec0 64 69 6e 67 6c 79 2e 20 54 68 65 20 63 61 6c 6c  dingly. The call
26ed0 65 72 20 73 68 6f 75 6c 64 20 63 68 65 63 6b 0a  er should check.
26ee0 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54 61 62 21  ** (pFrom->pTab!
26ef0 3d 30 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  =0) to determine
26f00 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
26f10 61 20 73 75 63 63 65 73 73 66 75 6c 20 6d 61 74  a successful mat
26f20 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75 6e 64 2e  ch.** was found.
26f30 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f  .**.** Whether o
26f40 72 20 6e 6f 74 20 61 20 6d 61 74 63 68 20 69 73  r not a match is
26f50 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54 45 5f 4f   found, SQLITE_O
26f60 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
26f70 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63   no error.** occ
26f80 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  urs. If an error
26f90 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e 20   does occur, an 
26fa0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
26fb0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a   stored in the.*
26fc0 2a 20 70 61 72 73 65 72 20 61 6e 64 20 73 6f 6d  * parser and som
26fd0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  e error code oth
26fe0 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
26ff0 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
27000 74 61 74 69 63 20 69 6e 74 20 77 69 74 68 45 78  tatic int withEx
27010 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65 72 20 2a  pand(.  Walker *
27020 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73 74 72 75  pWalker, .  stru
27030 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
27040 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50 61 72 73  *pFrom.){.  Pars
27050 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
27060 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73  ker->pParse;.  s
27070 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
27080 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74 72 75 63  rse->db;.  struc
27090 74 20 43 74 65 20 2a 70 43 74 65 3b 20 20 20 20  t Cte *pCte;    
270a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
270b0 74 63 68 65 64 20 43 54 45 20 28 6f 72 20 4e 55  tched CTE (or NU
270c0 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63 68 29 20  LL if no match) 
270d0 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68  */.  With *pWith
270e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
270f0 20 20 20 20 20 2f 2a 20 57 49 54 48 20 63 6c 61       /* WITH cla
27100 75 73 65 20 74 68 61 74 20 70 43 74 65 20 62 65  use that pCte be
27110 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61  longs to */..  a
27120 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
27130 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70 43 74 65  ab==0 );..  pCte
27140 20 3d 20 73 65 61 72 63 68 57 69 74 68 28 70 50   = searchWith(pP
27150 61 72 73 65 2d 3e 70 57 69 74 68 2c 20 70 46 72  arse->pWith, pFr
27160 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a 20 20 69  om, &pWith);.  i
27170 66 28 20 70 43 74 65 20 29 7b 0a 20 20 20 20 54  f( pCte ){.    T
27180 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
27190 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
271a0 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53  ;.    Select *pS
271b0 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  el;.    Select *
271c0 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20  pLeft;          
271d0 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f        /* Left-mo
271e0 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  st SELECT statem
271f0 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  ent */.    int b
27200 4d 61 79 52 65 63 75 72 73 69 76 65 3b 20 20 20  MayRecursive;   
27210 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
27220 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69   if compound joi
27230 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20 5b 41 4c  ned by UNION [AL
27240 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74 68 20 2a  L] */.    With *
27250 70 53 61 76 65 64 57 69 74 68 3b 20 20 20 20 20  pSavedWith;     
27260 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
27270 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 50 61 72  al value of pPar
27280 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a 20 20  se->pWith */..  
27290 20 20 2f 2a 20 49 66 20 70 43 74 65 2d 3e 7a 43    /* If pCte->zC
272a0 74 65 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c  teErr is non-NUL
272b0 4c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  L at this point,
272c0 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 6e   then this is an
272d0 20 69 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20   illegal.    ** 
272e0 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
272f0 6e 63 65 20 74 6f 20 43 54 45 20 70 43 74 65 2e  nce to CTE pCte.
27300 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   Leave an error 
27310 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
27320 74 75 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c  turn.    ** earl
27330 79 2e 20 49 66 20 70 43 74 65 2d 3e 7a 43 74 65  y. If pCte->zCte
27340 45 72 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  Err is NULL, the
27350 6e 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  n this is not a 
27360 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
27370 6e 63 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74  nce..    ** In t
27380 68 69 73 20 63 61 73 65 2c 20 70 72 6f 63 65 65  his case, procee
27390 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  d.  */.    if( p
273a0 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 29 7b 0a  Cte->zCteErr ){.
273b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
273c0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70 43  orMsg(pParse, pC
273d0 74 65 2d 3e 7a 43 74 65 45 72 72 2c 20 70 43 74  te->zCteErr, pCt
273e0 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e->zName);.     
273f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
27400 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
27410 69 66 28 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63  if( cannotBeFunc
27420 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 46 72  tion(pParse, pFr
27430 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  om) ) return SQL
27440 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 20 20  ITE_ERROR;..    
27450 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
27460 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46  Tab==0 );.    pF
27470 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
27480 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
27490 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
274a0 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 69  f(Table));.    i
274b0 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74  f( pTab==0 ) ret
274c0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
274d0 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66     pTab->nTabRef
274e0 20 3d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e   = 1;.    pTab->
274f0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
27500 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 74 65  bStrDup(db, pCte
27510 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54  ->zName);.    pT
27520 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
27530 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f      pTab->nRowLo
27540 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65  gEst = 200; asse
27550 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33  rt( 200==sqlite3
27560 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20  LogEst(1048576) 
27570 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62  );.    pTab->tab
27580 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65  Flags |= TF_Ephe
27590 6d 65 72 61 6c 20 7c 20 54 46 5f 4e 6f 56 69 73  meral | TF_NoVis
275a0 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20 70  ibleRowid;.    p
275b0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  From->pSelect = 
275c0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
275d0 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65  (db, pCte->pSele
275e0 63 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ct, 0);.    if( 
275f0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
27600 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
27610 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
27620 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
27630 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20  pSelect );..    
27640 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73  /* Check if this
27650 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65 20   is a recursive 
27660 43 54 45 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c  CTE. */.    pSel
27670 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
27680 74 3b 0a 20 20 20 20 62 4d 61 79 52 65 63 75 72  t;.    bMayRecur
27690 73 69 76 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f  sive = ( pSel->o
276a0 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65  p==TK_ALL || pSe
276b0 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  l->op==TK_UNION 
276c0 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52  );.    if( bMayR
276d0 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
276e0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 53    int i;.      S
276f0 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70  rcList *pSrc = p
27700 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  From->pSelect->p
27710 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Src;.      for(i
27720 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  =0; i<pSrc->nSrc
27730 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
27740 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
27750 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53  tem *pItem = &pS
27760 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
27770 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61    if( pItem->zDa
27780 74 61 62 61 73 65 3d 3d 30 20 0a 20 20 20 20 20  tabase==0 .     
27790 20 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e      && pItem->zN
277a0 61 6d 65 21 3d 30 20 0a 20 20 20 20 20 20 20 20  ame!=0 .        
277b0 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
277c0 72 49 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61  rICmp(pItem->zNa
277d0 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29  me, pCte->zName)
277e0 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
277f0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
27800 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20  Tab = pTab;.    
27810 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e        pItem->fg.
27820 69 73 52 65 63 75 72 73 69 76 65 20 3d 20 31 3b  isRecursive = 1;
27830 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d  .          pTab-
27840 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20  >nTabRef++;.    
27850 20 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46        pSel->selF
27860 6c 61 67 73 20 7c 3d 20 53 46 5f 52 65 63 75 72  lags |= SF_Recur
27870 73 69 76 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  sive;.        }.
27880 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
27890 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72     /* Only one r
278a0 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
278b0 63 65 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ce is permitted.
278c0 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 70 54 61   */ .    if( pTa
278d0 62 2d 3e 6e 54 61 62 52 65 66 3e 32 20 29 7b 0a  b->nTabRef>2 ){.
278e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
278f0 6f 72 4d 73 67 28 0a 20 20 20 20 20 20 20 20 20  orMsg(.         
27900 20 70 50 61 72 73 65 2c 20 22 6d 75 6c 74 69 70   pParse, "multip
27910 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  le references to
27920 20 72 65 63 75 72 73 69 76 65 20 74 61 62 6c 65   recursive table
27930 3a 20 25 73 22 2c 20 70 43 74 65 2d 3e 7a 4e 61  : %s", pCte->zNa
27940 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  me.      );.    
27950 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27960 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
27970 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
27980 54 61 62 52 65 66 3d 3d 31 20 7c 7c 20 0a 20 20  TabRef==1 || .  
27990 20 20 20 20 20 20 20 20 20 20 28 28 70 53 65 6c            ((pSel
279a0 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 52 65  ->selFlags&SF_Re
279b0 63 75 72 73 69 76 65 29 20 26 26 20 70 54 61 62  cursive) && pTab
279c0 2d 3e 6e 54 61 62 52 65 66 3d 3d 32 20 29 29 3b  ->nTabRef==2 ));
279d0 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65  ..    pCte->zCte
279e0 45 72 72 20 3d 20 22 63 69 72 63 75 6c 61 72 20  Err = "circular 
279f0 72 65 66 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a  reference: %s";.
27a00 20 20 20 20 70 53 61 76 65 64 57 69 74 68 20 3d      pSavedWith =
27a10 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a   pParse->pWith;.
27a20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
27a30 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 69  h = pWith;.    i
27a40 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65  f( bMayRecursive
27a50 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74   ){.      Select
27a60 20 2a 70 50 72 69 6f 72 20 3d 20 70 53 65 6c 2d   *pPrior = pSel-
27a70 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 61  >pPrior;.      a
27a80 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
27a90 57 69 74 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20  With==0 );.     
27aa0 20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d   pPrior->pWith =
27ab0 20 70 53 65 6c 2d 3e 70 57 69 74 68 3b 0a 20 20   pSel->pWith;.  
27ac0 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
27ad0 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
27ae0 50 72 69 6f 72 29 3b 0a 20 20 20 20 20 20 70 50  Prior);.      pP
27af0 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d 20 30 3b  rior->pWith = 0;
27b00 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
27b10 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
27b20 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65  ect(pWalker, pSe
27b30 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  l);.    }.    pP
27b40 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57  arse->pWith = pW
27b50 69 74 68 3b 0a 0a 20 20 20 20 66 6f 72 28 70 4c  ith;..    for(pL
27b60 65 66 74 3d 70 53 65 6c 3b 20 70 4c 65 66 74 2d  eft=pSel; pLeft-
27b70 3e 70 50 72 69 6f 72 3b 20 70 4c 65 66 74 3d 70  >pPrior; pLeft=p
27b80 4c 65 66 74 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  Left->pPrior);. 
27b90 20 20 20 70 45 4c 69 73 74 20 3d 20 70 4c 65 66     pEList = pLef
27ba0 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69  t->pEList;.    i
27bb0 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c 73 20 29  f( pCte->pCols )
27bc0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c 69  {.      if( pELi
27bd0 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
27be0 78 70 72 21 3d 70 43 74 65 2d 3e 70 43 6f 6c 73  xpr!=pCte->pCols
27bf0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
27c00 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
27c10 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
27c20 65 20 25 73 20 68 61 73 20 25 64 20 76 61 6c 75  e %s has %d valu
27c30 65 73 20 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e  es for %d column
27c40 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
27c50 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c  pCte->zName, pEL
27c60 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65  ist->nExpr, pCte
27c70 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20  ->pCols->nExpr. 
27c80 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
27c90 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
27ca0 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20  = pSavedWith;.  
27cb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
27cc0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
27cd0 20 7d 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20   }.      pEList 
27ce0 3d 20 70 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20  = pCte->pCols;. 
27cf0 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
27d00 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  3ColumnsFromExpr
27d10 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c  List(pParse, pEL
27d20 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c  ist, &pTab->nCol
27d30 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  , &pTab->aCol);.
27d40 20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75      if( bMayRecu
27d50 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69  rsive ){.      i
27d60 66 28 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67  f( pSel->selFlag
27d70 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
27d80 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65   ){.        pCte
27d90 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 6d 75 6c  ->zCteErr = "mul
27da0 74 69 70 6c 65 20 72 65 63 75 72 73 69 76 65 20  tiple recursive 
27db0 72 65 66 65 72 65 6e 63 65 73 3a 20 25 73 22 3b  references: %s";
27dc0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
27dd0 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65        pCte->zCte
27de0 45 72 72 20 3d 20 22 72 65 63 75 72 73 69 76 65  Err = "recursive
27df0 20 72 65 66 65 72 65 6e 63 65 20 69 6e 20 61 20   reference in a 
27e00 73 75 62 71 75 65 72 79 3a 20 25 73 22 3b 0a 20  subquery: %s";. 
27e10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
27e20 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
27e30 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20  Walker, pSel);. 
27e40 20 20 20 7d 0a 20 20 20 20 70 43 74 65 2d 3e 7a     }.    pCte->z
27e50 43 74 65 45 72 72 20 3d 20 30 3b 0a 20 20 20 20  CteErr = 0;.    
27e60 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
27e70 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20 7d 0a  pSavedWith;.  }.
27e80 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
27e90 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  _OK;.}.#endif..#
27ea0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
27eb0 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20  IT_CTE./*.** If 
27ec0 74 68 65 20 53 45 4c 45 43 54 20 70 61 73 73 65  the SELECT passe
27ed0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
27ee0 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 6e 20  argument has an 
27ef0 61 73 73 6f 63 69 61 74 65 64 20 57 49 54 48 20  associated WITH 
27f00 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 70 6f 70 20  .** clause, pop 
27f10 69 74 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63  it from the stac
27f20 6b 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74  k stored as part
27f30 20 6f 66 20 74 68 65 20 50 61 72 73 65 20 6f 62   of the Parse ob
27f40 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ject..**.** This
27f50 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
27f60 64 20 61 73 20 74 68 65 20 78 53 65 6c 65 63 74  d as the xSelect
27f70 43 61 6c 6c 62 61 63 6b 32 28 29 20 63 61 6c 6c  Callback2() call
27f80 62 61 63 6b 20 62 79 0a 2a 2a 20 73 71 6c 69 74  back by.** sqlit
27f90 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29  e3SelectExpand()
27fa0 20 77 68 65 6e 20 77 61 6c 6b 69 6e 67 20 61 20   when walking a 
27fb0 53 45 4c 45 43 54 20 74 72 65 65 20 74 6f 20 72  SELECT tree to r
27fc0 65 73 6f 6c 76 65 20 74 61 62 6c 65 0a 2a 2a 20  esolve table.** 
27fd0 6e 61 6d 65 73 20 61 6e 64 20 6f 74 68 65 72 20  names and other 
27fe0 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d  FROM clause elem
27ff0 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  ents. .*/.static
28000 20 76 6f 69 64 20 73 65 6c 65 63 74 50 6f 70 57   void selectPopW
28010 69 74 68 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ith(Walker *pWal
28020 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
28030 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
28040 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
28050 73 65 3b 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f  se;.  if( OK_IF_
28060 41 4c 57 41 59 53 5f 54 52 55 45 28 70 50 61 72  ALWAYS_TRUE(pPar
28070 73 65 2d 3e 70 57 69 74 68 29 20 26 26 20 70 2d  se->pWith) && p-
28080 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20  >pPrior==0 ){.  
28090 20 20 57 69 74 68 20 2a 70 57 69 74 68 20 3d 20    With *pWith = 
280a0 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29  findRightmost(p)
280b0 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28  ->pWith;.    if(
280c0 20 70 57 69 74 68 21 3d 30 20 29 7b 0a 20 20 20   pWith!=0 ){.   
280d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
280e0 65 2d 3e 70 57 69 74 68 3d 3d 70 57 69 74 68 20  e->pWith==pWith 
280f0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
28100 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 2d 3e  >pWith = pWith->
28110 70 4f 75 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20  pOuter;.    }.  
28120 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  }.}.#else.#defin
28130 65 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 20  e selectPopWith 
28140 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
28150 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
28160 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63  a Walker callbac
28170 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67  k for "expanding
28180 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  " a SELECT state
28190 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64  ment..** "Expand
281a0 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f  ing" means to do
281b0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
281c0 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61  **.**    (1)  Ma
281d0 6b 65 20 73 75 72 65 20 56 44 42 45 20 63 75 72  ke sure VDBE cur
281e0 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65  sor numbers have
281f0 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74   been assigned t
28200 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20  o every.**      
28210 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68     element of th
28220 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a  e FROM clause..*
28230 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c  *.**    (2)  Fil
28240 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73  l in the pTabLis
28250 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c  t->a[].pTab fiel
28260 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73  ds in the SrcLis
28270 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20  t that .**      
28280 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20     defines FROM 
28290 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69  clause.  When vi
282a0 65 77 73 20 61 70 70 65 61 72 20 69 6e 20 74 68  ews appear in th
282b0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a  e FROM clause,.*
282c0 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70  *         fill p
282d0 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65  TabList->a[].pSe
282e0 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79  lect with a copy
282f0 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
28300 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
28310 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65      that impleme
28320 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41  nts the view.  A
28330 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66   copy is made of
28340 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45   the view's SELE
28350 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74  CT.**         st
28360 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20  atement so that 
28370 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f  we can freely mo
28380 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74  dify or delete t
28390 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  hat statement.**
283a0 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74           without
283b0 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20   worrying about 
283c0 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70  messing up the p
283d0 65 72 73 69 73 74 65 6e 74 20 72 65 70 72 65 73  ersistent repres
283e0 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  entation.**     
283f0 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e      of the view.
28400 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41  .**.**    (3)  A
28410 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  dd terms to the 
28420 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
28430 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65 20  accommodate the 
28440 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a  NATURAL keyword.
28450 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f  **         on jo
28460 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61  ins and the ON a
28470 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  nd USING clause 
28480 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20  of joins..**.** 
28490 20 20 20 28 34 29 20 20 53 63 61 6e 20 74 68 65     (4)  Scan the
284a0 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
284b0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
284c0 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b  et (pEList) look
284d0 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  ing.**         f
284e0 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  or instances of 
284f0 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72  the "*" operator
28500 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20   or the TABLE.* 
28510 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20  operator..**    
28520 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65       If found, e
28530 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74  xpand each "*" t
28540 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
28550 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65  n in every table
28560 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20  .**         and 
28570 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76  TABLE.* to be ev
28580 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41  ery column in TA
28590 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  BLE..**.*/.stati
285a0 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61  c int selectExpa
285b0 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61  nder(Walker *pWa
285c0 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
285d0 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
285e0 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
285f0 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  rse;.  int i, j,
28600 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   k;.  SrcList *p
28610 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c  TabList;.  ExprL
28620 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73  ist *pEList;.  s
28630 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
28640 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c  em *pFrom;.  sql
28650 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
28660 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70  e->db;.  Expr *p
28670 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70 45 78  E, *pRight, *pEx
28680 70 72 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c 61  pr;.  u16 selFla
28690 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73  gs = p->selFlags
286a0 3b 0a 20 20 75 33 32 20 65 6c 69 73 74 46 6c 61  ;.  u32 elistFla
286b0 67 73 20 3d 20 30 3b 0a 0a 20 20 70 2d 3e 73 65  gs = 0;..  p->se
286c0 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78 70  lFlags |= SF_Exp
286d0 61 6e 64 65 64 3b 0a 20 20 69 66 28 20 64 62 2d  anded;.  if( db-
286e0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29  >mallocFailed  )
286f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
28700 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 61 73  _Abort;.  }.  as
28710 73 65 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30  sert( p->pSrc!=0
28720 20 29 3b 0a 20 20 69 66 28 20 28 73 65 6c 46 6c   );.  if( (selFl
28730 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65  ags & SF_Expande
28740 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  d)!=0 ){.    ret
28750 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
28760 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20   }.  pTabList = 
28770 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  p->pSrc;.  pELis
28780 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
28790 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68   sqlite3WithPush
287a0 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 57 69 74  (pParse, p->pWit
287b0 68 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  h, 0);..  /* Mak
287c0 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75  e sure cursor nu
287d0 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
287e0 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20  assigned to all 
287f0 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20  entries in.  ** 
28800 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
28810 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
28820 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
28830 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
28840 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
28850 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a  se, pTabList);..
28860 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65    /* Look up eve
28870 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69  ry table named i
28880 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
28890 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  e of the select.
288a0 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74    If.  ** an ent
288b0 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
288c0 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75  lause is a subqu
288d0 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ery instead of a
288e0 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a   table or view,.
288f0 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65    ** then create
28900 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62   a transient tab
28910 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  le structure to 
28920 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62  describe the sub
28930 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f  query..  */.  fo
28940 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
28950 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
28960 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
28970 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54   pFrom++){.    T
28980 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
28990 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 66  assert( pFrom->f
289a0 67 2e 69 73 52 65 63 75 72 73 69 76 65 3d 3d 30  g.isRecursive==0
289b0 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21   || pFrom->pTab!
289c0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46  =0 );.    if( pF
289d0 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73  rom->fg.isRecurs
289e0 69 76 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ive ) continue;.
289f0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
28a00 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 23 69  m->pTab==0 );.#i
28a10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
28a20 54 5f 43 54 45 0a 20 20 20 20 69 66 28 20 77 69  T_CTE.    if( wi
28a30 74 68 45 78 70 61 6e 64 28 70 57 61 6c 6b 65 72  thExpand(pWalker
28a40 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72  , pFrom) ) retur
28a50 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
28a60 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
28a70 20 29 20 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69   ) {} else.#endi
28a80 66 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  f.    if( pFrom-
28a90 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66  >zName==0 ){.#if
28aa0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
28ab0 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20  _SUBQUERY.      
28ac0 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70  Select *pSel = p
28ad0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
28ae0 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75       /* A sub-qu
28af0 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ery in the FROM 
28b00 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
28b10 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  CT */.      asse
28b20 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20  rt( pSel!=0 );. 
28b30 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
28b40 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20  om->pTab==0 );. 
28b50 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
28b60 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
28b70 65 72 2c 20 70 53 65 6c 29 20 29 20 72 65 74 75  er, pSel) ) retu
28b80 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
28b90 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
28ba0 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33  = pTab = sqlite3
28bb0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
28bc0 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b   sizeof(Table));
28bd0 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
28be0 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
28bf0 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61  Abort;.      pTa
28c00 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a  b->nTabRef = 1;.
28c10 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d        if( pFrom-
28c20 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  >zAlias ){.     
28c30 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d     pTab->zName =
28c40 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
28c50 28 64 62 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69  (db, pFrom->zAli
28c60 61 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  as);.      }else
28c70 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  {.        pTab->
28c80 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
28c90 50 72 69 6e 74 66 28 64 62 2c 20 22 73 75 62 71  Printf(db, "subq
28ca0 75 65 72 79 5f 25 70 22 2c 20 28 76 6f 69 64 2a  uery_%p", (void*
28cb0 29 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a  )pTab);.      }.
28cc0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65        while( pSe
28cd0 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65  l->pPrior ){ pSe
28ce0 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  l = pSel->pPrior
28cf0 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ; }.      sqlite
28d00 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  3ColumnsFromExpr
28d10 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
28d20 6c 2d 3e 70 45 4c 69 73 74 2c 26 70 54 61 62 2d  l->pEList,&pTab-
28d30 3e 6e 43 6f 6c 2c 26 70 54 61 62 2d 3e 61 43 6f  >nCol,&pTab->aCo
28d40 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  l);.      pTab->
28d50 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20  iPKey = -1;.    
28d60 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45    pTab->nRowLogE
28d70 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74  st = 200; assert
28d80 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  ( 200==sqlite3Lo
28d90 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b  gEst(1048576) );
28da0 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62  .      pTab->tab
28db0 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65  Flags |= TF_Ephe
28dc0 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20  meral;.#endif.  
28dd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
28de0 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61  * An ordinary ta
28df0 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65  ble or view name
28e00 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
28e10 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  use */.      ass
28e20 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
28e30 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72  ==0 );.      pFr
28e40 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
28e50 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
28e60 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c  ableItem(pParse,
28e70 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20   0, pFrom);.    
28e80 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
28e90 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
28ea0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
28eb0 2d 3e 6e 54 61 62 52 65 66 3e 3d 30 78 66 66 66  ->nTabRef>=0xfff
28ec0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  f ){.        sql
28ed0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
28ee0 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72  rse, "too many r
28ef0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c 22 25  eferences to \"%
28f00 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35 22 2c  s\": max 65535",
28f10 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62  .           pTab
28f20 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
28f30 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
28f40 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
28f50 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
28f60 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d     }.      pTab-
28f70 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20  >nTabRef++;.    
28f80 20 20 69 66 28 20 21 49 73 56 69 72 74 75 61 6c    if( !IsVirtual
28f90 28 70 54 61 62 29 20 26 26 20 63 61 6e 6e 6f 74  (pTab) && cannot
28fa0 42 65 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  BeFunction(pPars
28fb0 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20  e, pFrom) ){.   
28fc0 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
28fd0 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 23  Abort;.      }.#
28fe0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
28ff0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
29000 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54   !defined (SQLIT
29010 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
29020 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20 49  BLE).      if( I
29030 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 7c  sVirtual(pTab) |
29040 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  | pTab->pSelect 
29050 29 7b 0a 20 20 20 20 20 20 20 20 69 31 36 20 6e  ){.        i16 n
29060 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Col;.        if(
29070 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
29080 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
29090 65 2c 20 70 54 61 62 29 20 29 20 72 65 74 75 72  e, pTab) ) retur
290a0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
290b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
290c0 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  om->pSelect==0 )
290d0 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d  ;.        pFrom-
290e0 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
290f0 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
29100 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30  pTab->pSelect, 0
29110 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
29120 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28  e3SelectSetName(
29130 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pFrom->pSelect, 
29140 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
29150 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70 54 61        nCol = pTa
29160 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20  b->nCol;.       
29170 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 2d 31   pTab->nCol = -1
29180 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
29190 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
291a0 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ker, pFrom->pSel
291b0 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 54  ect);.        pT
291c0 61 62 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b  ab->nCol = nCol;
291d0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
291e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f      }..    /* Lo
291f0 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e  cate the index n
29200 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44 45  amed by the INDE
29210 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69  XED BY clause, i
29220 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66  f any. */.    if
29230 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64  ( sqlite3Indexed
29240 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c  ByLookup(pParse,
29250 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20   pFrom) ){.     
29260 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
29270 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
29280 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52  /* Process NATUR
29290 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64  AL keywords, and
292a0 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
292b0 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a  auses of joins..
292c0 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d    */.  if( db->m
292d0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73  allocFailed || s
292e0 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
292f0 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20  (pParse, p) ){. 
29300 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
29310 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ort;.  }..  /* F
29320 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61  or every "*" tha
29330 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  t occurs in the 
29340 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73  column list, ins
29350 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ert the names of
29360 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e  .  ** all column
29370 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e  s in all tables.
29380 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20    And for every 
29390 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74  TABLE.* insert t
293a0 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66  he names.  ** of
293b0 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
293c0 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73  TABLE.  The pars
293d0 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70  er inserted a sp
293e0 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e  ecial expression
293f0 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54  .  ** with the T
29400 4b 5f 41 53 54 45 52 49 53 4b 20 6f 70 65 72 61  K_ASTERISK opera
29410 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22  tor for each "*"
29420 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69   that it found i
29430 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 2a  n the column.  *
29440 2a 20 6c 69 73 74 2e 20 20 54 68 65 20 66 6f 6c  * list.  The fol
29450 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74  lowing code just
29460 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74   has to locate t
29470 68 65 20 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20  he TK_ASTERISK. 
29480 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20   ** expressions 
29490 61 6e 64 20 65 78 70 61 6e 64 20 65 61 63 68 20  and expand each 
294a0 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20  one to the list 
294b0 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
294c0 6e 0a 20 20 2a 2a 20 61 6c 6c 20 74 61 62 6c 65  n.  ** all table
294d0 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
294e0 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74   first loop just
294f0 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69   checks to see i
29500 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
29510 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20  "*" operators.  
29520 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70  ** that need exp
29530 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66  anding..  */.  f
29540 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
29550 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
29560 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e     pE = pEList->
29570 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[k].pExpr;.    
29580 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41  if( pE->op==TK_A
29590 53 54 45 52 49 53 4b 20 29 20 62 72 65 61 6b 3b  STERISK ) break;
295a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d  .    assert( pE-
295b0 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
295c0 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a  E->pRight!=0 );.
295d0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
295e0 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70  op!=TK_DOT || (p
295f0 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70  E->pLeft!=0 && p
29600 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  E->pLeft->op==TK
29610 5f 49 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20  _ID) );.    if( 
29620 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26  pE->op==TK_DOT &
29630 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70  & pE->pRight->op
29640 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 20  ==TK_ASTERISK ) 
29650 62 72 65 61 6b 3b 0a 20 20 20 20 65 6c 69 73 74  break;.    elist
29660 46 6c 61 67 73 20 7c 3d 20 70 45 2d 3e 66 6c 61  Flags |= pE->fla
29670 67 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c  gs;.  }.  if( k<
29680 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
29690 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49  .    /*.    ** I
296a0 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69 74  f we get here it
296b0 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c   means the resul
296c0 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f  t set contains o
296d0 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20  ne or more "*". 
296e0 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20     ** operators 
296f0 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
29700 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20  expanded.  Loop 
29710 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70  through each exp
29720 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69  ression.    ** i
29730 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
29740 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d   and expand them
29750 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20   one by one..   
29760 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45   */.    struct E
29770 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20  xprList_item *a 
29780 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  = pEList->a;.   
29790 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20   ExprList *pNew 
297a0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61  = 0;.    int fla
297b0 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  gs = pParse->db-
297c0 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20  >flags;.    int 
297d0 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61  longNames = (fla
297e0 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c  gs & SQLITE_Full
297f0 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20  ColNames)!=0.   
29800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29810 20 20 20 26 26 20 28 66 6c 61 67 73 20 26 20 53     && (flags & S
29820 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
29830 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f  mes)==0;..    fo
29840 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
29850 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
29860 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45      pE = a[k].pE
29870 78 70 72 3b 0a 20 20 20 20 20 20 65 6c 69 73 74  xpr;.      elist
29880 46 6c 61 67 73 20 7c 3d 20 70 45 2d 3e 66 6c 61  Flags |= pE->fla
29890 67 73 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74  gs;.      pRight
298a0 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20   = pE->pRight;. 
298b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d       assert( pE-
298c0 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
298d0 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20  Right!=0 );.    
298e0 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b    if( pE->op!=TK
298f0 5f 41 53 54 45 52 49 53 4b 0a 20 20 20 20 20 20  _ASTERISK.      
29900 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f   && (pE->op!=TK_
29910 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f  DOT || pRight->o
29920 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 29 0a  p!=TK_ASTERISK).
29930 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
29940 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63 75   /* This particu
29950 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64  lar expression d
29960 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
29970 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20  be expanded..   
29980 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
29990 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
299a0 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
299b0 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e  rse, pNew, a[k].
299c0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
299d0 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
299e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
299f0 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61  ew->nExpr-1].zNa
29a00 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b  me = a[k].zName;
29a10 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
29a20 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
29a30 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a  ].zSpan = a[k].z
29a40 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  Span;.          
29a50 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  a[k].zName = 0;.
29a60 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a            a[k].z
29a70 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Span = 0;.      
29a80 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d    }.        a[k]
29a90 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20  .pExpr = 0;.    
29aa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29ab0 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73   /* This express
29ac0 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20  ion is a "*" or 
29ad0 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20  a "TABLE.*" and 
29ae0 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
29af0 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e      ** expanded.
29b00 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
29b10 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20  tableSeen = 0;  
29b20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20      /* Set to 1 
29b30 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68  when TABLE match
29b40 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68  es */.        ch
29b50 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 20  ar *zTName = 0; 
29b60 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66        /* text of
29b70 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a   name of TABLE *
29b80 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  /.        if( pE
29b90 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a  ->op==TK_DOT ){.
29ba0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
29bb0 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29  ( pE->pLeft!=0 )
29bc0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
29bd0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
29be0 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20  erty(pE->pLeft, 
29bf0 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
29c00 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65            zTName
29c10 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e   = pE->pLeft->u.
29c20 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  zToken;.        
29c30 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  }.        for(i=
29c40 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
29c50 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
29c60 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
29c70 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  om++){.         
29c80 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
29c90 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
29ca0 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
29cb0 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ub = pFrom->pSel
29cc0 65 63 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ect;.          c
29cd0 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20  har *zTabName = 
29ce0 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20  pFrom->zAlias;. 
29cf0 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
29d00 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61 6d 65  har *zSchemaName
29d10 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
29d20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
29d30 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d     if( zTabName=
29d40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
29d50 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61    zTabName = pTa
29d60 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
29d70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
29d80 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
29d90 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20  iled ) break;.  
29da0 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
29db0 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e 73 65  ==0 || (pSub->se
29dc0 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74  lFlags & SF_Nest
29dd0 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20  edFrom)==0 ){.  
29de0 20 20 20 20 20 20 20 20 20 20 70 53 75 62 20 3d            pSub =
29df0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
29e00 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71  if( zTName && sq
29e10 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e  lite3StrICmp(zTN
29e20 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d  ame, zTabName)!=
29e30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
29e40 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
29e50 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
29e60 20 20 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c         iDb = sql
29e70 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
29e80 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
29e90 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ema);.          
29ea0 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20    zSchemaName = 
29eb0 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61 44 62  iDb>=0 ? db->aDb
29ec0 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 20 3a  [iDb].zDbSName :
29ed0 20 22 2a 22 3b 0a 20 20 20 20 20 20 20 20 20 20   "*";.          
29ee0 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  }.          for(
29ef0 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
29f00 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
29f10 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
29f20 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
29f30 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
29f40 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61      char *zColna
29f50 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70  me;  /* The comp
29f60 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  uted column name
29f70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
29f80 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20  char *zToFree;  
29f90 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72   /* Malloced str
29fa0 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73 20 74  ing that needs t
29fb0 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
29fc0 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20            Token 
29fd0 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f  sColname;  /* Co
29fe0 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  mputed column na
29ff0 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f  me as a token */
2a000 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ..            as
2a010 73 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b 0a 20  sert( zName );. 
2a020 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
2a030 54 4e 61 6d 65 20 26 26 20 70 53 75 62 0a 20 20  TName && pSub.  
2a040 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
2a050 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e 4e 61  lite3MatchSpanNa
2a060 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d  me(pSub->pEList-
2a070 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20  >a[j].zSpan, 0, 
2a080 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a 20 20  zTName, 0)==0.  
2a090 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
2a0a0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
2a0b0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
2a0c0 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
2a0d0 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69  /* If a column i
2a0e0 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68 69 64  s marked as 'hid
2a0f0 64 65 6e 27 2c 20 6f 6d 69 74 20 69 74 20 66 72  den', omit it fr
2a100 6f 6d 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a  om the expanded.
2a110 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72              ** r
2a120 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 20 75  esult-set list u
2a130 6e 6c 65 73 73 20 74 68 65 20 53 45 4c 45 43 54  nless the SELECT
2a140 20 68 61 73 20 74 68 65 20 53 46 5f 49 6e 63 6c   has the SF_Incl
2a150 75 64 65 48 69 64 64 65 6e 0a 20 20 20 20 20 20  udeHidden.      
2a160 20 20 20 20 20 20 2a 2a 20 62 69 74 20 73 65 74        ** bit set
2a170 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
2a180 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2a190 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
2a1a0 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64 65 6e  SF_IncludeHidden
2a1b0 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
2a1c0 20 20 26 26 20 49 73 48 69 64 64 65 6e 43 6f 6c    && IsHiddenCol
2a1d0 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  umn(&pTab->aCol[
2a1e0 6a 5d 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  j]) .           
2a1f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2a200 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2a210 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a220 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20        tableSeen 
2a230 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  = 1;..          
2a240 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a 54 4e    if( i>0 && zTN
2a250 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
2a260 20 20 20 20 20 20 20 20 69 66 28 20 28 70 46 72          if( (pFr
2a270 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  om->fg.jointype 
2a280 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30  & JT_NATURAL)!=0
2a290 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a2a0 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75   && tableAndColu
2a2b0 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74  mnIndex(pTabList
2a2c0 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30  , i, zName, 0, 0
2a2d0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
2a2e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2a2f0 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52     /* In a NATUR
2a300 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68  AL join, omit th
2a310 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66  e join columns f
2a320 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20  rom the .       
2a330 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c           ** tabl
2a340 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f  e to the right o
2a350 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20  f the join */.  
2a360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
2a370 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2a380 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a390 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2a3a0 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70 46 72  3IdListIndex(pFr
2a3b0 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d  om->pUsing, zNam
2a3c0 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)>=0 ){.       
2a3d0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
2a3e0 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49   join with a USI
2a3f0 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20  NG clause, omit 
2a400 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20  columns in the. 
2a410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2a420 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66  * using clause f
2a430 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e  rom the table on
2a440 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20   the right. */. 
2a450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
2a460 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2a470 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a480 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2a490 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69     pRight = sqli
2a4a0 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
2a4b0 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  D, zName);.     
2a4c0 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20         zColname 
2a4d0 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  = zName;.       
2a4e0 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 30       zToFree = 0
2a4f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2a500 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70  ( longNames || p
2a510 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20  TabList->nSrc>1 
2a520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2a530 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20   Expr *pLeft;.  
2a540 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66              pLef
2a550 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
2a560 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e  db, TK_ID, zTabN
2a570 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
2a580 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
2a590 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
2a5a0 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20   TK_DOT, pLeft, 
2a5b0 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
2a5c0 20 20 20 20 20 20 20 69 66 28 20 7a 53 63 68 65         if( zSche
2a5d0 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  maName ){.      
2a5e0 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20            pLeft 
2a5f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
2a600 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61  , TK_ID, zSchema
2a610 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
2a620 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
2a630 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
2a640 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66  se, TK_DOT, pLef
2a650 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  t, pExpr);.     
2a660 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2a670 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e           if( lon
2a680 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20  gNames ){.      
2a690 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61            zColna
2a6a0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
2a6b0 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c  ntf(db, "%s.%s",
2a6c0 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65   zTabName, zName
2a6d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2a6e0 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f     zToFree = zCo
2a6f0 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  lname;.         
2a700 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2a710 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a720 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
2a730 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
2a740 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2a750 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
2a760 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
2a770 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78  Parse, pNew, pEx
2a780 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pr);.           
2a790 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69   sqlite3TokenIni
2a7a0 74 28 26 73 43 6f 6c 6e 61 6d 65 2c 20 7a 43 6f  t(&sColname, zCo
2a7b0 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  lname);.        
2a7c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
2a7d0 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73  istSetName(pPars
2a7e0 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61  e, pNew, &sColna
2a7f0 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  me, 0);.        
2a800 20 20 20 20 69 66 28 20 70 4e 65 77 20 26 26 20      if( pNew && 
2a810 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
2a820 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21 3d 30  F_NestedFrom)!=0
2a830 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2a840 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
2a850 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26 70 4e  t_item *pX = &pN
2a860 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
2a870 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  r-1];.          
2a880 20 20 20 20 69 66 28 20 70 53 75 62 20 29 7b 0a      if( pSub ){.
2a890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a8a0 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69  pX->zSpan = sqli
2a8b0 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
2a8c0 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  pSub->pEList->a[
2a8d0 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20  j].zSpan);.     
2a8e0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
2a8f0 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d  ase( pX->zSpan==
2a900 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
2a910 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a920 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53            pX->zS
2a930 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  pan = sqlite3MPr
2a940 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 2e  intf(db, "%s.%s.
2a950 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
2a960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a980 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a 54 61  zSchemaName, zTa
2a990 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29  bName, zColname)
2a9a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2a9b0 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
2a9c0 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  zSpan==0 );.    
2a9d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a9e0 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 62 53            pX->bS
2a9f0 70 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a 20 20  panIsTab = 1;.  
2aa00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2aa10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
2aa20 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46 72 65  bFree(db, zToFre
2aa30 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
2aa40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2aa50 20 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e    if( !tableSeen
2aa60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2aa70 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20  ( zTName ){.    
2aa80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2aa90 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2aaa0 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20  "no such table: 
2aab0 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20  %s", zTName);.  
2aac0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2aad0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2aae0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2aaf0 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70  e, "no tables sp
2ab00 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20  ecified");.     
2ab10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2ab20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2ab30 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
2ab40 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 45 4c  stDelete(db, pEL
2ab50 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c  ist);.    p->pEL
2ab60 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ist = pNew;.  }.
2ab70 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20    if( p->pEList 
2ab80 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 45  ){.    if( p->pE
2ab90 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e  List->nExpr>db->
2aba0 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
2abb0 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
2abc0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2abd0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
2abe0 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69  o many columns i
2abf0 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a  n result set");.
2ac00 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
2ac10 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20  _Abort;.    }.  
2ac20 20 20 69 66 28 20 28 65 6c 69 73 74 46 6c 61 67    if( (elistFlag
2ac30 73 20 26 20 28 45 50 5f 48 61 73 46 75 6e 63 7c  s & (EP_HasFunc|
2ac40 45 50 5f 53 75 62 71 75 65 72 79 29 29 21 3d 30  EP_Subquery))!=0
2ac50 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 65 6c   ){.      p->sel
2ac60 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6d 70  Flags |= SF_Comp
2ac70 6c 65 78 52 65 73 75 6c 74 3b 0a 20 20 20 20 7d  lexResult;.    }
2ac80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
2ac90 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
2aca0 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69  *.** No-op routi
2acb0 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  ne for the parse
2acc0 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a  -tree walker..**
2acd0 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f  .** When this ro
2ace0 75 74 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c  utine is the Wal
2acf0 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63  ker.xExprCallbac
2ad00 6b 20 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f  k then expressio
2ad10 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77  n trees.** are w
2ad20 61 6c 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e  alked without an
2ad30 79 20 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20  y actions being 
2ad40 74 61 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f  taken at each no
2ad50 64 65 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c  de.  Presumably,
2ad60 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f  .** when this ro
2ad70 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
2ad80 72 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61  r Walker.xExprCa
2ad90 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20  llback then .** 
2ada0 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61  Walker.xSelectCa
2adb0 6c 6c 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f  llback is set to
2adc0 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73   do something us
2add0 65 66 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a  eful for every .
2ade0 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20 74  ** subquery in t
2adf0 68 65 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a  he parser tree..
2ae00 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2ae10 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65  prWalkNoop(Walke
2ae20 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70 72  r *NotUsed, Expr
2ae30 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55   *NotUsed2){.  U
2ae40 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
2ae50 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
2ae60 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52  d2);.  return WR
2ae70 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
2ae80 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69  *.** No-op routi
2ae90 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  ne for the parse
2aea0 2d 74 72 65 65 20 77 61 6c 6b 65 72 20 66 6f 72  -tree walker for
2aeb0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2aec0 74 73 2e 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  ts..** subquery 
2aed0 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 74 72  in the parser tr
2aee0 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ee..*/.int sqlit
2aef0 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70  e3SelectWalkNoop
2af00 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64  (Walker *NotUsed
2af10 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65  , Select *NotUse
2af20 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
2af30 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
2af40 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72  , NotUsed2);.  r
2af50 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
2af60 75 65 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  ue;.}..#if SQLIT
2af70 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 41 6c  E_DEBUG./*.** Al
2af80 77 61 79 73 20 61 73 73 65 72 74 2e 20 20 54 68  ways assert.  Th
2af90 69 73 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  is xSelectCallba
2afa0 63 6b 32 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ck2 implementati
2afb0 6f 6e 20 70 72 6f 76 65 73 20 74 68 61 74 20 74  on proves that t
2afc0 68 65 0a 2a 2a 20 78 53 65 6c 65 63 74 43 61 6c  he.** xSelectCal
2afd0 6c 62 61 63 6b 32 20 69 73 20 6e 65 76 65 72 20  lback2 is never 
2afe0 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64  invoked..*/.void
2aff0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61   sqlite3SelectWa
2b000 6c 6b 41 73 73 65 72 74 32 28 57 61 6c 6b 65 72  lkAssert2(Walker
2b010 20 2a 4e 6f 74 55 73 65 64 2c 20 53 65 6c 65 63   *NotUsed, Selec
2b020 74 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20  t *NotUsed2){.  
2b030 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2b040 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
2b050 65 64 32 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ed2);.  assert( 
2b060 30 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 2f 2a  0 );.}.#endif./*
2b070 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2b080 20 22 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c   "expands" a SEL
2b090 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e  ECT statement an
2b0a0 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62  d all of its sub
2b0b0 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20  queries..** For 
2b0c0 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
2b0d0 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69  mation on what i
2b0e0 74 20 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61  t means to "expa
2b0f0 6e 64 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20  nd" a SELECT.** 
2b100 73 74 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74  statement, see t
2b110 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  he comment on th
2b120 65 20 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77  e selectExpand w
2b130 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61  orker callback a
2b140 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61  bove..**.** Expa
2b150 6e 64 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73  nding a SELECT s
2b160 74 61 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20  tatement is the 
2b170 66 69 72 73 74 20 73 74 65 70 20 69 6e 20 70 72  first step in pr
2b180 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45  ocessing a.** SE
2b190 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
2b1a0 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
2b1b0 65 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78  ement must be ex
2b1c0 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a  panded before.**
2b1d0 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
2b1e0 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a   is performed..*
2b1f0 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67  *.** If anything
2b200 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20   goes wrong, an 
2b210 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
2b220 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50   written into pP
2b230 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c  arse..** The cal
2b240 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61  ling function ca
2b250 6e 20 64 65 74 65 63 74 20 74 68 65 20 70 72 6f  n detect the pro
2b260 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20  blem by looking 
2b270 61 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a  at pParse->nErr.
2b280 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65  ** and/or pParse
2b290 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
2b2a0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
2b2b0 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
2b2c0 45 78 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50  Expand(Parse *pP
2b2d0 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
2b2e0 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72  elect){.  Walker
2b2f0 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c   w;.  w.xExprCal
2b300 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45  lback = sqlite3E
2b310 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77  xprWalkNoop;.  w
2b320 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
2b330 3b 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c  ;.  if( OK_IF_AL
2b340 57 41 59 53 5f 54 52 55 45 28 70 50 61 72 73 65  WAYS_TRUE(pParse
2b350 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64 29 20 29  ->hasCompound) )
2b360 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43  {.    w.xSelectC
2b370 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e 76 65 72  allback = conver
2b380 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54  tCompoundSelectT
2b390 6f 53 75 62 71 75 65 72 79 3b 0a 20 20 20 20 77  oSubquery;.    w
2b3a0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2b3b0 32 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  2 = 0;.    sqlit
2b3c0 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c  e3WalkSelect(&w,
2b3d0 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20   pSelect);.  }. 
2b3e0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
2b3f0 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e  ck = selectExpan
2b400 64 65 72 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  der;.  w.xSelect
2b410 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65  Callback2 = sele
2b420 63 74 50 6f 70 57 69 74 68 3b 0a 20 20 73 71 6c  ctPopWith;.  sql
2b430 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
2b440 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a  w, pSelect);.}..
2b450 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2b460 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
2b470 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57 61  .** This is a Wa
2b480 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
2b490 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f  back callback fo
2b4a0 72 20 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c  r the sqlite3Sel
2b4b0 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a  ectTypeInfo().**
2b4c0 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a   interface..**.*
2b4d0 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d  * For each FROM-
2b4e0 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 2c  clause subquery,
2b4f0 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70   add Column.zTyp
2b500 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f  e and Column.zCo
2b510 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ll.** informatio
2b520 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73  n to the Table s
2b530 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
2b540 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73  presents the res
2b550 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68  ult set.** of th
2b560 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a  at subquery..**.
2b570 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72  ** The Table str
2b580 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72  ucture that repr
2b590 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c  esents the resul
2b5a0 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72  t set was constr
2b5b0 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65  ucted.** by sele
2b5c0 63 74 45 78 70 61 6e 64 65 72 28 29 20 62 75 74  ctExpander() but
2b5d0 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f   the type and co
2b5e0 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74  llation informat
2b5f0 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a  ion was omitted.
2b600 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ** at that point
2b610 20 62 65 63 61 75 73 65 20 69 64 65 6e 74 69 66   because identif
2b620 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74  iers had not yet
2b630 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20   been resolved. 
2b640 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
2b650 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
2b660 20 69 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f   identifier reso
2b670 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lution..*/.stati
2b680 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64  c void selectAdd
2b690 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f  SubqueryTypeInfo
2b6a0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2b6b0 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
2b6c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20  Parse *pParse;. 
2b6d0 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73   int i;.  SrcLis
2b6e0 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73  t *pTabList;.  s
2b6f0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2b700 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73  em *pFrom;..  as
2b710 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67  sert( p->selFlag
2b720 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20  s & SF_Resolved 
2b730 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d  );.  assert( (p-
2b740 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48  >selFlags & SF_H
2b750 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29  asTypeInfo)==0 )
2b760 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  ;.  p->selFlags 
2b770 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66  |= SF_HasTypeInf
2b780 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  o;.  pParse = pW
2b790 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
2b7a0 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
2b7b0 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  Src;.  for(i=0, 
2b7c0 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
2b7d0 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
2b7e0 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
2b7f0 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
2b800 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
2b810 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
2b820 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  Tab!=0 );.    if
2b830 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  ( (pTab->tabFlag
2b840 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
2b850 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )!=0 ){.      /*
2b860 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20   A sub-query in 
2b870 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2b880 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20  of a SELECT */. 
2b890 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
2b8a0 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  l = pFrom->pSele
2b8b0 63 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  ct;.      if( pS
2b8c0 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  el ){.        wh
2b8d0 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f  ile( pSel->pPrio
2b8e0 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d  r ) pSel = pSel-
2b8f0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
2b900 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
2b910 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
2b920 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  llation(pParse, 
2b930 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20  pTab, pSel);.   
2b940 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
2b950 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
2b960 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64  This routine add
2b970 73 20 64 61 74 61 74 79 70 65 20 61 6e 64 20 63  s datatype and c
2b980 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
2b990 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  e information to
2b9a0 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74  .** the Table st
2b9b0 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20  ructures of all 
2b9c0 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
2b9d0 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53  ueries in a.** S
2b9e0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
2b9f0 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20  .**.** Use this 
2ba00 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61  routine after na
2ba10 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a  me resolution..*
2ba20 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
2ba30 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79  lite3SelectAddTy
2ba40 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  peInfo(Parse *pP
2ba50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
2ba60 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20  elect){.#ifndef 
2ba70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
2ba80 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b  UERY.  Walker w;
2ba90 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
2baa0 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65  back = sqlite3Se
2bab0 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  lectWalkNoop;.  
2bac0 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
2bad0 6b 32 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75  k2 = selectAddSu
2bae0 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a  bqueryTypeInfo;.
2baf0 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
2bb00 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57  k = sqlite3ExprW
2bb10 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61  alkNoop;.  w.pPa
2bb20 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
2bb30 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
2bb40 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
2bb50 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
2bb60 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
2bb70 74 73 20 75 70 20 61 20 53 45 4c 45 43 54 20 73  ts up a SELECT s
2bb80 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f  tatement for pro
2bb90 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a  cessing.  The.**
2bba0 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63   following is ac
2bbb0 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a  complished:.**.*
2bbc0 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20 43 75  *     *  VDBE Cu
2bbd0 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65  rsor numbers are
2bbe0 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c   assigned to all
2bbf0 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72   FROM-clause ter
2bc00 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70  ms..**     *  Ep
2bc10 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62  hemeral Table ob
2bc20 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74 65  jects are create
2bc30 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63  d for all FROM-c
2bc40 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73  lause subqueries
2bc50 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61  ..**     *  ON a
2bc60 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
2bc70 20 61 72 65 20 73 68 69 66 74 65 64 20 69 6e 74   are shifted int
2bc80 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d 65 6e  o WHERE statemen
2bc90 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c  ts.**     *  Wil
2bca0 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64 20 22  dcards "*" and "
2bcb0 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75  TABLE.*" in resu
2bcc0 6c 74 20 73 65 74 73 20 61 72 65 20 65 78 70 61  lt sets are expa
2bcd0 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  nded..**     *  
2bce0 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20 65  Identifiers in e
2bcf0 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20 6d 61  xpression are ma
2bd00 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65 73 2e  tched to tables.
2bd10 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2bd20 69 6e 65 20 61 63 74 73 20 72 65 63 75 72 73 69  ine acts recursi
2bd30 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71  vely on all subq
2bd40 75 65 72 69 65 73 20 77 69 74 68 69 6e 20 74 68  ueries within th
2bd50 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
2bd60 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50  d sqlite3SelectP
2bd70 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rep(.  Parse *pP
2bd80 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
2bd90 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
2bda0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
2bdb0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
2bdc0 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
2bdd0 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
2bde0 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  ded. */.  NameCo
2bdf0 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20  ntext *pOuterNC 
2be00 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
2be10 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a   for container *
2be20 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  /.){.  assert( p
2be30 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  !=0 || pParse->d
2be40 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2be50 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
2be60 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
2be70 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
2be80 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
2be90 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29  SF_HasTypeInfo )
2bea0 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
2beb0 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70  e3SelectExpand(p
2bec0 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28  Parse, p);.  if(
2bed0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
2bee0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
2bef0 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
2bf00 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73  rn;.  sqlite3Res
2bf10 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28  olveSelectNames(
2bf20 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65  pParse, p, pOute
2bf30 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50 61 72  rNC);.  if( pPar
2bf40 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72  se->nErr || pPar
2bf50 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
2bf60 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
2bf70 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
2bf80 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65  dTypeInfo(pParse
2bf90 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , p);.}../*.** R
2bfa0 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61  eset the aggrega
2bfb0 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a  te accumulator..
2bfc0 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67  **.** The aggreg
2bfd0 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
2bfe0 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f  is a set of memo
2bff0 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f  ry cells that ho
2c000 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61  ld.** intermedia
2c010 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65  te results while
2c020 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20   calculating an 
2c030 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73  aggregate.  This
2c040 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  .** routine gene
2c050 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20  rates code that 
2c060 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20  stores NULLs in 
2c070 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d  all of those mem
2c080 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f  ory.** cells..*/
2c090 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
2c0a0 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61  etAccumulator(Pa
2c0b0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
2c0c0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
2c0d0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
2c0e0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
2c0f0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
2c100 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e  gInfo_func *pFun
2c110 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d 20  c;.  int nReg = 
2c120 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20  pAggInfo->nFunc 
2c130 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  + pAggInfo->nCol
2c140 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d  umn;.  if( nReg=
2c150 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66  =0 ) return;.#if
2c160 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2c170 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .  /* Verify tha
2c180 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65  t all AggInfo re
2c190 67 69 73 74 65 72 73 20 61 72 65 20 77 69 74 68  gisters are with
2c1a0 69 6e 20 74 68 65 20 72 61 6e 67 65 20 73 70 65  in the range spe
2c1b0 63 69 66 69 65 64 20 62 79 0a 20 20 2a 2a 20 41  cified by.  ** A
2c1c0 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67  ggInfo.mnReg..Ag
2c1d0 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20  gInfo.mxReg */. 
2c1e0 20 61 73 73 65 72 74 28 20 6e 52 65 67 3d 3d 70   assert( nReg==p
2c1f0 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70  AggInfo->mxReg-p
2c200 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31  AggInfo->mnReg+1
2c210 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
2c220 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  <pAggInfo->nColu
2c230 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  mn; i++){.    as
2c240 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e  sert( pAggInfo->
2c250 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41  aCol[i].iMem>=pA
2c260 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20  ggInfo->mnReg.  
2c270 20 20 20 20 20 20 20 26 26 20 70 41 67 67 49 6e         && pAggIn
2c280 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d  fo->aCol[i].iMem
2c290 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  <=pAggInfo->mxRe
2c2a0 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  g );.  }.  for(i
2c2b0 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
2c2c0 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFunc; i++){.   
2c2d0 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66   assert( pAggInf
2c2e0 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d  o->aFunc[i].iMem
2c2f0 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  >=pAggInfo->mnRe
2c300 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41  g.         && pA
2c310 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d  ggInfo->aFunc[i]
2c320 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d  .iMem<=pAggInfo-
2c330 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65  >mxReg );.  }.#e
2c340 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56 64  ndif.  sqlite3Vd
2c350 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
2c360 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f  ull, 0, pAggInfo
2c370 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e 66  ->mnReg, pAggInf
2c380 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72  o->mxReg);.  for
2c390 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d  (pFunc=pAggInfo-
2c3a0 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70  >aFunc, i=0; i<p
2c3b0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
2c3c0 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20  i++, pFunc++){. 
2c3d0 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44     if( pFunc->iD
2c3e0 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
2c3f0 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
2c400 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Func->pExpr;.   
2c410 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
2c420 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20  HasProperty(pE, 
2c430 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
2c440 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78  .      if( pE->x
2c450 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d  .pList==0 || pE-
2c460 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  >x.pList->nExpr!
2c470 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
2c480 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2c490 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20  arse, "DISTINCT 
2c4a0 61 67 67 72 65 67 61 74 65 73 20 6d 75 73 74 20  aggregates must 
2c4b0 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65  have exactly one
2c4c0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61   ".           "a
2c4d0 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20  rgument");.     
2c4e0 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69     pFunc->iDisti
2c4f0 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  nct = -1;.      
2c500 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b  }else{.        K
2c510 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
2c520 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
2c530 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
2c540 45 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c 20 30  E->x.pList, 0, 0
2c550 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2c560 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
2c570 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
2c580 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e  , pFunc->iDistin
2c590 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  ct, 0, 0,.      
2c5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c5b0 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
2c5c0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
2c5d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2c5e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76    }.}../*.** Inv
2c5f0 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69  oke the OP_AggFi
2c600 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f  nalize opcode fo
2c610 72 20 65 76 65 72 79 20 61 67 67 72 65 67 61 74  r every aggregat
2c620 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e  e function.** in
2c630 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72   the AggInfo str
2c640 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
2c650 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41  c void finalizeA
2c660 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73  ggFunctions(Pars
2c670 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
2c680 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
2c690 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
2c6a0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
2c6b0 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  i;.  struct AggI
2c6c0 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20  nfo_func *pF;.  
2c6d0 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67  for(i=0, pF=pAgg
2c6e0 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70  Info->aFunc; i<p
2c6f0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
2c700 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20  i++, pF++){.    
2c710 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
2c720 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70  = pF->pExpr->x.p
2c730 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74  List;.    assert
2c740 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2c750 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50  ty(pF->pExpr, EP
2c760 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
2c770 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2c780 64 4f 70 32 28 76 2c 20 4f 50 5f 41 67 67 46 69  dOp2(v, OP_AggFi
2c790 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70  nal, pF->iMem, p
2c7a0 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45  List ? pList->nE
2c7b0 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 73 71  xpr : 0);.    sq
2c7c0 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
2c7d0 34 28 76 2c 20 70 46 2d 3e 70 46 75 6e 63 2c 20  4(v, pF->pFunc, 
2c7e0 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d  P4_FUNCDEF);.  }
2c7f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65  .}../*.** Update
2c800 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
2c810 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f   memory cells fo
2c820 72 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 62  r an aggregate b
2c830 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63  ased on.** the c
2c840 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f  urrent cursor po
2c850 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  sition..*/.stati
2c860 63 20 76 6f 69 64 20 75 70 64 61 74 65 41 63 63  c void updateAcc
2c870 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a  umulator(Parse *
2c880 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
2c890 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
2c8a0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
2c8b0 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
2c8c0 20 20 69 6e 74 20 72 65 67 48 69 74 20 3d 20 30    int regHit = 0
2c8d0 3b 0a 20 20 69 6e 74 20 61 64 64 72 48 69 74 54  ;.  int addrHitT
2c8e0 65 73 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63  est = 0;.  struc
2c8f0 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
2c900 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67  pF;.  struct Agg
2c910 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20  Info_col *pC;.. 
2c920 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63   pAggInfo->direc
2c930 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72  tMode = 1;.  for
2c940 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66  (i=0, pF=pAggInf
2c950 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67  o->aFunc; i<pAgg
2c960 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
2c970 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  , pF++){.    int
2c980 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61   nArg;.    int a
2c990 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  ddrNext = 0;.   
2c9a0 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20   int regAgg;.   
2c9b0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
2c9c0 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e   = pF->pExpr->x.
2c9d0 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72  pList;.    asser
2c9e0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2c9f0 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45  rty(pF->pExpr, E
2ca00 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
2ca10 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b      if( pList ){
2ca20 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c  .      nArg = pL
2ca30 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
2ca40 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74    regAgg = sqlit
2ca50 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
2ca60 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20  Parse, nArg);.  
2ca70 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2ca80 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
2ca90 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67  se, pList, regAg
2caa0 67 2c 20 30 2c 20 53 51 4c 49 54 45 5f 45 43 45  g, 0, SQLITE_ECE
2cab0 4c 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73  L_DUP);.    }els
2cac0 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  e{.      nArg = 
2cad0 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20  0;.      regAgg 
2cae0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
2caf0 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74  f( pF->iDistinct
2cb00 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64  >=0 ){.      add
2cb10 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56  rNext = sqlite3V
2cb20 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
2cb30 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2cb40 20 6e 41 72 67 3d 3d 30 20 29 3b 20 20 2f 2a 20   nArg==0 );  /* 
2cb50 45 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20  Error condition 
2cb60 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
2cb70 65 28 20 6e 41 72 67 3e 31 20 29 3b 20 20 20 2f  e( nArg>1 );   /
2cb80 2a 20 41 6c 73 6f 20 61 6e 20 65 72 72 6f 72 20  * Also an error 
2cb90 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73  */.      codeDis
2cba0 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46  tinct(pParse, pF
2cbb0 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64  ->iDistinct, add
2cbc0 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67  rNext, 1, regAgg
2cbd0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2cbe0 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63   pF->pFunc->func
2cbf0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
2cc00 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a  UNC_NEEDCOLL ){.
2cc10 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
2cc20 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  Coll = 0;.      
2cc30 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
2cc40 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
2cc50 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
2cc60 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
2cc70 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30   );  /* pList!=0
2cc80 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61   if pF->pFunc ha
2cc90 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20  s NEEDCOLL */.  
2cca0 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74      for(j=0, pIt
2ccb0 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43  em=pList->a; !pC
2ccc0 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a  oll && j<nArg; j
2ccd0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
2cce0 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
2ccf0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2cd00 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
2cd10 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
2cd20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
2cd30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
2cd40 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
2cd50 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
2cd60 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 67   }.      if( reg
2cd70 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e  Hit==0 && pAggIn
2cd80 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  fo->nAccumulator
2cd90 20 29 20 72 65 67 48 69 74 20 3d 20 2b 2b 70 50   ) regHit = ++pP
2cda0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2cdb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2cdc0 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op4(v, OP_CollSe
2cdd0 71 2c 20 72 65 67 48 69 74 2c 20 30 2c 20 30 2c  q, regHit, 0, 0,
2cde0 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
2cdf0 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
2ce00 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
2ce10 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41  beAddOp3(v, OP_A
2ce20 67 67 53 74 65 70 30 2c 20 30 2c 20 72 65 67 41  ggStep0, 0, regA
2ce30 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 29 3b 0a 20  gg, pF->iMem);. 
2ce40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70     sqlite3VdbeAp
2ce50 70 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e 70 46  pendP4(v, pF->pF
2ce60 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
2ce70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2ce80 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38  eChangeP5(v, (u8
2ce90 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69  )nArg);.    sqli
2cea0 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
2ceb0 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
2cec0 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29  e, regAgg, nArg)
2ced0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
2cee0 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
2cef0 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41  arse, regAgg, nA
2cf00 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64  rg);.    if( add
2cf10 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73  rNext ){.      s
2cf20 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
2cf30 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65  eLabel(v, addrNe
2cf40 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xt);.      sqlit
2cf50 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
2cf60 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a  (pParse);.    }.
2cf70 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65    }..  /* Before
2cf80 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 20   populating the 
2cf90 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69  accumulator regi
2cfa0 73 74 65 72 73 2c 20 63 6c 65 61 72 20 74 68 65  sters, clear the
2cfb0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20   column cache.. 
2cfc0 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69   ** Otherwise, i
2cfd0 66 20 61 6e 79 20 6f 66 20 74 68 65 20 72 65 71  f any of the req
2cfe0 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c  uired column val
2cff0 75 65 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  ues are already 
2d000 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69 6e  present .  ** in
2d010 20 72 65 67 69 73 74 65 72 73 2c 20 73 71 6c 69   registers, sqli
2d020 74 65 33 45 78 70 72 43 6f 64 65 28 29 20 6d 61  te3ExprCode() ma
2d030 79 20 75 73 65 20 4f 50 5f 53 43 6f 70 79 20 74  y use OP_SCopy t
2d040 6f 20 63 6f 70 79 20 74 68 65 20 76 61 6c 75 65  o copy the value
2d050 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d 65  .  ** to pC->iMe
2d060 6d 2e 20 42 75 74 20 62 79 20 74 68 65 20 74 69  m. But by the ti
2d070 6d 65 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  me the value is 
2d080 75 73 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e  used, the origin
2d090 61 6c 20 72 65 67 69 73 74 65 72 0a 20 20 2a 2a  al register.  **
2d0a0 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75   may have been u
2d0b0 73 65 64 2c 20 69 6e 76 61 6c 69 64 61 74 69 6e  sed, invalidatin
2d0c0 67 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  g the underlying
2d0d0 20 62 75 66 66 65 72 20 68 6f 6c 64 69 6e 67 20   buffer holding 
2d0e0 74 68 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f 72  the.  ** text or
2d0f0 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65 65   blob value. See
2d100 20 74 69 63 6b 65 74 20 5b 38 38 33 30 33 34 64   ticket [883034d
2d110 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  cb5]..  **.  ** 
2d120 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e  Another solution
2d130 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 63 68 61   would be to cha
2d140 6e 67 65 20 74 68 65 20 4f 50 5f 53 43 6f 70 79  nge the OP_SCopy
2d150 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20 63 61   used to copy ca
2d160 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65 73  ched.  ** values
2d170 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a   to an OP_Copy..
2d180 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 48 69    */.  if( regHi
2d190 74 20 29 7b 0a 20 20 20 20 61 64 64 72 48 69 74  t ){.    addrHit
2d1a0 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Test = sqlite3Vd
2d1b0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
2d1c0 66 2c 20 72 65 67 48 69 74 29 3b 20 56 64 62 65  f, regHit); Vdbe
2d1d0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
2d1e0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
2d1f0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
2d200 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d  ;.  for(i=0, pC=
2d210 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20  pAggInfo->aCol; 
2d220 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63  i<pAggInfo->nAcc
2d230 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70  umulator; i++, p
2d240 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  C++){.    sqlite
2d250 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
2d260 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d  , pC->pExpr, pC-
2d270 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41  >iMem);.  }.  pA
2d280 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
2d290 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  de = 0;.  sqlite
2d2a0 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
2d2b0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 61  pParse);.  if( a
2d2c0 64 64 72 48 69 74 54 65 73 74 20 29 7b 0a 20 20  ddrHitTest ){.  
2d2d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
2d2e0 70 48 65 72 65 28 76 2c 20 61 64 64 72 48 69 74  pHere(v, addrHit
2d2f0 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Test);.  }.}../*
2d300 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65  .** Add a single
2d310 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74   OP_Explain inst
2d320 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 56  ruction to the V
2d330 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e 20 61  DBE to explain a
2d340 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74   simple.** count
2d350 28 2a 29 20 71 75 65 72 79 20 28 22 53 45 4c 45  (*) query ("SELE
2d360 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
2d370 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e   pTab")..*/.#ifn
2d380 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2d390 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63 20 76  EXPLAIN.static v
2d3a0 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c  oid explainSimpl
2d3b0 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73 65 20  eCount(.  Parse 
2d3c0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
2d3d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
2d3e0 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
2d3f0 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
2d400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d410 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71  /* Table being q
2d420 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65  ueried */.  Inde
2d430 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
2d440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2d450 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f 70 74  ndex used to opt
2d460 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e  imize scan, or N
2d470 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ULL */.){.  if( 
2d480 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
2d490 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 43  =2 ){.    int bC
2d4a0 6f 76 65 72 20 3d 20 28 70 49 64 78 21 3d 30 20  over = (pIdx!=0 
2d4b0 26 26 20 28 48 61 73 52 6f 77 69 64 28 70 54 61  && (HasRowid(pTa
2d4c0 62 29 20 7c 7c 20 21 49 73 50 72 69 6d 61 72 79  b) || !IsPrimary
2d4d0 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 29 29  KeyIndex(pIdx)))
2d4e0 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 71 70  ;.    char *zEqp
2d4f0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
2d500 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 53  f(pParse->db, "S
2d510 43 41 4e 20 54 41 42 4c 45 20 25 73 25 73 25 73  CAN TABLE %s%s%s
2d520 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  ",.        pTab-
2d530 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
2d540 62 43 6f 76 65 72 20 3f 20 22 20 55 53 49 4e 47  bCover ? " USING
2d550 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20   COVERING INDEX 
2d560 22 20 3a 20 22 22 2c 0a 20 20 20 20 20 20 20 20  " : "",.        
2d570 62 43 6f 76 65 72 20 3f 20 70 49 64 78 2d 3e 7a  bCover ? pIdx->z
2d580 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20 20 29 3b  Name : "".    );
2d590 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2d5a0 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20  AddOp4(.        
2d5b0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
2d5c0 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73  P_Explain, pPars
2d5d0 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c  e->iSelectId, 0,
2d5e0 20 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44 59 4e   0, zEqp, P4_DYN
2d5f0 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  AMIC.    );.  }.
2d600 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
2d610 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f   explainSimpleCo
2d620 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69  unt(a,b,c).#endi
2d630 66 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  f../*.** sqlite3
2d640 57 61 6c 6b 45 78 70 72 28 29 20 63 61 6c 6c 62  WalkExpr() callb
2d650 61 63 6b 20 75 73 65 64 20 62 79 20 68 61 76 69  ack used by havi
2d660 6e 67 54 6f 57 68 65 72 65 28 29 2e 0a 2a 2a 0a  ngToWhere()..**.
2d670 2a 2a 20 49 66 20 74 68 65 20 6e 6f 64 65 20 70  ** If the node p
2d680 61 73 73 65 64 20 74 6f 20 74 68 65 20 63 61 6c  assed to the cal
2d690 6c 62 61 63 6b 20 69 73 20 61 20 54 4b 5f 41 4e  lback is a TK_AN
2d6a0 44 20 6e 6f 64 65 2c 20 72 65 74 75 72 6e 20 0a  D node, return .
2d6b0 2a 2a 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 20  ** WRC_Continue 
2d6c0 74 6f 20 74 65 6c 6c 20 73 71 6c 69 74 65 33 57  to tell sqlite3W
2d6d0 61 6c 6b 45 78 70 72 28 29 20 74 6f 20 69 74 65  alkExpr() to ite
2d6e0 72 61 74 65 20 74 68 72 6f 75 67 68 20 63 68 69  rate through chi
2d6f0 6c 64 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20  ld nodes..**.** 
2d700 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
2d710 6e 20 57 52 43 5f 50 72 75 6e 65 2e 20 49 6e 20  n WRC_Prune. In 
2d720 74 68 69 73 20 63 61 73 65 2c 20 61 6c 73 6f 20  this case, also 
2d730 63 68 65 63 6b 20 69 66 20 74 68 65 20 0a 2a 2a  check if the .**
2d740 20 73 75 62 2d 65 78 70 72 65 73 73 69 6f 6e 20   sub-expression 
2d750 6d 61 74 63 68 65 73 20 74 68 65 20 63 72 69 74  matches the crit
2d760 65 72 69 61 20 66 6f 72 20 62 65 69 6e 67 20 6d  eria for being m
2d770 6f 76 65 64 20 74 6f 20 74 68 65 20 57 48 45 52  oved to the WHER
2d780 45 0a 2a 2a 20 63 6c 61 75 73 65 2e 20 49 66 20  E.** clause. If 
2d790 73 6f 2c 20 61 64 64 20 69 74 20 74 6f 20 74 68  so, add it to th
2d7a0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61  e WHERE clause a
2d7b0 6e 64 20 72 65 70 6c 61 63 65 20 74 68 65 20 73  nd replace the s
2d7c0 75 62 2d 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  ub-expression.**
2d7d0 20 77 69 74 68 69 6e 20 74 68 65 20 48 41 56 49   within the HAVI
2d7e0 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  NG expression wi
2d7f0 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20 22 31  th a constant "1
2d800 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  "..*/.static int
2d810 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65 45 78   havingToWhereEx
2d820 70 72 43 62 28 57 61 6c 6b 65 72 20 2a 70 57 61  prCb(Walker *pWa
2d830 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
2d840 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  r){.  if( pExpr-
2d850 3e 6f 70 21 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20  >op!=TK_AND ){. 
2d860 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20     Select *pS = 
2d870 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 65 6c 65  pWalker->u.pSele
2d880 63 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ct;.    if( sqli
2d890 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
2d8a0 74 4f 72 47 72 6f 75 70 42 79 28 70 57 61 6c 6b  tOrGroupBy(pWalk
2d8b0 65 72 2d 3e 70 50 61 72 73 65 2c 20 70 45 78 70  er->pParse, pExp
2d8c0 72 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42 79 29  r, pS->pGroupBy)
2d8d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2d8e0 33 20 2a 64 62 20 3d 20 70 57 61 6c 6b 65 72 2d  3 *db = pWalker-
2d8f0 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20  >pParse->db;.   
2d900 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20     Expr *pNew = 
2d910 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
2d920 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c  (db, TK_INTEGER,
2d930 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65   &sqlite3IntToke
2d940 6e 73 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20  ns[1], 0);.     
2d950 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
2d960 20 20 20 20 20 45 78 70 72 20 2a 70 57 68 65 72       Expr *pWher
2d970 65 20 3d 20 70 53 2d 3e 70 57 68 65 72 65 3b 0a  e = pS->pWhere;.
2d980 20 20 20 20 20 20 20 20 53 57 41 50 28 45 78 70          SWAP(Exp
2d990 72 2c 20 2a 70 4e 65 77 2c 20 2a 70 45 78 70 72  r, *pNew, *pExpr
2d9a0 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  );.        pNew 
2d9b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
2d9c0 28 64 62 2c 20 70 57 68 65 72 65 2c 20 70 4e 65  (db, pWhere, pNe
2d9d0 77 29 3b 0a 20 20 20 20 20 20 20 20 70 53 2d 3e  w);.        pS->
2d9e0 70 57 68 65 72 65 20 3d 20 70 4e 65 77 3b 0a 20  pWhere = pNew;. 
2d9f0 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
2da00 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20  eCode = 1;.     
2da10 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74   }.    }.    ret
2da20 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
2da30 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
2da40 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
2da50 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 6c 69 67  ** Transfer elig
2da60 69 62 6c 65 20 74 65 72 6d 73 20 66 72 6f 6d 20  ible terms from 
2da70 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
2da80 65 20 6f 66 20 61 20 71 75 65 72 79 2c 20 77 68  e of a query, wh
2da90 69 63 68 20 69 73 0a 2a 2a 20 70 72 6f 63 65 73  ich is.** proces
2daa0 73 65 64 20 61 66 74 65 72 20 67 72 6f 75 70 69  sed after groupi
2dab0 6e 67 2c 20 74 6f 20 74 68 65 20 57 48 45 52 45  ng, to the WHERE
2dac0 20 63 6c 61 75 73 65 2c 20 77 68 69 63 68 20 69   clause, which i
2dad0 73 20 70 72 6f 63 65 73 73 65 64 20 62 65 66 6f  s processed befo
2dae0 72 65 0a 2a 2a 20 67 72 6f 75 70 69 6e 67 2e 20  re.** grouping. 
2daf0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  For example, the
2db00 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
2db10 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 3c 74  SELECT * FROM <t
2db20 61 62 6c 65 73 3e 20 57 48 45 52 45 20 61 3d 3f  ables> WHERE a=?
2db30 20 47 52 4f 55 50 20 42 59 20 62 20 48 41 56 49   GROUP BY b HAVI
2db40 4e 47 20 62 3d 3f 20 41 4e 44 20 63 3d 3f 0a 2a  NG b=? AND c=?.*
2db50 2a 0a 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72  *.** can be rewr
2db60 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20  itten as:.**.** 
2db70 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2db80 3c 74 61 62 6c 65 73 3e 20 57 48 45 52 45 20 61  <tables> WHERE a
2db90 3d 3f 20 41 4e 44 20 62 3d 3f 20 47 52 4f 55 50  =? AND b=? GROUP
2dba0 20 42 59 20 62 20 48 41 56 49 4e 47 20 63 3d 3f   BY b HAVING c=?
2dbb0 0a 2a 2a 0a 2a 2a 20 41 20 74 65 72 6d 20 6f 66  .**.** A term of
2dbc0 20 74 68 65 20 48 41 56 49 4e 47 20 65 78 70 72   the HAVING expr
2dbd0 65 73 73 69 6f 6e 20 69 73 20 65 6c 69 67 69 62  ession is eligib
2dbe0 6c 65 20 66 6f 72 20 74 72 61 6e 73 66 65 72 20  le for transfer 
2dbf0 69 66 20 69 74 20 63 6f 6e 73 69 73 74 73 0a 2a  if it consists.*
2dc00 2a 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 63 6f  * entirely of co
2dc10 6e 73 74 61 6e 74 73 20 61 6e 64 20 65 78 70 72  nstants and expr
2dc20 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65  essions that are
2dc30 20 61 6c 73 6f 20 47 52 4f 55 50 20 42 59 20 74   also GROUP BY t
2dc40 65 72 6d 73 20 74 68 61 74 0a 2a 2a 20 75 73 65  erms that.** use
2dc50 20 74 68 65 20 22 42 49 4e 41 52 59 22 20 63 6f   the "BINARY" co
2dc60 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
2dc70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2dc80 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65 28 50   havingToWhere(P
2dc90 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
2dca0 6c 65 63 74 20 2a 70 29 7b 0a 20 20 57 61 6c 6b  lect *p){.  Walk
2dcb0 65 72 20 73 57 61 6c 6b 65 72 3b 0a 20 20 6d 65  er sWalker;.  me
2dcc0 6d 73 65 74 28 26 73 57 61 6c 6b 65 72 2c 20 30  mset(&sWalker, 0
2dcd0 2c 20 73 69 7a 65 6f 66 28 73 57 61 6c 6b 65 72  , sizeof(sWalker
2dce0 29 29 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 70 50  ));.  sWalker.pP
2dcf0 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
2dd00 20 73 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61   sWalker.xExprCa
2dd10 6c 6c 62 61 63 6b 20 3d 20 68 61 76 69 6e 67 54  llback = havingT
2dd20 6f 57 68 65 72 65 45 78 70 72 43 62 3b 0a 20 20  oWhereExprCb;.  
2dd30 73 57 61 6c 6b 65 72 2e 75 2e 70 53 65 6c 65 63  sWalker.u.pSelec
2dd40 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33  t = p;.  sqlite3
2dd50 57 61 6c 6b 45 78 70 72 28 26 73 57 61 6c 6b 65  WalkExpr(&sWalke
2dd60 72 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  r, p->pHaving);.
2dd70 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
2dd80 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 57  ENABLED.  if( sW
2dd90 61 6c 6b 65 72 2e 65 43 6f 64 65 20 26 26 20 28  alker.eCode && (
2dda0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
2ddb0 63 65 20 26 20 30 78 31 30 30 29 21 3d 30 20 29  ce & 0x100)!=0 )
2ddc0 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  {.    SELECTTRAC
2ddd0 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70  E(0x100,pParse,p
2dde0 2c 28 22 4d 6f 76 65 20 48 41 56 49 4e 47 20 74  ,("Move HAVING t
2ddf0 65 72 6d 73 20 69 6e 74 6f 20 57 48 45 52 45 3a  erms into WHERE:
2de00 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  \n"));.    sqlit
2de10 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
2de20 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23  (0, p, 0);.  }.#
2de30 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  endif.}../*.** C
2de40 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
2de50 68 65 20 70 54 68 69 73 20 65 6e 74 72 79 20 6f  he pThis entry o
2de60 66 20 70 54 61 62 4c 69 73 74 20 69 73 20 61 20  f pTabList is a 
2de70 73 65 6c 66 2d 6a 6f 69 6e 20 6f 66 20 61 20 70  self-join of a p
2de80 72 69 6f 72 20 76 69 65 77 2e 0a 2a 2a 20 49 66  rior view..** If
2de90 20 69 74 20 69 73 2c 20 74 68 65 6e 20 72 65 74   it is, then ret
2dea0 75 72 6e 20 74 68 65 20 53 72 63 4c 69 73 74 5f  urn the SrcList_
2deb0 69 74 65 6d 20 66 6f 72 20 74 68 65 20 70 72 69  item for the pri
2dec0 6f 72 20 76 69 65 77 2e 20 20 49 66 20 69 74 20  or view.  If it 
2ded0 69 73 20 6e 6f 74 2c 0a 2a 2a 20 74 68 65 6e 20  is not,.** then 
2dee0 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61  return 0..*/.sta
2def0 74 69 63 20 73 74 72 75 63 74 20 53 72 63 4c 69  tic struct SrcLi
2df00 73 74 5f 69 74 65 6d 20 2a 69 73 53 65 6c 66 4a  st_item *isSelfJ
2df10 6f 69 6e 56 69 65 77 28 0a 20 20 53 72 63 4c 69  oinView(.  SrcLi
2df20 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20  st *pTabList,   
2df30 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63          /* Searc
2df40 68 20 66 6f 72 20 73 65 6c 66 2d 6a 6f 69 6e 73  h for self-joins
2df50 20 69 6e 20 74 68 69 73 20 46 52 4f 4d 20 63 6c   in this FROM cl
2df60 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
2df70 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2df80 54 68 69 73 20 20 20 2f 2a 20 53 65 61 72 63 68  This   /* Search
2df90 20 66 6f 72 20 70 72 69 6f 72 20 72 65 66 65 72   for prior refer
2dfa0 65 6e 63 65 20 74 6f 20 74 68 69 73 20 73 75 62  ence to this sub
2dfb0 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 73 74  query */.){.  st
2dfc0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2dfd0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 66 6f 72 28  m *pItem;.  for(
2dfe0 70 49 74 65 6d 20 3d 20 70 54 61 62 4c 69 73 74  pItem = pTabList
2dff0 2d 3e 61 3b 20 70 49 74 65 6d 3c 70 54 68 69 73  ->a; pItem<pThis
2e000 3b 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  ; pItem++){.    
2e010 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  if( pItem->pSele
2e020 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ct==0 ) continue
2e030 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  ;.    if( pItem-
2e040 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
2e050 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2e060 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d   if( pItem->zNam
2e070 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  e==0 ) continue;
2e080 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2e090 5f 73 74 72 69 63 6d 70 28 70 49 74 65 6d 2d 3e  _stricmp(pItem->
2e0a0 7a 44 61 74 61 62 61 73 65 2c 20 70 54 68 69 73  zDatabase, pThis
2e0b0 2d 3e 7a 44 61 74 61 62 61 73 65 29 21 3d 30 20  ->zDatabase)!=0 
2e0c0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2e0d0 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
2e0e0 63 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  cmp(pItem->zName
2e0f0 2c 20 70 54 68 69 73 2d 3e 7a 4e 61 6d 65 29 21  , pThis->zName)!
2e100 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2e110 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
2e120 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 0a 20 20  prCompare(0, .  
2e130 20 20 20 20 20 20 20 20 70 54 68 69 73 2d 3e 70          pThis->p
2e140 53 65 6c 65 63 74 2d 3e 70 57 68 65 72 65 2c 20  Select->pWhere, 
2e150 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e  pItem->pSelect->
2e160 70 57 68 65 72 65 2c 20 2d 31 29 20 0a 20 20 20  pWhere, -1) .   
2e170 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
2e180 20 76 69 65 77 20 77 61 73 20 6d 6f 64 69 66 69   view was modifi
2e190 65 64 20 62 79 20 73 6f 6d 65 20 6f 74 68 65 72  ed by some other
2e1a0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 73 75   optimization su
2e1b0 63 68 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 70  ch as.      ** p
2e1c0 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d  ushDownWhereTerm
2e1d0 73 28 29 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  s() */.      con
2e1e0 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
2e1f0 20 72 65 74 75 72 6e 20 70 49 74 65 6d 3b 0a 20   return pItem;. 
2e200 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2e210 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2e220 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54 49  COUNTOFVIEW_OPTI
2e230 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 41  MIZATION./*.** A
2e240 74 74 65 6d 70 74 20 74 6f 20 74 72 61 6e 73 66  ttempt to transf
2e250 6f 72 6d 20 61 20 71 75 65 72 79 20 6f 66 20 74  orm a query of t
2e260 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20  he form.**.**   
2e270 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
2e280 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 20   FROM (SELECT x 
2e290 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 41 4c  FROM t1 UNION AL
2e2a0 4c 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20  L SELECT y FROM 
2e2b0 74 32 29 0a 2a 2a 0a 2a 2a 20 49 6e 74 6f 20 74  t2).**.** Into t
2e2c0 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  his:.**.**    SE
2e2d0 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 75  LECT (SELECT cou
2e2e0 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 29 2b 28  nt(*) FROM t1)+(
2e2f0 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
2e300 46 52 4f 4d 20 74 32 29 0a 2a 2a 0a 2a 2a 20 54  FROM t2).**.** T
2e310 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f  he transformatio
2e320 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20  n only works if 
2e330 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
2e340 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
2e350 2a 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20 73 75  *.**   *  The su
2e360 62 71 75 65 72 79 20 69 73 20 61 20 55 4e 49 4f  bquery is a UNIO
2e370 4e 20 41 4c 4c 20 6f 66 20 74 77 6f 20 6f 72 20  N ALL of two or 
2e380 6d 6f 72 65 20 74 65 72 6d 73 0a 2a 2a 20 20 20  more terms.**   
2e390 2a 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 57  *  There is no W
2e3a0 48 45 52 45 20 6f 72 20 47 52 4f 55 50 20 42 59  HERE or GROUP BY
2e3b0 20 6f 72 20 48 41 56 49 4e 47 20 63 6c 61 75 73   or HAVING claus
2e3c0 65 73 20 6f 6e 20 74 68 65 20 73 75 62 71 75 65  es on the subque
2e3d0 72 69 65 73 0a 2a 2a 20 20 20 2a 20 20 54 68 65  ries.**   *  The
2e3e0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
2e3f0 61 20 73 69 6d 70 6c 65 20 63 6f 75 6e 74 28 2a  a simple count(*
2e400 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ).**.** Return T
2e410 52 55 45 20 69 66 20 74 68 65 20 6f 70 74 69 6d  RUE if the optim
2e420 69 7a 61 74 69 6f 6e 20 69 73 20 75 6e 64 65 72  ization is under
2e430 74 61 6b 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  taken..*/.static
2e440 20 69 6e 74 20 63 6f 75 6e 74 4f 66 56 69 65 77   int countOfView
2e450 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28 50 61 72  Optimization(Par
2e460 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
2e470 63 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74  ct *p){.  Select
2e480 20 2a 70 53 75 62 2c 20 2a 70 50 72 69 6f 72 3b   *pSub, *pPrior;
2e490 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a  .  Expr *pExpr;.
2e4a0 20 20 45 78 70 72 20 2a 70 43 6f 75 6e 74 3b 0a    Expr *pCount;.
2e4b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
2e4c0 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
2e4d0 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
2e4e0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
2e4f0 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e     /* This is an
2e500 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20 20   aggregate */.  
2e510 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  if( p->pEList->n
2e520 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
2e530 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2e540 20 20 2f 2a 20 53 69 6e 67 6c 65 20 72 65 73 75    /* Single resu
2e550 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 70  lt column */.  p
2e560 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74  Expr = p->pEList
2e570 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
2e580 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
2e590 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
2e5a0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
2e5b0 20 20 2f 2a 20 52 65 73 75 6c 74 20 69 73 20 61    /* Result is a
2e5c0 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20  n aggregate */. 
2e5d0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
2e5e0 69 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  icmp(pExpr->u.zT
2e5f0 6f 6b 65 6e 2c 22 63 6f 75 6e 74 22 29 20 29 20  oken,"count") ) 
2e600 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 49 73  return 0;  /* Is
2e610 20 63 6f 75 6e 74 28 29 20 2a 2f 0a 20 20 69 66   count() */.  if
2e620 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ( pExpr->x.pList
2e630 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  !=0 ) return 0; 
2e640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e650 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 75 6e 74  /* Must be count
2e660 28 2a 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  (*) */.  if( p->
2e670 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20  pSrc->nSrc!=1 ) 
2e680 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
2e690 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
2e6a0 65 20 74 61 62 6c 65 20 69 6e 20 46 52 4f 4d 20  e table in FROM 
2e6b0 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 2d 3e   */.  pSub = p->
2e6c0 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
2e6d0 63 74 3b 0a 20 20 69 66 28 20 70 53 75 62 3d 3d  ct;.  if( pSub==
2e6e0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  0 ) return 0;   
2e6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e700 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46          /* The F
2e710 52 4f 4d 20 69 73 20 61 20 73 75 62 71 75 65 72  ROM is a subquer
2e720 79 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  y */.  if( pSub-
2e730 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74  >pPrior==0 ) ret
2e740 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
2e750 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74           /* Must
2e760 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 72   be a compound r
2e770 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 69  y */.  do{.    i
2e780 66 28 20 70 53 75 62 2d 3e 6f 70 21 3d 54 4b 5f  f( pSub->op!=TK_
2e790 41 4c 4c 20 26 26 20 70 53 75 62 2d 3e 70 50 72  ALL && pSub->pPr
2e7a0 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ior ) return 0; 
2e7b0 20 2f 2a 20 4d 75 73 74 20 62 65 20 55 4e 49 4f   /* Must be UNIO
2e7c0 4e 20 41 4c 4c 20 2a 2f 0a 20 20 20 20 69 66 28  N ALL */.    if(
2e7d0 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 20   pSub->pWhere ) 
2e7e0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
2e7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e800 2a 20 4e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  * No WHERE claus
2e810 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75  e */.    if( pSu
2e820 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
2e830 5f 41 67 67 72 65 67 61 74 65 20 29 20 72 65 74  _Aggregate ) ret
2e840 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 4e 6f  urn 0;     /* No
2e850 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a  t an aggregate *
2e860 2f 0a 20 20 20 20 70 53 75 62 20 3d 20 70 53 75  /.    pSub = pSu
2e870 62 2d 3e 70 50 72 69 6f 72 3b 20 20 20 20 20 20  b->pPrior;      
2e880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e890 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 65 61          /* Repea
2e8a0 74 20 6f 76 65 72 20 63 6f 6d 70 6f 75 6e 64 20  t over compound 
2e8b0 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 70 53 75  */.  }while( pSu
2e8c0 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  b );..  /* If we
2e8d0 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
2e8e0 74 20 74 68 65 6e 20 69 74 20 69 73 20 4f 4b 20  t then it is OK 
2e8f0 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20 74  to perform the t
2e900 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  ransformation */
2e910 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ..  db = pParse-
2e920 3e 64 62 3b 0a 20 20 70 43 6f 75 6e 74 20 3d 20  >db;.  pCount = 
2e930 70 45 78 70 72 3b 0a 20 20 70 45 78 70 72 20 3d  pExpr;.  pExpr =
2e940 20 30 3b 0a 20 20 70 53 75 62 20 3d 20 70 2d 3e   0;.  pSub = p->
2e950 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
2e960 63 74 3b 0a 20 20 70 2d 3e 70 53 72 63 2d 3e 61  ct;.  p->pSrc->a
2e970 5b 30 5d 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b  [0].pSelect = 0;
2e980 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
2e990 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
2e9a0 53 72 63 29 3b 0a 20 20 70 2d 3e 70 53 72 63 20  Src);.  p->pSrc 
2e9b0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
2e9c0 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62  cZero(pParse->db
2e9d0 2c 20 73 69 7a 65 6f 66 28 2a 70 2d 3e 70 53 72  , sizeof(*p->pSr
2e9e0 63 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 53  c));.  while( pS
2e9f0 75 62 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  ub ){.    Expr *
2ea00 70 54 65 72 6d 3b 0a 20 20 20 20 70 50 72 69 6f  pTerm;.    pPrio
2ea10 72 20 3d 20 70 53 75 62 2d 3e 70 50 72 69 6f 72  r = pSub->pPrior
2ea20 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 50 72 69  ;.    pSub->pPri
2ea30 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62  or = 0;.    pSub
2ea40 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  ->pNext = 0;.   
2ea50 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
2ea60 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b  |= SF_Aggregate;
2ea70 0a 20 20 20 20 70 53 75 62 2d 3e 73 65 6c 46 6c  .    pSub->selFl
2ea80 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f  ags &= ~SF_Compo
2ea90 75 6e 64 3b 0a 20 20 20 20 70 53 75 62 2d 3e 6e  und;.    pSub->n
2eaa0 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20  SelectRow = 0;. 
2eab0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
2eac0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75  stDelete(db, pSu
2ead0 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
2eae0 70 54 65 72 6d 20 3d 20 70 50 72 69 6f 72 20 3f  pTerm = pPrior ?
2eaf0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
2eb00 64 62 2c 20 70 43 6f 75 6e 74 2c 20 30 29 20 3a  db, pCount, 0) :
2eb10 20 70 43 6f 75 6e 74 3b 0a 20 20 20 20 70 53 75   pCount;.    pSu
2eb20 62 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  b->pEList = sqli
2eb30 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
2eb40 64 28 70 50 61 72 73 65 2c 20 30 2c 20 70 54 65  d(pParse, 0, pTe
2eb50 72 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  rm);.    pTerm =
2eb60 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
2eb70 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43 54 2c  arse, TK_SELECT,
2eb80 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
2eb90 74 65 33 50 45 78 70 72 41 64 64 53 65 6c 65 63  te3PExprAddSelec
2eba0 74 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  t(pParse, pTerm,
2ebb0 20 70 53 75 62 29 3b 0a 20 20 20 20 69 66 28 20   pSub);.    if( 
2ebc0 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20  pExpr==0 ){.    
2ebd0 20 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 3b    pExpr = pTerm;
2ebe0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2ebf0 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
2ec00 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
2ec10 4b 5f 50 4c 55 53 2c 20 70 54 65 72 6d 2c 20 70  K_PLUS, pTerm, p
2ec20 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Expr);.    }.   
2ec30 20 70 53 75 62 20 3d 20 70 50 72 69 6f 72 3b 0a   pSub = pPrior;.
2ec40 20 20 7d 0a 20 20 70 2d 3e 70 45 4c 69 73 74 2d    }.  p->pEList-
2ec50 3e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70 45  >a[0].pExpr = pE
2ec60 78 70 72 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  xpr;.  p->selFla
2ec70 67 73 20 26 3d 20 7e 53 46 5f 41 67 67 72 65 67  gs &= ~SF_Aggreg
2ec80 61 74 65 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54  ate;..#if SELECT
2ec90 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
2eca0 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
2ecb0 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29  tTrace & 0x400 )
2ecc0 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  {.    SELECTTRAC
2ecd0 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70  E(0x400,pParse,p
2ece0 2c 28 22 41 66 74 65 72 20 63 6f 75 6e 74 2d 6f  ,("After count-o
2ecf0 66 2d 76 69 65 77 20 6f 70 74 69 6d 69 7a 61 74  f-view optimizat
2ed00 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73  ion:\n"));.    s
2ed10 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
2ed20 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
2ed30 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
2ed40 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
2ed50 2a 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46  * SQLITE_COUNTOF
2ed60 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  VIEW_OPTIMIZATIO
2ed70 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  N */../*.** Gene
2ed80 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
2ed90 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
2eda0 6e 74 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  nt given in the 
2edb0 70 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a  p argument.  .**
2edc0 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
2edd0 61 72 65 20 72 65 74 75 72 6e 65 64 20 61 63 63  are returned acc
2ede0 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 53 65  ording to the Se
2edf0 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75  lectDest structu
2ee00 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65  re..** See comme
2ee10 6e 74 73 20 69 6e 20 73 71 6c 69 74 65 49 6e 74  nts in sqliteInt
2ee20 2e 68 20 66 6f 72 20 66 75 72 74 68 65 72 20 69  .h for further i
2ee30 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nformation..**.*
2ee40 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
2ee50 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
2ee60 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66  r of errors.  If
2ee70 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a   any errors are.
2ee80 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  ** encountered, 
2ee90 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69  then an appropri
2eea0 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ate error messag
2eeb0 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20  e is left in.** 
2eec0 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
2eed0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2eee0 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65  ine does NOT fre
2eef0 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72  e the Select str
2ef00 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e  ucture passed in
2ef10 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  .  The.** callin
2ef20 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73  g function needs
2ef30 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a   to do that..*/.
2ef40 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
2ef50 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
2ef60 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
2ef70 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
2ef80 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
2ef90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2efa0 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
2efb0 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
2efc0 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  d. */.  SelectDe
2efd0 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 20 2f  st *pDest      /
2efe0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
2eff0 68 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  h the query resu
2f000 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
2f010 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
2f020 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2f030 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ers */.  WhereIn
2f040 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
2f050 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73  /* Return from s
2f060 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2f070 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  () */.  Vdbe *v;
2f080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f090 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61  * The virtual ma
2f0a0 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73  chine under cons
2f0b0 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
2f0c0 74 20 69 73 41 67 67 3b 20 20 20 20 20 20 20 20  t isAgg;        
2f0d0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
2f0e0 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69   select lists li
2f0f0 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f  ke "count(*)" */
2f100 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
2f110 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20 4c 69 73  ist = 0;  /* Lis
2f120 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
2f130 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72  extract. */.  Sr
2f140 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
2f150 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
2f160 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74  tables to select
2f170 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20   from */.  Expr 
2f180 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20  *pWhere;        
2f190 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
2f1a0 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
2f1b0 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
2f1c0 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20  t *pGroupBy;    
2f1d0 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20  /* The GROUP BY 
2f1e0 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
2f1f0 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  NULL */.  Expr *
2f200 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20  pHaving;        
2f210 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63   /* The HAVING c
2f220 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
2f230 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ULL */.  int rc 
2f240 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
2f250 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
2f260 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  rn from this fun
2f270 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69  ction */.  Disti
2f280 6e 63 74 43 74 78 20 73 44 69 73 74 69 6e 63 74  nctCtx sDistinct
2f290 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77  ; /* Info on how
2f2a0 20 74 6f 20 63 6f 64 65 20 74 68 65 20 44 49 53   to code the DIS
2f2b0 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f  TINCT keyword */
2f2c0 0a 20 20 53 6f 72 74 43 74 78 20 73 53 6f 72 74  .  SortCtx sSort
2f2d0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66  ;         /* Inf
2f2e0 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65  o on how to code
2f2f0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2f300 61 75 73 65 20 2a 2f 0a 20 20 41 67 67 49 6e 66  ause */.  AggInf
2f310 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20  o sAggInfo;     
2f320 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
2f330 75 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74  used by aggregat
2f340 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69  e queries */.  i
2f350 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20  nt iEnd;        
2f360 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
2f370 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74   of the end of t
2f380 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71  he query */.  sq
2f390 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
2f3a0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
2f3b0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
2f3c0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
2f3d0 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79 20 3d 20  MinMaxOrderBy = 
2f3e0 30 3b 20 20 2f 2a 20 41 64 64 65 64 20 4f 52 44  0;  /* Added ORD
2f3f0 45 52 20 42 59 20 66 6f 72 20 6d 69 6e 2f 6d 61  ER BY for min/ma
2f400 78 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 75  x queries */.  u
2f410 38 20 6d 69 6e 4d 61 78 46 6c 61 67 3b 20 20 20  8 minMaxFlag;   
2f420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f430 20 46 6c 61 67 20 66 6f 72 20 6d 69 6e 2f 6d 61   Flag for min/ma
2f440 78 20 71 75 65 72 69 65 73 20 2a 2f 0a 0a 23 69  x queries */..#i
2f450 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f460 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20  T_EXPLAIN.  int 
2f470 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64  iRestoreSelectId
2f480 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65   = pParse->iSele
2f490 63 74 49 64 3b 0a 20 20 70 50 61 72 73 65 2d 3e  ctId;.  pParse->
2f4a0 69 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72  iSelectId = pPar
2f4b0 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
2f4c0 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64  d++;.#endif..  d
2f4d0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
2f4e0 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62    if( p==0 || db
2f4f0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
2f500 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
2f510 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
2f520 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
2f530 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
2f540 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54  e, SQLITE_SELECT
2f550 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74  , 0, 0, 0) ) ret
2f560 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28  urn 1;.  memset(
2f570 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69  &sAggInfo, 0, si
2f580 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b  zeof(sAggInfo));
2f590 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
2f5a0 5f 45 4e 41 42 4c 45 44 0a 20 20 53 45 4c 45 43  _ENABLED.  SELEC
2f5b0 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c  TTRACE(1,pParse,
2f5c0 70 2c 20 28 22 62 65 67 69 6e 20 70 72 6f 63 65  p, ("begin proce
2f5d0 73 73 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 69  ssing:\n"));.  i
2f5e0 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
2f5f0 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
2f600 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
2f610 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
2f620 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
2f630 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
2f640 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65  rderBy==0 || pDe
2f650 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44  st->eDest!=SRT_D
2f660 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 61 73 73  istFifo );.  ass
2f670 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
2f680 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ==0 || pDest->eD
2f690 65 73 74 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b  est!=SRT_Fifo );
2f6a0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
2f6b0 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65  rderBy==0 || pDe
2f6c0 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44  st->eDest!=SRT_D
2f6d0 69 73 74 51 75 65 75 65 20 29 3b 0a 20 20 61 73  istQueue );.  as
2f6e0 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
2f6f0 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65  y==0 || pDest->e
2f700 44 65 73 74 21 3d 53 52 54 5f 51 75 65 75 65 20  Dest!=SRT_Queue 
2f710 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62  );.  if( Ignorab
2f720 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29  leOrderby(pDest)
2f730 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70   ){.    assert(p
2f740 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2f750 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74  _Exists || pDest
2f760 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69  ->eDest==SRT_Uni
2f770 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  on || .         
2f780 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
2f790 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44  SRT_Except || pD
2f7a0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2f7b0 44 69 73 63 61 72 64 20 7c 7c 0a 20 20 20 20 20  Discard ||.     
2f7c0 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65        pDest->eDe
2f7d0 73 74 3d 3d 53 52 54 5f 51 75 65 75 65 20 20 7c  st==SRT_Queue  |
2f7e0 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
2f7f0 53 52 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a  SRT_DistFifo ||.
2f800 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
2f810 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ->eDest==SRT_Dis
2f820 74 51 75 65 75 65 20 7c 7c 20 70 44 65 73 74 2d  tQueue || pDest-
2f830 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f  >eDest==SRT_Fifo
2f840 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52 44  );.    /* If ORD
2f850 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64  ER BY makes no d
2f860 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65  ifference in the
2f870 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65 69   output then nei
2f880 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a  ther does.    **
2f890 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74 20   DISTINCT so it 
2f8a0 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20 74  can be removed t
2f8b0 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  oo. */.    sqlit
2f8c0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
2f8d0 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
2f8e0 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  );.    p->pOrder
2f8f0 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73  By = 0;.    p->s
2f900 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44  elFlags &= ~SF_D
2f910 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73  istinct;.  }.  s
2f920 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
2f930 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a  (pParse, p, 0);.
2f940 20 20 6d 65 6d 73 65 74 28 26 73 53 6f 72 74 2c    memset(&sSort,
2f950 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f 72 74   0, sizeof(sSort
2f960 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f 72 64  ));.  sSort.pOrd
2f970 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
2f980 42 79 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d  By;.  pTabList =
2f990 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28 20   p->pSrc;.  if( 
2f9a0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
2f9b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2f9c0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   ){.    goto sel
2f9d0 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 61  ect_end;.  }.  a
2f9e0 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
2f9f0 21 3d 30 20 29 3b 0a 20 20 69 73 41 67 67 20 3d  !=0 );.  isAgg =
2fa00 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
2fa10 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30  SF_Aggregate)!=0
2fa20 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
2fa30 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
2fa40 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
2fa50 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20  ce & 0x100 ){.  
2fa60 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
2fa70 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 20 28 22  100,pParse,p, ("
2fa80 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c  after name resol
2fa90 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20  ution:\n"));.   
2faa0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
2fab0 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
2fac0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
2fad0 2a 20 47 65 74 20 61 20 70 6f 69 6e 74 65 72 20  * Get a pointer 
2fae0 74 68 65 20 56 44 42 45 20 75 6e 64 65 72 20 63  the VDBE under c
2faf0 6f 6e 73 74 72 75 63 74 69 6f 6e 2c 20 61 6c 6c  onstruction, all
2fb00 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 56 44  ocating a new VD
2fb10 42 45 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 64  BE if one.  ** d
2fb20 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
2fb30 65 78 69 73 74 20 2a 2f 0a 20 20 76 20 3d 20 73  exist */.  v = s
2fb40 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
2fb50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
2fb60 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
2fb70 65 6e 64 3b 0a 20 20 69 66 28 20 70 44 65 73 74  end;.  if( pDest
2fb80 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ->eDest==SRT_Out
2fb90 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  put ){.    gener
2fba0 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
2fbb0 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a  Parse, p);.  }..
2fbc0 20 20 2f 2a 20 54 72 79 20 74 6f 20 76 61 72 69    /* Try to vari
2fbd0 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ous optimization
2fbe0 73 20 28 66 6c 61 74 74 65 6e 69 6e 67 20 73 75  s (flattening su
2fbf0 62 71 75 65 72 69 65 73 2c 20 61 6e 64 20 73 74  bqueries, and st
2fc00 72 65 6e 67 74 68 0a 20 20 2a 2a 20 72 65 64 75  rength.  ** redu
2fc10 63 74 69 6f 6e 20 6f 66 20 6a 6f 69 6e 20 6f 70  ction of join op
2fc20 65 72 61 74 6f 72 73 29 20 69 6e 20 74 68 65 20  erators) in the 
2fc30 46 52 4f 4d 20 63 6c 61 75 73 65 20 75 70 20 69  FROM clause up i
2fc40 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 71 75 65  nto the main que
2fc50 72 79 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  ry.  */.#if !def
2fc60 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
2fc70 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
2fc80 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
2fc90 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69  IT_VIEW).  for(i
2fca0 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72 20 26  =0; !p->pPrior &
2fcb0 26 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  & i<pTabList->nS
2fcc0 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
2fcd0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2fce0 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62  m *pItem = &pTab
2fcf0 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  List->a[i];.    
2fd00 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70  Select *pSub = p
2fd10 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  Item->pSelect;. 
2fd20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
2fd30 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 0a 20   pItem->pTab;.. 
2fd40 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 4c 45     /* Convert LE
2fd50 46 54 20 4a 4f 49 4e 20 69 6e 74 6f 20 4a 4f 49  FT JOIN into JOI
2fd60 4e 20 69 66 20 74 68 65 72 65 20 61 72 65 20 74  N if there are t
2fd70 65 72 6d 73 20 6f 66 20 74 68 65 20 72 69 67 68  erms of the righ
2fd80 74 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 6f  t table.    ** o
2fd90 66 20 74 68 65 20 4c 45 46 54 20 4a 4f 49 4e 20  f the LEFT JOIN 
2fda0 75 73 65 64 20 69 6e 20 74 68 65 20 57 48 45 52  used in the WHER
2fdb0 45 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f  E clause..    */
2fdc0 0a 20 20 20 20 69 66 28 20 28 70 49 74 65 6d 2d  .    if( (pItem-
2fdd0 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  >fg.jointype & J
2fde0 54 5f 4c 45 46 54 29 21 3d 30 0a 20 20 20 20 20  T_LEFT)!=0.     
2fdf0 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d  && sqlite3ExprIm
2fe00 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c 52 6f 77 28  pliesNonNullRow(
2fe10 70 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d  p->pWhere, pItem
2fe20 2d 3e 69 43 75 72 73 6f 72 29 0a 20 20 20 20 20  ->iCursor).     
2fe30 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
2fe40 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
2fe50 45 5f 53 69 6d 70 6c 69 66 79 4a 6f 69 6e 29 0a  E_SimplifyJoin).
2fe60 20 20 20 20 29 7b 0a 20 20 20 20 20 20 53 45 4c      ){.      SEL
2fe70 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70  ECTTRACE(0x100,p
2fe80 50 61 72 73 65 2c 70 2c 0a 20 20 20 20 20 20 20  Parse,p,.       
2fe90 20 20 20 20 20 20 20 20 20 28 22 4c 45 46 54 2d           ("LEFT-
2fea0 4a 4f 49 4e 20 73 69 6d 70 6c 69 66 69 65 73 20  JOIN simplifies 
2feb0 74 6f 20 4a 4f 49 4e 20 6f 6e 20 74 65 72 6d 20  to JOIN on term 
2fec0 25 64 5c 6e 22 2c 69 29 29 3b 0a 20 20 20 20 20  %d\n",i));.     
2fed0 20 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74   pItem->fg.joint
2fee0 79 70 65 20 26 3d 20 7e 28 4a 54 5f 4c 45 46 54  ype &= ~(JT_LEFT
2fef0 7c 4a 54 5f 4f 55 54 45 52 29 3b 0a 20 20 20 20  |JT_OUTER);.    
2ff00 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28    unsetJoinExpr(
2ff10 70 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d  p->pWhere, pItem
2ff20 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
2ff30 7d 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20 66 75 74  }..    /* No fut
2ff40 68 65 72 20 61 63 74 69 6f 6e 20 69 66 20 74 68  her action if th
2ff50 69 73 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46  is term of the F
2ff60 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f  ROM clause is no
2ff70 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20   a subquery */. 
2ff80 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29     if( pSub==0 )
2ff90 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
2ffa0 2f 2a 20 43 61 74 63 68 20 6d 69 73 6d 61 74 63  /* Catch mismatc
2ffb0 68 20 69 6e 20 74 68 65 20 64 65 63 6c 61 72 65  h in the declare
2ffc0 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 61 20 76  d columns of a v
2ffd0 69 65 77 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  iew and the numb
2ffe0 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 63 6f 6c  er of.    ** col
2fff0 75 6d 6e 73 20 69 6e 20 74 68 65 20 53 45 4c 45  umns in the SELE
30000 43 54 20 6f 6e 20 74 68 65 20 52 48 53 20 2a 2f  CT on the RHS */
30010 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e  .    if( pTab->n
30020 43 6f 6c 21 3d 70 53 75 62 2d 3e 70 45 4c 69 73  Col!=pSub->pELis
30030 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
30040 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
30050 67 28 70 50 61 72 73 65 2c 20 22 65 78 70 65 63  g(pParse, "expec
30060 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 66  ted %d columns f
30070 6f 72 20 27 25 73 27 20 62 75 74 20 67 6f 74 20  or '%s' but got 
30080 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %d",.           
30090 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
300a0 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 7a 4e 61  >nCol, pTab->zNa
300b0 6d 65 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  me, pSub->pEList
300c0 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
300d0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
300e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
300f0 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 66 6c 61  o not try to fla
30100 74 74 65 6e 20 61 6e 20 61 67 67 72 65 67 61 74  tten an aggregat
30110 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20  e subquery..    
30120 2a 2a 0a 20 20 20 20 2a 2a 20 46 6c 61 74 74 65  **.    ** Flatte
30130 6e 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74  ning an aggregat
30140 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6f 6e  e subquery is on
30150 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20 74  ly possible if t
30160 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 20  he outer query. 
30170 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 6a     ** is not a j
30180 6f 69 6e 2e 20 20 42 75 74 20 69 66 20 74 68 65  oin.  But if the
30190 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
301a0 6e 6f 74 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e  not a join, then
301b0 20 74 68 65 20 73 75 62 71 75 65 72 79 0a 20 20   the subquery.  
301c0 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 69 6d 70    ** will be imp
301d0 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f  lemented as a co
301e0 2d 72 6f 75 74 69 6e 65 20 61 6e 64 20 74 68 65  -routine and the
301f0 72 65 20 69 73 20 6e 6f 20 61 64 76 61 6e 74 61  re is no advanta
30200 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 66 6c 61  ge to.    ** fla
30210 74 74 65 6e 69 6e 67 20 69 6e 20 74 68 61 74 20  ttening in that 
30220 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
30230 20 69 66 28 20 28 70 53 75 62 2d 3e 73 65 6c 46   if( (pSub->selF
30240 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
30250 61 74 65 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  ate)!=0 ) contin
30260 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
30270 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 3d 3d  pSub->pGroupBy==
30280 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  0 );..    /* If 
30290 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
302a0 63 6f 6e 74 61 69 6e 73 20 61 20 22 63 6f 6d 70  contains a "comp
302b0 6c 65 78 22 20 72 65 73 75 6c 74 20 73 65 74 20  lex" result set 
302c0 28 74 68 61 74 20 69 73 2c 0a 20 20 20 20 2a 2a  (that is,.    **
302d0 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 73   if the result s
302e0 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  et of the outer 
302f0 71 75 65 72 79 20 75 73 65 73 20 66 75 6e 63 74  query uses funct
30300 69 6f 6e 73 20 6f 72 20 73 75 62 71 75 65 72 69  ions or subqueri
30310 65 73 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69  es).    ** and i
30320 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 63  f the subquery c
30330 6f 6e 74 61 69 6e 73 20 61 6e 20 4f 52 44 45 52  ontains an ORDER
30340 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 69   BY clause and i
30350 66 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 6c 6c  f.    ** it will
30360 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   be implemented 
30370 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 2c  as a co-routine,
30380 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61   then do not fla
30390 74 74 65 6e 2e 20 20 54 68 69 73 0a 20 20 20 20  tten.  This.    
303a0 2a 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 61  ** restriction a
303b0 6c 6c 6f 77 73 20 53 51 4c 20 63 6f 6e 73 74 72  llows SQL constr
303c0 75 63 74 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ucts like this:.
303d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 53      **.    **  S
303e0 45 4c 45 43 54 20 65 78 70 65 6e 73 69 76 65 5f  ELECT expensive_
303f0 66 75 6e 63 74 69 6f 6e 28 78 29 0a 20 20 20 20  function(x).    
30400 2a 2a 20 20 20 20 46 52 4f 4d 20 28 53 45 4c 45  **    FROM (SELE
30410 43 54 20 78 20 46 52 4f 4d 20 74 61 62 20 4f 52  CT x FROM tab OR
30420 44 45 52 20 42 59 20 79 20 4c 49 4d 49 54 20 31  DER BY y LIMIT 1
30430 30 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  0);.    **.    *
30440 2a 20 54 68 65 20 65 78 70 65 6e 73 69 76 65 5f  * The expensive_
30450 66 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 6f 6e  function() is on
30460 6c 79 20 63 6f 6d 70 75 74 65 64 20 6f 6e 20 74  ly computed on t
30470 68 65 20 31 30 20 72 6f 77 73 20 74 68 61 74 0a  he 10 rows that.
30480 20 20 20 20 2a 2a 20 61 72 65 20 6f 75 74 70 75      ** are outpu
30490 74 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 65  t, rather than e
304a0 76 65 72 79 20 72 6f 77 20 6f 66 20 74 68 65 20  very row of the 
304b0 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  table..    **.  
304c0 20 20 2a 2a 20 54 68 65 20 72 65 71 75 69 72 65    ** The require
304d0 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20 6f 75  ment that the ou
304e0 74 65 72 20 71 75 65 72 79 20 68 61 76 65 20 61  ter query have a
304f0 20 63 6f 6d 70 6c 65 78 20 72 65 73 75 6c 74 20   complex result 
30500 73 65 74 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73  set.    ** means
30510 20 74 68 61 74 20 66 6c 61 74 74 65 6e 69 6e 67   that flattening
30520 20 64 6f 65 73 20 6f 63 63 75 72 20 6f 6e 20 73   does occur on s
30530 69 6d 70 6c 65 72 20 53 51 4c 20 63 6f 6e 73 74  impler SQL const
30540 72 61 69 6e 74 73 20 77 69 74 68 6f 75 74 0a 20  raints without. 
30550 20 20 20 2a 2a 20 74 68 65 20 65 78 70 65 6e 73     ** the expens
30560 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20 6c  ive_function() l
30570 69 6b 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ike:.    **.    
30580 2a 2a 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f  **  SELECT x FRO
30590 4d 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d  M (SELECT x FROM
305a0 20 74 61 62 20 4f 52 44 45 52 20 42 59 20 79 20   tab ORDER BY y 
305b0 4c 49 4d 49 54 20 31 30 29 3b 0a 20 20 20 20 2a  LIMIT 10);.    *
305c0 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  /.    if( pSub->
305d0 70 4f 72 64 65 72 42 79 21 3d 30 0a 20 20 20 20  pOrderBy!=0.    
305e0 20 26 26 20 69 3d 3d 30 0a 20 20 20 20 20 26 26   && i==0.     &&
305f0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
30600 53 46 5f 43 6f 6d 70 6c 65 78 52 65 73 75 6c 74  SF_ComplexResult
30610 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  )!=0.     && (pT
30620 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a  abList->nSrc==1.
30630 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54 61           || (pTa
30640 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66 67 2e 6a  bList->a[1].fg.j
30650 6f 69 6e 74 79 70 65 26 28 4a 54 5f 4c 45 46 54  ointype&(JT_LEFT
30660 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 29 0a  |JT_CROSS))!=0).
30670 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e      ){.      con
30680 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  tinue;.    }..  
30690 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53 75 62    if( flattenSub
306a0 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c  query(pParse, p,
306b0 20 69 2c 20 69 73 41 67 67 29 20 29 7b 0a 20 20   i, isAgg) ){.  
306c0 20 20 20 20 2f 2a 20 54 68 69 73 20 73 75 62 71      /* This subq
306d0 75 65 72 79 20 63 61 6e 20 62 65 20 61 62 73 6f  uery can be abso
306e0 72 62 65 64 20 69 6e 74 6f 20 69 74 73 20 70 61  rbed into its pa
306f0 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69  rent. */.      i
30700 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
30710 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
30720 53 72 63 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  Src;.    if( db-
30730 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
30740 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
30750 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61  .    if( !Ignora
30760 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74  bleOrderby(pDest
30770 29 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74  ) ){.      sSort
30780 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70  .pOrderBy = p->p
30790 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20  OrderBy;.    }. 
307a0 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64   }.#endif..#ifnd
307b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
307c0 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20  OMPOUND_SELECT. 
307d0 20 2f 2a 20 48 61 6e 64 6c 65 20 63 6f 6d 70 6f   /* Handle compo
307e0 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
307f0 6d 65 6e 74 73 20 75 73 69 6e 67 20 74 68 65 20  ments using the 
30800 73 65 70 61 72 61 74 65 20 6d 75 6c 74 69 53 65  separate multiSe
30810 6c 65 63 74 28 29 0a 20 20 2a 2a 20 70 72 6f 63  lect().  ** proc
30820 65 64 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  edure..  */.  if
30830 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
30840 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c     rc = multiSel
30850 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ect(pParse, p, p
30860 44 65 73 74 29 3b 0a 20 20 20 20 65 78 70 6c 61  Dest);.    expla
30870 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 50 61  inSetInteger(pPa
30880 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
30890 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64  iRestoreSelectId
308a0 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  );.#if SELECTTRA
308b0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 53  CE_ENABLED.    S
308c0 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61  ELECTTRACE(1,pPa
308d0 72 73 65 2c 70 2c 28 22 65 6e 64 20 63 6f 6d 70  rse,p,("end comp
308e0 6f 75 6e 64 2d 73 65 6c 65 63 74 20 70 72 6f 63  ound-select proc
308f0 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 23 65 6e  essing\n"));.#en
30900 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 72  dif.    return r
30910 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  c;.  }.#endif.. 
30920 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 74 65 72   /* For each ter
30930 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  m in the FROM cl
30940 61 75 73 65 2c 20 64 6f 20 74 77 6f 20 74 68 69  ause, do two thi
30950 6e 67 73 3a 0a 20 20 2a 2a 20 28 31 29 20 41 75  ngs:.  ** (1) Au
30960 74 68 6f 72 69 7a 65 64 20 75 6e 72 65 66 65 72  thorized unrefer
30970 65 6e 63 65 64 20 74 61 62 6c 65 73 0a 20 20 2a  enced tables.  *
30980 2a 20 28 32 29 20 47 65 6e 65 72 61 74 65 20 63  * (2) Generate c
30990 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d  ode for all sub-
309a0 71 75 65 72 69 65 73 0a 20 20 2a 2f 0a 20 20 66  queries.  */.  f
309b0 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
309c0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
309d0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
309e0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
309f0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d   &pTabList->a[i]
30a00 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73 74  ;.    SelectDest
30a10 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63   dest;.    Selec
30a20 74 20 2a 70 53 75 62 3b 0a 23 69 66 20 21 64 65  t *pSub;.#if !de
30a30 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
30a40 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
30a50 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
30a60 4d 49 54 5f 56 49 45 57 29 0a 20 20 20 20 63 6f  MIT_VIEW).    co
30a70 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64  nst char *zSaved
30a80 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 23 65 6e  AuthContext;.#en
30a90 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 73 73 75  dif..    /* Issu
30aa0 65 20 53 51 4c 49 54 45 5f 52 45 41 44 20 61 75  e SQLITE_READ au
30ab0 74 68 6f 72 69 7a 61 74 69 6f 6e 73 20 77 69 74  thorizations wit
30ac0 68 20 61 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20  h a fake column 
30ad0 6e 61 6d 65 20 66 6f 72 20 61 6e 79 0a 20 20 20  name for any.   
30ae0 20 2a 2a 20 74 61 62 6c 65 73 20 74 68 61 74 20   ** tables that 
30af0 61 72 65 20 72 65 66 65 72 65 6e 63 65 64 20 62  are referenced b
30b00 75 74 20 66 72 6f 6d 20 77 68 69 63 68 20 6e 6f  ut from which no
30b10 20 76 61 6c 75 65 73 20 61 72 65 20 65 78 74 72   values are extr
30b20 61 63 74 65 64 2e 0a 20 20 20 20 2a 2a 20 45 78  acted..    ** Ex
30b30 61 6d 70 6c 65 73 20 6f 66 20 77 68 65 72 65 20  amples of where 
30b40 74 68 65 73 65 20 6b 69 6e 64 73 20 6f 66 20 6e  these kinds of n
30b50 75 6c 6c 20 53 51 4c 49 54 45 5f 52 45 41 44 20  ull SQLITE_READ 
30b60 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 73 0a 20  authorizations. 
30b70 20 20 20 2a 2a 20 77 6f 75 6c 64 20 6f 63 63 75     ** would occu
30b80 72 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  r:.    **.    **
30b90 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e       SELECT coun
30ba0 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  t(*) FROM t1;   
30bb0 2d 2d 20 53 51 4c 49 54 45 5f 52 45 41 44 20 74  -- SQLITE_READ t
30bc0 31 2e 22 22 0a 20 20 20 20 2a 2a 20 20 20 20 20  1."".    **     
30bd0 53 45 4c 45 43 54 20 74 31 2e 2a 20 46 52 4f 4d  SELECT t1.* FROM
30be0 20 74 31 2c 20 74 32 3b 20 20 20 2d 2d 20 53 51   t1, t2;   -- SQ
30bf0 4c 49 54 45 5f 52 45 41 44 20 74 32 2e 22 22 0a  LITE_READ t2."".
30c00 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
30c10 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61  e fake column na
30c20 6d 65 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73  me is an empty s
30c30 74 72 69 6e 67 2e 20 20 49 74 20 69 73 20 70 6f  tring.  It is po
30c40 73 73 69 62 6c 65 20 66 6f 72 20 61 20 74 61 62  ssible for a tab
30c50 6c 65 20 74 6f 0a 20 20 20 20 2a 2a 20 68 61 76  le to.    ** hav
30c60 65 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64  e a column named
30c70 20 62 79 20 74 68 65 20 65 6d 70 74 79 20 73 74   by the empty st
30c80 72 69 6e 67 2c 20 69 6e 20 77 68 69 63 68 20 63  ring, in which c
30c90 61 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ase there is no 
30ca0 77 61 79 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69  way to.    ** di
30cb0 73 74 69 6e 67 75 69 73 68 20 62 65 74 77 65 65  stinguish betwee
30cc0 6e 20 61 6e 20 75 6e 72 65 66 65 72 65 6e 63 65  n an unreference
30cd0 64 20 74 61 62 6c 65 20 61 6e 64 20 61 6e 20 61  d table and an a
30ce0 63 74 75 61 6c 20 72 65 66 65 72 65 6e 63 65 20  ctual reference 
30cf0 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 22 22  to the.    ** ""
30d00 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 20 6f 72 69   column. The ori
30d10 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 77 61 73  ginal design was
30d20 20 66 6f 72 20 74 68 65 20 66 61 6b 65 20 63 6f   for the fake co
30d30 6c 75 6d 6e 20 6e 61 6d 65 20 74 6f 20 62 65 20  lumn name to be 
30d40 61 20 4e 55 4c 4c 2c 0a 20 20 20 20 2a 2a 20 77  a NULL,.    ** w
30d50 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20 75 6e  hich would be un
30d60 61 6d 62 69 67 75 6f 75 73 2e 20 20 42 75 74 20  ambiguous.  But 
30d70 6c 65 67 61 63 79 20 61 75 74 68 6f 72 69 7a 61  legacy authoriza
30d80 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 73 20 6d  tion callbacks m
30d90 69 67 68 74 0a 20 20 20 20 2a 2a 20 61 73 73 75  ight.    ** assu
30da0 6d 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  me the column na
30db0 6d 65 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61  me is non-NULL a
30dc0 6e 64 20 73 65 67 66 61 75 6c 74 2e 20 20 54 68  nd segfault.  Th
30dd0 65 20 75 73 65 20 6f 66 20 61 6e 20 65 6d 70 74  e use of an empt
30de0 79 0a 20 20 20 20 2a 2a 20 73 74 72 69 6e 67 20  y.    ** string 
30df0 66 6f 72 20 74 68 65 20 66 61 6b 65 20 63 6f 6c  for the fake col
30e00 75 6d 6e 20 6e 61 6d 65 20 73 65 65 6d 73 20 73  umn name seems s
30e10 61 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  afer..    */.   
30e20 20 69 66 28 20 70 49 74 65 6d 2d 3e 63 6f 6c 55   if( pItem->colU
30e30 73 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sed==0 ){.      
30e40 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
30e50 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
30e60 52 45 41 44 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61  READ, pItem->zNa
30e70 6d 65 2c 20 22 22 2c 20 70 49 74 65 6d 2d 3e 7a  me, "", pItem->z
30e80 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 7d  Database);.    }
30e90 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
30ea0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
30eb0 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
30ec0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
30ed0 57 29 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  W).    /* Genera
30ee0 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20  te code for all 
30ef0 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74  sub-queries in t
30f00 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
30f10 20 20 20 2a 2f 0a 20 20 20 20 70 53 75 62 20 3d     */.    pSub =
30f20 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b   pItem->pSelect;
30f30 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30  .    if( pSub==0
30f40 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
30f50 20 20 2f 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74    /* Sometimes t
30f60 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 75  he code for a su
30f70 62 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20 67  bquery will be g
30f80 65 6e 65 72 61 74 65 64 20 6d 6f 72 65 20 74 68  enerated more th
30f90 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63 65 2c 20  an.    ** once, 
30fa0 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
30fb0 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 57  is part of the W
30fc0 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 61  HERE clause in a
30fd0 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20 20 20 20   LEFT JOIN,.    
30fe0 2a 2a 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20  ** for example. 
30ff0 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64   In that case, d
31000 6f 20 6e 6f 74 20 72 65 67 65 6e 65 72 61 74 65  o not regenerate
31010 20 74 68 65 20 63 6f 64 65 20 74 6f 20 6d 61 6e   the code to man
31020 69 66 65 73 74 0a 20 20 20 20 2a 2a 20 61 20 76  ifest.    ** a v
31030 69 65 77 20 6f 72 20 74 68 65 20 63 6f 2d 72 6f  iew or the co-ro
31040 75 74 69 6e 65 20 74 6f 20 69 6d 70 6c 65 6d 65  utine to impleme
31050 6e 74 20 61 20 76 69 65 77 2e 20 20 54 68 65 20  nt a view.  The 
31060 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65 0a 20  first instance. 
31070 20 20 20 2a 2a 20 69 73 20 73 75 66 66 69 63 69     ** is suffici
31080 65 6e 74 2c 20 74 68 6f 75 67 68 20 74 68 65 20  ent, though the 
31090 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61  subroutine to ma
310a0 6e 69 66 65 73 74 20 74 68 65 20 76 69 65 77 20  nifest the view 
310b0 64 6f 65 73 20 6e 65 65 64 0a 20 20 20 20 2a 2a  does need.    **
310c0 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 61   to be invoked a
310d0 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  gain. */.    if(
310e0 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
310f0 53 75 62 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Sub ){.      if(
31100 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f   pItem->fg.viaCo
31110 72 6f 75 74 69 6e 65 3d 3d 30 20 29 7b 0a 20 20  routine==0 ){.  
31120 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62        /* The sub
31130 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d 61 6e  routine that man
31140 69 66 65 73 74 73 20 74 68 65 20 76 69 65 77 20  ifests the view 
31150 6d 69 67 68 74 20 62 65 20 61 20 6f 6e 65 2d 74  might be a one-t
31160 69 6d 65 20 72 6f 75 74 69 6e 65 2c 0a 20 20 20  ime routine,.   
31170 20 20 20 20 20 2a 2a 20 6f 72 20 69 74 20 6d 69       ** or it mi
31180 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72  ght need to be r
31190 65 72 75 6e 20 6f 6e 20 65 61 63 68 20 69 74 65  erun on each ite
311a0 72 61 74 69 6f 6e 20 62 65 63 61 75 73 65 20 69  ration because i
311b0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 6e 63  t.        ** enc
311c0 6f 64 65 73 20 61 20 63 6f 72 72 65 6c 61 74 65  odes a correlate
311d0 64 20 73 75 62 71 75 65 72 79 2e 20 2a 2f 0a 20  d subquery. */. 
311e0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
311f0 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
31200 70 28 76 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72  p(v, pItem->addr
31210 46 69 6c 6c 53 75 62 29 2d 3e 6f 70 63 6f 64 65  FillSub)->opcode
31220 3d 3d 4f 50 5f 4f 6e 63 65 20 29 3b 0a 20 20 20  ==OP_Once );.   
31230 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
31240 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
31250 75 62 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  ub, pItem->regRe
31260 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64 64  turn, pItem->add
31270 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 20  rFillSub);.     
31280 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75   }.      continu
31290 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  e;.    }..    /*
312a0 20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65   Increment Parse
312b0 2e 6e 48 65 69 67 68 74 20 62 79 20 74 68 65 20  .nHeight by the 
312c0 68 65 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61  height of the la
312d0 72 67 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e  rgest expression
312e0 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66  .    ** tree ref
312f0 65 72 72 65 64 20 74 6f 20 62 79 20 74 68 69 73  erred to by this
31300 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73 65 6c  , the parent sel
31310 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20 73  ect. The child s
31320 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79  elect.    ** may
31330 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73 73   contain express
31340 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74 20  ion trees of at 
31350 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c  most.    ** (SQL
31360 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
31370 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68 74  TH-Parse.nHeight
31380 29 20 68 65 69 67 68 74 2e 20 54 68 69 73 20 69  ) height. This i
31390 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d  s a bit.    ** m
313a0 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65  ore conservative
313b0 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2c   than necessary,
313c0 20 62 75 74 20 6d 75 63 68 20 65 61 73 69 65 72   but much easier
313d0 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a   than enforcing.
313e0 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74 20      ** an exact 
313f0 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  limit..    */.  
31400 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68    pParse->nHeigh
31410 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  t += sqlite3Sele
31420 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b  ctExprHeight(p);
31430 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 63 6f  ..    /* Make co
31440 70 69 65 73 20 6f 66 20 63 6f 6e 73 74 61 6e 74  pies of constant
31450 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 74 65   WHERE-clause te
31460 72 6d 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72  rms in the outer
31470 20 71 75 65 72 79 20 64 6f 77 6e 0a 20 20 20 20   query down.    
31480 2a 2a 20 69 6e 73 69 64 65 20 74 68 65 20 73 75  ** inside the su
31490 62 71 75 65 72 79 2e 20 20 54 68 69 73 20 63 61  bquery.  This ca
314a0 6e 20 68 65 6c 70 20 74 68 65 20 73 75 62 71 75  n help the subqu
314b0 65 72 79 20 74 6f 20 72 75 6e 20 6d 6f 72 65 20  ery to run more 
314c0 65 66 66 69 63 69 65 6e 74 6c 79 2e 0a 20 20 20  efficiently..   
314d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 4f 70 74 69   */.    if( Opti
314e0 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
314f0 64 62 2c 20 53 51 4c 49 54 45 5f 50 75 73 68 44  db, SQLITE_PushD
31500 6f 77 6e 29 0a 20 20 20 20 20 26 26 20 70 75 73  own).     && pus
31510 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28  hDownWhereTerms(
31520 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 70 2d  pParse, pSub, p-
31530 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e  >pWhere, pItem->
31540 69 43 75 72 73 6f 72 2c 0a 20 20 20 20 20 20 20  iCursor,.       
31550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31560 20 20 20 20 28 70 49 74 65 6d 2d 3e 66 67 2e 6a      (pItem->fg.j
31570 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
31580 45 52 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 23  ER)!=0).    ){.#
31590 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
315a0 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 69 66 28  NABLED.      if(
315b0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
315c0 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20  ace & 0x100 ){. 
315d0 20 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41         SELECTTRA
315e0 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c  CE(0x100,pParse,
315f0 70 2c 28 22 41 66 74 65 72 20 57 48 45 52 45 2d  p,("After WHERE-
31600 63 6c 61 75 73 65 20 70 75 73 68 2d 64 6f 77 6e  clause push-down
31610 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20  :\n"));.        
31620 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
31630 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
31640 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
31650 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31660 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30  SELECTTRACE(0x10
31670 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 50 75 73  0,pParse,p,("Pus
31680 68 2d 64 6f 77 6e 20 6e 6f 74 20 70 6f 73 73 69  h-down not possi
31690 62 6c 65 5c 6e 22 29 29 3b 0a 20 20 20 20 7d 0a  ble\n"));.    }.
316a0 0a 20 20 20 20 7a 53 61 76 65 64 41 75 74 68 43  .    zSavedAuthC
316b0 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d  ontext = pParse-
316c0 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20  >zAuthContext;. 
316d0 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68     pParse->zAuth
316e0 43 6f 6e 74 65 78 74 20 3d 20 70 49 74 65 6d 2d  Context = pItem-
316f0 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20  >zName;..    /* 
31700 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
31710 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 73   implement the s
31720 75 62 71 75 65 72 79 0a 20 20 20 20 2a 2a 0a 20  ubquery.    **. 
31730 20 20 20 2a 2a 20 54 68 65 20 73 75 62 71 75 65     ** The subque
31740 72 79 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  ry is implemente
31750 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e  d as a co-routin
31760 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  e if the subquer
31770 79 20 69 73 0a 20 20 20 20 2a 2a 20 67 75 61 72  y is.    ** guar
31780 61 6e 74 65 65 64 20 74 6f 20 62 65 20 74 68 65  anteed to be the
31790 20 6f 75 74 65 72 20 6c 6f 6f 70 20 28 73 6f 20   outer loop (so 
317a0 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74  that it does not
317b0 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 20 20   need to be.    
317c0 2a 2a 20 63 6f 6d 70 75 74 65 64 20 6d 6f 72 65  ** computed more
317d0 20 74 68 61 6e 20 6f 6e 63 65 29 0a 20 20 20 20   than once).    
317e0 2a 2a 0a 20 20 20 20 2a 2a 20 54 4f 44 4f 3a 20  **.    ** TODO: 
317f0 41 72 65 20 74 68 65 72 65 20 6f 74 68 65 72 20  Are there other 
31800 72 65 61 73 6f 6e 73 20 62 65 73 69 64 65 20 28  reasons beside (
31810 31 29 20 74 6f 20 75 73 65 20 61 20 63 6f 2d 72  1) to use a co-r
31820 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 6d  outine.    ** im
31830 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 3f 0a 20 20  plementation?.  
31840 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 3d 3d    */.    if( i==
31850 30 0a 20 20 20 20 20 26 26 20 28 70 54 61 62 4c  0.     && (pTabL
31860 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20  ist->nSrc==1.   
31870 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54 61           || (pTa
31880 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66 67 2e 6a  bList->a[1].fg.j
31890 6f 69 6e 74 79 70 65 26 28 4a 54 5f 4c 45 46 54  ointype&(JT_LEFT
318a0 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 29 20  |JT_CROSS))!=0) 
318b0 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 29   /* (1) */.    )
318c0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6d 70 6c 65  {.      /* Imple
318d0 6d 65 6e 74 20 61 20 63 6f 2d 72 6f 75 74 69 6e  ment a co-routin
318e0 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 74 75  e that will retu
318f0 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  rn a single row 
31900 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20  of the result.  
31910 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e 20 65 61      ** set on ea
31920 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20  ch invocation.. 
31930 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
31940 74 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69  t addrTop = sqli
31950 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
31960 64 72 28 76 29 2b 31 3b 0a 20 20 20 20 20 0a 20  dr(v)+1;.     . 
31970 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52       pItem->regR
31980 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65  eturn = ++pParse
31990 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71  ->nMem;.      sq
319a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
319b0 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74  v, OP_InitCorout
319c0 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  ine, pItem->regR
319d0 65 74 75 72 6e 2c 20 30 2c 20 61 64 64 72 54 6f  eturn, 0, addrTo
319e0 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  p);.      VdbeCo
319f0 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
31a00 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
31a10 6d 65 29 29 3b 0a 20 20 20 20 20 20 70 49 74 65  me));.      pIte
31a20 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d  m->addrFillSub =
31a30 20 61 64 64 72 54 6f 70 3b 0a 20 20 20 20 20 20   addrTop;.      
31a40 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
31a50 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
31a60 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65  _Coroutine, pIte
31a70 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  m->regReturn);. 
31a80 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
31a90 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53  nteger(pItem->iS
31aa0 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61  electId, (u8)pPa
31ab0 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
31ac0 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Id);.      sqlit
31ad0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
31ae0 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20   pSub, &dest);. 
31af0 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62       pItem->pTab
31b00 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70  ->nRowLogEst = p
31b10 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  Sub->nSelectRow;
31b20 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67  .      pItem->fg
31b30 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20  .viaCoroutine = 
31b40 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  1;.      pItem->
31b50 72 65 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74  regResult = dest
31b60 2e 69 53 64 73 74 3b 0a 20 20 20 20 20 20 73 71  .iSdst;.      sq
31b70 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f  lite3VdbeEndCoro
31b80 75 74 69 6e 65 28 76 2c 20 70 49 74 65 6d 2d 3e  utine(v, pItem->
31b90 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
31ba0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
31bb0 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70  pHere(v, addrTop
31bc0 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  -1);.      sqlit
31bd0 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61  e3ClearTempRegCa
31be0 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  che(pParse);.   
31bf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
31c00 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
31c10 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
31c20 20 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72   fill an ephemer
31c30 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 20 20  al table with.  
31c40 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65      ** the conte
31c50 6e 74 20 6f 66 20 74 68 69 73 20 73 75 62 71 75  nt of this subqu
31c60 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64  ery.  pItem->add
31c70 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f  rFillSub will po
31c80 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  int.      ** to 
31c90 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
31ca0 68 65 20 67 65 6e 65 72 61 74 65 64 20 73 75 62  he generated sub
31cb0 72 6f 75 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d  routine.  pItem-
31cc0 3e 72 65 67 52 65 74 75 72 6e 0a 20 20 20 20 20  >regReturn.     
31cd0 20 2a 2a 20 69 73 20 61 20 72 65 67 69 73 74 65   ** is a registe
31ce0 72 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68  r allocated to h
31cf0 6f 6c 64 20 74 68 65 20 73 75 62 72 6f 75 74 69  old the subrouti
31d00 6e 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  ne return addres
31d10 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  s.      */.     
31d20 20 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20 20   int topAddr;.  
31d30 20 20 20 20 69 6e 74 20 6f 6e 63 65 41 64 64 72      int onceAddr
31d40 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
31d50 72 65 74 41 64 64 72 3b 0a 20 20 20 20 20 20 73  retAddr;.      s
31d60 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
31d70 65 6d 20 2a 70 50 72 69 6f 72 3b 0a 0a 20 20 20  em *pPrior;..   
31d80 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
31d90 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30  ->addrFillSub==0
31da0 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d   );.      pItem-
31db0 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70  >regReturn = ++p
31dc0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
31dd0 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73 71 6c     topAddr = sql
31de0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
31df0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
31e00 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
31e10 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  n);.      pItem-
31e20 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 74  >addrFillSub = t
31e30 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20 20 20  opAddr+1;.      
31e40 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  if( pItem->fg.is
31e50 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 29 7b  Correlated==0 ){
31e60 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
31e70 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
31e80 6f 74 20 63 6f 72 72 65 6c 61 74 65 64 20 61 6e  ot correlated an
31e90 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20  d if we are not 
31ea0 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20 20 20  inside of.      
31eb0 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2c 20    ** a trigger, 
31ec0 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65 65  then we only nee
31ed0 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  d to compute the
31ee0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 75   value of the su
31ef0 62 71 75 65 72 79 0a 20 20 20 20 20 20 20 20 2a  bquery.        *
31f00 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 20  * once. */.     
31f10 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20 73 71     onceAddr = sq
31f20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
31f30 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62  v, OP_Once); Vdb
31f40 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
31f50 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
31f60 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69  t((v, "materiali
31f70 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65  ze \"%s\"", pIte
31f80 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
31f90 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
31fa0 20 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43         VdbeNoopC
31fb0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65  omment((v, "mate
31fc0 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c  rialize \"%s\"",
31fd0 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
31fe0 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ame));.      }. 
31ff0 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 69 73       pPrior = is
32000 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28 70 54 61  SelfJoinView(pTa
32010 62 4c 69 73 74 2c 20 70 49 74 65 6d 29 3b 0a 20  bList, pItem);. 
32020 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 20       if( pPrior 
32030 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
32040 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
32050 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 49 74 65  OP_OpenDup, pIte
32060 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50 72 69  m->iCursor, pPri
32070 6f 72 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  or->iCursor);.  
32080 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
32090 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69  Integer(pItem->i
320a0 53 65 6c 65 63 74 49 64 2c 20 70 50 72 69 6f 72  SelectId, pPrior
320b0 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  ->iSelectId);.  
320c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
320d0 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74 21 3d 30  rior->pSelect!=0
320e0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 53 75 62   );.        pSub
320f0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70  ->nSelectRow = p
32100 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74 2d 3e  Prior->pSelect->
32110 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
32120 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
32130 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
32140 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
32150 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65  T_EphemTab, pIte
32160 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
32170 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
32180 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53  nteger(pItem->iS
32190 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61  electId, (u8)pPa
321a0 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
321b0 49 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Id);.        sql
321c0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
321d0 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b  e, pSub, &dest);
321e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
321f0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77  Item->pTab->nRow
32200 4c 6f 67 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e  LogEst = pSub->n
32210 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
32220 20 69 66 28 20 6f 6e 63 65 41 64 64 72 20 29 20   if( onceAddr ) 
32230 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
32240 65 72 65 28 76 2c 20 6f 6e 63 65 41 64 64 72 29  ere(v, onceAddr)
32250 3b 0a 20 20 20 20 20 20 72 65 74 41 64 64 72 20  ;.      retAddr 
32260 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
32270 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
32280 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
32290 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  rn);.      VdbeC
322a0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20  omment((v, "end 
322b0 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  %s", pItem->pTab
322c0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
322d0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
322e0 67 65 50 31 28 76 2c 20 74 6f 70 41 64 64 72 2c  geP1(v, topAddr,
322f0 20 72 65 74 41 64 64 72 29 3b 0a 20 20 20 20 20   retAddr);.     
32300 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d   sqlite3ClearTem
32310 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65  pRegCache(pParse
32320 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
32330 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
32340 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  d ) goto select_
32350 65 6e 64 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  end;.    pParse-
32360 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c 69  >nHeight -= sqli
32370 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
32380 67 68 74 28 70 29 3b 0a 20 20 20 20 70 50 61 72  ght(p);.    pPar
32390 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
323a0 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e   = zSavedAuthCon
323b0 74 65 78 74 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  text;.#endif.  }
323c0 0a 0a 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 65  ..  /* Various e
323d0 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 53  lements of the S
323e0 45 4c 45 43 54 20 63 6f 70 69 65 64 20 69 6e 74  ELECT copied int
323f0 6f 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65  o local variable
32400 73 20 66 6f 72 0a 20 20 2a 2a 20 63 6f 6e 76 65  s for.  ** conve
32410 6e 69 65 6e 63 65 20 2a 2f 0a 20 20 70 45 4c 69  nience */.  pELi
32420 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
32430 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57    pWhere = p->pW
32440 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79  here;.  pGroupBy
32450 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
32460 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70    pHaving = p->p
32470 48 61 76 69 6e 67 3b 0a 20 20 73 44 69 73 74 69  Having;.  sDisti
32480 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20 28 70 2d  nct.isTnct = (p-
32490 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
324a0 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69  istinct)!=0;..#i
324b0 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
324c0 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
324d0 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
324e0 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 53 45   0x400 ){.    SE
324f0 4c 45 43 54 54 52 41 43 45 28 30 78 34 30 30 2c  LECTTRACE(0x400,
32500 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72  pParse,p,("After
32510 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65   all FROM-clause
32520 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22 29 29 3b   analysis:\n"));
32530 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
32540 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
32550 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
32560 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
32570 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d  OUNTOFVIEW_OPTIM
32580 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 4f 70  IZATION.  if( Op
32590 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
325a0 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65  d(db, SQLITE_Que
325b0 72 79 46 6c 61 74 74 65 6e 65 72 7c 53 51 4c 49  ryFlattener|SQLI
325c0 54 45 5f 43 6f 75 6e 74 4f 66 56 69 65 77 29 0a  TE_CountOfView).
325d0 20 20 20 26 26 20 63 6f 75 6e 74 4f 66 56 69 65     && countOfVie
325e0 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28 70 50  wOptimization(pP
325f0 61 72 73 65 2c 20 70 29 0a 20 20 29 7b 0a 20 20  arse, p).  ){.  
32600 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
32610 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65  Failed ) goto se
32620 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70 45  lect_end;.    pE
32630 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
32640 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d  ;.    pTabList =
32650 20 70 2d 3e 70 53 72 63 3b 0a 20 20 7d 0a 23 65   p->pSrc;.  }.#e
32660 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
32670 65 20 71 75 65 72 79 20 69 73 20 44 49 53 54 49  e query is DISTI
32680 4e 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45  NCT with an ORDE
32690 52 20 42 59 20 62 75 74 20 69 73 20 6e 6f 74 20  R BY but is not 
326a0 61 6e 20 61 67 67 72 65 67 61 74 65 2c 20 61 6e  an aggregate, an
326b0 64 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 73  d .  ** if the s
326c0 65 6c 65 63 74 2d 6c 69 73 74 20 69 73 20 74 68  elect-list is th
326d0 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 4f 52  e same as the OR
326e0 44 45 52 20 42 59 20 6c 69 73 74 2c 20 74 68 65  DER BY list, the
326f0 6e 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a  n this query.  *
32700 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69 74 74  * can be rewritt
32710 65 6e 20 61 73 20 61 20 47 52 4f 55 50 20 42 59  en as a GROUP BY
32720 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
32730 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a  , this:.  **.  *
32740 2a 20 20 20 20 20 53 45 4c 45 43 54 20 44 49 53  *     SELECT DIS
32750 54 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e  TINCT xyz FROM .
32760 2e 2e 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a  .. ORDER BY xyz.
32770 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72 61    **.  ** is tra
32780 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 2a  nsformed to:.  *
32790 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
327a0 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47  T xyz FROM ... G
327b0 52 4f 55 50 20 42 59 20 78 79 7a 20 4f 52 44 45  ROUP BY xyz ORDE
327c0 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20  R BY xyz.  **.  
327d0 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f  ** The second fo
327e0 72 6d 20 69 73 20 70 72 65 66 65 72 72 65 64 20  rm is preferred 
327f0 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65  as a single inde
32800 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c 65  x (or temp-table
32810 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20 75  ) may be .  ** u
32820 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68 65  sed for both the
32830 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 44 49   ORDER BY and DI
32840 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69 6e  STINCT processin
32850 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c 79  g. As originally
32860 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74   .  ** written t
32870 68 65 20 71 75 65 72 79 20 6d 75 73 74 20 75 73  he query must us
32880 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20 66  e a temp-table f
32890 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  or at least one 
328a0 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a 20 20  of the ORDER .  
328b0 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  ** BY and DISTIN
328c0 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65 78  CT, and an index
328d0 20 6f 72 20 73 65 70 61 72 61 74 65 20 74 65 6d   or separate tem
328e0 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20  p-table for the 
328f0 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  other..  */.  if
32900 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
32910 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
32920 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
32930 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20 26 26  _Distinct .   &&
32940 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
32950 43 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e 70 4f  Compare(sSort.pO
32960 72 64 65 72 42 79 2c 20 70 45 4c 69 73 74 2c 20  rderBy, pEList, 
32970 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20  -1)==0.  ){.    
32980 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  p->selFlags &= ~
32990 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20  SF_Distinct;.   
329a0 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
329b0 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
329c0 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
329d0 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20   pEList, 0);.   
329e0 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20   /* Notice that 
329f0 65 76 65 6e 20 74 68 6f 75 67 68 74 20 53 46 5f  even thought SF_
32a00 44 69 73 74 69 6e 63 74 20 68 61 73 20 62 65 65  Distinct has bee
32a10 6e 20 63 6c 65 61 72 65 64 20 66 72 6f 6d 20 70  n cleared from p
32a20 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20  ->selFlags,.    
32a30 2a 2a 20 74 68 65 20 73 44 69 73 74 69 6e 63 74  ** the sDistinct
32a40 2e 69 73 54 6e 63 74 20 69 73 20 73 74 69 6c 6c  .isTnct is still
32a50 20 73 65 74 2e 20 20 48 65 6e 63 65 2c 20 69 73   set.  Hence, is
32a60 54 6e 63 74 20 72 65 70 72 65 73 65 6e 74 73 20  Tnct represents 
32a70 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67 69  the.    ** origi
32a80 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f 66 20 74  nal setting of t
32a90 68 65 20 53 46 5f 44 69 73 74 69 6e 63 74 20 66  he SF_Distinct f
32aa0 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20 63 75 72  lag, not the cur
32ab0 72 65 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f 0a  rent setting */.
32ac0 20 20 20 20 61 73 73 65 72 74 28 20 73 44 69 73      assert( sDis
32ad0 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b 0a  tinct.isTnct );.
32ae0 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
32af0 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28  _ENABLED.    if(
32b00 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
32b10 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20  ace & 0x400 ){. 
32b20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45       SELECTTRACE
32b30 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x400,pParse,p,
32b40 28 22 54 72 61 6e 73 66 6f 72 6d 20 44 49 53 54  ("Transform DIST
32b50 49 4e 43 54 20 69 6e 74 6f 20 47 52 4f 55 50 20  INCT into GROUP 
32b60 42 59 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  BY:\n"));.      
32b70 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
32b80 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
32b90 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
32ba0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
32bb0 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
32bc0 6c 61 75 73 65 2c 20 74 68 65 6e 20 63 72 65 61  lause, then crea
32bd0 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  te an ephemeral 
32be0 69 6e 64 65 78 20 74 6f 0a 20 20 2a 2a 20 64 6f  index to.  ** do
32bf0 20 74 68 65 20 73 6f 72 74 69 6e 67 2e 20 20 42   the sorting.  B
32c00 75 74 20 74 68 69 73 20 73 6f 72 74 69 6e 67 20  ut this sorting 
32c10 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20  ephemeral index 
32c20 6d 69 67 68 74 20 65 6e 64 20 75 70 0a 20 20 2a  might end up.  *
32c30 2a 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20 69  * being unused i
32c40 66 20 74 68 65 20 64 61 74 61 20 63 61 6e 20 62  f the data can b
32c50 65 20 65 78 74 72 61 63 74 65 64 20 69 6e 20 70  e extracted in p
32c60 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e  re-sorted order.
32c70 0a 20 20 2a 2a 20 49 66 20 74 68 61 74 20 69 73  .  ** If that is
32c80 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20   the case, then 
32c90 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  the OP_OpenEphem
32ca0 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
32cb0 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 63 68   will be.  ** ch
32cc0 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e  anged to an OP_N
32cd0 6f 6f 70 20 6f 6e 63 65 20 77 65 20 66 69 67 75  oop once we figu
32ce0 72 65 20 6f 75 74 20 74 68 61 74 20 74 68 65 20  re out that the 
32cf0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73  sorting index is
32d00 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65 65 64 65 64  .  ** not needed
32d10 2e 20 20 54 68 65 20 73 53 6f 72 74 2e 61 64 64  .  The sSort.add
32d20 72 53 6f 72 74 49 6e 64 65 78 20 76 61 72 69 61  rSortIndex varia
32d30 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 66  ble is used to f
32d40 61 63 69 6c 69 74 61 74 65 0a 20 20 2a 2a 20 74  acilitate.  ** t
32d50 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f  hat change..  */
32d60 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72  .  if( sSort.pOr
32d70 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79  derBy ){.    Key
32d80 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
32d90 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b      pKeyInfo = k
32da0 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
32db0 73 74 28 70 50 61 72 73 65 2c 20 73 53 6f 72 74  st(pParse, sSort
32dc0 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c 20 70 45  .pOrderBy, 0, pE
32dd0 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
32de0 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73 6f 72    sSort.iECursor
32df0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
32e00 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64 64  +;.    sSort.add
32e10 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20  rSortIndex =.   
32e20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
32e30 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
32e40 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20  phemeral,.      
32e50 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73      sSort.iECurs
32e60 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  or, sSort.pOrder
32e70 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70 45 4c 69  By->nExpr+1+pELi
32e80 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a 20 20  st->nExpr, 0,.  
32e90 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
32ea0 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
32eb0 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a 20 20 7d  NFO.      );.  }
32ec0 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f 72 74 2e  else{.    sSort.
32ed0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20  addrSortIndex = 
32ee0 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  -1;.  }..  /* If
32ef0 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64   the output is d
32f00 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65  estined for a te
32f10 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f  mporary table, o
32f20 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a  pen that table..
32f30 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74    */.  if( pDest
32f40 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ->eDest==SRT_Eph
32f50 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c  emTab ){.    sql
32f60 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
32f70 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
32f80 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  al, pDest->iSDPa
32f90 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rm, pEList->nExp
32fa0 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  r);.  }..  /* Se
32fb0 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20  t the limiter.. 
32fc0 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c   */.  iEnd = sql
32fd0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
32fe0 6c 28 76 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  l(v);.  if( (p->
32ff0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 46 69  selFlags & SF_Fi
33000 78 65 64 4c 69 6d 69 74 29 3d 3d 30 20 29 7b 0a  xedLimit)==0 ){.
33010 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
33020 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20 62  w = 320;  /* 4 b
33030 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a 20  illion rows */. 
33040 20 7d 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69   }.  computeLimi
33050 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
33060 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20 69  e, p, iEnd);.  i
33070 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20  f( p->iLimit==0 
33080 26 26 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  && sSort.addrSor
33090 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20 20  tIndex>=0 ){.   
330a0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
330b0 67 65 4f 70 63 6f 64 65 28 76 2c 20 73 53 6f 72  geOpcode(v, sSor
330c0 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 2c  t.addrSortIndex,
330d0 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 29 3b   OP_SorterOpen);
330e0 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f 72 74 46  .    sSort.sortF
330f0 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46 4c 41 47  lags |= SORTFLAG
33100 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20 20 7d 0a  _UseSorter;.  }.
33110 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e 20 65 70  .  /* Open an ep
33120 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 6f  hemeral index to
33130 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73   use for the dis
33140 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a  tinct set..  */.
33150 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
33160 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20  s & SF_Distinct 
33170 29 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  ){.    sDistinct
33180 2e 74 61 62 54 6e 63 74 20 3d 20 70 50 61 72 73  .tabTnct = pPars
33190 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73  e->nTab++;.    s
331a0 44 69 73 74 69 6e 63 74 2e 61 64 64 72 54 6e 63  Distinct.addrTnc
331b0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
331c0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
331d0 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20  Ephemeral,.     
331e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
331f0 20 20 20 20 20 20 20 20 73 44 69 73 74 69 6e 63          sDistinc
33200 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c 20 30 2c  t.tabTnct, 0, 0,
33210 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
33230 68 61 72 2a 29 6b 65 79 49 6e 66 6f 46 72 6f 6d  har*)keyInfoFrom
33240 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
33250 20 70 2d 3e 70 45 4c 69 73 74 2c 30 2c 30 29 2c   p->pEList,0,0),
33260 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34                P4
33280 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73  _KEYINFO);.    s
33290 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
332a0 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52  P5(v, BTREE_UNOR
332b0 44 45 52 45 44 29 3b 0a 20 20 20 20 73 44 69 73  DERED);.    sDis
332c0 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20  tinct.eTnctType 
332d0 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
332e0 5f 55 4e 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65  _UNORDERED;.  }e
332f0 6c 73 65 7b 0a 20 20 20 20 73 44 69 73 74 69 6e  lse{.    sDistin
33300 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57  ct.eTnctType = W
33310 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f  HERE_DISTINCT_NO
33320 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  OP;.  }..  if( !
33330 69 73 41 67 67 20 26 26 20 70 47 72 6f 75 70 42  isAgg && pGroupB
33340 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  y==0 ){.    /* N
33350 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  o aggregate func
33360 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f  tions and no GRO
33370 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  UP BY clause */.
33380 20 20 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61      u16 wctrlFla
33390 67 73 20 3d 20 28 73 44 69 73 74 69 6e 63 74 2e  gs = (sDistinct.
333a0 69 73 54 6e 63 74 20 3f 20 57 48 45 52 45 5f 57  isTnct ? WHERE_W
333b0 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 3a 20 30  ANT_DISTINCT : 0
333c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
333d0 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 3d 3d  HERE_USE_LIMIT==
333e0 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 20 29 3b  SF_FixedLimit );
333f0 0a 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20  .    wctrlFlags 
33400 7c 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  |= p->selFlags &
33410 20 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 3b 0a   SF_FixedLimit;.
33420 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68  .    /* Begin th
33430 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 2e  e database scan.
33440 20 2a 2f 0a 20 20 20 20 53 45 4c 45 43 54 54 52   */.    SELECTTR
33450 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28  ACE(1,pParse,p,(
33460 22 57 68 65 72 65 42 65 67 69 6e 5c 6e 22 29 29  "WhereBegin\n"))
33470 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73  ;.    pWInfo = s
33480 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
33490 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
334a0 74 2c 20 70 57 68 65 72 65 2c 20 73 53 6f 72 74  t, pWhere, sSort
334b0 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20  .pOrderBy,.     
334c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
334d0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45 4c            p->pEL
334e0 69 73 74 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c  ist, wctrlFlags,
334f0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b   p->nSelectRow);
33500 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d  .    if( pWInfo=
33510 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
33520 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 73 71  _end;.    if( sq
33530 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74  lite3WhereOutput
33540 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29  RowCount(pWInfo)
33550 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   < p->nSelectRow
33560 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65   ){.      p->nSe
33570 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  lectRow = sqlite
33580 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43  3WhereOutputRowC
33590 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20  ount(pWInfo);.  
335a0 20 20 7d 0a 20 20 20 20 69 66 28 20 73 44 69 73    }.    if( sDis
335b0 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20  tinct.isTnct && 
335c0 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69  sqlite3WhereIsDi
335d0 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 20 29  stinct(pWInfo) )
335e0 7b 0a 20 20 20 20 20 20 73 44 69 73 74 69 6e 63  {.      sDistinc
335f0 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 73 71  t.eTnctType = sq
33600 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74  lite3WhereIsDist
33610 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20  inct(pWInfo);.  
33620 20 20 7d 0a 20 20 20 20 69 66 28 20 73 53 6f 72    }.    if( sSor
33630 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  t.pOrderBy ){.  
33640 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74      sSort.nOBSat
33650 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 49   = sqlite3WhereI
33660 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29  sOrdered(pWInfo)
33670 3b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 62 4f  ;.      sSort.bO
33680 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 20  rderedInnerLoop 
33690 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 72  = sqlite3WhereOr
336a0 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 28 70  deredInnerLoop(p
336b0 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66  WInfo);.      if
336c0 28 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d  ( sSort.nOBSat==
336d0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e  sSort.pOrderBy->
336e0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
336f0 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
33700 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
33710 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f   }..    /* If so
33720 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
33730 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
33740 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45  a prior OP_OpenE
33750 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a  phemeral .    **
33760 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64   instruction end
33770 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20  ed up not being 
33780 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61  needed, then cha
33790 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45  nge the OP_OpenE
337a0 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20  phemeral.    ** 
337b0 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e  into an OP_Noop.
337c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
337d0 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
337e0 64 65 78 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e  dex>=0 && sSort.
337f0 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
33800 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
33810 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
33820 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
33830 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  dex);.    }..   
33840 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e   /* Use the stan
33850 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e  dard inner loop.
33860 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
33870 70 2d 3e 70 45 4c 69 73 74 3d 3d 70 45 4c 69 73  p->pEList==pELis
33880 74 20 29 3b 0a 20 20 20 20 73 65 6c 65 63 74 49  t );.    selectI
33890 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
338a0 20 70 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 20   p, -1, &sSort, 
338b0 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73  &sDistinct, pDes
338c0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
338d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
338e0 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c  ereContinueLabel
338f0 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20  (pWInfo),.      
33900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
33910 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c  lite3WhereBreakL
33920 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 0a  abel(pWInfo));..
33930 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64      /* End the d
33940 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f  atabase scan loo
33950 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  p..    */.    sq
33960 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
33970 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Info);.  }else{.
33980 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
33990 20 77 68 65 6e 20 74 68 65 72 65 20 65 78 69 73   when there exis
339a0 74 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  t aggregate func
339b0 74 69 6f 6e 73 20 6f 72 20 61 20 47 52 4f 55 50  tions or a GROUP
339c0 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20 2a   BY clause.    *
339d0 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a 20 20 20  * or both */.   
339e0 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
339f0 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e  ;    /* Name con
33a00 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73  text for process
33a10 69 6e 67 20 61 67 67 72 65 67 61 74 65 20 69 6e  ing aggregate in
33a20 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  formation */.   
33a30 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20   int iAMem;     
33a40 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
33a50 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 73 74  m address for st
33a60 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52  oring current GR
33a70 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e  OUP BY */.    in
33a80 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20  t iBMem;        
33a90 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61    /* First Mem a
33aa0 64 64 72 65 73 73 20 66 6f 72 20 70 72 65 76 69  ddress for previ
33ab0 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a  ous GROUP BY */.
33ac0 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67      int iUseFlag
33ad0 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61  ;       /* Mem a
33ae0 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66  ddress holding f
33af0 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74  lag indicating t
33b00 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20  hat at least.   
33b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20       ** one row 
33b30 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20  of the input to 
33b40 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 20 68  the aggregator h
33b50 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20  as been.        
33b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b70 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  ** processed */.
33b80 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c      int iAbortFl
33b90 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61  ag;     /* Mem a
33ba0 64 64 72 65 73 73 20 77 68 69 63 68 20 63 61 75  ddress which cau
33bb0 73 65 73 20 71 75 65 72 79 20 61 62 6f 72 74 20  ses query abort 
33bc0 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20  if positive */. 
33bd0 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f     int groupBySo
33be0 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63  rt;    /* Rows c
33bf0 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20  ome from source 
33c00 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65  in GROUP BY orde
33c10 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  r */.    int add
33c20 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  rEnd;        /* 
33c30 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73 69 6e  End of processin
33c40 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43  g for this SELEC
33c50 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72  T */.    int sor
33c60 74 50 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20  tPTab = 0;   /* 
33c70 50 73 65 75 64 6f 74 61 62 6c 65 20 75 73 65 64  Pseudotable used
33c80 20 74 6f 20 64 65 63 6f 64 65 20 73 6f 72 74 69   to decode sorti
33c90 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  ng results */.  
33ca0 20 20 69 6e 74 20 73 6f 72 74 4f 75 74 20 3d 20    int sortOut = 
33cb0 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20  0;    /* Output 
33cc0 72 65 67 69 73 74 65 72 20 66 72 6f 6d 20 74 68  register from th
33cd0 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20  e sorter */.    
33ce0 69 6e 74 20 6f 72 64 65 72 42 79 47 72 70 20 3d  int orderByGrp =
33cf0 20 30 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 74   0; /* True if t
33d00 68 65 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20  he GROUP BY and 
33d10 4f 52 44 45 52 20 42 59 20 61 72 65 20 74 68 65  ORDER BY are the
33d20 20 73 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a   same */..    /*
33d30 20 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20   Remove any and 
33d40 61 6c 6c 20 61 6c 69 61 73 65 73 20 62 65 74 77  all aliases betw
33d50 65 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73  een the result s
33d60 65 74 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  et and the.    *
33d70 2a 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  * GROUP BY claus
33d80 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
33d90 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
33da0 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20      int k;      
33db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33dc0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
33dd0 72 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63  r */.      struc
33de0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
33df0 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20  *pItem;  /* For 
33e00 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 70  looping over exp
33e10 72 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73  ression in a lis
33e20 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28  t */..      for(
33e30 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  k=p->pEList->nEx
33e40 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c  pr, pItem=p->pEL
33e50 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d  ist->a; k>0; k--
33e60 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
33e70 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69      pItem->u.x.i
33e80 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20  Alias = 0;.     
33e90 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70   }.      for(k=p
33ea0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20  GroupBy->nExpr, 
33eb0 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e  pItem=pGroupBy->
33ec0 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74  a; k>0; k--, pIt
33ed0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
33ee0 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73  Item->u.x.iAlias
33ef0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
33f00 20 20 20 20 61 73 73 65 72 74 28 20 36 36 3d 3d      assert( 66==
33f10 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
33f20 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  0) );.      if( 
33f30 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 36 36  p->nSelectRow>66
33f40 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
33f50 20 3d 20 36 36 3b 0a 20 20 20 20 7d 65 6c 73 65   = 66;.    }else
33f60 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
33f70 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
33f80 28 31 29 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e  (1) );.      p->
33f90 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a  nSelectRow = 0;.
33fa0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
33fb0 20 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61   there is both a
33fc0 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 61 6e   GROUP BY and an
33fd0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
33fe0 20 61 6e 64 20 74 68 65 79 20 61 72 65 0a 20 20   and they are.  
33ff0 20 20 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20    ** identical, 
34000 74 68 65 6e 20 69 74 20 6d 61 79 20 62 65 20 70  then it may be p
34010 6f 73 73 69 62 6c 65 20 74 6f 20 64 69 73 61 62  ossible to disab
34020 6c 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  le the ORDER BY 
34030 63 6c 61 75 73 65 20 0a 20 20 20 20 2a 2a 20 6f  clause .    ** o
34040 6e 20 74 68 65 20 67 72 6f 75 6e 64 73 20 74 68  n the grounds th
34050 61 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  at the GROUP BY 
34060 77 69 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d 65  will cause eleme
34070 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20  nts to come out 
34080 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 63  .    ** in the c
34090 6f 72 72 65 63 74 20 6f 72 64 65 72 2e 20 49 74  orrect order. It
340a0 20 61 6c 73 6f 20 6d 61 79 20 6e 6f 74 20 2d 20   also may not - 
340b0 74 68 65 20 47 52 4f 55 50 20 42 59 20 6d 69 67  the GROUP BY mig
340c0 68 74 20 75 73 65 20 61 0a 20 20 20 20 2a 2a 20  ht use a.    ** 
340d0 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 74  database index t
340e0 68 61 74 20 63 61 75 73 65 73 20 72 6f 77 73 20  hat causes rows 
340f0 74 6f 20 62 65 20 67 72 6f 75 70 65 64 20 74 6f  to be grouped to
34100 67 65 74 68 65 72 20 61 73 20 72 65 71 75 69 72  gether as requir
34110 65 64 0a 20 20 20 20 2a 2a 20 62 75 74 20 6e 6f  ed.    ** but no
34120 74 20 61 63 74 75 61 6c 6c 79 20 73 6f 72 74 65  t actually sorte
34130 64 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 72  d. Either way, r
34140 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
34150 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f  hat the.    ** O
34160 52 44 45 52 20 42 59 20 61 6e 64 20 47 52 4f 55  RDER BY and GROU
34170 50 20 42 59 20 63 6c 61 75 73 65 73 20 61 72 65  P BY clauses are
34180 20 74 68 65 20 73 61 6d 65 20 62 79 20 73 65 74   the same by set
34190 74 69 6e 67 20 74 68 65 20 6f 72 64 65 72 42 79  ting the orderBy
341a0 47 72 70 0a 20 20 20 20 2a 2a 20 76 61 72 69 61  Grp.    ** varia
341b0 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ble.  */.    if(
341c0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
341d0 43 6f 6d 70 61 72 65 28 70 47 72 6f 75 70 42 79  Compare(pGroupBy
341e0 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  , sSort.pOrderBy
341f0 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , -1)==0 ){.    
34200 20 20 6f 72 64 65 72 42 79 47 72 70 20 3d 20 31    orderByGrp = 1
34210 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a  ;.    }. .    /*
34220 20 43 72 65 61 74 65 20 61 20 6c 61 62 65 6c 20   Create a label 
34230 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20  to jump to when 
34240 77 65 20 77 61 6e 74 20 74 6f 20 61 62 6f 72 74  we want to abort
34250 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20   the query */.  
34260 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69    addrEnd = sqli
34270 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
34280 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e  (v);..    /* Con
34290 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e  vert TK_COLUMN n
342a0 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47  odes into TK_AGG
342b0 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65  _COLUMN and make
342c0 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20   entries in.    
342d0 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20  ** sAggInfo for 
342e0 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  all TK_AGG_FUNCT
342f0 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70  ION nodes in exp
34300 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a  ressions of the.
34310 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74      ** SELECT st
34320 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a  atement..    */.
34330 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c      memset(&sNC,
34340 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
34350 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65  ;.    sNC.pParse
34360 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73   = pParse;.    s
34370 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54  NC.pSrcList = pT
34380 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e  abList;.    sNC.
34390 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67 67  pAggInfo = &sAgg
343a0 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e  Info;.    sAggIn
343b0 66 6f 2e 6d 6e 52 65 67 20 3d 20 70 50 61 72 73  fo.mnReg = pPars
343c0 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 73  e->nMem+1;.    s
343d0 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67  AggInfo.nSorting
343e0 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42  Column = pGroupB
343f0 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  y ? pGroupBy->nE
34400 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 73 41 67  xpr : 0;.    sAg
34410 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d  gInfo.pGroupBy =
34420 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73   pGroupBy;.    s
34430 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
34440 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70  eAggList(&sNC, p
34450 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
34460 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
34470 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 53 6f 72  gList(&sNC, sSor
34480 74 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  t.pOrderBy);.   
34490 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a   if( pHaving ){.
344a0 20 20 20 20 20 20 69 66 28 20 70 47 72 6f 75 70        if( pGroup
344b0 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  By ){.        as
344c0 73 65 72 74 28 20 70 57 68 65 72 65 3d 3d 70 2d  sert( pWhere==p-
344d0 3e 70 57 68 65 72 65 20 29 3b 0a 20 20 20 20 20  >pWhere );.     
344e0 20 20 20 61 73 73 65 72 74 28 20 70 48 61 76 69     assert( pHavi
344f0 6e 67 3d 3d 70 2d 3e 70 48 61 76 69 6e 67 20 29  ng==p->pHaving )
34500 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
34510 28 20 70 47 72 6f 75 70 42 79 3d 3d 70 2d 3e 70  ( pGroupBy==p->p
34520 47 72 6f 75 70 42 79 20 29 3b 0a 20 20 20 20 20  GroupBy );.     
34530 20 20 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65     havingToWhere
34540 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
34550 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 2d       pWhere = p-
34560 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 7d  >pWhere;.      }
34570 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
34580 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
34590 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e  tes(&sNC, pHavin
345a0 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41  g);.    }.    sA
345b0 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61  ggInfo.nAccumula
345c0 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e  tor = sAggInfo.n
345d0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20  Column;.    if( 
345e0 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 26  p->pGroupBy==0 &
345f0 26 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20  & p->pHaving==0 
34600 26 26 20 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e  && sAggInfo.nFun
34610 63 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 69  c==1 ){.      mi
34620 6e 4d 61 78 46 6c 61 67 20 3d 20 6d 69 6e 4d 61  nMaxFlag = minMa
34630 78 51 75 65 72 79 28 64 62 2c 20 73 41 67 67 49  xQuery(db, sAggI
34640 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 70 45 78  nfo.aFunc[0].pEx
34650 70 72 2c 20 26 70 4d 69 6e 4d 61 78 4f 72 64 65  pr, &pMinMaxOrde
34660 72 42 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rBy);.    }else{
34670 0a 20 20 20 20 20 20 6d 69 6e 4d 61 78 46 6c 61  .      minMaxFla
34680 67 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42  g = WHERE_ORDERB
34690 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 7d 0a  Y_NORMAL;.    }.
346a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
346b0 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69  AggInfo.nFunc; i
346c0 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
346d0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
346e0 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61 46 75  rty(sAggInfo.aFu
346f0 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f  nc[i].pExpr, EP_
34700 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
34710 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20      sNC.ncFlags 
34720 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b  |= NC_InAggFunc;
34730 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
34740 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
34750 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e  (&sNC, sAggInfo.
34760 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e  aFunc[i].pExpr->
34770 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  x.pList);.      
34780 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e  sNC.ncFlags &= ~
34790 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20  NC_InAggFunc;.  
347a0 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f    }.    sAggInfo
347b0 2e 6d 78 52 65 67 20 3d 20 70 50 61 72 73 65 2d  .mxReg = pParse-
347c0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20 64  >nMem;.    if( d
347d0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
347e0 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
347f0 64 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  d;.#if SELECTTRA
34800 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69  CE_ENABLED.    i
34810 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
34820 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b  Trace & 0x400 ){
34830 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  .      int ii;. 
34840 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45       SELECTTRACE
34850 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x400,pParse,p,
34860 28 22 41 66 74 65 72 20 61 67 67 72 65 67 61 74  ("After aggregat
34870 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22 29 29  e analysis:\n"))
34880 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
34890 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
348a0 20 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f   p, 0);.      fo
348b0 72 28 69 69 3d 30 3b 20 69 69 3c 73 41 67 67 49  r(ii=0; ii<sAggI
348c0 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 69 2b  nfo.nColumn; ii+
348d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
348e0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
348f0 61 67 67 2d 63 6f 6c 75 6d 6e 5b 25 64 5d 20 69  agg-column[%d] i
34900 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  Mem=%d\n",.     
34910 20 20 20 20 20 20 20 69 69 2c 20 73 41 67 67 49         ii, sAggI
34920 6e 66 6f 2e 61 43 6f 6c 5b 69 69 5d 2e 69 4d 65  nfo.aCol[ii].iMe
34930 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
34940 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28  te3TreeViewExpr(
34950 30 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  0, sAggInfo.aCol
34960 5b 69 69 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a  [ii].pExpr, 0);.
34970 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
34980 72 28 69 69 3d 30 3b 20 69 69 3c 73 41 67 67 49  r(ii=0; ii<sAggI
34990 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 69 2b 2b 29  nfo.nFunc; ii++)
349a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
349b0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 61 67  3DebugPrintf("ag
349c0 67 2d 66 75 6e 63 5b 25 64 5d 3a 20 69 4d 65 6d  g-func[%d]: iMem
349d0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
349e0 20 20 20 20 69 69 2c 20 73 41 67 67 49 6e 66 6f      ii, sAggInfo
349f0 2e 61 46 75 6e 63 5b 69 69 5d 2e 69 4d 65 6d 29  .aFunc[ii].iMem)
34a00 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
34a10 33 54 72 65 65 56 69 65 77 45 78 70 72 28 30 2c  3TreeViewExpr(0,
34a20 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b   sAggInfo.aFunc[
34a30 69 69 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20  ii].pExpr, 0);. 
34a40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
34a50 64 69 66 0a 0a 0a 20 20 20 20 2f 2a 20 50 72 6f  dif...    /* Pro
34a60 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72  cessing for aggr
34a70 65 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55  egates with GROU
34a80 50 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66  P BY is very dif
34a90 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a  ferent and.    *
34aa0 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70  * much more comp
34ab0 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65 67 61  lex than aggrega
34ac0 74 65 73 20 77 69 74 68 6f 75 74 20 61 20 47 52  tes without a GR
34ad0 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20  OUP BY..    */. 
34ae0 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
34af0 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  ){.      KeyInfo
34b00 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20   *pKeyInfo;  /* 
34b10 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  Keying informati
34b20 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70  on for the group
34b30 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   by clause */.  
34b40 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20      int addr1;  
34b50 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d          /* A-vs-
34b60 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75  B comparision ju
34b70 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  mp */.      int 
34b80 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20  addrOutputRow;  
34b90 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62 72  /* Start of subr
34ba0 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
34bb0 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77  uts a result row
34bc0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
34bd0 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a  gOutputRow;   /*
34be0 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   Return address 
34bf0 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74  register for out
34c00 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  put subroutine *
34c10 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
34c20 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53  SetAbort;   /* S
34c30 65 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61  et the abort fla
34c40 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  g and return */.
34c50 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f        int addrTo
34c60 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70  pOfLoop;  /* Top
34c70 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f   of the input lo
34c80 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  op */.      int 
34c90 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20  addrSortingIdx; 
34ca0 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70  /* The OP_OpenEp
34cb0 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20  hemeral for the 
34cc0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f  sorting index */
34cd0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 52  .      int addrR
34ce0 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75  eset;      /* Su
34cf0 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73  broutine for res
34d00 65 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  etting the accum
34d10 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  ulator */.      
34d20 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20 20  int regReset;   
34d30 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64      /* Return ad
34d40 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
34d50 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f 75 74  or reset subrout
34d60 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ine */..      /*
34d70 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 47   If there is a G
34d80 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 77  ROUP BY clause w
34d90 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73  e might need a s
34da0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a  orting index to.
34db0 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65        ** impleme
34dc0 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65  nt it.  Allocate
34dd0 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e   that sorting in
34de0 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20  dex now.  If it 
34df0 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20  turns out.      
34e00 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
34e10 74 20 6e 65 65 64 20 69 74 20 61 66 74 65 72 20  t need it after 
34e20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74  all, the OP_Sort
34e30 65 72 4f 70 65 6e 20 69 6e 73 74 72 75 63 74 69  erOpen instructi
34e40 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  on.      ** will
34e50 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
34e60 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20  to a Noop.  .   
34e70 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67     */.      sAgg
34e80 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20  Info.sortingIdx 
34e90 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
34ea0 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
34eb0 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
34ec0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
34ed0 47 72 6f 75 70 42 79 2c 20 30 2c 20 73 41 67 67  GroupBy, 0, sAgg
34ee0 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Info.nColumn);. 
34ef0 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67       addrSorting
34f00 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Idx = sqlite3Vdb
34f10 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f  eAddOp4(v, OP_So
34f20 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20  rterOpen, .     
34f30 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f       sAggInfo.so
34f40 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49 6e  rtingIdx, sAggIn
34f50 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
34f60 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30 2c  n, .          0,
34f70 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
34f80 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a  , P4_KEYINFO);..
34f90 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
34fa0 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  ize memory locat
34fb0 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f  ions used by GRO
34fc0 55 50 20 42 59 20 61 67 67 72 65 67 61 74 65 20  UP BY aggregate 
34fd0 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20  processing.     
34fe0 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c   */.      iUseFl
34ff0 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ag = ++pParse->n
35000 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72  Mem;.      iAbor
35010 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65  tFlag = ++pParse
35020 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65  ->nMem;.      re
35030 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70  gOutputRow = ++p
35040 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
35050 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
35060 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
35070 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
35080 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b 70    regReset = ++p
35090 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
350a0 20 20 20 61 64 64 72 52 65 73 65 74 20 3d 20 73     addrReset = s
350b0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
350c0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 41  bel(v);.      iA
350d0 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
350e0 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50  em + 1;.      pP
350f0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47  arse->nMem += pG
35100 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
35110 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61       iBMem = pPa
35120 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
35130 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
35140 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  m += pGroupBy->n
35150 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
35160 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
35170 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
35180 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20  iAbortFlag);.   
35190 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
351a0 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20  v, "clear abort 
351b0 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
351c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
351d0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
351e0 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20  0, iUseFlag);.  
351f0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
35200 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 61 63  (v, "indicate ac
35210 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22  cumulator empty"
35220 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
35230 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
35240 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d  P_Null, 0, iAMem
35250 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79  , iAMem+pGroupBy
35260 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20  ->nExpr-1);..   
35270 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f     /* Begin a lo
35280 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74  op that will ext
35290 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20  ract all source 
352a0 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59  rows in GROUP BY
352b0 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a   order..      **
352c0 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f   This might invo
352d0 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74 65  lve two separate
352e0 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f   loops with an O
352f0 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65  P_Sort in betwee
35300 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69  n, or.      ** i
35310 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e  t might be a sin
35320 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73  gle loop that us
35330 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65  es an index to e
35340 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69  xtract informati
35350 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  on.      ** in t
35360 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20 74  he right order t
35370 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20  o begin with..  
35380 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
35390 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
353a0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52  , OP_Gosub, regR
353b0 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29  eset, addrReset)
353c0 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  ;.      SELECTTR
353d0 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28  ACE(1,pParse,p,(
353e0 22 57 68 65 72 65 42 65 67 69 6e 5c 6e 22 29 29  "WhereBegin\n"))
353f0 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d  ;.      pWInfo =
35400 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
35410 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
35420 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 47 72  ist, pWhere, pGr
35430 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20 20 20 20  oupBy, 0,.      
35440 20 20 20 20 57 48 45 52 45 5f 47 52 4f 55 50 42      WHERE_GROUPB
35450 59 20 7c 20 28 6f 72 64 65 72 42 79 47 72 70 20  Y | (orderByGrp 
35460 3f 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52  ? WHERE_SORTBYGR
35470 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20 20 20 20  OUP : 0), 0.    
35480 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70    );.      if( p
35490 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
354a0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
354b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
354c0 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
354d0 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79 2d 3e 6e  fo)==pGroupBy->n
354e0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
354f0 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72  /* The optimizer
35500 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69   is able to deli
35510 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75  ver rows in grou
35520 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20  p by order so.  
35530 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e        ** we do n
35540 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e  ot have to sort.
35550 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68    The OP_OpenEph
35560 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c  emeral table wil
35570 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
35580 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20  cancelled later 
35590 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c  because we still
355a0 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65   need to use the
355b0 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20   pKeyInfo.      
355c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f    */.        gro
355d0 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20  upBySort = 0;.  
355e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
355f0 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63     /* Rows are c
35600 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64  oming out in und
35610 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e  etermined order.
35620 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73    We have to pus
35630 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63  h.        ** eac
35640 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72  h row into a sor
35650 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d  ting index, term
35660 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20  inate the first 
35670 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a  loop,.        **
35680 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20   then loop over 
35690 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
356a0 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  x in order to ge
356b0 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20  t the output.   
356c0 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65       ** in sorte
356d0 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20  d order.        
356e0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  */.        int r
356f0 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20  egBase;.        
35700 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20  int regRecord;. 
35710 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b         int nCol;
35720 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72  .        int nGr
35730 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20  oupBy;..        
35740 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
35750 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
35760 20 20 20 20 20 20 28 73 44 69 73 74 69 6e 63 74        (sDistinct
35770 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d 3e 73  .isTnct && (p->s
35780 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73 74 69  elFlags&SF_Disti
35790 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20  nct)==0) ?.     
357a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
357b0 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47 52 4f  DISTINCT" : "GRO
357c0 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20 20 20  UP BY");..      
357d0 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20    groupBySort = 
357e0 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75  1;.        nGrou
357f0 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e  pBy = pGroupBy->
35800 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e  nExpr;.        n
35810 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a  Col = nGroupBy;.
35820 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f          j = nGro
35830 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f  upBy;.        fo
35840 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
35850 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  o.nColumn; i++){
35860 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
35870 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e  AggInfo.aCol[i].
35880 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a  iSorterColumn>=j
35890 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
358a0 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nCol++;.        
358b0 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
358c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
358d0 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d         regBase =
358e0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
358f0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f  ange(pParse, nCo
35900 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
35910 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
35920 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  r(pParse);.     
35930 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
35940 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
35950 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67  e, pGroupBy, reg
35960 42 61 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Base, 0, 0);.   
35970 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42       j = nGroupB
35980 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  y;.        for(i
35990 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
359a0 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
359b0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
359c0 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
359d0 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f   = &sAggInfo.aCo
359e0 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  l[i];.          
359f0 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65  if( pCol->iSorte
35a00 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20  rColumn>=j ){.  
35a10 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31            int r1
35a20 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a   = j + regBase;.
35a30 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
35a40 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
35a50 6c 75 6d 6e 54 6f 52 65 67 28 70 50 61 72 73 65  lumnToReg(pParse
35a60 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
35a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a80 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43    pCol->pTab, pC
35a90 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f  ol->iColumn, pCo
35aa0 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 29 3b 0a  l->iTable, r1);.
35ab0 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b              j++;
35ac0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
35ad0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
35ae0 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
35af0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
35b00 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
35b10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
35b20 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
35b30 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c  , regBase, nCol,
35b40 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
35b50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
35b60 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
35b70 74 65 72 49 6e 73 65 72 74 2c 20 73 41 67 67 49  terInsert, sAggI
35b80 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
35b90 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20  regRecord);.    
35ba0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
35bb0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
35bc0 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
35bd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
35be0 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
35bf0 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e  arse, regBase, n
35c00 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
35c10 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
35c20 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73  Info);.        s
35c30 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
35c40 64 78 50 54 61 62 20 3d 20 73 6f 72 74 50 54 61  dxPTab = sortPTa
35c50 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
35c60 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f 72 74  ++;.        sort
35c70 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Out = sqlite3Get
35c80 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
35c90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
35ca0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
35cb0 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73 6f 72  _OpenPseudo, sor
35cc0 74 50 54 61 62 2c 20 73 6f 72 74 4f 75 74 2c 20  tPTab, sortOut, 
35cd0 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
35ce0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
35cf0 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72  (v, OP_SorterSor
35d00 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  t, sAggInfo.sort
35d10 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e 64 29  ingIdx, addrEnd)
35d20 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
35d30 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f 55 50  mment((v, "GROUP
35d40 20 42 59 20 73 6f 72 74 22 29 29 3b 20 56 64 62   BY sort")); Vdb
35d50 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
35d60 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 75        sAggInfo.u
35d70 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 31  seSortingIdx = 1
35d80 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
35d90 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
35da0 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
35db0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  }..      /* If t
35dc0 68 65 20 69 6e 64 65 78 20 6f 72 20 74 65 6d 70  he index or temp
35dd0 6f 72 61 72 79 20 74 61 62 6c 65 20 75 73 65 64  orary table used
35de0 20 62 79 20 74 68 65 20 47 52 4f 55 50 20 42 59   by the GROUP BY
35df0 20 73 6f 72 74 0a 20 20 20 20 20 20 2a 2a 20 77   sort.      ** w
35e00 69 6c 6c 20 6e 61 74 75 72 61 6c 6c 79 20 64 65  ill naturally de
35e10 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 74 68  liver rows in th
35e20 65 20 6f 72 64 65 72 20 72 65 71 75 69 72 65 64  e order required
35e30 20 62 79 20 74 68 65 20 4f 52 44 45 52 20 42 59   by the ORDER BY
35e40 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65  .      ** clause
35e50 2c 20 63 61 6e 63 65 6c 20 74 68 65 20 65 70 68  , cancel the eph
35e60 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6f 70 65  emeral table ope
35e70 6e 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 2e  n coded earlier.
35e80 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
35e90 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  ** This is an op
35ea0 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65  timization - the
35eb0 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20   correct answer 
35ec0 73 68 6f 75 6c 64 20 72 65 73 75 6c 74 20 72 65  should result re
35ed0 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 20  gardless..      
35ee0 2a 2a 20 55 73 65 20 74 68 65 20 53 51 4c 49 54  ** Use the SQLIT
35ef0 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 20 66  E_GroupByOrder f
35f00 6c 61 67 20 77 69 74 68 20 53 51 4c 49 54 45 5f  lag with SQLITE_
35f10 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
35f20 45 52 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  ER to .      ** 
35f30 64 69 73 61 62 6c 65 20 74 68 69 73 20 6f 70 74  disable this opt
35f40 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65  imization for te
35f50 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20  sting purposes. 
35f60 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 72   */.      if( or
35f70 64 65 72 42 79 47 72 70 20 26 26 20 4f 70 74 69  derByGrp && Opti
35f80 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
35f90 64 62 2c 20 53 51 4c 49 54 45 5f 47 72 6f 75 70  db, SQLITE_Group
35fa0 42 79 4f 72 64 65 72 29 20 0a 20 20 20 20 20 20  ByOrder) .      
35fb0 20 26 26 20 28 67 72 6f 75 70 42 79 53 6f 72 74   && (groupBySort
35fc0 20 7c 7c 20 73 71 6c 69 74 65 33 57 68 65 72 65   || sqlite3Where
35fd0 49 73 53 6f 72 74 65 64 28 70 57 49 6e 66 6f 29  IsSorted(pWInfo)
35fe0 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
35ff0 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42     sSort.pOrderB
36000 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  y = 0;.        s
36010 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
36020 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e  ToNoop(v, sSort.
36030 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a  addrSortIndex);.
36040 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
36050 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 63  * Evaluate the c
36060 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20  urrent GROUP BY 
36070 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65 20  terms and store 
36080 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e  in b0, b1, b2...
36090 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69 73  .      ** (b0 is
360a0 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
360b0 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20   iBMem+0, b1 is 
360c0 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20  iBMem+1, and so 
360d0 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a 20  forth).      ** 
360e0 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68 65  Then compare the
360f0 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
36100 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74 20  Y terms against 
36110 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72  the GROUP BY ter
36120 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d  ms.      ** from
36130 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f   the previous ro
36140 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  w currently stor
36150 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61 32  ed in a0, a1, a2
36160 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ....      */.   
36170 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70     addrTopOfLoop
36180 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
36190 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
361a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
361b0 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
361c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f  );.      if( gro
361d0 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20  upBySort ){.    
361e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
361f0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp3(v, OP_Sort
36200 65 72 44 61 74 61 2c 20 73 41 67 67 49 6e 66 6f  erData, sAggInfo
36210 2e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20  .sortingIdx,.   
36220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36230 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74 2c 20         sortOut, 
36240 73 6f 72 74 50 54 61 62 29 3b 0a 20 20 20 20 20  sortPTab);.     
36250 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30   }.      for(j=0
36260 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; j<pGroupBy->nE
36270 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
36280 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
36290 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rt ){.          
362a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
362b0 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
362c0 73 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69 42 4d  sortPTab, j, iBM
362d0 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d  em+j);.        }
362e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
362f0 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d  sAggInfo.directM
36300 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ode = 1;.       
36310 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
36320 64 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  de(pParse, pGrou
36330 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c  pBy->a[j].pExpr,
36340 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20   iBMem+j);.     
36350 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
36360 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
36370 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp4(v, OP_Compa
36380 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d  re, iAMem, iBMem
36390 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  , pGroupBy->nExp
363a0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
363b0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
363c0 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e  ar*)sqlite3KeyIn
363d0 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c  foRef(pKeyInfo),
363e0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
363f0 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
36400 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
36410 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
36420 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
36430 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 31  , OP_Jump, addr1
36440 2b 31 2c 20 30 2c 20 61 64 64 72 31 2b 31 29 3b  +1, 0, addr1+1);
36450 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
36460 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
36470 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 72  rate code that r
36480 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68 65  uns whenever the
36490 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65   GROUP BY change
364a0 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e  s..      ** Chan
364b0 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50  ges in the GROUP
364c0 20 42 59 20 61 72 65 20 64 65 74 65 63 74 65 64   BY are detected
364d0 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
364e0 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62   code.      ** b
364f0 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20  lock.  If there 
36500 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c  were no changes,
36510 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73   this block is s
36520 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a  kipped..      **
36530 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63  .      ** This c
36540 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72 72 65  ode copies curre
36550 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d  nt group by term
36560 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e  s in b0,b1,b2,..
36570 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20  ..      ** over 
36580 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74  to a0,a1,a2.  It
36590 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20   then calls the 
365a0 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
365b0 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72  e.      ** and r
365c0 65 73 65 74 73 20 74 68 65 20 61 67 67 72 65 67  esets the aggreg
365d0 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
365e0 72 65 67 69 73 74 65 72 73 20 69 6e 20 70 72 65  registers in pre
365f0 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  paration.      *
36600 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47  * for the next G
36610 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20  ROUP BY batch.. 
36620 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
36630 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
36640 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c  e(pParse, iBMem,
36650 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79   iAMem, pGroupBy
36660 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
36670 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
36680 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
36690 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64  egOutputRow, add
366a0 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
366b0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
366c0 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72  v, "output one r
366d0 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ow"));.      sql
366e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
366f0 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f  , OP_IfPos, iAbo
36700 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29  rtFlag, addrEnd)
36710 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
36720 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
36730 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20  ment((v, "check 
36740 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
36750 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
36760 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
36770 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64  ub, regReset, ad
36780 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
36790 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
367a0 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74  "reset accumulat
367b0 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
367c0 20 55 70 64 61 74 65 20 74 68 65 20 61 67 67 72   Update the aggr
367d0 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
367e0 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  rs based on the 
367f0 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20  content of.     
36800 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
36810 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  row.      */.   
36820 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
36830 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
36840 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65 41 63  ;.      updateAc
36850 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
36860 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
36870 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
36880 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
36890 67 65 72 2c 20 31 2c 20 69 55 73 65 46 6c 61 67  ger, 1, iUseFlag
368a0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
368b0 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61  ment((v, "indica
368c0 74 65 20 64 61 74 61 20 69 6e 20 61 63 63 75 6d  te data in accum
368d0 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20  ulator"));..    
368e0 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20    /* End of the 
368f0 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20  loop.      */.  
36900 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53      if( groupByS
36910 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ort ){.        s
36920 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
36930 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78  (v, OP_SorterNex
36940 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  t, sAggInfo.sort
36950 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f 70 4f  ingIdx, addrTopO
36960 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  fLoop);.        
36970 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
36980 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
36990 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
369a0 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
369b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
369c0 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
369d0 2c 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78  , addrSortingIdx
369e0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
369f0 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
36a00 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73  final row of res
36a10 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ult.      */.   
36a20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
36a30 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
36a40 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20  , regOutputRow, 
36a50 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
36a60 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
36a70 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69  t((v, "output fi
36a80 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20  nal row"));..   
36a90 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20     /* Jump over 
36aa0 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73 0a  the subroutines.
36ab0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
36ac0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
36ad0 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20  , addrEnd);..   
36ae0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
36af0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
36b00 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67 6c   outputs a singl
36b10 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73  e row of the res
36b20 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74  ult.      ** set
36b30 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75 74 69  .  This subrouti
36b40 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61  ne first looks a
36b50 74 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e 20  t the iUseFlag. 
36b60 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20 20   If iUseFlag.   
36b70 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74 68     ** is less th
36b80 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
36b90 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75 74  ero, the subrout
36ba0 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ine is a no-op. 
36bb0 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   If.      ** the
36bc0 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c   processing call
36bd0 73 20 66 6f 72 20 74 68 65 20 71 75 65 72 79 20  s for the query 
36be0 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20 73  to abort, this s
36bf0 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20  ubroutine.      
36c00 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68  ** increments th
36c10 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d  e iAbortFlag mem
36c20 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66  ory location bef
36c30 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ore returning in
36c40 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20  .      ** order 
36c50 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63 61  to signal the ca
36c60 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20  ller to abort.. 
36c70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
36c80 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71 6c  drSetAbort = sql
36c90 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
36ca0 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
36cb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
36cc0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
36cd0 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20  , iAbortFlag);. 
36ce0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
36cf0 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72 74 20  ((v, "set abort 
36d00 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
36d10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
36d20 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
36d30 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
36d40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
36d50 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
36d60 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
36d70 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52       addrOutputR
36d80 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ow = sqlite3Vdbe
36d90 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
36da0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
36db0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
36dc0 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61  Pos, iUseFlag, a
36dd0 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b  ddrOutputRow+2);
36de0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
36df0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64  age(v);.      Vd
36e00 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47  beComment((v, "G
36e10 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65  roupby result ge
36e20 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70 6f  nerator entry po
36e30 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73 71  int"));.      sq
36e40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
36e50 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
36e60 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  gOutputRow);.   
36e70 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75     finalizeAggFu
36e80 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20  nctions(pParse, 
36e90 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
36ea0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
36eb0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
36ec0 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75 74  ving, addrOutput
36ed0 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55  Row+1, SQLITE_JU
36ee0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
36ef0 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
36f00 28 70 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20  (pParse, p, -1, 
36f10 26 73 53 6f 72 74 2c 0a 20 20 20 20 20 20 20 20  &sSort,.        
36f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73                &s
36f30 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c  Distinct, pDest,
36f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
36f50 20 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75         addrOutpu
36f60 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41  tRow+1, addrSetA
36f70 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  bort);.      sql
36f80 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
36f90 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
36fa0 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
36fb0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
36fc0 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72  , "end groupby r
36fd0 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22  esult generator"
36fe0 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  ));..      /* Ge
36ff0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
37000 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ine that will re
37010 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79  set the group-by
37020 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20   accumulator.   
37030 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
37040 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
37050 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73 65 74  bel(v, addrReset
37060 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41 63  );.      resetAc
37070 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
37080 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
37090 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
370a0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
370b0 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a 20  rn, regReset);. 
370c0 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e      .    } /* en
370d0 64 69 66 20 70 47 72 6f 75 70 42 79 2e 20 20 42  dif pGroupBy.  B
370e0 65 67 69 6e 20 61 67 67 72 65 67 61 74 65 20 71  egin aggregate q
370f0 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 20 47  ueries without G
37100 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20  ROUP BY: */.    
37110 65 6c 73 65 20 7b 0a 23 69 66 6e 64 65 66 20 53  else {.#ifndef S
37120 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45  QLITE_OMIT_BTREE
37130 43 4f 55 4e 54 0a 20 20 20 20 20 20 54 61 62 6c  COUNT.      Tabl
37140 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69  e *pTab;.      i
37150 66 28 20 28 70 54 61 62 20 3d 20 69 73 53 69 6d  f( (pTab = isSim
37160 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73 41 67  pleCount(p, &sAg
37170 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20  gInfo))!=0 ){.  
37180 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73 53 69        /* If isSi
37190 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74 75  mpleCount() retu
371a0 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
371b0 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
371c0 72 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20  re, then.       
371d0 20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74   ** the SQL stat
371e0 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20  ement is of the 
371f0 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a  form:.        **
37200 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45  .        **   SE
37210 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
37220 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20  OM <tbl>.       
37230 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   **.        ** w
37240 68 65 72 65 20 74 68 65 20 54 61 62 6c 65 20 73  here the Table s
37250 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65  tructure returne
37260 64 20 72 65 70 72 65 73 65 6e 74 73 20 74 61 62  d represents tab
37270 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20  le <tbl>..      
37280 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
37290 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69  This statement i
372a0 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74  s so common that
372b0 20 69 74 20 69 73 20 6f 70 74 69 6d 69 7a 65 64   it is optimized
372c0 20 73 70 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a   specially. The.
372d0 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f          ** OP_Co
372e0 75 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  unt instruction 
372f0 69 73 20 65 78 65 63 75 74 65 64 20 65 69 74 68  is executed eith
37300 65 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79  er on the intkey
37310 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20   table that.    
37320 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
37330 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 61 62  the data for tab
37340 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f  le <tbl> or on o
37350 6e 65 20 6f 66 20 69 74 73 20 69 6e 64 65 78 65  ne of its indexe
37360 73 2e 20 49 74 0a 20 20 20 20 20 20 20 20 2a 2a  s. It.        **
37370 20 69 73 20 62 65 74 74 65 72 20 74 6f 20 65 78   is better to ex
37380 65 63 75 74 65 20 74 68 65 20 6f 70 20 6f 6e 20  ecute the op on 
37390 61 6e 20 69 6e 64 65 78 2c 20 61 73 20 69 6e 64  an index, as ind
373a0 65 78 65 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a  exes are almost.
373b0 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79          ** alway
373c0 73 20 73 70 72 65 61 64 20 61 63 72 6f 73 73 20  s spread across 
373d0 6c 65 73 73 20 70 61 67 65 73 20 74 68 61 6e 20  less pages than 
373e0 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e 64  their correspond
373f0 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20 20 20  ing tables..    
37400 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63      */.        c
37410 6f 6e 73 74 20 69 6e 74 20 69 44 62 20 3d 20 73  onst int iDb = s
37420 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
37430 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
37440 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
37450 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e          const in
37460 74 20 69 43 73 72 20 3d 20 70 50 61 72 73 65 2d  t iCsr = pParse-
37470 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20  >nTab++;     /* 
37480 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 62  Cursor to scan b
37490 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 20  -tree */.       
374a0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
374b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
374c0 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
374d0 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
374e0 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
374f0 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20  KeyInfo = 0;    
37500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65             /* Ke
37510 79 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65  yinfo for scanne
37520 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  d index */.     
37530 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20     Index *pBest 
37540 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
37550 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20          /* Best 
37560 69 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f 20 66  index found so f
37570 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  ar */.        in
37580 74 20 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e  t iRoot = pTab->
37590 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  tnum;           
375a0 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
375b0 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d 74 72 65  of scanned b-tre
375c0 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73 71  e */..        sq
375d0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
375e0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
375f0 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
37600 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
37610 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
37620 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
37630 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20 20  Name);..        
37640 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68  /* Search for th
37650 65 20 69 6e 64 65 78 20 74 68 61 74 20 68 61 73  e index that has
37660 20 74 68 65 20 6c 6f 77 65 73 74 20 73 63 61 6e   the lowest scan
37670 20 63 6f 73 74 2e 0a 20 20 20 20 20 20 20 20 2a   cost..        *
37680 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30  *.        ** (20
37690 31 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f 74  11-04-15) Do not
376a0 20 64 6f 20 61 20 66 75 6c 6c 20 73 63 61 6e 20   do a full scan 
376b0 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72 65 64 20  of an unordered 
376c0 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a  index..        *
376d0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30  *.        ** (20
376e0 31 33 2d 31 30 2d 30 33 29 20 44 6f 20 6e 6f 74  13-10-03) Do not
376f0 20 63 6f 75 6e 74 20 74 68 65 20 65 6e 74 72 69   count the entri
37700 65 73 20 69 6e 20 61 20 70 61 72 74 69 61 6c 20  es in a partial 
37710 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a  index..        *
37720 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  *.        ** In 
37730 70 72 61 63 74 69 63 65 20 74 68 65 20 4b 65 79  practice the Key
37740 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 77  Info structure w
37750 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e  ill not be used.
37760 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20 20   It is only .   
37770 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64 20 74       ** passed t
37780 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52 65  o keep OP_OpenRe
37790 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20 20 20  ad happy..      
377a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
377b0 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
377c0 20 29 20 70 42 65 73 74 20 3d 20 73 71 6c 69 74   ) pBest = sqlit
377d0 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
377e0 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20  x(pTab);.       
377f0 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
37800 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
37810 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
37820 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
37830 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d  Idx->bUnordered=
37840 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
37850 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c   pIdx->szIdxRow<
37860 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 0a 20  pTab->szTabRow. 
37870 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49 64            && pId
37880 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  x->pPartIdxWhere
37890 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  ==0.           &
378a0 26 20 28 21 70 42 65 73 74 20 7c 7c 20 70 49 64  & (!pBest || pId
378b0 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 42 65 73  x->szIdxRow<pBes
378c0 74 2d 3e 73 7a 49 64 78 52 6f 77 29 0a 20 20 20  t->szIdxRow).   
378d0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
378e0 20 20 20 20 20 20 70 42 65 73 74 20 3d 20 70 49        pBest = pI
378f0 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  dx;.          }.
37900 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37910 20 20 69 66 28 20 70 42 65 73 74 20 29 7b 0a 20    if( pBest ){. 
37920 20 20 20 20 20 20 20 20 20 69 52 6f 6f 74 20 3d           iRoot =
37930 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20   pBest->tnum;.  
37940 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
37950 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
37960 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c  oOfIndex(pParse,
37970 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 20   pBest);.       
37980 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   }..        /* O
37990 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  pen a read-only 
379a0 63 75 72 73 6f 72 2c 20 65 78 65 63 75 74 65 20  cursor, execute 
379b0 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c  the OP_Count, cl
379c0 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e 20  ose the cursor. 
379d0 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
379e0 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
379f0 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
37a00 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62  iCsr, iRoot, iDb
37a10 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
37a20 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20  ( pKeyInfo ){.  
37a30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
37a40 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
37a50 31 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79 49  1, (char *)pKeyI
37a60 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
37a70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
37a80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
37a90 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e  ddOp2(v, OP_Coun
37aa0 74 2c 20 69 43 73 72 2c 20 73 41 67 67 49 6e 66  t, iCsr, sAggInf
37ab0 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29  o.aFunc[0].iMem)
37ac0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
37ad0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
37ae0 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29 3b 0a  P_Close, iCsr);.
37af0 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53          explainS
37b00 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61 72 73  impleCount(pPars
37b10 65 2c 20 70 54 61 62 2c 20 70 42 65 73 74 29 3b  e, pTab, pBest);
37b20 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
37b30 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
37b40 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f  IT_BTREECOUNT */
37b50 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
37b60 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72 75   /* This case ru
37b70 6e 73 20 69 66 20 74 68 65 20 61 67 67 72 65 67  ns if the aggreg
37b80 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50  ate has no GROUP
37b90 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65   BY clause.  The
37ba0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63  .        ** proc
37bb0 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20 73  essing is much s
37bc0 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68 65  impler since the
37bd0 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e  re is only a sin
37be0 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 20 20  gle row.        
37bf0 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20  ** of output..  
37c00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
37c10 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f   assert( p->pGro
37c20 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  upBy==0 );.     
37c30 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61     resetAccumula
37c40 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
37c50 67 49 6e 66 6f 29 3b 0a 0a 20 20 20 20 20 20 20  gInfo);..       
37c60 20 2f 2a 20 49 66 20 74 68 69 73 20 71 75 65 72   /* If this quer
37c70 79 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  y is a candidate
37c80 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d 61 78   for the min/max
37c90 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74   optimization, t
37ca0 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  hen.        ** m
37cb0 69 6e 4d 61 78 46 6c 61 67 20 77 69 6c 6c 20 68  inMaxFlag will h
37cc0 61 76 65 20 62 65 65 6e 20 70 72 65 76 69 6f 75  ave been previou
37cd0 73 6c 79 20 73 65 74 20 74 6f 20 65 69 74 68 65  sly set to eithe
37ce0 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 48 45  r.        ** WHE
37cf0 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f  RE_ORDERBY_MIN o
37d00 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  r WHERE_ORDERBY_
37d10 4d 41 58 20 61 6e 64 20 70 4d 69 6e 4d 61 78 4f  MAX and pMinMaxO
37d20 72 64 65 72 42 79 20 77 69 6c 6c 0a 20 20 20 20  rderBy will.    
37d30 20 20 20 20 2a 2a 20 62 65 20 61 6e 20 61 70 70      ** be an app
37d40 72 6f 70 72 69 61 74 65 20 4f 52 44 45 52 20 42  ropriate ORDER B
37d50 59 20 65 78 70 72 65 73 73 69 6f 6e 20 66 6f 72  Y expression for
37d60 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
37d70 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  n..        */.  
37d80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 69        assert( mi
37d90 6e 4d 61 78 46 6c 61 67 3d 3d 57 48 45 52 45 5f  nMaxFlag==WHERE_
37da0 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 7c  ORDERBY_NORMAL |
37db0 7c 20 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79  | pMinMaxOrderBy
37dc0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  !=0 );.        a
37dd0 73 73 65 72 74 28 20 70 4d 69 6e 4d 61 78 4f 72  ssert( pMinMaxOr
37de0 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 4d 69 6e  derBy==0 || pMin
37df0 4d 61 78 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  MaxOrderBy->nExp
37e00 72 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 20  r==1 );..       
37e10 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70   SELECTTRACE(1,p
37e20 50 61 72 73 65 2c 70 2c 28 22 57 68 65 72 65 42  Parse,p,("WhereB
37e30 65 67 69 6e 5c 6e 22 29 29 3b 0a 20 20 20 20 20  egin\n"));.     
37e40 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
37e50 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
37e60 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
37e70 70 57 68 65 72 65 2c 20 70 4d 69 6e 4d 61 78 4f  pWhere, pMinMaxO
37e80 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20  rderBy,.        
37e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37ea0 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 6d 69             0, mi
37eb0 6e 4d 61 78 46 6c 61 67 2c 20 30 29 3b 0a 20 20  nMaxFlag, 0);.  
37ec0 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
37ed0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
37ee0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
37ef0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
37f00 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75      updateAccumu
37f10 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
37f20 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
37f30 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
37f40 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
37f50 66 6f 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  fo)>0 ){.       
37f60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
37f70 74 6f 28 76 2c 20 73 71 6c 69 74 65 33 57 68 65  to(v, sqlite3Whe
37f80 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49  reBreakLabel(pWI
37f90 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 20  nfo));.         
37fa0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
37fb0 20 22 25 73 28 29 20 62 79 20 69 6e 64 65 78 22   "%s() by index"
37fc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
37fd0 20 20 28 6d 69 6e 4d 61 78 46 6c 61 67 3d 3d 57    (minMaxFlag==W
37fe0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
37ff0 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b  ?"min":"max")));
38000 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
38010 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
38020 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
38030 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46      finalizeAggF
38040 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c  unctions(pParse,
38050 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
38060 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 53 6f 72     }..      sSor
38070 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  t.pOrderBy = 0;.
38080 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
38090 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
380a0 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45 6e   pHaving, addrEn
380b0 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  d, SQLITE_JUMPIF
380c0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c  NULL);.      sel
380d0 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
380e0 72 73 65 2c 20 70 2c 20 2d 31 2c 20 30 2c 20 30  rse, p, -1, 0, 0
380f0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
38100 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2c 20           pDest, 
38110 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45 6e 64  addrEnd, addrEnd
38120 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
38130 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
38140 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29  abel(v, addrEnd)
38150 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e  ;.    .  } /* en
38160 64 69 66 20 61 67 67 72 65 67 61 74 65 20 71 75  dif aggregate qu
38170 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20 73 44  ery */..  if( sD
38180 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70  istinct.eTnctTyp
38190 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43  e==WHERE_DISTINC
381a0 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 7b 0a 20  T_UNORDERED ){. 
381b0 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61     explainTempTa
381c0 62 6c 65 28 70 50 61 72 73 65 2c 20 22 44 49 53  ble(pParse, "DIS
381d0 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a 20 20  TINCT");.  }..  
381e0 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
381f0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
38200 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20  e, then we need 
38210 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73 75  to sort the resu
38220 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e  lts.  ** and sen
38230 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61  d them to the ca
38240 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e  llback one by on
38250 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 53  e..  */.  if( sS
38260 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ort.pOrderBy ){.
38270 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54      explainTempT
38280 61 62 6c 65 28 70 50 61 72 73 65 2c 0a 20 20 20  able(pParse,.   
38290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
382a0 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3e 30    sSort.nOBSat>0
382b0 20 3f 20 22 52 49 47 48 54 20 50 41 52 54 20 4f   ? "RIGHT PART O
382c0 46 20 4f 52 44 45 52 20 42 59 22 3a 22 4f 52 44  F ORDER BY":"ORD
382d0 45 52 20 42 59 22 29 3b 0a 20 20 20 20 61 73 73  ER BY");.    ass
382e0 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 3d 3d  ert( p->pEList==
382f0 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 67 65  pEList );.    ge
38300 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70  nerateSortTail(p
38310 50 61 72 73 65 2c 20 70 2c 20 26 73 53 6f 72 74  Parse, p, &sSort
38320 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  , pEList->nExpr,
38330 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20   pDest);.  }..  
38340 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
38350 73 6b 69 70 20 74 68 69 73 20 71 75 65 72 79 0a  skip this query.
38360 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
38370 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
38380 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54  , iEnd);..  /* T
38390 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 62 65  he SELECT has be
383a0 65 6e 20 63 6f 64 65 64 2e 20 49 66 20 74 68 65  en coded. I