/ Hex Artifact Content
Login

Artifact c87425f0d56340a4ccc5aac52d07264b73c348ca45103caef9f289b09cb0e052:


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 70 54 61 62 2d 3e  & pTab && pTab->
69c0: 70 53 63 68 65 6d 61 20 26 26 20 70 54 61 62 2d  pSchema && pTab-
69d0: 3e 70 53 65 6c 65 63 74 3d 3d 30 0a 20 20 20 20  >pSelect==0.    
69e0: 20 20 20 26 26 20 21 49 73 56 69 72 74 75 61 6c     && !IsVirtual
69f0: 28 70 54 61 62 29 0a 20 20 20 20 20 20 29 7b 0a  (pTab).      ){.
6a00: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
6a10: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
6a20: 6a 3c 6e 44 65 66 65 72 3b 20 6a 2b 2b 29 7b 0a  j<nDefer; j++){.
6a30: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
6a40: 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6a 5d 2e 69  ort->aDefer[j].i
6a50: 43 73 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  Csr==pExpr->iTab
6a60: 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  le ) break;.    
6a70: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
6a80: 28 20 6a 3d 3d 6e 44 65 66 65 72 20 29 7b 0a 20  ( j==nDefer ){. 
6a90: 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 44 65           if( nDe
6aa0: 66 65 72 3d 3d 41 72 72 61 79 53 69 7a 65 28 70  fer==ArraySize(p
6ab0: 53 6f 72 74 2d 3e 61 44 65 66 65 72 29 20 29 7b  Sort->aDefer) ){
6ac0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
6ad0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
6ae0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6af0: 20 20 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 31      int nKey = 1
6b00: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
6b10: 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t k;.           
6b20: 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30 3b   Index *pPk = 0;
6b30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
6b40: 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
6b50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6b60: 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50    pPk = sqlite3P
6b70: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
6b80: 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Tab);.          
6b90: 20 20 20 20 6e 4b 65 79 20 3d 20 70 50 6b 2d 3e      nKey = pPk->
6ba0: 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nKeyCol;.       
6bb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6bc0: 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 4b     for(k=0; k<nK
6bd0: 65 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  ey; k++){.      
6be0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e          Expr *pN
6bf0: 65 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  ew = sqlite3PExp
6c00: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 43 4f 4c  r(pParse, TK_COL
6c10: 55 4d 4e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  UMN, 0, 0);.    
6c20: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e            if( pN
6c30: 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ew ){.          
6c40: 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 54 61 62        pNew->iTab
6c50: 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  le = pExpr->iTab
6c60: 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  le;.            
6c70: 20 20 20 20 70 4e 65 77 2d 3e 70 54 61 62 20 3d      pNew->pTab =
6c80: 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20   pExpr->pTab;.  
6c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
6ca0: 65 77 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 50  ew->iColumn = pP
6cb0: 6b 20 3f 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  k ? pPk->aiColum
6cc0: 6e 5b 6b 5d 20 3a 20 2d 31 3b 0a 20 20 20 20 20  n[k] : -1;.     
6cd0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 74 72             pExtr
6ce0: 61 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  a = sqlite3ExprL
6cf0: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
6d00: 2c 20 70 45 78 74 72 61 2c 20 70 4e 65 77 29 3b  , pExtra, pNew);
6d10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
6d20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
6d30: 20 20 20 20 20 20 20 20 20 20 20 70 53 6f 72 74             pSort
6d40: 2d 3e 61 44 65 66 65 72 5b 6e 44 65 66 65 72 5d  ->aDefer[nDefer]
6d50: 2e 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70  .pTab = pExpr->p
6d60: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Tab;.           
6d70: 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6e   pSort->aDefer[n
6d80: 44 65 66 65 72 5d 2e 69 43 73 72 20 3d 20 70 45  Defer].iCsr = pE
6d90: 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  xpr->iTable;.   
6da0: 20 20 20 20 20 20 20 20 20 70 53 6f 72 74 2d 3e           pSort->
6db0: 61 44 65 66 65 72 5b 6e 44 65 66 65 72 5d 2e 6e  aDefer[nDefer].n
6dc0: 4b 65 79 20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20  Key = nKey;.    
6dd0: 20 20 20 20 20 20 20 20 6e 44 65 66 65 72 2b 2b          nDefer++
6de0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
6df0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6e00: 70 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65  pItem->bSorterRe
6e10: 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  f = 1;.      }. 
6e20: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 53 6f 72 74     }.  }.  pSort
6e30: 2d 3e 6e 44 65 66 65 72 20 3d 20 28 75 38 29 6e  ->nDefer = (u8)n
6e40: 44 65 66 65 72 3b 0a 20 20 2a 70 70 45 78 74 72  Defer;.  *ppExtr
6e50: 61 20 3d 20 70 45 78 74 72 61 3b 0a 7d 0a 23 65  a = pExtra;.}.#e
6e60: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
6e70: 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
6e80: 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20  es the code for 
6e90: 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68  the inside of th
6ea0: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20  e inner loop.** 
6eb0: 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a  of a SELECT..**.
6ec0: 2a 2a 20 49 66 20 73 72 63 54 61 62 20 69 73 20  ** If srcTab is 
6ed0: 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74  negative, then t
6ee0: 68 65 20 70 2d 3e 70 45 4c 69 73 74 20 65 78 70  he p->pEList exp
6ef0: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20  ressions.** are 
6f00: 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64  evaluated in ord
6f10: 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 64 61  er to get the da
6f20: 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e  ta for this row.
6f30: 20 20 49 66 20 73 72 63 54 61 62 20 69 73 0a 2a    If srcTab is.*
6f40: 2a 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 2c 20  * zero or more, 
6f50: 74 68 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c  then data is pul
6f60: 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20  led from srcTab 
6f70: 61 6e 64 20 70 2d 3e 70 45 4c 69 73 74 20 69 73  and p->pEList is
6f80: 20 75 73 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20 74   used only .** t
6f90: 6f 20 67 65 74 20 74 68 65 20 6e 75 6d 62 65 72  o get the number
6fa0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20   of columns and 
6fb0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
6fc0: 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20  quence for each 
6fd0: 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69  column..*/.stati
6fe0: 63 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e  c void selectInn
6ff0: 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20  erLoop(.  Parse 
7000: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
7010: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
7020: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
7030: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
7040: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
7050: 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74 61 74  lete select stat
7060: 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
7070: 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61  d */.  int srcTa
7080: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b,             /
7090: 2a 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d  * Pull data from
70a0: 20 74 68 69 73 20 74 61 62 6c 65 20 69 66 20 6e   this table if n
70b0: 6f 6e 2d 6e 65 67 61 74 69 76 65 20 2a 2f 0a 20  on-negative */. 
70c0: 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c   SortCtx *pSort,
70d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
70e0: 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e  ot NULL, info on
70f0: 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20   how to process 
7100: 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 44 69  ORDER BY */.  Di
7110: 73 74 69 6e 63 74 43 74 78 20 2a 70 44 69 73 74  stinctCtx *pDist
7120: 69 6e 63 74 2c 20 2f 2a 20 49 66 20 6e 6f 74 20  inct, /* If not 
7130: 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f  NULL, info on ho
7140: 77 20 74 6f 20 70 72 6f 63 65 73 73 20 44 49 53  w to process DIS
7150: 54 49 4e 43 54 20 2a 2f 0a 20 20 53 65 6c 65 63  TINCT */.  Selec
7160: 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20  tDest *pDest,   
7170: 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73     /* How to dis
7180: 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73 75  pose of the resu
7190: 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  lts */.  int iCo
71a0: 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20  ntinue,         
71b0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
71c0: 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e   continue with n
71d0: 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74  ext row */.  int
71e0: 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20   iBreak         
71f0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
7200: 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  e to break out o
7210: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
7220: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
7230: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
7240: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
7250: 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20   hasDistinct;   
7260: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
7270: 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
7280: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
7290: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65  ent */.  int eDe
72a0: 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73  st = pDest->eDes
72b0: 74 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64  t;   /* How to d
72c0: 69 73 70 6f 73 65 20 6f 66 20 72 65 73 75 6c 74  ispose of result
72d0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d  s */.  int iParm
72e0: 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72   = pDest->iSDPar
72f0: 6d 3b 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75  m; /* First argu
7300: 6d 65 6e 74 20 74 6f 20 64 69 73 70 6f 73 61 6c  ment to disposal
7310: 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74   method */.  int
7320: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20 20 20   nResultCol;    
7330: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7340: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
7350: 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  umns */.  int nP
7360: 72 65 66 69 78 52 65 67 20 3d 20 30 3b 20 20 20  refixReg = 0;   
7370: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7380: 6f 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65  of extra registe
7390: 72 73 20 62 65 66 6f 72 65 20 72 65 67 52 65 73  rs before regRes
73a0: 75 6c 74 20 2a 2f 0a 0a 20 20 2f 2a 20 55 73 75  ult */..  /* Usu
73b0: 61 6c 6c 79 2c 20 72 65 67 52 65 73 75 6c 74 20  ally, regResult 
73c0: 69 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  is the first cel
73d0: 6c 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  l in an array of
73e0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 0a 20 20   memory cells.  
73f0: 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
7400: 65 20 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74  e current result
7410: 20 72 6f 77 2e 20 49 6e 20 74 68 69 73 20 63 61   row. In this ca
7420: 73 65 20 72 65 67 4f 72 69 67 20 69 73 20 73 65  se regOrig is se
7430: 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73 61  t to the.  ** sa
7440: 6d 65 20 76 61 6c 75 65 2e 20 48 6f 77 65 76 65  me value. Howeve
7450: 72 2c 20 69 66 20 74 68 65 20 72 65 73 75 6c 74  r, if the result
7460: 73 20 61 72 65 20 62 65 69 6e 67 20 73 65 6e 74  s are being sent
7470: 20 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2c 20   to the sorter, 
7480: 74 68 65 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20  the.  ** values 
7490: 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73 69  for any expressi
74a0: 6f 6e 73 20 74 68 61 74 20 61 72 65 20 61 6c 73  ons that are als
74b0: 6f 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 6f  o part of the so
74c0: 72 74 2d 6b 65 79 20 61 72 65 20 6f 6d 69 74 74  rt-key are omitt
74d0: 65 64 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 69  ed.  ** from thi
74e0: 73 20 61 72 72 61 79 2e 20 49 6e 20 74 68 69 73  s array. In this
74f0: 20 63 61 73 65 20 72 65 67 4f 72 69 67 20 69 73   case regOrig is
7500: 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 2a   set to zero.  *
7510: 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c  /.  int regResul
7520: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
7530: 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f  /* Start of memo
7540: 72 79 20 68 6f 6c 64 69 6e 67 20 63 75 72 72 65  ry holding curre
7550: 6e 74 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  nt results */.  
7560: 69 6e 74 20 72 65 67 4f 72 69 67 3b 20 20 20 20  int regOrig;    
7570: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7580: 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68  tart of memory h
7590: 6f 6c 64 69 6e 67 20 66 75 6c 6c 20 72 65 73 75  olding full resu
75a0: 6c 74 20 28 6f 72 20 30 29 20 2a 2f 0a 0a 20 20  lt (or 0) */..  
75b0: 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 61  assert( v );.  a
75c0: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
75d0: 21 3d 30 20 29 3b 0a 20 20 68 61 73 44 69 73 74  !=0 );.  hasDist
75e0: 69 6e 63 74 20 3d 20 70 44 69 73 74 69 6e 63 74  inct = pDistinct
75f0: 20 3f 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54   ? pDistinct->eT
7600: 6e 63 74 54 79 70 65 20 3a 20 57 48 45 52 45 5f  nctType : WHERE_
7610: 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20  DISTINCT_NOOP;. 
7620: 20 69 66 28 20 70 53 6f 72 74 20 26 26 20 70 53   if( pSort && pS
7630: 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ort->pOrderBy==0
7640: 20 29 20 70 53 6f 72 74 20 3d 20 30 3b 0a 20 20   ) pSort = 0;.  
7650: 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 26 26 20  if( pSort==0 && 
7660: 21 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a  !hasDistinct ){.
7670: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6e      assert( iCon
7680: 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20 20 20  tinue!=0 );.    
7690: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d  codeOffset(v, p-
76a0: 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69  >iOffset, iConti
76b0: 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nue);.  }..  /* 
76c0: 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74  Pull the request
76d0: 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f  ed columns..  */
76e0: 0a 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20  .  nResultCol = 
76f0: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
7700: 3b 0a 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  ;..  if( pDest->
7710: 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  iSdst==0 ){.    
7720: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
7730: 20 20 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20     nPrefixReg = 
7740: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d  pSort->pOrderBy-
7750: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  >nExpr;.      if
7760: 28 20 21 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46  ( !(pSort->sortF
7770: 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f  lags & SORTFLAG_
7780: 55 73 65 53 6f 72 74 65 72 29 20 29 20 6e 50 72  UseSorter) ) nPr
7790: 65 66 69 78 52 65 67 2b 2b 3b 0a 20 20 20 20 20  efixReg++;.     
77a0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
77b0: 20 6e 50 72 65 66 69 78 52 65 67 3b 0a 20 20 20   nPrefixReg;.   
77c0: 20 7d 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 53   }.    pDest->iS
77d0: 64 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  dst = pParse->nM
77e0: 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
77f0: 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c  ->nMem += nResul
7800: 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66  tCol;.  }else if
7810: 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 6e  ( pDest->iSdst+n
7820: 52 65 73 75 6c 74 43 6f 6c 20 3e 20 70 50 61 72  ResultCol > pPar
7830: 73 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20  se->nMem ){.    
7840: 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20 65 72  /* This is an er
7850: 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 74 68  ror condition th
7860: 61 74 20 63 61 6e 20 72 65 73 75 6c 74 2c 20 66  at can result, f
7870: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  or example, when
7880: 20 61 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a   a SELECT.    **
7890: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61   on the right-ha
78a0: 6e 64 20 73 69 64 65 20 6f 66 20 61 6e 20 49 4e  nd side of an IN
78b0: 53 45 52 54 20 63 6f 6e 74 61 69 6e 73 20 6d 6f  SERT contains mo
78c0: 72 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  re result column
78d0: 73 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68  s than.    ** th
78e0: 65 72 65 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20  ere are columns 
78f0: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20  in the table on 
7900: 74 68 65 20 6c 65 66 74 2e 20 20 54 68 65 20 65  the left.  The e
7910: 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 63 61 75  rror will be cau
7920: 67 68 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 72  ght.    ** and r
7930: 65 70 6f 72 74 65 64 20 6c 61 74 65 72 2e 20 20  eported later.  
7940: 42 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 6d  But we need to m
7950: 61 6b 65 20 73 75 72 65 20 65 6e 6f 75 67 68 20  ake sure enough 
7960: 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61  memory is alloca
7970: 74 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 61 76  ted.    ** to av
7980: 6f 69 64 20 6f 74 68 65 72 20 73 70 75 72 69 6f  oid other spurio
7990: 75 73 20 65 72 72 6f 72 73 20 69 6e 20 74 68 65  us errors in the
79a0: 20 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20   meantime. */.  
79b0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
79c0: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
79d0: 7d 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74  }.  pDest->nSdst
79e0: 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20   = nResultCol;. 
79f0: 20 72 65 67 4f 72 69 67 20 3d 20 72 65 67 52 65   regOrig = regRe
7a00: 73 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69 53  sult = pDest->iS
7a10: 64 73 74 3b 0a 20 20 69 66 28 20 73 72 63 54 61  dst;.  if( srcTa
7a20: 62 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  b>=0 ){.    for(
7a30: 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f  i=0; i<nResultCo
7a40: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  l; i++){.      s
7a50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7a60: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
7a70: 72 63 54 61 62 2c 20 69 2c 20 72 65 67 52 65 73  rcTab, i, regRes
7a80: 75 6c 74 2b 69 29 3b 0a 20 20 20 20 20 20 56 64  ult+i);.      Vd
7a90: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
7aa0: 73 22 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  s", p->pEList->a
7ab0: 5b 69 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  [i].zName));.   
7ac0: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65   }.  }else if( e
7ad0: 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73  Dest!=SRT_Exists
7ae0: 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
7af0: 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f  E_ENABLE_SORTER_
7b00: 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20 45  REFERENCES.    E
7b10: 78 70 72 4c 69 73 74 20 2a 70 45 78 74 72 61 20  xprList *pExtra 
7b20: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = 0;.#endif.    
7b30: 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e  /* If the destin
7b40: 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53  ation is an EXIS
7b50: 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69  TS(...) expressi
7b60: 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20  on, the actual. 
7b70: 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74     ** values ret
7b80: 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c  urned by the SEL
7b90: 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75  ECT are not requ
7ba0: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
7bb0: 20 75 38 20 65 63 65 6c 46 6c 61 67 73 3b 0a 20   u8 ecelFlags;. 
7bc0: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
7bd0: 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d  T_Mem || eDest==
7be0: 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44  SRT_Output || eD
7bf0: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
7c00: 6e 65 20 29 7b 0a 20 20 20 20 20 20 65 63 65 6c  ne ){.      ecel
7c10: 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 45  Flags = SQLITE_E
7c20: 43 45 4c 5f 44 55 50 3b 0a 20 20 20 20 7d 65 6c  CEL_DUP;.    }el
7c30: 73 65 7b 0a 20 20 20 20 20 20 65 63 65 6c 46 6c  se{.      ecelFl
7c40: 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ags = 0;.    }. 
7c50: 20 20 20 69 66 28 20 70 53 6f 72 74 20 26 26 20     if( pSort && 
7c60: 68 61 73 44 69 73 74 69 6e 63 74 3d 3d 30 20 26  hasDistinct==0 &
7c70: 26 20 65 44 65 73 74 21 3d 53 52 54 5f 45 70 68  & eDest!=SRT_Eph
7c80: 65 6d 54 61 62 20 26 26 20 65 44 65 73 74 21 3d  emTab && eDest!=
7c90: 53 52 54 5f 54 61 62 6c 65 20 29 7b 0a 20 20 20  SRT_Table ){.   
7ca0: 20 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 65     /* For each e
7cb0: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 70 2d 3e  xpression in p->
7cc0: 70 45 4c 69 73 74 20 74 68 61 74 20 69 73 20 61  pEList that is a
7cd0: 20 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70 72   copy of an expr
7ce0: 65 73 73 69 6f 6e 20 69 6e 0a 20 20 20 20 20 20  ession in.      
7cf0: 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ** the ORDER BY 
7d00: 63 6c 61 75 73 65 20 28 70 53 6f 72 74 2d 3e 70  clause (pSort->p
7d10: 4f 72 64 65 72 42 79 29 2c 20 73 65 74 20 74 68  OrderBy), set th
7d20: 65 20 61 73 73 6f 63 69 61 74 65 64 20 0a 20 20  e associated .  
7d30: 20 20 20 20 2a 2a 20 69 4f 72 64 65 72 42 79 43      ** iOrderByC
7d40: 6f 6c 20 76 61 6c 75 65 20 74 6f 20 6f 6e 65 20  ol value to one 
7d50: 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 69 6e  more than the in
7d60: 64 65 78 20 6f 66 20 74 68 65 20 4f 52 44 45 52  dex of the ORDER
7d70: 20 42 59 20 0a 20 20 20 20 20 20 2a 2a 20 65 78   BY .      ** ex
7d80: 70 72 65 73 73 69 6f 6e 20 77 69 74 68 69 6e 20  pression within 
7d90: 74 68 65 20 73 6f 72 74 2d 6b 65 79 20 74 68 61  the sort-key tha
7da0: 74 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72  t pushOntoSorter
7db0: 28 29 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65  () will generate
7dc0: 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  ..      ** This 
7dd0: 61 6c 6c 6f 77 73 20 74 68 65 20 70 2d 3e 70 45  allows the p->pE
7de0: 4c 69 73 74 20 66 69 65 6c 64 20 74 6f 20 62 65  List field to be
7df0: 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68   omitted from th
7e00: 65 20 73 6f 72 74 65 64 20 72 65 63 6f 72 64 2c  e sorted record,
7e10: 0a 20 20 20 20 20 20 2a 2a 20 73 61 76 69 6e 67  .      ** saving
7e20: 20 73 70 61 63 65 20 61 6e 64 20 43 50 55 20 63   space and CPU c
7e30: 79 63 6c 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20  ycles.  */.     
7e40: 20 65 63 65 6c 46 6c 61 67 73 20 7c 3d 20 28 53   ecelFlags |= (S
7e50: 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52  QLITE_ECEL_OMITR
7e60: 45 46 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52  EF|SQLITE_ECEL_R
7e70: 45 46 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  EF);.      for(i
7e80: 3d 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20  =pSort->nOBSat; 
7e90: 69 3c 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42  i<pSort->pOrderB
7ea0: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
7eb0: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
7ec0: 20 20 20 20 20 20 20 69 66 28 20 28 6a 20 3d 20         if( (j = 
7ed0: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d  pSort->pOrderBy-
7ee0: 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  >a[i].u.x.iOrder
7ef0: 42 79 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20  ByCol)>0 ){.    
7f00: 20 20 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 2d        p->pEList-
7f10: 3e 61 5b 6a 2d 31 5d 2e 75 2e 78 2e 69 4f 72 64  >a[j-1].u.x.iOrd
7f20: 65 72 42 79 43 6f 6c 20 3d 20 69 2b 31 2d 70 53  erByCol = i+1-pS
7f30: 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20  ort->nOBSat;.   
7f40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
7f50: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
7f60: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
7f70: 45 4e 43 45 53 0a 20 20 20 20 20 20 73 65 6c 65  ENCES.      sele
7f80: 63 74 45 78 70 72 44 65 66 65 72 28 70 50 61 72  ctExprDefer(pPar
7f90: 73 65 2c 20 70 53 6f 72 74 2c 20 70 2d 3e 70 45  se, pSort, p->pE
7fa0: 4c 69 73 74 2c 20 26 70 45 78 74 72 61 29 3b 0a  List, &pExtra);.
7fb0: 20 20 20 20 20 20 69 66 28 20 70 45 78 74 72 61        if( pExtra
7fc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
7fd0: 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
7fe0: 65 78 74 72 61 20 50 4b 20 63 6f 6c 75 6d 6e 73  extra PK columns
7ff0: 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20 73   to add to the s
8000: 6f 72 74 65 72 20 72 65 63 6f 72 64 73 2c 0a 20  orter records,. 
8010: 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61         ** alloca
8020: 74 65 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20  te extra memory 
8030: 63 65 6c 6c 73 20 61 6e 64 20 61 64 6a 75 73 74  cells and adjust
8040: 20 74 68 65 20 4f 70 65 6e 45 70 68 65 6d 65 72   the OpenEphemer
8050: 61 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  al .        ** i
8060: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 61 63  nstruction to ac
8070: 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 6c 61  count for the la
8080: 72 67 65 72 20 72 65 63 6f 72 64 73 2e 20 54 68  rger records. Th
8090: 69 73 20 69 73 20 6f 6e 6c 79 0a 20 20 20 20 20  is is only.     
80a0: 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 69     ** required i
80b0: 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20  f there are one 
80c0: 6f 72 20 6d 6f 72 65 20 57 49 54 48 4f 55 54 20  or more WITHOUT 
80d0: 52 4f 57 49 44 20 74 61 62 6c 65 73 20 77 69 74  ROWID tables wit
80e0: 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6d  h.        ** com
80f0: 70 6f 73 69 74 65 20 70 72 69 6d 61 72 79 20 6b  posite primary k
8100: 65 79 73 20 69 6e 20 74 68 65 20 53 6f 72 74 43  eys in the SortC
8110: 74 78 2e 61 44 65 66 65 72 5b 5d 20 61 72 72 61  tx.aDefer[] arra
8120: 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 56  y.  */.        V
8130: 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 73 71 6c  dbeOp *pOp = sql
8140: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
8150: 20 70 53 6f 72 74 2d 3e 61 64 64 72 53 6f 72 74   pSort->addrSort
8160: 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20  Index);.        
8170: 70 4f 70 2d 3e 70 32 20 2b 3d 20 28 70 45 78 74  pOp->p2 += (pExt
8180: 72 61 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72  ra->nExpr - pSor
8190: 74 2d 3e 6e 44 65 66 65 72 29 3b 0a 20 20 20 20  t->nDefer);.    
81a0: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79      pOp->p4.pKey
81b0: 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20  Info->nAllField 
81c0: 2b 3d 20 28 70 45 78 74 72 61 2d 3e 6e 45 78 70  += (pExtra->nExp
81d0: 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65  r - pSort->nDefe
81e0: 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  r);.        pPar
81f0: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 45 78 74  se->nMem += pExt
8200: 72 61 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  ra->nExpr;.     
8210: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
8220: 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a 20 20 20  regOrig = 0;.   
8230: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
8240: 3d 3d 53 52 54 5f 53 65 74 20 7c 7c 20 65 44 65  ==SRT_Set || eDe
8250: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 0a 20 20 20  st==SRT_Mem .   
8260: 20 20 20 20 20 20 20 20 7c 7c 20 65 44 65 73 74          || eDest
8270: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
8280: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  || eDest==SRT_Ou
8290: 74 70 75 74 20 29 3b 0a 20 20 20 20 7d 0a 20 20  tput );.    }.  
82a0: 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 73    nResultCol = s
82b0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
82c0: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 70 2d  prList(pParse,p-
82d0: 3e 70 45 4c 69 73 74 2c 72 65 67 52 65 73 75 6c  >pEList,regResul
82e0: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
82f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8300: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 65 63              0,ec
8310: 65 6c 46 6c 61 67 73 29 3b 0a 23 69 66 64 65 66  elFlags);.#ifdef
8320: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
8330: 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53  ORTER_REFERENCES
8340: 0a 20 20 20 20 69 66 28 20 70 45 78 74 72 61 20  .    if( pExtra 
8350: 29 7b 0a 20 20 20 20 20 20 6e 52 65 73 75 6c 74  ){.      nResult
8360: 43 6f 6c 20 2b 3d 20 73 71 6c 69 74 65 33 45 78  Col += sqlite3Ex
8370: 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a  prCodeExprList(.
8380: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
8390: 2c 20 70 45 78 74 72 61 2c 20 72 65 67 52 65 73  , pExtra, regRes
83a0: 75 6c 74 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c  ult + nResultCol
83b0: 2c 20 30 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a  , 0, 0.      );.
83c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
83d0: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  rListDelete(pPar
83e0: 73 65 2d 3e 64 62 2c 20 70 45 78 74 72 61 29 3b  se->db, pExtra);
83f0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
8400: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44  }..  /* If the D
8410: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
8420: 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74  was present on t
8430: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
8440: 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69  ent.  ** and thi
8450: 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73  s row has been s
8460: 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e  een before, then
8470: 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69   do not make thi
8480: 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20  s row.  ** part 
8490: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20  of the result.. 
84a0: 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73   */.  if( hasDis
84b0: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 77 69  tinct ){.    swi
84c0: 74 63 68 28 20 70 44 69 73 74 69 6e 63 74 2d 3e  tch( pDistinct->
84d0: 65 54 6e 63 74 54 79 70 65 20 29 7b 0a 20 20 20  eTnctType ){.   
84e0: 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49     case WHERE_DI
84f0: 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20  STINCT_ORDERED: 
8500: 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70  {.        VdbeOp
8510: 20 2a 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20   *pOp;          
8520: 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72    /* No longer r
8530: 65 71 75 69 72 65 64 20 4f 70 65 6e 45 70 68 65  equired OpenEphe
8540: 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a  meral instr. */.
8550: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a 75 6d          int iJum
8560: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
8570: 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74  /* Jump destinat
8580: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ion */.        i
8590: 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20  nt regPrev;     
85a0: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f         /* Previo
85b0: 75 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20 2a  us row content *
85c0: 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  /..        /* Al
85d0: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
85e0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f   the previous ro
85f0: 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67  w */.        reg
8600: 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Prev = pParse->n
8610: 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 70  Mem+1;.        p
8620: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
8630: 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20  ResultCol;..    
8640: 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68      /* Change th
8650: 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
8660: 61 6c 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72  al coded earlier
8670: 20 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20   to an OP_Null. 
8680: 20 20 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74         ** sets t
8690: 68 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62  he MEM_Cleared b
86a0: 69 74 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20  it on the first 
86b0: 72 65 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a  register of the.
86c0: 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69          ** previ
86d0: 6f 75 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73  ous value.  This
86e0: 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20   will cause the 
86f0: 4f 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61  OP_Ne below to a
8700: 6c 77 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a  lways.        **
8710: 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72   fail on the fir
8720: 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  st iteration of 
8730: 74 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66  the loop even if
8740: 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20   the first.     
8750: 20 20 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c     ** row is all
8760: 20 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20   NULLs..        
8770: 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
8780: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
8790: 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d  op(v, pDistinct-
87a0: 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20  >addrTnct);.    
87b0: 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65      pOp = sqlite
87c0: 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44  3VdbeGetOp(v, pD
87d0: 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63  istinct->addrTnc
87e0: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  t);.        pOp-
87f0: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c  >opcode = OP_Nul
8800: 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  l;.        pOp->
8810: 70 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  p1 = 1;.        
8820: 70 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65  pOp->p2 = regPre
8830: 76 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d  v;..        iJum
8840: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
8850: 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
8860: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20  nResultCol;.    
8870: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
8880: 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b  ResultCol; i++){
8890: 0a 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  .          CollS
88a0: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *pColl = sqli
88b0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
88c0: 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74  Parse, p->pEList
88d0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
88e0: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e           if( i<n
88f0: 52 65 73 75 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20  ResultCol-1 ){. 
8900: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
8910: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
8920: 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73 75 6c 74  OP_Ne, regResult
8930: 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65 67 50 72  +i, iJump, regPr
8940: 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20  ev+i);.         
8950: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
8960: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  v);.          }e
8970: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
8980: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8990: 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67  p3(v, OP_Eq, reg
89a0: 52 65 73 75 6c 74 2b 69 2c 20 69 43 6f 6e 74 69  Result+i, iConti
89b0: 6e 75 65 2c 20 72 65 67 50 72 65 76 2b 69 29 3b  nue, regPrev+i);
89c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62  .            Vdb
89d0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
89e0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
89f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8a00: 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
8a10: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43  (const char *)pC
8a20: 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
8a30: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
8a40: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
8a50: 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  v, SQLITE_NULLEQ
8a60: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
8a70: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
8a80: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
8a90: 64 64 72 28 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c  ddr(v)==iJump ||
8aa0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
8ab0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
8ac0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8ad0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
8ae0: 79 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65  y, regResult, re
8af0: 67 50 72 65 76 2c 20 6e 52 65 73 75 6c 74 43 6f  gPrev, nResultCo
8b00: 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72  l-1);.        br
8b10: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
8b20: 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
8b30: 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20  ISTINCT_UNIQUE: 
8b40: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8b50: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
8b60: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
8b70: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
8b80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8b90: 7d 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  }..      default
8ba0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  : {.        asse
8bb0: 72 74 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65  rt( pDistinct->e
8bc0: 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f  TnctType==WHERE_
8bd0: 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52  DISTINCT_UNORDER
8be0: 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  ED );.        co
8bf0: 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73  deDistinct(pPars
8c00: 65 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 74 61  e, pDistinct->ta
8c10: 62 54 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65  bTnct, iContinue
8c20: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20  , nResultCol,.  
8c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c40: 20 20 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20     regResult);. 
8c50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8c60: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
8c70: 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 29 7b 0a  if( pSort==0 ){.
8c80: 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74        codeOffset
8c90: 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  (v, p->iOffset, 
8ca0: 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  iContinue);.    
8cb0: 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  }.  }..  switch(
8cc0: 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a   eDest ){.    /*
8cd0: 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77   In this mode, w
8ce0: 72 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20  rite each query 
8cf0: 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65  result to the ke
8d00: 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  y of the tempora
8d10: 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  ry.    ** table 
8d20: 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69  iParm..    */.#i
8d30: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8d40: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
8d50: 54 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55  T.    case SRT_U
8d60: 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  nion: {.      in
8d70: 74 20 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d  t r1;.      r1 =
8d80: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
8d90: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
8da0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8db0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
8dc0: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
8dd0: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29   nResultCol, r1)
8de0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
8df0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
8e00: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
8e10: 61 72 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75  arm, r1, regResu
8e20: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  lt, nResultCol);
8e30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
8e40: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
8e50: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
8e60: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
8e70: 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61    /* Construct a
8e80: 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65   record from the
8e90: 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62   query result, b
8ea0: 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20  ut instead of.  
8eb0: 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74    ** saving that
8ec0: 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20   record, use it 
8ed0: 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65  as a key to dele
8ee0: 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d  te elements from
8ef0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70  .    ** the temp
8f00: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72  orary table iPar
8f10: 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  m..    */.    ca
8f20: 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b  se SRT_Except: {
8f30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8f40: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
8f50: 64 78 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c  dxDelete, iParm,
8f60: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
8f70: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 62  ultCol);.      b
8f80: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
8f90: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
8fa0: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
8fb0: 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 74 6f  T */..    /* Sto
8fc0: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73  re the result as
8fd0: 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e   data using a un
8fe0: 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f  ique key..    */
8ff0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 46 69  .    case SRT_Fi
9000: 66 6f 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  fo:.    case SRT
9010: 5f 44 69 73 74 46 69 66 6f 3a 0a 20 20 20 20 63  _DistFifo:.    c
9020: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
9030: 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
9040: 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e  mTab: {.      in
9050: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
9060: 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
9070: 65 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29  e, nPrefixReg+1)
9080: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
9090: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62  ( eDest==SRT_Tab
90a0: 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  le );.      test
90b0: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
90c0: 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20  _EphemTab );.   
90d0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
90e0: 73 74 3d 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a  st==SRT_Fifo );.
90f0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9100: 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46  eDest==SRT_DistF
9110: 69 66 6f 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ifo );.      sql
9120: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
9130: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
9140: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
9150: 75 6c 74 43 6f 6c 2c 20 72 31 2b 6e 50 72 65 66  ultCol, r1+nPref
9160: 69 78 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20  ixReg);.#ifndef 
9170: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
9180: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
9190: 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29 7b  =SRT_DistFifo ){
91a0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
91b0: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  he destination i
91c0: 73 20 44 69 73 74 46 69 66 6f 2c 20 74 68 65 6e  s DistFifo, then
91d0: 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31   cursor (iParm+1
91e0: 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20  ) is open.      
91f0: 20 20 2a 2a 20 6f 6e 20 61 6e 20 65 70 68 65 6d    ** on an ephem
9200: 65 72 61 6c 20 69 6e 64 65 78 2e 20 49 66 20 74  eral index. If t
9210: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69  he current row i
9220: 73 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e  s already presen
9230: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  t.        ** in 
9240: 74 68 65 20 69 6e 64 65 78 2c 20 64 6f 20 6e 6f  the index, do no
9250: 74 20 77 72 69 74 65 20 69 74 20 74 6f 20 74 68  t write it to th
9260: 65 20 6f 75 74 70 75 74 2e 20 49 66 20 6e 6f 74  e output. If not
9270: 2c 20 61 64 64 20 74 68 65 0a 20 20 20 20 20 20  , add the.      
9280: 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 72 6f 77    ** current row
9290: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 61 6e   to the index an
92a0: 64 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 77  d proceed with w
92b0: 72 69 74 69 6e 67 20 69 74 20 74 6f 20 74 68 65  riting it to the
92c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70  .        ** outp
92d0: 75 74 20 74 61 62 6c 65 20 61 73 20 77 65 6c 6c  ut table as well
92e0: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  .  */.        in
92f0: 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33  t addr = sqlite3
9300: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
9310: 76 29 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20  v) + 4;.        
9320: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9330: 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
9340: 2c 20 69 50 61 72 6d 2b 31 2c 20 61 64 64 72 2c  , iParm+1, addr,
9350: 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20   r1, 0);.       
9360: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
9370: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
9380: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
9390: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
93a0: 69 50 61 72 6d 2b 31 2c 20 72 31 2c 72 65 67 52  iParm+1, r1,regR
93b0: 65 73 75 6c 74 2c 6e 52 65 73 75 6c 74 43 6f 6c  esult,nResultCol
93c0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
93d0: 74 28 20 70 53 6f 72 74 3d 3d 30 20 29 3b 0a 20  t( pSort==0 );. 
93e0: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
93f0: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b      if( pSort ){
9400: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
9410: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
9420: 70 53 6f 72 74 2c 20 70 2c 20 72 31 2b 6e 50 72  pSort, p, r1+nPr
9430: 65 66 69 78 52 65 67 2c 72 65 67 52 65 73 75 6c  efixReg,regResul
9440: 74 2c 31 2c 6e 50 72 65 66 69 78 52 65 67 29 3b  t,1,nPrefixReg);
9450: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9460: 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73        int r2 = s
9470: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
9480: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
9490: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
94a0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
94b0: 69 64 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a  id, iParm, r2);.
94c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
94d0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
94e0: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
94f0: 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20  1, r2);.        
9500: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
9510: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
9520: 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73  PEND);.        s
9530: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
9540: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
9550: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9560: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
9570: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
9580: 72 31 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31  r1, nPrefixReg+1
9590: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
95a0: 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
95b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
95c0: 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  ERY.    /* If we
95d0: 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20   are creating a 
95e0: 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72  set for an "expr
95f0: 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
9600: 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20  " construct,.   
9610: 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73   ** then there s
9620: 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c  hould be a singl
9630: 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74  e item on the st
9640: 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73  ack.  Write this
9650: 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74  .    ** item int
9660: 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20  o the set table 
9670: 77 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e  with bogus data.
9680: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
9690: 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
96a0: 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20    if( pSort ){. 
96b0: 20 20 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72         /* At fir
96c0: 73 74 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f  st glance you wo
96d0: 75 6c 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75  uld think we cou
96e0: 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20  ld optimize out 
96f0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  the.        ** O
9700: 52 44 45 52 20 42 59 20 69 6e 20 74 68 69 73 20  RDER BY in this 
9710: 63 61 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f  case since the o
9720: 72 64 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  rder of entries 
9730: 69 6e 20 74 68 65 20 73 65 74 0a 20 20 20 20 20  in the set.     
9740: 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d     ** does not m
9750: 61 74 74 65 72 2e 20 20 42 75 74 20 74 68 65 72  atter.  But ther
9760: 65 20 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d  e might be a LIM
9770: 49 54 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68  IT clause, in wh
9780: 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  ich.        ** c
9790: 61 73 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f  ase the order do
97a0: 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20  es matter */.   
97b0: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
97c0: 74 65 72 28 0a 20 20 20 20 20 20 20 20 20 20 20  ter(.           
97d0: 20 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20   pParse, pSort, 
97e0: 70 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65  p, regResult, re
97f0: 67 4f 72 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f  gOrig, nResultCo
9800: 6c 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a  l, nPrefixReg);.
9810: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9820: 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
9830: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
9840: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
9850: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9860: 53 74 72 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e  Strlen30(pDest->
9870: 7a 41 66 66 53 64 73 74 29 3d 3d 6e 52 65 73 75  zAffSdst)==nResu
9880: 6c 74 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20  ltCol );.       
9890: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
98a0: 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
98b0: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
98c0: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 0a 20 20 20  nResultCol, .   
98d0: 20 20 20 20 20 20 20 20 20 72 31 2c 20 70 44 65           r1, pDe
98e0: 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20 6e 52  st->zAffSdst, nR
98f0: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
9900: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
9910: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
9920: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73  e(pParse, regRes
9930: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  ult, nResultCol)
9940: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
9950: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
9960: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
9970: 69 50 61 72 6d 2c 20 72 31 2c 20 72 65 67 52 65  iParm, r1, regRe
9980: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
9990: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
99a0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
99b0: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
99c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
99d0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
99e0: 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73   If any row exis
99f0: 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  t in the result 
9a00: 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74  set, record that
9a10: 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e   fact and abort.
9a20: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
9a30: 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20   SRT_Exists: {. 
9a40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9a50: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
9a60: 65 67 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b  eger, 1, iParm);
9a70: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
9a80: 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
9a90: 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
9aa0: 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
9ab0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9ac0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
9ad0: 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65  is a scalar sele
9ae0: 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20  ct that is part 
9af0: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
9b00: 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74  , then.    ** st
9b10: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
9b20: 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  in the appropria
9b30: 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6f  te memory cell o
9b40: 72 20 61 72 72 61 79 20 6f 66 20 0a 20 20 20 20  r array of .    
9b50: 2a 2a 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  ** memory cells 
9b60: 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 20 6f 66  and break out of
9b70: 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a   the scan loop..
9b80: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
9b90: 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
9ba0: 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20   if( pSort ){.  
9bb0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 52        assert( nR
9bc0: 65 73 75 6c 74 43 6f 6c 3c 3d 70 44 65 73 74 2d  esultCol<=pDest-
9bd0: 3e 6e 53 64 73 74 20 29 3b 0a 20 20 20 20 20 20  >nSdst );.      
9be0: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
9bf0: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  (.            pP
9c00: 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20  arse, pSort, p, 
9c10: 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72  regResult, regOr
9c20: 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20  ig, nResultCol, 
9c30: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20  nPrefixReg);.   
9c40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9c50: 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c    assert( nResul
9c60: 74 43 6f 6c 3d 3d 70 44 65 73 74 2d 3e 6e 53 64  tCol==pDest->nSd
9c70: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  st );.        as
9c80: 73 65 72 74 28 20 72 65 67 52 65 73 75 6c 74 3d  sert( regResult=
9c90: 3d 69 50 61 72 6d 20 29 3b 0a 20 20 20 20 20 20  =iParm );.      
9ca0: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
9cb0: 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20  lause will jump 
9cc0: 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
9cd0: 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
9ce0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
9cf0: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23     }.#endif /* #
9d00: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9d10: 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
9d20: 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72      case SRT_Cor
9d30: 6f 75 74 69 6e 65 3a 20 20 20 20 20 20 20 2f 2a  outine:       /*
9d40: 20 53 65 6e 64 20 64 61 74 61 20 74 6f 20 61 20   Send data to a 
9d50: 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  co-routine */.  
9d60: 20 20 63 61 73 65 20 53 52 54 5f 4f 75 74 70 75    case SRT_Outpu
9d70: 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 52  t: {        /* R
9d80: 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
9d90: 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  s */.      testc
9da0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
9db0: 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20  Coroutine );.   
9dc0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
9dd0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
9de0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72  ;.      if( pSor
9df0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  t ){.        pus
9e00: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
9e10: 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65  se, pSort, p, re
9e20: 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67  gResult, regOrig
9e30: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20  , nResultCol,.  
9e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e50: 20 20 20 20 20 6e 50 72 65 66 69 78 52 65 67 29       nPrefixReg)
9e60: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
9e70: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
9e80: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  outine ){.      
9e90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9ea0: 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
9eb0: 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29   pDest->iSDParm)
9ec0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
9ed0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
9ee0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
9ef0: 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73  esultRow, regRes
9f00: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  ult, nResultCol)
9f10: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
9f20: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
9f30: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
9f40: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
9f50: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d  ultCol);.      }
9f60: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9f70: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
9f80: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20  ITE_OMIT_CTE.   
9f90: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65   /* Write the re
9fa0: 73 75 6c 74 73 20 69 6e 74 6f 20 61 20 70 72 69  sults into a pri
9fb0: 6f 72 69 74 79 20 71 75 65 75 65 20 74 68 61 74  ority queue that
9fc0: 20 69 73 20 6f 72 64 65 72 20 61 63 63 6f 72 64   is order accord
9fd0: 69 6e 67 20 74 6f 0a 20 20 20 20 2a 2a 20 70 44  ing to.    ** pD
9fe0: 65 73 74 2d 3e 70 4f 72 64 65 72 42 79 20 28 69  est->pOrderBy (i
9ff0: 6e 20 70 53 4f 29 2e 20 20 70 44 65 73 74 2d 3e  n pSO).  pDest->
a000: 69 53 44 50 61 72 6d 20 28 69 6e 20 69 50 61 72  iSDParm (in iPar
a010: 6d 29 20 69 73 20 74 68 65 20 63 75 72 73 6f 72  m) is the cursor
a020: 20 66 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 69   for an.    ** i
a030: 6e 64 65 78 20 77 69 74 68 20 70 53 4f 2d 3e 6e  ndex with pSO->n
a040: 45 78 70 72 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20  Expr+2 columns. 
a050: 20 42 75 69 6c 64 20 61 20 6b 65 79 20 75 73 69   Build a key usi
a060: 6e 67 20 70 53 4f 20 66 6f 72 20 74 68 65 20 66  ng pSO for the f
a070: 69 72 73 74 0a 20 20 20 20 2a 2a 20 70 53 4f 2d  irst.    ** pSO-
a080: 3e 6e 45 78 70 72 20 63 6f 6c 75 6d 6e 73 2c 20  >nExpr columns, 
a090: 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 61  then make sure a
a0a0: 6c 6c 20 6b 65 79 73 20 61 72 65 20 75 6e 69 71  ll keys are uniq
a0b0: 75 65 20 62 79 20 61 64 64 69 6e 67 20 61 0a 20  ue by adding a. 
a0c0: 20 20 20 2a 2a 20 66 69 6e 61 6c 20 4f 50 5f 53     ** final OP_S
a0d0: 65 71 75 65 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20  equence column. 
a0e0: 20 54 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   The last column
a0f0: 20 69 73 20 74 68 65 20 72 65 63 6f 72 64 20 61   is the record a
a100: 73 20 61 20 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f  s a blob..    */
a110: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 44 69  .    case SRT_Di
a120: 73 74 51 75 65 75 65 3a 0a 20 20 20 20 63 61 73  stQueue:.    cas
a130: 65 20 53 52 54 5f 51 75 65 75 65 3a 20 7b 0a 20  e SRT_Queue: {. 
a140: 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20       int nKey;. 
a150: 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c       int r1, r2,
a160: 20 72 33 3b 0a 20 20 20 20 20 20 69 6e 74 20 61   r3;.      int a
a170: 64 64 72 54 65 73 74 20 3d 20 30 3b 0a 20 20 20  ddrTest = 0;.   
a180: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 53 4f     ExprList *pSO
a190: 3b 0a 20 20 20 20 20 20 70 53 4f 20 3d 20 70 44  ;.      pSO = pD
a1a0: 65 73 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  est->pOrderBy;. 
a1b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 4f       assert( pSO
a1c0: 20 29 3b 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d   );.      nKey =
a1d0: 20 70 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20 20 20   pSO->nExpr;.   
a1e0: 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
a1f0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
a200: 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
a210: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
a220: 65 28 70 50 61 72 73 65 2c 20 6e 4b 65 79 2b 32  e(pParse, nKey+2
a230: 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20 72 32  );.      r3 = r2
a240: 2b 6e 4b 65 79 2b 31 3b 0a 20 20 20 20 20 20 69  +nKey+1;.      i
a250: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  f( eDest==SRT_Di
a260: 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20  stQueue ){.     
a270: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73     /* If the des
a280: 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74  tination is Dist
a290: 51 75 65 75 65 2c 20 74 68 65 6e 20 63 75 72 73  Queue, then curs
a2a0: 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20  or (iParm+1) is 
a2b0: 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  open.        ** 
a2c0: 6f 6e 20 61 20 73 65 63 6f 6e 64 20 65 70 68 65  on a second ephe
a2d0: 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 68 61 74  meral index that
a2e0: 20 68 6f 6c 64 73 20 61 6c 6c 20 76 61 6c 75 65   holds all value
a2f0: 73 20 65 76 65 72 79 20 70 72 65 76 69 6f 75 73  s every previous
a300: 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64  ly.        ** ad
a310: 64 65 64 20 74 6f 20 74 68 65 20 71 75 65 75 65  ded to the queue
a320: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 64 64  . */.        add
a330: 72 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56  rTest = sqlite3V
a340: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
a350: 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b  OP_Found, iParm+
a360: 31 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  1, 0, .         
a370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
a390: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
a3a0: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 56  tCol);.        V
a3b0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
a3c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
a3d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
a3e0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
a3f0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
a400: 73 75 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a 20 20  sultCol, r3);.  
a410: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
a420: 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a  RT_DistQueue ){.
a430: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a440: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a450: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
a460: 2b 31 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20  +1, r3);.       
a470: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
a480: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55  geP5(v, OPFLAG_U
a490: 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20  SESEEKRESULT);. 
a4a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
a4b0: 28 69 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b  (i=0; i<nKey; i+
a4c0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
a4d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a4e0: 20 4f 50 5f 53 43 6f 70 79 2c 0a 20 20 20 20 20   OP_SCopy,.     
a4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a500: 20 20 20 20 20 72 65 67 52 65 73 75 6c 74 20 2b       regResult +
a510: 20 70 53 4f 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69   pSO->a[i].u.x.i
a520: 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 2c 0a  OrderByCol - 1,.
a530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a540: 20 20 20 20 20 20 20 20 20 20 72 32 2b 69 29 3b            r2+i);
a550: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
a560: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a570: 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c  (v, OP_Sequence,
a580: 20 69 50 61 72 6d 2c 20 72 32 2b 6e 4b 65 79 29   iParm, r2+nKey)
a590: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
a5a0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
a5b0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 32 2c 20  MakeRecord, r2, 
a5c0: 6e 4b 65 79 2b 32 2c 20 72 31 29 3b 0a 20 20 20  nKey+2, r1);.   
a5d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a5e0: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64  dOp4Int(v, OP_Id
a5f0: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  xInsert, iParm, 
a600: 72 31 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b  r1, r2, nKey+2);
a610: 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72 54  .      if( addrT
a620: 65 73 74 20 29 20 73 71 6c 69 74 65 33 56 64 62  est ) sqlite3Vdb
a630: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
a640: 72 54 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71  rTest);.      sq
a650: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
a660: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
a670: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
a680: 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
a690: 50 61 72 73 65 2c 20 72 32 2c 20 6e 4b 65 79 2b  Parse, r2, nKey+
a6a0: 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  2);.      break;
a6b0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
a6c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
a6d0: 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69   */....#if !defi
a6e0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
a6f0: 54 52 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20  TRIGGER).    /* 
a700: 44 69 73 63 61 72 64 20 74 68 65 20 72 65 73 75  Discard the resu
a710: 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  lts.  This is us
a720: 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74  ed for SELECT st
a730: 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a  atements inside.
a740: 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20      ** the body 
a750: 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20 20 54  of a TRIGGER.  T
a760: 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75  he purpose of su
a770: 63 68 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f  ch selects is to
a780: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65   call.    ** use
a790: 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
a7a0: 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 73 69  ons that have si
a7b0: 64 65 20 65 66 66 65 63 74 73 2e 20 20 57 65 20  de effects.  We 
a7c0: 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20  do not care.    
a7d0: 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63 74  ** about the act
a7e0: 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74  ual results of t
a7f0: 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a  he select..    *
a800: 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  /.    default: {
a810: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
a820: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72  Dest==SRT_Discar
a830: 64 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d );.      break
a840: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
a850: 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f   }..  /* Jump to
a860: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
a870: 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49  loop if the LIMI
a880: 54 20 69 73 20 72 65 61 63 68 65 64 2e 20 20 45  T is reached.  E
a890: 78 63 65 70 74 2c 20 69 66 0a 20 20 2a 2a 20 74  xcept, if.  ** t
a8a0: 68 65 72 65 20 69 73 20 61 20 73 6f 72 74 65 72  here is a sorter
a8b0: 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  , in which case 
a8c0: 74 68 65 20 73 6f 72 74 65 72 20 68 61 73 20 61  the sorter has a
a8d0: 6c 72 65 61 64 79 20 6c 69 6d 69 74 65 64 0a 20  lready limited. 
a8e0: 20 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 20 66   ** the output f
a8f0: 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  or us..  */.  if
a900: 28 20 70 53 6f 72 74 3d 3d 30 20 26 26 20 70 2d  ( pSort==0 && p-
a910: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  >iLimit ){.    s
a920: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a930: 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a  (v, OP_DecrJumpZ
a940: 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
a950: 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  iBreak); VdbeCov
a960: 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a  erage(v);.  }.}.
a970: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
a980: 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  a KeyInfo object
a990: 20 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20   sufficient for 
a9a0: 61 6e 20 69 6e 64 65 78 20 6f 66 20 4e 20 6b 65  an index of N ke
a9b0: 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a  y columns and.**
a9c0: 20 58 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73   X extra columns
a9d0: 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71  ..*/.KeyInfo *sq
a9e0: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
a9f0: 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  c(sqlite3 *db, i
aa00: 6e 74 20 4e 2c 20 69 6e 74 20 58 29 7b 0a 20 20  nt N, int X){.  
aa10: 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 28 4e 2b  int nExtra = (N+
aa20: 58 29 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  X)*(sizeof(CollS
aa30: 65 71 2a 29 2b 31 29 20 2d 20 73 69 7a 65 6f 66  eq*)+1) - sizeof
aa40: 28 43 6f 6c 6c 53 65 71 2a 29 3b 0a 20 20 4b 65  (CollSeq*);.  Ke
aa50: 79 49 6e 66 6f 20 2a 70 20 3d 20 73 71 6c 69 74  yInfo *p = sqlit
aa60: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
aa70: 64 62 2c 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e  db, sizeof(KeyIn
aa80: 66 6f 29 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20  fo) + nExtra);. 
aa90: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d   if( p ){.    p-
aaa0: 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
aab0: 38 2a 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58  8*)&p->aColl[N+X
aac0: 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 46 69  ];.    p->nKeyFi
aad0: 65 6c 64 20 3d 20 28 75 31 36 29 4e 3b 0a 20 20  eld = (u16)N;.  
aae0: 20 20 70 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 3d    p->nAllField =
aaf0: 20 28 75 31 36 29 28 4e 2b 58 29 3b 0a 20 20 20   (u16)(N+X);.   
ab00: 20 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62   p->enc = ENC(db
ab10: 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64  );.    p->db = d
ab20: 62 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d  b;.    p->nRef =
ab30: 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   1;.    memset(&
ab40: 70 5b 31 5d 2c 20 30 2c 20 6e 45 78 74 72 61 29  p[1], 0, nExtra)
ab50: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
ab60: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
ab70: 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  b);.  }.  return
ab80: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61   p;.}../*.** Dea
ab90: 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66  llocate a KeyInf
aba0: 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64  o object.*/.void
abb0: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
abc0: 6e 72 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29  nref(KeyInfo *p)
abd0: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
abe0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66   assert( p->nRef
abf0: 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  >0 );.    p->nRe
ac00: 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  f--;.    if( p->
ac10: 6e 52 65 66 3d 3d 30 20 29 20 73 71 6c 69 74 65  nRef==0 ) sqlite
ac20: 33 44 62 46 72 65 65 4e 4e 28 70 2d 3e 64 62 2c  3DbFreeNN(p->db,
ac30: 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   p);.  }.}../*.*
ac40: 2a 20 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f 69  * Make a new poi
ac50: 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66  nter to a KeyInf
ac60: 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49  o object.*/.KeyI
ac70: 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49  nfo *sqlite3KeyI
ac80: 6e 66 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a  nfoRef(KeyInfo *
ac90: 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
aca0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52     assert( p->nR
acb0: 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e  ef>0 );.    p->n
acc0: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  Ref++;.  }.  ret
acd0: 75 72 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66  urn p;.}..#ifdef
ace0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
acf0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
ad00: 69 66 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a  if a KeyInfo obj
ad10: 65 63 74 20 63 61 6e 20 62 65 20 63 68 61 6e 67  ect can be chang
ad20: 65 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20  e.  The KeyInfo 
ad30: 6f 62 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e  object.** can on
ad40: 6c 79 20 62 65 20 63 68 61 6e 67 65 64 20 69 66  ly be changed if
ad50: 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 61 20   this is just a 
ad60: 73 69 6e 67 6c 65 20 72 65 66 65 72 65 6e 63 65  single reference
ad70: 20 74 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a   to the object..
ad80: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
ad90: 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  ne is used only 
ada0: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
adb0: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  () statements..*
adc0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4b 65 79  /.int sqlite3Key
add0: 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
ade0: 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74  KeyInfo *p){ ret
adf0: 75 72 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20  urn p->nRef==1; 
ae00: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
ae10: 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a  TE_DEBUG */../*.
ae20: 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72  ** Given an expr
ae30: 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e  ession list, gen
ae40: 65 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  erate a KeyInfo 
ae50: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
ae60: 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f  ecords.** the co
ae70: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
ae80: 20 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 73   for each expres
ae90: 73 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70  sion in that exp
aea0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
aeb0: 0a 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c  .** If the ExprL
aec0: 69 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ist is an ORDER 
aed0: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
aee0: 6c 61 75 73 65 20 74 68 65 6e 20 74 68 65 20 72  lause then the r
aef0: 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49  esulting.** KeyI
af00: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
af10: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
af20: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20   initializing a 
af30: 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f  virtual index to
af40: 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  .** implement th
af50: 61 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74  at clause.  If t
af60: 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 74  he ExprList is t
af70: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
af80: 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65   a SELECT.** the
af90: 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  n the KeyInfo st
afa0: 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f  ructure is appro
afb0: 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69  priate for initi
afc0: 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61  alizing a virtua
afd0: 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d  l.** index to im
afe0: 70 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e  plement a DISTIN
aff0: 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53  CT test..**.** S
b000: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
b010: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
b020: 72 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  re is obtained f
b030: 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65  rom malloc.  The
b040: 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63   calling.** func
b050: 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69  tion is responsi
b060: 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74  ble for seeing t
b070: 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75  hat this structu
b080: 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79  re is eventually
b090: 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74  .** freed..*/.st
b0a0: 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65  atic KeyInfo *ke
b0b0: 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
b0c0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
b0d0: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
b0e0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
b0f0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
b100: 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74  t,     /* Form t
b110: 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63  he KeyInfo objec
b120: 74 20 66 72 6f 6d 20 74 68 69 73 20 45 78 70 72  t from this Expr
b130: 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53  List */.  int iS
b140: 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 20 2f  tart,          /
b150: 2a 20 42 65 67 69 6e 20 77 69 74 68 20 74 68 69  * Begin with thi
b160: 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73  s column of pLis
b170: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  t */.  int nExtr
b180: 61 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  a           /* A
b190: 64 64 20 74 68 69 73 20 6d 61 6e 79 20 65 78 74  dd this many ext
b1a0: 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68  ra columns to th
b1b0: 65 20 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  e end */.){.  in
b1c0: 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e  t nExpr;.  KeyIn
b1d0: 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72  fo *pInfo;.  str
b1e0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
b1f0: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69  m *pItem;.  sqli
b200: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
b210: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  ->db;.  int i;..
b220: 20 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d    nExpr = pList-
b230: 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20  >nExpr;.  pInfo 
b240: 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
b250: 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2d  Alloc(db, nExpr-
b260: 69 53 74 61 72 74 2c 20 6e 45 78 74 72 61 2b 31  iStart, nExtra+1
b270: 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29  );.  if( pInfo )
b280: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
b290: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
b2a0: 69 74 65 61 62 6c 65 28 70 49 6e 66 6f 29 20 29  iteable(pInfo) )
b2b0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 69 53 74 61  ;.    for(i=iSta
b2c0: 72 74 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  rt, pItem=pList-
b2d0: 3e 61 2b 69 53 74 61 72 74 3b 20 69 3c 6e 45 78  >a+iStart; i<nEx
b2e0: 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
b2f0: 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  ){.      pInfo->
b300: 61 43 6f 6c 6c 5b 69 2d 69 53 74 61 72 74 5d 20  aColl[i-iStart] 
b310: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43  = sqlite3ExprNNC
b320: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
b330: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
b340: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74      pInfo->aSort
b350: 4f 72 64 65 72 5b 69 2d 69 53 74 61 72 74 5d 20  Order[i-iStart] 
b360: 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64  = pItem->sortOrd
b370: 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  er;.    }.  }.  
b380: 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a  return pInfo;.}.
b390: 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74  ./*.** Name of t
b3a0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70  he connection op
b3b0: 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72  erator, used for
b3c0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e   error messages.
b3d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
b3e0: 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e   char *selectOpN
b3f0: 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63  ame(int id){.  c
b400: 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68  har *z;.  switch
b410: 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65  ( id ){.    case
b420: 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a   TK_ALL:       z
b430: 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20   = "UNION ALL"; 
b440: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
b450: 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20  e TK_INTERSECT: 
b460: 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b  z = "INTERSECT";
b470: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
b480: 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20  se TK_EXCEPT:   
b490: 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20   z = "EXCEPT";  
b4a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
b4b0: 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20  efault:         
b4c0: 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20    z = "UNION";  
b4d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
b4e0: 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23    return z;.}..#
b4f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b500: 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a  IT_EXPLAIN./*.**
b510: 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c   Unless an "EXPL
b520: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20  AIN QUERY PLAN" 
b530: 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67  command is being
b540: 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73   processed, this
b550: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
b560: 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  a no-op. Otherwi
b570: 73 65 2c 20 69 74 20 61 64 64 73 20 61 20 73 69  se, it adds a si
b580: 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70  ngle row of outp
b590: 75 74 20 74 6f 20 74 68 65 20 45 51 50 20 72 65  ut to the EQP re
b5a0: 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74  sult,.** where t
b5b0: 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66  he caption is of
b5c0: 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
b5d0: 20 20 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54     "USE TEMP B-T
b5e0: 52 45 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a  REE FOR xxx".**.
b5f0: 2a 2a 20 77 68 65 72 65 20 78 78 78 20 69 73 20  ** where xxx is 
b600: 6f 6e 65 20 6f 66 20 22 44 49 53 54 49 4e 43 54  one of "DISTINCT
b610: 22 2c 20 22 4f 52 44 45 52 20 42 59 22 20 6f 72  ", "ORDER BY" or
b620: 20 22 47 52 4f 55 50 20 42 59 22 2e 20 45 78 61   "GROUP BY". Exa
b630: 63 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69 73  ctly which.** is
b640: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
b650: 68 65 20 7a 55 73 61 67 65 20 61 72 67 75 6d 65  he zUsage argume
b660: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
b670: 69 64 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61  id explainTempTa
b680: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
b690: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
b6a0: 55 73 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50  Usage){.  if( pP
b6b0: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
b6c0: 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   ){.    Vdbe *v 
b6d0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
b6e0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20  .    char *zMsg 
b6f0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
b700: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 55 53  (pParse->db, "US
b710: 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f  E TEMP B-TREE FO
b720: 52 20 25 73 22 2c 20 7a 55 73 61 67 65 29 3b 0a  R %s", zUsage);.
b730: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b740: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c  ddOp4(v, OP_Expl
b750: 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65  ain, pParse->iSe
b760: 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d  lectId, 0, 0, zM
b770: 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  sg, P4_DYNAMIC);
b780: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73  .  }.}../*.** As
b790: 73 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  sign expression 
b7a0: 62 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41  b to lvalue a. A
b7b0: 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20   second, no-op, 
b7c0: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20  version of this 
b7d0: 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76  macro.** is prov
b7e0: 69 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45  ided when SQLITE
b7f0: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73  _OMIT_EXPLAIN is
b800: 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20 61   defined. This a
b810: 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a 2a  llows the code.*
b820: 2a 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65  * in sqlite3Sele
b830: 63 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20 76  ct() to assign v
b840: 61 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74 75  alues to structu
b850: 72 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62  re member variab
b860: 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79  les that.** only
b870: 20 65 78 69 73 74 20 69 66 20 53 51 4c 49 54 45   exist if SQLITE
b880: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73  _OMIT_EXPLAIN is
b890: 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69 74   not defined wit
b8a0: 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74  hout polluting t
b8b0: 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 20  he.** code with 
b8c0: 23 69 66 6e 64 65 66 20 64 69 72 65 63 74 69 76  #ifndef directiv
b8d0: 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20  es..*/.# define 
b8e0: 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
b8f0: 72 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23  r(a, b) a = b..#
b900: 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65  else./* No-op ve
b910: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78  rsions of the ex
b920: 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74  plainXXX() funct
b930: 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e  ions and macros.
b940: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70   */.# define exp
b950: 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c  lainTempTable(y,
b960: 7a 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  z).# define expl
b970: 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c  ainSetInteger(y,
b980: 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  z).#endif..#if !
b990: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
b9a0: 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 26 26 20  MIT_EXPLAIN) && 
b9b0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
b9c0: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
b9d0: 4c 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65  LECT)./*.** Unle
b9e0: 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51  ss an "EXPLAIN Q
b9f0: 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61  UERY PLAN" comma
ba00: 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63  nd is being proc
ba10: 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63  essed, this func
ba20: 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  tion.** is a no-
ba30: 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  op. Otherwise, i
ba40: 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20  t adds a single 
ba50: 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f  row of output to
ba60: 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c   the EQP result,
ba70: 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61  .** where the ca
ba80: 70 74 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65 20  ption is of one 
ba90: 6f 66 20 74 68 65 20 74 77 6f 20 66 6f 72 6d 73  of the two forms
baa0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f  :.**.**   "COMPO
bab0: 53 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20  SITE SUBQUERIES 
bac0: 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20  iSub1 and iSub2 
bad0: 28 6f 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d 50  (op)".**   "COMP
bae0: 4f 53 49 54 45 20 53 55 42 51 55 45 52 49 45 53  OSITE SUBQUERIES
baf0: 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32   iSub1 and iSub2
bb00: 20 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52   USING TEMP B-TR
bb10: 45 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77  EE (op)".**.** w
bb20: 68 65 72 65 20 69 53 75 62 31 20 61 6e 64 20 69  here iSub1 and i
bb30: 53 75 62 32 20 61 72 65 20 74 68 65 20 69 6e 74  Sub2 are the int
bb40: 65 67 65 72 73 20 70 61 73 73 65 64 20 61 73 20  egers passed as 
bb50: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
bb60: 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61  g.** function pa
bb70: 72 61 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f 70  rameters, and op
bb80: 20 69 73 20 74 68 65 20 74 65 78 74 20 72 65 70   is the text rep
bb90: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
bba0: 68 65 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  he parameter.** 
bbb0: 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  of the same name
bbc0: 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20  . The parameter 
bbd0: 22 6f 70 22 20 6d 75 73 74 20 62 65 20 6f 6e 65  "op" must be one
bbe0: 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b   of TK_UNION, TK
bbf0: 5f 45 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49  _EXCEPT,.** TK_I
bc00: 4e 54 45 52 53 45 43 54 20 6f 72 20 54 4b 5f 41  NTERSECT or TK_A
bc10: 4c 4c 2e 20 54 68 65 20 66 69 72 73 74 20 66 6f  LL. The first fo
bc20: 72 6d 20 69 73 20 75 73 65 64 20 69 66 20 61 72  rm is used if ar
bc30: 67 75 6d 65 6e 74 20 62 55 73 65 54 6d 70 20 69  gument bUseTmp i
bc40: 73 20 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72 20  s .** false, or 
bc50: 74 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20  the second form 
bc60: 69 66 20 69 74 20 69 73 20 74 72 75 65 2e 0a 2a  if it is true..*
bc70: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
bc80: 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 0a  plainComposite(.
bc90: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
bca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcb0: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
bcc0: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  xt */.  int op, 
bcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bce0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
bcf0: 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45  f TK_UNION, TK_E
bd00: 58 43 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20 20  XCEPT etc. */.  
bd10: 69 6e 74 20 69 53 75 62 31 2c 20 20 20 20 20 20  int iSub1,      
bd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd30: 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64 20 31  /* Subquery id 1
bd40: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 2c   */.  int iSub2,
bd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd60: 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72        /* Subquer
bd70: 79 20 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74 20  y id 2 */.  int 
bd80: 62 55 73 65 54 6d 70 20 20 20 20 20 20 20 20 20  bUseTmp         
bd90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
bda0: 72 75 65 20 69 66 20 61 20 74 65 6d 70 20 74 61  rue if a temp ta
bdb0: 62 6c 65 20 77 61 73 20 75 73 65 64 20 2a 2f 0a  ble was used */.
bdc0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d  ){.  assert( op=
bdd0: 3d 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d  =TK_UNION || op=
bde0: 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70  =TK_EXCEPT || op
bdf0: 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 7c  ==TK_INTERSECT |
be00: 7c 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a  | op==TK_ALL );.
be10: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
be20: 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
be30: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
be40: 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61  ->pVdbe;.    cha
be50: 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65  r *zMsg = sqlite
be60: 33 4d 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  3MPrintf(.      
be70: 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 43    pParse->db, "C
be80: 4f 4d 50 4f 55 4e 44 20 53 55 42 51 55 45 52 49  OMPOUND SUBQUERI
be90: 45 53 20 25 64 20 41 4e 44 20 25 64 20 25 73 28  ES %d AND %d %s(
bea0: 25 73 29 22 2c 20 69 53 75 62 31 2c 20 69 53 75  %s)", iSub1, iSu
beb0: 62 32 2c 0a 20 20 20 20 20 20 20 20 62 55 73 65  b2,.        bUse
bec0: 54 6d 70 3f 22 55 53 49 4e 47 20 54 45 4d 50 20  Tmp?"USING TEMP 
bed0: 42 2d 54 52 45 45 20 22 3a 22 22 2c 20 73 65 6c  B-TREE ":"", sel
bee0: 65 63 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20 20  ectOpName(op).  
bef0: 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
bf00: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
bf10: 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65  _Explain, pParse
bf20: 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20  ->iSelectId, 0, 
bf30: 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41  0, zMsg, P4_DYNA
bf40: 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  MIC);.  }.}.#els
bf50: 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69  e./* No-op versi
bf60: 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61  ons of the expla
bf70: 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e  inXXX() function
bf80: 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f  s and macros. */
bf90: 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
bfa0: 6e 43 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c 78  nComposite(v,w,x
bfb0: 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,y,z).#endif../*
bfc0: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72  .** If the inner
bfd0: 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61   loop was genera
bfe0: 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d  ted using a non-
bff0: 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72  null pOrderBy ar
c000: 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20  gument,.** then 
c010: 74 68 65 20 72 65 73 75 6c 74 73 20 77 65 72 65  the results were
c020: 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72   placed in a sor
c030: 74 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20  ter.  After the 
c040: 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74  loop is terminat
c050: 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f  ed.** we need to
c060: 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20   run the sorter 
c070: 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72  and output the r
c080: 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c  esults.  The fol
c090: 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e  lowing.** routin
c0a0: 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  e generates the 
c0b0: 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64  code needed to d
c0c0: 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69  o that..*/.stati
c0d0: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53  c void generateS
c0e0: 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65  ortTail(.  Parse
c0f0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
c100: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
c110: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
c120: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
c130: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
c140: 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f  /.  SortCtx *pSo
c150: 72 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61  rt,   /* Informa
c160: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45  tion on the ORDE
c170: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
c180: 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20   int nColumn,   
c190: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c1a0: 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20  columns of data 
c1b0: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
c1c0: 2a 70 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20  *pDest /* Write 
c1d0: 74 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c  the sorted resul
c1e0: 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
c1f0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
c200: 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20 20  ->pVdbe;        
c210: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c220: 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
c230: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
c240: 61 64 64 72 42 72 65 61 6b 20 3d 20 70 53 6f 72  addrBreak = pSor
c250: 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20  t->labelDone;   
c260: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
c270: 20 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f   here to exit lo
c280: 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  op */.  int addr
c290: 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74  Continue = sqlit
c2a0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
c2b0: 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  v);  /* Jump her
c2c0: 65 20 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65  e for next cycle
c2d0: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 20   */.  int addr; 
c2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2f0: 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
c300: 6f 75 74 70 75 74 20 6c 6f 6f 70 2e 20 4a 75 6d  output loop. Jum
c310: 70 20 66 6f 72 20 4e 65 78 74 2e 20 2a 2f 0a 20  p for Next. */. 
c320: 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20   int addrOnce = 
c330: 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  0;.  int iTab;. 
c340: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
c350: 72 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72  rBy = pSort->pOr
c360: 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 65 44 65  derBy;.  int eDe
c370: 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73  st = pDest->eDes
c380: 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d  t;.  int iParm =
c390: 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b   pDest->iSDParm;
c3a0: 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20  .  int regRow;. 
c3b0: 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 20   int regRowid;. 
c3c0: 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69 6e 74   int iCol;.  int
c3d0: 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20   nKey;          
c3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c3f0: 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79 20 63 6f  Number of key co
c400: 6c 75 6d 6e 73 20 69 6e 20 73 6f 72 74 65 72 20  lumns in sorter 
c410: 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
c420: 69 53 6f 72 74 54 61 62 3b 20 20 20 20 20 20 20  iSortTab;       
c430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
c440: 6f 72 74 65 72 20 63 75 72 73 6f 72 20 74 6f 20  orter cursor to 
c450: 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  read from */.  i
c460: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 53 65 71  nt i;.  int bSeq
c470: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c480: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
c490: 69 66 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  if sorter record
c4a0: 20 69 6e 63 6c 75 64 65 73 20 73 65 71 2e 20 6e   includes seq. n
c4b0: 6f 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  o. */.  int nRef
c4c0: 4b 65 79 20 3d 20 30 3b 0a 20 20 73 74 72 75 63  Key = 0;.  struc
c4d0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
c4e0: 2a 61 4f 75 74 45 78 20 3d 20 70 2d 3e 70 45 4c  *aOutEx = p->pEL
c4f0: 69 73 74 2d 3e 61 3b 0a 0a 20 20 61 73 73 65 72  ist->a;..  asser
c500: 74 28 20 61 64 64 72 42 72 65 61 6b 3c 30 20 29  t( addrBreak<0 )
c510: 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c  ;.  if( pSort->l
c520: 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20  abelBkOut ){.   
c530: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c540: 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
c550: 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e  pSort->regReturn
c560: 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  , pSort->labelBk
c570: 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Out);.    sqlite
c580: 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64  3VdbeGoto(v, add
c590: 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 73 71 6c  rBreak);.    sql
c5a0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
c5b0: 61 62 65 6c 28 76 2c 20 70 53 6f 72 74 2d 3e 6c  abel(v, pSort->l
c5c0: 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 7d 0a  abelBkOut);.  }.
c5d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
c5e0: 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
c5f0: 45 52 45 4e 43 45 53 0a 20 20 2f 2a 20 4f 70 65  ERENCES.  /* Ope
c600: 6e 20 61 6e 79 20 63 75 72 73 6f 72 73 20 6e 65  n any cursors ne
c610: 65 64 65 64 20 66 6f 72 20 73 6f 72 74 65 72 2d  eded for sorter-
c620: 72 65 66 65 72 65 6e 63 65 20 65 78 70 72 65 73  reference expres
c630: 73 69 6f 6e 73 20 2a 2f 0a 20 20 66 6f 72 28 69  sions */.  for(i
c640: 3d 30 3b 20 69 3c 70 53 6f 72 74 2d 3e 6e 44 65  =0; i<pSort->nDe
c650: 66 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54  fer; i++){.    T
c660: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 53 6f  able *pTab = pSo
c670: 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 70 54  rt->aDefer[i].pT
c680: 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 44 62 20  ab;.    int iDb 
c690: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
c6a0: 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
c6b0: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
c6c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70  );.    sqlite3Op
c6d0: 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
c6e0: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d  pSort->aDefer[i]
c6f0: 2e 69 43 73 72 2c 20 69 44 62 2c 20 70 54 61 62  .iCsr, iDb, pTab
c700: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a  , OP_OpenRead);.
c710: 20 20 20 20 6e 52 65 66 4b 65 79 20 3d 20 4d 41      nRefKey = MA
c720: 58 28 6e 52 65 66 4b 65 79 2c 20 70 53 6f 72 74  X(nRefKey, pSort
c730: 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 6e 4b 65 79  ->aDefer[i].nKey
c740: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
c750: 20 69 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e 69   iTab = pSort->i
c760: 45 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 65  ECursor;.  if( e
c770: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
c780: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
c790: 6f 72 6f 75 74 69 6e 65 20 7c 7c 20 65 44 65 73  oroutine || eDes
c7a0: 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a 20 20  t==SRT_Mem ){.  
c7b0: 20 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 0a    regRowid = 0;.
c7c0: 20 20 20 20 72 65 67 52 6f 77 20 3d 20 70 44 65      regRow = pDe
c7d0: 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20 7d 65 6c  st->iSdst;.  }el
c7e0: 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64  se{.    regRowid
c7f0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
c800: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
c810: 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74    regRow = sqlit
c820: 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
c830: 50 61 72 73 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  Parse, nColumn);
c840: 0a 20 20 7d 0a 20 20 6e 4b 65 79 20 3d 20 70 4f  .  }.  nKey = pO
c850: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2d 20  rderBy->nExpr - 
c860: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20  pSort->nOBSat;. 
c870: 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74   if( pSort->sort
c880: 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47  Flags & SORTFLAG
c890: 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20  _UseSorter ){.  
c8a0: 20 20 69 6e 74 20 72 65 67 53 6f 72 74 4f 75 74    int regSortOut
c8b0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
c8c0: 6d 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62 20  m;.    iSortTab 
c8d0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
c8e0: 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d  ;.    if( pSort-
c8f0: 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20  >labelBkOut ){. 
c900: 20 20 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20       addrOnce = 
c910: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c920: 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56  0(v, OP_Once); V
c930: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
c940: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
c950: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
c960: 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 53  P_OpenPseudo, iS
c970: 6f 72 74 54 61 62 2c 20 72 65 67 53 6f 72 74 4f  ortTab, regSortO
c980: 75 74 2c 20 0a 20 20 20 20 20 20 20 20 6e 4b 65  ut, .        nKe
c990: 79 2b 31 2b 6e 43 6f 6c 75 6d 6e 2b 6e 52 65 66  y+1+nColumn+nRef
c9a0: 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 61 64  Key);.    if( ad
c9b0: 64 72 4f 6e 63 65 20 29 20 73 71 6c 69 74 65 33  drOnce ) sqlite3
c9c0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
c9d0: 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 61  addrOnce);.    a
c9e0: 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  ddr = 1 + sqlite
c9f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ca00: 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 54  P_SorterSort, iT
ca10: 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  ab, addrBreak);.
ca20: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
ca30: 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66  (v);.    codeOff
ca40: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
ca50: 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  t, addrContinue)
ca60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
ca70: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f  eAddOp3(v, OP_So
ca80: 72 74 65 72 44 61 74 61 2c 20 69 54 61 62 2c 20  rterData, iTab, 
ca90: 72 65 67 53 6f 72 74 4f 75 74 2c 20 69 53 6f 72  regSortOut, iSor
caa0: 74 54 61 62 29 3b 0a 20 20 20 20 62 53 65 71 20  tTab);.    bSeq 
cab0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
cac0: 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c    addr = 1 + sql
cad0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
cae0: 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c  , OP_Sort, iTab,
caf0: 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62   addrBreak); Vdb
cb00: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
cb10: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
cb20: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72  p->iOffset, addr
cb30: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 69  Continue);.    i
cb40: 53 6f 72 74 54 61 62 20 3d 20 69 54 61 62 3b 0a  SortTab = iTab;.
cb50: 20 20 20 20 62 53 65 71 20 3d 20 31 3b 0a 20 20      bSeq = 1;.  
cb60: 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20 69 43 6f  }.  for(i=0, iCo
cb70: 6c 3d 6e 4b 65 79 2b 62 53 65 71 2d 31 3b 20 69  l=nKey+bSeq-1; i
cb80: 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  <nColumn; i++){.
cb90: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
cba0: 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45  ABLE_SORTER_REFE
cbb0: 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20 61  RENCES.    if( a
cbc0: 4f 75 74 45 78 5b 69 5d 2e 62 53 6f 72 74 65 72  OutEx[i].bSorter
cbd0: 52 65 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Ref ) continue;.
cbe0: 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 61  #endif.    if( a
cbf0: 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72  OutEx[i].u.x.iOr
cc00: 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20 69 43  derByCol==0 ) iC
cc10: 6f 6c 2b 2b 3b 0a 20 20 7d 0a 23 69 66 64 65 66  ol++;.  }.#ifdef
cc20: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
cc30: 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53  ORTER_REFERENCES
cc40: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6e 44  .  if( pSort->nD
cc50: 65 66 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  efer ){.    int 
cc60: 69 4b 65 79 20 3d 20 69 43 6f 6c 2b 31 3b 0a 20  iKey = iCol+1;. 
cc70: 20 20 20 69 6e 74 20 72 65 67 4b 65 79 20 3d 20     int regKey = 
cc80: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
cc90: 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 52 65 66  nge(pParse, nRef
cca0: 4b 65 79 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69  Key);..    for(i
ccb0: 3d 30 3b 20 69 3c 70 53 6f 72 74 2d 3e 6e 44 65  =0; i<pSort->nDe
ccc0: 66 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  fer; i++){.     
ccd0: 20 69 6e 74 20 69 43 73 72 20 3d 20 70 53 6f 72   int iCsr = pSor
cce0: 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 69 43 73  t->aDefer[i].iCs
ccf0: 72 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  r;.      Table *
cd00: 70 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e 61 44  pTab = pSort->aD
cd10: 65 66 65 72 5b 69 5d 2e 70 54 61 62 3b 0a 20 20  efer[i].pTab;.  
cd20: 20 20 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70      int nKey = p
cd30: 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e  Sort->aDefer[i].
cd40: 6e 4b 65 79 3b 0a 0a 20 20 20 20 20 20 73 71 6c  nKey;..      sql
cd50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
cd60: 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43  , OP_NullRow, iC
cd70: 73 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 48  sr);.      if( H
cd80: 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b  asRowid(pTab) ){
cd90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
cda0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
cdb0: 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61  _Column, iSortTa
cdc0: 62 2c 20 69 4b 65 79 2b 2b 2c 20 72 65 67 4b 65  b, iKey++, regKe
cdd0: 79 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  y);.        sqli
cde0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
cdf0: 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 69   OP_SeekRowid, i
ce00: 43 73 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Csr, .          
ce10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72    sqlite3VdbeCur
ce20: 72 65 6e 74 41 64 64 72 28 76 29 2b 31 2c 20 72  rentAddr(v)+1, r
ce30: 65 67 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 65  egKey);.      }e
ce40: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 49 6e 64  lse{.        Ind
ce50: 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65  ex *pPk = sqlite
ce60: 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
ce70: 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20  (pTab);.        
ce80: 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 69  int k;.        i
ce90: 6e 74 20 69 4a 6d 70 3b 0a 20 20 20 20 20 20 20  nt iJmp;.       
cea0: 20 61 73 73 65 72 74 28 20 70 50 6b 2d 3e 6e 4b   assert( pPk->nK
ceb0: 65 79 43 6f 6c 3d 3d 6e 4b 65 79 20 29 3b 0a 20  eyCol==nKey );. 
cec0: 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20         for(k=0; 
ced0: 6b 3c 6e 4b 65 79 3b 20 6b 2b 2b 29 7b 0a 20 20  k<nKey; k++){.  
cee0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
cef0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
cf00: 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62  Column, iSortTab
cf10: 2c 20 69 4b 65 79 2b 2b 2c 20 72 65 67 4b 65 79  , iKey++, regKey
cf20: 2b 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  +k);.        }. 
cf30: 20 20 20 20 20 20 20 69 4a 6d 70 20 3d 20 73 71         iJmp = sq
cf40: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
cf50: 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20  Addr(v);.       
cf60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cf70: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53 65 65 6b  p4Int(v, OP_Seek
cf80: 47 45 2c 20 69 43 73 72 2c 20 69 4a 6d 70 2b 32  GE, iCsr, iJmp+2
cf90: 2c 20 72 65 67 4b 65 79 2c 20 6e 4b 65 79 29 3b  , regKey, nKey);
cfa0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
cfb0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
cfc0: 20 4f 50 5f 49 64 78 4c 45 2c 20 69 43 73 72 2c   OP_IdxLE, iCsr,
cfd0: 20 69 4a 6d 70 2b 33 2c 20 72 65 67 4b 65 79 2c   iJmp+3, regKey,
cfe0: 20 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20   nKey);.        
cff0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d000: 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  1(v, OP_NullRow,
d010: 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20 7d 0a   iCsr);.      }.
d020: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
d030: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
d040: 65 28 70 50 61 72 73 65 2c 20 72 65 67 4b 65 79  e(pParse, regKey
d050: 2c 20 6e 52 65 66 4b 65 79 29 3b 0a 20 20 7d 0a  , nRefKey);.  }.
d060: 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 6e  #endif.  for(i=n
d070: 43 6f 6c 75 6d 6e 2d 31 3b 20 69 3e 3d 30 3b 20  Column-1; i>=0; 
d080: 69 2d 2d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  i--){.#ifdef SQL
d090: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45  ITE_ENABLE_SORTE
d0a0: 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20  R_REFERENCES.   
d0b0: 20 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 62   if( aOutEx[i].b
d0c0: 53 6f 72 74 65 72 52 65 66 20 29 7b 0a 20 20 20  SorterRef ){.   
d0d0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
d0e0: 64 65 28 70 50 61 72 73 65 2c 20 61 4f 75 74 45  de(pParse, aOutE
d0f0: 78 5b 69 5d 2e 70 45 78 70 72 2c 20 72 65 67 52  x[i].pExpr, regR
d100: 6f 77 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ow+i);.    }else
d110: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20  .#endif.    {.  
d120: 20 20 20 20 69 6e 74 20 69 52 65 61 64 3b 0a 20      int iRead;. 
d130: 20 20 20 20 20 69 66 28 20 61 4f 75 74 45 78 5b       if( aOutEx[
d140: 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  i].u.x.iOrderByC
d150: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 52  ol ){.        iR
d160: 65 61 64 20 3d 20 61 4f 75 74 45 78 5b 69 5d 2e  ead = aOutEx[i].
d170: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d  u.x.iOrderByCol-
d180: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
d190: 20 20 20 20 20 20 20 20 69 52 65 61 64 20 3d 20          iRead = 
d1a0: 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a  iCol--;.      }.
d1b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d1c0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
d1d0: 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20  lumn, iSortTab, 
d1e0: 69 52 65 61 64 2c 20 72 65 67 52 6f 77 2b 69 29  iRead, regRow+i)
d1f0: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
d200: 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 61 4f  ent((v, "%s", aO
d210: 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 3f 61 4f  utEx[i].zName?aO
d220: 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3a 20  utEx[i].zName : 
d230: 61 4f 75 74 45 78 5b 69 5d 2e 7a 53 70 61 6e 29  aOutEx[i].zSpan)
d240: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
d250: 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a  witch( eDest ){.
d260: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
d270: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
d280: 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
d290: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d2a0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
d2b0: 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  wid, iParm, regR
d2c0: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  owid);.      sql
d2d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
d2e0: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61  , OP_Insert, iPa
d2f0: 72 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52  rm, regRow, regR
d300: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  owid);.      sql
d310: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
d320: 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
d330: 44 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  D);.      break;
d340: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
d350: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
d360: 45 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54  ERY.    case SRT
d370: 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Set: {.      as
d380: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 73  sert( nColumn==s
d390: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
d3a0: 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 29 20  Dest->zAffSdst) 
d3b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d3c0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
d3d0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
d3e0: 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65  Row, nColumn, re
d3f0: 67 52 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20  gRowid,.        
d400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d410: 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c  pDest->zAffSdst,
d420: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
d430: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
d440: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
d450: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20  pParse, regRow, 
d460: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
d470: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d480: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
d490: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67  sert, iParm, reg
d4a0: 52 6f 77 69 64 2c 20 72 65 67 52 6f 77 2c 20 6e  Rowid, regRow, n
d4b0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62  Column);.      b
d4c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
d4d0: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
d4e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
d4f0: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
d500: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
d510: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
d520: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
d530: 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
d540: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
d550: 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t( eDest==SRT_Ou
d560: 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tput || eDest==S
d570: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20  RT_Coroutine ); 
d580: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
d590: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
d5a0: 75 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ut );.      test
d5b0: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
d5c0: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20  _Coroutine );.  
d5d0: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
d5e0: 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
d5f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d600: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
d610: 75 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69  ultRow, pDest->i
d620: 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  Sdst, nColumn);.
d630: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
d640: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
d650: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  Change(pParse, p
d660: 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f  Dest->iSdst, nCo
d670: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lumn);.      }el
d680: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
d690: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
d6a0: 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74   OP_Yield, pDest
d6b0: 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  ->iSDParm);.    
d6c0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
d6d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
d6e0: 20 72 65 67 52 6f 77 69 64 20 29 7b 0a 20 20 20   regRowid ){.   
d6f0: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
d700: 53 65 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Set ){.      sql
d710: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
d720: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
d730: 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Row, nColumn);. 
d740: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d750: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
d760: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
d770: 67 52 6f 77 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gRow);.    }.   
d780: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
d790: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
d7a0: 65 67 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20  egRowid);.  }.  
d7b0: 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66  /* The bottom of
d7c0: 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20   the loop.  */. 
d7d0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
d7e0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
d7f0: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28  Continue);.  if(
d800: 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67   pSort->sortFlag
d810: 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  s & SORTFLAG_Use
d820: 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Sorter ){.    sq
d830: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
d840: 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74  v, OP_SorterNext
d850: 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56  , iTab, addr); V
d860: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
d870: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
d880: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d890: 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c  , OP_Next, iTab,
d8a0: 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65   addr); VdbeCove
d8b0: 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69  rage(v);.  }.  i
d8c0: 66 28 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74  f( pSort->regRet
d8d0: 75 72 6e 20 29 20 73 71 6c 69 74 65 33 56 64 62  urn ) sqlite3Vdb
d8e0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
d8f0: 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 72 65 67  turn, pSort->reg
d900: 52 65 74 75 72 6e 29 3b 0a 20 20 73 71 6c 69 74  Return);.  sqlit
d910: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
d920: 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29  el(v, addrBreak)
d930: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
d940: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
d950: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
d960: 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72 61 74  ng the 'declarat
d970: 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65  ion type' of the
d980: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
d990: 45 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67  Expr. The string
d9a0: 20 6d 61 79 20 62 65 20 74 72 65 61 74 65 64 20   may be treated 
d9b0: 61 73 20 73 74 61 74 69 63 20 62 79 20 74 68 65  as static by the
d9c0: 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41   caller..**.** A
d9d0: 6c 73 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d  lso try to estim
d9e0: 61 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ate the size of 
d9f0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  the returned val
da00: 75 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ue and return th
da10: 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  at.** result in 
da20: 2a 70 45 73 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a  *pEstWidth..**.*
da30: 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f  * The declaratio
da40: 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65 78  n type is the ex
da50: 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65 66  act datatype def
da60: 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65  inition extracte
da70: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72  d from the.** or
da80: 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41  iginal CREATE TA
da90: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66  BLE statement if
daa0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
dab0: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65  is a column. The
dac0: 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  .** declaration 
dad0: 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44  type for a ROWID
dae0: 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45   field is INTEGE
daf0: 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20  R. Exactly when 
db00: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  an expression.**
db10: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
db20: 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63   column can be c
db30: 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72  omplex in the pr
db40: 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65  esence of subque
db50: 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73  ries. The.** res
db60: 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69  ult-set expressi
db70: 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65  on in all of the
db80: 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43   following SELEC
db90: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20  T statements is 
dba0: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61  .** considered a
dbb0: 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20   column by this 
dbc0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
dbd0: 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f    SELECT col FRO
dbe0: 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45  M tbl;.**   SELE
dbf0: 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46  CT (SELECT col F
dc00: 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45  ROM tbl;.**   SE
dc10: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c  LECT (SELECT col
dc20: 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20   FROM tbl);.**  
dc30: 20 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d   SELECT abc FROM
dc40: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20   (SELECT col AS 
dc50: 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a  abc FROM tbl);.*
dc60: 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  * .** The declar
dc70: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
dc80: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74  ny expression ot
dc90: 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d  her than a colum
dca0: 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  n is NULL..**.**
dcb0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61   This routine ha
dcc0: 73 20 65 69 74 68 65 72 20 33 20 6f 72 20 36 20  s either 3 or 6 
dcd0: 70 61 72 61 6d 65 74 65 72 73 20 64 65 70 65 6e  parameters depen
dce0: 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
dcf0: 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 53 51  or not.** the SQ
dd00: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
dd10: 4d 4e 5f 4d 45 54 41 44 41 54 41 20 63 6f 6d 70  MN_METADATA comp
dd20: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
dd30: 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64  is used..*/.#ifd
dd40: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
dd50: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
dd60: 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e  .# define column
dd70: 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 29 20  Type(A,B,C,D,E) 
dd80: 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41  columnTypeImpl(A
dd90: 2c 42 2c 43 2c 44 2c 45 29 0a 23 65 6c 73 65 20  ,B,C,D,E).#else 
dda0: 2f 2a 20 69 66 20 21 64 65 66 69 6e 65 64 28 53  /* if !defined(S
ddb0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
ddc0: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f  UMN_METADATA) */
ddd0: 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e  .# define column
dde0: 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 29 20  Type(A,B,C,D,E) 
ddf0: 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41  columnTypeImpl(A
de00: 2c 42 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69  ,B).#endif.stati
de10: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f  c const char *co
de20: 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20  lumnTypeImpl(.  
de30: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
de40: 2c 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  , .#ifndef SQLIT
de50: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
de60: 4d 45 54 41 44 41 54 41 0a 20 20 45 78 70 72 20  METADATA.  Expr 
de70: 2a 70 45 78 70 72 0a 23 65 6c 73 65 0a 20 20 45  *pExpr.#else.  E
de80: 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f  xpr *pExpr,.  co
de90: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
dea0: 67 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  gDb,.  const cha
deb0: 72 20 2a 2a 70 7a 4f 72 69 67 54 61 62 2c 0a 20  r **pzOrigTab,. 
dec0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
ded0: 4f 72 69 67 43 6f 6c 0a 23 65 6e 64 69 66 0a 29  OrigCol.#endif.)
dee0: 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  {.  char const *
def0: 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zType = 0;.  int
df00: 20 6a 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   j;.#ifdef SQLIT
df10: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
df20: 4d 45 54 41 44 41 54 41 0a 20 20 63 68 61 72 20  METADATA.  char 
df30: 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d  const *zOrigDb =
df40: 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
df50: 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a   *zOrigTab = 0;.
df60: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
df70: 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 23 65 6e 64  rigCol = 0;.#end
df80: 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 45  if..  assert( pE
df90: 78 70 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  xpr!=0 );.  asse
dfa0: 72 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  rt( pNC->pSrcLis
dfb0: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
dfc0: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
dfd0: 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 20 20 2f  AGG_COLUMN );  /
dfe0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
dff0: 75 6e 65 73 20 62 65 66 6f 72 65 20 61 67 67 72  unes before aggr
e000: 65 67 61 74 65 73 0a 20 20 20 20 20 20 20 20 20  egates.         
e010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
e030: 20 61 72 65 20 70 72 6f 63 65 73 73 65 64 20 2a   are processed *
e040: 2f 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  /.  switch( pExp
e050: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
e060: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
e070: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
e080: 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  ession is a colu
e090: 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74  mn. Locate the t
e0a0: 61 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  able the column 
e0b0: 69 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a  is being.      *
e0c0: 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  * extracted from
e0d0: 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e   in NameContext.
e0e0: 70 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74  pSrcList. This t
e0f0: 61 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c  able may be real
e100: 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
e110: 73 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75  se table or a su
e120: 62 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f  bquery..      */
e130: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
e140: 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ab = 0;         
e150: 20 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75     /* Table stru
e160: 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20  cture column is 
e170: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a  extracted from *
e180: 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  /.      Select *
e190: 70 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  pS = 0;         
e1a0: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68      /* Select th
e1b0: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72  e column is extr
e1c0: 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20  acted from */.  
e1d0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
e1e0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20  Expr->iColumn;  
e1f0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
e200: 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20  mn in pTab */.  
e210: 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26      while( pNC &
e220: 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20  & !pTab ){.     
e230: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62     SrcList *pTab
e240: 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63  List = pNC->pSrc
e250: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f  List;.        fo
e260: 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74  r(j=0;j<pTabList
e270: 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69  ->nSrc && pTabLi
e280: 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72  st->a[j].iCursor
e290: 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  !=pExpr->iTable;
e2a0: 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  j++);.        if
e2b0: 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ( j<pTabList->nS
e2c0: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
e2d0: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
e2e0: 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[j].pTab;.    
e2f0: 20 20 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c        pS = pTabL
e300: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63  ist->a[j].pSelec
e310: 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  t;.        }else
e320: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 20  {.          pNC 
e330: 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pNC->pNext;.  
e340: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
e350: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
e360: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
e370: 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f   At one time, co
e380: 64 65 20 73 75 63 68 20 61 73 20 22 53 45 4c 45  de such as "SELE
e390: 43 54 20 6e 65 77 2e 78 22 20 77 69 74 68 69 6e  CT new.x" within
e3a0: 20 61 20 74 72 69 67 67 65 72 20 77 6f 75 6c 64   a trigger would
e3b0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73  .        ** caus
e3c0: 65 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  e this condition
e3d0: 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65 20   to run.  Since 
e3e0: 74 68 65 6e 2c 20 77 65 20 68 61 76 65 20 72 65  then, we have re
e3f0: 73 74 72 75 63 74 75 72 65 64 20 68 6f 77 0a 20  structured how. 
e400: 20 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65         ** trigge
e410: 72 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61  r code is genera
e420: 74 65 64 20 61 6e 64 20 73 6f 20 74 68 69 73 20  ted and so this 
e430: 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20  condition is no 
e440: 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20 20 20 20  longer .        
e450: 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77  ** possible. How
e460: 65 76 65 72 2c 20 69 74 20 63 61 6e 20 73 74 69  ever, it can sti
e470: 6c 6c 20 62 65 20 74 72 75 65 20 66 6f 72 20 73  ll be true for s
e480: 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20  tatements like. 
e490: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f         ** the fo
e4a0: 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20 20  llowing:.       
e4b0: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
e4c0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
e4d0: 28 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20  (col INTEGER);. 
e4e0: 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45         **   SELE
e4f0: 43 54 20 28 53 45 4c 45 43 54 20 74 31 2e 63 6f  CT (SELECT t1.co
e500: 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b  l) FROM FROM t1;
e510: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
e520: 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75      ** when colu
e530: 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c  mnType() is call
e540: 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ed on the expres
e550: 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e  sion "t1.col" in
e560: 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
e570: 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20   sub-select. In 
e580: 74 68 69 73 20 63 61 73 65 2c 20 73 65 74 20 74  this case, set t
e590: 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74  he column type t
e5a0: 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20  o NULL, even.   
e5b0: 20 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 69       ** though i
e5c0: 74 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20  t should really 
e5d0: 62 65 20 22 49 4e 54 45 47 45 52 22 2e 0a 20 20  be "INTEGER"..  
e5e0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
e5f0: 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20   ** This is not 
e600: 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68  a problem, as th
e610: 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66  e column type of
e620: 20 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76   "t1.col" is nev
e630: 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73  er.        ** us
e640: 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54  ed. When columnT
e650: 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ype() is called 
e660: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
e670: 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 28  n .        ** "(
e680: 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c  SELECT t1.col)",
e690: 20 74 68 65 20 63 6f 72 72 65 63 74 20 74 79 70   the correct typ
e6a0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 28 73  e is returned (s
e6b0: 65 65 20 74 68 65 20 54 4b 5f 53 45 4c 45 43 54  ee the TK_SELECT
e6c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 72 61 6e  .        ** bran
e6d0: 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20  ch below.  */.  
e6e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e6f0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
e700: 72 74 28 20 70 54 61 62 20 26 26 20 70 45 78 70  rt( pTab && pExp
e710: 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20 29 3b  r->pTab==pTab );
e720: 0a 20 20 20 20 20 20 69 66 28 20 70 53 20 29 7b  .      if( pS ){
e730: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
e740: 22 74 61 62 6c 65 22 20 69 73 20 61 63 74 75 61  "table" is actua
e750: 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74  lly a sub-select
e760: 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74 68   or a view in th
e770: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20  e FROM clause.  
e780: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
e790: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
e7a0: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63  . Return the dec
e7b0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e  laration type an
e7c0: 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20  d origin.       
e7d0: 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65   ** data for the
e7e0: 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75   result-set colu
e7f0: 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65  mn of the sub-se
e800: 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  lect..        */
e810: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
e820: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 53 2d  l>=0 && iCol<pS-
e830: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
e840: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
e850: 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20 74  f iCol is less t
e860: 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
e870: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
e880: 71 75 65 73 74 73 20 74 68 65 0a 20 20 20 20 20  quests the.     
e890: 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66       ** rowid of
e8a0: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20   the sub-select 
e8b0: 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20 65 78  or view. This ex
e8c0: 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67 61  pression is lega
e8d0: 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20 20 20  l (see .        
e8e0: 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20 6d    ** test case m
e8f0: 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20 61  isc2.2.2) - it a
e900: 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65 73 20  lways evaluates 
e910: 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20  to NULL..       
e920: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
e930: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
e940: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
e950: 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d  *p = pS->pEList-
e960: 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a  >a[iCol].pExpr;.
e970: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 53            sNC.pS
e980: 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72  rcList = pS->pSr
e990: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  c;.          sNC
e9a0: 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20  .pNext = pNC;.  
e9b0: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72          sNC.pPar
e9c0: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
e9d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  ;.          zTyp
e9e0: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
e9f0: 73 4e 43 2c 20 70 2c 26 7a 4f 72 69 67 44 62 2c  sNC, p,&zOrigDb,
ea00: 26 7a 4f 72 69 67 54 61 62 2c 26 7a 4f 72 69 67  &zOrigTab,&zOrig
ea10: 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20 20 20 7d  Col); .        }
ea20: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ea30: 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20        /* A real 
ea40: 74 61 62 6c 65 20 6f 72 20 61 20 43 54 45 20 74  table or a CTE t
ea50: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
ea60: 61 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a 23  assert( !pS );.#
ea70: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
ea80: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
ea90: 41 54 41 0a 20 20 20 20 20 20 20 20 69 66 28 20  ATA.        if( 
eaa0: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
eab0: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
eac0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
ead0: 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 28  l==XN_ROWID || (
eae0: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
eaf0: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
eb00: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
eb10: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  0 ){.          z
eb20: 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22  Type = "INTEGER"
eb30: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
eb40: 67 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a  gCol = "rowid";.
eb50: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
eb60: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f           zOrigCo
eb70: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
eb80: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
eb90: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71        zType = sq
eba0: 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28  lite3ColumnType(
ebb0: 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  &pTab->aCol[iCol
ebc0: 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ],0);.        }.
ebd0: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 54 61 62          zOrigTab
ebe0: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
ebf0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d          if( pNC-
ec00: 3e 70 50 61 72 73 65 20 26 26 20 70 54 61 62 2d  >pParse && pTab-
ec10: 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
ec20: 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20        int iDb = 
ec30: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
ec40: 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65  ndex(pNC->pParse
ec50: 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
ec60: 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ema);.          
ec70: 7a 4f 72 69 67 44 62 20 3d 20 70 4e 43 2d 3e 70  zOrigDb = pNC->p
ec80: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
ec90: 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20  Db].zDbSName;.  
eca0: 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20        }.#else.  
ecb0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
ecc0: 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20  ol==XN_ROWID || 
ecd0: 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c  (iCol>=0 && iCol
ece0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a  <pTab->nCol) );.
ecf0: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
ed00: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
ed10: 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52  zType = "INTEGER
ed20: 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ";.        }else
ed30: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
ed40: 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  e = sqlite3Colum
ed50: 6e 54 79 70 65 28 26 70 54 61 62 2d 3e 61 43 6f  nType(&pTab->aCo
ed60: 6c 5b 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20  l[iCol],0);.    
ed70: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
ed80: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
ed90: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
eda0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
edb0: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
edc0: 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
edd0: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
ede0: 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65  on is a sub-sele
edf0: 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64  ct. Return the d
ee00: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
ee10: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69  and.      ** ori
ee20: 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68 65  gin info for the
ee30: 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69   single column i
ee40: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
ee50: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20   of the SELECT. 
ee60: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
ee70: 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
ee80: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
ee90: 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  C;.      Select 
eea0: 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  *pS = pExpr->x.p
eeb0: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78  Select;.      Ex
eec0: 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69  pr *p = pS->pELi
eed0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
eee0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
eef0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
ef00: 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
ef10: 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e  t) );.      sNC.
ef20: 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70  pSrcList = pS->p
ef30: 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70  Src;.      sNC.p
ef40: 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20  Next = pNC;.    
ef50: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
ef60: 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  NC->pParse;.    
ef70: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
ef80: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a  Type(&sNC, p, &z
ef90: 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61  OrigDb, &zOrigTa
efa0: 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b 20 0a  b, &zOrigCol); .
efb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
efc0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23   }.#endif.  }..#
efd0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
efe0: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
eff0: 41 54 41 20 20 0a 20 20 69 66 28 20 70 7a 4f 72  ATA  .  if( pzOr
f000: 69 67 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65  igDb ){.    asse
f010: 72 74 28 20 70 7a 4f 72 69 67 54 61 62 20 26 26  rt( pzOrigTab &&
f020: 20 70 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20   pzOrigCol );.  
f030: 20 20 2a 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f    *pzOrigDb = zO
f040: 72 69 67 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72  rigDb;.    *pzOr
f050: 69 67 54 61 62 20 3d 20 7a 4f 72 69 67 54 61 62  igTab = zOrigTab
f060: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c  ;.    *pzOrigCol
f070: 20 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d   = zOrigCol;.  }
f080: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
f090: 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zType;.}../*.**
f0a0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
f0b0: 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68  hat will tell th
f0c0: 65 20 56 44 42 45 20 74 68 65 20 64 65 63 6c 61  e VDBE the decla
f0d0: 72 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20  ration types of 
f0e0: 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68  columns.** in th
f0f0: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f  e result set..*/
f100: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
f110: 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
f120: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
f130: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  e,      /* Parse
f140: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
f150: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
f160: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61  ,  /* List of ta
f170: 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69  bles */.  ExprLi
f180: 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a  st *pEList    /*
f190: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66   Expressions def
f1a0: 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  ining the result
f1b0: 20 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64   set */.){.#ifnd
f1c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
f1d0: 45 43 4c 54 59 50 45 0a 20 20 56 64 62 65 20 2a  ECLTYPE.  Vdbe *
f1e0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
f1f0: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61  e;.  int i;.  Na
f200: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
f210: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
f220: 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e  pTabList;.  sNC.
f230: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
f240: 0a 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30  .  sNC.pNext = 0
f250: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
f260: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
f270: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
f280: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
f290: 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Expr;.    const 
f2a0: 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66  char *zType;.#if
f2b0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
f2c0: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
f2d0: 41 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  A.    const char
f2e0: 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20   *zOrigDb = 0;. 
f2f0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
f300: 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20  OrigTab = 0;.   
f310: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
f320: 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a  igCol = 0;.    z
f330: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
f340: 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69  e(&sNC, p, &zOri
f350: 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20  gDb, &zOrigTab, 
f360: 26 7a 4f 72 69 67 43 6f 6c 29 3b 0a 0a 20 20 20  &zOrigCol);..   
f370: 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73   /* The vdbe mus
f380: 74 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63  t make its own c
f390: 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  opy of the colum
f3a0: 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72  n-type and other
f3b0: 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20   .    ** column 
f3c0: 73 70 65 63 69 66 69 63 20 73 74 72 69 6e 67 73  specific strings
f3d0: 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 63  , in case the sc
f3e0: 68 65 6d 61 20 69 73 20 72 65 73 65 74 20 62 65  hema is reset be
f3f0: 66 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  fore this.    **
f400: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
f410: 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20   is deleted..   
f420: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
f430: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
f440: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41   i, COLNAME_DATA
f450: 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53  BASE, zOrigDb, S
f460: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
f470: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
f480: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
f490: 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c  , COLNAME_TABLE,
f4a0: 20 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49 54   zOrigTab, SQLIT
f4b0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
f4c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
f4d0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
f4e0: 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f  LNAME_COLUMN, zO
f4f0: 72 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54  rigCol, SQLITE_T
f500: 52 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65  RANSIENT);.#else
f510: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c  .    zType = col
f520: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
f530: 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69   0, 0, 0);.#endi
f540: 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  f.    sqlite3Vdb
f550: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
f560: 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59  , COLNAME_DECLTY
f570: 50 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49 54  PE, zType, SQLIT
f580: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
f590: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
f5a0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
f5b0: 5f 44 45 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a  _DECLTYPE) */.}.
f5c0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
f5d0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
f5e0: 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74   for a SELECT st
f5f0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  atement..**.** T
f600: 68 65 20 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65  he only guarante
f610: 65 20 74 68 61 74 20 53 51 4c 69 74 65 20 6d 61  e that SQLite ma
f620: 6b 65 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e  kes about column
f630: 20 6e 61 6d 65 73 20 69 73 20 74 68 61 74 20 69   names is that i
f640: 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  f the.** column 
f650: 68 61 73 20 61 6e 20 41 53 20 63 6c 61 75 73 65  has an AS clause
f660: 20 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20   assigning it a 
f670: 6e 61 6d 65 2c 20 74 68 61 74 20 77 69 6c 6c 20  name, that will 
f680: 62 65 20 74 68 65 20 6e 61 6d 65 20 75 73 65 64  be the name used
f690: 2e 0a 2a 2a 20 54 68 61 74 20 69 73 20 74 68 65  ..** That is the
f6a0: 20 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 65 64   only documented
f6b0: 20 67 75 61 72 61 6e 74 65 65 2e 20 20 48 6f 77   guarantee.  How
f6c0: 65 76 65 72 2c 20 63 6f 75 6e 74 6c 65 73 73 20  ever, countless 
f6d0: 61 70 70 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a 20  applications.** 
f6e0: 64 65 76 65 6c 6f 70 65 64 20 6f 76 65 72 20 74  developed over t
f6f0: 68 65 20 79 65 61 72 73 20 68 61 76 65 20 6d 61  he years have ma
f700: 64 65 20 62 61 73 65 6c 65 73 73 20 61 73 73 75  de baseless assu
f710: 6d 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 63 6f  mptions about co
f720: 6c 75 6d 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e  lumn names.** an
f730: 64 20 77 69 6c 6c 20 62 72 65 61 6b 20 69 66 20  d will break if 
f740: 74 68 6f 73 65 20 61 73 73 75 6d 70 74 69 6f 6e  those assumption
f750: 73 20 63 68 61 6e 67 65 73 2e 20 20 48 65 6e 63  s changes.  Henc
f760: 65 2c 20 75 73 65 20 65 78 74 72 65 6d 65 20 63  e, use extreme c
f770: 61 75 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d  aution.** when m
f780: 6f 64 69 66 79 69 6e 67 20 74 68 69 73 20 72 6f  odifying this ro
f790: 75 74 69 6e 65 20 74 6f 20 61 76 6f 69 64 20 62  utine to avoid b
f7a0: 72 65 61 6b 69 6e 67 20 6c 65 67 61 63 79 2e 0a  reaking legacy..
f7b0: 2a 2a 0a 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20  **.** See Also: 
f7c0: 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72  sqlite3ColumnsFr
f7d0: 6f 6d 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a 0a  omExprList().**.
f7e0: 2a 2a 20 54 68 65 20 50 52 41 47 4d 41 20 73 68  ** The PRAGMA sh
f7f0: 6f 72 74 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73  ort_column_names
f800: 20 61 6e 64 20 50 52 41 47 4d 41 20 66 75 6c 6c   and PRAGMA full
f810: 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20 73 65  _column_names se
f820: 74 74 69 6e 67 73 20 61 72 65 0a 2a 2a 20 64 65  ttings are.** de
f830: 70 72 65 63 61 74 65 64 2e 20 20 54 68 65 20 64  precated.  The d
f840: 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 20 69  efault setting i
f850: 73 20 73 68 6f 72 74 3d 4f 4e 2c 20 66 75 6c 6c  s short=ON, full
f860: 3d 4f 46 46 2e 20 20 39 39 2e 39 25 20 6f 66 20  =OFF.  99.9% of 
f870: 61 6c 6c 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69  all.** applicati
f880: 6f 6e 73 20 73 68 6f 75 6c 64 20 6f 70 65 72 61  ons should opera
f890: 74 65 20 74 68 69 73 20 77 61 79 2e 20 20 4e 65  te this way.  Ne
f8a0: 76 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20 6e  vertheless, we n
f8b0: 65 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 74  eed to support t
f8c0: 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6d 6f 64 65  he.** other mode
f8d0: 73 20 66 6f 72 20 6c 65 67 61 63 79 3a 0a 2a 2a  s for legacy:.**
f8e0: 0a 2a 2a 20 20 20 20 73 68 6f 72 74 3d 4f 46 46  .**    short=OFF
f8f0: 2c 20 66 75 6c 6c 3d 4f 46 46 3a 20 20 20 20 20  , full=OFF:     
f900: 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   Column name is 
f910: 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  the text of the 
f920: 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 69  expression has i
f930: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
f940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f950: 20 20 6f 72 69 67 69 6e 61 6c 6c 79 20 61 70 70    originally app
f960: 65 61 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45  ears in the SELE
f970: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49  CT statement.  I
f980: 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  n.**            
f990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9a0: 20 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74    other words, t
f9b0: 68 65 20 7a 53 70 61 6e 20 6f 66 20 74 68 65 20  he zSpan of the 
f9c0: 72 65 73 75 6c 74 20 65 78 70 72 65 73 73 69 6f  result expressio
f9d0: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 73 68 6f 72  n..**.**    shor
f9e0: 74 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f 46 46 3a 20  t=ON, full=OFF: 
f9f0: 20 20 20 20 20 20 28 54 68 69 73 20 69 73 20 74        (This is t
fa00: 68 65 20 64 65 66 61 75 6c 74 20 73 65 74 74 69  he default setti
fa10: 6e 67 29 2e 20 20 49 66 20 74 68 65 20 72 65 73  ng).  If the res
fa20: 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
fa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa40: 20 20 20 20 72 65 66 65 72 73 20 64 69 72 65 63      refers direc
fa50: 74 6c 79 20 74 6f 20 61 20 74 61 62 6c 65 20 63  tly to a table c
fa60: 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 0a  olumn, then the.
fa70: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
fa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa90: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61  result column na
faa0: 6d 65 20 69 73 20 6a 75 73 74 20 74 68 65 20 74  me is just the t
fab0: 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 20  able column.**  
fac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fad0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65              name
fae0: 3a 20 43 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65 72  : COLUMN.  Other
faf0: 77 69 73 65 20 75 73 65 20 7a 53 70 61 6e 2e 0a  wise use zSpan..
fb00: 2a 2a 0a 2a 2a 20 20 20 20 66 75 6c 6c 3d 4f 4e  **.**    full=ON
fb10: 2c 20 73 68 6f 72 74 3d 41 4e 59 3a 20 20 20 20  , short=ANY:    
fb20: 20 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74     If the result
fb30: 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79   refers directly
fb40: 20 74 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c 75   to a table colu
fb50: 6d 6e 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  mn,.**          
fb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb70: 20 20 20 20 74 68 65 6e 20 74 68 65 20 72 65 73      then the res
fb80: 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ult column name 
fb90: 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e  with the table n
fba0: 61 6d 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ame.**          
fbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbc0: 20 20 20 20 70 72 65 66 69 78 2c 20 65 78 3a 20      prefix, ex: 
fbd0: 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e 2e 20 20 4f  TABLE.COLUMN.  O
fbe0: 74 68 65 72 77 69 73 65 20 75 73 65 20 7a 53 70  therwise use zSp
fbf0: 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  an..*/.static vo
fc00: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
fc10: 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20  nNames(.  Parse 
fc20: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
fc30: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
fc40: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
fc50: 6c 65 63 74 20 20 20 20 20 2f 2a 20 47 65 6e 65  lect     /* Gene
fc60: 72 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  rate column name
fc70: 73 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43  s for this SELEC
fc80: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29  T statement */.)
fc90: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
fca0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
fcb0: 6e 74 20 69 3b 0a 20 20 54 61 62 6c 65 20 2a 70  nt i;.  Table *p
fcc0: 54 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  Tab;.  SrcList *
fcd0: 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72  pTabList;.  Expr
fce0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
fcf0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
fd00: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
fd10: 66 75 6c 6c 4e 61 6d 65 3b 20 20 20 20 2f 2a 20  fullName;    /* 
fd20: 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e 20 69 66 20  TABLE.COLUMN if 
fd30: 6e 6f 20 41 53 20 63 6c 61 75 73 65 20 61 6e 64  no AS clause and
fd40: 20 69 73 20 61 20 64 69 72 65 63 74 20 74 61 62   is a direct tab
fd50: 6c 65 20 72 65 66 20 2a 2f 0a 20 20 69 6e 74 20  le ref */.  int 
fd60: 73 72 63 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20  srcName;     /* 
fd70: 43 4f 4c 55 4d 4e 20 6f 72 20 54 41 42 4c 45 2e  COLUMN or TABLE.
fd80: 43 4f 4c 55 4d 4e 20 69 66 20 6e 6f 20 41 53 20  COLUMN if no AS 
fd90: 63 6c 61 75 73 65 20 61 6e 64 20 69 73 20 64 69  clause and is di
fda0: 72 65 63 74 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  rect */..#ifndef
fdb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
fdc0: 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69  LAIN.  /* If thi
fdd0: 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c  s is an EXPLAIN,
fde0: 20 73 6b 69 70 20 74 68 69 73 20 73 74 65 70 20   skip this step 
fdf0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
fe00: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
fe10: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
fe20: 69 66 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  if..  if( pParse
fe30: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c  ->colNamesSet ||
fe40: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
fe50: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 2f 2a  d ) return;.  /*
fe60: 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72   Column names ar
fe70: 65 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  e determined by 
fe80: 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65  the left-most te
fe90: 72 6d 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  rm of a compound
fea0: 20 73 65 6c 65 63 74 20 2a 2f 0a 20 20 77 68 69   select */.  whi
feb0: 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  le( pSelect->pPr
fec0: 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20  ior ) pSelect = 
fed0: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b  pSelect->pPrior;
fee0: 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31  .  SELECTTRACE(1
fef0: 2c 70 50 61 72 73 65 2c 70 53 65 6c 65 63 74 2c  ,pParse,pSelect,
ff00: 28 22 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6c  ("generating col
ff10: 75 6d 6e 20 6e 61 6d 65 73 5c 6e 22 29 29 3b 0a  umn names\n"));.
ff20: 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 53 65    pTabList = pSe
ff30: 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 70 45  lect->pSrc;.  pE
ff40: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
ff50: 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74  pEList;.  assert
ff60: 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( v!=0 );.  asse
ff70: 72 74 28 20 70 54 61 62 4c 69 73 74 21 3d 30 20  rt( pTabList!=0 
ff80: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c  );.  pParse->col
ff90: 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20  NamesSet = 1;.  
ffa0: 66 75 6c 6c 4e 61 6d 65 20 3d 20 28 64 62 2d 3e  fullName = (db->
ffb0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
ffc0: 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b  ullColNames)!=0;
ffd0: 0a 20 20 73 72 63 4e 61 6d 65 20 3d 20 28 64 62  .  srcName = (db
ffe0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
fff0: 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21  _ShortColNames)!
10000 3d 30 20 7c 7c 20 66 75 6c 6c 4e 61 6d 65 3b 0a  =0 || fullName;.
10010 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
10020 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73  NumCols(v, pELis
10030 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72  t->nExpr);.  for
10040 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
10050 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
10060 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73   Expr *p = pELis
10070 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 0a  t->a[i].pExpr;..
10080 20 20 20 20 61 73 73 65 72 74 28 20 70 21 3d 30      assert( p!=0
10090 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
100a0 70 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f  p->op!=TK_AGG_CO
100b0 4c 55 4d 4e 20 29 3b 20 20 2f 2a 20 41 67 67 20  LUMN );  /* Agg 
100c0 70 72 6f 63 65 73 73 69 6e 67 20 68 61 73 20 6e  processing has n
100d0 6f 74 20 72 75 6e 20 79 65 74 20 2a 2f 0a 20 20  ot run yet */.  
100e0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21    assert( p->op!
100f0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d  =TK_COLUMN || p-
10100 3e 70 54 61 62 21 3d 30 20 29 3b 20 2f 2a 20 43  >pTab!=0 ); /* C
10110 6f 76 65 72 69 6e 67 20 69 64 78 20 6e 6f 74 20  overing idx not 
10120 79 65 74 20 63 6f 64 65 64 20 2a 2f 0a 20 20 20  yet coded */.   
10130 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69   if( pEList->a[i
10140 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ].zName ){.     
10150 20 2f 2a 20 41 6e 20 41 53 20 63 6c 61 75 73 65   /* An AS clause
10160 20 61 6c 77 61 79 73 20 74 61 6b 65 73 20 66 69   always takes fi
10170 72 73 74 20 70 72 69 6f 72 69 74 79 20 2a 2f 0a  rst priority */.
10180 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
10190 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
101a0 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71  .zName;.      sq
101b0 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
101c0 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
101d0 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53  E_NAME, zName, S
101e0 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
101f0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
10200 73 72 63 4e 61 6d 65 20 26 26 20 70 2d 3e 6f 70  srcName && p->op
10210 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
10220 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b       char *zCol;
10230 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
10240 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  = p->iColumn;.  
10250 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 54      pTab = p->pT
10260 61 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ab;.      assert
10270 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ( pTab!=0 );.   
10280 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
10290 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
102a0 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ey;.      assert
102b0 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69  ( iCol==-1 || (i
102c0 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
102d0 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20  Tab->nCol) );.  
102e0 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
102f0 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
10300 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20   "rowid";.      
10310 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
10320 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
10330 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  [iCol].zName;.  
10340 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
10350 66 75 6c 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20  fullName ){.    
10360 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
10370 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  = 0;.        zNa
10380 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
10390 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c  ntf(db, "%s.%s",
103a0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43   pTab->zName, zC
103b0 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
103c0 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
103d0 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
103e0 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51  _NAME, zName, SQ
103f0 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  LITE_DYNAMIC);. 
10400 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10410 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
10420 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
10430 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43  COLNAME_NAME, zC
10440 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  ol, SQLITE_TRANS
10450 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20  IENT);.      }. 
10460 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10470 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
10480 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70  pEList->a[i].zSp
10490 61 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a 3d  an;.      z = z=
104a0 3d 30 20 3f 20 73 71 6c 69 74 65 33 4d 50 72 69  =0 ? sqlite3MPri
104b0 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25  ntf(db, "column%
104c0 64 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69 74  d", i+1) : sqlit
104d0 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a  e3DbStrDup(db, z
104e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
104f0 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
10500 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
10510 45 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59 4e  E, z, SQLITE_DYN
10520 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  AMIC);.    }.  }
10530 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  .  generateColum
10540 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70  nTypes(pParse, p
10550 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
10560 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
10570 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
10580 69 73 74 20 28 77 68 69 63 68 20 69 73 20 72 65  ist (which is re
10590 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f 66  ally the list of
105a0 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
105b0 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72 65  that form the re
105c0 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45  sult set of a SE
105d0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29 20  LECT statement) 
105e0 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72 69  compute appropri
105f0 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61  ate.** column na
10600 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20  mes for a table 
10610 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64 20  that would hold 
10620 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
10630 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63  ist..**.** All c
10640 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c 6c  olumn names will
10650 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a   be unique..**.*
10660 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d  * Only the colum
10670 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d 70  n names are comp
10680 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54  uted.  Column.zT
10690 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c  ype, Column.zCol
106a0 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20  l,.** and other 
106b0 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d 6e  fields of Column
106c0 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a   are zeroed..**.
106d0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
106e0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  _OK on success. 
106f0 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
10700 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63  ocation error oc
10710 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e  curs,.** store N
10720 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61 6e  ULL in *paCol an
10730 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e  d 0 in *pnCol an
10740 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
10750 4e 4f 4d 45 4d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  NOMEM..**.** The
10760 20 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65 65 20   only guarantee 
10770 74 68 61 74 20 53 51 4c 69 74 65 20 6d 61 6b 65  that SQLite make
10780 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e  s about column n
10790 61 6d 65 73 20 69 73 20 74 68 61 74 20 69 66 20  ames is that if 
107a0 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61  the.** column ha
107b0 73 20 61 6e 20 41 53 20 63 6c 61 75 73 65 20 61  s an AS clause a
107c0 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 6e 61  ssigning it a na
107d0 6d 65 2c 20 74 68 61 74 20 77 69 6c 6c 20 62 65  me, that will be
107e0 20 74 68 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a   the name used..
107f0 2a 2a 20 54 68 61 74 20 69 73 20 74 68 65 20 6f  ** That is the o
10800 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 65 64 20 67  nly documented g
10810 75 61 72 61 6e 74 65 65 2e 20 20 48 6f 77 65 76  uarantee.  Howev
10820 65 72 2c 20 63 6f 75 6e 74 6c 65 73 73 20 61 70  er, countless ap
10830 70 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65  plications.** de
10840 76 65 6c 6f 70 65 64 20 6f 76 65 72 20 74 68 65  veloped over the
10850 20 79 65 61 72 73 20 68 61 76 65 20 6d 61 64 65   years have made
10860 20 62 61 73 65 6c 65 73 73 20 61 73 73 75 6d 70   baseless assump
10870 74 69 6f 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75  tions about colu
10880 6d 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20  mn names.** and 
10890 77 69 6c 6c 20 62 72 65 61 6b 20 69 66 20 74 68  will break if th
108a0 6f 73 65 20 61 73 73 75 6d 70 74 69 6f 6e 73 20  ose assumptions 
108b0 63 68 61 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c  changes.  Hence,
108c0 20 75 73 65 20 65 78 74 72 65 6d 65 20 63 61 75   use extreme cau
108d0 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64  tion.** when mod
108e0 69 66 79 69 6e 67 20 74 68 69 73 20 72 6f 75 74  ifying this rout
108f0 69 6e 65 20 74 6f 20 61 76 6f 69 64 20 62 72 65  ine to avoid bre
10900 61 6b 69 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a  aking legacy..**
10910 0a 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20 67 65  .** See Also: ge
10920 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
10930 73 28 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  s().*/.int sqlit
10940 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  e3ColumnsFromExp
10950 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
10960 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
10970 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
10980 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
10990 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20  t *pEList,      
109a0 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66 72   /* Expr list fr
109b0 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72 69  om which to deri
109c0 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ve column names 
109d0 2a 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c 2c  */.  i16 *pnCol,
109e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
109f0 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
10a00 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65   of columns here
10a10 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70   */.  Column **p
10a20 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a  aCol          /*
10a30 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20 63   Write the new c
10a40 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65 20  olumn list here 
10a50 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
10a60 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
10a70 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ;   /* Database 
10a80 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
10a90 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
10aa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
10ab0 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
10ac0 20 20 75 33 32 20 63 6e 74 3b 20 20 20 20 20 20    u32 cnt;      
10ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10ae0 20 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f 20   Index added to 
10af0 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75 6e  make the name un
10b00 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e  ique */.  Column
10b10 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20   *aCol, *pCol;  
10b20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
10b30 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c 74  ping over result
10b40 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
10b50 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
10b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
10b70 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
10b80 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
10b90 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
10ba0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
10bb0 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65    /* Column name
10bc0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
10bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10be0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d    /* Size of nam
10bf0 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a  e in zName[] */.
10c00 20 20 48 61 73 68 20 68 74 3b 20 20 20 20 20 20    Hash ht;      
10c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10c20 20 48 61 73 68 20 74 61 62 6c 65 20 6f 66 20 63   Hash table of c
10c30 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 0a  olumn names */..
10c40 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69    sqlite3HashIni
10c50 74 28 26 68 74 29 3b 0a 20 20 69 66 28 20 70 45  t(&ht);.  if( pE
10c60 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c  List ){.    nCol
10c70 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
10c80 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c  ;.    aCol = sql
10c90 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
10ca0 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c  (db, sizeof(aCol
10cb0 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20  [0])*nCol);.    
10cc0 74 65 73 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d  testcase( aCol==
10cd0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f  0 );.    if( nCo
10ce0 6c 3e 33 32 37 36 37 20 29 20 6e 43 6f 6c 20 3d  l>32767 ) nCol =
10cf0 20 33 32 37 36 37 3b 0a 20 20 7d 65 6c 73 65 7b   32767;.  }else{
10d00 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20  .    nCol = 0;. 
10d10 20 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d     aCol = 0;.  }
10d20 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 3d  .  assert( nCol=
10d30 3d 28 69 31 36 29 6e 43 6f 6c 20 29 3b 0a 20 20  =(i16)nCol );.  
10d40 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20  *pnCol = nCol;. 
10d50 20 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a   *paCol = aCol;.
10d60 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c  .  for(i=0, pCol
10d70 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 20 26 26  =aCol; i<nCol &&
10d80 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
10d90 65 64 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ed; i++, pCol++)
10da0 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20  {.    /* Get an 
10db0 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65  appropriate name
10dc0 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a   for the column.
10dd0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
10de0 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
10df0 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29  a[i].zName)!=0 )
10e00 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
10e10 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e  e column contain
10e20 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22  s an "AS <name>"
10e30 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61   phrase, use <na
10e40 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20  me> as the name 
10e50 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
10e60 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c 45 78      Expr *pColEx
10e70 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
10e80 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69  SkipCollate(pELi
10e90 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
10ea0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 43  .      while( pC
10eb0 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44  olExpr->op==TK_D
10ec0 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OT ){.        pC
10ed0 6f 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45 78 70  olExpr = pColExp
10ee0 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
10ef0 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45     assert( pColE
10f00 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
10f10 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
10f20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  pColExpr->op!=TK
10f30 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
10f40 20 20 20 20 20 69 66 28 20 70 43 6f 6c 45 78 70       if( pColExp
10f50 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
10f60 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
10f70 6f 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74  or columns use t
10f80 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e  he column name n
10f90 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ame */.        i
10fa0 6e 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78  nt iCol = pColEx
10fb0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
10fc0 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
10fd0 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61   = pColExpr->pTa
10fe0 62 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  b;.        asser
10ff0 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
11000 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
11010 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e   ) iCol = pTab->
11020 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 7a  iPKey;.        z
11030 4e 61 6d 65 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f  Name = iCol>=0 ?
11040 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
11050 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64  ].zName : "rowid
11060 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ";.      }else i
11070 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d  f( pColExpr->op=
11080 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20  =TK_ID ){.      
11090 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
110a0 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f 6c 45  asProperty(pColE
110b0 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
110c0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  ) );.        zNa
110d0 6d 65 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 75  me = pColExpr->u
110e0 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d  .zToken;.      }
110f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
11100 20 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61   Use the origina
11110 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f  l text of the co
11120 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lumn expression 
11130 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20  as its name */. 
11140 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70         zName = p
11150 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  EList->a[i].zSpa
11160 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
11170 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29  .    if( zName )
11180 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  {.      zName = 
11190 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
111a0 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
111b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e 61  }else{.      zNa
111c0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
111d0 6e 74 66 28 64 62 2c 22 63 6f 6c 75 6d 6e 25 64  ntf(db,"column%d
111e0 22 2c 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a 20  ",i+1);.    }.. 
111f0 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
11200 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
11210 69 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74  is unique.  If t
11220 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75  he name is not u
11230 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70  nique,.    ** ap
11240 70 65 6e 64 20 61 6e 20 69 6e 74 65 67 65 72 20  pend an integer 
11250 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74  to the name so t
11260 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75  hat it becomes u
11270 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  nique..    */.  
11280 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77    cnt = 0;.    w
11290 68 69 6c 65 28 20 7a 4e 61 6d 65 20 26 26 20 73  hile( zName && s
112a0 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
112b0 68 74 2c 20 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  ht, zName)!=0 ){
112c0 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73  .      nName = s
112d0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
112e0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Name);.      if(
112f0 20 6e 4e 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20   nName>0 ){.    
11300 20 20 20 20 66 6f 72 28 6a 3d 6e 4e 61 6d 65 2d      for(j=nName-
11310 31 3b 20 6a 3e 30 20 26 26 20 73 71 6c 69 74 65  1; j>0 && sqlite
11320 33 49 73 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6a  3Isdigit(zName[j
11330 5d 29 3b 20 6a 2d 2d 29 7b 7d 0a 20 20 20 20 20  ]); j--){}.     
11340 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 6a 5d 3d     if( zName[j]=
11350 3d 27 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6a  =':' ) nName = j
11360 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11370 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
11380 50 72 69 6e 74 66 28 64 62 2c 20 22 25 2e 2a 7a  Printf(db, "%.*z
11390 3a 25 75 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61  :%u", nName, zNa
113a0 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20  me, ++cnt);.    
113b0 20 20 69 66 28 20 63 6e 74 3e 33 20 29 20 73 71    if( cnt>3 ) sq
113c0 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
113d0 28 73 69 7a 65 6f 66 28 63 6e 74 29 2c 20 26 63  (sizeof(cnt), &c
113e0 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nt);.    }.    p
113f0 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  Col->zName = zNa
11400 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  me;.    sqlite3C
11410 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46  olumnPropertiesF
11420 72 6f 6d 4e 61 6d 65 28 30 2c 20 70 43 6f 6c 29  romName(0, pCol)
11430 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20  ;.    if( zName 
11440 26 26 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e  && sqlite3HashIn
11450 73 65 72 74 28 26 68 74 2c 20 7a 4e 61 6d 65 2c  sert(&ht, zName,
11460 20 70 43 6f 6c 29 3d 3d 70 43 6f 6c 20 29 7b 0a   pCol)==pCol ){.
11470 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d        sqlite3Oom
11480 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 7d  Fault(db);.    }
11490 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61  .  }.  sqlite3Ha
114a0 73 68 43 6c 65 61 72 28 26 68 74 29 3b 0a 20 20  shClear(&ht);.  
114b0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
114c0 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28  iled ){.    for(
114d0 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a  j=0; j<i; j++){.
114e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
114f0 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e  ree(db, aCol[j].
11500 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
11510 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
11520 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a  db, aCol);.    *
11530 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a  paCol = 0;.    *
11540 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72  pnCol = 0;.    r
11550 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
11560 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  EM_BKPT;.  }.  r
11570 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11580 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79  .}../*.** Add ty
11590 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  pe and collation
115a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
115b0 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61  a column list ba
115c0 73 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45  sed on.** a SELE
115d0 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
115e0 20 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20   .** The column 
115f0 6c 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79 20  list presumably 
11600 63 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63 74  came from select
11610 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45  ColumnNamesFromE
11620 78 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68  xprList()..** Th
11630 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61  e column list ha
11640 73 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f  s only names, no
11650 74 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61  t types or colla
11660 74 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20  tions.  This.** 
11670 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68 72  routine goes thr
11680 6f 75 67 68 20 61 6e 64 20 61 64 64 73 20 74 68  ough and adds th
11690 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c  e types and coll
116a0 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ations..**.** Th
116b0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75 69  is routine requi
116c0 72 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64 65  res that all ide
116d0 6e 74 69 66 69 65 72 73 20 69 6e 20 74 68 65 20  ntifiers in the 
116e0 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d  SELECT.** statem
116f0 65 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e  ent be resolved.
11700 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
11710 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  SelectAddColumnT
11720 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
11730 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
11740 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
11750 69 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a  ing contexts */.
11760 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
11770 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 63          /* Add c
11780 6f 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72  olumn type infor
11790 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 74  mation to this t
117a0 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  able */.  Select
117b0 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20   *pSelect       
117c0 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20 74  /* SELECT used t
117d0 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70 65  o determine type
117e0 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  s and collations
117f0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
11800 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
11810 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  b;.  NameContext
11820 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a   sNC;.  Column *
11830 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  pCol;.  CollSeq 
11840 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b  *pColl;.  int i;
11850 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73 74  .  Expr *p;.  st
11860 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
11870 65 6d 20 2a 61 3b 0a 0a 20 20 61 73 73 65 72 74  em *a;..  assert
11880 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a  ( pSelect!=0 );.
11890 20 20 61 73 73 65 72 74 28 20 28 70 53 65 6c 65    assert( (pSele
118a0 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ct->selFlags & S
118b0 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20 29  F_Resolved)!=0 )
118c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
118d0 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d  ->nCol==pSelect-
118e0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c  >pEList->nExpr |
118f0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
11900 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ed );.  if( db->
11910 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
11920 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28  eturn;.  memset(
11930 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
11940 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72  sNC));.  sNC.pSr
11950 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  cList = pSelect-
11960 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65  >pSrc;.  a = pSe
11970 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b  lect->pEList->a;
11980 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c  .  for(i=0, pCol
11990 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70  =pTab->aCol; i<p
119a0 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  Tab->nCol; i++, 
119b0 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  pCol++){.    con
119c0 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a  st char *zType;.
119d0 20 20 20 20 69 6e 74 20 6e 2c 20 6d 3b 0a 20 20      int n, m;.  
119e0 20 20 70 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72    p = a[i].pExpr
119f0 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  ;.    zType = co
11a00 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
11a10 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
11a20 2f 2a 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d  /* pCol->szEst =
11a30 20 2e 2e 2e 20 2f 2f 20 43 6f 6c 75 6d 6e 20 73   ... // Column s
11a40 69 7a 65 20 65 73 74 20 66 6f 72 20 53 45 4c 45  ize est for SELE
11a50 43 54 20 74 61 62 6c 65 73 20 6e 65 76 65 72 20  CT tables never 
11a60 75 73 65 64 20 2a 2f 0a 20 20 20 20 70 43 6f 6c  used */.    pCol
11a70 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c  ->affinity = sql
11a80 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
11a90 28 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 79  (p);.    if( zTy
11aa0 70 65 20 29 7b 0a 20 20 20 20 20 20 6d 20 3d 20  pe ){.      m = 
11ab0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
11ac0 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20 6e 20  zType);.      n 
11ad0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
11ae0 30 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  0(pCol->zName);.
11af0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d        pCol->zNam
11b00 65 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  e = sqlite3DbRea
11b10 6c 6c 6f 63 4f 72 46 72 65 65 28 64 62 2c 20 70  llocOrFree(db, p
11b20 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 6e 2b 6d 2b  Col->zName, n+m+
11b30 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  2);.      if( pC
11b40 6f 6c 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  ol->zName ){.   
11b50 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 43 6f       memcpy(&pCo
11b60 6c 2d 3e 7a 4e 61 6d 65 5b 6e 2b 31 5d 2c 20 7a  l->zName[n+1], z
11b70 54 79 70 65 2c 20 6d 2b 31 29 3b 0a 20 20 20 20  Type, m+1);.    
11b80 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61      pCol->colFla
11b90 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 41  gs |= COLFLAG_HA
11ba0 53 54 59 50 45 3b 0a 20 20 20 20 20 20 7d 0a 20  STYPE;.      }. 
11bb0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 6f     }.    if( pCo
11bc0 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20 29  l->affinity==0 )
11bd0 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
11be0 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  = SQLITE_AFF_BLO
11bf0 42 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  B;.    pColl = s
11c00 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
11c10 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  q(pParse, p);.  
11c20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70    if( pColl && p
11c30 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20 29 7b  Col->zColl==0 ){
11c40 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f  .      pCol->zCo
11c50 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  ll = sqlite3DbSt
11c60 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e  rDup(db, pColl->
11c70 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
11c80 7d 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52  }.  pTab->szTabR
11c90 6f 77 20 3d 20 31 3b 20 2f 2a 20 41 6e 79 20 6e  ow = 1; /* Any n
11ca0 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 77 6f  on-zero value wo
11cb0 72 6b 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rks */.}../*.** 
11cc0 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73  Given a SELECT s
11cd0 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61  tatement, genera
11ce0 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  te a Table struc
11cf0 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
11d00 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  bes.** the resul
11d10 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45  t set of that SE
11d20 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  LECT..*/.Table *
11d30 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
11d40 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a  OfSelect(Parse *
11d50 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
11d60 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c  pSelect){.  Tabl
11d70 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  e *pTab;.  sqlit
11d80 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
11d90 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64  >db;.  int saved
11da0 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46  Flags;..  savedF
11db0 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73  lags = db->flags
11dc0 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
11dd0 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c   ~SQLITE_FullCol
11de0 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61  Names;.  db->fla
11df0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f  gs |= SQLITE_Sho
11e00 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71  rtColNames;.  sq
11e10 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
11e20 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
11e30 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73   0);.  if( pPars
11e40 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
11e50 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65   0;.  while( pSe
11e60 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  lect->pPrior ) p
11e70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
11e80 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e  ->pPrior;.  db->
11e90 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61  flags = savedFla
11ea0 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  gs;.  pTab = sql
11eb0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
11ec0 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
11ed0 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  e) );.  if( pTab
11ee0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
11ef0 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68  n 0;.  }.  /* Th
11f00 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  e sqlite3ResultS
11f10 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20  etOfSelect() is 
11f20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74  only used n cont
11f30 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61  exts where looka
11f40 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73  side.  ** is dis
11f50 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  abled */.  asser
11f60 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  t( db->lookaside
11f70 2e 62 44 69 73 61 62 6c 65 20 29 3b 0a 20 20 70  .bDisable );.  p
11f80 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31  Tab->nTabRef = 1
11f90 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20  ;.  pTab->zName 
11fa0 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f  = 0;.  pTab->nRo
11fb0 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61  wLogEst = 200; a
11fc0 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69  ssert( 200==sqli
11fd0 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37  te3LogEst(104857
11fe0 36 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  6) );.  sqlite3C
11ff0 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
12000 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  st(pParse, pSele
12010 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61  ct->pEList, &pTa
12020 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e  b->nCol, &pTab->
12030 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  aCol);.  sqlite3
12040 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  SelectAddColumnT
12050 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
12060 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53  pParse, pTab, pS
12070 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e  elect);.  pTab->
12080 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66  iPKey = -1;.  if
12090 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
120a0 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
120b0 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
120c0 20 70 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75   pTab);.    retu
120d0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
120e0 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
120f0 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f 72  * Get a VDBE for
12100 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73 65   the given parse
12110 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61  r context.  Crea
12120 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
12130 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66  necessary..** If
12140 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
12150 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e  , return NULL an
12160 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67  d leave a messag
12170 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
12180 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74  Vdbe *sqlite3Get
12190 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72  Vdbe(Parse *pPar
121a0 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  se){.  if( pPars
121b0 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20  e->pVdbe ){.    
121c0 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 70  return pParse->p
121d0 56 64 62 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Vdbe;.  }.  if( 
121e0 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65  pParse->pTopleve
121f0 6c 3d 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d  l==0.   && Optim
12200 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70  izationEnabled(p
12210 50 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45  Parse->db,SQLITE
12220 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29  _FactorOutConst)
12230 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  .  ){.    pParse
12240 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20  ->okConstFactor 
12250 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
12260 6e 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65  n sqlite3VdbeCre
12270 61 74 65 28 70 50 61 72 73 65 29 3b 0a 7d 0a 0a  ate(pParse);.}..
12280 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
12290 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  he iLimit and iO
122a0 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20  ffset fields of 
122b0 74 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64  the SELECT based
122c0 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69   on the.** pLimi
122d0 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  t expressions.  
122e0 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20 61 6e  pLimit->pLeft an
122f0 64 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74  d pLimit->pRight
12300 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73   hold the expres
12310 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70  sions.** that ap
12320 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67  pear in the orig
12330 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  inal SQL stateme
12340 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d  nt after the LIM
12350 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a  IT and OFFSET.**
12360 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e   keywords.  Or N
12370 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79  ULL if those key
12380 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65  words are omitte
12390 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  d. iLimit and iO
123a0 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68  ffset .** are th
123b0 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79  e integer memory
123c0 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
123d0 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75  s for counters u
123e0 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a  sed to compute .
123f0 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64  ** the limit and
12400 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65   offset.  If the
12410 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61  re is no limit a
12420 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68  nd/or offset, th
12430 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e  en .** iLimit an
12440 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65  d iOffset are ne
12450 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  gative..**.** Th
12460 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67  is routine chang
12470 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  es the values of
12480 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
12490 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61  set only if.** a
124a0 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74   limit or offset
124b0 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
124c0 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20 61 6e 64  Limit->pLeft and
124d0 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 2e   pLimit->pRight.
124e0 20 20 69 4c 69 6d 69 74 0a 2a 2a 20 61 6e 64 20    iLimit.** and 
124f0 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68  iOffset should h
12500 61 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20  ave been preset 
12510 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64  to appropriate d
12520 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20 28 7a  efault values (z
12530 65 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f  ero).** prior to
12540 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
12550 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utine..**.** The
12560 20 69 4f 66 66 73 65 74 20 72 65 67 69 73 74 65   iOffset registe
12570 72 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29  r (if it exists)
12580 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
12590 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20  to the value.** 
125a0 6f 66 20 74 68 65 20 4f 46 46 53 45 54 2e 20 20  of the OFFSET.  
125b0 54 68 65 20 69 4c 69 6d 69 74 20 72 65 67 69 73  The iLimit regis
125c0 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ter is initializ
125d0 65 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65  ed to LIMIT.  Re
125e0 67 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65  gister.** iOffse
125f0 74 2b 31 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  t+1 is initializ
12600 65 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53  ed to LIMIT+OFFS
12610 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69  ET..**.** Only i
12620 66 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 21  f pLimit->pLeft!
12630 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20  =0 do the limit 
12640 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a  registers get.**
12650 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65   redefined.  The
12660 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
12670 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72  tor uses this pr
12680 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a  operty to force.
12690 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20  ** the reuse of 
126a0 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61  the same limit a
126b0 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74  nd offset regist
126c0 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69  ers across multi
126d0 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  ple.** SELECT st
126e0 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  atements..*/.sta
126f0 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65  tic void compute
12700 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50  LimitRegisters(P
12710 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
12720 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72  lect *p, int iBr
12730 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  eak){.  Vdbe *v 
12740 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69  = 0;.  int iLimi
12750 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66  t = 0;.  int iOf
12760 66 73 65 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  fset;.  int n;. 
12770 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20   Expr *pLimit = 
12780 70 2d 3e 70 4c 69 6d 69 74 3b 0a 0a 20 20 69 66  p->pLimit;..  if
12790 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65  ( p->iLimit ) re
127a0 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  turn;..  /* .  *
127b0 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77  * "LIMIT -1" alw
127c0 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f  ays shows all ro
127d0 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f  ws.  There is so
127e0 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65  me.  ** controve
127f0 72 73 79 20 61 62 6f 75 74 20 77 68 61 74 20 74  rsy about what t
12800 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76  he correct behav
12810 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20  ior should be.. 
12820 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   ** The current 
12830 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
12840 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54  nterprets "LIMIT
12850 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a   0" to mean.  **
12860 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20   no rows..  */. 
12870 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
12880 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
12890 20 20 69 66 28 20 70 4c 69 6d 69 74 20 29 7b 0a    if( pLimit ){.
128a0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 6d      assert( pLim
128b0 69 74 2d 3e 6f 70 3d 3d 54 4b 5f 4c 49 4d 49 54  it->op==TK_LIMIT
128c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
128d0 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 21 3d 30  pLimit->pLeft!=0
128e0 20 29 3b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69   );.    p->iLimi
128f0 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70  t = iLimit = ++p
12900 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
12910 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
12920 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
12930 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
12940 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
12950 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 4c  ExprIsInteger(pL
12960 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 29  imit->pLeft, &n)
12970 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12980 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12990 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c  P_Integer, n, iL
129a0 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62  imit);.      Vdb
129b0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
129c0 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  MIT counter"));.
129d0 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29        if( n==0 )
129e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
129f0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 69 42 72  3VdbeGoto(v, iBr
12a00 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  eak);.      }els
12a10 65 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d  e if( n>=0 && p-
12a20 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 73 71 6c 69  >nSelectRow>sqli
12a30 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e  te3LogEst((u64)n
12a40 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ) ){.        p->
12a50 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c  nSelectRow = sql
12a60 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29  ite3LogEst((u64)
12a70 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73  n);.        p->s
12a80 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 46 69  elFlags |= SF_Fi
12a90 78 65 64 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  xedLimit;.      
12aa0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
12ab0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
12ac0 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69 6d 69  de(pParse, pLimi
12ad0 74 2d 3e 70 4c 65 66 74 2c 20 69 4c 69 6d 69 74  t->pLeft, iLimit
12ae0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12af0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
12b00 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d  _MustBeInt, iLim
12b10 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  it); VdbeCoverag
12b20 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
12b30 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d  Comment((v, "LIM
12b40 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  IT counter"));. 
12b50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12b60 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e  AddOp2(v, OP_IfN
12b70 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65  ot, iLimit, iBre
12b80 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
12b90 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e(v);.    }.    
12ba0 69 66 28 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67  if( pLimit->pRig
12bb0 68 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  ht ){.      p->i
12bc0 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74  Offset = iOffset
12bd0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
12be0 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  m;.      pParse-
12bf0 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c  >nMem++;   /* Al
12c00 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61 20  locate an extra 
12c10 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d  register for lim
12c20 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20  it+offset */.   
12c30 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
12c40 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69 6d 69  de(pParse, pLimi
12c50 74 2d 3e 70 52 69 67 68 74 2c 20 69 4f 66 66 73  t->pRight, iOffs
12c60 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
12c70 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
12c80 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f  OP_MustBeInt, iO
12c90 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65  ffset); VdbeCove
12ca0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56  rage(v);.      V
12cb0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
12cc0 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29  OFFSET counter")
12cd0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12ce0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
12cf0 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c 20 69 4c  _OffsetLimit, iL
12d00 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2b 31 2c  imit, iOffset+1,
12d10 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20   iOffset);.     
12d20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
12d30 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29   "LIMIT+OFFSET")
12d40 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
12d50 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12d60 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
12d70 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ECT./*.** Return
12d80 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
12d90 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
12da0 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c  nce for the iCol
12db0 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a  -th column of.**
12dc0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
12dd0 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  for the compound
12de0 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e  -select statemen
12df0 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e  t "p".  Return N
12e00 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f  ULL if.** the co
12e10 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61  lumn has no defa
12e20 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ult collating se
12e30 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  quence..**.** Th
12e40 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
12e50 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d  ence for the com
12e60 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20  pound select is 
12e70 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a  taken from the.*
12e80 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  * left-most term
12e90 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 74   of the select t
12ea0 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  hat has a collat
12eb0 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f  ing sequence..*/
12ec0 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20  .static CollSeq 
12ed0 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c  *multiSelectColl
12ee0 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
12ef0 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
12f00 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53  t iCol){.  CollS
12f10 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20  eq *pRet;.  if( 
12f20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
12f30 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c   pRet = multiSel
12f40 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
12f50 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43  e, p->pPrior, iC
12f60 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ol);.  }else{.  
12f70 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a    pRet = 0;.  }.
12f80 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
12f90 30 20 29 3b 0a 20 20 2f 2a 20 69 43 6f 6c 20 6d  0 );.  /* iCol m
12fa0 75 73 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e  ust be less than
12fb0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
12fc0 72 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61 6e  r.  Otherwise an
12fd0 20 65 72 72 6f 72 20 77 6f 75 6c 64 0a 20 20 2a   error would.  *
12fe0 2a 20 68 61 76 65 20 62 65 65 6e 20 74 68 72 6f  * have been thro
12ff0 77 6e 20 64 75 72 69 6e 67 20 6e 61 6d 65 20 72  wn during name r
13000 65 73 6f 6c 75 74 69 6f 6e 20 61 6e 64 20 77 65  esolution and we
13010 20 77 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20   would not have 
13020 67 6f 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73  gotten.  ** this
13030 20 66 61 72 20 2a 2f 0a 20 20 69 66 28 20 70 52   far */.  if( pR
13040 65 74 3d 3d 30 20 26 26 20 41 4c 57 41 59 53 28  et==0 && ALWAYS(
13050 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e  iCol<p->pEList->
13060 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 70 52  nExpr) ){.    pR
13070 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
13080 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
13090 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  p->pEList->a[iCo
130a0 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20  l].pExpr);.  }. 
130b0 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
130c0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63  ./*.** The selec
130d0 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  t statement pass
130e0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
130f0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
13100 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a  compound SELECT.
13110 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52  ** with an ORDER
13120 20 42 59 20 63 6c 61 75 73 65 2e 20 54 68 69 73   BY clause. This
13130 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
13140 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20  tes and returns 
13150 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73 74 72  a KeyInfo.** str
13160 75 63 74 75 72 65 20 73 75 69 74 61 62 6c 65 20  ucture suitable 
13170 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67  for implementing
13180 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a   the ORDER BY..*
13190 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
131a0 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ld the KeyInfo s
131b0 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61  tructure is obta
131c0 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
131d0 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  . The calling.**
131e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73   function is res
131f0 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73  ponsible for ens
13200 75 72 69 6e 67 20 74 68 61 74 20 74 68 69 73 20  uring that this 
13210 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65  structure is eve
13220 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64  ntually.** freed
13230 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49  ..*/.static KeyI
13240 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74  nfo *multiSelect
13250 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 50  OrderByKeyInfo(P
13260 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
13270 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 6e 45 78  lect *p, int nEx
13280 74 72 61 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  tra){.  ExprList
13290 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e   *pOrderBy = p->
132a0 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20  pOrderBy;.  int 
132b0 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  nOrderBy = p->pO
132c0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
132d0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
132e0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79  Parse->db;.  Key
132f0 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20 73 71 6c  Info *pRet = sql
13300 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
13310 28 64 62 2c 20 6e 4f 72 64 65 72 42 79 2b 6e 45  (db, nOrderBy+nE
13320 78 74 72 61 2c 20 31 29 3b 0a 20 20 69 66 28 20  xtra, 1);.  if( 
13330 70 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  pRet ){.    int 
13340 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
13350 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
13360 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  {.      struct E
13370 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
13380 74 65 6d 20 3d 20 26 70 4f 72 64 65 72 42 79 2d  tem = &pOrderBy-
13390 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 45 78 70  >a[i];.      Exp
133a0 72 20 2a 70 54 65 72 6d 20 3d 20 70 49 74 65 6d  r *pTerm = pItem
133b0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 43  ->pExpr;.      C
133c0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a  ollSeq *pColl;..
133d0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
133e0 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
133f0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ate ){.        p
13400 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
13410 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
13420 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
13430 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
13440 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
13450 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
13460 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  , p, pItem->u.x.
13470 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 29 3b 0a  iOrderByCol-1);.
13480 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
13490 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64  l==0 ) pColl = d
134a0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
134b0 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
134c0 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20  a[i].pExpr =.   
134d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
134e0 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69  prAddCollateStri
134f0 6e 67 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  ng(pParse, pTerm
13500 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
13510 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
13520 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
13530 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
13540 28 70 52 65 74 29 20 29 3b 0a 20 20 20 20 20 20  (pRet) );.      
13550 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  pRet->aColl[i] =
13560 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 52   pColl;.      pR
13570 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  et->aSortOrder[i
13580 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ] = pOrderBy->a[
13590 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
135a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
135b0 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64  n pRet;.}..#ifnd
135c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
135d0 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  TE./*.** This ro
135e0 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
135f0 56 44 42 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d  VDBE code to com
13600 70 75 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  pute the content
13610 20 6f 66 20 61 20 57 49 54 48 20 52 45 43 55 52   of a WITH RECUR
13620 53 49 56 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66  SIVE.** query of
13630 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
13640 20 20 20 3c 72 65 63 75 72 73 69 76 65 2d 74 61     <recursive-ta
13650 62 6c 65 3e 20 41 53 20 28 3c 73 65 74 75 70 2d  ble> AS (<setup-
13660 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c  query> UNION [AL
13670 4c 5d 20 3c 72 65 63 75 72 73 69 76 65 2d 71 75  L] <recursive-qu
13680 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20 20 20 20  ery>).**        
13690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136a0 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20   \___________/  
136b0 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
136c0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20  ___________/.** 
136d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136e0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
136f0 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ior             
13700 20 20 20 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a           p.**.**
13710 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 65 78 61  .** There is exa
13720 63 74 6c 79 20 6f 6e 65 20 72 65 66 65 72 65 6e  ctly one referen
13730 63 65 20 74 6f 20 74 68 65 20 72 65 63 75 72 73  ce to the recurs
13740 69 76 65 2d 74 61 62 6c 65 20 69 6e 20 74 68 65  ive-table in the
13750 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20   FROM clause.** 
13760 6f 66 20 72 65 63 75 72 73 69 76 65 2d 71 75 65  of recursive-que
13770 72 79 2c 20 6d 61 72 6b 65 64 20 77 69 74 68 20  ry, marked with 
13780 74 68 65 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d  the SrcList->a[]
13790 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20  .fg.isRecursive 
137a0 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  flag..**.** The 
137b0 73 65 74 75 70 2d 71 75 65 72 79 20 72 75 6e 73  setup-query runs
137c0 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72 61 74   once to generat
137d0 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 73 65 74  e an initial set
137e0 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 67 6f   of rows that go
137f0 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65 75 65  .** into a Queue
13800 20 74 61 62 6c 65 2e 20 20 52 6f 77 73 20 61 72   table.  Rows ar
13810 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
13820 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
13830 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20   one by.** one. 
13840 20 45 61 63 68 20 72 6f 77 20 65 78 74 72 61 63   Each row extrac
13850 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 20 69  ted from Queue i
13860 73 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73  s output to pDes
13870 74 2e 20 20 54 68 65 6e 20 74 68 65 20 73 69 6e  t.  Then the sin
13880 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74 65 64  gle.** extracted
13890 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74 68 65   row (now in the
138a0 20 69 43 75 72 72 65 6e 74 20 74 61 62 6c 65 29   iCurrent table)
138b0 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e   becomes the con
138c0 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72  tent of the.** r
138d0 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 66  ecursive-table f
138e0 6f 72 20 61 20 72 65 63 75 72 73 69 76 65 2d 71  or a recursive-q
138f0 75 65 72 79 20 72 75 6e 2e 20 20 54 68 65 20 6f  uery run.  The o
13900 75 74 70 75 74 20 6f 66 20 74 68 65 20 72 65 63  utput of the rec
13910 75 72 73 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20  ursive-query.** 
13920 69 73 20 61 64 64 65 64 20 62 61 63 6b 20 69 6e  is added back in
13930 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61 62  to the Queue tab
13940 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74 68 65  le.  Then anothe
13950 72 20 72 6f 77 20 69 73 20 65 78 74 72 61 63 74  r row is extract
13960 65 64 20 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a  ed from Queue.**
13970 20 61 6e 64 20 74 68 65 20 69 74 65 72 61 74 69   and the iterati
13980 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74  on continues unt
13990 69 6c 20 74 68 65 20 51 75 65 75 65 20 74 61 62  il the Queue tab
139a0 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a  le is empty..**.
139b0 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 6f 75  ** If the compou
139c0 6e 64 20 71 75 65 72 79 20 6f 70 65 72 61 74 6f  nd query operato
139d0 72 20 69 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20  r is UNION then 
139e0 6e 6f 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77  no duplicate row
139f0 73 20 61 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e  s are ever.** in
13a00 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20  serted into the 
13a10 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68  Queue table.  Th
13a20 65 20 69 44 69 73 74 69 6e 63 74 20 74 61 62 6c  e iDistinct tabl
13a30 65 20 6b 65 65 70 73 20 61 20 63 6f 70 79 20 6f  e keeps a copy o
13a40 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68  f all rows.** th
13a50 61 74 20 68 61 76 65 20 65 76 65 72 20 62 65 65  at have ever bee
13a60 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  n inserted into 
13a70 51 75 65 75 65 20 61 6e 64 20 63 61 75 73 65 73  Queue and causes
13a80 20 64 75 70 6c 69 63 61 74 65 73 20 74 6f 20 62   duplicates to b
13a90 65 0a 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20  e.** discarded. 
13aa0 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   If the operator
13ab0 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74   is UNION ALL, t
13ac0 68 65 6e 20 64 75 70 6c 69 63 61 74 65 73 20 61  hen duplicates a
13ad0 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a  re allowed..** .
13ae0 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  ** If the query 
13af0 68 61 73 20 61 6e 20 4f 52 44 45 52 20 42 59 2c  has an ORDER BY,
13b00 20 74 68 65 6e 20 65 6e 74 72 69 65 73 20 69 6e   then entries in
13b10 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
13b20 20 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20   are kept in.** 
13b30 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 20 61  ORDER BY order a
13b40 6e 64 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  nd the first ent
13b50 72 79 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ry is extracted 
13b60 66 6f 72 20 65 61 63 68 20 63 79 63 6c 65 2e 20  for each cycle. 
13b70 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f   Without.** an O
13b80 52 44 45 52 20 42 59 2c 20 74 68 65 20 51 75 65  RDER BY, the Que
13b90 75 65 20 74 61 62 6c 65 20 69 73 20 6a 75 73 74  ue table is just
13ba0 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49   a FIFO..**.** I
13bb0 66 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  f a LIMIT clause
13bc0 20 69 73 20 70 72 6f 76 69 64 65 64 2c 20 74 68   is provided, th
13bd0 65 6e 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e  en the iteration
13be0 20 73 74 6f 70 73 20 61 66 74 65 72 20 4c 49 4d   stops after LIM
13bf0 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20  IT rows.** have 
13c00 62 65 65 6e 20 6f 75 74 70 75 74 20 74 6f 20 70  been output to p
13c10 44 65 73 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f  Dest.  A LIMIT o
13c20 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20  f zero means to 
13c30 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77 73 20 61  output no rows a
13c40 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65  nd a.** negative
13c50 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20   LIMIT means to 
13c60 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e  output all rows.
13c70 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c    If there is al
13c80 73 6f 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61  so an OFFSET cla
13c90 75 73 65 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f  use.** with a po
13ca0 73 69 74 69 76 65 20 76 61 6c 75 65 2c 20 74 68  sitive value, th
13cb0 65 6e 20 74 68 65 20 66 69 72 73 74 20 4f 46 46  en the first OFF
13cc0 53 45 54 20 6f 75 74 70 75 74 73 20 61 72 65 20  SET outputs are 
13cd0 64 69 73 63 61 72 64 65 64 20 72 61 74 68 65 72  discarded rather
13ce0 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67 20 73  .** than being s
13cf0 65 6e 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54  ent to pDest.  T
13d00 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64  he LIMIT count d
13d10 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e  oes not begin un
13d20 74 69 6c 20 61 66 74 65 72 20 4f 46 46 53 45 54  til after OFFSET
13d30 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65 20 62 65  .** rows have be
13d40 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73  en skipped..*/.s
13d50 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
13d60 61 74 65 57 69 74 68 52 65 63 75 72 73 69 76 65  ateWithRecursive
13d70 51 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a  Query(.  Parse *
13d80 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
13d90 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
13da0 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
13db0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
13dc0 54 68 65 20 72 65 63 75 72 73 69 76 65 20 53 45  The recursive SE
13dd0 4c 45 43 54 20 74 6f 20 62 65 20 63 6f 64 65 64  LECT to be coded
13de0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
13df0 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
13e00 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
13e10 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
13e20 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
13e30 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20  rc = p->pSrc;   
13e40 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
13e50 6c 61 75 73 65 20 6f 66 20 74 68 65 20 72 65 63  lause of the rec
13e60 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a  ursive query */.
13e70 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e    int nCol = p->
13e80 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20  pEList->nExpr;  
13e90 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
13ea0 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 63 75  umns in the recu
13eb0 72 73 69 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20  rsive table */. 
13ec0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
13ed0 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f  e->pVdbe;      /
13ee0 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
13ef0 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63  tatement under c
13f00 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
13f10 20 53 65 6c 65 63 74 20 2a 70 53 65 74 75 70 20   Select *pSetup 
13f20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f  = p->pPrior;   /
13f30 2a 20 54 68 65 20 73 65 74 75 70 20 71 75 65 72  * The setup quer
13f40 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  y */.  int addrT
13f50 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
13f60 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
13f70 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  he loop */.  int
13f80 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42   addrCont, addrB
13f90 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f  reak;      /* CO
13fa0 4e 54 49 4e 55 45 20 61 6e 64 20 42 52 45 41 4b  NTINUE and BREAK
13fb0 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a 20 20   addresses */.  
13fc0 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30  int iCurrent = 0
13fd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
13fe0 20 54 68 65 20 43 75 72 72 65 6e 74 20 74 61 62   The Current tab
13ff0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43  le */.  int regC
14000 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20  urrent;         
14010 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
14020 72 20 68 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e  r holding Curren
14030 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  t table */.  int
14040 20 69 51 75 65 75 65 3b 20 20 20 20 20 20 20 20   iQueue;        
14050 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
14060 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f  e Queue table */
14070 0a 20 20 69 6e 74 20 69 44 69 73 74 69 6e 63 74  .  int iDistinct
14080 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
14090 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20 75 6e   /* To ensure un
140a0 69 71 75 65 20 72 65 73 75 6c 74 73 20 69 66 20  ique results if 
140b0 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65  UNION */.  int e
140c0 44 65 73 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b  Dest = SRT_Fifo;
140d0 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
140e0 74 6f 20 77 72 69 74 65 20 74 6f 20 51 75 65 75  to write to Queu
140f0 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  e */.  SelectDes
14100 74 20 64 65 73 74 51 75 65 75 65 3b 20 20 20 20  t destQueue;    
14110 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 44 65       /* SelectDe
14120 73 74 20 74 61 72 67 65 74 74 69 6e 67 20 74 68  st targetting th
14130 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f  e Queue table */
14140 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
14150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14160 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
14170 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
14180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14190 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
141a0 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  de */.  ExprList
141b0 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20   *pOrderBy;     
141c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44        /* The ORD
141d0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
141e0 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20    Expr *pLimit; 
141f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14200 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49 54 20 61  /* Saved LIMIT a
14210 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69  nd OFFSET */.  i
14220 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20 72 65 67  nt regLimit, reg
14230 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  Offset;      /* 
14240 52 65 67 69 73 74 65 72 73 20 75 73 65 64 20 62  Registers used b
14250 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  y LIMIT and OFFS
14260 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61  ET */..  /* Obta
14270 69 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  in authorization
14280 20 74 6f 20 64 6f 20 61 20 72 65 63 75 72 73 69   to do a recursi
14290 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 66  ve query */.  if
142a0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
142b0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
142c0 45 5f 52 45 43 55 52 53 49 56 45 2c 20 30 2c 20  E_RECURSIVE, 0, 
142d0 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  0, 0) ) return;.
142e0 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68  .  /* Process th
142f0 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  e LIMIT and OFFS
14300 45 54 20 63 6c 61 75 73 65 73 2c 20 69 66 20 74  ET clauses, if t
14310 68 65 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 61  hey exist */.  a
14320 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74  ddrBreak = sqlit
14330 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
14340 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74  v);.  p->nSelect
14350 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34  Row = 320;  /* 4
14360 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f   billion rows */
14370 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
14380 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
14390 20 70 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a   p, addrBreak);.
143a0 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
143b0 69 6d 69 74 3b 0a 20 20 72 65 67 4c 69 6d 69 74  imit;.  regLimit
143c0 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20   = p->iLimit;.  
143d0 72 65 67 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69  regOffset = p->i
143e0 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70 4c 69  Offset;.  p->pLi
143f0 6d 69 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 4c  mit = 0;.  p->iL
14400 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  imit = p->iOffse
14410 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65 72 42  t = 0;.  pOrderB
14420 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
14430 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
14440 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
14450 6f 66 20 74 68 65 20 43 75 72 72 65 6e 74 20 74  of the Current t
14460 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  able */.  for(i=
14470 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 53 72 63  0; ALWAYS(i<pSrc
14480 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b 0a 20  ->nSrc); i++){. 
14490 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69     if( pSrc->a[i
144a0 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65  ].fg.isRecursive
144b0 20 29 7b 0a 20 20 20 20 20 20 69 43 75 72 72 65   ){.      iCurre
144c0 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e  nt = pSrc->a[i].
144d0 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 62  iCursor;.      b
144e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
144f0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63  .  /* Allocate c
14500 75 72 73 6f 72 73 20 6e 75 6d 62 65 72 73 20 66  ursors numbers f
14510 6f 72 20 51 75 65 75 65 20 61 6e 64 20 44 69 73  or Queue and Dis
14520 74 69 6e 63 74 2e 20 20 54 68 65 20 63 75 72 73  tinct.  The curs
14530 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20 20  or number for.  
14540 2a 2a 20 74 68 65 20 44 69 73 74 69 6e 63 74 20  ** the Distinct 
14550 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 65 78  table must be ex
14560 61 63 74 6c 79 20 6f 6e 65 20 67 72 65 61 74 65  actly one greate
14570 72 20 74 68 61 6e 20 51 75 65 75 65 20 69 6e 20  r than Queue in 
14580 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74  order.  ** for t
14590 68 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 20  he SRT_DistFifo 
145a0 61 6e 64 20 53 52 54 5f 44 69 73 74 51 75 65 75  and SRT_DistQueu
145b0 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 20 74  e destinations t
145c0 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51 75  o work. */.  iQu
145d0 65 75 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  eue = pParse->nT
145e0 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6f  ab++;.  if( p->o
145f0 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
14600 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65     eDest = pOrde
14610 72 42 79 20 3f 20 53 52 54 5f 44 69 73 74 51 75  rBy ? SRT_DistQu
14620 65 75 65 20 3a 20 53 52 54 5f 44 69 73 74 46 69  eue : SRT_DistFi
14630 66 6f 3b 0a 20 20 20 20 69 44 69 73 74 69 6e 63  fo;.    iDistinc
14640 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
14650 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
14660 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42   eDest = pOrderB
14670 79 20 3f 20 53 52 54 5f 51 75 65 75 65 20 3a 20  y ? SRT_Queue : 
14680 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20 20  SRT_Fifo;.  }.  
14690 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
146a0 74 49 6e 69 74 28 26 64 65 73 74 51 75 65 75 65  tInit(&destQueue
146b0 2c 20 65 44 65 73 74 2c 20 69 51 75 65 75 65 29  , eDest, iQueue)
146c0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
146d0 20 63 75 72 73 6f 72 73 20 66 6f 72 20 43 75 72   cursors for Cur
146e0 72 65 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e 64  rent, Queue, and
146f0 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20 20   Distinct. */.  
14700 72 65 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b 70  regCurrent = ++p
14710 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73  Parse->nMem;.  s
14720 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
14730 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
14740 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20 72 65 67  o, iCurrent, reg
14750 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b 0a  Current, nCol);.
14760 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
14770 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  {.    KeyInfo *p
14780 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74 69 53  KeyInfo = multiS
14790 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49  electOrderByKeyI
147a0 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31  nfo(pParse, p, 1
147b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
147c0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
147d0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51  penEphemeral, iQ
147e0 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  ueue, pOrderBy->
147f0 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20  nExpr+2, 0,.    
14800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14810 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
14820 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
14830 20 20 20 20 64 65 73 74 51 75 65 75 65 2e 70 4f      destQueue.pO
14840 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
14850 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
14860 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14870 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
14880 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 6e  meral, iQueue, n
14890 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62 65  Col);.  }.  Vdbe
148a0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75 65  Comment((v, "Que
148b0 75 65 20 74 61 62 6c 65 22 29 29 3b 0a 20 20 69  ue table"));.  i
148c0 66 28 20 69 44 69 73 74 69 6e 63 74 20 29 7b 0a  f( iDistinct ){.
148d0 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
148e0 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  phm[0] = sqlite3
148f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14900 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
14910 69 44 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20  iDistinct, 0);. 
14920 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c     p->selFlags |
14930 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72  = SF_UsesEphemer
14940 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65  al;.  }..  /* De
14950 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42  tach the ORDER B
14960 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68  Y clause from th
14970 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  e compound SELEC
14980 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72  T */.  p->pOrder
14990 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 74  By = 0;..  /* St
149a0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
149b0 6f 66 20 74 68 65 20 73 65 74 75 70 2d 71 75 65  of the setup-que
149c0 72 79 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f 0a  ry in Queue. */.
149d0 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20    pSetup->pNext 
149e0 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  = 0;.  rc = sqli
149f0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
14a00 2c 20 70 53 65 74 75 70 2c 20 26 64 65 73 74 51  , pSetup, &destQ
14a10 75 65 75 65 29 3b 0a 20 20 70 53 65 74 75 70 2d  ueue);.  pSetup-
14a20 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 69 66  >pNext = p;.  if
14a30 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
14a40 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65  of_recursive_que
14a50 72 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74  ry;..  /* Find t
14a60 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 74  he next row in t
14a70 68 65 20 51 75 65 75 65 20 61 6e 64 20 6f 75 74  he Queue and out
14a80 70 75 74 20 74 68 61 74 20 72 6f 77 20 2a 2f 0a  put that row */.
14a90 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69    addrTop = sqli
14aa0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14ab0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 51 75 65   OP_Rewind, iQue
14ac0 75 65 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 20  ue, addrBreak); 
14ad0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
14ae0 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20  ..  /* Transfer 
14af0 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20  the next row in 
14b00 51 75 65 75 65 20 6f 76 65 72 20 74 6f 20 43 75  Queue over to Cu
14b10 72 72 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74  rrent */.  sqlit
14b20 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
14b30 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 75 72  OP_NullRow, iCur
14b40 72 65 6e 74 29 3b 20 2f 2a 20 54 6f 20 72 65 73  rent); /* To res
14b50 65 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  et column cache 
14b60 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
14b70 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
14b80 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
14b90 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75 65 75 65 2c  _Column, iQueue,
14ba0 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
14bb0 2b 31 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b  +1, regCurrent);
14bc0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
14bd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14be0 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 69  v, OP_RowData, i
14bf0 51 75 65 75 65 2c 20 72 65 67 43 75 72 72 65 6e  Queue, regCurren
14c00 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
14c10 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
14c20 50 5f 44 65 6c 65 74 65 2c 20 69 51 75 65 75 65  P_Delete, iQueue
14c30 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20  );..  /* Output 
14c40 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69  the single row i
14c50 6e 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 61  n Current */.  a
14c60 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65  ddrCont = sqlite
14c70 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
14c80 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28  );.  codeOffset(
14c90 76 2c 20 72 65 67 4f 66 66 73 65 74 2c 20 61 64  v, regOffset, ad
14ca0 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c 65 63  drCont);.  selec
14cb0 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
14cc0 65 2c 20 70 2c 20 69 43 75 72 72 65 6e 74 2c 0a  e, p, iCurrent,.
14cd0 20 20 20 20 20 20 30 2c 20 30 2c 20 70 44 65 73        0, 0, pDes
14ce0 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64  t, addrCont, add
14cf0 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 72  rBreak);.  if( r
14d00 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  egLimit ){.    s
14d10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14d20 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a  (v, OP_DecrJumpZ
14d30 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c 20 61  ero, regLimit, a
14d40 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56  ddrBreak);.    V
14d50 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
14d60 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
14d70 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
14d80 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f   addrCont);..  /
14d90 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 72 65  * Execute the re
14da0 63 75 72 73 69 76 65 20 53 45 4c 45 43 54 20 74  cursive SELECT t
14db0 61 6b 69 6e 67 20 74 68 65 20 73 69 6e 67 6c 65  aking the single
14dc0 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20   row in Current 
14dd0 61 73 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  as.  ** the valu
14de0 65 20 66 6f 72 20 74 68 65 20 72 65 63 75 72 73  e for the recurs
14df0 69 76 65 2d 74 61 62 6c 65 2e 20 53 74 6f 72 65  ive-table. Store
14e00 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
14e10 74 68 65 20 51 75 65 75 65 2e 0a 20 20 2a 2f 0a  the Queue..  */.
14e20 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
14e30 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
14e40 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
14e50 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
14e60 22 72 65 63 75 72 73 69 76 65 20 61 67 67 72 65  "recursive aggre
14e70 67 61 74 65 20 71 75 65 72 69 65 73 20 6e 6f 74  gate queries not
14e80 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20   supported");.  
14e90 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 70 50  }else{.    p->pP
14ea0 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 73 71  rior = 0;.    sq
14eb0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
14ec0 73 65 2c 20 70 2c 20 26 64 65 73 74 51 75 65 75  se, p, &destQueu
14ed0 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
14ee0 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a  p->pPrior==0 );.
14ef0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
14f00 70 53 65 74 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f  pSetup;.  }..  /
14f10 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20 74  * Keep running t
14f20 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68  he loop until th
14f30 65 20 51 75 65 75 65 20 69 73 20 65 6d 70 74 79  e Queue is empty
14f40 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
14f50 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f 70  eGoto(v, addrTop
14f60 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
14f70 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
14f80 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a 65 6e 64  addrBreak);..end
14f90 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75  _of_recursive_qu
14fa0 65 72 79 3a 0a 20 20 73 71 6c 69 74 65 33 45 78  ery:.  sqlite3Ex
14fb0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
14fc0 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64  rse->db, p->pOrd
14fd0 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70 4f 72 64  erBy);.  p->pOrd
14fe0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
14ff0 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  .  p->pLimit = p
15000 4c 69 6d 69 74 3b 0a 20 20 72 65 74 75 72 6e 3b  Limit;.  return;
15010 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
15020 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a  ITE_OMIT_CTE */.
15030 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
15040 72 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69 63  rences */.static
15050 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
15060 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65  OrderBy(.  Parse
15070 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
15080 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
15090 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
150a0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
150b0 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
150c0 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
150d0 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
150e0 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
150f0 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
15100 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
15110 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a  lts */.);../*.**
15120 20 48 61 6e 64 6c 65 20 74 68 65 20 73 70 65 63   Handle the spec
15130 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 63 6f  ial case of a co
15140 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68  mpound-select th
15150 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72  at originates fr
15160 6f 6d 20 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63  om a.** VALUES c
15170 6c 61 75 73 65 2e 20 20 42 79 20 68 61 6e 64 6c  lause.  By handl
15180 69 6e 67 20 74 68 69 73 20 61 73 20 61 20 73 70  ing this as a sp
15190 65 63 69 61 6c 20 63 61 73 65 2c 20 77 65 20 61  ecial case, we a
151a0 76 6f 69 64 20 64 65 65 70 0a 2a 2a 20 72 65 63  void deep.** rec
151b0 75 72 73 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73  ursion, and thus
151c0 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20   do not need to 
151d0 65 6e 66 6f 72 63 65 20 74 68 65 20 53 51 4c 49  enforce the SQLI
151e0 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e  TE_LIMIT_COMPOUN
151f0 44 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61  D_SELECT.** on a
15200 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a   VALUES clause..
15210 2a 2a 0a 2a 2a 20 42 65 63 61 75 73 65 20 74 68  **.** Because th
15220 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20  e Select object 
15230 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20  originates from 
15240 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 3a  a VALUES clause:
15250 0a 2a 2a 20 20 20 28 31 29 20 54 68 65 72 65 20  .**   (1) There 
15260 69 73 20 6e 6f 20 4c 49 4d 49 54 20 6f 72 20 4f  is no LIMIT or O
15270 46 46 53 45 54 20 6f 72 20 65 6c 73 65 20 74 68  FFSET or else th
15280 65 72 65 20 69 73 20 61 20 4c 49 4d 49 54 20 6f  ere is a LIMIT o
15290 66 20 65 78 61 63 74 6c 79 20 31 0a 2a 2a 20 20  f exactly 1.**  
152a0 20 28 32 29 20 41 6c 6c 20 74 65 72 6d 73 20 61   (2) All terms a
152b0 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a 20  re UNION ALL.** 
152c0 20 20 28 33 29 20 54 68 65 72 65 20 69 73 20 6e    (3) There is n
152d0 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
152e0 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 4c 49 4d  e.**.** The "LIM
152f0 49 54 20 6f 66 20 65 78 61 63 74 6c 79 20 31 22  IT of exactly 1"
15300 20 63 61 73 65 20 6f 66 20 63 6f 6e 64 69 74 69   case of conditi
15310 6f 6e 20 28 31 29 20 63 6f 6d 65 73 20 61 62 6f  on (1) comes abo
15320 75 74 20 77 68 65 6e 20 61 20 56 41 4c 55 45 53  ut when a VALUES
15330 0a 2a 2a 20 63 6c 61 75 73 65 20 6f 63 63 75 72  .** clause occur
15340 73 20 77 69 74 68 69 6e 20 73 63 61 6c 61 72 20  s within scalar 
15350 65 78 70 72 65 73 73 69 6f 6e 20 28 65 78 3a 20  expression (ex: 
15360 22 53 45 4c 45 43 54 20 28 56 41 4c 55 45 53 28  "SELECT (VALUES(
15370 31 29 2c 28 32 29 2c 28 33 29 29 22 29 2e 0a 2a  1),(2),(3))")..*
15380 2a 20 54 68 65 20 73 71 6c 69 74 65 33 43 6f 64  * The sqlite3Cod
15390 65 53 75 62 73 65 6c 65 63 74 20 77 69 6c 6c 20  eSubselect will 
153a0 68 61 76 65 20 61 64 64 65 64 20 74 68 65 20 4c  have added the L
153b0 49 4d 49 54 20 31 20 63 6c 61 75 73 65 20 69 6e  IMIT 1 clause in
153c0 20 74 68 74 20 63 61 73 65 2e 0a 2a 2a 20 53 69   tht case..** Si
153d0 6e 63 65 20 74 68 65 20 6c 69 6d 69 74 20 69 73  nce the limit is
153e0 20 65 78 61 63 74 6c 79 20 31 2c 20 77 65 20 6f   exactly 1, we o
153f0 6e 6c 79 20 6e 65 65 64 20 74 6f 20 65 76 61 6c  nly need to eval
15400 75 74 65 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  utes the left-mo
15410 73 74 20 56 41 4c 55 45 53 2e 0a 2a 2f 0a 73 74  st VALUES..*/.st
15420 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
15430 6c 65 63 74 56 61 6c 75 65 73 28 0a 20 20 50 61  lectValues(.  Pa
15440 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
15450 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
15460 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
15470 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
15480 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
15490 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
154a0 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
154b0 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
154c0 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
154d0 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
154e0 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53  esults */.){.  S
154f0 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 0a 20  elect *pPrior;. 
15500 20 53 65 6c 65 63 74 20 2a 70 52 69 67 68 74 6d   Select *pRightm
15510 6f 73 74 20 3d 20 70 3b 0a 20 20 69 6e 74 20 6e  ost = p;.  int n
15520 52 6f 77 20 3d 20 31 3b 0a 20 20 69 6e 74 20 72  Row = 1;.  int r
15530 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  c = 0;.  assert(
15540 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
15550 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29 3b 0a  F_MultiValue );.
15560 20 20 64 6f 7b 0a 20 20 20 20 61 73 73 65 72 74    do{.    assert
15570 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
15580 53 46 5f 56 61 6c 75 65 73 20 29 3b 0a 20 20 20  SF_Values );.   
15590 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
155a0 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e 6f 70  TK_ALL || (p->op
155b0 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 70  ==TK_SELECT && p
155c0 2d 3e 70 50 72 69 6f 72 3d 3d 30 29 20 29 3b 0a  ->pPrior==0) );.
155d0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
155e0 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 45  Next==0 || p->pE
155f0 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 2d 3e  List->nExpr==p->
15600 70 4e 65 78 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  pNext->pEList->n
15610 45 78 70 72 20 29 3b 0a 20 20 20 20 69 66 28 20  Expr );.    if( 
15620 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 62  p->pPrior==0 ) b
15630 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74  reak;.    assert
15640 28 20 70 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65  ( p->pPrior->pNe
15650 78 74 3d 3d 70 20 29 3b 0a 20 20 20 20 70 20 3d  xt==p );.    p =
15660 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
15670 6e 52 6f 77 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65  nRow++;.  }while
15680 28 31 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  (1);.  while( p 
15690 29 7b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20  ){.    pPrior = 
156a0 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70  p->pPrior;.    p
156b0 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
156c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
156d0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
156e0 70 44 65 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  pDest);.    p->p
156f0 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
15700 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20 70 52      if( rc || pR
15710 69 67 68 74 6d 6f 73 74 2d 3e 70 4c 69 6d 69 74  ightmost->pLimit
15720 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 2d   ) break;.    p-
15730 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 52  >nSelectRow = nR
15740 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  ow;.    p = p->p
15750 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Next;.  }.  retu
15760 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
15770 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
15780 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73  called to proces
15790 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  s a compound que
157a0 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20  ry form from.** 
157b0 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  two or more sepa
157c0 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73 69  rate queries usi
157d0 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20  ng UNION, UNION 
157e0 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a  ALL, EXCEPT, or.
157f0 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a  ** INTERSECT.**.
15800 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f  ** "p" points to
15810 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
15820 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69  of the two queri
15830 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f  es.  the query o
15840 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73  n the.** left is
15850 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65   p->pPrior.  The
15860 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c   left query coul
15870 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70  d also be a comp
15880 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e  ound query.** in
15890 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73   which case this
158a0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
158b0 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
158c0 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ely. .**.** The 
158d0 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74  results of the t
158e0 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74  otal query are t
158f0 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
15900 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  o a destination.
15910 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74  ** of type eDest
15920 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20   with parameter 
15930 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  iParm..**.** Exa
15940 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65  mple 1:  Conside
15950 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f  r a three-way co
15960 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65  mpound SQL state
15970 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment..**.**     
15980 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
15990 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20   UNION SELECT b 
159a0 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45  FROM t2 UNION SE
159b0 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
159c0 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d  *.** This statem
159d0 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70  ent is parsed up
159e0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
159f0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20  **     SELECT c 
15a00 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20  FROM t3.**      
15a10 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d  |.**      `-----
15a20 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  >  SELECT b FROM
15a30 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   t2.**          
15a40 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
15a50 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d            `-----
15a60 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f  ->  SELECT a FRO
15a70 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  M t1.**.** The a
15a80 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61  rrows in the dia
15a90 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65  gram above repre
15aa0 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e  sent the Select.
15ab0 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a  pPrior pointer..
15ac0 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  ** So if this ro
15ad0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
15ae0 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20  with p equal to 
15af0 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68  the t3 query, th
15b00 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c  en.** pPrior wil
15b10 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72  l be the t2 quer
15b20 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62  y.  p->op will b
15b30 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68  e TK_UNION in th
15b40 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e  is case..**.** N
15b50 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75  otice that becau
15b60 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51  se of the way SQ
15b70 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70  Lite parses comp
15b80 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68  ound SELECTs, th
15b90 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
15ba0 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67  selects always g
15bb0 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74  roup from left t
15bc0 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74  o right..*/.stat
15bd0 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
15be0 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
15bf0 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
15c00 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
15c10 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
15c20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15c30 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
15c40 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
15c50 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
15c60 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
15c70 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
15c80 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
15c90 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
15ca0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20  SQLITE_OK;   /* 
15cb0 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f  Success code fro
15cc0 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  m a subroutine *
15cd0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
15ce0 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
15cf0 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
15d00 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
15d10 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
15d20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
15d30 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
15d40 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
15d50 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
15d60 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72  t;      /* Alter
15d70 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73 74  native data dest
15d80 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  ination */.  Sel
15d90 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30  ect *pDelete = 0
15da0 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73  ;  /* Chain of s
15db0 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f  imple selects to
15dc0 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c   delete */.  sql
15dd0 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
15de0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
15df0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66  onnection */.#if
15e00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15e10 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69  _EXPLAIN.  int i
15e20 53 75 62 31 20 3d 20 30 3b 20 20 20 20 20 20 20  Sub1 = 0;       
15e30 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65   /* EQP id of le
15e40 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f  ft-hand query */
15e50 0a 20 20 69 6e 74 20 69 53 75 62 32 20 3d 20 30  .  int iSub2 = 0
15e60 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20  ;        /* EQP 
15e70 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64  id of right-hand
15e80 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66   query */.#endif
15e90 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
15ea0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
15eb0 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63  ER BY or LIMIT c
15ec0 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53  lause on prior S
15ed0 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20  ELECTs.  Only.  
15ee0 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69 67  ** the last (rig
15ef0 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20  ht-most) SELECT 
15f00 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61  in the series ma
15f10 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  y have an ORDER 
15f20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a  BY or LIMIT..  *
15f30 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26 26  /.  assert( p &&
15f40 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f   p->pPrior );  /
15f50 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * Calling functi
15f60 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  on guarantees th
15f70 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73  is much */.  ass
15f80 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
15f90 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
15fa0 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  )==0 || p->op==T
15fb0 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  K_ALL || p->op==
15fc0 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62  TK_UNION );.  db
15fd0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
15fe0 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
15ff0 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70  ior;.  dest = *p
16000 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50 72 69  Dest;.  if( pPri
16010 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 7c 7c 20  or->pOrderBy || 
16020 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29  pPrior->pLimit )
16030 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
16040 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 25 73  orMsg(pParse,"%s
16050 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
16060 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74  ome after %s not
16070 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20   before",.      
16080 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
16090 21 3d 30 20 3f 20 22 4f 52 44 45 52 20 42 59 22  !=0 ? "ORDER BY"
160a0 20 3a 20 22 4c 49 4d 49 54 22 2c 20 73 65 6c 65   : "LIMIT", sele
160b0 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
160c0 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
160d0 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
160e0 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
160f0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
16100 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  be(pParse);.  as
16110 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f  sert( v!=0 );  /
16120 2a 20 54 68 65 20 56 44 42 45 20 61 6c 72 65 61  * The VDBE alrea
16130 64 79 20 63 72 65 61 74 65 64 20 62 79 20 63 61  dy created by ca
16140 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a  lling function *
16150 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74  /..  /* Create t
16160 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74  he destination t
16170 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
16180 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f  f necessary.  */
16190 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73  .  if( dest.eDes
161a0 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
161b0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
161c0 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
161d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
161e0 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
161f0 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69 53 44 50  meral, dest.iSDP
16200 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  arm, p->pEList->
16210 6e 45 78 70 72 29 3b 0a 20 20 20 20 64 65 73 74  nExpr);.    dest
16220 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62  .eDest = SRT_Tab
16230 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70  le;.  }..  /* Sp
16240 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20 66  ecial handling f
16250 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65  or a compound-se
16260 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67 69 6e  lect that origin
16270 61 74 65 73 20 61 73 20 61 20 56 41 4c 55 45 53  ates as a VALUES
16280 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
16290 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
162a0 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20  & SF_MultiValue 
162b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74  ){.    rc = mult
162c0 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28 70 50  iSelectValues(pP
162d0 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b  arse, p, &dest);
162e0 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
162f0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
16300 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
16310 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74  all SELECTs in t
16320 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76  he statement hav
16330 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
16340 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20  r of elements.  
16350 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73 75  ** in their resu
16360 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20  lt sets..  */.  
16370 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
16380 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c  t && pPrior->pEL
16390 69 73 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ist );.  assert(
163a0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
163b0 72 3d 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  r==pPrior->pELis
163c0 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 0a 23 69 66  t->nExpr );..#if
163d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
163e0 5f 43 54 45 0a 20 20 69 66 28 20 70 2d 3e 73 65  _CTE.  if( p->se
163f0 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
16400 72 73 69 76 65 20 29 7b 0a 20 20 20 20 67 65 6e  rsive ){.    gen
16410 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69  erateWithRecursi
16420 76 65 51 75 65 72 79 28 70 50 61 72 73 65 2c 20  veQuery(pParse, 
16430 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 7d 65 6c  p, &dest);.  }el
16440 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  se.#endif..  /* 
16450 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  Compound SELECTs
16460 20 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52   that have an OR
16470 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
16480 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61  e handled separa
16490 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tely..  */.  if(
164a0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
164b0 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69      return multi
164c0 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50  SelectOrderBy(pP
164d0 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b  arse, p, pDest);
164e0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 47  .  }else..  /* G
164f0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
16500 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
16510 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ght SELECT state
16520 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77  ments..  */.  sw
16530 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
16540 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
16550 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
16560 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
16570 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 61 73  nLimit;.      as
16580 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70  sert( !pPrior->p
16590 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 70  Limit );.      p
165a0 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20  Prior->iLimit = 
165b0 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->iLimit;.     
165c0 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74   pPrior->iOffset
165d0 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20   = p->iOffset;. 
165e0 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69       pPrior->pLi
165f0 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
16600 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
16610 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20  tInteger(iSub1, 
16620 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
16630 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
16640 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
16650 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
16660 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70   &dest);.      p
16670 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
16680 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
16690 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
166a0 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
166b0 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50     }.      p->pP
166c0 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
166d0 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69  p->iLimit = pPri
166e0 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20  or->iLimit;.    
166f0 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70    p->iOffset = p
16700 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a  Prior->iOffset;.
16710 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69        if( p->iLi
16720 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  mit ){.        a
16730 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
16740 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
16750 4e 6f 74 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b  Not, p->iLimit);
16760 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
16770 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
16780 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20  mment((v, "Jump 
16790 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72  ahead if LIMIT r
167a0 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20  eached"));.     
167b0 20 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65     if( p->iOffse
167c0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  t ){.          s
167d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
167e0 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d  (v, OP_OffsetLim
167f0 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  it,.            
16800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16810 70 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e 69 4f  p->iLimit, p->iO
16820 66 66 73 65 74 2b 31 2c 20 70 2d 3e 69 4f 66 66  ffset+1, p->iOff
16830 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  set);.        }.
16840 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78        }.      ex
16850 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
16860 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69  iSub2, pParse->i
16870 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
16880 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
16890 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
168a0 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  p, &dest);.     
168b0 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
168c0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
168d0 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
168e0 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
168f0 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
16900 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  .      p->nSelec
16910 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  tRow = sqlite3Lo
16920 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65  gEstAdd(p->nSele
16930 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e  ctRow, pPrior->n
16940 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20  SelectRow);.    
16950 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c    if( pPrior->pL
16960 69 6d 69 74 0a 20 20 20 20 20 20 20 26 26 20 73  imit.       && s
16970 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
16980 67 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  ger(pPrior->pLim
16990 69 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 4c 69 6d  it->pLeft, &nLim
169a0 69 74 29 0a 20 20 20 20 20 20 20 26 26 20 6e 4c  it).       && nL
169b0 69 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e 53 65  imit>0 && p->nSe
169c0 6c 65 63 74 52 6f 77 20 3e 20 73 71 6c 69 74 65  lectRow > sqlite
169d0 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 4c 69  3LogEst((u64)nLi
169e0 6d 69 74 29 20 0a 20 20 20 20 20 20 29 7b 0a 20  mit) .      ){. 
169f0 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63         p->nSelec
16a00 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  tRow = sqlite3Lo
16a10 67 45 73 74 28 28 75 36 34 29 6e 4c 69 6d 69 74  gEst((u64)nLimit
16a20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
16a30 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20   if( addr ){.   
16a40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16a50 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
16a60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
16a70 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
16a80 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
16a90 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e  :.    case TK_UN
16aa0 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ION: {.      int
16ab0 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a   unionTab;    /*
16ac0 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
16ad0 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  f the temporary 
16ae0 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65  table holding re
16af0 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 75 38  sult */.      u8
16b00 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f   op = 0;       /
16b10 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54  * One of the SRT
16b20 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  _ operations to 
16b30 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f  apply to self */
16b40 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72  .      int prior
16b50 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53  Op;     /* The S
16b60 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  RT_ operation to
16b70 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20   apply to prior 
16b80 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20  selects */.     
16b90 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20   Expr *pLimit;  
16ba0 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65    /* Saved value
16bb0 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 20  s of p->nLimit  
16bc0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
16bd0 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  r;.      SelectD
16be0 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a  est uniondest;..
16bf0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16c00 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  p->op==TK_EXCEPT
16c10 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
16c20 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  se( p->op==TK_UN
16c30 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 72 69  ION );.      pri
16c40 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e  orOp = SRT_Union
16c50 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74  ;.      if( dest
16c60 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20  .eDest==priorOp 
16c70 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
16c80 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d   can reuse a tem
16c90 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e  porary table gen
16ca0 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c 45  erated by a SELE
16cb0 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20  CT to our.      
16cc0 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20    ** right..    
16cd0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
16ce0 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74  ssert( p->pLimit
16cf0 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e  ==0 );      /* N
16d00 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65  ot allowed on le
16d10 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20  ftward elements 
16d20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  */.        union
16d30 54 61 62 20 3d 20 64 65 73 74 2e 69 53 44 50 61  Tab = dest.iSDPa
16d40 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  rm;.      }else{
16d50 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77  .        /* We w
16d60 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61  ill need to crea
16d70 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f  te our own tempo
16d80 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f  rary table to ho
16d90 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ld the.        *
16da0 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  * intermediate r
16db0 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20  esults..        
16dc0 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  */.        union
16dd0 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
16de0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ab++;.        as
16df0 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
16e00 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  y==0 );.        
16e10 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
16e20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
16e30 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e  penEphemeral, un
16e40 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  ionTab, 0);.    
16e50 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
16e60 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
16e70 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  = -1 );.        
16e80 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
16e90 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  0] = addr;.     
16ea0 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74     findRightmost
16eb0 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  (p)->selFlags |=
16ec0 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
16ed0 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  l;.        asser
16ee0 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
16ef0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
16f00 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43  * Code the SELEC
16f10 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
16f20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a  our left.      *
16f30 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
16f40 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42  !pPrior->pOrderB
16f50 79 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  y );.      sqlit
16f60 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
16f70 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69  (&uniondest, pri
16f80 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b  orOp, unionTab);
16f90 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
16fa0 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20  tInteger(iSub1, 
16fb0 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
16fc0 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
16fd0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
16fe0 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
16ff0 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20   &uniondest);.  
17000 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
17010 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
17020 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
17030 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
17040 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ode the current 
17050 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
17060 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
17070 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  if( p->op==TK_EX
17080 43 45 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20  CEPT ){.        
17090 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b  op = SRT_Except;
170a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
170b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
170c0 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
170d0 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52  .        op = SR
170e0 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d  T_Union;.      }
170f0 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
17100 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d   = 0;.      pLim
17110 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
17120 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
17130 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e  = 0;.      union
17140 64 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b  dest.eDest = op;
17150 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
17160 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20  tInteger(iSub2, 
17170 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
17180 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
17190 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
171a0 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69  (pParse, p, &uni
171b0 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74  ondest);.      t
171c0 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
171d0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
171e0 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e  /* Query flatten
171f0 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65  ing in sqlite3Se
17200 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72 65 66  lect() might ref
17210 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e  ill p->pOrderBy.
17220 0a 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72  .      ** Be sur
17230 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70  e to delete p->p
17240 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f  OrderBy, therefo
17250 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d  re, to avoid a m
17260 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20  emory leak. */. 
17270 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
17280 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
17290 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
172a0 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e     pDelete = p->
172b0 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
172c0 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
172d0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65  ;.      p->pOrde
172e0 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  rBy = 0;.      i
172f0 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  f( p->op==TK_UNI
17300 4f 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  ON ){.        p-
17310 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71  >nSelectRow = sq
17320 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70  lite3LogEstAdd(p
17330 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70 50  ->nSelectRow, pP
17340 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
17350 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
17360 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
17370 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  te(db, p->pLimit
17380 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  );.      p->pLim
17390 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  it = pLimit;.   
173a0 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30     p->iLimit = 0
173b0 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73  ;.      p->iOffs
173c0 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f  et = 0;..      /
173d0 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61  * Convert the da
173e0 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72  ta in the tempor
173f0 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77  ary table into w
17400 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20  hatever form.   
17410 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74     ** it is that
17420 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65   we currently ne
17430 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
17440 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 6f 6e     assert( union
17450 54 61 62 3d 3d 64 65 73 74 2e 69 53 44 50 61 72  Tab==dest.iSDPar
17460 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65 73 74 21  m || dest.eDest!
17470 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20  =priorOp );.    
17480 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
17490 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20  !=priorOp ){.   
174a0 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
174b0 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a  iBreak, iStart;.
174c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
174d0 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
174e0 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
174f0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
17500 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69  el(v);.        i
17510 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
17520 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
17530 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c          computeL
17540 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
17550 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29  arse, p, iBreak)
17560 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
17570 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17580 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54  P_Rewind, unionT
17590 61 62 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  ab, iBreak); Vdb
175a0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
175b0 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
175c0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
175d0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
175e0 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
175f0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 75 6e 69  p(pParse, p, uni
17600 6f 6e 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20  onTab,.         
17610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
17620 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e  , 0, &dest, iCon
17630 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  t, iBreak);.    
17640 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
17650 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
17660 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73  Cont);.        s
17670 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17680 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69  (v, OP_Next, uni
17690 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 20  onTab, iStart); 
176a0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
176b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
176c0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
176d0 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
176e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
176f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
17700 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  se, unionTab, 0)
17710 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17720 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
17730 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
17740 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  ( p->op==TK_INTE
17750 52 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20  RSECT ); {.     
17760 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b   int tab1, tab2;
17770 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74  .      int iCont
17780 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
17790 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  ;.      Expr *pL
177a0 69 6d 69 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  imit;.      int 
177b0 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65  addr;.      Sele
177c0 63 74 44 65 73 74 20 69 6e 74 65 72 73 65 63 74  ctDest intersect
177d0 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  dest;.      int 
177e0 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e  r1;..      /* IN
177f0 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65  TERSECT is diffe
17800 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74  rent from the ot
17810 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65  hers since it re
17820 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20  quires.      ** 
17830 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  two temporary ta
17840 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20  bles.  Hence it 
17850 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65  has its own case
17860 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a  .  Begin.      *
17870 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * by allocating 
17880 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77 69  the tables we wi
17890 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a  ll need..      *
178a0 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20 70  /.      tab1 = p
178b0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
178c0 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61 72       tab2 = pPar
178d0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
178e0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
178f0 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20  derBy==0 );..   
17900 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
17910 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17920 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
17930 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
17940 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
17950 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d  OpenEphm[0] == -
17960 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  1 );.      p->ad
17970 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
17980 61 64 64 72 3b 0a 20 20 20 20 20 20 66 69 6e 64  addr;.      find
17990 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65  Rightmost(p)->se
179a0 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
179b0 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20  sEphemeral;.    
179c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
179d0 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ist );..      /*
179e0 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
179f0 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e  s to our left in
17a00 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
17a10 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20  le "tab1"..     
17a20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
17a30 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
17a40 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20  &intersectdest, 
17a50 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29  SRT_Union, tab1)
17a60 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
17a70 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c  etInteger(iSub1,
17a80 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
17a90 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
17aa0 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
17ab0 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
17ac0 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  , &intersectdest
17ad0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
17ae0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
17af0 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
17b00 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
17b10 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
17b20 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f  rent SELECT into
17b30 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
17b40 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f   "tab2".      */
17b50 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
17b60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17b70 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
17b80 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ral, tab2, 0);. 
17b90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
17ba0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
17bb0 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70  == -1 );.      p
17bc0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
17bd0 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
17be0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
17bf0 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
17c00 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
17c10 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
17c20 20 20 20 20 69 6e 74 65 72 73 65 63 74 64 65 73      intersectdes
17c30 74 2e 69 53 44 50 61 72 6d 20 3d 20 74 61 62 32  t.iSDParm = tab2
17c40 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
17c50 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
17c60 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
17c70 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
17c80 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
17c90 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e  t(pParse, p, &in
17ca0 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20  tersectdest);.  
17cb0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
17cc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
17cd0 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
17ce0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
17cf0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
17d00 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  or;.      if( p-
17d10 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50 72 69  >nSelectRow>pPri
17d20 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29  or->nSelectRow )
17d30 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
17d40 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
17d50 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Row;.      sqlit
17d60 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
17d70 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
17d80 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
17d90 4c 69 6d 69 74 3b 0a 0a 20 20 20 20 20 20 2f 2a  Limit;..      /*
17da0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
17db0 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72  o take the inter
17dc0 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  section of the t
17dd0 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  wo temporary.   
17de0 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20     ** tables..  
17df0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
17e00 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
17e10 3b 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d  ;.      iBreak =
17e20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
17e30 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
17e40 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  iCont = sqlite3V
17e50 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
17e60 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69  .      computeLi
17e70 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
17e80 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b  rse, p, iBreak);
17e90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17ea0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
17eb0 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72  ewind, tab1, iBr
17ec0 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
17ed0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 72 31 20  ge(v);.      r1 
17ee0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
17ef0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
17f00 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
17f10 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17f20 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 74 61 62   OP_RowData, tab
17f30 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  1, r1);.      sq
17f40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
17f50 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  nt(v, OP_NotFoun
17f60 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20  d, tab2, iCont, 
17f70 72 31 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65  r1, 0); VdbeCove
17f80 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
17f90 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
17fa0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
17fb0 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  ;.      selectIn
17fc0 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
17fd0 70 2c 20 74 61 62 31 2c 0a 20 20 20 20 20 20 20  p, tab1,.       
17fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
17ff0 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e  , 0, &dest, iCon
18000 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  t, iBreak);.    
18010 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
18020 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
18030 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
18040 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18050 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69  OP_Next, tab1, i
18060 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65  Start); VdbeCove
18070 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      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 42 72 65 61 6b  eLabel(v, iBreak
180a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
180b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
180c0 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29  _Close, tab2, 0)
180d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
180e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
180f0 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b  Close, tab1, 0);
18100 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
18110 20 20 7d 0a 20 20 7d 0a 0a 20 20 65 78 70 6c 61    }.  }..  expla
18120 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72  inComposite(pPar
18130 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31  se, p->op, iSub1
18140 2c 20 69 53 75 62 32 2c 20 70 2d 3e 6f 70 21 3d  , iSub2, p->op!=
18150 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43  TK_ALL);..  /* C
18160 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67  ompute collating
18170 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 64 20   sequences used 
18180 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61  by .  ** tempora
18190 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64  ry tables needed
181a0 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
181b0 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
181c0 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74  t..  ** Attach t
181d0 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
181e0 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70  ture to all temp
181f0 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 20 20  orary tables..  
18200 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63  **.  ** This sec
18210 74 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74  tion is run by t
18220 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45  he right-most SE
18230 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f  LECT statement o
18240 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54  nly..  ** SELECT
18250 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74   statements to t
18260 68 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73  he left always s
18270 6b 69 70 20 74 68 69 73 20 70 61 72 74 2e 20 20  kip this part.  
18280 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20  The right-most. 
18290 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74   ** SELECT might
182a0 20 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20   also skip this 
182b0 70 61 72 74 20 69 66 20 69 74 20 68 61 73 20 6e  part if it has n
182c0 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
182d0 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65  e and.  ** no te
182e0 6d 70 20 74 61 62 6c 65 73 20 61 72 65 20 72 65  mp tables are re
182f0 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  quired..  */.  i
18300 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
18310 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
18320 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20  l ){.    int i; 
18330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18340 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
18350 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65  ounter */.    Ke
18360 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
18370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
18380 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
18390 65 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74  e for the result
183a0 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65   set */.    Sele
183b0 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  ct *pLoop;      
183c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
183d0 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68   looping through
183e0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
183f0 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65  ts */.    CollSe
18400 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20  q **apColl;     
18410 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
18420 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 70  ooping through p
18430 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d  KeyInfo->aColl[]
18440 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c   */.    int nCol
18450 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18460 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
18470 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65  of columns in re
18480 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20  sult set */..   
18490 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4e 65 78   assert( p->pNex
184a0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e 43 6f 6c  t==0 );.    nCol
184b0 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45   = p->pEList->nE
184c0 78 70 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  xpr;.    pKeyInf
184d0 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
184e0 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 43 6f 6c  foAlloc(db, nCol
184f0 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21 70  , 1);.    if( !p
18500 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
18510 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
18520 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  EM_BKPT;.      g
18530 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
18540 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
18550 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d  for(i=0, apColl=
18560 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b  pKeyInfo->aColl;
18570 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70   i<nCol; i++, ap
18580 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a  Coll++){.      *
18590 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65  apColl = multiSe
185a0 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
185b0 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20  se, p, i);.     
185c0 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20   if( 0==*apColl 
185d0 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f  ){.        *apCo
185e0 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
185f0 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
18600 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70  }..    for(pLoop
18610 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70  =p; pLoop; pLoop
18620 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b  =pLoop->pPrior){
18630 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
18640 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<2; i++){.     
18650 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c     int addr = pL
18660 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  oop->addrOpenEph
18670 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  m[i];.        if
18680 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20  ( addr<0 ){.    
18690 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20        /* If [0] 
186a0 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b  is unused then [
186b0 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65  1] is also unuse
186c0 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20  d.  So we can.  
186d0 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79          ** alway
186e0 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61  s safely abort a
186f0 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69  s soon as the fi
18700 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20  rst unused slot 
18710 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  is found */.    
18720 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
18730 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  oop->addrOpenEph
18740 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20  m[1]<0 );.      
18750 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
18760 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
18770 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
18780 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b  (v, addr, nCol);
18790 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
187a0 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
187b0 61 64 64 72 2c 20 28 63 68 61 72 2a 29 73 71 6c  addr, (char*)sql
187c0 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70  ite3KeyInfoRef(p
187d0 4b 65 79 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20  KeyInfo),.      
187e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187f0 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f        P4_KEYINFO
18800 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70  );.        pLoop
18810 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69  ->addrOpenEphm[i
18820 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  ] = -1;.      }.
18830 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
18840 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b  3KeyInfoUnref(pK
18850 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75  eyInfo);.  }..mu
18860 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a  lti_select_end:.
18870 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d    pDest->iSdst =
18880 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 70   dest.iSdst;.  p
18890 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64 65  Dest->nSdst = de
188a0 73 74 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c 69  st.nSdst;.  sqli
188b0 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
188c0 64 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20  db, pDelete);.  
188d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
188e0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
188f0 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
18900 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 72 72  CT */../*.** Err
18910 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72 20 77  or message for w
18920 68 65 6e 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  hen two or more 
18930 74 65 72 6d 73 20 6f 66 20 61 20 63 6f 6d 70 6f  terms of a compo
18940 75 6e 64 20 73 65 6c 65 63 74 20 68 61 76 65 20  und select have 
18950 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 73 69 7a  different.** siz
18960 65 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 2a  e result sets..*
18970 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
18980 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54 65 72 6d  lectWrongNumTerm
18990 73 45 72 72 6f 72 28 50 61 72 73 65 20 2a 70 50  sError(Parse *pP
189a0 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
189b0 7b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  {.  if( p->selFl
189c0 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20  ags & SF_Values 
189d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
189e0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
189f0 61 6c 6c 20 56 41 4c 55 45 53 20 6d 75 73 74 20  all VALUES must 
18a00 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
18a10 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 22 29 3b  mber of terms");
18a20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
18a30 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
18a40 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74  arse, "SELECTs t
18a50 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  o the left and r
18a60 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20  ight of %s".    
18a70 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20    " do not have 
18a80 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
18a90 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
18aa0 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65  s", selectOpName
18ab0 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 7d 0a  (p->op));.  }.}.
18ac0 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f  ./*.** Code an o
18ad0 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
18ae0 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e 65   for a coroutine
18af0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
18b00 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  of a.** SELECT s
18b10 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  tatment..**.** T
18b20 68 65 20 64 61 74 61 20 74 6f 20 62 65 20 6f 75  he data to be ou
18b30 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69 6e 65  tput is containe
18b40 64 20 69 6e 20 70 49 6e 2d 3e 69 53 64 73 74 2e  d in pIn->iSdst.
18b50 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a 20 70    There are.** p
18b60 49 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c 75 6d 6e  In->nSdst column
18b70 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 20  s to be output. 
18b80 20 70 44 65 73 74 20 69 73 20 77 68 65 72 65 20   pDest is where 
18b90 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f 75 6c  the output shoul
18ba0 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a  d.** be sent..**
18bb0 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20 69 73  .** regReturn is
18bc0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
18bd0 68 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  he register hold
18be0 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74 69  ing the subrouti
18bf0 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64 64  ne.** return add
18c00 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72  ress..**.** If r
18c10 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 69 74  egPrev>0 then it
18c20 20 69 73 20 74 68 65 20 66 69 72 73 74 20 72 65   is the first re
18c30 67 69 73 74 65 72 20 69 6e 20 61 20 76 65 63 74  gister in a vect
18c40 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72  or that.** recor
18c50 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ds the previous 
18c60 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67  output.  mem[reg
18c70 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61 67 20  Prev] is a flag 
18c80 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a  that is false.**
18c90 20 69 66 20 74 68 65 72 65 20 68 61 73 20 62 65   if there has be
18ca0 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f  en no previous o
18cb0 75 74 70 75 74 2e 20 20 49 66 20 72 65 67 50 72  utput.  If regPr
18cc0 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65 20 69  ev>0 then code i
18cd0 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 74  s.** generated t
18ce0 6f 20 73 75 70 70 72 65 73 73 20 64 75 70 6c 69  o suppress dupli
18cf0 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f  cates.  pKeyInfo
18d00 20 69 73 20 75 73 65 64 20 66 6f 72 20 63 6f 6d   is used for com
18d10 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a  paring.** keys..
18d20 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d  **.** If the LIM
18d30 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69  IT found in p->i
18d40 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68 65 64  Limit is reached
18d50 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65  , jump immediate
18d60 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e  ly to.** iBreak.
18d70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
18d80 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
18d90 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72 73 65  routine(.  Parse
18da0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
18db0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
18dc0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
18dd0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
18de0 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
18df0 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
18e00 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49 6e 2c  SelectDest *pIn,
18e10 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75          /* Corou
18e20 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67 20 64  tine supplying d
18e30 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ata */.  SelectD
18e40 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20  est *pDest,     
18e50 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 65 6e   /* Where to sen
18e60 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  d the data */.  
18e70 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c 20 20  int regReturn,  
18e80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
18e90 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65  eturn address re
18ea0 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
18eb0 72 65 67 50 72 65 76 2c 20 20 20 20 20 20 20 20  regPrev,        
18ec0 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
18ed0 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 2e  result register.
18ee0 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73 20    No uniqueness 
18ef0 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  if 0 */.  KeyInf
18f00 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
18f10 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69    /* For compari
18f20 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f 75 73  ng with previous
18f30 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20   entry */.  int 
18f40 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20  iBreak          
18f50 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
18f60 20 69 66 20 77 65 20 68 69 74 20 74 68 65 20 4c   if we hit the L
18f70 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  IMIT */.){.  Vdb
18f80 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
18f90 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e  Vdbe;.  int iCon
18fa0 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64 64  tinue;.  int add
18fb0 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73 71 6c  r;..  addr = sql
18fc0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
18fd0 64 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69  ddr(v);.  iConti
18fe0 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nue = sqlite3Vdb
18ff0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
19000 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75    /* Suppress du
19010 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49  plicates for UNI
19020 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20  ON, EXCEPT, and 
19030 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a  INTERSECT .  */.
19040 20 20 69 66 28 20 72 65 67 50 72 65 76 20 29 7b    if( regPrev ){
19050 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20  .    int addr1, 
19060 61 64 64 72 32 3b 0a 20 20 20 20 61 64 64 72 31  addr2;.    addr1
19070 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
19080 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
19090 2c 20 72 65 67 50 72 65 76 29 3b 20 56 64 62 65  , regPrev); Vdbe
190a0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
190b0 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33   addr2 = sqlite3
190c0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
190d0 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69  _Compare, pIn->i
190e0 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c  Sdst, regPrev+1,
190f0 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20 20   pIn->nSdst,.   
19100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19110 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
19120 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  *)sqlite3KeyInfo
19130 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50  Ref(pKeyInfo), P
19140 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
19150 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19160 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64  3(v, OP_Jump, ad
19170 64 72 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65  dr2+2, iContinue
19180 2c 20 61 64 64 72 32 2b 32 29 3b 20 56 64 62 65  , addr2+2); Vdbe
19190 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
191a0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
191b0 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
191c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
191d0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp3(v, OP_Copy
191e0 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65  , pIn->iSdst, re
191f0 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53  gPrev+1, pIn->nS
19200 64 73 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69  dst-1);.    sqli
19210 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19220 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
19230 72 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20  regPrev);.  }.  
19240 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
19250 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
19260 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53  eturn 0;..  /* S
19270 75 70 70 72 65 73 73 20 74 68 65 20 66 69 72 73  uppress the firs
19280 74 20 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73  t OFFSET entries
19290 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
192a0 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a 20 20  OFFSET clause.  
192b0 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28  */.  codeOffset(
192c0 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69  v, p->iOffset, i
192d0 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 61 73  Continue);..  as
192e0 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65  sert( pDest->eDe
192f0 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29  st!=SRT_Exists )
19300 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 65 73  ;.  assert( pDes
19310 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 54 61  t->eDest!=SRT_Ta
19320 62 6c 65 20 29 3b 0a 20 20 73 77 69 74 63 68 28  ble );.  switch(
19330 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29 7b   pDest->eDest ){
19340 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68  .    /* Store th
19350 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61  e result as data
19360 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20   using a unique 
19370 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  key..    */.    
19380 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
19390 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  b: {.      int r
193a0 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
193b0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
193c0 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71       int r2 = sq
193d0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
193e0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
193f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
19400 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
19410 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  d, pIn->iSdst, p
19420 49 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29 3b 0a  In->nSdst, r1);.
19430 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19440 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
19450 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69  wRowid, pDest->i
19460 53 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20  SDParm, r2);.   
19470 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19480 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
19490 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  t, pDest->iSDPar
194a0 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20  m, r1, r2);.    
194b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
194c0 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
194d0 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 73  APPEND);.      s
194e0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
194f0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
19500 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
19510 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
19520 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
19530 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
19540 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19550 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
19560 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65  /* If we are cre
19570 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20  ating a set for 
19580 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c  an "expr IN (SEL
19590 45 43 54 20 2e 2e 2e 29 22 2e 0a 20 20 20 20 2a  ECT ...)"..    *
195a0 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
195b0 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  et: {.      int 
195c0 72 31 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  r1;.      testca
195d0 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3e 31  se( pIn->nSdst>1
195e0 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
195f0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
19600 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
19610 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19620 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
19630 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  rd, pIn->iSdst, 
19640 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 0a 20 20 20  pIn->nSdst, .   
19650 20 20 20 20 20 20 20 72 31 2c 20 70 44 65 73 74         r1, pDest
19660 2d 3e 7a 41 66 66 53 64 73 74 2c 20 70 49 6e 2d  ->zAffSdst, pIn-
19670 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73  >nSdst);.      s
19680 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
19690 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
196a0 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
196b0 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
196c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
196d0 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
196e0 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74  IdxInsert, pDest
196f0 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c 0a 20  ->iSDParm, r1,. 
19700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19710 20 20 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 69            pIn->i
19720 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
19730 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19740 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
19750 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
19760 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
19770 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
19780 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63  s a scalar selec
19790 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  t that is part o
197a0 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  f an expression,
197b0 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f   then.    ** sto
197c0 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
197d0 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
197e0 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  e memory cell an
197f0 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20  d break out.    
19800 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c  ** of the scan l
19810 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
19820 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
19830 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
19840 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20 70  n->nSdst==1 || p
19850 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b  Parse->nErr>0 );
19860 20 20 74 65 73 74 63 61 73 65 28 20 70 49 6e 2d    testcase( pIn-
19870 3e 6e 53 64 73 74 21 3d 31 20 29 3b 0a 20 20 20  >nSdst!=1 );.   
19880 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
19890 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70  deMove(pParse, p
198a0 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74  In->iSdst, pDest
198b0 2d 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20  ->iSDParm, 1);. 
198c0 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
198d0 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75  T clause will ju
198e0 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f  mp out of the lo
198f0 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
19900 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
19910 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
19920 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
19930 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f  BQUERY */..    /
19940 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72  * The results ar
19950 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65  e stored in a se
19960 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
19970 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  ers.    ** start
19980 69 6e 67 20 61 74 20 70 44 65 73 74 2d 3e 69 53  ing at pDest->iS
19990 64 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 63  dst.  Then the c
199a0 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73  o-routine yields
199b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
199c0 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a  e SRT_Coroutine:
199d0 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65   {.      if( pDe
199e0 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a  st->iSdst==0 ){.
199f0 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69          pDest->i
19a00 53 64 73 74 20 3d 20 73 71 6c 69 74 65 33 47 65  Sdst = sqlite3Ge
19a10 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
19a20 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  e, pIn->nSdst);.
19a30 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e          pDest->n
19a40 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73  Sdst = pIn->nSds
19a50 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
19a60 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
19a70 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
19a80 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e  ->iSdst, pDest->
19a90 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
19aa0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
19ab0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
19ac0 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
19ad0 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
19ae0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
19af0 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20    /* If none of 
19b00 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  the above, then 
19b10 74 68 65 20 72 65 73 75 6c 74 20 64 65 73 74 69  the result desti
19b20 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20  nation must be. 
19b30 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74     ** SRT_Output
19b40 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
19b50 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
19b60 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20  with any other. 
19b70 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f     ** destinatio
19b80 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  n other than the
19b90 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62   ones handled ab
19ba0 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75  ove or SRT_Outpu
19bb0 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
19bc0 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c   For SRT_Output,
19bd0 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
19be0 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63  red in a sequenc
19bf0 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20  e of registers. 
19c00 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68   .    ** Then th
19c10 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f  e OP_ResultRow o
19c20 70 63 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f  pcode is used to
19c30 20 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73   cause sqlite3_s
19c40 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20  tep() to.    ** 
19c50 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20  return the next 
19c60 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20  row of result.. 
19c70 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
19c80 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
19c90 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  t( pDest->eDest=
19ca0 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
19cb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19cc0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
19cd0 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64  ultRow, pIn->iSd
19ce0 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
19cf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
19d00 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
19d10 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49  hange(pParse, pI
19d20 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
19d30 53 64 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65  Sdst);.      bre
19d40 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
19d50 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
19d60 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  end of the loop 
19d70 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20  if the LIMIT is 
19d80 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20  reached..  */.  
19d90 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b  if( p->iLimit ){
19da0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19db0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63  AddOp2(v, OP_Dec
19dc0 72 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c  rJumpZero, p->iL
19dd0 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56  imit, iBreak); V
19de0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
19df0 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
19e00 74 65 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  te the subroutin
19e10 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20  e return.  */.  
19e20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
19e30 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
19e40 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  inue);.  sqlite3
19e50 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
19e60 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75  _Return, regRetu
19e70 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61  rn);..  return a
19e80 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  ddr;.}../*.** Al
19e90 74 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75  ternative compou
19ea0 6e 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67  nd select code g
19eb0 65 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73  enerator for cas
19ec0 65 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a  es when there.**
19ed0 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
19ee0 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65  clause..**.** We
19ef0 20 61 73 73 75 6d 65 20 61 20 71 75 65 72 79 20   assume a query 
19f00 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
19f10 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
19f20 20 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70    <selectA>  <op
19f30 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74  erator>  <select
19f40 42 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72  B>  ORDER BY <or
19f50 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a  derbylist>.**.**
19f60 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f   <operator> is o
19f70 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c  ne of UNION ALL,
19f80 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
19f90 6f 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54  or INTERSECT.  T
19fa0 68 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f  he idea.** is to
19fb0 20 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65   code both <sele
19fc0 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74  ctA> and <select
19fd0 42 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44 45  B> with the ORDE
19fe0 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a  R BY clause as.*
19ff0 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20  * co-routines.  
1a000 54 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d  Then run the co-
1a010 72 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61  routines in para
1a020 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74  llel and merge t
1a030 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e  he results.** in
1a040 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20  to the output.  
1a050 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74  In addition to t
1a060 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65  he two coroutine
1a070 73 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74  s (called select
1a080 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42  A and.** selectB
1a090 29 20 74 68 65 72 65 20 61 72 65 20 37 20 73 75  ) there are 7 su
1a0a0 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a  broutines:.**.**
1a0b0 20 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76      outA:    Mov
1a0c0 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  e the output of 
1a0d0 74 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f  the selectA coro
1a0e0 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f  utine into the o
1a0f0 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  utput.**        
1a100 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70       of the comp
1a110 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a  ound query..**.*
1a120 2a 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f  *    outB:    Mo
1a130 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66  ve the output of
1a140 20 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72   the selectB cor
1a150 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20  outine into the 
1a160 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20  output.**       
1a170 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d        of the com
1a180 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f  pound query.  (O
1a190 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f  nly generated fo
1a1a0 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20  r UNION and.**  
1a1b0 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e             UNION
1a1c0 20 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e   ALL.  EXCEPT an
1a1d0 64 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76  d INSERTSECT nev
1a1e0 65 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20  er output a row 
1a1f0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
1a200 20 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79      appears only
1a210 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20   in B.).**.**   
1a220 20 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64   AltB:    Called
1a230 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64   when there is d
1a240 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f  ata from both co
1a250 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42  routines and A<B
1a260 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a  ..**.**    AeqB:
1a270 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
1a280 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72  there is data fr
1a290 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e  om both coroutin
1a2a0 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a  es and A==B..**.
1a2b0 2a 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20 43  **    AgtB:    C
1a2c0 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
1a2d0 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f   is data from bo
1a2e0 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  th coroutines an
1a2f0 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  d A>B..**.**    
1a300 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20  EofA:    Called 
1a310 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68  when data is exh
1a320 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65  austed from sele
1a330 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f  ctA..**.**    Eo
1a340 66 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  fB:    Called wh
1a350 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75  en data is exhau
1a360 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74  sted from select
1a370 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  B..**.** The imp
1a380 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
1a390 68 65 20 6c 61 74 74 65 72 20 66 69 76 65 20 73  he latter five s
1a3a0 75 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e  ubroutines depen
1a3b0 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c  d on which .** <
1a3c0 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65  operator> is use
1a3d0 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  d:.**.**.**     
1a3e0 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
1a3f0 4c 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  L         UNION 
1a400 20 20 20 20 20 20 20 20 20 20 20 45 58 43 45 50             EXCEP
1a410 54 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52  T          INTER
1a420 53 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  SECT.**         
1a430 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20   -------------  
1a440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a450 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
1a460 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
1a470 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20  ----.**   AltB: 
1a480 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
1a490 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
1a4a0 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
1a4b0 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a           nextA.*
1a4c0 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f  *.**   AeqB:   o
1a4d0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
1a4e0 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20     nextA        
1a4f0 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20       nextA      
1a500 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a     outA, nextA.*
1a510 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f  *.**   AgtB:   o
1a520 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
1a530 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
1a540 20 20 20 20 20 6e 65 78 74 42 20 20 20 20 20 20       nextB      
1a550 20 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a        nextB.**.*
1a560 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42  *   EofA:   outB
1a570 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74  , nextB      out
1a580 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20  B, nextB        
1a590 20 20 68 61 6c 74 20 20 20 20 20 20 20 20 20 20    halt          
1a5a0 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20     halt.**.**   
1a5b0 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65  EofB:   outA, ne
1a5c0 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  xtA      outA, n
1a5d0 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c  extA       outA,
1a5e0 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 68   nextA         h
1a5f0 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  alt.**.** In the
1a600 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64   AltB, AeqB, and
1a610 20 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65   AgtB subroutine
1a620 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66  s, an EOF on A f
1a630 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a  ollowing nextA.*
1a640 2a 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65  * causes an imme
1a650 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f  diate jump to Eo
1a660 66 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e  fA and an EOF on
1a670 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78   B following nex
1a680 74 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20  tB causes.** an 
1a690 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74  immediate jump t
1a6a0 6f 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20  o EofB.  Within 
1a6b0 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61  EofA and EofB, a
1a6c0 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20  nd EOF on entry 
1a6d0 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  or.** following 
1a6e0 6e 65 78 74 58 20 63 61 75 73 65 73 20 61 20 6a  nextX causes a j
1a6f0 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ump to the end o
1a700 66 20 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f  f the select pro
1a710 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44  cessing..**.** D
1a720 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c  uplicate removal
1a730 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45   in the UNION, E
1a740 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52  XCEPT, and INTER
1a750 53 45 43 54 20 63 61 73 65 73 20 69 73 20 68 61  SECT cases is ha
1a760 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20  ndled.** within 
1a770 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f  the output subro
1a780 75 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50  utine.  The regP
1a790 72 65 76 20 72 65 67 69 73 74 65 72 20 73 65 74  rev register set
1a7a0 20 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69   holds the previ
1a7b0 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20  ously.** output 
1a7c0 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72  value.  A compar
1a7d0 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61  ison is made aga
1a7e0 69 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65 20  inst this value 
1a7f0 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  and the output.*
1a800 2a 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  * is skipped if 
1a810 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73  the next results
1a820 20 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61   would be the sa
1a830 6d 65 20 61 73 20 74 68 65 20 70 72 65 76 69 6f  me as the previo
1a840 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d  us..**.** The im
1a850 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61  plementation pla
1a860 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  n is to implemen
1a870 74 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74  t the two corout
1a880 69 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a  ines and seven.*
1a890 2a 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69  * subroutines fi
1a8a0 72 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68  rst, then put th
1a8b0 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20  e control logic 
1a8c0 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20  at the bottom.  
1a8d0 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  Like this:.**.**
1a8e0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49            goto I
1a8f0 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20  nit.**     coA: 
1a900 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65  coroutine for le
1a910 66 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20  ft query (A).** 
1a920 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69      coB: corouti
1a930 6e 65 20 66 6f 72 20 72 69 67 68 74 20 71 75 65  ne for right que
1a940 72 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74  ry (B).**    out
1a950 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  A: output one ro
1a960 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74  w of A.**    out
1a970 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  B: output one ro
1a980 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e  w of B (UNION an
1a990 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79  d UNION ALL only
1a9a0 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e  ).**    EofA: ..
1a9b0 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e  ..**    EofB: ..
1a9c0 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e  ..**    AltB: ..
1a9d0 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e  ..**    AeqB: ..
1a9e0 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e  ..**    AgtB: ..
1a9f0 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e  ..**    Init: in
1aa00 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69  itialize corouti
1aa10 6e 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20  ne registers.** 
1aa20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63           yield c
1aa30 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  oA.**          i
1aa40 66 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f  f eof(A) goto Eo
1aa50 66 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79  fA.**          y
1aa60 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20  ield coB.**     
1aa70 20 20 20 20 20 69 66 20 65 6f 66 28 42 29 20 67       if eof(B) g
1aa80 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43  oto EofB.**    C
1aa90 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20  mpr: Compare A, 
1aaa0 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75  B.**          Ju
1aab0 6d 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41  mp AltB, AeqB, A
1aac0 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20  gtB.**     End: 
1aad0 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c  ....**.** We cal
1aae0 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67  l AltB, AeqB, Ag
1aaf0 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f  tB, EofA, and Eo
1ab00 66 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22  fB "subroutines"
1ab10 20 62 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f   but they are no
1ab20 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61  t.** actually ca
1ab30 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62  lled using Gosub
1ab40 20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74   and they do not
1ab50 20 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61   Return.  EofA a
1ab60 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20  nd EofB loop.** 
1ab70 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69  until all data i
1ab80 73 20 65 78 68 61 75 73 74 65 64 20 74 68 65 6e  s exhausted then
1ab90 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e   jump to the "en
1aba0 64 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20  d" labe.  AltB, 
1abb0 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74  AeqB,.** and Agt
1abc0 42 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72  B jump to either
1abd0 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66   L2 or to one of
1abe0 20 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a   EofA or EofB..*
1abf0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1ac00 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
1ac10 45 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74  ELECT.static int
1ac20 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
1ac30 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rBy(.  Parse *pP
1ac40 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
1ac50 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
1ac60 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
1ac70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1ac80 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
1ac90 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
1aca0 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
1acb0 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
1acc0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
1acd0 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
1ace0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
1acf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1ad00 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
1ad10 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
1ad20 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
1ad30 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
1ad40 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
1ad50 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
1ad60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1ad70 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1ad80 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
1ad90 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
1ada0 74 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69  tA;     /* Desti
1adb0 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75  nation for corou
1adc0 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65  tine A */.  Sele
1add0 63 74 44 65 73 74 20 64 65 73 74 42 3b 20 20 20  ctDest destB;   
1ade0 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e    /* Destination
1adf0 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42   for coroutine B
1ae00 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64   */.  int regAdd
1ae10 72 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  rA;         /* A
1ae20 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
1ae30 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72  for select-A cor
1ae40 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1ae50 72 65 67 41 64 64 72 42 3b 20 20 20 20 20 20 20  regAddrB;       
1ae60 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
1ae70 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
1ae80 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -B coroutine */.
1ae90 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74    int addrSelect
1aea0 41 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  A;      /* Addre
1aeb0 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
1aec0 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -A coroutine */.
1aed0 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74    int addrSelect
1aee0 42 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  B;      /* Addre
1aef0 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
1af00 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -B coroutine */.
1af10 20 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20    int regOutA;  
1af20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
1af30 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
1af40 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62  the output-A sub
1af50 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1af60 20 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20   regOutB;       
1af70 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
1af80 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f  gister for the o
1af90 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69  utput-B subrouti
1afa0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
1afb0 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  OutA;         /*
1afc0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
1afd0 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74  output-A subrout
1afe0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
1aff0 72 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f  rOutB = 0;     /
1b000 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
1b010 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75   output-B subrou
1b020 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
1b030 64 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20  drEofA;         
1b040 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
1b050 65 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75  e select-A-exhau
1b060 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20  sted subroutine 
1b070 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66  */.  int addrEof
1b080 41 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41 6c  A_noB;     /* Al
1b090 74 65 72 6e 61 74 65 20 61 64 64 72 45 6f 66 41  ternate addrEofA
1b0a0 20 69 66 20 42 20 69 73 20 75 6e 69 6e 69 74 69   if B is uniniti
1b0b0 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20  alized */.  int 
1b0c0 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20  addrEofB;       
1b0d0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1b0e0 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68  the select-B-exh
1b0f0 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e  austed subroutin
1b100 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
1b110 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ltB;         /* 
1b120 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
1b130 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  <B subroutine */
1b140 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b  .  int addrAeqB;
1b150 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
1b160 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20  ess of the A==B 
1b170 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
1b180 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20 20  int addrAgtB;   
1b190 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1b1a0 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62 72   of the A>B subr
1b1b0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1b1c0 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20  regLimitA;      
1b1d0 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73    /* Limit regis
1b1e0 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41  ter for select-A
1b1f0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d   */.  int regLim
1b200 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  itB;        /* L
1b210 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f  imit register fo
1b220 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20  r select-A */.  
1b230 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20  int regPrev;    
1b240 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65        /* A range
1b250 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f   of registers to
1b260 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f   hold previous o
1b270 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73  utput */.  int s
1b280 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20  avedLimit;      
1b290 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20   /* Saved value 
1b2a0 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a  of p->iLimit */.
1b2b0 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65    int savedOffse
1b2c0 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  t;      /* Saved
1b2d0 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66   value of p->iOf
1b2e0 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  fset */.  int la
1b2f0 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20  belCmpr;        
1b300 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65  /* Label for the
1b310 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65   start of the me
1b320 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f  rge algorithm */
1b330 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b  .  int labelEnd;
1b340 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65           /* Labe
1b350 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66  l for the end of
1b360 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c   the overall SEL
1b370 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e  ECT stmt */.  in
1b380 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20  t addr1;        
1b390 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74      /* Jump inst
1b3a0 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65  ructions that ge
1b3b0 74 20 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f  t retargetted */
1b3c0 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
1b3d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
1b3e0 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e  of TK_ALL, TK_UN
1b3f0 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20  ION, TK_EXCEPT, 
1b400 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a  TK_INTERSECT */.
1b410 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44    KeyInfo *pKeyD
1b420 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61  up = 0; /* Compa
1b430 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  rison informatio
1b440 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20  n for duplicate 
1b450 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79  removal */.  Key
1b460 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b  Info *pKeyMerge;
1b470 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e     /* Comparison
1b480 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
1b490 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f   merging rows */
1b4a0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
1b4b0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
1b4c0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1b4d0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1b4e0 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68  OrderBy;   /* Th
1b4f0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1b500 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65  e */.  int nOrde
1b510 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rBy;         /* 
1b520 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
1b530 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
1b540 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
1b550 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20  *aPermute;      
1b560 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f    /* Mapping fro
1b570 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  m ORDER BY terms
1b580 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63   to result set c
1b590 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65  olumns */.#ifnde
1b5a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
1b5b0 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62  PLAIN.  int iSub
1b5c0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
1b5d0 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d   EQP id of left-
1b5e0 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20  hand query */.  
1b5f0 69 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20 20  int iSub2;      
1b600 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20        /* EQP id 
1b610 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75  of right-hand qu
1b620 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ery */.#endif.. 
1b630 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
1b640 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73  erBy!=0 );.  ass
1b650 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20  ert( pKeyDup==0 
1b660 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20  ); /* "Managed" 
1b670 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e  code needs this.
1b680 20 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20    Ticket #3382. 
1b690 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  */.  db = pParse
1b6a0 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72  ->db;.  v = pPar
1b6b0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
1b6c0 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20  ert( v!=0 );    
1b6d0 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68     /* Already th
1b6e0 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69  rown the error i
1b6f0 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69  f VDBE alloc fai
1b700 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e  led */.  labelEn
1b710 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
1b720 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c  akeLabel(v);.  l
1b730 61 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74  abelCmpr = sqlit
1b740 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1b750 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68  v);...  /* Patch
1b760 20 75 70 20 74 68 65 20 4f 52 44 45 52 20 42 59   up the ORDER BY
1b770 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f   clause.  */.  o
1b780 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70  p = p->op;  .  p
1b790 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
1b7a0 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72  r;.  assert( pPr
1b7b0 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ior->pOrderBy==0
1b7c0 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d   );.  pOrderBy =
1b7d0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
1b7e0 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
1b7f0 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d   );.  nOrderBy =
1b800 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
1b810 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72  ;..  /* For oper
1b820 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e  ators other than
1b830 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61   UNION ALL we ha
1b840 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ve to make sure 
1b850 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52  that.  ** the OR
1b860 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f  DER BY clause co
1b870 76 65 72 73 20 65 76 65 72 79 20 74 65 72 6d 20  vers every term 
1b880 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  of the result se
1b890 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72  t.  Add.  ** ter
1b8a0 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20  ms to the ORDER 
1b8b0 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63  BY clause as nec
1b8c0 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69  essary..  */.  i
1b8d0 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b  f( op!=TK_ALL ){
1b8e0 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62  .    for(i=1; db
1b8f0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
1b900 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73  0 && i<=p->pELis
1b910 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
1b920 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
1b930 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
1b940 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  m;.      for(j=0
1b950 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79  , pItem=pOrderBy
1b960 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b  ->a; j<nOrderBy;
1b970 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   j++, pItem++){.
1b980 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1b990 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
1b9a0 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20  rByCol>0 );.    
1b9b0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75      if( pItem->u
1b9c0 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d  .x.iOrderByCol==
1b9d0 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  i ) break;.     
1b9e0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d   }.      if( j==
1b9f0 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
1ba00 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
1ba10 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
1ba20 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b   TK_INTEGER, 0);
1ba30 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
1ba40 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  w==0 ) return SQ
1ba50 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
1ba60 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  .        pNew->f
1ba70 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61  lags |= EP_IntVa
1ba80 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  lue;.        pNe
1ba90 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b  w->u.iValue = i;
1baa0 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64  .        p->pOrd
1bab0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 20  erBy = pOrderBy 
1bac0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
1bad0 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
1bae0 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29 3b  pOrderBy, pNew);
1baf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72  .        if( pOr
1bb00 64 65 72 42 79 20 29 20 70 4f 72 64 65 72 42 79  derBy ) pOrderBy
1bb10 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e  ->a[nOrderBy++].
1bb20 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
1bb30 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20  = (u16)i;.      
1bb40 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
1bb50 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  * Compute the co
1bb60 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61  mparison permuta
1bb70 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f  tion and keyinfo
1bb80 20 74 68 61 74 20 69 73 20 75 73 65 64 20 77 69   that is used wi
1bb90 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d  th.  ** the perm
1bba0 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20  utation used to 
1bbb0 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
1bbc0 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f   next.  ** row o
1bbd0 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20  f results comes 
1bbe0 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20  from selectA or 
1bbf0 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61  selectB.  Also a
1bc00 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a  dd explicit.  **
1bc10 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74   collations to t
1bc20 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1bc30 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74  se terms so that
1bc40 20 77 68 65 6e 20 74 68 65 20 73 75 62 71 75 65   when the subque
1bc50 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  ries.  ** to the
1bc60 20 72 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c   right and the l
1bc70 65 66 74 20 61 72 65 20 65 76 61 6c 75 61 74 65  eft are evaluate
1bc80 64 2c 20 74 68 65 79 20 75 73 65 20 74 68 65 20  d, they use the 
1bc90 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c  correct.  ** col
1bca0 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61  lation..  */.  a
1bcb0 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65  Permute = sqlite
1bcc0 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
1bcd0 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28  b, sizeof(int)*(
1bce0 6e 4f 72 64 65 72 42 79 20 2b 20 31 29 29 3b 0a  nOrderBy + 1));.
1bcf0 20 20 69 66 28 20 61 50 65 72 6d 75 74 65 20 29    if( aPermute )
1bd00 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
1bd10 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
1bd20 6d 3b 0a 20 20 20 20 61 50 65 72 6d 75 74 65 5b  m;.    aPermute[
1bd30 30 5d 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20  0] = nOrderBy;. 
1bd40 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 74 65     for(i=1, pIte
1bd50 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69  m=pOrderBy->a; i
1bd60 3c 3d 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c  <=nOrderBy; i++,
1bd70 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
1bd80 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
1bd90 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e  u.x.iOrderByCol>
1bda0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
1bdb0 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  t( pItem->u.x.iO
1bdc0 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45  rderByCol<=p->pE
1bdd0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
1bde0 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b 69 5d       aPermute[i]
1bdf0 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f   = pItem->u.x.iO
1be00 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b 0a 20  rderByCol - 1;. 
1be10 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72     }.    pKeyMer
1be20 67 65 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ge = multiSelect
1be30 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 70  OrderByKeyInfo(p
1be40 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20  Parse, p, 1);.  
1be50 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d  }else{.    pKeyM
1be60 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  erge = 0;.  }.. 
1be70 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68 65   /* Reattach the
1be80 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1be90 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a 20   to the query.. 
1bea0 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42   */.  p->pOrderB
1beb0 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
1bec0 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
1bed0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
1bee0 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  stDup(pParse->db
1bef0 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a  , pOrderBy, 0);.
1bf00 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
1bf10 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72   range of tempor
1bf20 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61 6e  ary registers an
1bf30 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65  d the KeyInfo ne
1bf40 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68  eded.  ** for th
1bf50 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65 6d  e logic that rem
1bf60 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65 20 72  oves duplicate r
1bf70 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e 20  esult rows when 
1bf80 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f  the.  ** operato
1bf90 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45  r is UNION, EXCE
1bfa0 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
1bfb0 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20   (but not UNION 
1bfc0 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ALL)..  */.  if(
1bfd0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
1bfe0 20 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b 0a     regPrev = 0;.
1bff0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1c000 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   nExpr = p->pELi
1c010 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61  st->nExpr;.    a
1c020 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e  ssert( nOrderBy>
1c030 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61  =nExpr || db->ma
1c040 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1c050 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72    regPrev = pPar
1c060 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
1c070 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
1c080 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 73 71 6c  nExpr+1;.    sql
1c090 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1c0a0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
1c0b0 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20 70   regPrev);.    p
1c0c0 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65 33  KeyDup = sqlite3
1c0d0 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c  KeyInfoAlloc(db,
1c0e0 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20 20   nExpr, 1);.    
1c0f0 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a 20  if( pKeyDup ){. 
1c100 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
1c110 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
1c120 74 65 61 62 6c 65 28 70 4b 65 79 44 75 70 29 20  teable(pKeyDup) 
1c130 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
1c140 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ; i<nExpr; i++){
1c150 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70  .        pKeyDup
1c160 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c  ->aColl[i] = mul
1c170 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
1c180 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
1c190 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e         pKeyDup->
1c1a0 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
1c1b0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
1c1c0 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61  .  }. .  /* Sepa
1c1d0 72 61 74 65 20 74 68 65 20 6c 65 66 74 20 61 6e  rate the left an
1c1e0 64 20 74 68 65 20 72 69 67 68 74 20 71 75 65 72  d the right quer
1c1f0 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68  y from one anoth
1c200 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72  er.  */.  p->pPr
1c210 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f  ior = 0;.  pPrio
1c220 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  r->pNext = 0;.  
1c230 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
1c240 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
1c250 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e, p, p->pOrderB
1c260 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 69  y, "ORDER");.  i
1c270 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f  f( pPrior->pPrio
1c280 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
1c290 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47  te3ResolveOrderG
1c2a0 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
1c2b0 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70  Prior, pPrior->p
1c2c0 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22  OrderBy, "ORDER"
1c2d0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d  );.  }..  /* Com
1c2e0 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20 72  pute the limit r
1c2f0 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f  egisters */.  co
1c300 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
1c310 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 6c  ers(pParse, p, l
1c320 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20  abelEnd);.  if( 
1c330 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d  p->iLimit && op=
1c340 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72  =TK_ALL ){.    r
1c350 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61  egLimitA = ++pPa
1c360 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
1c370 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61  egLimitB = ++pPa
1c380 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
1c390 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1c3a0 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e  (v, OP_Copy, p->
1c3b0 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66  iOffset ? p->iOf
1c3c0 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d  fset+1 : p->iLim
1c3d0 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  it,.            
1c3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3f0 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74 41 29        regLimitA)
1c400 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1c410 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
1c420 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20 72  py, regLimitA, r
1c430 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c  egLimitB);.  }el
1c440 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74  se{.    regLimit
1c450 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d 20  A = regLimitB = 
1c460 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
1c470 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
1c480 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e  ->pLimit);.  p->
1c490 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 72  pLimit = 0;..  r
1c4a0 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72  egAddrA = ++pPar
1c4b0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41  se->nMem;.  regA
1c4c0 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ddrB = ++pParse-
1c4d0 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41  >nMem;.  regOutA
1c4e0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1c4f0 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20 2b  m;.  regOutB = +
1c500 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1c510 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1c520 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20 53  stInit(&destA, S
1c530 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  RT_Coroutine, re
1c540 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74  gAddrA);.  sqlit
1c550 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
1c560 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f 72  (&destB, SRT_Cor
1c570 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42  outine, regAddrB
1c580 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1c590 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f  e a coroutine to
1c5a0 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45   evaluate the SE
1c5b0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
1c5c0 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20  o the.  ** left 
1c5d0 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
1c5e0 6f 70 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22  operator - the "
1c5f0 41 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a  A" select..  */.
1c600 20 20 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20    addrSelectA = 
1c610 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1c620 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20  ntAddr(v) + 1;. 
1c630 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
1c640 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1c650 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20  _InitCoroutine, 
1c660 72 65 67 41 64 64 72 41 2c 20 30 2c 20 61 64 64  regAddrA, 0, add
1c670 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 56 64 62  rSelectA);.  Vdb
1c680 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c 65  eComment((v, "le
1c690 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20  ft SELECT"));.  
1c6a0 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d  pPrior->iLimit =
1c6b0 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 65 78   regLimitA;.  ex
1c6c0 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
1c6d0 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69  iSub1, pParse->i
1c6e0 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
1c6f0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
1c700 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
1c710 64 65 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65  destA);.  sqlite
1c720 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e  3VdbeEndCoroutin
1c730 65 28 76 2c 20 72 65 67 41 64 64 72 41 29 3b 0a  e(v, regAddrA);.
1c740 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1c750 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
1c760 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1c770 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65  a coroutine to e
1c780 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45  valuate the SELE
1c790 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20  CT statement on 
1c7a0 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20  .  ** the right 
1c7b0 2d 20 74 68 65 20 22 42 22 20 73 65 6c 65 63 74  - the "B" select
1c7c0 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65  .  */.  addrSele
1c7d0 63 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ctB = sqlite3Vdb
1c7e0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
1c7f0 2b 20 31 3b 0a 20 20 61 64 64 72 31 20 3d 20 73  + 1;.  addr1 = s
1c800 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1c810 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
1c820 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 2c 20  tine, regAddrB, 
1c830 30 2c 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b  0, addrSelectB);
1c840 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
1c850 76 2c 20 22 72 69 67 68 74 20 53 45 4c 45 43 54  v, "right SELECT
1c860 22 29 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69  "));.  savedLimi
1c870 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20  t = p->iLimit;. 
1c880 20 73 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70   savedOffset = p
1c890 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e  ->iOffset;.  p->
1c8a0 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69  iLimit = regLimi
1c8b0 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74  tB;.  p->iOffset
1c8c0 20 3d 20 30 3b 20 20 0a 20 20 65 78 70 6c 61 69   = 0;  .  explai
1c8d0 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
1c8e0 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  2, pParse->iNext
1c8f0 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c  SelectId);.  sql
1c900 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
1c910 65 2c 20 70 2c 20 26 64 65 73 74 42 29 3b 0a 20  e, p, &destB);. 
1c920 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76   p->iLimit = sav
1c930 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f  edLimit;.  p->iO
1c940 66 66 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66  ffset = savedOff
1c950 73 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  set;.  sqlite3Vd
1c960 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76  beEndCoroutine(v
1c970 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20  , regAddrB);..  
1c980 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
1c990 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
1c9a0 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e  tputs the curren
1c9b0 74 20 72 6f 77 20 6f 66 20 74 68 65 20 41 0a 20  t row of the A. 
1c9c0 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68   ** select as th
1c9d0 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f  e next output ro
1c9e0 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  w of the compoun
1c9f0 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20  d select..  */. 
1ca00 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1ca10 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75  ((v, "Output rou
1ca20 74 69 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a 20  tine for A"));. 
1ca30 20 61 64 64 72 4f 75 74 41 20 3d 20 67 65 6e 65   addrOutA = gene
1ca40 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75  rateOutputSubrou
1ca50 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20  tine(pParse,.   
1ca60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c                p,
1ca70 20 26 64 65 73 74 41 2c 20 70 44 65 73 74 2c 20   &destA, pDest, 
1ca80 72 65 67 4f 75 74 41 2c 0a 20 20 20 20 20 20 20  regOutA,.       
1ca90 20 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65            regPre
1caa0 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65  v, pKeyDup, labe
1cab0 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47  lEnd);.  .  /* G
1cac0 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
1cad0 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
1cae0 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  s the current ro
1caf0 77 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a 20  w of the B.  ** 
1cb00 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65  select as the ne
1cb10 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66  xt output row of
1cb20 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
1cb30 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lect..  */.  if(
1cb40 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f   op==TK_ALL || o
1cb50 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
1cb60 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
1cb70 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72  nt((v, "Output r
1cb80 6f 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b  outine for B"));
1cb90 0a 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d 20  .    addrOutB = 
1cba0 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75  generateOutputSu
1cbb0 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c  broutine(pParse,
1cbc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cbd0 20 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44 65    p, &destB, pDe
1cbe0 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20 20  st, regOutB,.   
1cbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1cc00 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20  gPrev, pKeyDup, 
1cc10 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 20  labelEnd);.  }. 
1cc20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
1cc30 6e 72 65 66 28 70 4b 65 79 44 75 70 29 3b 0a 0a  nref(pKeyDup);..
1cc40 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1cc50 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75  subroutine to ru
1cc60 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c  n when the resul
1cc70 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 41  ts from select A
1cc80 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73  .  ** are exhaus
1cc90 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74  ted and only dat
1cca0 61 20 69 6e 20 73 65 6c 65 63 74 20 42 20 72 65  a in select B re
1ccb0 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  mains..  */.  if
1ccc0 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  ( op==TK_EXCEPT 
1ccd0 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  || op==TK_INTERS
1cce0 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45  ECT ){.    addrE
1ccf0 6f 66 41 5f 6e 6f 42 20 3d 20 61 64 64 72 45 6f  ofA_noB = addrEo
1cd00 66 41 20 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a 20  fA = labelEnd;. 
1cd10 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64   }else{  .    Vd
1cd20 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
1cd30 2c 20 22 65 6f 66 2d 41 20 73 75 62 72 6f 75 74  , "eof-A subrout
1cd40 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72  ine"));.    addr
1cd50 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64  EofA = sqlite3Vd
1cd60 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1cd70 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61  osub, regOutB, a
1cd80 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 61 64  ddrOutB);.    ad
1cd90 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 73 71 6c  drEofA_noB = sql
1cda0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1cdb0 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
1cdc0 64 64 72 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  ddrB, labelEnd);
1cdd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdf0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1ce00 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
1ce10 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64  e3VdbeGoto(v, ad
1ce20 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e  drEofA);.    p->
1ce30 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c  nSelectRow = sql
1ce40 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d  ite3LogEstAdd(p-
1ce50 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72  >nSelectRow, pPr
1ce60 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29  ior->nSelectRow)
1ce70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
1ce80 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
1ce90 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68  e to run when th
1cea0 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73  e results from s
1ceb0 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65  elect B.  ** are
1cec0 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f   exhausted and o
1ced0 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65  nly data in sele
1cee0 63 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20  ct A remains..  
1cef0 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
1cf00 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
1cf10 20 61 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72   addrEofB = addr
1cf20 45 6f 66 41 3b 0a 20 20 20 20 69 66 28 20 70 2d  EofA;.    if( p-
1cf30 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 70 50  >nSelectRow > pP
1cf40 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
1cf50 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
1cf60 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65   = pPrior->nSele
1cf70 63 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20  ctRow;.  }else{ 
1cf80 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f   .    VdbeNoopCo
1cf90 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42  mment((v, "eof-B
1cfa0 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
1cfb0 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73      addrEofB = s
1cfc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1cfd0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
1cfe0 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29  gOutA, addrOutA)
1cff0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1d000 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1d010 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 6c  eld, regAddrA, l
1d020 61 62 65 6c 45 6e 64 29 3b 20 56 64 62 65 43 6f  abelEnd); VdbeCo
1d030 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
1d040 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
1d050 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d  , addrEofB);.  }
1d060 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1d070 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74  code to handle t
1d080 68 65 20 63 61 73 65 20 6f 66 20 41 3c 42 0a 20  he case of A<B. 
1d090 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
1d0a0 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d  mment((v, "A-lt-
1d0b0 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
1d0c0 0a 20 20 61 64 64 72 41 6c 74 42 20 3d 20 73 71  .  addrAltB = sq
1d0d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1d0e0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
1d0f0 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b  OutA, addrOutA);
1d100 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1d110 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1d120 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72  , regAddrA, addr
1d130 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72  EofA); VdbeCover
1d140 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
1d150 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62  3VdbeGoto(v, lab
1d160 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47  elCmpr);..  /* G
1d170 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1d180 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20  handle the case 
1d190 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69  of A==B.  */.  i
1d1a0 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b  f( op==TK_ALL ){
1d1b0 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20  .    addrAeqB = 
1d1c0 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73  addrAltB;.  }els
1d1d0 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54  e if( op==TK_INT
1d1e0 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64  ERSECT ){.    ad
1d1f0 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74  drAeqB = addrAlt
1d200 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74 42 2b  B;.    addrAltB+
1d210 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
1d220 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1d230 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75 62 72  (v, "A-eq-B subr
1d240 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61  outine"));.    a
1d250 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20 73 71  ddrAeqB =.    sq
1d260 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1d270 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1d280 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29  AddrA, addrEofA)
1d290 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1d2a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1d2b0 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43  beGoto(v, labelC
1d2c0 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  mpr);.  }..  /* 
1d2d0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1d2e0 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65   handle the case
1d2f0 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56   of A>B.  */.  V
1d300 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1d310 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62 72 6f  v, "A-gt-B subro
1d320 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72  utine"));.  addr
1d330 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64  AgtB = sqlite3Vd
1d340 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1d350 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  ;.  if( op==TK_A
1d360 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49  LL || op==TK_UNI
1d370 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ON ){.    sqlite
1d380 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1d390 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42  P_Gosub, regOutB
1d3a0 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d  , addrOutB);.  }
1d3b0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1d3c0 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1d3d0 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72  , regAddrB, addr
1d3e0 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72  EofB); VdbeCover
1d3f0 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
1d400 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62  3VdbeGoto(v, lab
1d410 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54  elCmpr);..  /* T
1d420 68 69 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e  his code runs on
1d430 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ce to initialize
1d440 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a   everything..  *
1d450 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  /.  sqlite3VdbeJ
1d460 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
1d470 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1d480 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1d490 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64  ld, regAddrA, ad
1d4a0 64 72 45 6f 66 41 5f 6e 6f 42 29 3b 20 56 64 62  drEofA_noB); Vdb
1d4b0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1d4c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d4d0 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1d4e0 65 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66  egAddrB, addrEof
1d4f0 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  B); VdbeCoverage
1d500 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65  (v);..  /* Imple
1d510 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65  ment the main me
1d520 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20  rge loop.  */.  
1d530 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1d540 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c  veLabel(v, label
1d550 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Cmpr);.  sqlite3
1d560 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1d570 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c  _Permutation, 0,
1d580 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50   0, 0, (char*)aP
1d590 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52  ermute, P4_INTAR
1d5a0 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  RAY);.  sqlite3V
1d5b0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1d5c0 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69  Compare, destA.i
1d5d0 53 64 73 74 2c 20 64 65 73 74 42 2e 69 53 64 73  Sdst, destB.iSds
1d5e0 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20  t, nOrderBy,.   
1d5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d600 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
1d610 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e  yMerge, P4_KEYIN
1d620 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  FO);.  sqlite3Vd
1d630 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
1d640 46 4c 41 47 5f 50 45 52 4d 55 54 45 29 3b 0a 20  FLAG_PERMUTE);. 
1d650 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d660 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61  p3(v, OP_Jump, a
1d670 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41 65 71  ddrAltB, addrAeq
1d680 42 2c 20 61 64 64 72 41 67 74 42 29 3b 20 56 64  B, addrAgtB); Vd
1d690 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
1d6a0 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
1d6b0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f   this point in o
1d6c0 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e 61 74  rder to terminat
1d6d0 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a  e the query..  *
1d6e0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
1d6f0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
1d700 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20  abelEnd);..  /* 
1d710 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65 20 63  Reassembly the c
1d720 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 73 6f  ompound query so
1d730 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65   that it will be
1d740 20 66 72 65 65 64 20 63 6f 72 72 65 63 74 6c 79   freed correctly
1d750 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  .  ** by the cal
1d760 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ling function */
1d770 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
1d780 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
1d790 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
1d7a0 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a  p->pPrior);.  }.
1d7b0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
1d7c0 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f 72 2d 3e  rior;.  pPrior->
1d7d0 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20 20 2f 2a  pNext = p;..  /*
1d7e0 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72 74 20  ** TBD:  Insert 
1d7f0 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73  subroutine calls
1d800 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f 72   to close cursor
1d810 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a  s on incomplete.
1d820 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69 65    **** subquerie
1d830 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61 69  s ****/.  explai
1d840 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73  nComposite(pPars
1d850 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c  e, p->op, iSub1,
1d860 20 69 53 75 62 32 2c 20 30 29 3b 0a 20 20 72 65   iSub2, 0);.  re
1d870 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72  turn pParse->nEr
1d880 72 21 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  r!=0;.}.#endif..
1d890 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1d8a0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1d8b0 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
1d8c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
1d8d0 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  ../* An instance
1d8e0 20 6f 66 20 74 68 65 20 53 75 62 73 74 43 6f 6e   of the SubstCon
1d8f0 74 65 78 74 20 6f 62 6a 65 63 74 20 64 65 73 63  text object desc
1d900 72 69 62 65 73 20 61 6e 20 73 75 62 73 74 69 74  ribes an substit
1d910 75 74 69 6f 6e 20 65 64 69 74 0a 2a 2a 20 74 6f  ution edit.** to
1d920 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e   be performed on
1d930 20 61 20 70 61 72 73 65 20 74 72 65 65 2e 0a 2a   a parse tree..*
1d940 2a 0a 2a 2a 20 41 6c 6c 20 72 65 66 65 72 65 6e  *.** All referen
1d950 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69  ces to columns i
1d960 6e 20 74 61 62 6c 65 20 69 54 61 62 6c 65 20 61  n table iTable a
1d970 72 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65  re to be replace
1d980 64 20 62 79 20 63 6f 72 72 65 73 70 6f 6e 64 69  d by correspondi
1d990 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  ng.** expression
1d9a0 73 20 69 6e 20 70 45 4c 69 73 74 2e 0a 2a 2f 0a  s in pEList..*/.
1d9b0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
1d9c0 75 62 73 74 43 6f 6e 74 65 78 74 20 7b 0a 20 20  ubstContext {.  
1d9d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
1d9e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1d9f0 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
1da00 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
1da10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1da20 2f 2a 20 52 65 70 6c 61 63 65 20 72 65 66 65 72  /* Replace refer
1da30 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74 61  ences to this ta
1da40 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65  ble */.  int iNe
1da50 77 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  wTable;         
1da60 20 20 20 2f 2a 20 4e 65 77 20 74 61 62 6c 65 20     /* New table 
1da70 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
1da80 69 73 4c 65 66 74 4a 6f 69 6e 3b 20 20 20 20 20  isLeftJoin;     
1da90 20 20 20 20 20 20 2f 2a 20 41 64 64 20 54 4b 5f        /* Add TK_
1daa0 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 6f 70 63 6f  IF_NULL_ROW opco
1dab0 64 65 73 20 6f 6e 20 65 61 63 68 20 72 65 70 6c  des on each repl
1dac0 61 63 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70  acement */.  Exp
1dad0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20  rList *pEList;  
1dae0 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 61 63         /* Replac
1daf0 65 6d 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  ement expression
1db00 73 20 2a 2f 0a 7d 20 53 75 62 73 74 43 6f 6e 74  s */.} SubstCont
1db10 65 78 74 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  ext;../* Forward
1db20 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   Declarations */
1db30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
1db40 73 74 45 78 70 72 4c 69 73 74 28 53 75 62 73 74  stExprList(Subst
1db50 43 6f 6e 74 65 78 74 2a 2c 20 45 78 70 72 4c 69  Context*, ExprLi
1db60 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  st*);.static voi
1db70 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 53 75  d substSelect(Su
1db80 62 73 74 43 6f 6e 74 65 78 74 2a 2c 20 53 65 6c  bstContext*, Sel
1db90 65 63 74 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a  ect*, int);../*.
1dba0 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20  ** Scan through 
1dbb0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
1dbc0 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65  Expr.  Replace e
1dbd0 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74  very reference t
1dbe0 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  o.** a column in
1dbf0 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54   table number iT
1dc00 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79  able with a copy
1dc10 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d   of the iColumn-
1dc20 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70  th.** entry in p
1dc30 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61  EList.  (But lea
1dc40 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ve references to
1dc50 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d   the ROWID colum
1dc60 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e  n .** unchanged.
1dc70 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ).**.** This rou
1dc80 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20  tine is part of 
1dc90 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70  the flattening p
1dca0 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62  rocedure.  A sub
1dcb0 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72  query.** whose r
1dcc0 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66  esult set is def
1dcd0 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61  ined by pEList a
1dce0 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20  ppears as entry 
1dcf0 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63  in the.** FROM c
1dd00 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
1dd10 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  T such that the 
1dd20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69  VDBE cursor assi
1dd30 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20  gned to that.** 
1dd40 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72  FORM clause entr
1dd50 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68  y is iTable.  Th
1dd60 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73  is routine makes
1dd70 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a   the necessary .
1dd80 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45  ** changes to pE
1dd90 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20 72  xpr so that it r
1dda0 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74  efers directly t
1ddb0 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62  o the source tab
1ddc0 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62  le.** of the sub
1ddd0 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68 65  query rather the
1dde0 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
1ddf0 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a  he subquery..*/.
1de00 73 74 61 74 69 63 20 45 78 70 72 20 2a 73 75 62  static Expr *sub
1de10 73 74 45 78 70 72 28 0a 20 20 53 75 62 73 74 43  stExpr(.  SubstC
1de20 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74 2c 20  ontext *pSubst, 
1de30 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
1de40 6f 66 20 74 68 65 20 73 75 62 73 74 69 74 75 74  of the substitut
1de50 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ion */.  Expr *p
1de60 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
1de70 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63 68  /* Expr in which
1de80 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63   substitution oc
1de90 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  curs */.){.  if(
1dea0 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
1deb0 72 6e 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72  rn 0;.  if( Expr
1dec0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1ded0 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a  r, EP_FromJoin).
1dee0 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69 52 69     && pExpr->iRi
1def0 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 70 53  ghtJoinTable==pS
1df00 75 62 73 74 2d 3e 69 54 61 62 6c 65 0a 20 20 29  ubst->iTable.  )
1df10 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 52 69  {.    pExpr->iRi
1df20 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70  ghtJoinTable = p
1df30 53 75 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65  Subst->iNewTable
1df40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70  ;.  }.  if( pExp
1df50 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
1df60 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
1df70 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c  e==pSubst->iTabl
1df80 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78  e ){.    if( pEx
1df90 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  pr->iColumn<0 ){
1dfa0 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
1dfb0 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20   = TK_NULL;.    
1dfc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
1dfd0 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45  r *pNew;.      E
1dfe0 78 70 72 20 2a 70 43 6f 70 79 20 3d 20 70 53 75  xpr *pCopy = pSu
1dff0 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70  bst->pEList->a[p
1e000 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70  Expr->iColumn].p
1e010 45 78 70 72 3b 0a 20 20 20 20 20 20 45 78 70 72  Expr;.      Expr
1e020 20 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20   ifNullRow;.    
1e030 20 20 61 73 73 65 72 74 28 20 70 53 75 62 73 74    assert( pSubst
1e040 2d 3e 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70  ->pEList!=0 && p
1e050 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 53  Expr->iColumn<pS
1e060 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  ubst->pEList->nE
1e070 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  xpr );.      ass
1e080 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
1e090 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  t==0 && pExpr->p
1e0a0 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
1e0b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
1e0c0 72 49 73 56 65 63 74 6f 72 28 70 43 6f 70 79 29  rIsVector(pCopy)
1e0d0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1e0e0 74 65 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73  te3VectorErrorMs
1e0f0 67 28 70 53 75 62 73 74 2d 3e 70 50 61 72 73 65  g(pSubst->pParse
1e100 2c 20 70 43 6f 70 79 29 3b 0a 20 20 20 20 20 20  , pCopy);.      
1e110 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1e120 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 53 75  qlite3 *db = pSu
1e130 62 73 74 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  bst->pParse->db;
1e140 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75  .        if( pSu
1e150 62 73 74 2d 3e 69 73 4c 65 66 74 4a 6f 69 6e 20  bst->isLeftJoin 
1e160 26 26 20 70 43 6f 70 79 2d 3e 6f 70 21 3d 54 4b  && pCopy->op!=TK
1e170 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
1e180 20 20 20 20 20 6d 65 6d 73 65 74 28 26 69 66 4e       memset(&ifN
1e190 75 6c 6c 52 6f 77 2c 20 30 2c 20 73 69 7a 65 6f  ullRow, 0, sizeo
1e1a0 66 28 69 66 4e 75 6c 6c 52 6f 77 29 29 3b 0a 20  f(ifNullRow));. 
1e1b0 20 20 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52           ifNullR
1e1c0 6f 77 2e 6f 70 20 3d 20 54 4b 5f 49 46 5f 4e 55  ow.op = TK_IF_NU
1e1d0 4c 4c 5f 52 4f 57 3b 0a 20 20 20 20 20 20 20 20  LL_ROW;.        
1e1e0 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 70 4c 65 66    ifNullRow.pLef
1e1f0 74 20 3d 20 70 43 6f 70 79 3b 0a 20 20 20 20 20  t = pCopy;.     
1e200 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 69       ifNullRow.i
1e210 54 61 62 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e  Table = pSubst->
1e220 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 20  iNewTable;.     
1e230 20 20 20 20 20 70 43 6f 70 79 20 3d 20 26 69 66       pCopy = &if
1e240 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20 20 20 20  NullRow;.       
1e250 20 7d 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20   }.        pNew 
1e260 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
1e270 28 64 62 2c 20 70 43 6f 70 79 2c 20 30 29 3b 0a  (db, pCopy, 0);.
1e280 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
1e290 20 26 26 20 70 53 75 62 73 74 2d 3e 69 73 4c 65   && pSubst->isLe
1e2a0 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20  ftJoin ){.      
1e2b0 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
1e2c0 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 43 61 6e  rty(pNew, EP_Can
1e2d0 42 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  BeNull);.       
1e2e0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
1e2f0 4e 65 77 20 26 26 20 45 78 70 72 48 61 73 50 72  New && ExprHasPr
1e300 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f  operty(pExpr,EP_
1e310 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
1e320 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 52 69         pNew->iRi
1e330 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70  ghtJoinTable = p
1e340 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Expr->iRightJoin
1e350 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
1e360 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
1e370 28 70 4e 65 77 2c 20 45 50 5f 46 72 6f 6d 4a 6f  (pNew, EP_FromJo
1e380 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  in);.        }. 
1e390 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1e3a0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
1e3b0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78  pr);.        pEx
1e3c0 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  pr = pNew;.     
1e3d0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
1e3e0 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  {.    if( pExpr-
1e3f0 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f  >op==TK_IF_NULL_
1e400 52 4f 57 20 26 26 20 70 45 78 70 72 2d 3e 69 54  ROW && pExpr->iT
1e410 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54  able==pSubst->iT
1e420 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 45  able ){.      pE
1e430 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 53  xpr->iTable = pS
1e440 75 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b  ubst->iNewTable;
1e450 0a 20 20 20 20 7d 0a 20 20 20 20 70 45 78 70 72  .    }.    pExpr
1e460 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45  ->pLeft = substE
1e470 78 70 72 28 70 53 75 62 73 74 2c 20 70 45 78 70  xpr(pSubst, pExp
1e480 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70  r->pLeft);.    p
1e490 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73  Expr->pRight = s
1e4a0 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c  ubstExpr(pSubst,
1e4b0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
1e4c0 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
1e4d0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1e4e0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
1e4f0 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65  .      substSele
1e500 63 74 28 70 53 75 62 73 74 2c 20 70 45 78 70 72  ct(pSubst, pExpr
1e510 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 31 29 3b  ->x.pSelect, 1);
1e520 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e530 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1e540 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 78  pSubst, pExpr->x
1e550 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  .pList);.    }. 
1e560 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70   }.  return pExp
1e570 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  r;.}.static void
1e580 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a   substExprList(.
1e590 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a    SubstContext *
1e5a0 70 53 75 62 73 74 2c 20 2f 2a 20 44 65 73 63 72  pSubst, /* Descr
1e5b0 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  iption of the su
1e5c0 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20  bstitution */.  
1e5d0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
1e5e0 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f        /* List to
1e5f0 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69   scan and in whi
1e600 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74  ch to make subst
1e610 69 74 75 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69  itutes */.){.  i
1e620 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
1e630 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
1e640 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1e650 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
1e660 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e      pList->a[i].
1e670 70 45 78 70 72 20 3d 20 73 75 62 73 74 45 78 70  pExpr = substExp
1e680 72 28 70 53 75 62 73 74 2c 20 70 4c 69 73 74 2d  r(pSubst, pList-
1e690 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
1e6a0 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
1e6b0 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20 53  substSelect(.  S
1e6c0 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75  ubstContext *pSu
1e6d0 62 73 74 2c 20 2f 2a 20 44 65 73 63 72 69 70 74  bst, /* Descript
1e6e0 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74  ion of the subst
1e6f0 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  itution */.  Sel
1e700 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
1e710 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
1e720 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20  tement in which 
1e730 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75  to make substitu
1e740 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 64  tions */.  int d
1e750 6f 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20  oPrior          
1e760 20 2f 2a 20 44 6f 20 73 75 62 73 74 69 74 75 74   /* Do substitut
1e770 65 73 20 6f 6e 20 70 2d 3e 70 50 72 69 6f 72 20  es on p->pPrior 
1e780 74 6f 6f 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c  too */.){.  SrcL
1e790 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72  ist *pSrc;.  str
1e7a0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1e7b0 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
1e7c0 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  ;.  if( !p ) ret
1e7d0 75 72 6e 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73  urn;.  do{.    s
1e7e0 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75  ubstExprList(pSu
1e7f0 62 73 74 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  bst, p->pEList);
1e800 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
1e810 73 74 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 47  st(pSubst, p->pG
1e820 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 75 62  roupBy);.    sub
1e830 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73  stExprList(pSubs
1e840 74 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  t, p->pOrderBy);
1e850 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20  .    p->pHaving 
1e860 3d 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62  = substExpr(pSub
1e870 73 74 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b  st, p->pHaving);
1e880 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  .    p->pWhere =
1e890 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62 73   substExpr(pSubs
1e8a0 74 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  t, p->pWhere);. 
1e8b0 20 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72     pSrc = p->pSr
1e8c0 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  c;.    assert( p
1e8d0 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f  Src!=0 );.    fo
1e8e0 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20  r(i=pSrc->nSrc, 
1e8f0 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69  pItem=pSrc->a; i
1e900 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
1e910 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65  ){.      substSe
1e920 6c 65 63 74 28 70 53 75 62 73 74 2c 20 70 49 74  lect(pSubst, pIt
1e930 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 31 29 3b  em->pSelect, 1);
1e940 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
1e950 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29  ->fg.isTabFunc )
1e960 7b 0a 20 20 20 20 20 20 20 20 73 75 62 73 74 45  {.        substE
1e970 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20  xprList(pSubst, 
1e980 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  pItem->u1.pFuncA
1e990 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rg);.      }.   
1e9a0 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 64 6f 50   }.  }while( doP
1e9b0 72 69 6f 72 20 26 26 20 28 70 20 3d 20 70 2d 3e  rior && (p = p->
1e9c0 70 50 72 69 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a  pPrior)!=0 );.}.
1e9d0 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
1e9e0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
1e9f0 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
1ea00 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1ea10 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21  _VIEW) */..#if !
1ea20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1ea30 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
1ea40 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1ea50 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a  _OMIT_VIEW)./*.*
1ea60 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
1ea70 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74  ttempts to flatt
1ea80 65 6e 20 73 75 62 71 75 65 72 69 65 73 20 61 73  en subqueries as
1ea90 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f   a performance o
1eaa0 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20  ptimization..** 
1eab0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
1eac0 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b  urns 1 if it mak
1ead0 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30  es changes and 0
1eae0 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e   if no flattenin
1eaf0 67 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  g occurs..**.** 
1eb00 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68  To understand th
1eb10 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61  e concept of fla
1eb20 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65  ttening, conside
1eb30 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  r the following.
1eb40 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  ** query:.**.** 
1eb50 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
1eb60 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53  M (SELECT x+y AS
1eb70 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
1eb80 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e   z<100) WHERE a>
1eb90 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61  5.**.** The defa
1eba0 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65  ult way of imple
1ebb0 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65  menting this que
1ebc0 72 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65  ry is to execute
1ebd0 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79   the.** subquery
1ebe0 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65   first and store
1ebf0 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
1ec00 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
1ec10 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74  e, then.** run t
1ec20 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f  he outer query o
1ec30 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79  n that temporary
1ec40 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65   table.  This re
1ec50 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61  quires two.** pa
1ec60 73 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61  sses over the da
1ec70 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65  ta.  Furthermore
1ec80 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65  , because the te
1ec90 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a  mporary table.**
1eca0 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c   has no indices,
1ecb0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1ecc0 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71  e on the outer q
1ecd0 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  uery cannot be.*
1ece0 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a  * optimized..**.
1ecf0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1ed00 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72  attempts to rewr
1ed10 69 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68  ite queries such
1ed20 20 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e   as the above in
1ed30 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66  to.** a single f
1ed40 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65  lat select, like
1ed50 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1ed60 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61   SELECT x+y AS a
1ed70 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
1ed80 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a  <100 AND a>5.**.
1ed90 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  ** The code gene
1eda0 72 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73  rated for this s
1edb0 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 67 69  implification gi
1edc0 76 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73  ves the same res
1edd0 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20  ult.** but only 
1ede0 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20  has to scan the 
1edf0 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20  data once.  And 
1ee00 62 65 63 61 75 73 65 20 69 6e 64 69 63 65 73 20  because indices 
1ee10 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20  might .** exist 
1ee20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c  on the table t1,
1ee30 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e   a complete scan
1ee40 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69 67   of the data mig
1ee50 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64  ht be.** avoided
1ee60 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69  ..**.** Flatteni
1ee70 6e 67 20 69 73 20 73 75 62 6a 65 63 74 20 74 6f  ng is subject to
1ee80 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
1ee90 6f 6e 73 74 72 61 69 6e 74 73 3a 0a 2a 2a 0a 2a  onstraints:.**.*
1eea0 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c  *  (**)  We no l
1eeb0 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f  onger attempt to
1eec0 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61   flatten aggrega
1eed0 74 65 20 73 75 62 71 75 65 72 69 65 73 2e 20 57  te subqueries. W
1eee0 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68  as:.**        Th
1eef0 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
1ef00 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63  he outer query c
1ef10 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20 61 67  annot both be ag
1ef20 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
1ef30 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e   (**)  We no lon
1ef40 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66  ger attempt to f
1ef50 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61 74 65  latten aggregate
1ef60 20 73 75 62 71 75 65 72 69 65 73 2e 20 57 61 73   subqueries. Was
1ef70 3a 0a 2a 2a 20 20 20 20 20 20 20 20 28 32 29 20  :.**        (2) 
1ef80 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1ef90 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  is an aggregate 
1efa0 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28  then.**        (
1efb0 32 61 29 20 74 68 65 20 6f 75 74 65 72 20 71 75  2a) the outer qu
1efc0 65 72 79 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  ery must not be 
1efd0 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a 2a 20 20 20  a join and.**   
1efe0 20 20 20 20 20 28 32 62 29 20 74 68 65 20 6f 75       (2b) the ou
1eff0 74 65 72 20 71 75 65 72 79 20 6d 75 73 74 20 6e  ter query must n
1f000 6f 74 20 75 73 65 20 73 75 62 71 75 65 72 69 65  ot use subquerie
1f010 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
1f020 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20   other than the 
1f030 6f 6e 65 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  one FROM-clause 
1f040 73 75 62 71 75 65 72 79 20 74 68 61 74 20 69 73  subquery that is
1f050 20 61 20 63 61 6e 64 69 64 61 74 65 0a 2a 2a 20   a candidate.** 
1f060 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
1f070 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 28 54 68  flattening.  (Th
1f080 69 73 20 69 73 20 64 75 65 20 74 6f 20 74 69 63  is is due to tic
1f090 6b 65 74 20 5b 32 66 37 31 37 30 64 37 33 62 66  ket [2f7170d73bf
1f0a0 39 61 62 66 38 30 5d 0a 2a 2a 20 20 20 20 20 20  9abf80].**      
1f0b0 20 20 20 20 20 20 20 66 72 6f 6d 20 32 30 31 35         from 2015
1f0c0 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20  -02-09.).**.**  
1f0d0 20 28 33 29 20 20 49 66 20 74 68 65 20 73 75 62   (3)  If the sub
1f0e0 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
1f0f0 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
1f100 4c 45 46 54 20 4a 4f 49 4e 20 74 68 65 6e 0a 2a  LEFT JOIN then.*
1f110 2a 20 20 20 20 20 20 20 20 28 33 61 29 20 74 68  *        (3a) th
1f120 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e  e subquery may n
1f130 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64  ot be a join and
1f140 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 62 29 20  .**        (3b) 
1f150 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1f160 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
1f170 6d 61 79 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  may not contain 
1f180 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 20 20 20  a virtual.**    
1f190 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 61           table a
1f1a0 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 63  nd.**        (3c
1f1b0 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  ) the outer quer
1f1c0 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6e 20  y may not be an 
1f1d0 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a  aggregate..**.**
1f1e0 20 20 20 28 34 29 20 20 54 68 65 20 73 75 62 71     (4)  The subq
1f1f0 75 65 72 79 20 63 61 6e 20 6e 6f 74 20 62 65 20  uery can not be 
1f200 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
1f210 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f   (**)  At one po
1f220 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73  int restrictions
1f230 20 28 34 29 20 61 6e 64 20 28 35 29 20 64 65 66   (4) and (5) def
1f240 69 6e 65 64 20 61 20 73 75 62 73 65 74 20 6f 66  ined a subset of
1f250 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20   DISTINCT.**    
1f260 20 20 20 20 73 75 62 2d 71 75 65 72 69 65 73 20      sub-queries 
1f270 74 68 61 74 20 77 65 72 65 20 65 78 63 6c 75 64  that were exclud
1f280 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74  ed from this opt
1f290 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72  imization. Restr
1f2a0 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20  iction .**      
1f2b0 20 20 28 34 29 20 68 61 73 20 73 69 6e 63 65 20    (4) has since 
1f2c0 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f  been expanded to
1f2d0 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53   exclude all DIS
1f2e0 54 49 4e 43 54 20 73 75 62 71 75 65 72 69 65 73  TINCT subqueries
1f2f0 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57  ..**.**  (**)  W
1f300 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65  e no longer atte
1f310 6d 70 74 20 74 6f 20 66 6c 61 74 74 65 6e 20 61  mpt to flatten a
1f320 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72  ggregate subquer
1f330 69 65 73 2e 20 20 57 61 73 3a 0a 2a 2a 20 20 20  ies.  Was:.**   
1f340 20 20 20 20 20 49 66 20 74 68 65 20 73 75 62 71       If the subq
1f350 75 65 72 79 20 69 73 20 61 67 67 72 65 67 61 74  uery is aggregat
1f360 65 2c 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  e, the outer que
1f370 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 44 49  ry may not be DI
1f380 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20  STINCT..**.**   
1f390 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (7)  The subquer
1f3a0 79 20 6d 75 73 74 20 68 61 76 65 20 61 20 46 52  y must have a FR
1f3b0 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f  OM clause.  TODO
1f3c0 3a 20 20 46 6f 72 20 73 75 62 71 75 65 72 69 65  :  For subquerie
1f3d0 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20  s without.**    
1f3e0 20 20 20 20 41 20 46 52 4f 4d 20 63 6c 61 75 73      A FROM claus
1f3f0 65 2c 20 63 6f 6e 73 69 64 65 72 20 61 64 64 69  e, consider addi
1f400 6e 67 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  ng a FROM clause
1f410 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61   with the specia
1f420 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74 61 62 6c  l.**        tabl
1f430 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68  e sqlite_once th
1f440 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  at consists of a
1f450 20 73 69 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74   single row cont
1f460 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  aining a.**     
1f470 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a     single NULL..
1f480 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 49 66 20  **.**   (8)  If 
1f490 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
1f4a0 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65  s LIMIT then the
1f4b0 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79   outer query may
1f4c0 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e 2e 0a   not be a join..
1f4d0 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 49 66 20  **.**   (9)  If 
1f4e0 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
1f4f0 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65  s LIMIT then the
1f500 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79   outer query may
1f510 20 6e 6f 74 20 62 65 20 61 67 67 72 65 67 61 74   not be aggregat
1f520 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  e..**.**  (**)  
1f530 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 30 29  Restriction (10)
1f540 20 77 61 73 20 72 65 6d 6f 76 65 64 20 66 72 6f   was removed fro
1f550 6d 20 74 68 65 20 63 6f 64 65 20 6f 6e 20 32 30  m the code on 20
1f560 30 35 2d 30 32 2d 30 35 20 62 75 74 20 77 65 0a  05-02-05 but we.
1f570 2a 2a 20 20 20 20 20 20 20 20 61 63 63 69 64 65  **        accide
1f580 6e 74 6c 79 20 63 61 72 72 69 65 64 20 74 68 65  ntly carried the
1f590 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 77 61 72 64   comment forward
1f5a0 20 75 6e 74 69 6c 20 32 30 31 34 2d 30 39 2d 31   until 2014-09-1
1f5b0 35 2e 20 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20  5.  Original.** 
1f5c0 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e         constrain
1f5d0 74 3a 20 22 49 66 20 74 68 65 20 73 75 62 71 75  t: "If the subqu
1f5e0 65 72 79 20 69 73 20 61 67 67 72 65 67 61 74 65  ery is aggregate
1f5f0 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20   then the outer 
1f600 71 75 65 72 79 20 0a 2a 2a 20 20 20 20 20 20 20  query .**       
1f610 20 6d 61 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d   may not use LIM
1f620 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29  IT.".**.**  (11)
1f630 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
1f640 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
1f650 72 79 20 6d 61 79 20 6e 6f 74 20 62 6f 74 68 20  ry may not both 
1f660 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c  have ORDER BY cl
1f670 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  auses..**.**  (*
1f680 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e  *)  Not implemen
1f690 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64 20 69  ted.  Subsumed i
1f6a0 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20  nto restriction 
1f6b0 28 33 29 2e 20 20 57 61 73 20 70 72 65 76 69 6f  (3).  Was previo
1f6c0 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 61  usly.**        a
1f6d0 20 73 65 70 61 72 61 74 65 20 72 65 73 74 72 69   separate restri
1f6e0 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67 20 66  ction deriving f
1f6f0 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35 30 2e  rom ticket #350.
1f700 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68  .**.**  (13)  Th
1f710 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f  e subquery and o
1f720 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
1f730 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49  ot both use LIMI
1f740 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20  T..**.**  (14)  
1f750 54 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79  The subquery may
1f760 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45 54 2e   not use OFFSET.
1f770 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20 49 66  .**.**  (15)  If
1f780 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1f790 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 63 6f   is part of a co
1f7a0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74  mpound select, t
1f7b0 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  hen the.**      
1f7c0 20 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e    subquery may n
1f7d0 6f 74 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a  ot use LIMIT..**
1f7e0 20 20 20 20 20 20 20 20 28 53 65 65 20 74 69 63          (See tic
1f7f0 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20 74 69  ket #2339 and ti
1f800 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34 34  cket [02a8e81d44
1f810 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20  ])..**.**  (16) 
1f820 20 49 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   If the outer qu
1f830 65 72 79 20 69 73 20 61 67 67 72 65 67 61 74 65  ery is aggregate
1f840 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 71 75  , then the subqu
1f850 65 72 79 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20 20  ery may not.**  
1f860 20 20 20 20 20 20 75 73 65 20 4f 52 44 45 52 20        use ORDER 
1f870 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39  BY.  (Ticket #29
1f880 34 32 29 20 20 54 68 69 73 20 75 73 65 64 20 74  42)  This used t
1f890 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20  o not matter.** 
1f8a0 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20         until we 
1f8b0 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20 67  introduced the g
1f8c0 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75  roup_concat() fu
1f8d0 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20  nction.  .**.** 
1f8e0 20 28 31 37 29 20 20 49 66 20 74 68 65 20 73 75   (17)  If the su
1f8f0 62 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  bquery is a comp
1f900 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65  ound select, the
1f910 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 31 37 61  n.**        (17a
1f920 29 20 61 6c 6c 20 63 6f 6d 70 6f 75 6e 64 20 6f  ) all compound o
1f930 70 65 72 61 74 6f 72 73 20 6d 75 73 74 20 62 65  perators must be
1f940 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 61 6e   a UNION ALL, an
1f950 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 31 37 62  d.**        (17b
1f960 29 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 69  ) no terms withi
1f970 6e 20 74 68 65 20 73 75 62 71 75 65 72 79 20 63  n the subquery c
1f980 6f 6d 70 6f 75 6e 64 20 6d 61 79 20 62 65 20 61  ompound may be a
1f990 67 67 72 65 67 61 74 65 0a 2a 2a 20 20 20 20 20  ggregate.**     
1f9a0 20 20 20 20 20 20 20 20 20 6f 72 20 44 49 53 54           or DIST
1f9b0 49 4e 43 54 2c 20 61 6e 64 0a 2a 2a 20 20 20 20  INCT, and.**    
1f9c0 20 20 20 20 28 31 37 63 29 20 65 76 65 72 79 20      (17c) every 
1f9d0 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20  term within the 
1f9e0 73 75 62 71 75 65 72 79 20 63 6f 6d 70 6f 75 6e  subquery compoun
1f9f0 64 20 6d 75 73 74 20 68 61 76 65 20 61 20 46 52  d must have a FR
1fa00 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20  OM clause.**    
1fa10 20 20 20 20 28 31 37 64 29 20 74 68 65 20 6f 75      (17d) the ou
1fa20 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f  ter query may no
1fa30 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  t be.**         
1fa40 20 20 20 20 20 28 31 37 64 31 29 20 61 67 67 72       (17d1) aggr
1fa50 65 67 61 74 65 2c 20 6f 72 0a 2a 2a 20 20 20 20  egate, or.**    
1fa60 20 20 20 20 20 20 20 20 20 20 28 31 37 64 32 29            (17d2)
1fa70 20 44 49 53 54 49 4e 43 54 2c 20 6f 72 0a 2a 2a   DISTINCT, or.**
1fa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 31                (1
1fa90 37 64 33 29 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a  7d3) a join..**.
1faa0 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 70 61  **        The pa
1fab0 72 65 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65  rent and sub-que
1fac0 72 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57  ry may contain W
1fad0 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75  HERE clauses. Su
1fae0 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20  bject to.**     
1faf0 20 20 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28     rules (11), (
1fb00 31 33 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68  13) and (14), th
1fb10 65 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74  ey may also cont
1fb20 61 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a  ain ORDER BY,.**
1fb30 20 20 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e          LIMIT an
1fb40 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  d OFFSET clauses
1fb50 2e 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  .  The subquery 
1fb60 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63  cannot use any c
1fb70 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
1fb80 20 20 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72    operator other
1fb90 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20   than UNION ALL 
1fba0 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20  because all the 
1fbb0 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a  other compound.*
1fbc0 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f  *        operato
1fbd0 72 73 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69  rs have an impli
1fbe0 65 64 20 44 49 53 54 49 4e 43 54 20 77 68 69 63  ed DISTINCT whic
1fbf0 68 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20  h is disallowed 
1fc00 62 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73  by.**        res
1fc10 74 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a  triction (4)..**
1fc20 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c  .**        Also,
1fc30 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20   each component 
1fc40 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  of the sub-query
1fc50 20 6d 75 73 74 20 72 65 74 75 72 6e 20 74 68 65   must return the
1fc60 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20   same number.** 
1fc70 20 20 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74         of result
1fc80 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69   columns. This i
1fc90 73 20 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71  s actually a req
1fca0 75 69 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79  uirement for any
1fcb0 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20   compound.**    
1fcc0 20 20 20 20 53 45 4c 45 43 54 20 73 74 61 74 65      SELECT state
1fcd0 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68  ment, but all th
1fce0 65 20 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73  e code here does
1fcf0 20 69 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68   is make sure th
1fd00 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20  at no.**        
1fd10 73 75 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73  such (illegal) s
1fd20 75 62 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74  ub-query is flat
1fd30 74 65 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  tened. The calle
1fd40 72 20 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68  r will detect th
1fd50 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74  e.**        synt
1fd60 61 78 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74  ax error and ret
1fd70 75 72 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d  urn a detailed m
1fd80 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  essage..**.**  (
1fd90 31 38 29 20 20 49 66 20 74 68 65 20 73 75 62 2d  18)  If the sub-
1fda0 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
1fdb0 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
1fdc0 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
1fdd0 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45  e.**        ORDE
1fde0 52 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20 74  R BY clause of t
1fdf0 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62  he parent must b
1fe00 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e  e simple referen
1fe10 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20  ces to .**      
1fe20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65    columns of the
1fe30 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a   sub-query..**.*
1fe40 2a 20 20 28 31 39 29 20 20 49 66 20 74 68 65 20  *  (19)  If the 
1fe50 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c 49  subquery uses LI
1fe60 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75 74  MIT then the out
1fe70 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  er query may not
1fe80 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20  .**        have 
1fe90 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  a WHERE clause..
1fea0 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49 66 20  **.**  (20)  If 
1feb0 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
1fec0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
1fed0 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74  ct, then it must
1fee0 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
1fef0 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63     an ORDER BY c
1ff00 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74 20 23  lause.  Ticket #
1ff10 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c 64 20  3773.  We could 
1ff20 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e 73 74  relax this const
1ff30 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  raint.**        
1ff40 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61 79 69  somewhat by sayi
1ff50 6e 67 20 74 68 61 74 20 74 68 65 20 74 65 72 6d  ng that the term
1ff60 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  s of the ORDER B
1ff70 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a  Y clause must.**
1ff80 20 20 20 20 20 20 20 20 61 70 70 65 61 72 20 61          appear a
1ff90 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72 65 73  s unmodified res
1ffa0 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  ult columns in t
1ffb0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20  he outer query. 
1ffc0 20 42 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20   But we.**      
1ffd0 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f 70 74    have other opt
1ffe0 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69  imizations in mi
1fff0 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  nd to deal with 
20000 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  that case..**.**
20010 20 20 28 32 31 29 20 20 49 66 20 74 68 65 20 73    (21)  If the s
20020 75 62 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d  ubquery uses LIM
20030 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65  IT then the oute
20040 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  r query may not 
20050 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53  be.**        DIS
20060 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74 69 63  TINCT.  (See tic
20070 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66 63 5d  ket [752e1646fc]
20080 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20  )..**.**  (22)  
20090 54 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79  The subquery may
200a0 20 6e 6f 74 20 62 65 20 61 20 72 65 63 75 72 73   not be a recurs
200b0 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20  ive CTE..**.**  
200c0 28 2a 2a 29 20 20 53 75 62 73 75 6d 65 64 20 69  (**)  Subsumed i
200d0 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20  nto restriction 
200e0 28 31 37 64 33 29 2e 20 20 57 61 73 3a 20 49 66  (17d3).  Was: If
200f0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
20100 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 61 20   is.**        a 
20110 72 65 63 75 72 73 69 76 65 20 43 54 45 2c 20 74  recursive CTE, t
20120 68 65 6e 20 74 68 65 20 73 75 62 2d 71 75 65 72  hen the sub-quer
20130 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 63  y may not be a c
20140 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a  ompound query..*
20150 2a 20 20 20 20 20 20 20 20 54 68 69 73 20 72 65  *        This re
20160 73 74 72 69 63 74 69 6f 6e 20 69 73 20 62 65 63  striction is bec
20170 61 75 73 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e  ause transformin
20180 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  g the.**        
20190 70 61 72 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70  parent to a comp
201a0 6f 75 6e 64 20 71 75 65 72 79 20 63 6f 6e 66 75  ound query confu
201b0 73 65 73 20 74 68 65 20 63 6f 64 65 20 74 68 61  ses the code tha
201c0 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20  t handles.**    
201d0 20 20 20 20 72 65 63 75 72 73 69 76 65 20 71 75      recursive qu
201e0 65 72 69 65 73 20 69 6e 20 6d 75 6c 74 69 53 65  eries in multiSe
201f0 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28  lect()..**.**  (
20200 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65  **)  We no longe
20210 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61  r attempt to fla
20220 74 74 65 6e 20 61 67 67 72 65 67 61 74 65 20 73  tten aggregate s
20230 75 62 71 75 65 72 69 65 73 2e 20 20 57 61 73 3a  ubqueries.  Was:
20240 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 73  .**        The s
20250 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  ubquery may not 
20260 62 65 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  be an aggregate 
20270 74 68 61 74 20 75 73 65 73 20 74 68 65 20 62 75  that uses the bu
20280 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20  ilt-in min() or 
20290 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72 20 6d 61  .**        or ma
202a0 78 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  x() functions.  
202b0 28 57 69 74 68 6f 75 74 20 74 68 69 73 20 72 65  (Without this re
202c0 73 74 72 69 63 74 69 6f 6e 2c 20 61 20 71 75 65  striction, a que
202d0 72 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20  ry like:.**     
202e0 20 20 20 22 53 45 4c 45 43 54 20 78 20 46 52 4f     "SELECT x FRO
202f0 4d 20 28 53 45 4c 45 43 54 20 6d 61 78 28 79 29  M (SELECT max(y)
20300 2c 20 78 20 46 52 4f 4d 20 74 31 29 22 20 77 6f  , x FROM t1)" wo
20310 75 6c 64 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  uld not necessar
20320 69 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65  ily.**        re
20330 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 58  turn the value X
20340 20 66 6f 72 20 77 68 69 63 68 20 59 20 77 61 73   for which Y was
20350 20 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a   maximal.).**.**
20360 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74  .** In this rout
20370 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72  ine, the "p" par
20380 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
20390 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72  ter to the outer
203a0 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
203b0 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53  ubquery is p->pS
203c0 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69  rc->a[iFrom].  i
203d0 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
203e0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a  the outer query.
203f0 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ** uses aggregat
20400 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61  es..**.** If fla
20410 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61  ttening is not a
20420 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72  ttempted, this r
20430 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
20440 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e  p and returns 0.
20450 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
20460 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74  g is attempted t
20470 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
20480 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  rns 1..**.** All
20490 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
204a0 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74  on analysis must
204b0 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74   occur on both t
204c0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
204d0 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65  nd.** the subque
204e0 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  ry before this r
204f0 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a  outine runs..*/.
20500 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74  static int flatt
20510 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61  enSubquery(.  Pa
20520 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
20530 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
20540 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
20550 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
20560 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72  /* The parent or
20570 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74   outer SELECT st
20580 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
20590 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20   iFrom,         
205a0 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d    /* Index in p-
205b0 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68  >pSrc->a[] of th
205c0 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79  e inner subquery
205d0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 20   */.  int isAgg 
205e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
205f0 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45  ue if outer SELE
20600 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74  CT uses aggregat
20610 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29  e functions */.)
20620 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
20630 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
20640 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  t = pParse->zAut
20650 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65  hContext;.  Sele
20660 63 74 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20  ct *pParent;    
20670 2f 2a 20 43 75 72 72 65 6e 74 20 55 4e 49 4f 4e  /* Current UNION
20680 20 41 4c 4c 20 74 65 72 6d 20 6f 66 20 74 68 65   ALL term of the
20690 20 6f 74 68 65 72 20 71 75 65 72 79 20 2a 2f 0a   other query */.
206a0 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20    Select *pSub; 
206b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e        /* The inn
206c0 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62  er query or "sub
206d0 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65  query" */.  Sele
206e0 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20  ct *pSub1;      
206f0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
20700 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65  e rightmost sele
20710 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20  ct in sub-query 
20720 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
20730 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  rc;      /* The 
20740 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
20750 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
20760 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75  /.  SrcList *pSu
20770 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46  bSrc;   /* The F
20780 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
20790 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
207a0 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
207b0 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73      /* VDBE curs
207c0 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
207d0 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74   pSub result set
207e0 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
207f0 20 69 6e 74 20 69 4e 65 77 50 61 72 65 6e 74 20   int iNewParent 
20800 3d 20 2d 31 3b 2f 2a 20 52 65 70 6c 61 63 65 6d  = -1;/* Replacem
20810 65 6e 74 20 74 61 62 6c 65 20 66 6f 72 20 69 50  ent table for iP
20820 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  arent */.  int i
20830 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 20 2f  sLeftJoin = 0; /
20840 2a 20 54 72 75 65 20 69 66 20 70 53 75 62 20 69  * True if pSub i
20850 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65  s the right side
20860 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
20870 2a 2f 20 20 20 20 0a 20 20 69 6e 74 20 69 3b 20  */    .  int i; 
20880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20890 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
208a0 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
208b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208c0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
208d0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
208e0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
208f0 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20  *pSubitem;   /* 
20900 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  The subquery */.
20910 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
20920 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
20930 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
20940 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
20950 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75  permitted.  Retu
20960 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a  rn 0 if not..  *
20970 2f 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  /.  assert( p!=0
20980 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
20990 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20  >pPrior==0 );.  
209a0 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
209b0 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  Disabled(db, SQL
209c0 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e  ITE_QueryFlatten
209d0 65 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  er) ) return 0;.
209e0 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
209f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
20a00 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20   && iFrom>=0 && 
20a10 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63  iFrom<pSrc->nSrc
20a20 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d   );.  pSubitem =
20a30 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d   &pSrc->a[iFrom]
20a40 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53  ;.  iParent = pS
20a50 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  ubitem->iCursor;
20a60 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74  .  pSub = pSubit
20a70 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61  em->pSelect;.  a
20a80 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29  ssert( pSub!=0 )
20a90 3b 0a 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70  ;..  pSubSrc = p
20aa0 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  Sub->pSrc;.  ass
20ab0 65 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a  ert( pSubSrc );.
20ac0 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65    /* Prior to ve
20ad0 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65  rsion 3.1.2, whe
20ae0 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  n LIMIT and OFFS
20af0 45 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d  ET had to be sim
20b00 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20  ple constants,. 
20b10 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72   ** not arbitrar
20b20 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77  y expressions, w
20b30 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63  e allowed some c
20b40 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49  ombining of LIMI
20b50 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
20b60 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63  * because they c
20b70 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
20b80 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
20b90 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49  .  But when LIMI
20ba0 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
20bb0 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61  * became arbitra
20bc0 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  ry expressions, 
20bd0 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74  we were forced t
20be0 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f  o add restrictio
20bf0 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64  ns (13).  ** and
20c00 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20   (14). */.  if( 
20c10 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
20c20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
20c30 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
20c40 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
20c50 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20  n (13) */.  if( 
20c60 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
20c70 70 53 75 62 2d 3e 70 4c 69 6d 69 74 2d 3e 70 52  pSub->pLimit->pR
20c80 69 67 68 74 20 29 20 72 65 74 75 72 6e 20 30 3b  ight ) return 0;
20c90 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
20ca0 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20  n (14) */.  if( 
20cb0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
20cc0 46 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d 30 20 26  F_Compound)!=0 &
20cd0 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29  & pSub->pLimit )
20ce0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
20cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
20d20 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a  striction (15) *
20d30 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  /.  }.  if( pSub
20d40 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72  Src->nSrc==0 ) r
20d50 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
20d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20d70 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37  * Restriction (7
20d80 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
20d90 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
20da0 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
20db0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  n 0;           /
20dc0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 34  * Restriction (4
20dd0 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
20de0 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72  ->pLimit && (pSr
20df0 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41  c->nSrc>1 || isA
20e00 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75  gg) ){.     retu
20e10 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
20e20 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38   Restrictions (8
20e30 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  )(9) */.  }.  if
20e40 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26  ( p->pOrderBy &&
20e50 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
20e60 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
20e70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
20ea0 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20  estriction (11) 
20eb0 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41  */.  }.  if( isA
20ec0 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  gg && pSub->pOrd
20ed0 65 72 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b  erBy ) return 0;
20ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ef0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
20f00 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  16) */.  if( pSu
20f10 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e  b->pLimit && p->
20f20 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20  pWhere ) return 
20f30 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
20f40 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
20f50 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  19) */.  if( pSu
20f60 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d  b->pLimit && (p-
20f70 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
20f80 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20  istinct)!=0 ){. 
20f90 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
20fa0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
20fb0 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d  tion (21) */.  }
20fc0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c  .  if( pSub->sel
20fd0 46 6c 61 67 73 20 26 20 28 53 46 5f 52 65 63 75  Flags & (SF_Recu
20fe0 72 73 69 76 65 29 20 29 7b 0a 20 20 20 20 72 65  rsive) ){.    re
20ff0 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72  turn 0; /* Restr
21000 69 63 74 69 6f 6e 73 20 28 32 32 29 20 2a 2f 0a  ictions (22) */.
21010 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49    }..  /*.  ** I
21020 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
21030 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
21040 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  and of a LEFT JO
21050 49 4e 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  IN, then the.  *
21060 2a 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e  * subquery may n
21070 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20 69 74 73  ot be a join its
21080 65 6c 66 20 28 33 61 29 2e 20 45 78 61 6d 70 6c  elf (3a). Exampl
21090 65 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73  e of why this is
210a0 20 6e 6f 74 0a 20 20 2a 2a 20 61 6c 6c 6f 77 65   not.  ** allowe
210b0 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  d:.  **.  **    
210c0 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54       t1 LEFT OUT
210d0 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e  ER JOIN (t2 JOIN
210e0 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49   t3).  **.  ** I
210f0 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65  f we flatten the
21100 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64   above, we would
21110 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   get.  **.  **  
21120 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20         (t1 LEFT 
21130 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a  OUTER JOIN t2) J
21140 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a  OIN t3.  **.  **
21150 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74   which is not at
21160 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68   all the same th
21170 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ing..  **.  ** I
21180 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
21190 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
211a0 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  and of a LEFT JO
211b0 49 4e 2c 20 74 68 65 6e 20 74 68 65 20 6f 75 74  IN, then the out
211c0 65 72 0a 20 20 2a 2a 20 71 75 65 72 79 20 63 61  er.  ** query ca
211d0 6e 6e 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65  nnot be an aggre
211e0 67 61 74 65 2e 20 28 33 63 29 20 20 54 68 69 73  gate. (3c)  This
211f0 20 69 73 20 61 6e 20 61 72 74 69 66 61 63 74 20   is an artifact 
21200 6f 66 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20  of the way.  ** 
21210 61 67 67 72 65 67 61 74 65 73 20 61 72 65 20 70  aggregates are p
21220 72 6f 63 65 73 73 65 64 20 2d 20 74 68 65 72 65  rocessed - there
21230 20 69 73 20 6e 6f 20 6d 65 63 68 61 6e 69 73 6d   is no mechanism
21240 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
21250 0a 20 20 2a 2a 20 74 68 65 20 4c 45 46 54 20 4a  .  ** the LEFT J
21260 4f 49 4e 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  OIN table should
21270 20 62 65 20 61 6c 6c 2d 4e 55 4c 4c 2e 0a 20 20   be all-NULL..  
21280 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f  **.  ** See also
21290 20 74 69 63 6b 65 74 73 20 23 33 30 36 2c 20 23   tickets #306, #
212a0 33 35 30 2c 20 61 6e 64 20 23 33 33 30 30 2e 0a  350, and #3300..
212b0 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62    */.  if( (pSub
212c0 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  item->fg.jointyp
212d0 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
212e0 20 29 7b 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f   ){.    isLeftJo
212f0 69 6e 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  in = 1;.    if( 
21300 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20  pSubSrc->nSrc>1 
21310 7c 7c 20 69 73 41 67 67 20 7c 7c 20 49 73 56 69  || isAgg || IsVi
21320 72 74 75 61 6c 28 70 53 75 62 53 72 63 2d 3e 61  rtual(pSubSrc->a
21330 5b 30 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20 20  [0].pTab) ){.   
21340 20 20 20 2f 2a 20 20 28 33 61 29 20 20 20 20 20     /*  (3a)     
21350 20 20 20 20 20 20 20 20 28 33 63 29 20 20 20 20          (3c)    
21360 20 28 33 62 29 20 2a 2f 0a 20 20 20 20 20 20 72   (3b) */.      r
21370 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
21380 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
21390 5f 45 58 54 52 41 5f 49 46 4e 55 4c 4c 52 4f 57  _EXTRA_IFNULLROW
213a0 0a 20 20 65 6c 73 65 20 69 66 28 20 69 46 72 6f  .  else if( iFro
213b0 6d 3e 30 20 26 26 20 21 69 73 41 67 67 20 29 7b  m>0 && !isAgg ){
213c0 0a 20 20 20 20 2f 2a 20 53 65 74 74 69 6e 67 20  .    /* Setting 
213d0 69 73 4c 65 66 74 4a 6f 69 6e 20 74 6f 20 2d 31  isLeftJoin to -1
213e0 20 63 61 75 73 65 73 20 4f 50 5f 49 66 4e 75 6c   causes OP_IfNul
213f0 6c 52 6f 77 20 6f 70 63 6f 64 65 73 20 74 6f 20  lRow opcodes to 
21400 62 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72  be generated for
21410 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 72 65  .    ** every re
21420 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 72  ference to any r
21430 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 66 72 6f  esult column fro
21440 6d 20 73 75 62 71 75 65 72 79 20 69 6e 20 61 20  m subquery in a 
21450 6a 6f 69 6e 2c 20 65 76 65 6e 0a 20 20 20 20 2a  join, even.    *
21460 2a 20 74 68 6f 75 67 68 20 74 68 65 79 20 61 72  * though they ar
21470 65 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  e not necessary.
21480 20 20 54 68 69 73 20 77 69 6c 6c 20 73 74 72 65    This will stre
21490 73 73 2d 74 65 73 74 20 74 68 65 20 4f 50 5f 49  ss-test the OP_I
214a0 66 4e 75 6c 6c 52 6f 77 20 0a 20 20 20 20 2a 2a  fNullRow .    **
214b0 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20   opcode. */.    
214c0 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 2d 31 3b  isLeftJoin = -1;
214d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
214e0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
214f0 37 29 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71  7): If the sub-q
21500 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
21510 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20  nd SELECT, then 
21520 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65  it must.  ** use
21530 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20   only the UNION 
21540 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e  ALL operator. An
21550 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69  d none of the si
21560 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72  mple select quer
21570 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61  ies.  ** that ma
21580 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75  ke up the compou
21590 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c  nd SELECT are al
215a0 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67 72  lowed to be aggr
215b0 65 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63  egate or distinc
215c0 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a  t.  ** queries..
215d0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
215e0 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69  >pPrior ){.    i
215f0 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  f( pSub->pOrderB
21600 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
21610 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63  n 0;  /* Restric
21620 74 69 6f 6e 20 28 32 30 29 20 2a 2f 0a 20 20 20  tion (20) */.   
21630 20 7d 0a 20 20 20 20 69 66 28 20 69 73 41 67 67   }.    if( isAgg
21640 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   || (p->selFlags
21650 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21   & SF_Distinct)!
21660 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63  =0 || pSrc->nSrc
21670 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=1 ){.      ret
21680 75 72 6e 20 30 3b 20 2f 2a 20 28 31 37 64 31 29  urn 0; /* (17d1)
21690 2c 20 28 31 37 64 32 29 2c 20 6f 72 20 28 31 37  , (17d2), or (17
216a0 64 33 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  d3) */.    }.   
216b0 20 66 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b   for(pSub1=pSub;
216c0 20 70 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53   pSub1; pSub1=pS
216d0 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  ub1->pPrior){.  
216e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
216f0 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Sub1->selFlags &
21700 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
21710 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
21720 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20  _Distinct );.   
21730 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53     testcase( (pS
21740 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
21750 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
21760 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
21770 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20  Aggregate );.   
21780 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d     assert( pSub-
21790 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20  >pSrc!=0 );.    
217a0 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e    assert( pSub->
217b0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70  pEList->nExpr==p
217c0 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  Sub1->pEList->nE
217d0 78 70 72 20 29 3b 0a 20 20 20 20 20 20 69 66 28  xpr );.      if(
217e0 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67   (pSub1->selFlag
217f0 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
21800 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 21  |SF_Aggregate))!
21810 3d 30 20 20 20 20 2f 2a 20 28 31 37 62 29 20 2a  =0    /* (17b) *
21820 2f 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75  /.       || (pSu
21830 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53  b1->pPrior && pS
21840 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29  ub1->op!=TK_ALL)
21850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21860 20 2f 2a 20 28 31 37 61 29 20 2a 2f 0a 20 20 20   /* (17a) */.   
21870 20 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53      || pSub1->pS
21880 72 63 2d 3e 6e 53 72 63 3c 31 20 20 20 20 20 20  rc->nSrc<1      
21890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
218b0 31 37 63 29 20 2a 2f 0a 20 20 20 20 20 20 29 7b  17c) */.      ){
218c0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
218d0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
218e0 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62 31   testcase( pSub1
218f0 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29  ->pSrc->nSrc>1 )
21900 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
21910 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 38 29  Restriction (18)
21920 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
21930 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
21940 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
21950 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e  for(ii=0; ii<p->
21960 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
21970 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
21980 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d  if( p->pOrderBy-
21990 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  >a[ii].u.x.iOrde
219a0 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75  rByCol==0 ) retu
219b0 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
219c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78    }.  }..  /* Ex
219d0 2d 72 65 73 74 72 69 63 74 69 6f 6e 20 28 32 33  -restriction (23
219e0 29 3a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 6c 79  ):.  ** The only
219f0 20 77 61 79 20 74 68 61 74 20 74 68 65 20 72 65   way that the re
21a00 63 75 72 73 69 76 65 20 70 61 72 74 20 6f 66 20  cursive part of 
21a10 61 20 43 54 45 20 63 61 6e 20 63 6f 6e 74 61 69  a CTE can contai
21a20 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 0a 20 20 2a  n a compound.  *
21a30 2a 20 73 75 62 71 75 65 72 79 20 69 73 20 66 6f  * subquery is fo
21a40 72 20 74 68 65 20 73 75 62 71 75 65 72 79 20 74  r the subquery t
21a50 6f 20 62 65 20 6f 6e 65 20 74 65 72 6d 20 6f 66  o be one term of
21a60 20 61 20 6a 6f 69 6e 2e 20 20 42 75 74 20 69 66   a join.  But if
21a70 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
21a80 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 74 68  ry is a join, th
21a90 65 6e 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e  en the flattenin
21aa0 67 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  g has already be
21ab0 65 6e 20 73 74 6f 70 70 65 64 20 62 79 0a 20 20  en stopped by.  
21ac0 2a 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28  ** restriction (
21ad0 31 37 64 33 29 0a 20 20 2a 2f 0a 20 20 61 73 73  17d3).  */.  ass
21ae0 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
21af0 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
21b00 29 3d 3d 30 20 7c 7c 20 70 53 75 62 2d 3e 70 50  )==0 || pSub->pP
21b10 72 69 6f 72 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  rior==0 );..  /*
21b20 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68  **** If we reach
21b30 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61   this point, fla
21b40 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
21b50 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53  tted. *****/.  S
21b60 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61  ELECTTRACE(1,pPa
21b70 72 73 65 2c 70 2c 28 22 66 6c 61 74 74 65 6e 20  rse,p,("flatten 
21b80 25 73 2e 25 70 20 66 72 6f 6d 20 74 65 72 6d 20  %s.%p from term 
21b90 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
21ba0 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e            pSub->
21bb0 7a 53 65 6c 4e 61 6d 65 2c 20 70 53 75 62 2c 20  zSelName, pSub, 
21bc0 69 46 72 6f 6d 29 29 3b 0a 0a 20 20 2f 2a 20 41  iFrom));..  /* A
21bd0 75 74 68 6f 72 69 7a 65 20 74 68 65 20 73 75 62  uthorize the sub
21be0 71 75 65 72 79 20 2a 2f 0a 20 20 70 50 61 72 73  query */.  pPars
21bf0 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
21c00 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d  = pSubitem->zNam
21c10 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 69 20  e;.  TESTONLY(i 
21c20 3d 29 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  =) sqlite3AuthCh
21c30 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
21c40 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c  TE_SELECT, 0, 0,
21c50 20 30 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28   0);.  testcase(
21c60 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20   i==SQLITE_DENY 
21c70 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75  );.  pParse->zAu
21c80 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76  thContext = zSav
21c90 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a  edAuthContext;..
21ca0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d    /* If the sub-
21cb0 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
21cc0 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
21cd0 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79 20 72  ment, then (by r
21ce0 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a  estrictions.  **
21cf0 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f 76 65   17 and 18 above
21d00 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 20 55  ) it must be a U
21d10 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65  NION ALL and the
21d20 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 6d 75   parent query mu
21d30 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74  st .  ** be of t
21d40 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20  he form:.  **.  
21d50 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 65  **     SELECT <e
21d60 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28  xpr-list> FROM (
21d70 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c 77 68  <sub-query>) <wh
21d80 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a  ere-clause> .  *
21d90 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20  *.  ** followed 
21da0 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c  by any ORDER BY,
21db0 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46   LIMIT and/or OF
21dc0 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68  FSET clauses. Th
21dd0 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72  is block.  ** cr
21de0 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69 65 73  eates N-1 copies
21df0 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 71   of the parent q
21e00 75 65 72 79 20 77 69 74 68 6f 75 74 20 61 6e 79  uery without any
21e10 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54   ORDER BY, LIMIT
21e20 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54   or .  ** OFFSET
21e30 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f 69   clauses and joi
21e40 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20 6c  ns them to the l
21e50 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66  eft-hand-side of
21e60 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20   the original.  
21e70 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41  ** using UNION A
21e80 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e  LL operators. In
21e90 20 74 68 69 73 20 63 61 73 65 20 4e 20 69 73 20   this case N is 
21ea0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  the number of si
21eb0 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74  mple.  ** select
21ec0 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74   statements in t
21ed0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d  he compound sub-
21ee0 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  query..  **.  **
21ef0 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   Example:.  **. 
21f00 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61   **     SELECT a
21f10 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20  +1 FROM (.  **  
21f20 20 20 20 20 20 20 53 45 4c 45 43 54 20 78 20 46        SELECT x F
21f30 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20  ROM tab.  **    
21f40 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
21f50 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
21f60 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a   y FROM tab.  **
21f70 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
21f80 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  L.  **        SE
21f90 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20 46 52  LECT abs(z*2) FR
21fa0 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20 20 20  OM tab2.  **    
21fb0 20 29 20 57 48 45 52 45 20 61 21 3d 35 20 4f 52   ) WHERE a!=5 OR
21fc0 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20  DER BY 1.  **.  
21fd0 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69  ** Transformed i
21fe0 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  nto:.  **.  **  
21ff0 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20 46 52     SELECT x+1 FR
22000 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78 2b 31  OM tab WHERE x+1
22010 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49  !=5.  **     UNI
22020 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
22030 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d 20  SELECT y+1 FROM 
22040 74 61 62 20 57 48 45 52 45 20 79 2b 31 21 3d 35  tab WHERE y+1!=5
22050 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20  .  **     UNION 
22060 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c  ALL.  **     SEL
22070 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31 20 46  ECT abs(z*2)+1 F
22080 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45 20 61  ROM tab2 WHERE a
22090 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a  bs(z*2)+1!=5.  *
220a0 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 31  *     ORDER BY 1
220b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61  .  **.  ** We ca
220c0 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63 6f 6d  ll this the "com
220d0 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
220e0 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f  lattening"..  */
220f0 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53 75 62  .  for(pSub=pSub
22100 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62 3b 20  ->pPrior; pSub; 
22110 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f  pSub=pSub->pPrio
22120 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  r){.    Select *
22130 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 4c 69  pNew;.    ExprLi
22140 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
22150 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
22160 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70  Expr *pLimit = p
22170 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 53 65  ->pLimit;.    Se
22180 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70  lect *pPrior = p
22190 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d  ->pPrior;.    p-
221a0 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
221b0 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a     p->pSrc = 0;.
221c0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
221d0 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  0;.    p->pLimit
221e0 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d   = 0;.    pNew =
221f0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
22200 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20  p(db, p, 0);.   
22210 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65   sqlite3SelectSe
22220 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70 53 75 62  tName(pNew, pSub
22230 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 20  ->zSelName);.   
22240 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
22250 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  mit;.    p->pOrd
22260 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
22270 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70  .    p->pSrc = p
22280 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d  Src;.    p->op =
22290 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28   TK_ALL;.    if(
222a0 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
222b0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
222c0 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rior;.    }else{
222d0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72  .      pNew->pPr
222e0 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
222f0 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 20 29      if( pPrior )
22300 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d   pPrior->pNext =
22310 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65   pNew;.      pNe
22320 77 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  w->pNext = p;.  
22330 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
22340 70 4e 65 77 3b 0a 20 20 20 20 20 20 53 45 4c 45  pNew;.      SELE
22350 43 54 54 52 41 43 45 28 32 2c 70 50 61 72 73 65  CTTRACE(2,pParse
22360 2c 70 2c 0a 20 20 20 20 20 20 20 20 20 28 22 63  ,p,.         ("c
22370 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
22380 20 66 6c 61 74 74 65 6e 65 72 20 63 72 65 61 74   flattener creat
22390 65 73 20 25 73 2e 25 70 20 61 73 20 70 65 65 72  es %s.%p as peer
223a0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70 4e  \n",.         pN
223b0 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 4e  ew->zSelName, pN
223c0 65 77 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ew));.    }.    
223d0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
223e0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b  iled ) return 1;
223f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  .  }..  /* Begin
22400 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20   flattening the 
22410 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f  iFrom-th entry o
22420 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
22430 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f  e .  ** in the o
22440 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f  uter query..  */
22450 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 31 20  .  pSub = pSub1 
22460 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c  = pSubitem->pSel
22470 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  ect;..  /* Delet
22480 65 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20  e the transient 
22490 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
224a0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
224b0 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
224c0 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  y.  */.  sqlite3
224d0 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
224e0 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
224f0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
22500 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a  (db, pSubitem->z
22510 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
22520 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
22530 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
22540 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62  pSubitem->zDatab
22550 61 73 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ase = 0;.  pSubi
22560 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  tem->zName = 0;.
22570 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69    pSubitem->zAli
22580 61 73 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74  as = 0;.  pSubit
22590 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b  em->pSelect = 0;
225a0 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20 64 65 6c  ..  /* Defer del
225b0 65 74 69 6e 67 20 74 68 65 20 54 61 62 6c 65 20  eting the Table 
225c0 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65  object associate
225d0 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20  d with the.  ** 
225e0 73 75 62 71 75 65 72 79 20 75 6e 74 69 6c 20 63  subquery until c
225f0 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69  ode generation i
22600 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c  s.  ** complete,
22610 20 73 69 6e 63 65 20 74 68 65 72 65 20 6d 61 79   since there may
22620 20 73 74 69 6c 6c 20 65 78 69 73 74 20 45 78 70   still exist Exp
22630 72 2e 70 54 61 62 20 65 6e 74 72 69 65 73 20 74  r.pTab entries t
22640 68 61 74 0a 20 20 2a 2a 20 72 65 66 65 72 20 74  hat.  ** refer t
22650 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65  o the subquery e
22660 76 65 6e 20 61 66 74 65 72 20 66 6c 61 74 74 65  ven after flatte
22670 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74 20 23 33  ning.  Ticket #3
22680 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70  346..  **.  ** p
22690 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 69 73  Subitem->pTab is
226a0 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c   always non-NULL
226b0 20 62 79 20 74 65 73 74 20 72 65 73 74 72 69 63   by test restric
226c0 74 69 6f 6e 73 20 61 6e 64 20 74 65 73 74 73 20  tions and tests 
226d0 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  above..  */.  if
226e0 28 20 41 4c 57 41 59 53 28 70 53 75 62 69 74 65  ( ALWAYS(pSubite
226f0 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20  m->pTab!=0) ){. 
22700 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 54 6f     Table *pTabTo
22710 44 65 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  Del = pSubitem->
22720 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54  pTab;.    if( pT
22730 61 62 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66  abToDel->nTabRef
22740 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72  ==1 ){.      Par
22750 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
22760 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
22770 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
22780 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70      pTabToDel->p
22790 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f  NextZombie = pTo
227a0 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54  plevel->pZombieT
227b0 61 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65  ab;.      pTople
227c0 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20  vel->pZombieTab 
227d0 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20  = pTabToDel;.   
227e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
227f0 61 62 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66  abToDel->nTabRef
22800 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  --;.    }.    pS
22810 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30  ubitem->pTab = 0
22820 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
22830 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72  following loop r
22840 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
22850 68 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70  h term in a comp
22860 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20  ound-subquery.  
22870 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61  ** flattening (a
22880 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
22890 65 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 64  e).  If we are d
228a0 6f 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74  oing a different
228b0 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c   kind.  ** of fl
228c0 61 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61  attening - a fla
228d0 74 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68  ttening other th
228e0 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75  an a compound-su
228f0 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
22900 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  g -.  ** then th
22910 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e  is loop only run
22920 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s once..  **.  *
22930 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65  * This loop move
22940 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f  s all of the FRO
22950 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  M elements of th
22960 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
22970 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f  the.  ** the FRO
22980 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
22990 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
229a0 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c  fore doing this,
229b0 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74   remember.  ** t
229c0 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
229d0 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61   for the origina
229e0 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52  l outer query FR
229f0 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20  OM element in.  
22a00 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65  ** iParent.  The
22a10 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20   iParent cursor 
22a20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
22a30 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20  ed.  Subsequent 
22a40 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73  code.  ** will s
22a50 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20  can expressions 
22a60 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72  looking for iPar
22a70 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  ent references a
22a80 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20  nd replace.  ** 
22a90 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73  those references
22aa0 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e   with expression
22ab0 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74  s that resolve t
22ac0 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46  o the subquery F
22ad0 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74  ROM.  ** element
22ae0 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70  s we are now cop
22af0 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ying in..  */.  
22b00 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70  for(pParent=p; p
22b10 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d  Parent; pParent=
22b20 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c  pParent->pPrior,
22b30 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69   pSub=pSub->pPri
22b40 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75  or){.    int nSu
22b50 62 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69  bSrc;.    u8 joi
22b60 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70  ntype = 0;.    p
22b70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
22b80 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  Src;     /* FROM
22b90 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75   clause of subqu
22ba0 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53  ery */.    nSubS
22bb0 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53  rc = pSubSrc->nS
22bc0 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  rc;  /* Number o
22bd0 66 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75  f terms in subqu
22be0 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  ery FROM clause 
22bf0 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50  */.    pSrc = pP
22c00 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20  arent->pSrc;    
22c10 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
22c20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
22c30 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70  ry */..    if( p
22c40 53 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Src ){.      ass
22c50 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20  ert( pParent==p 
22c60 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d  );  /* First tim
22c70 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f  e through the lo
22c80 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e  op */.      join
22c90 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d  type = pSubitem-
22ca0 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  >fg.jointype;.  
22cb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
22cc0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d  ssert( pParent!=
22cd0 70 20 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64  p );  /* 2nd and
22ce0 20 73 75 62 73 65 71 75 65 6e 74 20 74 69 6d 65   subsequent time
22cf0 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f  s through the lo
22d00 6f 70 20 2a 2f 0a 20 20 20 20 20 20 70 53 72 63  op */.      pSrc
22d10 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63   = pParent->pSrc
22d20 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
22d30 74 41 70 70 65 6e 64 28 64 62 2c 20 30 2c 20 30  tAppend(db, 0, 0
22d40 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
22d50 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pSrc==0 ){.     
22d60 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
22d70 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
22d80 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
22d90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
22da0 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
22db0 20 75 73 65 73 20 61 20 73 69 6e 67 6c 65 20 73   uses a single s
22dc0 6c 6f 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  lot of the FROM 
22dd0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
22de0 74 65 72 0a 20 20 20 20 2a 2a 20 71 75 65 72 79  ter.    ** query
22df0 2e 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  .  If the subque
22e00 72 79 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e  ry has more than
22e10 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20   one element in 
22e20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c  its FROM clause,
22e30 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 65 78 70  .    ** then exp
22e40 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
22e50 65 72 79 20 74 6f 20 6d 61 6b 65 20 73 70 61 63  ery to make spac
22e60 65 20 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64  e for it to hold
22e70 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20   all elements.  
22e80 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71    ** of the subq
22e90 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  uery..    **.   
22ea0 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20   ** Example:.   
22eb0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53 45   **.    **    SE
22ec0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 41  LECT * FROM tabA
22ed0 2c 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  , (SELECT * FROM
22ee0 20 73 75 62 31 2c 20 73 75 62 32 29 2c 20 74 61   sub1, sub2), ta
22ef0 62 42 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  bB;.    **.    *
22f00 2a 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72  * The outer quer
22f10 79 20 68 61 73 20 33 20 73 6c 6f 74 73 20 69 6e  y has 3 slots in
22f20 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65   its FROM clause
22f30 2e 20 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74  .  One slot of t
22f40 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
22f50 71 75 65 72 79 20 28 74 68 65 20 6d 69 64 64 6c  query (the middl
22f60 65 20 73 6c 6f 74 29 20 69 73 20 75 73 65 64 20  e slot) is used 
22f70 62 79 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  by the subquery.
22f80 20 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a    The next.    *
22f90 2a 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  * block of code 
22fa0 77 69 6c 6c 20 65 78 70 61 6e 64 20 74 68 65 20  will expand the 
22fb0 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d  outer query FROM
22fc0 20 63 6c 61 75 73 65 20 74 6f 20 34 20 73 6c 6f   clause to 4 slo
22fd0 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6d  ts..    ** The m
22fe0 69 64 64 6c 65 20 73 6c 6f 74 20 69 73 20 65 78  iddle slot is ex
22ff0 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c  panded to two sl
23000 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ots in order to 
23010 6d 61 6b 65 20 73 70 61 63 65 0a 20 20 20 20 2a  make space.    *
23020 2a 20 66 6f 72 20 74 68 65 20 74 77 6f 20 65 6c  * for the two el
23030 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52  ements in the FR
23040 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
23050 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a   subquery..    *
23060 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72  /.    if( nSubSr
23070 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61  c>1 ){.      pPa
23080 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72  rent->pSrc = pSr
23090 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
230a0 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53  stEnlarge(db, pS
230b0 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46  rc, nSubSrc-1,iF
230c0 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66  rom+1);.      if
230d0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
230e0 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  ed ){.        br
230f0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
23100 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73   }..    /* Trans
23110 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  fer the FROM cla
23120 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74  use terms from t
23130 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
23140 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
23150 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  r query..    */.
23160 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
23170 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
23180 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
23190 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63  tDelete(db, pSrc
231a0 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73  ->a[i+iFrom].pUs
231b0 69 6e 67 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ing);.      asse
231c0 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46  rt( pSrc->a[i+iF
231d0 72 6f 6d 5d 2e 66 67 2e 69 73 54 61 62 46 75 6e  rom].fg.isTabFun
231e0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 53  c==0 );.      pS
231f0 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d  rc->a[i+iFrom] =
23200 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a   pSubSrc->a[i];.
23210 20 20 20 20 20 20 69 4e 65 77 50 61 72 65 6e 74        iNewParent
23220 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d   = pSubSrc->a[i]
23230 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  .iCursor;.      
23240 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d  memset(&pSubSrc-
23250 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  >a[i], 0, sizeof
23260 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29  (pSubSrc->a[i]))
23270 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63  ;.    }.    pSrc
23280 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a 6f  ->a[iFrom].fg.jo
23290 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70  intype = jointyp
232a0 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77  e;.  .    /* Now
232b0 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75 74   begin substitut
232c0 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65 73  ing subquery res
232d0 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69  ult set expressi
232e0 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20  ons for .    ** 
232f0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
23300 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65  e iParent in the
23310 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
23320 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61    ** .    ** Exa
23330 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mple:.    **.   
23340 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35   **   SELECT a+5
23350 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c  , b*10 FROM (SEL
23360 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b  ECT x*3 AS a, y+
23370 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29  10 AS b FROM t1)
23380 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20   WHERE a>b;.    
23390 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20  **   \          
233a0 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
233b0 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65  _________ subque
233c0 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20  ry __________/  
233d0 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a          /.    **
233e0 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
233f0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72  __________ outer
23400 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f   query _________
23410 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23420 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20  _____/.    **.  
23430 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20    ** We look at 
23440 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
23450 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
23460 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c  ery and every pl
23470 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a  ace we see.    *
23480 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74  * "a" we substit
23490 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76  ute "x*3" and ev
234a0 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65  ery place we see
234b0 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75   "b" we substitu
234c0 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a  te "y+10"..    *
234d0 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  /.    if( pSub->
234e0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
234f0 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
23500 6e 74 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f  nt, any non-zero
23510 20 69 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c   iOrderByCol val
23520 75 65 73 20 69 6e 64 69 63 61 74 65 20 74 68 61  ues indicate tha
23530 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f  t the.      ** O
23540 52 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 65  RDER BY column e
23550 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 64 65  xpression is ide
23560 6e 74 69 63 61 6c 20 74 6f 20 74 68 65 20 69 4f  ntical to the iO
23570 72 64 65 72 42 79 43 6f 6c 27 74 68 0a 20 20 20  rderByCol'th.   
23580 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
23590 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c   returned by SEL
235a0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 53  ECT statement pS
235b0 75 62 2e 20 53 69 6e 63 65 20 74 68 65 73 65 20  ub. Since these 
235c0 76 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20  values.      ** 
235d0 64 6f 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  do not necessari
235e0 6c 79 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ly correspond to
235f0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 53 45 4c 45   columns in SELE
23600 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 50 61  CT statement pPa
23610 72 65 6e 74 2c 0a 20 20 20 20 20 20 2a 2a 20 7a  rent,.      ** z
23620 65 72 6f 20 74 68 65 6d 20 62 65 66 6f 72 65 20  ero them before 
23630 74 72 61 6e 73 66 65 72 69 6e 67 20 74 68 65 20  transfering the 
23640 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
23650 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
23660 2a 2a 20 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69  ** Not doing thi
23670 73 20 6d 61 79 20 63 61 75 73 65 20 61 6e 20 65  s may cause an e
23680 72 72 6f 72 20 69 66 20 61 20 73 75 62 73 65 71  rror if a subseq
23690 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 74 68 69  uent call to thi
236a0 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74  s.      ** funct
236b0 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
236c0 66 6c 61 74 74 65 6e 20 61 20 63 6f 6d 70 6f 75  flatten a compou
236d0 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69 6e 74  nd sub-query int
236e0 6f 20 70 50 61 72 65 6e 74 0a 20 20 20 20 20 20  o pParent.      
236f0 2a 2a 20 28 74 68 65 20 6f 6e 6c 79 20 77 61 79  ** (the only way
23700 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   this can happen
23710 20 69 73 20 69 66 20 74 68 65 20 63 6f 6d 70 6f   is if the compo
23720 75 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69 73  und sub-query is
23730 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  .      ** curren
23740 74 6c 79 20 70 61 72 74 20 6f 66 20 70 53 75 62  tly part of pSub
23750 2d 3e 70 53 72 63 29 2e 20 53 65 65 20 74 69 63  ->pSrc). See tic
23760 6b 65 74 20 5b 64 31 31 61 36 65 39 30 38 66 5d  ket [d11a6e908f]
23770 2e 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  .  */.      Expr
23780 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
23790 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b   pSub->pOrderBy;
237a0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
237b0 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
237c0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
237d0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
237e0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
237f0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
23800 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
23810 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  nt->pOrderBy==0 
23820 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
23830 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
23840 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75  derBy;.      pSu
23850 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  b->pOrderBy = 0;
23860 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 68 65 72  .    }.    pWher
23870 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  e = sqlite3ExprD
23880 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68  up(db, pSub->pWh
23890 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ere, 0);.    if(
238a0 20 69 73 4c 65 66 74 4a 6f 69 6e 3e 30 20 29 7b   isLeftJoin>0 ){
238b0 0a 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78  .      setJoinEx
238c0 70 72 28 70 57 68 65 72 65 2c 20 69 4e 65 77 50  pr(pWhere, iNewP
238d0 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  arent);.    }.  
238e0 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72    pParent->pWher
238f0 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  e = sqlite3ExprA
23900 6e 64 28 64 62 2c 20 70 57 68 65 72 65 2c 20 70  nd(db, pWhere, p
23910 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 29 3b  Parent->pWhere);
23920 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
23930 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a  locFailed==0 ){.
23940 20 20 20 20 20 20 53 75 62 73 74 43 6f 6e 74 65        SubstConte
23950 78 74 20 78 3b 0a 20 20 20 20 20 20 78 2e 70 50  xt x;.      x.pP
23960 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
23970 20 20 20 20 20 78 2e 69 54 61 62 6c 65 20 3d 20       x.iTable = 
23980 69 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 78  iParent;.      x
23990 2e 69 4e 65 77 54 61 62 6c 65 20 3d 20 69 4e 65  .iNewTable = iNe
239a0 77 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 78  wParent;.      x
239b0 2e 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 69 73  .isLeftJoin = is
239c0 4c 65 66 74 4a 6f 69 6e 3b 0a 20 20 20 20 20 20  LeftJoin;.      
239d0 78 2e 70 45 4c 69 73 74 20 3d 20 70 53 75 62 2d  x.pEList = pSub-
239e0 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 73  >pEList;.      s
239f0 75 62 73 74 53 65 6c 65 63 74 28 26 78 2c 20 70  ubstSelect(&x, p
23a00 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20  Parent, 0);.    
23a10 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20  }.  .    /* The 
23a20 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79 20  flattened query 
23a30 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20 65  is distinct if e
23a40 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20  ither the inner 
23a50 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75  or the.    ** ou
23a60 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69 73  ter query is dis
23a70 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20  tinct. .    */. 
23a80 20 20 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46     pParent->selF
23a90 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65  lags |= pSub->se
23aa0 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
23ab0 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a  inct;.  .    /*.
23ac0 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e      ** SELECT ..
23ad0 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e  . FROM (SELECT .
23ae0 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45  .. LIMIT a OFFSE
23af0 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46  T b) LIMIT x OFF
23b00 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20  SET y;.    **.  
23b10 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70    ** One is temp
23b20 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64  ted to try to ad
23b30 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d  d a and b to com
23b40 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e  bine the limits.
23b50 20 20 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a    But this.    *
23b60 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  * does not work 
23b70 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20  if either limit 
23b80 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20  is negative..   
23b90 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62   */.    if( pSub
23ba0 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
23bb0 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69    pParent->pLimi
23bc0 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  t = pSub->pLimit
23bd0 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c  ;.      pSub->pL
23be0 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  imit = 0;.    }.
23bf0 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c    }..  /* Finial
23c00 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20  ly, delete what 
23c10 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73  is left of the s
23c20 75 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75  ubquery and retu
23c30 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e  rn.  ** success.
23c40 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53  .  */.  sqlite3S
23c50 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
23c60 70 53 75 62 31 29 3b 0a 0a 23 69 66 20 53 45 4c  pSub1);..#if SEL
23c70 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
23c80 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
23c90 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30  lectTrace & 0x10
23ca0 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54  0 ){.    SELECTT
23cb0 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73  RACE(0x100,pPars
23cc0 65 2c 70 2c 28 22 41 66 74 65 72 20 66 6c 61 74  e,p,("After flat
23cd0 74 65 6e 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20  tening:\n"));.  
23ce0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
23cf0 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
23d00 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
23d10 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
23d20 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
23d30 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
23d40 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
23d50 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
23d60 57 29 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65  W) */....#if !de
23d70 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
23d80 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
23d90 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
23da0 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20  MIT_VIEW)./*.** 
23db0 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 72  Make copies of r
23dc0 65 6c 65 76 61 6e 74 20 57 48 45 52 45 20 63 6c  elevant WHERE cl
23dd0 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 74 68  ause terms of th
23de0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 6e  e outer query in
23df0 74 6f 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20  to.** the WHERE 
23e00 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65  clause of subque
23e10 72 79 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a  ry.  Example:.**
23e20 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .**    SELECT * 
23e30 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41  FROM (SELECT a A
23e40 53 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52  S x, c-d AS y FR
23e50 4f 4d 20 74 31 29 20 57 48 45 52 45 20 78 3d 35  OM t1) WHERE x=5
23e60 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a   AND y=10;.**.**
23e70 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   Transformed int
23e80 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  o:.**.**    SELE
23e90 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT * FROM (SELEC
23ea0 54 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53  T a AS x, c-d AS
23eb0 20 79 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   y FROM t1 WHERE
23ec0 20 61 3d 35 20 41 4e 44 20 63 2d 64 3d 31 30 29   a=5 AND c-d=10)
23ed0 0a 2a 2a 20 20 20 20 20 57 48 45 52 45 20 78 3d  .**     WHERE x=
23ee0 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a  5 AND y=10;.**.*
23ef0 2a 20 54 68 65 20 68 6f 70 65 20 69 73 20 74 68  * The hope is th
23f00 61 74 20 74 68 65 20 74 65 72 6d 73 20 61 64 64  at the terms add
23f10 65 64 20 74 6f 20 74 68 65 20 69 6e 6e 65 72 20  ed to the inner 
23f20 71 75 65 72 79 20 77 69 6c 6c 20 6d 61 6b 65 20  query will make 
23f30 69 74 20 6d 6f 72 65 0a 2a 2a 20 65 66 66 69 63  it more.** effic
23f40 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e  ient..**.** Do n
23f50 6f 74 20 61 74 74 65 6d 70 74 20 74 68 69 73 20  ot attempt this 
23f60 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 3a  optimization if:
23f70 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 28 2a 2a  .**.**   (1) (**
23f80 20 54 68 69 73 20 72 65 73 74 72 69 63 74 69 6f   This restrictio
23f90 6e 20 77 61 73 20 72 65 6d 6f 76 65 64 20 6f 6e  n was removed on
23fa0 20 32 30 31 37 2d 30 39 2d 32 39 2e 20 20 57 65   2017-09-29.  We
23fb0 20 75 73 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20   used to.**     
23fc0 20 20 20 20 20 20 64 69 73 61 6c 6c 6f 77 20 74        disallow t
23fd0 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
23fe0 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 73   for aggregate s
23ff0 75 62 71 75 65 72 69 65 73 2c 20 62 75 74 20 6e  ubqueries, but n
24000 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ow.**           
24010 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 20 62 79  it is allowed by
24020 20 70 75 74 74 69 6e 67 20 74 68 65 20 65 78 74   putting the ext
24030 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20  ra terms on the 
24040 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a  HAVING clause..*
24050 2a 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20  *           The 
24060 61 64 64 65 64 20 48 41 56 49 4e 47 20 63 6c 61  added HAVING cla
24070 75 73 65 20 69 73 20 70 6f 69 6e 74 6c 65 73 73  use is pointless
24080 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
24090 20 6c 61 63 6b 73 0a 2a 2a 20 20 20 20 20 20 20   lacks.**       
240a0 20 20 20 20 61 20 47 52 4f 55 50 20 42 59 20 63      a GROUP BY c
240b0 6c 61 75 73 65 2e 20 20 42 75 74 20 73 75 63 68  lause.  But such
240c0 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65   a HAVING clause
240d0 20 69 73 20 61 6c 73 6f 20 68 61 72 6d 6c 65 73   is also harmles
240e0 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 73  s.**           s
240f0 6f 20 74 68 65 72 65 20 64 6f 65 73 20 6e 6f 74  o there does not
24100 20 61 70 70 65 61 72 20 74 6f 20 62 65 20 61 6e   appear to be an
24110 79 20 72 65 61 73 6f 6e 20 74 6f 20 61 64 64 20  y reason to add 
24120 65 78 74 72 61 20 6c 6f 67 69 63 0a 2a 2a 20 20  extra logic.**  
24130 20 20 20 20 20 20 20 20 20 74 6f 20 73 75 70 70           to supp
24140 72 65 73 73 20 69 74 2e 20 2a 2a 29 0a 2a 2a 0a  ress it. **).**.
24150 2a 2a 20 20 20 28 32 29 20 54 68 65 20 69 6e 6e  **   (2) The inn
24160 65 72 20 71 75 65 72 79 20 69 73 20 74 68 65 20  er query is the 
24170 72 65 63 75 72 73 69 76 65 20 70 61 72 74 20 6f  recursive part o
24180 66 20 61 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65  f a common table
24190 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
241a0 2a 2a 20 20 20 28 33 29 20 54 68 65 20 69 6e 6e  **   (3) The inn
241b0 65 72 20 71 75 65 72 79 20 68 61 73 20 61 20 4c  er query has a L
241c0 49 4d 49 54 20 63 6c 61 75 73 65 20 28 73 69 6e  IMIT clause (sin
241d0 63 65 20 74 68 65 20 63 68 61 6e 67 65 73 20 74  ce the changes t
241e0 6f 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 20  o the WHERE.**  
241f0 20 20 20 20 20 63 6c 6f 73 65 20 77 6f 75 6c 64       close would
24200 20 63 68 61 6e 67 65 20 74 68 65 20 6d 65 61 6e   change the mean
24210 69 6e 67 20 6f 66 20 74 68 65 20 4c 49 4d 49 54  ing of the LIMIT
24220 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 54  )..**.**   (4) T
24230 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69  he inner query i
24240 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
24250 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  and of a LEFT JO
24260 49 4e 20 61 6e 64 20 74 68 65 0a 2a 2a 20 20 20  IN and the.**   
24270 20 20 20 20 65 78 70 72 65 73 73 69 6f 6e 20 74      expression t
24280 6f 20 62 65 20 70 75 73 68 65 64 20 64 6f 77 6e  o be pushed down
24290 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 66   does not come f
242a0 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73  rom the ON claus
242b0 65 0a 2a 2a 20 20 20 20 20 20 20 6f 6e 20 74 68  e.**       on th
242c0 61 74 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 2a 2a  at LEFT JOIN..**
242d0 0a 2a 2a 20 20 20 28 35 29 20 54 68 65 20 57 48  .**   (5) The WH
242e0 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65  ERE clause expre
242f0 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 73  ssion originates
24300 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
24310 49 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20  ING clause.**   
24320 20 20 20 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f      of a LEFT JO
24330 49 4e 20 77 68 65 72 65 20 69 43 75 72 73 6f 72  IN where iCursor
24340 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68   is not the righ
24350 74 2d 68 61 6e 64 20 74 61 62 6c 65 20 6f 66 20  t-hand table of 
24360 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 6c 65  that.**       le
24370 66 74 20 6a 6f 69 6e 2e 20 20 41 6e 20 65 78 61  ft join.  An exa
24380 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
24390 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 0a 2a        SELECT *.*
243a0 2a 20 20 20 20 20 20 20 20 20 20 20 46 52 4f 4d  *           FROM
243b0 20 28 53 45 4c 45 43 54 20 31 20 41 53 20 61 31   (SELECT 1 AS a1
243c0 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
243d0 54 20 32 29 20 41 53 20 61 61 0a 2a 2a 20 20 20  T 2) AS aa.**   
243e0 20 20 20 20 20 20 20 20 4a 4f 49 4e 20 28 53 45          JOIN (SE
243f0 4c 45 43 54 20 31 20 41 53 20 62 32 20 55 4e 49  LECT 1 AS b2 UNI
24400 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 32 29  ON ALL SELECT 2)
24410 20 41 53 20 62 62 20 4f 4e 20 28 61 31 3d 62 32   AS bb ON (a1=b2
24420 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4c  ).**           L
24430 45 46 54 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54  EFT JOIN (SELECT
24440 20 38 20 41 53 20 63 33 20 55 4e 49 4f 4e 20 41   8 AS c3 UNION A
24450 4c 4c 20 53 45 4c 45 43 54 20 39 29 20 41 53 20  LL SELECT 9) AS 
24460 63 63 20 4f 4e 20 28 62 32 3d 32 29 3b 0a 2a 2a  cc ON (b2=2);.**
24470 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20 63 6f  .**       The co
24480 72 72 65 63 74 20 61 6e 73 77 65 72 20 69 73 20  rrect answer is 
24490 74 68 72 65 65 20 72 6f 77 73 3a 20 20 28 31 2c  three rows:  (1,
244a0 31 2c 4e 55 4c 4c 29 2c 28 32 2c 32 2c 38 29 2c  1,NULL),(2,2,8),
244b0 28 32 2c 32 2c 39 29 2e 0a 2a 2a 20 20 20 20 20  (2,2,9)..**     
244c0 20 20 42 75 74 20 69 66 20 74 68 65 20 28 62 32    But if the (b2
244d0 3d 32 29 20 74 65 72 6d 20 77 65 72 65 20 74 6f  =2) term were to
244e0 20 62 65 20 70 75 73 68 65 64 20 64 6f 77 6e 20   be pushed down 
244f0 69 6e 74 6f 20 74 68 65 20 62 62 20 73 75 62 71  into the bb subq
24500 75 65 72 79 2c 0a 2a 2a 20 20 20 20 20 20 20 74  uery,.**       t
24510 68 65 6e 20 74 68 65 20 28 31 2c 31 2c 4e 55 4c  hen the (1,1,NUL
24520 4c 29 20 72 6f 77 20 77 6f 75 6c 64 20 62 65 20  L) row would be 
24530 73 75 70 70 72 65 73 73 65 64 2e 0a 2a 2a 0a 2a  suppressed..**.*
24540 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f  * Return 0 if no
24550 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
24560 65 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69  e and non-zero i
24570 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48  f one or more WH
24580 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 74 65  ERE clause.** te
24590 72 6d 73 20 61 72 65 20 64 75 70 6c 69 63 61 74  rms are duplicat
245a0 65 64 20 69 6e 74 6f 20 74 68 65 20 73 75 62 71  ed into the subq
245b0 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uery..*/.static 
245c0 69 6e 74 20 70 75 73 68 44 6f 77 6e 57 68 65 72  int pushDownWher
245d0 65 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65 20  eTerms(.  Parse 
245e0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
245f0 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
24600 20 28 66 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 61   (for malloc() a
24610 6e 64 20 65 72 72 6f 72 20 72 65 70 6f 72 74 69  nd error reporti
24620 6e 67 29 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ng) */.  Select 
24630 2a 70 53 75 62 71 2c 20 20 20 20 20 20 20 20 2f  *pSubq,        /
24640 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 77  * The subquery w
24650 68 6f 73 65 20 57 48 45 52 45 20 63 6c 61 75 73  hose WHERE claus
24660 65 20 69 73 20 74 6f 20 62 65 20 61 75 67 6d 65  e is to be augme
24670 6e 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nted */.  Expr *
24680 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20  pWhere,         
24690 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
246a0 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
246b0 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
246c0 69 43 75 72 73 6f 72 2c 20 20 20 20 20 20 20 20  iCursor,        
246d0 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
246e0 65 72 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  er of the subque
246f0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c 65  ry */.  int isLe
24700 66 74 4a 6f 69 6e 20 20 20 20 20 20 20 20 2f 2a  ftJoin        /*
24710 20 54 72 75 65 20 69 66 20 70 53 75 62 71 20 69   True if pSubq i
24720 73 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d  s the right term
24730 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
24740 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  */.){.  Expr *pN
24750 65 77 3b 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20  ew;.  int nChng 
24760 3d 20 30 3b 0a 20 20 69 66 28 20 70 57 68 65 72  = 0;.  if( pWher
24770 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
24780 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e 73 65  .  if( pSubq->se
24790 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
247a0 72 73 69 76 65 20 29 20 72 65 74 75 72 6e 20 30  rsive ) return 0
247b0 3b 20 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f  ;  /* restrictio
247c0 6e 20 28 32 29 20 2a 2f 0a 0a 23 69 66 64 65 66  n (2) */..#ifdef
247d0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
247e0 2f 2a 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73  /* Only the firs
247f0 74 20 74 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70  t term of a comp
24800 6f 75 6e 64 20 63 61 6e 20 68 61 76 65 20 61 20  ound can have a 
24810 57 49 54 48 20 63 6c 61 75 73 65 2e 20 20 42 75  WITH clause.  Bu
24820 74 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65  t make.  ** sure
24830 20 6e 6f 20 6f 74 68 65 72 20 74 65 72 6d 73 20   no other terms 
24840 61 72 65 20 6d 61 72 6b 65 64 20 53 46 5f 52 65  are marked SF_Re
24850 63 75 72 73 69 76 65 20 69 6e 20 63 61 73 65 20  cursive in case 
24860 73 6f 6d 65 74 68 69 6e 67 20 63 68 61 6e 67 65  something change
24870 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66 75  s.  ** in the fu
24880 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20  ture..  */.  {. 
24890 20 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 20 20     Select *pX;  
248a0 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 75 62  .    for(pX=pSub
248b0 71 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 50  q; pX; pX=pX->pP
248c0 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 61 73 73  rior){.      ass
248d0 65 72 74 28 20 28 70 58 2d 3e 73 65 6c 46 6c 61  ert( (pX->selFla
248e0 67 73 20 26 20 28 53 46 5f 52 65 63 75 72 73 69  gs & (SF_Recursi
248f0 76 65 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  ve))==0 );.    }
24900 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
24910 66 28 20 70 53 75 62 71 2d 3e 70 4c 69 6d 69 74  f( pSubq->pLimit
24920 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
24930 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74  n 0; /* restrict
24940 69 6f 6e 20 28 33 29 20 2a 2f 0a 20 20 7d 0a 20  ion (3) */.  }. 
24950 20 77 68 69 6c 65 28 20 70 57 68 65 72 65 2d 3e   while( pWhere->
24960 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20  op==TK_AND ){.  
24970 20 20 6e 43 68 6e 67 20 2b 3d 20 70 75 73 68 44    nChng += pushD
24980 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 70 50  ownWhereTerms(pP
24990 61 72 73 65 2c 20 70 53 75 62 71 2c 20 70 57 68  arse, pSubq, pWh
249a0 65 72 65 2d 3e 70 52 69 67 68 74 2c 0a 20 20 20  ere->pRight,.   
249b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249c0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43 75               iCu
249d0 72 73 6f 72 2c 20 69 73 4c 65 66 74 4a 6f 69 6e  rsor, isLeftJoin
249e0 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  );.    pWhere = 
249f0 70 57 68 65 72 65 2d 3e 70 4c 65 66 74 3b 0a 20  pWhere->pLeft;. 
24a00 20 7d 0a 20 20 69 66 28 20 69 73 4c 65 66 74 4a   }.  if( isLeftJ
24a10 6f 69 6e 0a 20 20 20 26 26 20 28 45 78 70 72 48  oin.   && (ExprH
24a20 61 73 50 72 6f 70 65 72 74 79 28 70 57 68 65 72  asProperty(pWher
24a30 65 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3d 3d  e,EP_FromJoin)==
24a40 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 57  0.         || pW
24a50 68 65 72 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  here->iRightJoin
24a60 54 61 62 6c 65 21 3d 69 43 75 72 73 6f 72 29 0a  Table!=iCursor).
24a70 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
24a80 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f  0; /* restrictio
24a90 6e 20 28 34 29 20 2a 2f 0a 20 20 7d 0a 20 20 69  n (4) */.  }.  i
24aa0 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
24ab0 74 79 28 70 57 68 65 72 65 2c 45 50 5f 46 72 6f  ty(pWhere,EP_Fro
24ac0 6d 4a 6f 69 6e 29 20 26 26 20 70 57 68 65 72 65  mJoin) && pWhere
24ad0 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
24ae0 65 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  e!=iCursor ){.  
24af0 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72    return 0; /* r
24b00 65 73 74 72 69 63 74 69 6f 6e 20 28 35 29 20 2a  estriction (5) *
24b10 2f 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  /.  }.  if( sqli
24b20 74 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f  te3ExprIsTableCo
24b30 6e 73 74 61 6e 74 28 70 57 68 65 72 65 2c 20 69  nstant(pWhere, i
24b40 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 6e  Cursor) ){.    n
24b50 43 68 6e 67 2b 2b 3b 0a 20 20 20 20 77 68 69 6c  Chng++;.    whil
24b60 65 28 20 70 53 75 62 71 20 29 7b 0a 20 20 20 20  e( pSubq ){.    
24b70 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 78    SubstContext x
24b80 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73  ;.      pNew = s
24b90 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
24ba0 61 72 73 65 2d 3e 64 62 2c 20 70 57 68 65 72 65  arse->db, pWhere
24bb0 2c 20 30 29 3b 0a 20 20 20 20 20 20 75 6e 73 65  , 0);.      unse
24bc0 74 4a 6f 69 6e 45 78 70 72 28 70 4e 65 77 2c 20  tJoinExpr(pNew, 
24bd0 2d 31 29 3b 0a 20 20 20 20 20 20 78 2e 70 50 61  -1);.      x.pPa
24be0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
24bf0 20 20 20 20 78 2e 69 54 61 62 6c 65 20 3d 20 69      x.iTable = i
24c00 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e  Cursor;.      x.
24c10 69 4e 65 77 54 61 62 6c 65 20 3d 20 69 43 75 72  iNewTable = iCur
24c20 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e 69 73 4c  sor;.      x.isL
24c30 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 0a 20 20 20  eftJoin = 0;.   
24c40 20 20 20 78 2e 70 45 4c 69 73 74 20 3d 20 70 53     x.pEList = pS
24c50 75 62 71 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ubq->pEList;.   
24c60 20 20 20 70 4e 65 77 20 3d 20 73 75 62 73 74 45     pNew = substE
24c70 78 70 72 28 26 78 2c 20 70 4e 65 77 29 3b 0a 20  xpr(&x, pNew);. 
24c80 20 20 20 20 20 69 66 28 20 70 53 75 62 71 2d 3e       if( pSubq->
24c90 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
24ca0 67 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20 20  gregate ){.     
24cb0 20 20 20 70 53 75 62 71 2d 3e 70 48 61 76 69 6e     pSubq->pHavin
24cc0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  g = sqlite3ExprA
24cd0 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nd(pParse->db, p
24ce0 53 75 62 71 2d 3e 70 48 61 76 69 6e 67 2c 20 70  Subq->pHaving, p
24cf0 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  New);.      }els
24d00 65 7b 0a 20 20 20 20 20 20 20 20 70 53 75 62 71  e{.        pSubq
24d10 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
24d20 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65  e3ExprAnd(pParse
24d30 2d 3e 64 62 2c 20 70 53 75 62 71 2d 3e 70 57 68  ->db, pSubq->pWh
24d40 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  ere, pNew);.    
24d50 20 20 7d 0a 20 20 20 20 20 20 70 53 75 62 71 20    }.      pSubq 
24d60 3d 20 70 53 75 62 71 2d 3e 70 50 72 69 6f 72 3b  = pSubq->pPrior;
24d70 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
24d80 75 72 6e 20 6e 43 68 6e 67 3b 0a 7d 0a 23 65 6e  urn nChng;.}.#en
24d90 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
24da0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
24db0 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
24dc0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
24dd0 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  EW) */../*.** Th
24de0 65 20 70 46 75 6e 63 20 69 73 20 74 68 65 20 6f  e pFunc is the o
24df0 6e 6c 79 20 61 67 67 72 65 67 61 74 65 20 66 75  nly aggregate fu
24e00 6e 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 71 75  nction in the qu
24e10 65 72 79 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  ery.  Check to s
24e20 65 65 0a 2a 2a 20 69 66 20 74 68 65 20 71 75 65  ee.** if the que
24e30 72 79 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  ry is a candidat
24e40 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d 61  e for the min/ma
24e50 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  x optimization. 
24e60 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 71 75  .**.** If the qu
24e70 65 72 79 20 69 73 20 61 20 63 61 6e 64 69 64 61  ery is a candida
24e80 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d  te for the min/m
24e90 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  ax optimization,
24ea0 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20 2a 70 70   then set.** *pp
24eb0 4d 69 6e 4d 61 78 20 74 6f 20 62 65 20 61 6e 20  MinMax to be an 
24ec0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
24ed0 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 74  to be used for t
24ee0 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  he optimization.
24ef0 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 65 69  ** and return ei
24f00 74 68 65 72 20 57 48 45 52 45 5f 4f 52 44 45 52  ther WHERE_ORDER
24f10 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f  BY_MIN or WHERE_
24f20 4f 52 44 45 52 42 59 5f 4d 41 58 20 64 65 70 65  ORDERBY_MAX depe
24f30 6e 64 69 6e 67 20 6f 6e 0a 2a 2a 20 77 68 65 74  nding on.** whet
24f40 68 65 72 20 70 46 75 6e 63 20 69 73 20 61 20 6d  her pFunc is a m
24f50 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75  in() or max() fu
24f60 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
24f70 20 74 68 65 20 71 75 65 72 79 20 69 73 20 6e 6f   the query is no
24f80 74 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  t a candidate fo
24f90 72 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f 70  r the min/max op
24fa0 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 72 65 74 75  timization, retu
24fb0 72 6e 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44 45  rn.** WHERE_ORDE
24fc0 52 42 59 5f 4e 4f 52 4d 41 4c 20 28 77 68 69 63  RBY_NORMAL (whic
24fd0 68 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 29 2e  h must be zero).
24fe0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
24ff0 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c  ine must be call
25000 65 64 20 61 66 74 65 72 20 61 67 67 72 65 67 61  ed after aggrega
25010 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 68 61 76  te functions hav
25020 65 20 62 65 65 6e 0a 2a 2a 20 6c 6f 63 61 74 65  e been.** locate
25030 64 20 62 75 74 20 62 65 66 6f 72 65 20 74 68 65  d but before the
25040 69 72 20 61 72 67 75 6d 65 6e 74 73 20 68 61 76  ir arguments hav
25050 65 20 62 65 65 6e 20 73 75 62 6a 65 63 74 65 64  e been subjected
25060 20 74 6f 20 61 67 67 72 65 67 61 74 65 0a 2a 2a   to aggregate.**
25070 20 61 6e 61 6c 79 73 69 73 2e 0a 2a 2f 0a 73 74   analysis..*/.st
25080 61 74 69 63 20 75 38 20 6d 69 6e 4d 61 78 51 75  atic u8 minMaxQu
25090 65 72 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ery(sqlite3 *db,
250a0 20 45 78 70 72 20 2a 70 46 75 6e 63 2c 20 45 78   Expr *pFunc, Ex
250b0 70 72 4c 69 73 74 20 2a 2a 70 70 4d 69 6e 4d 61  prList **ppMinMa
250c0 78 29 7b 0a 20 20 69 6e 74 20 65 52 65 74 20 3d  x){.  int eRet =
250d0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
250e0 4f 52 4d 41 4c 3b 20 20 20 20 20 20 2f 2a 20 52  ORMAL;      /* R
250f0 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  eturn value */. 
25100 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
25110 74 20 3d 20 70 46 75 6e 63 2d 3e 78 2e 70 4c 69  t = pFunc->x.pLi
25120 73 74 3b 20 20 20 20 2f 2a 20 41 72 67 75 6d 65  st;    /* Argume
25130 6e 74 73 20 74 6f 20 61 67 67 20 66 75 6e 63 74  nts to agg funct
25140 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
25150 68 61 72 20 2a 7a 46 75 6e 63 3b 20 20 20 20 20  har *zFunc;     
25160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25170 2a 20 4e 61 6d 65 20 6f 66 20 61 67 67 72 65 67  * Name of aggreg
25180 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 70 46 75  ate function pFu
25190 6e 63 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  nc */.  ExprList
251a0 20 2a 70 4f 72 64 65 72 42 79 3b 0a 20 20 75 38   *pOrderBy;.  u8
251b0 20 73 6f 72 74 4f 72 64 65 72 3b 0a 0a 20 20 61   sortOrder;..  a
251c0 73 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78  ssert( *ppMinMax
251d0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
251e0 20 70 46 75 6e 63 2d 3e 6f 70 3d 3d 54 4b 5f 41   pFunc->op==TK_A
251f0 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
25200 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 7c   if( pEList==0 |
25210 7c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  | pEList->nExpr!
25220 3d 31 20 29 20 72 65 74 75 72 6e 20 65 52 65 74  =1 ) return eRet
25230 3b 0a 20 20 7a 46 75 6e 63 20 3d 20 70 46 75 6e  ;.  zFunc = pFun
25240 63 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 69  c->u.zToken;.  i
25250 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
25260 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22 29 3d  p(zFunc, "min")=
25270 3d 30 20 29 7b 0a 20 20 20 20 65 52 65 74 20 3d  =0 ){.    eRet =
25280 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
25290 49 4e 3b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65  IN;.    sortOrde
252a0 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53  r = SQLITE_SO_AS
252b0 43 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  C;.  }else if( s
252c0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46  qlite3StrICmp(zF
252d0 75 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29  unc, "max")==0 )
252e0 7b 0a 20 20 20 20 65 52 65 74 20 3d 20 57 48 45  {.    eRet = WHE
252f0 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a  RE_ORDERBY_MAX;.
25300 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20      sortOrder = 
25310 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3b 0a  SQLITE_SO_DESC;.
25320 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
25330 75 72 6e 20 65 52 65 74 3b 0a 20 20 7d 0a 20 20  urn eRet;.  }.  
25340 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 4f 72 64  *ppMinMax = pOrd
25350 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
25360 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 45  prListDup(db, pE
25370 4c 69 73 74 2c 20 30 29 3b 0a 20 20 61 73 73 65  List, 0);.  asse
25380 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20  rt( pOrderBy!=0 
25390 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
253a0 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4f 72  led );.  if( pOr
253b0 64 65 72 42 79 20 29 20 70 4f 72 64 65 72 42 79  derBy ) pOrderBy
253c0 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[0].sortOrder
253d0 20 3d 20 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20   = sortOrder;.  
253e0 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a  return eRet;.}..
253f0 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74  /*.** The select
25400 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
25410 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
25420 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 67  rgument is an ag
25430 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a  gregate query..*
25440 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  * The second arg
25450 75 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73 73  ument is the ass
25460 6f 63 69 61 74 65 64 20 61 67 67 72 65 67 61 74  ociated aggregat
25470 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54  e-info object. T
25480 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
25490 20 74 65 73 74 73 20 69 66 20 74 68 65 20 53 45   tests if the SE
254a0 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 66  LECT is of the f
254b0 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  orm:.**.**   SEL
254c0 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
254d0 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68  M <tbl>.**.** wh
254e0 65 72 65 20 74 61 62 6c 65 20 69 73 20 61 20 64  ere table is a d
254f0 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20 6e  atabase table, n
25500 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20  ot a sub-select 
25510 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68 65 20  or view. If the 
25520 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61  query.** does ma
25530 74 63 68 20 74 68 69 73 20 70 61 74 74 65 72 6e  tch this pattern
25540 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72  , then a pointer
25550 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f 62   to the Table ob
25560 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74 69 6e  ject representin
25570 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65  g.** <tbl> is re
25580 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
25590 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  e, 0 is returned
255a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62 6c  ..*/.static Tabl
255b0 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74  e *isSimpleCount
255c0 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67 49  (Select *p, AggI
255d0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
255e0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
255f0 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20   Expr *pExpr;.. 
25600 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47 72   assert( !p->pGr
25610 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28 20  oupBy );..  if( 
25620 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e  p->pWhere || p->
25630 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  pEList->nExpr!=1
25640 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d   .   || p->pSrc-
25650 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70  >nSrc!=1 || p->p
25660 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
25670 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  t.  ){.    retur
25680 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20  n 0;.  }.  pTab 
25690 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
256a0 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d 20  pTab;.  pExpr = 
256b0 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
256c0 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28  pExpr;.  assert(
256d0 20 70 54 61 62 20 26 26 20 21 70 54 61 62 2d 3e   pTab && !pTab->
256e0 70 53 65 6c 65 63 74 20 26 26 20 70 45 78 70 72  pSelect && pExpr
256f0 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69 72   );..  if( IsVir
25700 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74  tual(pTab) ) ret
25710 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78  urn 0;.  if( pEx
25720 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46  pr->op!=TK_AGG_F
25730 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e  UNCTION ) return
25740 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   0;.  if( NEVER(
25750 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d  pAggInfo->nFunc=
25760 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  =0) ) return 0;.
25770 20 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f 2d    if( (pAggInfo-
25780 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d  >aFunc[0].pFunc-
25790 3e 66 75 6e 63 46 6c 61 67 73 26 53 51 4c 49 54  >funcFlags&SQLIT
257a0 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30  E_FUNC_COUNT)==0
257b0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
257c0 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 26  f( pExpr->flags&
257d0 45 50 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65  EP_Distinct ) re
257e0 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72  turn 0;..  retur
257f0 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
25800 20 49 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c   If the source-l
25810 69 73 74 20 69 74 65 6d 20 70 61 73 73 65 64 20  ist item passed 
25820 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 77  as an argument w
25830 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74  as augmented wit
25840 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20  h an.** INDEXED 
25850 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
25860 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  try to locate th
25870 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 64 65  e specified inde
25880 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 77  x. If there.** w
25890 61 73 20 73 75 63 68 20 61 20 63 6c 61 75 73 65  as such a clause
258a0 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64 20 69   and the named i
258b0 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65 20 66  ndex cannot be f
258c0 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  ound, return .**
258d0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e   SQLITE_ERROR an
258e0 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  d leave an error
258f0 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74 68 65   in pParse. Othe
25900 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65 20  rwise, populate 
25910 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65  .** pFrom->pInde
25920 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  x and return SQL
25930 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
25940 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c  qlite3IndexedByL
25950 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70 50 61  ookup(Parse *pPa
25960 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c  rse, struct SrcL
25970 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29  ist_item *pFrom)
25980 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70  {.  if( pFrom->p
25990 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e 66 67  Tab && pFrom->fg
259a0 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 7b 0a  .isIndexedBy ){.
259b0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
259c0 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
259d0 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 65     char *zIndexe
259e0 64 42 79 20 3d 20 70 46 72 6f 6d 2d 3e 75 31 2e  dBy = pFrom->u1.
259f0 7a 49 6e 64 65 78 65 64 42 79 3b 0a 20 20 20 20  zIndexedBy;.    
25a00 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
25a10 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
25a20 70 49 6e 64 65 78 3b 20 0a 20 20 20 20 20 20 20  pIndex; .       
25a30 20 70 49 64 78 20 26 26 20 73 71 6c 69 74 65 33   pIdx && sqlite3
25a40 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e  StrICmp(pIdx->zN
25a50 61 6d 65 2c 20 7a 49 6e 64 65 78 65 64 42 79 29  ame, zIndexedBy)
25a60 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 3d  ; .        pIdx=
25a70 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20  pIdx->pNext.    
25a80 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64 78  );.    if( !pIdx
25a90 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
25aa0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
25ab0 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78  , "no such index
25ac0 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 65 64 42  : %s", zIndexedB
25ad0 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  y, 0);.      pPa
25ae0 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
25af0 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   = 1;.      retu
25b00 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
25b10 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d  .    }.    pFrom
25b20 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20 70 49 64  ->pIBIndex = pId
25b30 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  x;.  }.  return 
25b40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a  SQLITE_OK;.}./*.
25b50 2a 2a 20 44 65 74 65 63 74 20 63 6f 6d 70 6f 75  ** Detect compou
25b60 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nd SELECT statem
25b70 65 6e 74 73 20 74 68 61 74 20 75 73 65 20 61 6e  ents that use an
25b80 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
25b90 20 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61 6c 74   with .** an alt
25ba0 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69  ernative collati
25bb0 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a  ng sequence..**.
25bc0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e  **    SELECT ...
25bd0 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20   FROM t1 EXCEPT 
25be0 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
25bf0 74 32 20 4f 52 44 45 52 20 42 59 20 2e 2e 20 43  t2 ORDER BY .. C
25c00 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a  OLLATE ....**.**
25c10 20 54 68 65 73 65 20 61 72 65 20 72 65 77 72 69   These are rewri
25c20 74 74 65 6e 20 61 73 20 61 20 73 75 62 71 75 65  tten as a subque
25c30 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  ry:.**.**    SEL
25c40 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45  ECT * FROM (SELE
25c50 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45  CT ... FROM t1 E
25c60 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e  XCEPT SELECT ...
25c70 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20 20 20   FROM t2).**    
25c80 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20 43 4f   ORDER BY ... CO
25c90 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  LLATE ....**.** 
25ca0 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74  This transformat
25cb0 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79  ion is necessary
25cc0 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 75 6c   because the mul
25cd0 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
25ce0 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 62 6f  ) routine.** abo
25cf0 76 65 20 74 68 61 74 20 67 65 6e 65 72 61 74 65  ve that generate
25d00 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61  s the code for a
25d10 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
25d20 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42   with an ORDER B
25d30 59 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73 65 73  Y clause.** uses
25d40 20 61 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74   a merge algorit
25d50 68 6d 20 74 68 61 74 20 72 65 71 75 69 72 65 73  hm that requires
25d60 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74   the same collat
25d70 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 6e 20  ing sequence on 
25d80 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f  the.** result co
25d90 6c 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68 65 20  lumns as on the 
25da0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
25db0 20 20 53 65 65 20 74 69 63 6b 65 74 0a 2a 2a 20    See ticket.** 
25dc0 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74  http://www.sqlit
25dd0 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 36  e.org/src/info/6
25de0 37 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20  709574d2a.**.** 
25df0 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74  This transformat
25e00 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64  ion is only need
25e10 65 64 20 66 6f 72 20 45 58 43 45 50 54 2c 20 49  ed for EXCEPT, I
25e20 4e 54 45 52 53 45 43 54 2c 20 61 6e 64 20 55 4e  NTERSECT, and UN
25e30 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e 49 4f  ION..** The UNIO
25e40 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 77  N ALL operator w
25e50 6f 72 6b 73 20 66 69 6e 65 20 77 69 74 68 20 6d  orks fine with m
25e60 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
25e70 79 28 29 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a  y() even when.**
25e80 20 74 68 65 72 65 20 61 72 65 20 43 4f 4c 4c 41   there are COLLA
25e90 54 45 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  TE terms in the 
25ea0 4f 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73 74 61  ORDER BY..*/.sta
25eb0 74 69 63 20 69 6e 74 20 63 6f 6e 76 65 72 74 43  tic int convertC
25ec0 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53  ompoundSelectToS
25ed0 75 62 71 75 65 72 79 28 57 61 6c 6b 65 72 20 2a  ubquery(Walker *
25ee0 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
25ef0 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
25f00 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
25f10 53 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20 73 71  Select *pX;.  sq
25f20 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74 72  lite3 *db;.  str
25f30 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
25f40 6d 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73 74 20  m *a;.  SrcList 
25f50 2a 70 4e 65 77 53 72 63 3b 0a 20 20 50 61 72 73  *pNewSrc;.  Pars
25f60 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 54 6f 6b  e *pParse;.  Tok
25f70 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69 66 28  en dummy;..  if(
25f80 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20   p->pPrior==0 ) 
25f90 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
25fa0 6e 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f  nue;.  if( p->pO
25fb0 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75  rderBy==0 ) retu
25fc0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
25fd0 0a 20 20 66 6f 72 28 70 58 3d 70 3b 20 70 58 20  .  for(pX=p; pX 
25fe0 26 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41  && (pX->op==TK_A
25ff0 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b  LL || pX->op==TK
26000 5f 53 45 4c 45 43 54 29 3b 20 70 58 3d 70 58 2d  _SELECT); pX=pX-
26010 3e 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69 66 28  >pPrior){}.  if(
26020 20 70 58 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   pX==0 ) return 
26030 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
26040 61 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d  a = p->pOrderBy-
26050 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 70  >a;.  for(i=p->p
26060 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31  OrderBy->nExpr-1
26070 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
26080 20 20 69 66 28 20 61 5b 69 5d 2e 70 45 78 70 72    if( a[i].pExpr
26090 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
260a0 6c 61 74 65 20 29 20 62 72 65 61 6b 3b 0a 20 20  late ) break;.  
260b0 7d 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65  }.  if( i<0 ) re
260c0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
260d0 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72  e;..  /* If we r
260e0 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
260f0 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   that means the 
26100 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
26110 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 0a  s required. */..
26120 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b    pParse = pWalk
26130 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62  er->pParse;.  db
26140 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
26150 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
26160 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
26170 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
26180 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
26190 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
261a0 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 6d  t;.  memset(&dum
261b0 6d 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75  my, 0, sizeof(du
261c0 6d 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53 72 63  mmy));.  pNewSrc
261d0 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
261e0 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28  tAppendFromTerm(
261f0 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26 64 75  pParse,0,0,0,&du
26200 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a 20  mmy,pNew,0,0);. 
26210 20 69 66 28 20 70 4e 65 77 53 72 63 3d 3d 30 20   if( pNewSrc==0 
26220 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
26230 72 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70  rt;.  *pNew = *p
26240 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 4e  ;.  p->pSrc = pN
26250 65 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45 4c 69  ewSrc;.  p->pELi
26260 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
26270 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
26280 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70  e, 0, sqlite3Exp
26290 72 28 64 62 2c 20 54 4b 5f 41 53 54 45 52 49 53  r(db, TK_ASTERIS
262a0 4b 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20  K, 0));.  p->op 
262b0 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70  = TK_SELECT;.  p
262c0 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20  ->pWhere = 0;.  
262d0 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d  pNew->pGroupBy =
262e0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76   0;.  pNew->pHav
262f0 69 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ing = 0;.  pNew-
26300 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
26310 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
26320 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a    p->pNext = 0;.
26330 20 20 70 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a    p->pWith = 0;.
26340 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
26350 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20   ~SF_Compound;. 
26360 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c   assert( (p->sel
26370 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e 76 65  Flags & SF_Conve
26380 72 74 65 64 29 3d 3d 30 20 29 3b 0a 20 20 70 2d  rted)==0 );.  p-
26390 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
263a0 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 61 73 73  Converted;.  ass
263b0 65 72 74 28 20 70 4e 65 77 2d 3e 70 50 72 69 6f  ert( pNew->pPrio
263c0 72 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e  r!=0 );.  pNew->
263d0 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20  pPrior->pNext = 
263e0 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  pNew;.  pNew->pL
263f0 69 6d 69 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  imit = 0;.  retu
26400 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
26410 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
26420 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 46 52  to see if the FR
26430 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70  OM clause term p
26440 46 72 6f 6d 20 68 61 73 20 74 61 62 6c 65 2d 76  From has table-v
26450 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 0a 2a  alued function.*
26460 2a 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 49 66  * arguments.  If
26470 20 69 74 20 64 6f 65 73 2c 20 6c 65 61 76 65 20   it does, leave 
26480 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
26490 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
264a0 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
264b0 6f 2c 20 73 69 6e 63 65 20 70 46 72 6f 6d 20 69  o, since pFrom i
264c0 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f  s not allowed to
264d0 20 62 65 20 61 20 74 61 62 6c 65 2d 76 61 6c 75   be a table-valu
264e0 65 64 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ed function..*/.
264f0 73 74 61 74 69 63 20 69 6e 74 20 63 61 6e 6e 6f  static int canno
26500 74 42 65 46 75 6e 63 74 69 6f 6e 28 50 61 72 73  tBeFunction(Pars
26510 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63  e *pParse, struc
26520 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
26530 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46  pFrom){.  if( pF
26540 72 6f 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  rom->fg.isTabFun
26550 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  c ){.    sqlite3
26560 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
26570 20 22 27 25 73 27 20 69 73 20 6e 6f 74 20 61 20   "'%s' is not a 
26580 66 75 6e 63 74 69 6f 6e 22 2c 20 70 46 72 6f 6d  function", pFrom
26590 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  ->zName);.    re
265a0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
265b0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64  turn 0;.}..#ifnd
265c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
265d0 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  TE./*.** Argumen
265e0 74 20 70 57 69 74 68 20 28 77 68 69 63 68 20 6d  t pWith (which m
265f0 61 79 20 62 65 20 4e 55 4c 4c 29 20 70 6f 69 6e  ay be NULL) poin
26600 74 73 20 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c  ts to a linked l
26610 69 73 74 20 6f 66 20 6e 65 73 74 65 64 20 0a 2a  ist of nested .*
26620 2a 20 57 49 54 48 20 63 6f 6e 74 65 78 74 73 2c  * WITH contexts,
26630 20 66 72 6f 6d 20 69 6e 6e 65 72 20 74 6f 20 6f   from inner to o
26640 75 74 65 72 6d 6f 73 74 2e 20 49 66 20 74 68 65  utermost. If the
26650 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65   table identifie
26660 64 20 62 79 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c  d by .** FROM cl
26670 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 70 49 74  ause element pIt
26680 65 6d 20 69 73 20 72 65 61 6c 6c 79 20 61 20 63  em is really a c
26690 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78 70 72  ommon-table-expr
266a0 65 73 73 69 6f 6e 20 28 43 54 45 29 20 0a 2a 2a  ession (CTE) .**
266b0 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70   then return a p
266c0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 43 54  ointer to the CT
266d0 45 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72  E definition for
266e0 20 74 68 61 74 20 74 61 62 6c 65 2e 20 4f 74 68   that table. Oth
266f0 65 72 77 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e  erwise.** return
26700 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
26710 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65  a non-NULL value
26720 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 73 65   is returned, se
26730 74 20 2a 70 70 43 6f 6e 74 65 78 74 20 74 6f 20  t *ppContext to 
26740 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 57 69 74  point to the Wit
26750 68 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74  h.** object that
26760 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 43 54   the returned CT
26770 45 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f  E belongs to..*/
26780 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 43  .static struct C
26790 74 65 20 2a 73 65 61 72 63 68 57 69 74 68 28 0a  te *searchWith(.
267a0 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20    With *pWith,  
267b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267c0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 6e    /* Current inn
267d0 65 72 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75  ermost WITH clau
267e0 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
267f0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
26800 65 6d 2c 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  em,     /* FROM 
26810 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 74  clause element t
26820 6f 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 57  o resolve */.  W
26830 69 74 68 20 2a 2a 70 70 43 6f 6e 74 65 78 74 20  ith **ppContext 
26840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26850 2a 20 4f 55 54 3a 20 57 49 54 48 20 63 6c 61 75  * OUT: WITH clau
26860 73 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  se return value 
26870 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b  belongs to */.){
26880 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
26890 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 49 74 65  Name;.  if( pIte
268a0 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20  m->zDatabase==0 
268b0 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 49 74 65  && (zName = pIte
268c0 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  m->zName)!=0 ){.
268d0 20 20 20 20 57 69 74 68 20 2a 70 3b 0a 20 20 20      With *p;.   
268e0 20 66 6f 72 28 70 3d 70 57 69 74 68 3b 20 70 3b   for(p=pWith; p;
268f0 20 70 3d 70 2d 3e 70 4f 75 74 65 72 29 7b 0a 20   p=p->pOuter){. 
26900 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
26910 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
26920 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCte; i++){.    
26930 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
26940 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d  trICmp(zName, p-
26950 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  >a[i].zName)==0 
26960 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70  ){.          *pp
26970 43 6f 6e 74 65 78 74 20 3d 20 70 3b 0a 20 20 20  Context = p;.   
26980 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70         return &p
26990 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  ->a[i];.        
269a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
269b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
269c0 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 64 65 20 67  }../* The code g
269d0 65 6e 65 72 61 74 6f 72 20 6d 61 69 6e 74 61 69  enerator maintai
269e0 6e 73 20 61 20 73 74 61 63 6b 20 6f 66 20 61 63  ns a stack of ac
269f0 74 69 76 65 20 57 49 54 48 20 63 6c 61 75 73 65  tive WITH clause
26a00 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e  s.** with the in
26a10 6e 65 72 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c  ner-most WITH cl
26a20 61 75 73 65 20 62 65 69 6e 67 20 61 74 20 74 68  ause being at th
26a30 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
26a40 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ck..**.** This r
26a50 6f 75 74 69 6e 65 20 70 75 73 68 65 73 20 74 68  outine pushes th
26a60 65 20 57 49 54 48 20 63 6c 61 75 73 65 20 70 61  e WITH clause pa
26a70 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
26a80 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f  nd argument.** o
26a90 6e 74 6f 20 74 68 65 20 74 6f 70 20 6f 66 20 74  nto the top of t
26aa0 68 65 20 73 74 61 63 6b 2e 20 49 66 20 61 72 67  he stack. If arg
26ab0 75 6d 65 6e 74 20 62 46 72 65 65 20 69 73 20 74  ument bFree is t
26ac0 72 75 65 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a  rue, then this.*
26ad0 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 77 69  * WITH clause wi
26ae0 6c 6c 20 6e 65 76 65 72 20 62 65 20 70 6f 70 70  ll never be popp
26af0 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63  ed from the stac
26b00 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  k. In this case 
26b10 69 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20  it.** should be 
26b20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  freed along with
26b30 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
26b40 74 2e 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65  t. In other case
26b50 73 2c 20 77 68 65 6e 0a 2a 2a 20 62 46 72 65 65  s, when.** bFree
26b60 3d 3d 30 2c 20 74 68 65 20 57 69 74 68 20 6f 62  ==0, the With ob
26b70 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 66 72 65  ject will be fre
26b80 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
26b90 65 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61  e SELECT .** sta
26ba0 74 65 6d 65 6e 74 20 77 69 74 68 20 77 68 69 63  tement with whic
26bb0 68 20 69 74 20 69 73 20 61 73 73 6f 63 69 61 74  h it is associat
26bc0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
26bd0 74 65 33 57 69 74 68 50 75 73 68 28 50 61 72 73  te3WithPush(Pars
26be0 65 20 2a 70 50 61 72 73 65 2c 20 57 69 74 68 20  e *pParse, With 
26bf0 2a 70 57 69 74 68 2c 20 75 38 20 62 46 72 65 65  *pWith, u8 bFree
26c00 29 7b 0a 20 20 61 73 73 65 72 74 28 20 62 46 72  ){.  assert( bFr
26c10 65 65 3d 3d 30 20 7c 7c 20 28 70 50 61 72 73 65  ee==0 || (pParse
26c20 2d 3e 70 57 69 74 68 3d 3d 30 20 26 26 20 70 50  ->pWith==0 && pP
26c30 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46 72 65  arse->pWithToFre
26c40 65 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70  e==0) );.  if( p
26c50 57 69 74 68 20 29 7b 0a 20 20 20 20 61 73 73 65  With ){.    asse
26c60 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74  rt( pParse->pWit
26c70 68 21 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20  h!=pWith );.    
26c80 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 20 3d 20  pWith->pOuter = 
26c90 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20  pParse->pWith;. 
26ca0 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68     pParse->pWith
26cb0 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 69 66   = pWith;.    if
26cc0 28 20 62 46 72 65 65 20 29 20 70 50 61 72 73 65  ( bFree ) pParse
26cd0 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 20 3d 20  ->pWithToFree = 
26ce0 70 57 69 74 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pWith;.  }.}../*
26cf0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
26d00 6e 20 63 68 65 63 6b 73 20 69 66 20 61 72 67 75  n checks if argu
26d10 6d 65 6e 74 20 70 46 72 6f 6d 20 72 65 66 65 72  ment pFrom refer
26d20 73 20 74 6f 20 61 20 43 54 45 20 64 65 63 6c 61  s to a CTE decla
26d30 72 65 64 20 62 79 20 0a 2a 2a 20 61 20 57 49 54  red by .** a WIT
26d40 48 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20  H clause on the 
26d50 73 74 61 63 6b 20 63 75 72 72 65 6e 74 6c 79 20  stack currently 
26d60 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20 74 68  maintained by th
26d70 65 20 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a  e parser. And,.*
26d80 2a 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20 70  * if currently p
26d90 72 6f 63 65 73 73 69 6e 67 20 61 20 43 54 45 20  rocessing a CTE 
26da0 65 78 70 72 65 73 73 69 6f 6e 2c 20 69 66 20 69  expression, if i
26db0 74 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65  t is a recursive
26dc0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f  .** reference to
26dd0 20 74 68 65 20 63 75 72 72 65 6e 74 20 43 54 45   the current CTE
26de0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d  ..**.** If pFrom
26df0 20 66 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68   falls into eith
26e00 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 63 61  er of the two ca
26e10 74 65 67 6f 72 69 65 73 20 61 62 6f 76 65 2c 20  tegories above, 
26e20 70 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61  pFrom->pTab.** a
26e30 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  nd other fields 
26e40 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 61 63  are populated ac
26e50 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68 65 20 63  cordingly. The c
26e60 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 68 65  aller should che
26e70 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54  ck.** (pFrom->pT
26e80 61 62 21 3d 30 29 20 74 6f 20 64 65 74 65 72 6d  ab!=0) to determ
26e90 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
26ea0 6f 74 20 61 20 73 75 63 63 65 73 73 66 75 6c 20  ot a successful 
26eb0 6d 61 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75  match.** was fou
26ec0 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65  nd..**.** Whethe
26ed0 72 20 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63 68  r or not a match
26ee0 20 69 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54   is found, SQLIT
26ef0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
26f00 20 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20   if no error.** 
26f10 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72  occurs. If an er
26f20 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20  ror does occur, 
26f30 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
26f40 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
26f50 65 0a 2a 2a 20 70 61 72 73 65 72 20 61 6e 64 20  e.** parser and 
26f60 73 6f 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20  some error code 
26f70 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
26f80 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
26f90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 74  /.static int wit
26fa0 68 45 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65  hExpand(.  Walke
26fb0 72 20 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73  r *pWalker, .  s
26fc0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
26fd0 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50  em *pFrom.){.  P
26fe0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
26ff0 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
27000 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
27010 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74  pParse->db;.  st
27020 72 75 63 74 20 43 74 65 20 2a 70 43 74 65 3b 20  ruct Cte *pCte; 
27030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27040 20 4d 61 74 63 68 65 64 20 43 54 45 20 28 6f 72   Matched CTE (or
27050 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63   NULL if no matc
27060 68 29 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57  h) */.  With *pW
27070 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ith;            
27080 20 20 20 20 20 20 20 20 2f 2a 20 57 49 54 48 20          /* WITH 
27090 63 6c 61 75 73 65 20 74 68 61 74 20 70 43 74 65  clause that pCte
270a0 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a   belongs to */..
270b0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
270c0 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70  >pTab==0 );..  p
270d0 43 74 65 20 3d 20 73 65 61 72 63 68 57 69 74 68  Cte = searchWith
270e0 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68 2c 20  (pParse->pWith, 
270f0 70 46 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a  pFrom, &pWith);.
27100 20 20 69 66 28 20 70 43 74 65 20 29 7b 0a 20 20    if( pCte ){.  
27110 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
27120 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
27130 69 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  ist;.    Select 
27140 2a 70 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63  *pSel;.    Selec
27150 74 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20  t *pLeft;       
27160 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74           /* Left
27170 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61  -most SELECT sta
27180 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e  tement */.    in
27190 74 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 3b  t bMayRecursive;
271a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
271b0 72 75 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20  rue if compound 
271c0 6a 6f 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20  joined by UNION 
271d0 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74  [ALL] */.    Wit
271e0 68 20 2a 70 53 61 76 65 64 57 69 74 68 3b 20 20  h *pSavedWith;  
271f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
27200 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  itial value of p
27210 50 61 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a  Parse->pWith */.
27220 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 74 65 2d  .    /* If pCte-
27230 3e 7a 43 74 65 45 72 72 20 69 73 20 6e 6f 6e 2d  >zCteErr is non-
27240 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f 69  NULL at this poi
27250 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  nt, then this is
27260 20 61 6e 20 69 6c 6c 65 67 61 6c 0a 20 20 20 20   an illegal.    
27270 2a 2a 20 72 65 63 75 72 73 69 76 65 20 72 65 66  ** recursive ref
27280 65 72 65 6e 63 65 20 74 6f 20 43 54 45 20 70 43  erence to CTE pC
27290 74 65 2e 20 4c 65 61 76 65 20 61 6e 20 65 72 72  te. Leave an err
272a0 6f 72 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  or in pParse and
272b0 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 65   return.    ** e
272c0 61 72 6c 79 2e 20 49 66 20 70 43 74 65 2d 3e 7a  arly. If pCte->z
272d0 43 74 65 45 72 72 20 69 73 20 4e 55 4c 4c 2c 20  CteErr is NULL, 
272e0 74 68 65 6e 20 74 68 69 73 20 69 73 20 6e 6f 74  then this is not
272f0 20 61 20 72 65 63 75 72 73 69 76 65 20 72 65 66   a recursive ref
27300 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20 49  erence..    ** I
27310 6e 20 74 68 69 73 20 63 61 73 65 2c 20 70 72 6f  n this case, pro
27320 63 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ceed.  */.    if
27330 28 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20  ( pCte->zCteErr 
27340 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
27350 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
27360 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 2c 20   pCte->zCteErr, 
27370 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCte->zName);.  
27380 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27390 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
273a0 20 20 20 69 66 28 20 63 61 6e 6e 6f 74 42 65 46     if( cannotBeF
273b0 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  unction(pParse, 
273c0 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20  pFrom) ) return 
273d0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20  SQLITE_ERROR;.. 
273e0 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
273f0 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
27400 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
27410 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
27420 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
27430 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20  zeof(Table));.  
27440 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
27450 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
27460 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62  ;.    pTab->nTab
27470 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 54 61  Ref = 1;.    pTa
27480 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  b->zName = sqlit
27490 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
274a0 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Cte->zName);.   
274b0 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
274c0 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f  1;.    pTab->nRo
274d0 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61  wLogEst = 200; a
274e0 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69  ssert( 200==sqli
274f0 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37  te3LogEst(104857
27500 36 29 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e  6) );.    pTab->
27510 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45  tabFlags |= TF_E
27520 70 68 65 6d 65 72 61 6c 20 7c 20 54 46 5f 4e 6f  phemeral | TF_No
27530 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20  VisibleRowid;.  
27540 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74    pFrom->pSelect
27550 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
27560 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 70 53  Dup(db, pCte->pS
27570 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 69  elect, 0);.    i
27580 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
27590 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c  led ) return SQL
275a0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
275b0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
275c0 6d 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20  m->pSelect );.. 
275d0 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
275e0 68 69 73 20 69 73 20 61 20 72 65 63 75 72 73 69  his is a recursi
275f0 76 65 20 43 54 45 2e 20 2a 2f 0a 20 20 20 20 70  ve CTE. */.    p
27600 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
27610 6c 65 63 74 3b 0a 20 20 20 20 62 4d 61 79 52 65  lect;.    bMayRe
27620 63 75 72 73 69 76 65 20 3d 20 28 20 70 53 65 6c  cursive = ( pSel
27630 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ->op==TK_ALL || 
27640 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  pSel->op==TK_UNI
27650 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 62 4d  ON );.    if( bM
27660 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  ayRecursive ){. 
27670 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
27680 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20    SrcList *pSrc 
27690 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
276a0 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f  ->pSrc;.      fo
276b0 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e  r(i=0; i<pSrc->n
276c0 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
276d0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
276e0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
276f0 26 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pSrc->a[i];.   
27700 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
27710 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 0a 20 20  zDatabase==0 .  
27720 20 20 20 20 20 20 20 26 26 20 70 49 74 65 6d 2d         && pItem-
27730 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20 20 20 20 20  >zName!=0 .     
27740 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65      && 0==sqlite
27750 33 53 74 72 49 43 6d 70 28 70 49 74 65 6d 2d 3e  3StrICmp(pItem->
27760 7a 4e 61 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e 61  zName, pCte->zNa
27770 6d 65 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  me).          ){
27780 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d  .          pItem
27790 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20  ->pTab = pTab;. 
277a0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
277b0 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 3d  fg.isRecursive =
277c0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54   1;.          pT
277d0 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20  ab->nTabRef++;. 
277e0 20 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e 73           pSel->s
277f0 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52 65  elFlags |= SF_Re
27800 63 75 72 73 69 76 65 3b 0a 20 20 20 20 20 20 20  cursive;.       
27810 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
27820 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e  ..    /* Only on
27830 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65  e recursive refe
27840 72 65 6e 63 65 20 69 73 20 70 65 72 6d 69 74 74  rence is permitt
27850 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69 66 28 20  ed. */ .    if( 
27860 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e 32 20  pTab->nTabRef>2 
27870 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
27880 45 72 72 6f 72 4d 73 67 28 0a 20 20 20 20 20 20  ErrorMsg(.      
27890 20 20 20 20 70 50 61 72 73 65 2c 20 22 6d 75 6c      pParse, "mul
278a0 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73  tiple references
278b0 20 74 6f 20 72 65 63 75 72 73 69 76 65 20 74 61   to recursive ta
278c0 62 6c 65 3a 20 25 73 22 2c 20 70 43 74 65 2d 3e  ble: %s", pCte->
278d0 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20  zName.      );. 
278e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
278f0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
27900 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
27910 2d 3e 6e 54 61 62 52 65 66 3d 3d 31 20 7c 7c 20  ->nTabRef==1 || 
27920 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70  .            ((p
27930 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46  Sel->selFlags&SF
27940 5f 52 65 63 75 72 73 69 76 65 29 20 26 26 20 70  _Recursive) && p
27950 54 61 62 2d 3e 6e 54 61 62 52 65 66 3d 3d 32 20  Tab->nTabRef==2 
27960 29 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a  ));..    pCte->z
27970 43 74 65 45 72 72 20 3d 20 22 63 69 72 63 75 6c  CteErr = "circul
27980 61 72 20 72 65 66 65 72 65 6e 63 65 3a 20 25 73  ar reference: %s
27990 22 3b 0a 20 20 20 20 70 53 61 76 65 64 57 69 74  ";.    pSavedWit
279a0 68 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74  h = pParse->pWit
279b0 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70  h;.    pParse->p
279c0 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20  With = pWith;.  
279d0 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73    if( bMayRecurs
279e0 69 76 65 20 29 7b 0a 20 20 20 20 20 20 53 65 6c  ive ){.      Sel
279f0 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 53  ect *pPrior = pS
27a00 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  el->pPrior;.    
27a10 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
27a20 2d 3e 70 57 69 74 68 3d 3d 30 20 29 3b 0a 20 20  ->pWith==0 );.  
27a30 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 57 69 74      pPrior->pWit
27a40 68 20 3d 20 70 53 65 6c 2d 3e 70 57 69 74 68 3b  h = pSel->pWith;
27a50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61  .      sqlite3Wa
27a60 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
27a70 2c 20 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 20  , pPrior);.     
27a80 20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d   pPrior->pWith =
27a90 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
27aa0 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
27ab0 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
27ac0 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pSel);.    }.   
27ad0 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
27ae0 20 70 57 69 74 68 3b 0a 0a 20 20 20 20 66 6f 72   pWith;..    for
27af0 28 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c 65  (pLeft=pSel; pLe
27b00 66 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65 66  ft->pPrior; pLef
27b10 74 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 29  t=pLeft->pPrior)
27b20 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70  ;.    pEList = p
27b30 4c 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  Left->pEList;.  
27b40 20 20 69 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c    if( pCte->pCol
27b50 73 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  s ){.      if( p
27b60 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
27b70 3e 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e 70 43  >nExpr!=pCte->pC
27b80 6f 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ols->nExpr ){.  
27b90 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
27ba0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
27bb0 61 62 6c 65 20 25 73 20 68 61 73 20 25 64 20 76  able %s has %d v
27bc0 61 6c 75 65 73 20 66 6f 72 20 25 64 20 63 6f 6c  alues for %d col
27bd0 75 6d 6e 73 22 2c 0a 20 20 20 20 20 20 20 20 20  umns",.         
27be0 20 20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20     pCte->zName, 
27bf0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  pEList->nExpr, p
27c00 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70  Cte->pCols->nExp
27c10 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  r.        );.   
27c20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69       pParse->pWi
27c30 74 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b  th = pSavedWith;
27c40 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
27c50 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
27c60 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45 4c 69      }.      pELi
27c70 73 74 20 3d 20 70 43 74 65 2d 3e 70 43 6f 6c 73  st = pCte->pCols
27c80 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
27c90 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  ite3ColumnsFromE
27ca0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
27cb0 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e  pEList, &pTab->n
27cc0 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c  Col, &pTab->aCol
27cd0 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52  );.    if( bMayR
27ce0 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
27cf0 20 20 69 66 28 20 70 53 65 6c 2d 3e 73 65 6c 46    if( pSel->selF
27d00 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73  lags & SF_Recurs
27d10 69 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ive ){.        p
27d20 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22  Cte->zCteErr = "
27d30 6d 75 6c 74 69 70 6c 65 20 72 65 63 75 72 73 69  multiple recursi
27d40 76 65 20 72 65 66 65 72 65 6e 63 65 73 3a 20 25  ve references: %
27d50 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  s";.      }else{
27d60 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a  .        pCte->z
27d70 43 74 65 45 72 72 20 3d 20 22 72 65 63 75 72 73  CteErr = "recurs
27d80 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 69 6e  ive reference in
27d90 20 61 20 73 75 62 71 75 65 72 79 3a 20 25 73 22   a subquery: %s"
27da0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27db0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
27dc0 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29  t(pWalker, pSel)
27dd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 74 65  ;.    }.    pCte
27de0 2d 3e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a 20  ->zCteErr = 0;. 
27df0 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68     pParse->pWith
27e00 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20   = pSavedWith;. 
27e10 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
27e20 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
27e30 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
27e40 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20  _OMIT_CTE./*.** 
27e50 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 70 61  If the SELECT pa
27e60 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
27e70 6e 64 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20  nd argument has 
27e80 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20 57 49  an associated WI
27e90 54 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 70  TH .** clause, p
27ea0 6f 70 20 69 74 20 66 72 6f 6d 20 74 68 65 20 73  op it from the s
27eb0 74 61 63 6b 20 73 74 6f 72 65 64 20 61 73 20 70  tack stored as p
27ec0 61 72 74 20 6f 66 20 74 68 65 20 50 61 72 73 65  art of the Parse
27ed0 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
27ee0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
27ef0 75 73 65 64 20 61 73 20 74 68 65 20 78 53 65 6c  used as the xSel
27f00 65 63 74 43 61 6c 6c 62 61 63 6b 32 28 29 20 63  ectCallback2() c
27f10 61 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73 71  allback by.** sq
27f20 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
27f30 64 28 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e 67  d() when walking
27f40 20 61 20 53 45 4c 45 43 54 20 74 72 65 65 20 74   a SELECT tree t
27f50 6f 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65 0a  o resolve table.
27f60 2a 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74 68  ** names and oth
27f70 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  er FROM clause e
27f80 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61  lements. .*/.sta
27f90 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 50  tic void selectP
27fa0 6f 70 57 69 74 68 28 57 61 6c 6b 65 72 20 2a 70  opWith(Walker *p
27fb0 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
27fc0 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  p){.  Parse *pPa
27fd0 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
27fe0 50 61 72 73 65 3b 0a 20 20 69 66 28 20 4f 4b 5f  Parse;.  if( OK_
27ff0 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70  IF_ALWAYS_TRUE(p
28000 50 61 72 73 65 2d 3e 70 57 69 74 68 29 20 26 26  Parse->pWith) &&
28010 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b   p->pPrior==0 ){
28020 0a 20 20 20 20 57 69 74 68 20 2a 70 57 69 74 68  .    With *pWith
28030 20 3d 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74   = findRightmost
28040 28 70 29 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20  (p)->pWith;.    
28050 69 66 28 20 70 57 69 74 68 21 3d 30 20 29 7b 0a  if( pWith!=0 ){.
28060 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
28070 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57 69  arse->pWith==pWi
28080 74 68 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  th );.      pPar
28090 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
280a0 68 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20 7d  h->pOuter;.    }
280b0 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  .  }.}.#else.#de
280c0 66 69 6e 65 20 73 65 6c 65 63 74 50 6f 70 57 69  fine selectPopWi
280d0 74 68 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  th 0.#endif../*.
280e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
280f0 69 73 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c  is a Walker call
28100 62 61 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64  back for "expand
28110 69 6e 67 22 20 61 20 53 45 4c 45 43 54 20 73 74  ing" a SELECT st
28120 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70  atement..** "Exp
28130 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f  anding" means to
28140 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   do the followin
28150 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  g:.**.**    (1) 
28160 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45 20   Make sure VDBE 
28170 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
28180 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
28190 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20  d to every.**   
281a0 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66        element of
281b0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
281c0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
281d0 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62  Fill in the pTab
281e0 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66  List->a[].pTab f
281f0 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63  ields in the Src
28200 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20  List that .**   
28210 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 46 52        defines FR
28220 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e  OM clause.  When
28230 20 76 69 65 77 73 20 61 70 70 65 61 72 20 69 6e   views appear in
28240 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
28250 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c  ,.**         fil
28260 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  l pTabList->a[].
28270 70 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63  pSelect with a c
28280 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
28290 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  T statement.**  
282a0 20 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c         that impl
282b0 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e  ements the view.
282c0 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65    A copy is made
282d0 20 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53   of the view's S
282e0 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  ELECT.**        
282f0 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68   statement so th
28300 61 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79  at we can freely
28310 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74   modify or delet
28320 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74  e that statement
28330 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68  .**         with
28340 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f  out worrying abo
28350 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68  ut messing up th
28360 65 20 70 65 72 73 69 73 74 65 6e 74 20 72 65 70  e persistent rep
28370 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20  resentation.**  
28380 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69         of the vi
28390 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29  ew..**.**    (3)
283a0 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74    Add terms to t
283b0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
283c0 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74  to accommodate t
283d0 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
283e0 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e  rd.**         on
283f0 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f   joins and the O
28400 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
28410 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a  se of joins..**.
28420 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e 20  **    (4)  Scan 
28430 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  the list of colu
28440 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
28450 74 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c  t set (pEList) l
28460 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  ooking.**       
28470 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20    for instances 
28480 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61  of the "*" opera
28490 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45  tor or the TABLE
284a0 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  .* operator..** 
284b0 20 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64          If found
284c0 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a  , expand each "*
284d0 22 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  " to be every co
284e0 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61  lumn in every ta
284f0 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61  ble.**         a
28500 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65  nd TABLE.* to be
28510 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
28520 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74   TABLE..**.*/.st
28530 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45  atic int selectE
28540 78 70 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a  xpander(Walker *
28550 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
28560 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
28570 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
28580 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c  pParse;.  int i,
28590 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74   j, k;.  SrcList
285a0 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78   *pTabList;.  Ex
285b0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
285c0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
285d0 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20  _item *pFrom;.  
285e0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
285f0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
28600 20 2a 70 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a   *pE, *pRight, *
28610 70 45 78 70 72 3b 0a 20 20 75 31 36 20 73 65 6c  pExpr;.  u16 sel
28620 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c  Flags = p->selFl
28630 61 67 73 3b 0a 20 20 75 33 32 20 65 6c 69 73 74  ags;.  u32 elist
28640 46 6c 61 67 73 20 3d 20 30 3b 0a 0a 20 20 70 2d  Flags = 0;..  p-
28650 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
28660 45 78 70 61 6e 64 65 64 3b 0a 20 20 69 66 28 20  Expanded;.  if( 
28670 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
28680 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
28690 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20  WRC_Abort;.  }. 
286a0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63   assert( p->pSrc
286b0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 73 65  !=0 );.  if( (se
286c0 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61  lFlags & SF_Expa
286d0 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20  nded)!=0 ){.    
286e0 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
286f0 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74  ;.  }.  pTabList
28700 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45   = p->pSrc;.  pE
28710 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
28720 3b 0a 20 20 73 71 6c 69 74 65 33 57 69 74 68 50  ;.  sqlite3WithP
28730 75 73 68 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ush(pParse, p->p
28740 57 69 74 68 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  With, 0);..  /* 
28750 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72  Make sure cursor
28760 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65   numbers have be
28770 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  en assigned to a
28780 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20  ll entries in.  
28790 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
287a0 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  se of the SELECT
287b0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f   statement..  */
287c0 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
287d0 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
287e0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29  Parse, pTabList)
287f0 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20  ;..  /* Look up 
28800 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65  every table name
28810 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  d in the FROM cl
28820 61 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65  ause of the sele
28830 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20  ct.  If.  ** an 
28840 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
28850 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75  M clause is a su
28860 62 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f  bquery instead o
28870 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  f a table or vie
28880 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65  w,.  ** then cre
28890 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ate a transient 
288a0 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
288b0 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20  to describe the 
288c0 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  subquery..  */. 
288d0 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
288e0 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
288f0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
28900 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
28910 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
28920 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
28930 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65  ->fg.isRecursive
28940 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54  ==0 || pFrom->pT
28950 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ab!=0 );.    if(
28960 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63   pFrom->fg.isRec
28970 75 72 73 69 76 65 20 29 20 63 6f 6e 74 69 6e 75  ursive ) continu
28980 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
28990 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
289a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
289b0 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 69 66 28  OMIT_CTE.    if(
289c0 20 77 69 74 68 45 78 70 61 6e 64 28 70 57 61 6c   withExpand(pWal
289d0 6b 65 72 2c 20 70 46 72 6f 6d 29 20 29 20 72 65  ker, pFrom) ) re
289e0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
289f0 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70      if( pFrom->p
28a00 54 61 62 20 29 20 7b 7d 20 65 6c 73 65 0a 23 65  Tab ) {} else.#e
28a10 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 46 72  ndif.    if( pFr
28a20 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  om->zName==0 ){.
28a30 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28a40 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
28a50 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20     Select *pSel 
28a60 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
28a70 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62  ;.      /* A sub
28a80 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52  -query in the FR
28a90 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
28aa0 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61  ELECT */.      a
28ab0 73 73 65 72 74 28 20 70 53 65 6c 21 3d 30 20 29  ssert( pSel!=0 )
28ac0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
28ad0 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
28ae0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
28af0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
28b00 61 6c 6b 65 72 2c 20 70 53 65 6c 29 20 29 20 72  alker, pSel) ) r
28b10 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
28b20 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  .      pFrom->pT
28b30 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69  ab = pTab = sqli
28b40 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
28b50 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
28b60 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ));.      if( pT
28b70 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  ab==0 ) return W
28b80 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
28b90 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20  pTab->nTabRef = 
28ba0 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72  1;.      if( pFr
28bb0 6f 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20  om->zAlias ){.  
28bc0 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
28bd0 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
28be0 44 75 70 28 64 62 2c 20 70 46 72 6f 6d 2d 3e 7a  Dup(db, pFrom->z
28bf0 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 65  Alias);.      }e
28c00 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 61  lse{.        pTa
28c10 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  b->zName = sqlit
28c20 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73  e3MPrintf(db, "s
28c30 75 62 71 75 65 72 79 5f 25 70 22 2c 20 28 76 6f  ubquery_%p", (vo
28c40 69 64 2a 29 70 54 61 62 29 3b 0a 20 20 20 20 20  id*)pTab);.     
28c50 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20   }.      while( 
28c60 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20  pSel->pPrior ){ 
28c70 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72  pSel = pSel->pPr
28c80 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c  ior; }.      sql
28c90 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  ite3ColumnsFromE
28ca0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
28cb0 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 26 70 54  pSel->pEList,&pT
28cc0 61 62 2d 3e 6e 43 6f 6c 2c 26 70 54 61 62 2d 3e  ab->nCol,&pTab->
28cd0 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61  aCol);.      pTa
28ce0 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
28cf0 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c       pTab->nRowL
28d00 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73  ogEst = 200; ass
28d10 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65  ert( 200==sqlite
28d20 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29  3LogEst(1048576)
28d30 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   );.      pTab->
28d40 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45  tabFlags |= TF_E
28d50 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66  phemeral;.#endif
28d60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
28d70 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79    /* An ordinary
28d80 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e   table or view n
28d90 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ame in the FROM 
28da0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
28db0 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
28dc0 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab==0 );.      
28dd0 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
28de0 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
28df0 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72  teTableItem(pPar
28e00 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20  se, 0, pFrom);. 
28e10 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
28e20 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
28e30 6f 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ort;.      if( p
28e40 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e 3d 30 78  Tab->nTabRef>=0x
28e50 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  ffff ){.        
28e60 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
28e70 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
28e80 79 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  y references to 
28e90 5c 22 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33  \"%s\": max 6553
28ea0 35 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  5",.           p
28eb0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
28ec0 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
28ed0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
28ee0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
28ef0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
28f00 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20  ab->nTabRef++;. 
28f10 20 20 20 20 20 69 66 28 20 21 49 73 56 69 72 74       if( !IsVirt
28f20 75 61 6c 28 70 54 61 62 29 20 26 26 20 63 61 6e  ual(pTab) && can
28f30 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50  notBeFunction(pP
28f40 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a  arse, pFrom) ){.
28f50 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
28f60 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
28f70 7d 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  }.#if !defined(S
28f80 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
28f90 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51   || !defined (SQ
28fa0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
28fb0 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66  LTABLE).      if
28fc0 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
28fd0 29 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65  ) || pTab->pSele
28fe0 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 31  ct ){.        i1
28ff0 36 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  6 nCol;.        
29000 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47  if( sqlite3ViewG
29010 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
29020 61 72 73 65 2c 20 70 54 61 62 29 20 29 20 72 65  arse, pTab) ) re
29030 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
29040 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
29050 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d  pFrom->pSelect==
29060 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72  0 );.        pFr
29070 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  om->pSelect = sq
29080 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
29090 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  b, pTab->pSelect
290a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
290b0 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61  lite3SelectSetNa
290c0 6d 65 28 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  me(pFrom->pSelec
290d0 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  t, pTab->zName);
290e0 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20  .        nCol = 
290f0 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20  pTab->nCol;.    
29100 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d      pTab->nCol =
29110 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   -1;.        sql
29120 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
29130 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70  Walker, pFrom->p
29140 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
29150 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 6e 43   pTab->nCol = nC
29160 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ol;.      }.#end
29170 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
29180 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65   Locate the inde
29190 78 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49  x named by the I
291a0 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
291b0 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20  , if any. */.   
291c0 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65   if( sqlite3Inde
291d0 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72  xedByLookup(pPar
291e0 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20  se, pFrom) ){.  
291f0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
29200 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  bort;.    }.  }.
29210 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41  .  /* Process NA
29220 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20  TURAL keywords, 
29230 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  and ON and USING
29240 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e   clauses of join
29250 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  s..  */.  if( db
29260 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
29270 7c 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a  | sqliteProcessJ
29280 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29  oin(pParse, p) )
29290 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
292a0 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f  _Abort;.  }..  /
292b0 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20  * For every "*" 
292c0 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74  that occurs in t
292d0 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20  he column list, 
292e0 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
292f0 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c   of.  ** all col
29300 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
29310 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65  es.  And for eve
29320 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72  ry TABLE.* inser
29330 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a  t the names.  **
29340 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
29350 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70  in TABLE.  The p
29360 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61  arser inserted a
29370 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73   special express
29380 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68  ion.  ** with th
29390 65 20 54 4b 5f 41 53 54 45 52 49 53 4b 20 6f 70  e TK_ASTERISK op
293a0 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20  erator for each 
293b0 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e  "*" that it foun
293c0 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 0a  d in the column.
293d0 20 20 2a 2a 20 6c 69 73 74 2e 20 20 54 68 65 20    ** list.  The 
293e0 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a  following code j
293f0 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74  ust has to locat
29400 65 20 74 68 65 20 54 4b 5f 41 53 54 45 52 49 53  e the TK_ASTERIS
29410 4b 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f  K.  ** expressio
29420 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 20 65 61  ns and expand ea
29430 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69  ch one to the li
29440 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  st of all column
29450 73 20 69 6e 0a 20 20 2a 2a 20 61 6c 6c 20 74 61  s in.  ** all ta
29460 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
29470 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a  The first loop j
29480 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ust checks to se
29490 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  e if there are a
294a0 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73  ny "*" operators
294b0 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20  .  ** that need 
294c0 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a  expanding..  */.
294d0 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
294e0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
294f0 7b 0a 20 20 20 20 70 45 20 3d 20 70 45 4c 69 73  {.    pE = pELis
29500 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20  t->a[k].pExpr;. 
29510 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
29520 4b 5f 41 53 54 45 52 49 53 4b 20 29 20 62 72 65  K_ASTERISK ) bre
29530 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ak;.    assert( 
29540 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
29550 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20  | pE->pRight!=0 
29560 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
29570 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
29580 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26   (pE->pLeft!=0 &
29590 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  & pE->pLeft->op=
295a0 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20 69  =TK_ID) );.    i
295b0 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
295c0 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d  T && pE->pRight-
295d0 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b  >op==TK_ASTERISK
295e0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 65 6c   ) break;.    el
295f0 69 73 74 46 6c 61 67 73 20 7c 3d 20 70 45 2d 3e  istFlags |= pE->
29600 66 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 69 66 28  flags;.  }.  if(
29610 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
29620 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
29630 2a 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65  * If we get here
29640 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65   it means the re
29650 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e  sult set contain
29660 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a  s one or more "*
29670 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f  ".    ** operato
29680 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  rs that need to 
29690 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f  be expanded.  Lo
296a0 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  op through each 
296b0 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
296c0 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
296d0 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74  set and expand t
296e0 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  hem one by one..
296f0 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63      */.    struc
29700 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
29710 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  *a = pEList->a;.
29720 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e      ExprList *pN
29730 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ew = 0;.    int 
29740 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e  flags = pParse->
29750 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69  db->flags;.    i
29760 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28  nt longNames = (
29770 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
29780 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a  ullColNames)!=0.
29790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297a0 20 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 20        && (flags 
297b0 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
297c0 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20  lNames)==0;..   
297d0 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
297e0 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
297f0 0a 20 20 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d  .      pE = a[k]
29800 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6c  .pExpr;.      el
29810 69 73 74 46 6c 61 67 73 20 7c 3d 20 70 45 2d 3e  istFlags |= pE->
29820 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 70 52 69  flags;.      pRi
29830 67 68 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74  ght = pE->pRight
29840 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
29850 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
29860 7c 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20  | pRight!=0 );. 
29870 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21       if( pE->op!
29880 3d 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 20  =TK_ASTERISK.   
29890 20 20 20 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d      && (pE->op!=
298a0 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74  TK_DOT || pRight
298b0 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49 53  ->op!=TK_ASTERIS
298c0 4b 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  K).      ){.    
298d0 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74      /* This part
298e0 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f  icular expressio
298f0 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  n does not need 
29900 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a  to be expanded..
29910 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
29920 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
29930 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
29940 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b  pParse, pNew, a[
29950 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  k].pExpr);.     
29960 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
29970 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61           pNew->a
29980 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e  [pNew->nExpr-1].
29990 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61  zName = a[k].zNa
299a0 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  me;.          pN
299b0 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
299c0 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b  r-1].zSpan = a[k
299d0 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20  ].zSpan;.       
299e0 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20     a[k].zName = 
299f0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b  0;.          a[k
29a00 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20  ].zSpan = 0;.   
29a10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
29a20 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20  [k].pExpr = 0;. 
29a30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
29a40 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72      /* This expr
29a50 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20  ession is a "*" 
29a60 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61  or a "TABLE.*" a
29a70 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  nd needs to be. 
29a80 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64         ** expand
29a90 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ed. */.        i
29aa0 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30  nt tableSeen = 0
29ab0 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f  ;      /* Set to
29ac0 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61   1 when TABLE ma
29ad0 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  tches */.       
29ae0 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20   char *zTName = 
29af0 30 3b 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74  0;       /* text
29b00 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c   of name of TABL
29b10 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  E */.        if(
29b20 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
29b30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
29b40 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d  ert( pE->pLeft!=
29b50 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
29b60 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
29b70 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66  roperty(pE->pLef
29b80 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  t, EP_IntValue) 
29b90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e  );.          zTN
29ba0 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d  ame = pE->pLeft-
29bb0 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
29bc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
29bd0 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
29be0 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
29bf0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
29c00 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pFrom++){.      
29c10 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
29c20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
29c30 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20           Select 
29c40 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSub = pFrom->p
29c50 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
29c60 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65    char *zTabName
29c70 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73   = pFrom->zAlias
29c80 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  ;.          cons
29c90 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e  t char *zSchemaN
29ca0 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
29cb0 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
29cc0 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61        if( zTabNa
29cd0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  me==0 ){.       
29ce0 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20       zTabName = 
29cf0 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
29d00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29d10 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
29d20 63 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b  cFailed ) break;
29d30 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
29d40 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d  Sub==0 || (pSub-
29d50 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e  >selFlags & SF_N
29d60 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b  estedFrom)==0 ){
29d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75  .            pSu
29d80 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  b = 0;.         
29d90 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26     if( zTName &&
29da0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
29db0 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65  zTName, zTabName
29dc0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
29dd0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
29de0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
29df0 20 20 20 20 20 20 20 20 20 20 69 44 62 20 3d 20            iDb = 
29e00 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
29e10 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
29e20 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
29e30 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65       zSchemaName
29e40 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e   = iDb>=0 ? db->
29e50 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
29e60 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20 20  e : "*";.       
29e70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66     }.          f
29e80 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
29e90 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
29ea0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
29eb0 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ame = pTab->aCol
29ec0 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
29ed0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f         char *zCo
29ee0 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63  lname;  /* The c
29ef0 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e  omputed column n
29f00 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ame */.         
29f10 20 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65     char *zToFree
29f20 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20  ;   /* Malloced 
29f30 73 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64  string that need
29f40 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  s to be freed */
29f50 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b  .            Tok
29f60 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a  en sColname;  /*
29f70 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e   Computed column
29f80 20 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e   name as a token
29f90 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20   */..           
29fa0 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 20 29   assert( zName )
29fb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
29fc0 28 20 7a 54 4e 61 6d 65 20 26 26 20 70 53 75 62  ( zTName && pSub
29fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
29fe0 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61   sqlite3MatchSpa
29ff0 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69  nName(pSub->pELi
2a000 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20  st->a[j].zSpan, 
2a010 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30  0, zTName, 0)==0
2a020 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
2a030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
2a040 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2a050 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
2a060 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d     /* If a colum
2a070 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27  n is marked as '
2a080 68 69 64 64 65 6e 27 2c 20 6f 6d 69 74 20 69 74  hidden', omit it
2a090 20 66 72 6f 6d 20 74 68 65 20 65 78 70 61 6e 64   from the expand
2a0a0 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ed.            *
2a0b0 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73  * result-set lis
2a0c0 74 20 75 6e 6c 65 73 73 20 74 68 65 20 53 45 4c  t unless the SEL
2a0d0 45 43 54 20 68 61 73 20 74 68 65 20 53 46 5f 49  ECT has the SF_I
2a0e0 6e 63 6c 75 64 65 48 69 64 64 65 6e 0a 20 20 20  ncludeHidden.   
2a0f0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 69 74 20           ** bit 
2a100 73 65 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20  set..           
2a110 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2a120 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
2a130 20 26 20 53 46 5f 49 6e 63 6c 75 64 65 48 69 64   & SF_IncludeHid
2a140 64 65 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  den)==0.        
2a150 20 20 20 20 20 26 26 20 49 73 48 69 64 64 65 6e       && IsHidden
2a160 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43  Column(&pTab->aC
2a170 6f 6c 5b 6a 5d 29 20 0a 20 20 20 20 20 20 20 20  ol[j]) .        
2a180 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2a190 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2a1a0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2a1b0 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65           tableSe
2a1c0 65 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20  en = 1;..       
2a1d0 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20       if( i>0 && 
2a1e0 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  zTName==0 ){.   
2a1f0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
2a200 70 46 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  pFrom->fg.jointy
2a210 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29  pe & JT_NATURAL)
2a220 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  !=0.            
2a230 20 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43      && tableAndC
2a240 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c  olumnIndex(pTabL
2a250 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30  ist, i, zName, 0
2a260 2c 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  , 0).           
2a270 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2a280 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41        /* In a NA
2a290 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74  TURAL join, omit
2a2a0 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e   the join column
2a2b0 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20  s from the .    
2a2c0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
2a2d0 61 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68  able to the righ
2a2e0 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  t of the join */
2a2f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a300 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2a310 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2a320 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
2a330 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28  ite3IdListIndex(
2a340 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a  pFrom->pUsing, z
2a350 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  Name)>=0 ){.    
2a360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2a370 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20  n a join with a 
2a380 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d  USING clause, om
2a390 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  it columns in th
2a3a0 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
2a3b0 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73    ** using claus
2a3c0 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65  e from the table
2a3d0 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a   on the right. *
2a3e0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
2a3f0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2a400 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a410 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a420 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73        pRight = s
2a430 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
2a440 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  K_ID, zName);.  
2a450 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61            zColna
2a460 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20  me = zName;.    
2a470 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20          zToFree 
2a480 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
2a490 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c   if( longNames |
2a4a0 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  | pTabList->nSrc
2a4b0 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >1 ){.          
2a4c0 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b      Expr *pLeft;
2a4d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2a4e0 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
2a4f0 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54  pr(db, TK_ID, zT
2a500 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  abName);.       
2a510 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
2a520 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
2a530 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66  se, TK_DOT, pLef
2a540 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  t, pRight);.    
2a550 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 53            if( zS
2a560 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20  chemaName ){.   
2a570 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65               pLe
2a580 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
2a590 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68  (db, TK_ID, zSch
2a5a0 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  emaName);.      
2a5b0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
2a5c0 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
2a5d0 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70  Parse, TK_DOT, p
2a5e0 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 20 20  Left, pExpr);.  
2a5f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2a600 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2a610 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20  longNames ){.   
2a620 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f               zCo
2a630 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  lname = sqlite3M
2a640 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
2a650 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e  s", zTabName, zN
2a660 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
2a670 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20        zToFree = 
2a680 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20  zColname;.      
2a690 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a6a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2a6b0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
2a6c0 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
2a6d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a6e0 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
2a6f0 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
2a700 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  d(pParse, pNew, 
2a710 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
2a720 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e      sqlite3Token
2a730 49 6e 69 74 28 26 73 43 6f 6c 6e 61 6d 65 2c 20  Init(&sColname, 
2a740 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20  zColname);.     
2a750 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
2a760 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50  prListSetName(pP
2a770 61 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f  arse, pNew, &sCo
2a780 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  lname, 0);.     
2a790 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20         if( pNew 
2a7a0 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  && (p->selFlags 
2a7b0 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29  & SF_NestedFrom)
2a7c0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
2a7d0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
2a7e0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20  List_item *pX = 
2a7f0 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e  &pNew->a[pNew->n
2a800 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20  Expr-1];.       
2a810 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 20         if( pSub 
2a820 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2a830 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73     pX->zSpan = s
2a840 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
2a850 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d  b, pSub->pEList-
2a860 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20  >a[j].zSpan);.  
2a870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
2a880 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61  stcase( pX->zSpa
2a890 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
2a8a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2a8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d               pX-
2a8c0 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33  >zSpan = sqlite3
2a8d0 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
2a8e0 25 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20 20  %s.%s",.        
2a8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a910 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20     zSchemaName, 
2a920 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61  zTabName, zColna
2a930 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
2a940 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2a950 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20  X->zSpan==0 );. 
2a960 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2a970 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d               pX-
2a980 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31 3b  >bSpanIsTab = 1;
2a990 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2a9a0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2a9b0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f  e3DbFree(db, zTo
2a9c0 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Free);.         
2a9d0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2a9e0 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53       if( !tableS
2a9f0 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  een ){.         
2aa00 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20   if( zTName ){. 
2aa10 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2aa20 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2aa30 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
2aa40 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b  e: %s", zTName);
2aa50 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
2aa60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
2aa70 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2aa80 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73  arse, "no tables
2aa90 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20   specified");.  
2aaa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2aab0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2aac0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
2aad0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
2aae0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e  pEList);.    p->
2aaf0 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20  pEList = pNew;. 
2ab00 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69   }.  if( p->pELi
2ab10 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  st ){.    if( p-
2ab20 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64  >pEList->nExpr>d
2ab30 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
2ab40 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29  _LIMIT_COLUMN] )
2ab50 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2ab60 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2ab70 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  "too many column
2ab80 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22  s in result set"
2ab90 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2aba0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d  WRC_Abort;.    }
2abb0 0a 20 20 20 20 69 66 28 20 28 65 6c 69 73 74 46  .    if( (elistF
2abc0 6c 61 67 73 20 26 20 28 45 50 5f 48 61 73 46 75  lags & (EP_HasFu
2abd0 6e 63 7c 45 50 5f 53 75 62 71 75 65 72 79 29 29  nc|EP_Subquery))
2abe0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  !=0 ){.      p->
2abf0 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43  selFlags |= SF_C
2ac00 6f 6d 70 6c 65 78 52 65 73 75 6c 74 3b 0a 20 20  omplexResult;.  
2ac10 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2ac20 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
2ac30 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f  ../*.** No-op ro
2ac40 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61  utine for the pa
2ac50 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e  rse-tree walker.
2ac60 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
2ac70 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
2ac80 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c  Walker.xExprCall
2ac90 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65 73  back then expres
2aca0 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72  sion trees.** ar
2acb0 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75 74  e walked without
2acc0 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65 69   any actions bei
2acd0 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63 68  ng taken at each
2ace0 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61 62   node.  Presumab
2acf0 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73  ly,.** when this
2ad00 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
2ad10 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78 70   for Walker.xExp
2ad20 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a  rCallback then .
2ad30 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63  ** Walker.xSelec
2ad40 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 74  tCallback is set
2ad50 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67   to do something
2ad60 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65 72   useful for ever
2ad70 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69  y .** subquery i
2ad80 6e 20 74 68 65 20 70 61 72 73 65 72 20 74 72 65  n the parser tre
2ad90 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
2ada0 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61  3ExprWalkNoop(Wa
2adb0 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45  lker *NotUsed, E
2adc0 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a  xpr *NotUsed2){.
2add0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2ade0 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
2adf0 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e  Used2);.  return
2ae00 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
2ae10 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f  ../*.** No-op ro
2ae20 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61  utine for the pa
2ae30 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 20  rse-tree walker 
2ae40 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  for SELECT state
2ae50 6d 65 6e 74 73 2e 0a 2a 2a 20 73 75 62 71 75 65  ments..** subque
2ae60 72 79 20 69 6e 20 74 68 65 20 70 61 72 73 65 72  ry in the parser
2ae70 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   tree..*/.int sq
2ae80 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e  lite3SelectWalkN
2ae90 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55  oop(Walker *NotU
2aea0 73 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74  sed, Select *Not
2aeb0 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
2aec0 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
2aed0 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
2aee0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
2aef0 74 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66 20 53 51  tinue;.}..#if SQ
2af00 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
2af10 20 41 6c 77 61 79 73 20 61 73 73 65 72 74 2e 20   Always assert. 
2af20 20 54 68 69 73 20 78 53 65 6c 65 63 74 43 61 6c   This xSelectCal
2af30 6c 62 61 63 6b 32 20 69 6d 70 6c 65 6d 65 6e 74  lback2 implement
2af40 61 74 69 6f 6e 20 70 72 6f 76 65 73 20 74 68 61  ation proves tha
2af50 74 20 74 68 65 0a 2a 2a 20 78 53 65 6c 65 63 74  t the.** xSelect
2af60 43 61 6c 6c 62 61 63 6b 32 20 69 73 20 6e 65 76  Callback2 is nev
2af70 65 72 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 76  er invoked..*/.v
2af80 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
2af90 74 57 61 6c 6b 41 73 73 65 72 74 32 28 57 61 6c  tWalkAssert2(Wal
2afa0 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 53 65  ker *NotUsed, Se
2afb0 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 32 29 7b  lect *NotUsed2){
2afc0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2afd0 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
2afe0 74 55 73 65 64 32 29 3b 0a 20 20 61 73 73 65 72  tUsed2);.  asser
2aff0 74 28 20 30 20 29 3b 0a 7d 0a 23 65 6e 64 69 66  t( 0 );.}.#endif
2b000 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2b010 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20 61 20  ine "expands" a 
2b020 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2b030 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20   and all of its 
2b040 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46  subqueries..** F
2b050 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
2b060 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61  formation on wha
2b070 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20 22 65  t it means to "e
2b080 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43 54 0a  xpand" a SELECT.
2b090 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20 73 65  ** statement, se
2b0a0 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e  e the comment on
2b0b0 20 74 68 65 20 73 65 6c 65 63 74 45 78 70 61 6e   the selectExpan
2b0c0 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63  d worker callbac
2b0d0 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45  k above..**.** E
2b0e0 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c 45 43  xpanding a SELEC
2b0f0 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 74  T statement is t
2b100 68 65 20 66 69 72 73 74 20 73 74 65 70 20 69 6e  he first step in
2b110 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a   processing a.**
2b120 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2b130 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20 73  t.  The SELECT s
2b140 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20 62 65  tatement must be
2b150 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65   expanded before
2b160 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  .** name resolut
2b170 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ion is performed
2b180 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68  ..**.** If anyth
2b190 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20  ing goes wrong, 
2b1a0 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
2b1b0 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
2b1c0 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20   pParse..** The 
2b1d0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
2b1e0 20 63 61 6e 20 64 65 74 65 63 74 20 74 68 65 20   can detect the 
2b1f0 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69  problem by looki
2b200 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e 6e 45  ng at pParse->nE
2b210 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61  rr.** and/or pPa
2b220 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
2b230 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ailed..*/.static
2b240 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c   void sqlite3Sel
2b250 65 63 74 45 78 70 61 6e 64 28 50 61 72 73 65 20  ectExpand(Parse 
2b260 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
2b270 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c  *pSelect){.  Wal
2b280 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72  ker w;.  w.xExpr
2b290 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
2b2a0 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a  e3ExprWalkNoop;.
2b2b0 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61    w.pParse = pPa
2b2c0 72 73 65 3b 0a 20 20 69 66 28 20 4f 4b 5f 49 46  rse;.  if( OK_IF
2b2d0 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70 50 61  _ALWAYS_TRUE(pPa
2b2e0 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64  rse->hasCompound
2b2f0 29 20 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65  ) ){.    w.xSele
2b300 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e  ctCallback = con
2b310 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65  vertCompoundSele
2b320 63 74 54 6f 53 75 62 71 75 65 72 79 3b 0a 20 20  ctToSubquery;.  
2b330 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
2b340 61 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20 73 71  ack2 = 0;.    sq
2b350 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
2b360 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  &w, pSelect);.  
2b370 7d 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  }.  w.xSelectCal
2b380 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78  lback = selectEx
2b390 70 61 6e 64 65 72 3b 0a 20 20 77 2e 78 53 65 6c  pander;.  w.xSel
2b3a0 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73  ectCallback2 = s
2b3b0 65 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a 20 20  electPopWith;.  
2b3c0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
2b3d0 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
2b3e0 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
2b3f0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
2b400 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
2b410 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43   Walker.xSelectC
2b420 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b  allback callback
2b430 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33   for the sqlite3
2b440 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29  SelectTypeInfo()
2b450 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  .** interface..*
2b460 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52  *.** For each FR
2b470 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
2b480 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a  ry, add Column.z
2b490 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e  Type and Column.
2b4a0 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61  zColl.** informa
2b4b0 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c  tion to the Tabl
2b4c0 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
2b4d0 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20   represents the 
2b4e0 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66  result set.** of
2b4f0 20 74 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a   that subquery..
2b500 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  **.** The Table 
2b510 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
2b520 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65  epresents the re
2b530 73 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e  sult set was con
2b540 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73  structed.** by s
2b550 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29 20  electExpander() 
2b560 62 75 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  but the type and
2b570 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72   collation infor
2b580 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74  mation was omitt
2b590 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f  ed.** at that po
2b5a0 69 6e 74 20 62 65 63 61 75 73 65 20 69 64 65 6e  int because iden
2b5b0 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20  tifiers had not 
2b5c0 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65  yet been resolve
2b5d0 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  d.  This.** rout
2b5e0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
2b5f0 74 65 72 20 69 64 65 6e 74 69 66 69 65 72 20 72  ter identifier r
2b600 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  esolution..*/.st
2b610 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
2b620 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49  AddSubqueryTypeI
2b630 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  nfo(Walker *pWal
2b640 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
2b650 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2b660 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63  ;.  int i;.  Src
2b670 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
2b680 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2b690 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20  _item *pFrom;.. 
2b6a0 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46   assert( p->selF
2b6b0 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76  lags & SF_Resolv
2b6c0 65 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ed );.  assert( 
2b6d0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
2b6e0 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d  F_HasTypeInfo)==
2b6f0 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  0 );.  p->selFla
2b700 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65  gs |= SF_HasType
2b710 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d  Info;.  pParse =
2b720 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
2b730 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  ;.  pTabList = p
2b740 2d 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d  ->pSrc;.  for(i=
2b750 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
2b760 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
2b770 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
2b780 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  om++){.    Table
2b790 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
2b7a0 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74  pTab;.    assert
2b7b0 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ( pTab!=0 );.   
2b7c0 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46   if( (pTab->tabF
2b7d0 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
2b7e0 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ral)!=0 ){.     
2b7f0 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
2b800 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2b810 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
2b820 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  /.      Select *
2b830 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
2b840 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 69 66 28  elect;.      if(
2b850 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 20   pSel ){.       
2b860 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50   while( pSel->pP
2b870 72 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53  rior ) pSel = pS
2b880 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  el->pPrior;.    
2b890 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
2b8a0 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e  tAddColumnTypeAn
2b8b0 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73  dCollation(pPars
2b8c0 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a  e, pTab, pSel);.
2b8d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2b8e0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
2b8f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2b900 61 64 64 73 20 64 61 74 61 74 79 70 65 20 61 6e  adds datatype an
2b910 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
2b920 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ence information
2b930 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65   to.** the Table
2b940 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 61   structures of a
2b950 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ll FROM-clause s
2b960 75 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a  ubqueries in a.*
2b970 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
2b980 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  nt..**.** Use th
2b990 69 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72  is routine after
2b9a0 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
2b9b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2b9c0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
2b9d0 64 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20  dTypeInfo(Parse 
2b9e0 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
2b9f0 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64  *pSelect){.#ifnd
2ba00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
2ba10 55 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72  UBQUERY.  Walker
2ba20 20 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43   w;.  w.xSelectC
2ba30 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  allback = sqlite
2ba40 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b  3SelectWalkNoop;
2ba50 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
2ba60 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 41 64  back2 = selectAd
2ba70 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66  dSubqueryTypeInf
2ba80 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  o;.  w.xExprCall
2ba90 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78  back = sqlite3Ex
2baa0 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e  prWalkNoop;.  w.
2bab0 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
2bac0 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65  .  sqlite3WalkSe
2bad0 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74  lect(&w, pSelect
2bae0 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  );.#endif.}.../*
2baf0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2bb00 20 73 65 74 73 20 75 70 20 61 20 53 45 4c 45 43   sets up a SELEC
2bb10 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20  T statement for 
2bb20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65  processing.  The
2bb30 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  .** following is
2bb40 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a   accomplished:.*
2bb50 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45  *.**     *  VDBE
2bb60 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   Cursor numbers 
2bb70 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20  are assigned to 
2bb80 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
2bb90 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20  terms..**     * 
2bba0 20 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65   Ephemeral Table
2bbb0 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65   objects are cre
2bbc0 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f  ated for all FRO
2bbd0 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
2bbe0 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f  ies..**     *  O
2bbf0 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
2bc00 73 65 73 20 61 72 65 20 73 68 69 66 74 65 64 20  ses are shifted 
2bc10 69 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74 65  into WHERE state
2bc20 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20  ments.**     *  
2bc30 57 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e  Wildcards "*" an
2bc40 64 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72  d "TABLE.*" in r
2bc50 65 73 75 6c 74 20 73 65 74 73 20 61 72 65 20 65  esult sets are e
2bc60 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20  xpanded..**     
2bc70 2a 20 20 49 64 65 6e 74 69 66 69 65 72 73 20 69  *  Identifiers i
2bc80 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65  n expression are
2bc90 20 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c   matched to tabl
2bca0 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
2bcb0 6f 75 74 69 6e 65 20 61 63 74 73 20 72 65 63 75  outine acts recu
2bcc0 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73  rsively on all s
2bcd0 75 62 71 75 65 72 69 65 73 20 77 69 74 68 69 6e  ubqueries within
2bce0 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a   the SELECT..*/.
2bcf0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
2bd00 63 74 50 72 65 70 28 0a 20 20 50 61 72 73 65 20  ctPrep(.  Parse 
2bd10 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
2bd20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
2bd30 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
2bd40 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
2bd50 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
2bd60 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
2bd70 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d   coded. */.  Nam
2bd80 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72  eContext *pOuter
2bd90 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74  NC  /* Name cont
2bda0 65 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65  ext for containe
2bdb0 72 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  r */.){.  assert
2bdc0 28 20 70 21 3d 30 20 7c 7c 20 70 50 61 72 73 65  ( p!=0 || pParse
2bdd0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
2bde0 65 64 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72  ed );.  if( pPar
2bdf0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
2be00 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
2be10 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
2be20 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66   & SF_HasTypeInf
2be30 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  o ) return;.  sq
2be40 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
2be50 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  d(pParse, p);.  
2be60 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
2be70 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
2be80 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
2be90 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
2bea0 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d  ResolveSelectNam
2beb0 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f  es(pParse, p, pO
2bec0 75 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70  uterNC);.  if( p
2bed0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70  Parse->nErr || p
2bee0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
2bef0 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
2bf00 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
2bf10 74 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61  tAddTypeInfo(pPa
2bf20 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rse, p);.}../*.*
2bf30 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72  * Reset the aggr
2bf40 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
2bf50 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67  r..**.** The agg
2bf60 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
2bf70 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d  or is a set of m
2bf80 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74  emory cells that
2bf90 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65   hold.** interme
2bfa0 64 69 61 74 65 20 72 65 73 75 6c 74 73 20 77 68  diate results wh
2bfb0 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20  ile calculating 
2bfc0 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54  an aggregate.  T
2bfd0 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67  his.** routine g
2bfe0 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 68  enerates code th
2bff0 61 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20  at stores NULLs 
2c000 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20  in all of those 
2c010 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e  memory.** cells.
2c020 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2c030 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
2c040 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2c050 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
2c060 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
2c070 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
2c080 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
2c090 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
2c0a0 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67  Func;.  int nReg
2c0b0 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   = pAggInfo->nFu
2c0c0 6e 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e  nc + pAggInfo->n
2c0d0 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52  Column;.  if( nR
2c0e0 65 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  eg==0 ) return;.
2c0f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2c100 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  BUG.  /* Verify 
2c110 74 68 61 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f  that all AggInfo
2c120 20 72 65 67 69 73 74 65 72 73 20 61 72 65 20 77   registers are w
2c130 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20  ithin the range 
2c140 73 70 65 63 69 66 69 65 64 20 62 79 0a 20 20 2a  specified by.  *
2c150 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e  * AggInfo.mnReg.
2c160 2e 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a  .AggInfo.mxReg *
2c170 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 67  /.  assert( nReg
2c180 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  ==pAggInfo->mxRe
2c190 67 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  g-pAggInfo->mnRe
2c1a0 67 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  g+1 );.  for(i=0
2c1b0 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  ; i<pAggInfo->nC
2c1c0 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
2c1d0 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66   assert( pAggInf
2c1e0 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e  o->aCol[i].iMem>
2c1f0 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67  =pAggInfo->mnReg
2c200 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67  .         && pAg
2c210 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  gInfo->aCol[i].i
2c220 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Mem<=pAggInfo->m
2c230 78 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f  xReg );.  }.  fo
2c240 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
2c250 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a  o->nFunc; i++){.
2c260 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67      assert( pAgg
2c270 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69  Info->aFunc[i].i
2c280 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Mem>=pAggInfo->m
2c290 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26  nReg.         &&
2c2a0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
2c2b0 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e  [i].iMem<=pAggIn
2c2c0 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d  fo->mxReg );.  }
2c2d0 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
2c2e0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2c2f0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49  P_Null, 0, pAggI
2c300 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67  nfo->mnReg, pAgg
2c310 49 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20  Info->mxReg);.  
2c320 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e  for(pFunc=pAggIn
2c330 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20  fo->aFunc, i=0; 
2c340 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
2c350 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29  c; i++, pFunc++)
2c360 7b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d  {.    if( pFunc-
2c370 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b  >iDistinct>=0 ){
2c380 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20  .      Expr *pE 
2c390 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a  = pFunc->pExpr;.
2c3a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
2c3b0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2c3c0 45 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  E, EP_xIsSelect)
2c3d0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   );.      if( pE
2c3e0 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  ->x.pList==0 || 
2c3f0 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pE->x.pList->nEx
2c400 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  pr!=1 ){.       
2c410 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2c420 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e  (pParse, "DISTIN
2c430 43 54 20 61 67 67 72 65 67 61 74 65 73 20 6d 75  CT aggregates mu
2c440 73 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20  st have exactly 
2c450 6f 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20 20  one ".          
2c460 20 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20   "argument");.  
2c470 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69        pFunc->iDi
2c480 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20  stinct = -1;.   
2c490 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c4a0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
2c4b0 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
2c4c0 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
2c4d0 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2c 20 30  , pE->x.pList, 0
2c4e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
2c4f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2c500 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
2c510 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73  ral, pFunc->iDis
2c520 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20  tinct, 0, 0,.   
2c530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c540 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
2c550 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
2c560 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  FO);.      }.   
2c570 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
2c580 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67  Invoke the OP_Ag
2c590 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65  gFinalize opcode
2c5a0 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72 65   for every aggre
2c5b0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  gate function.**
2c5c0 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20   in the AggInfo 
2c5d0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
2c5e0 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69  atic void finali
2c5f0 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50  zeAggFunctions(P
2c600 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
2c610 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
2c620 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
2c630 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
2c640 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
2c650 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b  ggInfo_func *pF;
2c660 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70  .  for(i=0, pF=p
2c670 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20  AggInfo->aFunc; 
2c680 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
2c690 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20  c; i++, pF++){. 
2c6a0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
2c6b0 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
2c6c0 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73  x.pList;.    ass
2c6d0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2c6e0 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c  perty(pF->pExpr,
2c6f0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
2c700 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2c710 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 67  eAddOp2(v, OP_Ag
2c720 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d  gFinal, pF->iMem
2c730 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d  , pList ? pList-
2c740 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20  >nExpr : 0);.   
2c750 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
2c760 6e 64 50 34 28 76 2c 20 70 46 2d 3e 70 46 75 6e  ndP4(v, pF->pFun
2c770 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
2c780 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64    }.}../*.** Upd
2c790 61 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ate the accumula
2c7a0 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  tor memory cells
2c7b0 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74   for an aggregat
2c7c0 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68  e based on.** th
2c7d0 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
2c7e0 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   position..*/.st
2c7f0 61 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65  atic void update
2c800 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73  Accumulator(Pars
2c810 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
2c820 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
2c830 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
2c840 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
2c850 69 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20  i;.  int regHit 
2c860 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48  = 0;.  int addrH
2c870 69 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74  itTest = 0;.  st
2c880 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
2c890 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20  c *pF;.  struct 
2c8a0 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b  AggInfo_col *pC;
2c8b0 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69  ..  pAggInfo->di
2c8c0 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  rectMode = 1;.  
2c8d0 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67  for(i=0, pF=pAgg
2c8e0 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70  Info->aFunc; i<p
2c8f0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
2c900 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20  i++, pF++){.    
2c910 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e  int nArg;.    in
2c920 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a  t addrNext = 0;.
2c930 20 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a      int regAgg;.
2c940 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
2c950 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
2c960 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73  >x.pList;.    as
2c970 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2c980 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72  operty(pF->pExpr
2c990 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
2c9a0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
2c9b0 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d   ){.      nArg =
2c9c0 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
2c9d0 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 73 71       regAgg = sq
2c9e0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
2c9f0 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b  e(pParse, nArg);
2ca00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2ca10 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
2ca20 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65  Parse, pList, re
2ca30 67 41 67 67 2c 20 30 2c 20 53 51 4c 49 54 45 5f  gAgg, 0, SQLITE_
2ca40 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20 7d  ECEL_DUP);.    }
2ca50 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67  else{.      nArg
2ca60 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41   = 0;.      regA
2ca70 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  gg = 0;.    }.  
2ca80 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69    if( pF->iDisti
2ca90 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  nct>=0 ){.      
2caa0 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74  addrNext = sqlit
2cab0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
2cac0 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  v);.      testca
2cad0 73 65 28 20 6e 41 72 67 3d 3d 30 20 29 3b 20 20  se( nArg==0 );  
2cae0 2f 2a 20 45 72 72 6f 72 20 63 6f 6e 64 69 74 69  /* Error conditi
2caf0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  on */.      test
2cb00 63 61 73 65 28 20 6e 41 72 67 3e 31 20 29 3b 20  case( nArg>1 ); 
2cb10 20 20 2f 2a 20 41 6c 73 6f 20 61 6e 20 65 72 72    /* Also an err
2cb20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65  or */.      code
2cb30 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c  Distinct(pParse,
2cb40 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20   pF->iDistinct, 
2cb50 61 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67  addrNext, 1, reg
2cb60 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Agg);.    }.    
2cb70 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66  if( pF->pFunc->f
2cb80 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
2cb90 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20  E_FUNC_NEEDCOLL 
2cba0 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
2cbb0 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20   *pColl = 0;.   
2cbc0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
2cbd0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
2cbe0 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
2cbf0 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
2cc00 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74  !=0 );  /* pList
2cc10 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63  !=0 if pF->pFunc
2cc20 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f   has NEEDCOLL */
2cc30 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
2cc40 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  pItem=pList->a; 
2cc50 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67  !pColl && j<nArg
2cc60 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
2cc70 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
2cc80 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2cc90 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65  Seq(pParse, pIte
2cca0 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
2ccb0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43   }.      if( !pC
2ccc0 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  oll ){.        p
2ccd0 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
2cce0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
2ccf0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2cd00 72 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41 67  regHit==0 && pAg
2cd10 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61  gInfo->nAccumula
2cd20 74 6f 72 20 29 20 72 65 67 48 69 74 20 3d 20 2b  tor ) regHit = +
2cd30 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2cd40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2cd50 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp4(v, OP_Col
2cd60 6c 53 65 71 2c 20 72 65 67 48 69 74 2c 20 30 2c  lSeq, regHit, 0,
2cd70 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c   0, (char *)pCol
2cd80 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
2cd90 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2cda0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2cdb0 50 5f 41 67 67 53 74 65 70 30 2c 20 30 2c 20 72  P_AggStep0, 0, r
2cdc0 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 29  egAgg, pF->iMem)
2cdd0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2cde0 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 46 2d  eAppendP4(v, pF-
2cdf0 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  >pFunc, P4_FUNCD
2ce00 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EF);.    sqlite3
2ce10 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
2ce20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 73  (u8)nArg);.    s
2ce30 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
2ce40 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
2ce50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41  arse, regAgg, nA
2ce60 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
2ce70 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
2ce80 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c  (pParse, regAgg,
2ce90 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20   nArg);.    if( 
2cea0 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20  addrNext ){.    
2ceb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
2cec0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
2ced0 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 73 71  rNext);.      sq
2cee0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
2cef0 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
2cf00 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66   }.  }..  /* Bef
2cf10 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 74  ore populating t
2cf20 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72  he accumulator r
2cf30 65 67 69 73 74 65 72 73 2c 20 63 6c 65 61 72 20  egisters, clear 
2cf40 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
2cf50 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65  ..  ** Otherwise
2cf60 2c 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  , if any of the 
2cf70 72 65 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20  required column 
2cf80 76 61 6c 75 65 73 20 61 72 65 20 61 6c 72 65 61  values are alrea
2cf90 64 79 20 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a  dy present .  **
2cfa0 20 69 6e 20 72 65 67 69 73 74 65 72 73 2c 20 73   in registers, s
2cfb0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29  qlite3ExprCode()
2cfc0 20 6d 61 79 20 75 73 65 20 4f 50 5f 53 43 6f 70   may use OP_SCop
2cfd0 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20 76 61  y to copy the va
2cfe0 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e  lue.  ** to pC->
2cff0 69 4d 65 6d 2e 20 42 75 74 20 62 79 20 74 68 65  iMem. But by the
2d000 20 74 69 6d 65 20 74 68 65 20 76 61 6c 75 65 20   time the value 
2d010 69 73 20 75 73 65 64 2c 20 74 68 65 20 6f 72 69  is used, the ori
2d020 67 69 6e 61 6c 20 72 65 67 69 73 74 65 72 0a 20  ginal register. 
2d030 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 62 65 65   ** may have bee
2d040 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c 69 64 61  n used, invalida
2d050 74 69 6e 67 20 74 68 65 20 75 6e 64 65 72 6c 79  ting the underly
2d060 69 6e 67 20 62 75 66 66 65 72 20 68 6f 6c 64 69  ing buffer holdi
2d070 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74 65 78 74  ng the.  ** text
2d080 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20   or blob value. 
2d090 53 65 65 20 74 69 63 6b 65 74 20 5b 38 38 33 30  See ticket [8830
2d0a0 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20  34dcb5]..  **.  
2d0b0 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74  ** Another solut
2d0c0 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f 20  ion would be to 
2d0d0 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 53 43  change the OP_SC
2d0e0 6f 70 79 20 75 73 65 64 20 74 6f 20 63 6f 70 79  opy used to copy
2d0f0 20 63 61 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c   cached.  ** val
2d100 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70  ues to an OP_Cop
2d110 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65  y..  */.  if( re
2d120 67 48 69 74 20 29 7b 0a 20 20 20 20 61 64 64 72  gHit ){.    addr
2d130 48 69 74 54 65 73 74 20 3d 20 73 71 6c 69 74 65  HitTest = sqlite
2d140 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2d150 50 5f 49 66 2c 20 72 65 67 48 69 74 29 3b 20 56  P_If, regHit); V
2d160 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2d170 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
2d180 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
2d190 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  se);.  for(i=0, 
2d1a0 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  pC=pAggInfo->aCo
2d1b0 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  l; i<pAggInfo->n
2d1c0 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b  Accumulator; i++
2d1d0 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  , pC++){.    sql
2d1e0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
2d1f0 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20  rse, pC->pExpr, 
2d200 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20  pC->iMem);.  }. 
2d210 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63   pAggInfo->direc
2d220 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c  tMode = 0;.  sql
2d230 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
2d240 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  ar(pParse);.  if
2d250 28 20 61 64 64 72 48 69 74 54 65 73 74 20 29 7b  ( addrHitTest ){
2d260 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2d270 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
2d280 48 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a  HitTest);.  }.}.
2d290 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e  ./*.** Add a sin
2d2a0 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69  gle OP_Explain i
2d2b0 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68  nstruction to th
2d2c0 65 20 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69  e VDBE to explai
2d2d0 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f  n a simple.** co
2d2e0 75 6e 74 28 2a 29 20 71 75 65 72 79 20 28 22 53  unt(*) query ("S
2d2f0 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
2d300 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23  ROM pTab")..*/.#
2d310 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2d320 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69  IT_EXPLAIN.stati
2d330 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69  c void explainSi
2d340 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72  mpleCount(.  Par
2d350 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
2d360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d370 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
2d380 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
2d390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d3a0 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e     /* Table bein
2d3b0 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49  g queried */.  I
2d3c0 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20  ndex *pIdx      
2d3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d3e0 2a 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20  * Index used to 
2d3f0 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f  optimize scan, o
2d400 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69  r NULL */.){.  i
2d410 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
2d420 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74  in==2 ){.    int
2d430 20 62 43 6f 76 65 72 20 3d 20 28 70 49 64 78 21   bCover = (pIdx!
2d440 3d 30 20 26 26 20 28 48 61 73 52 6f 77 69 64 28  =0 && (HasRowid(
2d450 70 54 61 62 29 20 7c 7c 20 21 49 73 50 72 69 6d  pTab) || !IsPrim
2d460 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78  aryKeyIndex(pIdx
2d470 29 29 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  )));.    char *z
2d480 45 71 70 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Eqp = sqlite3MPr
2d490 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
2d4a0 20 22 53 43 41 4e 20 54 41 42 4c 45 20 25 73 25   "SCAN TABLE %s%
2d4b0 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54  s%s",.        pT
2d4c0 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
2d4d0 20 20 20 62 43 6f 76 65 72 20 3f 20 22 20 55 53     bCover ? " US
2d4e0 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44  ING COVERING IND
2d4f0 45 58 20 22 20 3a 20 22 22 2c 0a 20 20 20 20 20  EX " : "",.     
2d500 20 20 20 62 43 6f 76 65 72 20 3f 20 70 49 64 78     bCover ? pIdx
2d510 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20  ->zName : "".   
2d520 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
2d530 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20  dbeAddOp4(.     
2d540 20 20 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65     pParse->pVdbe
2d550 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50  , OP_Explain, pP
2d560 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c  arse->iSelectId,
2d570 20 30 2c 20 30 2c 20 7a 45 71 70 2c 20 50 34 5f   0, 0, zEqp, P4_
2d580 44 59 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20  DYNAMIC.    );. 
2d590 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
2d5a0 69 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c  ine explainSimpl
2d5b0 65 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65  eCount(a,b,c).#e
2d5c0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69  ndif../*.** sqli
2d5d0 74 65 33 57 61 6c 6b 45 78 70 72 28 29 20 63 61  te3WalkExpr() ca
2d5e0 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20 68  llback used by h
2d5f0 61 76 69 6e 67 54 6f 57 68 65 72 65 28 29 2e 0a  avingToWhere()..
2d600 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 64  **.** If the nod
2d610 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  e passed to the 
2d620 63 61 6c 6c 62 61 63 6b 20 69 73 20 61 20 54 4b  callback is a TK
2d630 5f 41 4e 44 20 6e 6f 64 65 2c 20 72 65 74 75 72  _AND node, retur
2d640 6e 20 0a 2a 2a 20 57 52 43 5f 43 6f 6e 74 69 6e  n .** WRC_Contin
2d650 75 65 20 74 6f 20 74 65 6c 6c 20 73 71 6c 69 74  ue to tell sqlit
2d660 65 33 57 61 6c 6b 45 78 70 72 28 29 20 74 6f 20  e3WalkExpr() to 
2d670 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
2d680 63 68 69 6c 64 20 6e 6f 64 65 73 2e 0a 2a 2a 0a  child nodes..**.
2d690 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
2d6a0 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 2e 20  turn WRC_Prune. 
2d6b0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 6c  In this case, al
2d6c0 73 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  so check if the 
2d6d0 0a 2a 2a 20 73 75 62 2d 65 78 70 72 65 73 73 69  .** sub-expressi
2d6e0 6f 6e 20 6d 61 74 63 68 65 73 20 74 68 65 20 63  on matches the c
2d6f0 72 69 74 65 72 69 61 20 66 6f 72 20 62 65 69 6e  riteria for bein
2d700 67 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 57  g moved to the W
2d710 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65 2e 20  HERE.** clause. 
2d720 49 66 20 73 6f 2c 20 61 64 64 20 69 74 20 74 6f  If so, add it to
2d730 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2d740 65 20 61 6e 64 20 72 65 70 6c 61 63 65 20 74 68  e and replace th
2d750 65 20 73 75 62 2d 65 78 70 72 65 73 73 69 6f 6e  e sub-expression
2d760 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 48  .** within the H
2d770 41 56 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e  AVING expression
2d780 20 77 69 74 68 20 61 20 63 6f 6e 73 74 61 6e 74   with a constant
2d790 20 22 31 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   "1"..*/.static 
2d7a0 69 6e 74 20 68 61 76 69 6e 67 54 6f 57 68 65 72  int havingToWher
2d7b0 65 45 78 70 72 43 62 28 57 61 6c 6b 65 72 20 2a  eExprCb(Walker *
2d7c0 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
2d7d0 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78  Expr){.  if( pEx
2d7e0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 4e 44 20 29  pr->op!=TK_AND )
2d7f0 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53  {.    Select *pS
2d800 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53   = pWalker->u.pS
2d810 65 6c 65 63 74 3b 0a 20 20 20 20 69 66 28 20 73  elect;.    if( s
2d820 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
2d830 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 70 57  tantOrGroupBy(pW
2d840 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20 70  alker->pParse, p
2d850 45 78 70 72 2c 20 70 53 2d 3e 70 47 72 6f 75 70  Expr, pS->pGroup
2d860 42 79 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  By) ){.      sql
2d870 69 74 65 33 20 2a 64 62 20 3d 20 70 57 61 6c 6b  ite3 *db = pWalk
2d880 65 72 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  er->pParse->db;.
2d890 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
2d8a0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
2d8b0 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  loc(db, TK_INTEG
2d8c0 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54  ER, &sqlite3IntT
2d8d0 6f 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b 0a 20 20  okens[1], 0);.  
2d8e0 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
2d8f0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 57          Expr *pW
2d900 68 65 72 65 20 3d 20 70 53 2d 3e 70 57 68 65 72  here = pS->pWher
2d910 65 3b 0a 20 20 20 20 20 20 20 20 53 57 41 50 28  e;.        SWAP(
2d920 45 78 70 72 2c 20 2a 70 4e 65 77 2c 20 2a 70 45  Expr, *pNew, *pE
2d930 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  xpr);.        pN
2d940 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
2d950 41 6e 64 28 64 62 2c 20 70 57 68 65 72 65 2c 20  And(db, pWhere, 
2d960 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70  pNew);.        p
2d970 53 2d 3e 70 57 68 65 72 65 20 3d 20 70 4e 65 77  S->pWhere = pNew
2d980 3b 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65  ;.        pWalke
2d990 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20  r->eCode = 1;.  
2d9a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2d9b0 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
2d9c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  ;.  }.  return W
2d9d0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
2d9e0 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65  /*.** Transfer e
2d9f0 6c 69 67 69 62 6c 65 20 74 65 72 6d 73 20 66 72  ligible terms fr
2da00 6f 6d 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  om the HAVING cl
2da10 61 75 73 65 20 6f 66 20 61 20 71 75 65 72 79 2c  ause of a query,
2da20 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 70 72 6f   which is.** pro
2da30 63 65 73 73 65 64 20 61 66 74 65 72 20 67 72 6f  cessed after gro
2da40 75 70 69 6e 67 2c 20 74 6f 20 74 68 65 20 57 48  uping, to the WH
2da50 45 52 45 20 63 6c 61 75 73 65 2c 20 77 68 69 63  ERE clause, whic
2da60 68 20 69 73 20 70 72 6f 63 65 73 73 65 64 20 62  h is processed b
2da70 65 66 6f 72 65 0a 2a 2a 20 67 72 6f 75 70 69 6e  efore.** groupin
2da80 67 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  g. For example, 
2da90 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a  the query:.**.**
2daa0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
2dab0 20 3c 74 61 62 6c 65 73 3e 20 57 48 45 52 45 20   <tables> WHERE 
2dac0 61 3d 3f 20 47 52 4f 55 50 20 42 59 20 62 20 48  a=? GROUP BY b H
2dad0 41 56 49 4e 47 20 62 3d 3f 20 41 4e 44 20 63 3d  AVING b=? AND c=
2dae0 3f 0a 2a 2a 0a 2a 2a 20 63 61 6e 20 62 65 20 72  ?.**.** can be r
2daf0 65 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a  ewritten as:.**.
2db00 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
2db10 4f 4d 20 3c 74 61 62 6c 65 73 3e 20 57 48 45 52  OM <tables> WHER
2db20 45 20 61 3d 3f 20 41 4e 44 20 62 3d 3f 20 47 52  E a=? AND b=? GR
2db30 4f 55 50 20 42 59 20 62 20 48 41 56 49 4e 47 20  OUP BY b HAVING 
2db40 63 3d 3f 0a 2a 2a 0a 2a 2a 20 41 20 74 65 72 6d  c=?.**.** A term
2db50 20 6f 66 20 74 68 65 20 48 41 56 49 4e 47 20 65   of the HAVING e
2db60 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 6c 69  xpression is eli
2db70 67 69 62 6c 65 20 66 6f 72 20 74 72 61 6e 73 66  gible for transf
2db80 65 72 20 69 66 20 69 74 20 63 6f 6e 73 69 73 74  er if it consist
2db90 73 0a 2a 2a 20 65 6e 74 69 72 65 6c 79 20 6f 66  s.** entirely of
2dba0 20 63 6f 6e 73 74 61 6e 74 73 20 61 6e 64 20 65   constants and e
2dbb0 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
2dbc0 61 72 65 20 61 6c 73 6f 20 47 52 4f 55 50 20 42  are also GROUP B
2dbd0 59 20 74 65 72 6d 73 20 74 68 61 74 0a 2a 2a 20  Y terms that.** 
2dbe0 75 73 65 20 74 68 65 20 22 42 49 4e 41 52 59 22  use the "BINARY"
2dbf0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
2dc00 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nce..*/.static v
2dc10 6f 69 64 20 68 61 76 69 6e 67 54 6f 57 68 65 72  oid havingToWher
2dc20 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
2dc30 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 57   Select *p){.  W
2dc40 61 6c 6b 65 72 20 73 57 61 6c 6b 65 72 3b 0a 20  alker sWalker;. 
2dc50 20 6d 65 6d 73 65 74 28 26 73 57 61 6c 6b 65 72   memset(&sWalker
2dc60 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 61 6c  , 0, sizeof(sWal
2dc70 6b 65 72 29 29 3b 0a 20 20 73 57 61 6c 6b 65 72  ker));.  sWalker
2dc80 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
2dc90 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70  ;.  sWalker.xExp
2dca0 72 43 61 6c 6c 62 61 63 6b 20 3d 20 68 61 76 69  rCallback = havi
2dcb0 6e 67 54 6f 57 68 65 72 65 45 78 70 72 43 62 3b  ngToWhereExprCb;
2dcc0 0a 20 20 73 57 61 6c 6b 65 72 2e 75 2e 70 53 65  .  sWalker.u.pSe
2dcd0 6c 65 63 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69  lect = p;.  sqli
2dce0 74 65 33 57 61 6c 6b 45 78 70 72 28 26 73 57 61  te3WalkExpr(&sWa
2dcf0 6c 6b 65 72 2c 20 70 2d 3e 70 48 61 76 69 6e 67  lker, p->pHaving
2dd00 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  );.#if SELECTTRA
2dd10 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
2dd20 20 73 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 26   sWalker.eCode &
2dd30 26 20 28 73 71 6c 69 74 65 33 53 65 6c 65 63 74  & (sqlite3Select
2dd40 54 72 61 63 65 20 26 20 30 78 31 30 30 29 21 3d  Trace & 0x100)!=
2dd50 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54  0 ){.    SELECTT
2dd60 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73  RACE(0x100,pPars
2dd70 65 2c 70 2c 28 22 4d 6f 76 65 20 48 41 56 49 4e  e,p,("Move HAVIN
2dd80 47 20 74 65 72 6d 73 20 69 6e 74 6f 20 57 48 45  G terms into WHE
2dd90 52 45 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71  RE:\n"));.    sq
2dda0 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
2ddb0 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
2ddc0 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
2ddd0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
2dde0 66 20 74 68 65 20 70 54 68 69 73 20 65 6e 74 72  f the pThis entr
2ddf0 79 20 6f 66 20 70 54 61 62 4c 69 73 74 20 69 73  y of pTabList is
2de00 20 61 20 73 65 6c 66 2d 6a 6f 69 6e 20 6f 66 20   a self-join of 
2de10 61 20 70 72 69 6f 72 20 76 69 65 77 2e 0a 2a 2a  a prior view..**
2de20 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   If it is, then 
2de30 72 65 74 75 72 6e 20 74 68 65 20 53 72 63 4c 69  return the SrcLi
2de40 73 74 5f 69 74 65 6d 20 66 6f 72 20 74 68 65 20  st_item for the 
2de50 70 72 69 6f 72 20 76 69 65 77 2e 20 20 49 66 20  prior view.  If 
2de60 69 74 20 69 73 20 6e 6f 74 2c 0a 2a 2a 20 74 68  it is not,.** th
2de70 65 6e 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  en return 0..*/.
2de80 73 74 61 74 69 63 20 73 74 72 75 63 74 20 53 72  static struct Sr
2de90 63 4c 69 73 74 5f 69 74 65 6d 20 2a 69 73 53 65  cList_item *isSe
2dea0 6c 66 4a 6f 69 6e 56 69 65 77 28 0a 20 20 53 72  lfJoinView(.  Sr
2deb0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
2dec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
2ded0 61 72 63 68 20 66 6f 72 20 73 65 6c 66 2d 6a 6f  arch for self-jo
2dee0 69 6e 73 20 69 6e 20 74 68 69 73 20 46 52 4f 4d  ins in this FROM
2def0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
2df00 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2df10 20 2a 70 54 68 69 73 20 20 20 2f 2a 20 53 65 61   *pThis   /* Sea
2df20 72 63 68 20 66 6f 72 20 70 72 69 6f 72 20 72 65  rch for prior re
2df30 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20  ference to this 
2df40 73 75 62 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20  subquery */.){. 
2df50 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2df60 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 66  item *pItem;.  f
2df70 6f 72 28 70 49 74 65 6d 20 3d 20 70 54 61 62 4c  or(pItem = pTabL
2df80 69 73 74 2d 3e 61 3b 20 70 49 74 65 6d 3c 70 54  ist->a; pItem<pT
2df90 68 69 73 3b 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  his; pItem++){. 
2dfa0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
2dfb0 65 6c 65 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69  elect==0 ) conti
2dfc0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49 74  nue;.    if( pIt
2dfd0 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74  em->fg.viaCorout
2dfe0 69 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ine ) continue;.
2dff0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
2e000 4e 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  Name==0 ) contin
2e010 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ue;.    if( sqli
2e020 74 65 33 5f 73 74 72 69 63 6d 70 28 70 49 74 65  te3_stricmp(pIte
2e030 6d 2d 3e 7a 44 61 74 61 62 61 73 65 2c 20 70 54  m->zDatabase, pT
2e040 68 69 73 2d 3e 7a 44 61 74 61 62 61 73 65 29 21  his->zDatabase)!
2e050 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2e060 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
2e070 74 72 69 63 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e  tricmp(pItem->zN
2e080 61 6d 65 2c 20 70 54 68 69 73 2d 3e 7a 4e 61 6d  ame, pThis->zNam
2e090 65 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  e)!=0 ) continue
2e0a0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
2e0b0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20  3ExprCompare(0, 
2e0c0 0a 20 20 20 20 20 20 20 20 20 20 70 54 68 69 73  .          pThis
2e0d0 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 57 68 65 72  ->pSelect->pWher
2e0e0 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  e, pItem->pSelec
2e0f0 74 2d 3e 70 57 68 65 72 65 2c 20 2d 31 29 20 0a  t->pWhere, -1) .
2e100 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
2e110 54 68 65 20 76 69 65 77 20 77 61 73 20 6d 6f 64  The view was mod
2e120 69 66 69 65 64 20 62 79 20 73 6f 6d 65 20 6f 74  ified by some ot
2e130 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  her optimization
2e140 20 73 75 63 68 20 61 73 0a 20 20 20 20 20 20 2a   such as.      *
2e150 2a 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54  * pushDownWhereT
2e160 65 72 6d 73 28 29 20 2a 2f 0a 20 20 20 20 20 20  erms() */.      
2e170 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
2e180 20 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d      return pItem
2e190 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
2e1a0 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
2e1b0 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f  TE_COUNTOFVIEW_O
2e1c0 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a  PTIMIZATION./*.*
2e1d0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 74 72 61  * Attempt to tra
2e1e0 6e 73 66 6f 72 6d 20 61 20 71 75 65 72 79 20 6f  nsform a query o
2e1f0 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a  f the form.**.**
2e200 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
2e210 28 2a 29 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  (*) FROM (SELECT
2e220 20 78 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e   x FROM t1 UNION
2e230 20 41 4c 4c 20 53 45 4c 45 43 54 20 79 20 46 52   ALL SELECT y FR
2e240 4f 4d 20 74 32 29 0a 2a 2a 0a 2a 2a 20 49 6e 74  OM t2).**.** Int
2e250 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  o this:.**.**   
2e260 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
2e270 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
2e280 29 2b 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  )+(SELECT count(
2e290 2a 29 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 0a 2a  *) FROM t2).**.*
2e2a0 2a 20 54 68 65 20 74 72 61 6e 73 66 6f 72 6d 61  * The transforma
2e2b0 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  tion only works 
2e2c0 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
2e2d0 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
2e2e0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54 68 65  :.**.**   *  The
2e2f0 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20 55   subquery is a U
2e300 4e 49 4f 4e 20 41 4c 4c 20 6f 66 20 74 77 6f 20  NION ALL of two 
2e310 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 0a 2a 2a  or more terms.**
2e320 20 20 20 2a 20 20 54 68 65 72 65 20 69 73 20 6e     *  There is n
2e330 6f 20 57 48 45 52 45 20 6f 72 20 47 52 4f 55 50  o WHERE or GROUP
2e340 20 42 59 20 6f 72 20 48 41 56 49 4e 47 20 63 6c   BY or HAVING cl
2e350 61 75 73 65 73 20 6f 6e 20 74 68 65 20 73 75 62  auses on the sub
2e360 71 75 65 72 69 65 73 0a 2a 2a 20 20 20 2a 20 20  queries.**   *  
2e370 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
2e380 69 73 20 61 20 73 69 6d 70 6c 65 20 63 6f 75 6e  is a simple coun
2e390 74 28 2a 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  t(*).**.** Retur
2e3a0 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6f 70  n TRUE if the op
2e3b0 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 6e  timization is un
2e3c0 64 65 72 74 61 6b 65 6e 2e 0a 2a 2f 0a 73 74 61  dertaken..*/.sta
2e3d0 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 4f 66 56  tic int countOfV
2e3e0 69 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28  iewOptimization(
2e3f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
2e400 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 65 6c  elect *p){.  Sel
2e410 65 63 74 20 2a 70 53 75 62 2c 20 2a 70 50 72 69  ect *pSub, *pPri
2e420 6f 72 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70  or;.  Expr *pExp
2e430 72 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f 75 6e  r;.  Expr *pCoun
2e440 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
2e450 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  ;.  if( (p->selF
2e460 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
2e470 61 74 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ate)==0 ) return
2e480 20 30 3b 20 20 20 2f 2a 20 54 68 69 73 20 69 73   0;   /* This is
2e490 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f   an aggregate */
2e4a0 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74  .  if( p->pEList
2e4b0 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74  ->nExpr!=1 ) ret
2e4c0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
2e4d0 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 72       /* Single r
2e4e0 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  esult column */.
2e4f0 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c    pExpr = p->pEL
2e500 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
2e510 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
2e520 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  !=TK_AGG_FUNCTIO
2e530 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  N ) return 0;   
2e540 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 69       /* Result i
2e550 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a  s an aggregate *
2e560 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  /.  if( sqlite3_
2e570 73 74 72 69 63 6d 70 28 70 45 78 70 72 2d 3e 75  stricmp(pExpr->u
2e580 2e 7a 54 6f 6b 65 6e 2c 22 63 6f 75 6e 74 22 29  .zToken,"count")
2e590 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
2e5a0 20 49 73 20 63 6f 75 6e 74 28 29 20 2a 2f 0a 20   Is count() */. 
2e5b0 20 69 66 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c   if( pExpr->x.pL
2e5c0 69 73 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20  ist!=0 ) return 
2e5d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2e5e0 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f     /* Must be co
2e5f0 75 6e 74 28 2a 29 20 2a 2f 0a 20 20 69 66 28 20  unt(*) */.  if( 
2e600 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  p->pSrc->nSrc!=1
2e610 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
2e620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e630 20 4f 6e 65 20 74 61 62 6c 65 20 69 6e 20 46 52   One table in FR
2e640 4f 4d 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20  OM  */.  pSub = 
2e650 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  p->pSrc->a[0].pS
2e660 65 6c 65 63 74 3b 0a 20 20 69 66 28 20 70 53 75  elect;.  if( pSu
2e670 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  b==0 ) return 0;
2e680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e690 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2e6a0 65 20 46 52 4f 4d 20 69 73 20 61 20 73 75 62 71  e FROM is a subq
2e6b0 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 70 53  uery */.  if( pS
2e6c0 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20  ub->pPrior==0 ) 
2e6d0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
2e6e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
2e6f0 75 73 74 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e  ust be a compoun
2e700 64 20 72 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20  d ry */.  do{.  
2e710 20 20 69 66 28 20 70 53 75 62 2d 3e 6f 70 21 3d    if( pSub->op!=
2e720 54 4b 5f 41 4c 4c 20 26 26 20 70 53 75 62 2d 3e  TK_ALL && pSub->
2e730 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20  pPrior ) return 
2e740 30 3b 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 55  0;  /* Must be U
2e750 4e 49 4f 4e 20 41 4c 4c 20 2a 2f 0a 20 20 20 20  NION ALL */.    
2e760 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65  if( pSub->pWhere
2e770 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
2e780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e790 20 20 2f 2a 20 4e 6f 20 57 48 45 52 45 20 63 6c    /* No WHERE cl
2e7a0 61 75 73 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  ause */.    if( 
2e7b0 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
2e7c0 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 20   SF_Aggregate ) 
2e7d0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a  return 0;     /*
2e7e0 20 4e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   Not an aggregat
2e7f0 65 20 2a 2f 0a 20 20 20 20 70 53 75 62 20 3d 20  e */.    pSub = 
2e800 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 20 20  pSub->pPrior;   
2e810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2e830 70 65 61 74 20 6f 76 65 72 20 63 6f 6d 70 6f 75  peat over compou
2e840 6e 64 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20  nd */.  }while( 
2e850 70 53 75 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  pSub );..  /* If
2e860 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
2e870 6f 69 6e 74 20 74 68 65 6e 20 69 74 20 69 73 20  oint then it is 
2e880 4f 4b 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68  OK to perform th
2e890 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  e transformation
2e8a0 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 50 61 72   */..  db = pPar
2e8b0 73 65 2d 3e 64 62 3b 0a 20 20 70 43 6f 75 6e 74  se->db;.  pCount
2e8c0 20 3d 20 70 45 78 70 72 3b 0a 20 20 70 45 78 70   = pExpr;.  pExp
2e8d0 72 20 3d 20 30 3b 0a 20 20 70 53 75 62 20 3d 20  r = 0;.  pSub = 
2e8e0 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  p->pSrc->a[0].pS
2e8f0 65 6c 65 63 74 3b 0a 20 20 70 2d 3e 70 53 72 63  elect;.  p->pSrc
2e900 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 3d  ->a[0].pSelect =
2e910 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63   0;.  sqlite3Src
2e920 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
2e930 2d 3e 70 53 72 63 29 3b 0a 20 20 70 2d 3e 70 53  ->pSrc);.  p->pS
2e940 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  rc = sqlite3DbMa
2e950 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
2e960 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 2d 3e  >db, sizeof(*p->
2e970 70 53 72 63 29 29 3b 0a 20 20 77 68 69 6c 65 28  pSrc));.  while(
2e980 20 70 53 75 62 20 29 7b 0a 20 20 20 20 45 78 70   pSub ){.    Exp
2e990 72 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 70 50  r *pTerm;.    pP
2e9a0 72 69 6f 72 20 3d 20 70 53 75 62 2d 3e 70 50 72  rior = pSub->pPr
2e9b0 69 6f 72 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70  ior;.    pSub->p
2e9c0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  Prior = 0;.    p
2e9d0 53 75 62 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  Sub->pNext = 0;.
2e9e0 20 20 20 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61      pSub->selFla
2e9f0 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61  gs |= SF_Aggrega
2ea00 74 65 3b 0a 20 20 20 20 70 53 75 62 2d 3e 73 65  te;.    pSub->se
2ea10 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f  lFlags &= ~SF_Co
2ea20 6d 70 6f 75 6e 64 3b 0a 20 20 20 20 70 53 75 62  mpound;.    pSub
2ea30 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30  ->nSelectRow = 0
2ea40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2ea50 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
2ea60 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
2ea70 20 20 20 70 54 65 72 6d 20 3d 20 70 50 72 69 6f     pTerm = pPrio
2ea80 72 20 3f 20 73 71 6c 69 74 65 33 45 78 70 72 44  r ? sqlite3ExprD
2ea90 75 70 28 64 62 2c 20 70 43 6f 75 6e 74 2c 20 30  up(db, pCount, 0
2eaa0 29 20 3a 20 70 43 6f 75 6e 74 3b 0a 20 20 20 20  ) : pCount;.    
2eab0 70 53 75 62 2d 3e 70 45 4c 69 73 74 20 3d 20 73  pSub->pEList = s
2eac0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
2ead0 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
2eae0 70 54 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72  pTerm);.    pTer
2eaf0 6d 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  m = sqlite3PExpr
2eb00 28 70 50 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45  (pParse, TK_SELE
2eb10 43 54 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  CT, 0, 0);.    s
2eb20 71 6c 69 74 65 33 50 45 78 70 72 41 64 64 53 65  qlite3PExprAddSe
2eb30 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 65  lect(pParse, pTe
2eb40 72 6d 2c 20 70 53 75 62 29 3b 0a 20 20 20 20 69  rm, pSub);.    i
2eb50 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20  f( pExpr==0 ){. 
2eb60 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 54 65       pExpr = pTe
2eb70 72 6d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  rm;.    }else{. 
2eb80 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
2eb90 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
2eba0 2c 20 54 4b 5f 50 4c 55 53 2c 20 70 54 65 72 6d  , TK_PLUS, pTerm
2ebb0 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  , pExpr);.    }.
2ebc0 20 20 20 20 70 53 75 62 20 3d 20 70 50 72 69 6f      pSub = pPrio
2ebd0 72 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 45 4c 69  r;.  }.  p->pELi
2ebe0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 20 3d  st->a[0].pExpr =
2ebf0 20 70 45 78 70 72 3b 0a 20 20 70 2d 3e 73 65 6c   pExpr;.  p->sel
2ec00 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 41 67 67  Flags &= ~SF_Agg
2ec10 72 65 67 61 74 65 3b 0a 0a 23 69 66 20 53 45 4c  regate;..#if SEL
2ec20 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
2ec30 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
2ec40 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30  lectTrace & 0x40
2ec50 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54  0 ){.    SELECTT
2ec60 52 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73  RACE(0x400,pPars
2ec70 65 2c 70 2c 28 22 41 66 74 65 72 20 63 6f 75 6e  e,p,("After coun
2ec80 74 2d 6f 66 2d 76 69 65 77 20 6f 70 74 69 6d 69  t-of-view optimi
2ec90 7a 61 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20  zation:\n"));.  
2eca0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
2ecb0 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
2ecc0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
2ecd0 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
2ece0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 55 4e  f /* SQLITE_COUN
2ecf0 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41  TOFVIEW_OPTIMIZA
2ed00 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  TION */../*.** G
2ed10 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
2ed20 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
2ed30 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74  ement given in t
2ed40 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20  he p argument.  
2ed50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
2ed60 74 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20  ts are returned 
2ed70 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
2ed80 20 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75   SelectDest stru
2ed90 63 74 75 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f  cture..** See co
2eda0 6d 6d 65 6e 74 73 20 69 6e 20 73 71 6c 69 74 65  mments in sqlite
2edb0 49 6e 74 2e 68 20 66 6f 72 20 66 75 72 74 68 65  Int.h for furthe
2edc0 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  r information..*
2edd0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2ede0 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  e returns the nu
2edf0 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
2ee00 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61   If any errors a
2ee10 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65  re.** encountere
2ee20 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f  d, then an appro
2ee30 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73  priate error mes
2ee40 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a  sage is left in.
2ee50 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  ** pParse->zErrM
2ee60 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  sg..**.** This r
2ee70 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20  outine does NOT 
2ee80 66 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20  free the Select 
2ee90 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
2eea0 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c   in.  The.** cal
2eeb0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65  ling function ne
2eec0 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  eds to do that..
2eed0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
2eee0 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
2eef0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
2ef00 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
2ef10 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
2ef20 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
2ef30 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
2ef40 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
2ef50 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63  oded. */.  Selec
2ef60 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
2ef70 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
2ef80 77 69 74 68 20 74 68 65 20 71 75 65 72 79 20 72  with the query r
2ef90 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
2efa0 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
2efb0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2efc0 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72  unters */.  Wher
2efd0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
2efe0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f     /* Return fro
2eff0 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  m sqlite3WhereBe
2f000 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20  gin() */.  Vdbe 
2f010 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
2f020 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
2f030 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63   machine under c
2f040 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
2f050 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20   int isAgg;     
2f060 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2f070 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73  for select lists
2f080 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22   like "count(*)"
2f090 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
2f0a0 70 45 4c 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20  pEList = 0;  /* 
2f0b0 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  List of columns 
2f0c0 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20  to extract. */. 
2f0d0 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
2f0e0 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  st;     /* List 
2f0f0 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c  of tables to sel
2f100 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78  ect from */.  Ex
2f110 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
2f120 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
2f130 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  E clause.  May b
2f140 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
2f150 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20  List *pGroupBy; 
2f160 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20     /* The GROUP 
2f170 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
2f180 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
2f190 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20  r *pHaving;     
2f1a0 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e      /* The HAVIN
2f1b0 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  G clause.  May b
2f1c0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
2f1d0 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  rc = 1;         
2f1e0 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
2f1f0 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20  eturn from this 
2f200 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69  function */.  Di
2f210 73 74 69 6e 63 74 43 74 78 20 73 44 69 73 74 69  stinctCtx sDisti
2f220 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20  nct; /* Info on 
2f230 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20  how to code the 
2f240 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
2f250 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 73 53   */.  SortCtx sS
2f260 6f 72 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ort;         /* 
2f270 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63  Info on how to c
2f280 6f 64 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ode the ORDER BY
2f290 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 41 67 67   clause */.  Agg
2f2a0 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20  Info sAggInfo;  
2f2b0 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
2f2c0 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67 72 65  on used by aggre
2f2d0 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a  gate queries */.
2f2e0 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20    int iEnd;     
2f2f0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
2f300 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f  ess of the end o
2f310 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20  f the query */. 
2f320 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
2f330 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
2f340 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2f350 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  on */.  ExprList
2f360 20 2a 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79   *pMinMaxOrderBy
2f370 20 3d 20 30 3b 20 20 2f 2a 20 41 64 64 65 64 20   = 0;  /* Added 
2f380 4f 52 44 45 52 20 42 59 20 66 6f 72 20 6d 69 6e  ORDER BY for min
2f390 2f 6d 61 78 20 71 75 65 72 69 65 73 20 2a 2f 0a  /max queries */.
2f3a0 20 20 75 38 20 6d 69 6e 4d 61 78 46 6c 61 67 3b    u8 minMaxFlag;
2f3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f3c0 20 2f 2a 20 46 6c 61 67 20 66 6f 72 20 6d 69 6e   /* Flag for min
2f3d0 2f 6d 61 78 20 71 75 65 72 69 65 73 20 2a 2f 0a  /max queries */.
2f3e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2f3f0 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69  OMIT_EXPLAIN.  i
2f400 6e 74 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63  nt iRestoreSelec
2f410 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53  tId = pParse->iS
2f420 65 6c 65 63 74 49 64 3b 0a 20 20 70 50 61 72 73  electId;.  pPars
2f430 65 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d 20 70  e->iSelectId = p
2f440 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
2f450 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a  ctId++;.#endif..
2f460 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
2f470 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  b;.  if( p==0 ||
2f480 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2f490 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
2f4a0 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
2f4b0 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  1;.  }.  if( sql
2f4c0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
2f4d0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c  arse, SQLITE_SEL
2f4e0 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20  ECT, 0, 0, 0) ) 
2f4f0 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73  return 1;.  mems
2f500 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c  et(&sAggInfo, 0,
2f510 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f   sizeof(sAggInfo
2f520 29 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52  ));.#if SELECTTR
2f530 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 53 45  ACE_ENABLED.  SE
2f540 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72  LECTTRACE(1,pPar
2f550 73 65 2c 70 2c 20 28 22 62 65 67 69 6e 20 70 72  se,p, ("begin pr
2f560 6f 63 65 73 73 69 6e 67 3a 5c 6e 22 29 29 3b 0a  ocessing:\n"));.
2f570 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
2f580 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30  ectTrace & 0x100
2f590 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54   ){.    sqlite3T
2f5a0 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
2f5b0 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
2f5c0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  if..  assert( p-
2f5d0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
2f5e0 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
2f5f0 54 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20  T_DistFifo );.  
2f600 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
2f610 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d  rBy==0 || pDest-
2f620 3e 65 44 65 73 74 21 3d 53 52 54 5f 46 69 66 6f  >eDest!=SRT_Fifo
2f630 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
2f640 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
2f650 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
2f660 54 5f 44 69 73 74 51 75 65 75 65 20 29 3b 0a 20  T_DistQueue );. 
2f670 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
2f680 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74  erBy==0 || pDest
2f690 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 51 75 65  ->eDest!=SRT_Que
2f6a0 75 65 20 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f  ue );.  if( Igno
2f6b0 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65  rableOrderby(pDe
2f6c0 73 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  st) ){.    asser
2f6d0 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  t(pDest->eDest==
2f6e0 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44  SRT_Exists || pD
2f6f0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2f700 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20  Union || .      
2f710 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73       pDest->eDes
2f720 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c  t==SRT_Except ||
2f730 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
2f740 52 54 5f 44 69 73 63 61 72 64 20 7c 7c 0a 20 20  RT_Discard ||.  
2f750 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e           pDest->
2f760 65 44 65 73 74 3d 3d 53 52 54 5f 51 75 65 75 65  eDest==SRT_Queue
2f770 20 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73    || pDest->eDes
2f780 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
2f790 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70 44  ||.           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 74 51 75 65 75 65 20 7c 7c 20 70 44 65  DistQueue || pDe
2f7c0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46  st->eDest==SRT_F
2f7d0 69 66 6f 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20  ifo);.    /* If 
2f7e0 4f 52 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e  ORDER BY makes n
2f7f0 6f 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20  o difference in 
2f800 74 68 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20  the output then 
2f810 6e 65 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20  neither does.   
2f820 20 2a 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20   ** DISTINCT so 
2f830 69 74 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65  it can be remove
2f840 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71  d too. */.    sq
2f850 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
2f860 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ete(db, p->pOrde
2f870 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  rBy);.    p->pOr
2f880 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70  derBy = 0;.    p
2f890 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
2f8a0 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a  F_Distinct;.  }.
2f8b0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50    sqlite3SelectP
2f8c0 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30  rep(pParse, p, 0
2f8d0 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 6f  );.  memset(&sSo
2f8e0 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53  rt, 0, sizeof(sS
2f8f0 6f 72 74 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70  ort));.  sSort.p
2f900 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
2f910 64 65 72 42 79 3b 0a 20 20 70 54 61 62 4c 69 73  derBy;.  pTabLis
2f920 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69  t = p->pSrc;.  i
2f930 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
2f940 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
2f950 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
2f960 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
2f970 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
2f980 69 73 74 21 3d 30 20 29 3b 0a 20 20 69 73 41 67  ist!=0 );.  isAg
2f990 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  g = (p->selFlags
2f9a0 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29   & SF_Aggregate)
2f9b0 21 3d 30 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  !=0;.#if SELECTT
2f9c0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
2f9d0 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
2f9e0 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
2f9f0 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
2fa00 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x100,pParse,p,
2fa10 20 28 22 61 66 74 65 72 20 6e 61 6d 65 20 72 65   ("after name re
2fa20 73 6f 6c 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a  solution:\n"));.
2fa30 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
2fa40 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
2fa50 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
2fa60 20 20 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e 74    /* Get a point
2fa70 65 72 20 74 68 65 20 56 44 42 45 20 75 6e 64 65  er the VDBE unde
2fa80 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2c 20  r construction, 
2fa90 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77  allocating a new
2faa0 20 56 44 42 45 20 69 66 20 6f 6e 65 0a 20 20 2a   VDBE if one.  *
2fab0 2a 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  * does not alrea
2fac0 64 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 76 20  dy exist */.  v 
2fad0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
2fae0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
2faf0 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  v==0 ) goto sele
2fb00 63 74 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 44  ct_end;.  if( pD
2fb10 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2fb20 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65  Output ){.    ge
2fb30 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
2fb40 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  s(pParse, p);.  
2fb50 7d 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 76  }..  /* Try to v
2fb60 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74  arious optimizat
2fb70 69 6f 6e 73 20 28 66 6c 61 74 74 65 6e 69 6e 67  ions (flattening
2fb80 20 73 75 62 71 75 65 72 69 65 73 2c 20 61 6e 64   subqueries, and
2fb90 20 73 74 72 65 6e 67 74 68 0a 20 20 2a 2a 20 72   strength.  ** r
2fba0 65 64 75 63 74 69 6f 6e 20 6f 66 20 6a 6f 69 6e  eduction of join
2fbb0 20 6f 70 65 72 61 74 6f 72 73 29 20 69 6e 20 74   operators) in t
2fbc0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 75  he FROM clause u
2fbd0 70 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  p into the main 
2fbe0 71 75 65 72 79 0a 20 20 2a 2f 0a 23 69 66 20 21  query.  */.#if !
2fbf0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
2fc00 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
2fc10 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2fc20 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f  _OMIT_VIEW).  fo
2fc30 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f  r(i=0; !p->pPrio
2fc40 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74 2d  r && i<pTabList-
2fc50 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
2fc60 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2fc70 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
2fc80 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20  TabList->a[i];. 
2fc90 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20     Select *pSub 
2fca0 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  = pItem->pSelect
2fcb0 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
2fcc0 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b  b = pItem->pTab;
2fcd0 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74  ..    /* Convert
2fce0 20 4c 45 46 54 20 4a 4f 49 4e 20 69 6e 74 6f 20   LEFT JOIN into 
2fcf0 4a 4f 49 4e 20 69 66 20 74 68 65 72 65 20 61 72  JOIN if there ar
2fd00 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 72  e terms of the r
2fd10 69 67 68 74 20 74 61 62 6c 65 0a 20 20 20 20 2a  ight table.    *
2fd20 2a 20 6f 66 20 74 68 65 20 4c 45 46 54 20 4a 4f  * of the LEFT JO
2fd30 49 4e 20 75 73 65 64 20 69 6e 20 74 68 65 20 57  IN used in the W
2fd40 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 20  HERE clause..   
2fd50 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 49 74   */.    if( (pIt
2fd60 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  em->fg.jointype 
2fd70 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 0a 20 20  & JT_LEFT)!=0.  
2fd80 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
2fd90 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c 52  rImpliesNonNullR
2fda0 6f 77 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 49  ow(p->pWhere, pI
2fdb0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 0a 20 20  tem->iCursor).  
2fdc0 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
2fdd0 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
2fde0 4c 49 54 45 5f 53 69 6d 70 6c 69 66 79 4a 6f 69  LITE_SimplifyJoi
2fdf0 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  n).    ){.      
2fe00 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30  SELECTTRACE(0x10
2fe10 30 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20 20 20  0,pParse,p,.    
2fe20 20 20 20 20 20 20 20 20 20 20 20 20 28 22 4c 45              ("LE
2fe30 46 54 2d 4a 4f 49 4e 20 73 69 6d 70 6c 69 66 69  FT-JOIN simplifi
2fe40 65 73 20 74 6f 20 4a 4f 49 4e 20 6f 6e 20 74 65  es to JOIN on te
2fe50 72 6d 20 25 64 5c 6e 22 2c 69 29 29 3b 0a 20 20  rm %d\n",i));.  
2fe60 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f      pItem->fg.jo
2fe70 69 6e 74 79 70 65 20 26 3d 20 7e 28 4a 54 5f 4c  intype &= ~(JT_L
2fe80 45 46 54 7c 4a 54 5f 4f 55 54 45 52 29 3b 0a 20  EFT|JT_OUTER);. 
2fe90 20 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78       unsetJoinEx
2fea0 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 49  pr(p->pWhere, pI
2feb0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
2fec0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20     }..    /* No 
2fed0 66 75 74 68 65 72 20 61 63 74 69 6f 6e 20 69 66  futher action if
2fee0 20 74 68 69 73 20 74 65 72 6d 20 6f 66 20 74 68   this term of th
2fef0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
2ff00 20 6e 6f 20 61 20 73 75 62 71 75 65 72 79 20 2a   no a subquery *
2ff10 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d  /.    if( pSub==
2ff20 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  0 ) continue;.. 
2ff30 20 20 20 2f 2a 20 43 61 74 63 68 20 6d 69 73 6d     /* Catch mism
2ff40 61 74 63 68 20 69 6e 20 74 68 65 20 64 65 63 6c  atch in the decl
2ff50 61 72 65 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  ared columns of 
2ff60 61 20 76 69 65 77 20 61 6e 64 20 74 68 65 20 6e  a view and the n
2ff70 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20  umber of.    ** 
2ff80 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 53  columns in the S
2ff90 45 4c 45 43 54 20 6f 6e 20 74 68 65 20 52 48 53  ELECT on the RHS
2ffa0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62   */.    if( pTab
2ffb0 2d 3e 6e 43 6f 6c 21 3d 70 53 75 62 2d 3e 70 45  ->nCol!=pSub->pE
2ffc0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
2ffd0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2ffe0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 65 78  rMsg(pParse, "ex
2fff0 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e  pected %d column
30000 73 20 66 6f 72 20 27 25 73 27 20 62 75 74 20 67  s for '%s' but g
30010 6f 74 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20  ot %d",.        
30020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
30030 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e  ab->nCol, pTab->
30040 7a 4e 61 6d 65 2c 20 70 53 75 62 2d 3e 70 45 4c  zName, pSub->pEL
30050 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
30060 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
30070 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  nd;.    }..    /
30080 2a 20 44 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20  * Do not try to 
30090 66 6c 61 74 74 65 6e 20 61 6e 20 61 67 67 72 65  flatten an aggre
300a0 67 61 74 65 20 73 75 62 71 75 65 72 79 2e 0a 20  gate subquery.. 
300b0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6c 61     **.    ** Fla
300c0 74 74 65 6e 69 6e 67 20 61 6e 20 61 67 67 72 65  ttening an aggre
300d0 67 61 74 65 20 73 75 62 71 75 65 72 79 20 69 73  gate subquery is
300e0 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69   only possible i
300f0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
30100 79 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  y.    ** is not 
30110 61 20 6a 6f 69 6e 2e 20 20 42 75 74 20 69 66 20  a join.  But if 
30120 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
30130 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2c 20 74  is not a join, t
30140 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 79  hen the subquery
30150 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  .    ** will be 
30160 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
30170 20 63 6f 2d 72 6f 75 74 69 6e 65 20 61 6e 64 20   co-routine and 
30180 74 68 65 72 65 20 69 73 20 6e 6f 20 61 64 76 61  there is no adva
30190 6e 74 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20  ntage to.    ** 
301a0 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 74 68  flattening in th
301b0 61 74 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  at case..    */.
301c0 20 20 20 20 69 66 28 20 28 70 53 75 62 2d 3e 73      if( (pSub->s
301d0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
301e0 72 65 67 61 74 65 29 21 3d 30 20 29 20 63 6f 6e  regate)!=0 ) con
301f0 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
30200 74 28 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42  t( pSub->pGroupB
30210 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  y==0 );..    /* 
30220 49 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  If the outer que
30230 72 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 22 63  ry contains a "c
30240 6f 6d 70 6c 65 78 22 20 72 65 73 75 6c 74 20 73  omplex" result s
30250 65 74 20 28 74 68 61 74 20 69 73 2c 0a 20 20 20  et (that is,.   
30260 20 2a 2a 20 69 66 20 74 68 65 20 72 65 73 75 6c   ** if the resul
30270 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74  t set of the out
30280 65 72 20 71 75 65 72 79 20 75 73 65 73 20 66 75  er query uses fu
30290 6e 63 74 69 6f 6e 73 20 6f 72 20 73 75 62 71 75  nctions or subqu
302a0 65 72 69 65 73 29 0a 20 20 20 20 2a 2a 20 61 6e  eries).    ** an
302b0 64 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  d if the subquer
302c0 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 4f 52  y contains an OR
302d0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
302e0 64 20 69 66 0a 20 20 20 20 2a 2a 20 69 74 20 77  d if.    ** it w
302f0 69 6c 6c 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74  ill be implement
30300 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69  ed as a co-routi
30310 6e 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  ne, then do not 
30320 66 6c 61 74 74 65 6e 2e 20 20 54 68 69 73 0a 20  flatten.  This. 
30330 20 20 20 2a 2a 20 72 65 73 74 72 69 63 74 69 6f     ** restrictio
30340 6e 20 61 6c 6c 6f 77 73 20 53 51 4c 20 63 6f 6e  n allows SQL con
30350 73 74 72 75 63 74 73 20 6c 69 6b 65 20 74 68 69  structs like thi
30360 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
30370 20 20 53 45 4c 45 43 54 20 65 78 70 65 6e 73 69    SELECT expensi
30380 76 65 5f 66 75 6e 63 74 69 6f 6e 28 78 29 0a 20  ve_function(x). 
30390 20 20 20 2a 2a 20 20 20 20 46 52 4f 4d 20 28 53     **    FROM (S
303a0 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62  ELECT x FROM tab
303b0 20 4f 52 44 45 52 20 42 59 20 79 20 4c 49 4d 49   ORDER BY y LIMI
303c0 54 20 31 30 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  T 10);.    **.  
303d0 20 20 2a 2a 20 54 68 65 20 65 78 70 65 6e 73 69    ** The expensi
303e0 76 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69 73  ve_function() is
303f0 20 6f 6e 6c 79 20 63 6f 6d 70 75 74 65 64 20 6f   only computed o
30400 6e 20 74 68 65 20 31 30 20 72 6f 77 73 20 74 68  n the 10 rows th
30410 61 74 0a 20 20 20 20 2a 2a 20 61 72 65 20 6f 75  at.    ** are ou
30420 74 70 75 74 2c 20 72 61 74 68 65 72 20 74 68 61  tput, rather tha
30430 6e 20 65 76 65 72 79 20 72 6f 77 20 6f 66 20 74  n every row of t
30440 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a  he table..    **
30450 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 71 75  .    ** The requ
30460 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65  irement that the
30470 20 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 76   outer query hav
30480 65 20 61 20 63 6f 6d 70 6c 65 78 20 72 65 73 75  e a complex resu
30490 6c 74 20 73 65 74 0a 20 20 20 20 2a 2a 20 6d 65  lt set.    ** me
304a0 61 6e 73 20 74 68 61 74 20 66 6c 61 74 74 65 6e  ans that flatten
304b0 69 6e 67 20 64 6f 65 73 20 6f 63 63 75 72 20 6f  ing does occur o
304c0 6e 20 73 69 6d 70 6c 65 72 20 53 51 4c 20 63 6f  n simpler SQL co
304d0 6e 73 74 72 61 69 6e 74 73 20 77 69 74 68 6f 75  nstraints withou
304e0 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 78 70  t.    ** the exp
304f0 65 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28  ensive_function(
30500 29 20 6c 69 6b 65 3a 0a 20 20 20 20 2a 2a 0a 20  ) like:.    **. 
30510 20 20 20 2a 2a 20 20 53 45 4c 45 43 54 20 78 20     **  SELECT x 
30520 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 20 46  FROM (SELECT x F
30530 52 4f 4d 20 74 61 62 20 4f 52 44 45 52 20 42 59  ROM tab ORDER BY
30540 20 79 20 4c 49 4d 49 54 20 31 30 29 3b 0a 20 20   y LIMIT 10);.  
30550 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75    */.    if( pSu
30560 62 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 0a 20  b->pOrderBy!=0. 
30570 20 20 20 20 26 26 20 69 3d 3d 30 0a 20 20 20 20      && i==0.    
30580 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   && (p->selFlags
30590 20 26 20 53 46 5f 43 6f 6d 70 6c 65 78 52 65 73   & SF_ComplexRes
305a0 75 6c 74 29 21 3d 30 0a 20 20 20 20 20 26 26 20  ult)!=0.     && 
305b0 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d  (pTabList->nSrc=
305c0 3d 31 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  =1.         || (
305d0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66  pTabList->a[1].f
305e0 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f 4c  g.jointype&(JT_L
305f0 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d  EFT|JT_CROSS))!=
30600 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0).    ){.      
30610 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
30620 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e  .    if( flatten
30630 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c  Subquery(pParse,
30640 20 70 2c 20 69 2c 20 69 73 41 67 67 29 20 29 7b   p, i, isAgg) ){
30650 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73  .      /* This s
30660 75 62 71 75 65 72 79 20 63 61 6e 20 62 65 20 61  ubquery can be a
30670 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 69 74 73  bsorbed into its
30680 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20   parent. */.    
30690 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a    i = -1;.    }.
306a0 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70      pTabList = p
306b0 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20  ->pSrc;.    if( 
306c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
306d0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
306e0 6e 64 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e  nd;.    if( !Ign
306f0 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44  orableOrderby(pD
30700 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 73 53  est) ){.      sS
30710 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70  ort.pOrderBy = p
30720 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
30730 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  }.  }.#endif..#i
30740 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
30750 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
30760 54 0a 20 20 2f 2a 20 48 61 6e 64 6c 65 20 63 6f  T.  /* Handle co
30770 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74  mpound SELECT st
30780 61 74 65 6d 65 6e 74 73 20 75 73 69 6e 67 20 74  atements using t
30790 68 65 20 73 65 70 61 72 61 74 65 20 6d 75 6c 74  he separate mult
307a0 69 53 65 6c 65 63 74 28 29 0a 20 20 2a 2a 20 70  iSelect().  ** p
307b0 72 6f 63 65 64 75 72 65 2e 0a 20 20 2a 2f 0a 20  rocedure..  */. 
307c0 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
307d0 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69  {.    rc = multi
307e0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
307f0 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 65 78  , pDest);.    ex
30800 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
30810 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
30820 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63  d, iRestoreSelec
30830 74 49 64 29 3b 0a 23 69 66 20 53 45 4c 45 43 54  tId);.#if SELECT
30840 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
30850 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c    SELECTTRACE(1,
30860 70 50 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 63  pParse,p,("end c
30870 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 70  ompound-select p
30880 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a  rocessing\n"));.
30890 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
308a0 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
308b0 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20  ..  /* For each 
308c0 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d  term in the FROM
308d0 20 63 6c 61 75 73 65 2c 20 64 6f 20 74 77 6f 20   clause, do two 
308e0 74 68 69 6e 67 73 3a 0a 20 20 2a 2a 20 28 31 29  things:.  ** (1)
308f0 20 41 75 74 68 6f 72 69 7a 65 64 20 75 6e 72 65   Authorized unre
30900 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 73 0a  ferenced tables.
30910 20 20 2a 2a 20 28 32 29 20 47 65 6e 65 72 61 74    ** (2) Generat
30920 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73  e code for all s
30930 75 62 2d 71 75 65 72 69 65 73 0a 20 20 2a 2f 0a  ub-queries.  */.
30940 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
30950 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
30960 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
30970 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
30980 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
30990 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44  [i];.    SelectD
309a0 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65  est dest;.    Se
309b0 6c 65 63 74 20 2a 70 53 75 62 3b 0a 23 69 66 20  lect *pSub;.#if 
309c0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
309d0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
309e0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
309f0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 20  E_OMIT_VIEW).   
30a00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61   const char *zSa
30a10 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a  vedAuthContext;.
30a20 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
30a30 73 73 75 65 20 53 51 4c 49 54 45 5f 52 45 41 44  ssue SQLITE_READ
30a40 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 73 20   authorizations 
30a50 77 69 74 68 20 61 20 66 61 6b 65 20 63 6f 6c 75  with a fake colu
30a60 6d 6e 20 6e 61 6d 65 20 66 6f 72 20 61 6e 79 0a  mn name for any.
30a70 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 74 68      ** tables th
30a80 61 74 20 61 72 65 20 72 65 66 65 72 65 6e 63 65  at are reference
30a90 64 20 62 75 74 20 66 72 6f 6d 20 77 68 69 63 68  d but from which
30aa0 20 6e 6f 20 76 61 6c 75 65 73 20 61 72 65 20 65   no values are e
30ab0 78 74 72 61 63 74 65 64 2e 0a 20 20 20 20 2a 2a  xtracted..    **
30ac0 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 65   Examples of whe
30ad0 72 65 20 74 68 65 73 65 20 6b 69 6e 64 73 20 6f  re these kinds o
30ae0 66 20 6e 75 6c 6c 20 53 51 4c 49 54 45 5f 52 45  f null SQLITE_RE
30af0 41 44 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  AD authorization
30b00 73 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 6f  s.    ** would o
30b10 63 63 75 72 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  ccur:.    **.   
30b20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63   **     SELECT c
30b30 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b  ount(*) FROM t1;
30b40 20 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52 45 41     -- SQLITE_REA
30b50 44 20 74 31 2e 22 22 0a 20 20 20 20 2a 2a 20 20  D t1."".    **  
30b60 20 20 20 53 45 4c 45 43 54 20 74 31 2e 2a 20 46     SELECT t1.* F
30b70 52 4f 4d 20 74 31 2c 20 74 32 3b 20 20 20 2d 2d  ROM t1, t2;   --
30b80 20 53 51 4c 49 54 45 5f 52 45 41 44 20 74 32 2e   SQLITE_READ t2.
30b90 22 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  "".    **.    **
30ba0 20 54 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e   The fake column
30bb0 20 6e 61 6d 65 20 69 73 20 61 6e 20 65 6d 70 74   name is an empt
30bc0 79 20 73 74 72 69 6e 67 2e 20 20 49 74 20 69 73  y string.  It is
30bd0 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20   possible for a 
30be0 74 61 62 6c 65 20 74 6f 0a 20 20 20 20 2a 2a 20  table to.    ** 
30bf0 68 61 76 65 20 61 20 63 6f 6c 75 6d 6e 20 6e 61  have a column na
30c00 6d 65 64 20 62 79 20 74 68 65 20 65 6d 70 74 79  med by the empty
30c10 20 73 74 72 69 6e 67 2c 20 69 6e 20 77 68 69 63   string, in whic
30c20 68 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20  h case there is 
30c30 6e 6f 20 77 61 79 20 74 6f 0a 20 20 20 20 2a 2a  no way to.    **
30c40 20 64 69 73 74 69 6e 67 75 69 73 68 20 62 65 74   distinguish bet
30c50 77 65 65 6e 20 61 6e 20 75 6e 72 65 66 65 72 65  ween an unrefere
30c60 6e 63 65 64 20 74 61 62 6c 65 20 61 6e 64 20 61  nced table and a
30c70 6e 20 61 63 74 75 61 6c 20 72 65 66 65 72 65 6e  n actual referen
30c80 63 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  ce to the.    **
30c90 20 22 22 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 20   "" column. The 
30ca0 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20  original design 
30cb0 77 61 73 20 66 6f 72 20 74 68 65 20 66 61 6b 65  was for the fake
30cc0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 74 6f 20   column name to 
30cd0 62 65 20 61 20 4e 55 4c 4c 2c 0a 20 20 20 20 2a  be a NULL,.    *
30ce0 2a 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65  * which would be
30cf0 20 75 6e 61 6d 62 69 67 75 6f 75 73 2e 20 20 42   unambiguous.  B
30d00 75 74 20 6c 65 67 61 63 79 20 61 75 74 68 6f 72  ut legacy author
30d10 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b  ization callback
30d20 73 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20 61  s might.    ** a
30d30 73 73 75 6d 65 20 74 68 65 20 63 6f 6c 75 6d 6e  ssume the column
30d40 20 6e 61 6d 65 20 69 73 20 6e 6f 6e 2d 4e 55 4c   name is non-NUL
30d50 4c 20 61 6e 64 20 73 65 67 66 61 75 6c 74 2e 20  L and segfault. 
30d60 20 54 68 65 20 75 73 65 20 6f 66 20 61 6e 20 65   The use of an e
30d70 6d 70 74 79 0a 20 20 20 20 2a 2a 20 73 74 72 69  mpty.    ** stri
30d80 6e 67 20 66 6f 72 20 74 68 65 20 66 61 6b 65 20  ng for the fake 
30d90 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 73 65 65 6d  column name seem
30da0 73 20 73 61 66 65 72 2e 0a 20 20 20 20 2a 2f 0a  s safer..    */.
30db0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 63      if( pItem->c
30dc0 6f 6c 55 73 65 64 3d 3d 30 20 29 7b 0a 20 20 20  olUsed==0 ){.   
30dd0 20 20 20 73 71 6c 69 74 65 33 41 75 74 68 43 68     sqlite3AuthCh
30de0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
30df0 54 45 5f 52 45 41 44 2c 20 70 49 74 65 6d 2d 3e  TE_READ, pItem->
30e00 7a 4e 61 6d 65 2c 20 22 22 2c 20 70 49 74 65 6d  zName, "", pItem
30e10 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
30e20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
30e30 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
30e40 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
30e50 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
30e60 56 49 45 57 29 0a 20 20 20 20 2f 2a 20 47 65 6e  VIEW).    /* Gen
30e70 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
30e80 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20 69  ll sub-queries i
30e90 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
30ea0 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 53 75  e.    */.    pSu
30eb0 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  b = pItem->pSele
30ec0 63 74 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62  ct;.    if( pSub
30ed0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
30ee0 0a 20 20 20 20 2f 2a 20 53 6f 6d 65 74 69 6d 65  .    /* Sometime
30ef0 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61  s the code for a
30f00 20 73 75 62 71 75 65 72 79 20 77 69 6c 6c 20 62   subquery will b
30f10 65 20 67 65 6e 65 72 61 74 65 64 20 6d 6f 72 65  e generated more
30f20 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63   than.    ** onc
30f30 65 2c 20 69 66 20 74 68 65 20 73 75 62 71 75 65  e, if the subque
30f40 72 79 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ry is part of th
30f50 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
30f60 6e 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20  n a LEFT JOIN,. 
30f70 20 20 20 2a 2a 20 66 6f 72 20 65 78 61 6d 70 6c     ** for exampl
30f80 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  e.  In that case
30f90 2c 20 64 6f 20 6e 6f 74 20 72 65 67 65 6e 65 72  , do not regener
30fa0 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ate the code to 
30fb0 6d 61 6e 69 66 65 73 74 0a 20 20 20 20 2a 2a 20  manifest.    ** 
30fc0 61 20 76 69 65 77 20 6f 72 20 74 68 65 20 63 6f  a view or the co
30fd0 2d 72 6f 75 74 69 6e 65 20 74 6f 20 69 6d 70 6c  -routine to impl
30fe0 65 6d 65 6e 74 20 61 20 76 69 65 77 2e 20 20 54  ement a view.  T
30ff0 68 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63  he first instanc
31000 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 75 66 66  e.    ** is suff
31010 69 63 69 65 6e 74 2c 20 74 68 6f 75 67 68 20 74  icient, though t
31020 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f  he subroutine to
31030 20 6d 61 6e 69 66 65 73 74 20 74 68 65 20 76 69   manifest the vi
31040 65 77 20 64 6f 65 73 20 6e 65 65 64 0a 20 20 20  ew does need.   
31050 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65   ** to be invoke
31060 64 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20  d again. */.    
31070 69 66 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  if( pItem->addrF
31080 69 6c 6c 53 75 62 20 29 7b 0a 20 20 20 20 20 20  illSub ){.      
31090 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69  if( pItem->fg.vi
310a0 61 43 6f 72 6f 75 74 69 6e 65 3d 3d 30 20 29 7b  aCoroutine==0 ){
310b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
310c0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
310d0 6d 61 6e 69 66 65 73 74 73 20 74 68 65 20 76 69  manifests the vi
310e0 65 77 20 6d 69 67 68 74 20 62 65 20 61 20 6f 6e  ew might be a on
310f0 65 2d 74 69 6d 65 20 72 6f 75 74 69 6e 65 2c 0a  e-time routine,.
31100 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 69 74          ** or it
31110 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62   might need to b
31120 65 20 72 65 72 75 6e 20 6f 6e 20 65 61 63 68 20  e rerun on each 
31130 69 74 65 72 61 74 69 6f 6e 20 62 65 63 61 75 73  iteration becaus
31140 65 20 69 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  e it.        ** 
31150 65 6e 63 6f 64 65 73 20 61 20 63 6f 72 72 65 6c  encodes a correl
31160 61 74 65 64 20 73 75 62 71 75 65 72 79 2e 20 2a  ated subquery. *
31170 2f 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  /.        testca
31180 73 65 28 20 73 71 6c 69 74 65 33 56 64 62 65 47  se( sqlite3VdbeG
31190 65 74 4f 70 28 76 2c 20 70 49 74 65 6d 2d 3e 61  etOp(v, pItem->a
311a0 64 64 72 46 69 6c 6c 53 75 62 29 2d 3e 6f 70 63  ddrFillSub)->opc
311b0 6f 64 65 3d 3d 4f 50 5f 4f 6e 63 65 20 29 3b 0a  ode==OP_Once );.
311c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
311d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
311e0 47 6f 73 75 62 2c 20 70 49 74 65 6d 2d 3e 72 65  Gosub, pItem->re
311f0 67 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e  gReturn, pItem->
31200 61 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20  addrFillSub);.  
31210 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74      }.      cont
31220 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  inue;.    }..   
31230 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61   /* Increment Pa
31240 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74  rse.nHeight by t
31250 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68 65  he height of the
31260 20 6c 61 72 67 65 73 74 20 65 78 70 72 65 73 73   largest express
31270 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20  ion.    ** tree 
31280 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20 74  referred to by t
31290 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20  his, the parent 
312a0 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c  select. The chil
312b0 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20  d select.    ** 
312c0 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72  may contain expr
312d0 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20  ession trees of 
312e0 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28  at most.    ** (
312f0 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
31300 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69  DEPTH-Parse.nHei
31310 67 68 74 29 20 68 65 69 67 68 74 2e 20 54 68 69  ght) height. Thi
31320 73 20 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a  s is a bit.    *
31330 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74  * more conservat
31340 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61  ive than necessa
31350 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73  ry, but much eas
31360 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69  ier than enforci
31370 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61  ng.    ** an exa
31380 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f  ct limit..    */
31390 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65  .    pParse->nHe
313a0 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53  ight += sqlite3S
313b0 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28  electExprHeight(
313c0 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65  p);..    /* Make
313d0 20 63 6f 70 69 65 73 20 6f 66 20 63 6f 6e 73 74   copies of const
313e0 61 6e 74 20 57 48 45 52 45 2d 63 6c 61 75 73 65  ant WHERE-clause
313f0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6f 75   terms in the ou
31400 74 65 72 20 71 75 65 72 79 20 64 6f 77 6e 0a 20  ter query down. 
31410 20 20 20 2a 2a 20 69 6e 73 69 64 65 20 74 68 65     ** inside the
31420 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 69 73   subquery.  This
31430 20 63 61 6e 20 68 65 6c 70 20 74 68 65 20 73 75   can help the su
31440 62 71 75 65 72 79 20 74 6f 20 72 75 6e 20 6d 6f  bquery to run mo
31450 72 65 20 65 66 66 69 63 69 65 6e 74 6c 79 2e 0a  re efficiently..
31460 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 4f      */.    if( O
31470 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
31480 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 50 75  ed(db, SQLITE_Pu
31490 73 68 44 6f 77 6e 29 0a 20 20 20 20 20 26 26 20  shDown).     && 
314a0 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72  pushDownWhereTer
314b0 6d 73 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c  ms(pParse, pSub,
314c0 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65   p->pWhere, pIte
314d0 6d 2d 3e 69 43 75 72 73 6f 72 2c 0a 20 20 20 20  m->iCursor,.    
314e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
314f0 20 20 20 20 20 20 20 28 70 49 74 65 6d 2d 3e 66         (pItem->f
31500 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  g.jointype & JT_
31510 4f 55 54 45 52 29 21 3d 30 29 0a 20 20 20 20 29  OUTER)!=0).    )
31520 7b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  {.#if SELECTTRAC
31530 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20  E_ENABLED.      
31540 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
31550 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29  tTrace & 0x100 )
31560 7b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  {.        SELECT
31570 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72  TRACE(0x100,pPar
31580 73 65 2c 70 2c 28 22 41 66 74 65 72 20 57 48 45  se,p,("After WHE
31590 52 45 2d 63 6c 61 75 73 65 20 70 75 73 68 2d 64  RE-clause push-d
315a0 6f 77 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20  own:\n"));.     
315b0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
315c0 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
315d0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
315e0 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
315f0 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
31600 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x100,pParse,p,("
31610 50 75 73 68 2d 64 6f 77 6e 20 6e 6f 74 20 70 6f  Push-down not po
31620 73 73 69 62 6c 65 5c 6e 22 29 29 3b 0a 20 20 20  ssible\n"));.   
31630 20 7d 0a 0a 20 20 20 20 7a 53 61 76 65 64 41 75   }..    zSavedAu
31640 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72  thContext = pPar
31650 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
31660 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41  ;.    pParse->zA
31670 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 49 74  uthContext = pIt
31680 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20  em->zName;..    
31690 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
316a0 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
316b0 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 2a  e subquery.    *
316c0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 75 62  *.    ** The sub
316d0 71 75 65 72 79 20 69 73 20 69 6d 70 6c 65 6d 65  query is impleme
316e0 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75  nted as a co-rou
316f0 74 69 6e 65 20 69 66 20 74 68 65 20 73 75 62 71  tine if the subq
31700 75 65 72 79 20 69 73 0a 20 20 20 20 2a 2a 20 67  uery is.    ** g
31710 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
31720 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 28  the outer loop (
31730 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  so that it does 
31740 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20  not need to be. 
31750 20 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 6d     ** computed m
31760 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 29 0a 20  ore than once). 
31770 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 4f 44     **.    ** TOD
31780 4f 3a 20 41 72 65 20 74 68 65 72 65 20 6f 74 68  O: Are there oth
31790 65 72 20 72 65 61 73 6f 6e 73 20 62 65 73 69 64  er reasons besid
317a0 65 20 28 31 29 20 74 6f 20 75 73 65 20 61 20 63  e (1) to use a c
317b0 6f 2d 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  o-routine.    **
317c0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 3f   implementation?
317d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
317e0 69 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  i==0.     && (pT
317f0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a  abList->nSrc==1.
31800 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
31810 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66  pTabList->a[1].f
31820 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f 4c  g.jointype&(JT_L
31830 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d  EFT|JT_CROSS))!=
31840 30 29 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20  0)  /* (1) */.  
31850 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6d    ){.      /* Im
31860 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f 75  plement a co-rou
31870 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72  tine that will r
31880 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72  eturn a single r
31890 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  ow of the result
318a0 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e  .      ** set on
318b0 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e   each invocation
318c0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
318d0 20 69 6e 74 20 61 64 64 72 54 6f 70 20 3d 20 73   int addrTop = s
318e0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
318f0 74 41 64 64 72 28 76 29 2b 31 3b 0a 20 20 20 20  tAddr(v)+1;.    
31900 20 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72   .      pItem->r
31910 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
31920 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
31930 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
31940 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
31950 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72  outine, pItem->r
31960 65 67 52 65 74 75 72 6e 2c 20 30 2c 20 61 64 64  egReturn, 0, add
31970 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 56 64 62  rTop);.      Vdb
31980 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
31990 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
319a0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 70  zName));.      p
319b0 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
319c0 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20 20  b = addrTop;.   
319d0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
319e0 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
319f0 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70  SRT_Coroutine, p
31a00 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
31a10 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
31a20 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d  etInteger(pItem-
31a30 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29  >iSelectId, (u8)
31a40 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
31a50 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71  ectId);.      sq
31a60 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
31a70 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
31a80 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70  ;.      pItem->p
31a90 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
31aa0 3d 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52  = pSub->nSelectR
31ab0 6f 77 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  ow;.      pItem-
31ac0 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
31ad0 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65   = 1;.      pIte
31ae0 6d 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 64  m->regResult = d
31af0 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 20 20 20  est.iSdst;.     
31b00 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43   sqlite3VdbeEndC
31b10 6f 72 6f 75 74 69 6e 65 28 76 2c 20 70 49 74 65  oroutine(v, pIte
31b20 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  m->regReturn);. 
31b30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
31b40 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
31b50 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 73 71  Top-1);.      sq
31b60 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65  lite3ClearTempRe
31b70 67 43 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a  gCache(pParse);.
31b80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31b90 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
31ba0 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77  ubroutine that w
31bb0 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68 65  ill fill an ephe
31bc0 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 74 68  meral table with
31bd0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  .      ** the co
31be0 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 73 75  ntent of this su
31bf0 62 71 75 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e  bquery.  pItem->
31c00 61 64 64 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c  addrFillSub will
31c10 20 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20   point.      ** 
31c20 74 6f 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  to the address o
31c30 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  f the generated 
31c40 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 70 49 74  subroutine.  pIt
31c50 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20 20  em->regReturn.  
31c60 20 20 20 20 2a 2a 20 69 73 20 61 20 72 65 67 69      ** is a regi
31c70 73 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 74  ster allocated t
31c80 6f 20 68 6f 6c 64 20 74 68 65 20 73 75 62 72 6f  o hold the subro
31c90 75 74 69 6e 65 20 72 65 74 75 72 6e 20 61 64 64  utine return add
31ca0 72 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ress.      */.  
31cb0 20 20 20 20 69 6e 74 20 74 6f 70 41 64 64 72 3b      int topAddr;
31cc0 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 41  .      int onceA
31cd0 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ddr = 0;.      i
31ce0 6e 74 20 72 65 74 41 64 64 72 3b 0a 20 20 20 20  nt retAddr;.    
31cf0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
31d00 5f 69 74 65 6d 20 2a 70 50 72 69 6f 72 3b 0a 0a  _item *pPrior;..
31d10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
31d20 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
31d30 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74  ==0 );.      pIt
31d40 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20  em->regReturn = 
31d50 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
31d60 20 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20        topAddr = 
31d70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
31d80 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
31d90 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65   0, pItem->regRe
31da0 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74  turn);.      pIt
31db0 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
31dc0 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20  = topAddr+1;.   
31dd0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
31de0 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30  .isCorrelated==0
31df0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
31e00 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
31e10 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64  s not correlated
31e20 20 61 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e   and if we are n
31e30 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20  ot inside of.   
31e40 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65       ** a trigge
31e50 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20  r, then we only 
31e60 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  need to compute 
31e70 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
31e80 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 20 20   subquery.      
31e90 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20    ** once. */.  
31ea0 20 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d        onceAddr =
31eb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
31ec0 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20  p0(v, OP_Once); 
31ed0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
31ee0 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
31ef0 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69  ment((v, "materi
31f00 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70  alize \"%s\"", p
31f10 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
31f20 65 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  e));.      }else
31f30 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4e 6f  {.        VdbeNo
31f40 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d  opComment((v, "m
31f50 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c  aterialize \"%s\
31f60 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  "", pItem->pTab-
31f70 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
31f80 7d 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d  }.      pPrior =
31f90 20 69 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28   isSelfJoinView(
31fa0 70 54 61 62 4c 69 73 74 2c 20 70 49 74 65 6d 29  pTabList, pItem)
31fb0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69  ;.      if( pPri
31fc0 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  or ){.        sq
31fd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
31fe0 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70  v, OP_OpenDup, p
31ff0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70  Item->iCursor, p
32000 50 72 69 6f 72 2d 3e 69 43 75 72 73 6f 72 29 3b  Prior->iCursor);
32010 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e  .        explain
32020 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d  SetInteger(pItem
32030 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 70 50 72  ->iSelectId, pPr
32040 69 6f 72 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b  ior->iSelectId);
32050 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
32060 20 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74   pPrior->pSelect
32070 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  !=0 );.        p
32080 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  Sub->nSelectRow 
32090 3d 20 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63  = pPrior->pSelec
320a0 74 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  t->nSelectRow;. 
320b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
320c0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
320d0 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
320e0 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70   SRT_EphemTab, p
320f0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
32100 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53          explainS
32110 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d  etInteger(pItem-
32120 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29  >iSelectId, (u8)
32130 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
32140 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 20 20  ectId);.        
32150 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
32160 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73  arse, pSub, &des
32170 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
32180 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e    pItem->pTab->n
32190 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53 75 62  RowLogEst = pSub
321a0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
321b0 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64 64 72      if( onceAddr
321c0 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75   ) sqlite3VdbeJu
321d0 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65 41 64  mpHere(v, onceAd
321e0 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74 41 64  dr);.      retAd
321f0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
32200 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
32210 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  urn, pItem->regR
32220 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64  eturn);.      Vd
32230 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  beComment((v, "e
32240 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70  nd %s", pItem->p
32250 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
32260 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
32270 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70 41 64  hangeP1(v, topAd
32280 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a 20 20  dr, retAddr);.  
32290 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72      sqlite3Clear
322a0 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61  TempRegCache(pPa
322b0 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rse);.    }.    
322c0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
322d0 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65  iled ) goto sele
322e0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70 50 61 72  ct_end;.    pPar
322f0 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73  se->nHeight -= s
32300 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
32310 48 65 69 67 68 74 28 70 29 3b 0a 20 20 20 20 70  Height(p);.    p
32320 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
32330 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68  ext = zSavedAuth
32340 43 6f 6e 74 65 78 74 3b 0a 23 65 6e 64 69 66 0a  Context;.#endif.
32350 20 20 7d 0a 0a 20 20 2f 2a 20 56 61 72 69 6f 75    }..  /* Variou
32360 73 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  s elements of th
32370 65 20 53 45 4c 45 43 54 20 63 6f 70 69 65 64 20  e SELECT copied 
32380 69 6e 74 6f 20 6c 6f 63 61 6c 20 76 61 72 69 61  into local varia
32390 62 6c 65 73 20 66 6f 72 0a 20 20 2a 2a 20 63 6f  bles for.  ** co
323a0 6e 76 65 6e 69 65 6e 63 65 20 2a 2f 0a 20 20 70  nvenience */.  p
323b0 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
323c0 74 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d  t;.  pWhere = p-
323d0 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75  >pWhere;.  pGrou
323e0 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
323f0 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70  y;.  pHaving = p
32400 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44 69  ->pHaving;.  sDi
32410 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20  stinct.isTnct = 
32420 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
32430 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a  F_Distinct)!=0;.
32440 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
32450 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
32460 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
32470 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20  e & 0x400 ){.   
32480 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34   SELECTTRACE(0x4
32490 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66  00,pParse,p,("Af
324a0 74 65 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61  ter all FROM-cla
324b0 75 73 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22  use analysis:\n"
324c0 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  ));.    sqlite3T
324d0 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
324e0 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
324f0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
32500 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50  E_COUNTOFVIEW_OP
32510 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  TIMIZATION.  if(
32520 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
32530 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
32540 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72 7c 53  QueryFlattener|S
32550 51 4c 49 54 45 5f 43 6f 75 6e 74 4f 66 56 69 65  QLITE_CountOfVie
32560 77 29 0a 20 20 20 26 26 20 63 6f 75 6e 74 4f 66  w).   && countOf
32570 56 69 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  ViewOptimization
32580 28 70 50 61 72 73 65 2c 20 70 29 0a 20 20 29 7b  (pParse, p).  ){
32590 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
325a0 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
325b0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
325c0 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
325d0 69 73 74 3b 0a 20 20 20 20 70 54 61 62 4c 69 73  ist;.    pTabLis
325e0 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 7d  t = p->pSrc;.  }
325f0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
32600 20 74 68 65 20 71 75 65 72 79 20 69 73 20 44 49   the query is DI
32610 53 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f  STINCT with an O
32620 52 44 45 52 20 42 59 20 62 75 74 20 69 73 20 6e  RDER BY but is n
32630 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c  ot an aggregate,
32640 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68   and .  ** if th
32650 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73  e select-list is
32660 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
32670 20 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20   ORDER BY list, 
32680 74 68 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a  then this query.
32690 20 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72    ** can be rewr
326a0 69 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50  itten as a GROUP
326b0 20 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f   BY. In other wo
326c0 72 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a  rds, this:.  **.
326d0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
326e0 44 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f  DISTINCT xyz FRO
326f0 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78  M ... ORDER BY x
32700 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20  yz.  **.  ** is 
32710 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a  transformed to:.
32720 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
32730 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e  LECT xyz FROM ..
32740 2e 20 47 52 4f 55 50 20 42 59 20 78 79 7a 20 4f  . GROUP BY xyz O
32750 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a  RDER BY xyz.  **
32760 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  .  ** The second
32770 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72   form is preferr
32780 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69  ed as a single i
32790 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61  ndex (or temp-ta
327a0 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a  ble) may be .  *
327b0 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20  * used for both 
327c0 74 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64  the ORDER BY and
327d0 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
327e0 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61  sing. As origina
327f0 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65  lly .  ** writte
32800 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75 73 74  n the query must
32810 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c   use a temp-tabl
32820 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f  e for at least o
32830 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ne of the ORDER 
32840 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53  .  ** BY and DIS
32850 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e  TINCT, and an in
32860 64 65 78 20 6f 72 20 73 65 70 61 72 61 74 65 20  dex or separate 
32870 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74  temp-table for t
32880 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20  he other..  */. 
32890 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
328a0 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
328b0 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
328c0 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20  =SF_Distinct .  
328d0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c   && sqlite3ExprL
328e0 69 73 74 43 6f 6d 70 61 72 65 28 73 53 6f 72 74  istCompare(sSort
328f0 2e 70 4f 72 64 65 72 42 79 2c 20 70 45 4c 69 73  .pOrderBy, pELis
32900 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20  t, -1)==0.  ){. 
32910 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26     p->selFlags &
32920 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a  = ~SF_Distinct;.
32930 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70      pGroupBy = p
32940 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
32950 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
32960 64 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a  db, pEList, 0);.
32970 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68      /* Notice th
32980 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20  at even thought 
32990 53 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20  SF_Distinct has 
329a0 62 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f  been cleared fro
329b0 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20  m p->selFlags,. 
329c0 20 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69     ** the sDisti
329d0 6e 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74  nct.isTnct is st
329e0 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c  ill set.  Hence,
329f0 20 69 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e   isTnct represen
32a00 74 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72  ts the.    ** or
32a10 69 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f  iginal setting o
32a20 66 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63  f the SF_Distinc
32a30 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20  t flag, not the 
32a40 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20  current setting 
32a50 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
32a60 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
32a70 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52  );..#if SELECTTR
32a80 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
32a90 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
32aa0 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29  tTrace & 0x400 )
32ab0 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  {.      SELECTTR
32ac0 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65  ACE(0x400,pParse
32ad0 2c 70 2c 28 22 54 72 61 6e 73 66 6f 72 6d 20 44  ,p,("Transform D
32ae0 49 53 54 49 4e 43 54 20 69 6e 74 6f 20 47 52 4f  ISTINCT into GRO
32af0 55 50 20 42 59 3a 5c 6e 22 29 29 3b 0a 20 20 20  UP BY:\n"));.   
32b00 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
32b10 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
32b20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
32b30 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
32b40 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
32b50 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 63  Y clause, then c
32b60 72 65 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72  reate an ephemer
32b70 61 6c 20 69 6e 64 65 78 20 74 6f 0a 20 20 2a 2a  al index to.  **
32b80 20 64 6f 20 74 68 65 20 73 6f 72 74 69 6e 67 2e   do the sorting.
32b90 20 20 42 75 74 20 74 68 69 73 20 73 6f 72 74 69    But this sorti
32ba0 6e 67 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  ng ephemeral ind
32bb0 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 0a  ex might end up.
32bc0 20 20 2a 2a 20 62 65 69 6e 67 20 75 6e 75 73 65    ** being unuse
32bd0 64 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61  d if the data ca
32be0 6e 20 62 65 20 65 78 74 72 61 63 74 65 64 20 69  n be extracted i
32bf0 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64  n pre-sorted ord
32c00 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 61 74  er..  ** If that
32c10 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
32c20 65 6e 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  en the OP_OpenEp
32c30 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
32c40 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a  ion will be.  **
32c50 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f   changed to an O
32c60 50 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77 65 20 66  P_Noop once we f
32c70 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20 74  igure out that t
32c80 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
32c90 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65 65   is.  ** not nee
32ca0 64 65 64 2e 20 20 54 68 65 20 73 53 6f 72 74 2e  ded.  The sSort.
32cb0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 76 61  addrSortIndex va
32cc0 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
32cd0 6f 20 66 61 63 69 6c 69 74 61 74 65 0a 20 20 2a  o facilitate.  *
32ce0 2a 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20  * that change.. 
32cf0 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e   */.  if( sSort.
32d00 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
32d10 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
32d20 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  o;.    pKeyInfo 
32d30 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
32d40 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 73 53  rList(pParse, sS
32d50 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c  ort.pOrderBy, 0,
32d60 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
32d70 0a 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72  .    sSort.iECur
32d80 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
32d90 61 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e  ab++;.    sSort.
32da0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a  addrSortIndex =.
32db0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
32dc0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
32dd0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20  enEphemeral,.   
32de0 20 20 20 20 20 20 20 73 53 6f 72 74 2e 69 45 43         sSort.iEC
32df0 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72  ursor, sSort.pOr
32e00 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70  derBy->nExpr+1+p
32e10 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c  EList->nExpr, 0,
32e20 0a 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72  .          (char
32e30 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
32e40 45 59 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a  EYINFO.      );.
32e50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f    }else{.    sSo
32e60 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
32e70 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
32e80 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   If the output i
32e90 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61  s destined for a
32ea0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
32eb0 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c  , open that tabl
32ec0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  e..  */.  if( pD
32ed0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
32ee0 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20  EphemTab ){.    
32ef0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
32f00 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
32f10 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53  meral, pDest->iS
32f20 44 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e  DParm, pEList->n
32f30 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Expr);.  }..  /*
32f40 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72   Set the limiter
32f50 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20  ..  */.  iEnd = 
32f60 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
32f70 61 62 65 6c 28 76 29 3b 0a 20 20 69 66 28 20 28  abel(v);.  if( (
32f80 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
32f90 5f 46 69 78 65 64 4c 69 6d 69 74 29 3d 3d 30 20  _FixedLimit)==0 
32fa0 29 7b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  ){.    p->nSelec
32fb0 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20  tRow = 320;  /* 
32fc0 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a  4 billion rows *
32fd0 2f 0a 20 20 7d 0a 20 20 63 6f 6d 70 75 74 65 4c  /.  }.  computeL
32fe0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
32ff0 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a  arse, p, iEnd);.
33000 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d    if( p->iLimit=
33010 3d 30 20 26 26 20 73 53 6f 72 74 2e 61 64 64 72  =0 && sSort.addr
33020 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a  SortIndex>=0 ){.
33030 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
33040 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 73  hangeOpcode(v, s
33050 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
33060 65 78 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  ex, OP_SorterOpe
33070 6e 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f  n);.    sSort.so
33080 72 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46  rtFlags |= SORTF
33090 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20  LAG_UseSorter;. 
330a0 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e   }..  /* Open an
330b0 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
330c0 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
330d0 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20  distinct set..  
330e0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
330f0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
33100 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69  ct ){.    sDisti
33110 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50  nct.tabTnct = pP
33120 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
33130 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72    sDistinct.addr
33140 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Tnct = sqlite3Vd
33150 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
33160 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20  penEphemeral,.  
33170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33180 20 20 20 20 20 20 20 20 20 20 20 73 44 69 73 74             sDist
33190 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c  inct.tabTnct, 0,
331a0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
331b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
331c0 20 28 63 68 61 72 2a 29 6b 65 79 49 6e 66 6f 46   (char*)keyInfoF
331d0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
331e0 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 30 2c  se, p->pEList,0,
331f0 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0),.            
33200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33210 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
33220 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
33230 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55  ngeP5(v, BTREE_U
33240 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 73  NORDERED);.    s
33250 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
33260 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  pe = WHERE_DISTI
33270 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a 20  NCT_UNORDERED;. 
33280 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44 69 73   }else{.    sDis
33290 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20  tinct.eTnctType 
332a0 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
332b0 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66  _NOOP;.  }..  if
332c0 28 20 21 69 73 41 67 67 20 26 26 20 70 47 72 6f  ( !isAgg && pGro
332d0 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  upBy==0 ){.    /
332e0 2a 20 4e 6f 20 61 67 67 72 65 67 61 74 65 20 66  * No aggregate f
332f0 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 20  unctions and no 
33300 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
33310 2a 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72 6c  */.    u16 wctrl
33320 46 6c 61 67 73 20 3d 20 28 73 44 69 73 74 69 6e  Flags = (sDistin
33330 63 74 2e 69 73 54 6e 63 74 20 3f 20 57 48 45 52  ct.isTnct ? WHER
33340 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
33350 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  : 0);.    assert
33360 28 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49  ( WHERE_USE_LIMI
33370 54 3d 3d 53 46 5f 46 69 78 65 64 4c 69 6d 69 74  T==SF_FixedLimit
33380 20 29 3b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61   );.    wctrlFla
33390 67 73 20 7c 3d 20 70 2d 3e 73 65 6c 46 6c 61 67  gs |= p->selFlag
333a0 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d 69  s & SF_FixedLimi
333b0 74 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e  t;..    /* Begin
333c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
333d0 61 6e 2e 20 2a 2f 0a 20 20 20 20 53 45 4c 45 43  an. */.    SELEC
333e0 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c  TTRACE(1,pParse,
333f0 70 2c 28 22 57 68 65 72 65 42 65 67 69 6e 5c 6e  p,("WhereBegin\n
33400 22 29 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20  "));.    pWInfo 
33410 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
33420 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
33430 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 73 53  List, pWhere, sS
33440 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20  ort.pOrderBy,.  
33450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33460 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
33470 70 45 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c 61  pEList, wctrlFla
33480 67 73 2c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  gs, p->nSelectRo
33490 77 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  w);.    if( pWIn
334a0 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
334b0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28  ect_end;.    if(
334c0 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74   sqlite3WhereOut
334d0 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e  putRowCount(pWIn
334e0 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74  fo) < p->nSelect
334f0 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Row ){.      p->
33500 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c  nSelectRow = sql
33510 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52  ite3WhereOutputR
33520 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b  owCount(pWInfo);
33530 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
33540 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
33550 26 26 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  && sqlite3WhereI
33560 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f  sDistinct(pWInfo
33570 29 20 29 7b 0a 20 20 20 20 20 20 73 44 69 73 74  ) ){.      sDist
33580 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d  inct.eTnctType =
33590 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
335a0 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b  istinct(pWInfo);
335b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
335c0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b  Sort.pOrderBy ){
335d0 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42  .      sSort.nOB
335e0 53 61 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65  Sat = sqlite3Whe
335f0 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
33600 66 6f 29 3b 0a 20 20 20 20 20 20 73 53 6f 72 74  fo);.      sSort
33610 2e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f  .bOrderedInnerLo
33620 6f 70 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  op = sqlite3Wher
33630 65 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f  eOrderedInnerLoo
33640 70 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  p(pWInfo);.     
33650 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f 42 53 61   if( sSort.nOBSa
33660 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  t==sSort.pOrderB
33670 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  y->nExpr ){.    
33680 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72      sSort.pOrder
33690 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  By = 0;.      }.
336a0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
336b0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
336c0 68 61 74 20 77 61 73 20 63 72 65 61 74 65 64 20  hat was created 
336d0 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70  by a prior OP_Op
336e0 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20  enEphemeral .   
336f0 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   ** instruction 
33700 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69  ended up not bei
33710 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20  ng needed, then 
33720 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70  change the OP_Op
33730 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20  enEphemeral.    
33740 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f  ** into an OP_No
33750 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  op..    */.    i
33760 66 28 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  f( sSort.addrSor
33770 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 73 53 6f  tIndex>=0 && sSo
33780 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  rt.pOrderBy==0 )
33790 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
337a0 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
337b0 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  v, sSort.addrSor
337c0 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a  tIndex);.    }..
337d0 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73      /* Use the s
337e0 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f  tandard inner lo
337f0 6f 70 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  op. */.    asser
33800 74 28 20 70 2d 3e 70 45 4c 69 73 74 3d 3d 70 45  t( p->pEList==pE
33810 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 65 6c 65  List );.    sele
33820 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
33830 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73 53 6f 72  se, p, -1, &sSor
33840 74 2c 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70  t, &sDistinct, p
33850 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
33860 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
33870 33 57 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61  3WhereContinueLa
33880 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20  bel(pWInfo),.   
33890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
338a0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65   sqlite3WhereBre
338b0 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29  akLabel(pWInfo))
338c0 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68  ;..    /* End th
338d0 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20  e database scan 
338e0 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
338f0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
33900 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73  (pWInfo);.  }els
33910 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  e{.    /* This c
33920 61 73 65 20 77 68 65 6e 20 74 68 65 72 65 20 65  ase when there e
33930 78 69 73 74 20 61 67 67 72 65 67 61 74 65 20 66  xist aggregate f
33940 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20 47 52  unctions or a GR
33950 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 20 20  OUP BY clause.  
33960 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a    ** or both */.
33970 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
33980 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20  sNC;    /* Name 
33990 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63  context for proc
339a0 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65  essing aggregate
339b0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
339c0 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20      int iAMem;  
339d0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
339e0 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
339f0 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74   storing current
33a00 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20   GROUP BY */.   
33a10 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20   int iBMem;     
33a20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
33a30 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72  m address for pr
33a40 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20  evious GROUP BY 
33a50 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46  */.    int iUseF
33a60 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65  lag;       /* Me
33a70 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e  m address holdin
33a80 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e  g flag indicatin
33a90 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a  g that at least.
33aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33ab0 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72          ** one r
33ac0 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  ow of the input 
33ad0 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f  to the aggregato
33ae0 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20  r has been.     
33af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b00 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20     ** processed 
33b10 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72  */.    int iAbor
33b20 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65  tFlag;     /* Me
33b30 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20  m address which 
33b40 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f  causes query abo
33b50 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a  rt if positive *
33b60 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42  /.    int groupB
33b70 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77  ySort;    /* Row
33b80 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72  s come from sour
33b90 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ce in GROUP BY o
33ba0 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rder */.    int 
33bb0 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20  addrEnd;        
33bc0 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73  /* End of proces
33bd0 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45  sing for this SE
33be0 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20  LECT */.    int 
33bf0 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20 20 20  sortPTab = 0;   
33c00 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65 20 75  /* Pseudotable u
33c10 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20 73 6f  sed to decode so
33c20 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f  rting results */
33c30 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74  .    int sortOut
33c40 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70   = 0;    /* Outp
33c50 75 74 20 72 65 67 69 73 74 65 72 20 66 72 6f 6d  ut register from
33c60 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20   the sorter */. 
33c70 20 20 20 69 6e 74 20 6f 72 64 65 72 42 79 47 72     int orderByGr
33c80 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69  p = 0; /* True i
33c90 66 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61  f the GROUP BY a
33ca0 6e 64 20 4f 52 44 45 52 20 42 59 20 61 72 65 20  nd ORDER BY are 
33cb0 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a 20 20 20  the same */..   
33cc0 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61   /* Remove any a
33cd0 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62  nd all aliases b
33ce0 65 74 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c  etween the resul
33cf0 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20  t set and the.  
33d00 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c    ** GROUP BY cl
33d10 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ause..    */.   
33d20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
33d30 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20  .      int k;   
33d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d50 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
33d60 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74  nter */.      st
33d70 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
33d80 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46  em *pItem;  /* F
33d90 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
33da0 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20  expression in a 
33db0 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66  list */..      f
33dc0 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  or(k=p->pEList->
33dd0 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e  nExpr, pItem=p->
33de0 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20  pEList->a; k>0; 
33df0 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  k--, pItem++){. 
33e00 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e         pItem->u.
33e10 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  x.iAlias = 0;.  
33e20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
33e30 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  k=pGroupBy->nExp
33e40 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42  r, pItem=pGroupB
33e50 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20  y->a; k>0; k--, 
33e60 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
33e70 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c    pItem->u.x.iAl
33e80 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ias = 0;.      }
33e90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 36  .      assert( 6
33ea0 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  6==sqlite3LogEst
33eb0 28 31 30 30 29 20 29 3b 0a 20 20 20 20 20 20 69  (100) );.      i
33ec0 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
33ed0 3e 36 36 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  >66 ) p->nSelect
33ee0 52 6f 77 20 3d 20 36 36 3b 0a 20 20 20 20 7d 65  Row = 66;.    }e
33ef0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
33f00 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  t( 0==sqlite3Log
33f10 45 73 74 28 31 29 20 29 3b 0a 20 20 20 20 20 20  Est(1) );.      
33f20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
33f30 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
33f40 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74   If there is bot
33f50 68 20 61 20 47 52 4f 55 50 20 42 59 20 61 6e 64  h a GROUP BY and
33f60 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
33f70 75 73 65 20 61 6e 64 20 74 68 65 79 20 61 72 65  use and they are
33f80 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74 69 63 61  .    ** identica
33f90 6c 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 62  l, then it may b
33fa0 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 69  e possible to di
33fb0 73 61 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20  sable the ORDER 
33fc0 42 59 20 63 6c 61 75 73 65 20 0a 20 20 20 20 2a  BY clause .    *
33fd0 2a 20 6f 6e 20 74 68 65 20 67 72 6f 75 6e 64 73  * on the grounds
33fe0 20 74 68 61 74 20 74 68 65 20 47 52 4f 55 50 20   that the GROUP 
33ff0 42 59 20 77 69 6c 6c 20 63 61 75 73 65 20 65 6c  BY will cause el
34000 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f  ements to come o
34010 75 74 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  ut .    ** in th
34020 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2e  e correct order.
34030 20 49 74 20 61 6c 73 6f 20 6d 61 79 20 6e 6f 74   It also may not
34040 20 2d 20 74 68 65 20 47 52 4f 55 50 20 42 59 20   - the GROUP BY 
34050 6d 69 67 68 74 20 75 73 65 20 61 0a 20 20 20 20  might use a.    
34060 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  ** database inde
34070 78 20 74 68 61 74 20 63 61 75 73 65 73 20 72 6f  x that causes ro
34080 77 73 20 74 6f 20 62 65 20 67 72 6f 75 70 65 64  ws to be grouped
34090 20 74 6f 67 65 74 68 65 72 20 61 73 20 72 65 71   together as req
340a0 75 69 72 65 64 0a 20 20 20 20 2a 2a 20 62 75 74  uired.    ** but
340b0 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 73 6f   not actually so
340c0 72 74 65 64 2e 20 45 69 74 68 65 72 20 77 61 79  rted. Either way
340d0 2c 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63  , record the fac
340e0 74 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  t that the.    *
340f0 2a 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 47  * ORDER BY and G
34100 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 73 20  ROUP BY clauses 
34110 61 72 65 20 74 68 65 20 73 61 6d 65 20 62 79 20  are the same by 
34120 73 65 74 74 69 6e 67 20 74 68 65 20 6f 72 64 65  setting the orde
34130 72 42 79 47 72 70 0a 20 20 20 20 2a 2a 20 76 61  rByGrp.    ** va
34140 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20  riable.  */.    
34150 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c  if( sqlite3ExprL
34160 69 73 74 43 6f 6d 70 61 72 65 28 70 47 72 6f 75  istCompare(pGrou
34170 70 42 79 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65  pBy, sSort.pOrde
34180 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20  rBy, -1)==0 ){. 
34190 20 20 20 20 20 6f 72 64 65 72 42 79 47 72 70 20       orderByGrp 
341a0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20  = 1;.    }. .   
341b0 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62   /* Create a lab
341c0 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68  el to jump to wh
341d0 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62  en we want to ab
341e0 6f 72 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f  ort the query */
341f0 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73  .    addrEnd = s
34200 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
34210 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20  bel(v);..    /* 
34220 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d  Convert TK_COLUM
34230 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f  N nodes into TK_
34240 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d  AGG_COLUMN and m
34250 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20  ake entries in. 
34260 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66     ** sAggInfo f
34270 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55  or all TK_AGG_FU
34280 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20  NCTION nodes in 
34290 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  expressions of t
342a0 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  he.    ** SELECT
342b0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
342c0 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  */.    memset(&s
342d0 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
342e0 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61  C));.    sNC.pPa
342f0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
34300 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
34310 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73   pTabList;.    s
34320 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73  NC.pAggInfo = &s
34330 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67  AggInfo;.    sAg
34340 67 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20 70 50  gInfo.mnReg = pP
34350 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
34360 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74    sAggInfo.nSort
34370 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f  ingColumn = pGro
34380 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d  upBy ? pGroupBy-
34390 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20  >nExpr : 0;.    
343a0 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42  sAggInfo.pGroupB
343b0 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20  y = pGroupBy;.  
343c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
343d0 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
343e0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
343f0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
34400 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73  eAggList(&sNC, s
34410 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 29 3b 0a  Sort.pOrderBy);.
34420 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
34430 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 47 72  ){.      if( pGr
34440 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20  oupBy ){.       
34450 20 61 73 73 65 72 74 28 20 70 57 68 65 72 65 3d   assert( pWhere=
34460 3d 70 2d 3e 70 57 68 65 72 65 20 29 3b 0a 20 20  =p->pWhere );.  
34470 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48        assert( pH
34480 61 76 69 6e 67 3d 3d 70 2d 3e 70 48 61 76 69 6e  aving==p->pHavin
34490 67 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  g );.        ass
344a0 65 72 74 28 20 70 47 72 6f 75 70 42 79 3d 3d 70  ert( pGroupBy==p
344b0 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 20 20  ->pGroupBy );.  
344c0 20 20 20 20 20 20 68 61 76 69 6e 67 54 6f 57 68        havingToWh
344d0 65 72 65 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ere(pParse, p);.
344e0 20 20 20 20 20 20 20 20 70 57 68 65 72 65 20 3d          pWhere =
344f0 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20   p->pWhere;.    
34500 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
34510 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
34520 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61  egates(&sNC, pHa
34530 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ving);.    }.   
34540 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d   sAggInfo.nAccum
34550 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66  ulator = sAggInf
34560 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69  o.nColumn;.    i
34570 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d  f( p->pGroupBy==
34580 30 20 26 26 20 70 2d 3e 70 48 61 76 69 6e 67 3d  0 && p->pHaving=
34590 3d 30 20 26 26 20 73 41 67 67 49 6e 66 6f 2e 6e  =0 && sAggInfo.n
345a0 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20 20 20  Func==1 ){.     
345b0 20 6d 69 6e 4d 61 78 46 6c 61 67 20 3d 20 6d 69   minMaxFlag = mi
345c0 6e 4d 61 78 51 75 65 72 79 28 64 62 2c 20 73 41  nMaxQuery(db, sA
345d0 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e  ggInfo.aFunc[0].
345e0 70 45 78 70 72 2c 20 26 70 4d 69 6e 4d 61 78 4f  pExpr, &pMinMaxO
345f0 72 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 65 6c  rderBy);.    }el
34600 73 65 7b 0a 20 20 20 20 20 20 6d 69 6e 4d 61 78  se{.      minMax
34610 46 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f 52 44  Flag = WHERE_ORD
34620 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  ERBY_NORMAL;.   
34630 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
34640 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63  i<sAggInfo.nFunc
34650 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; i++){.      as
34660 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
34670 6f 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e  operty(sAggInfo.
34680 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20  aFunc[i].pExpr, 
34690 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
346a0 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61  .      sNC.ncFla
346b0 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75  gs |= NC_InAggFu
346c0 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  nc;.      sqlite
346d0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
346e0 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e  ist(&sNC, sAggIn
346f0 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70  fo.aFunc[i].pExp
34700 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  r->x.pList);.   
34710 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26     sNC.ncFlags &
34720 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b  = ~NC_InAggFunc;
34730 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49  .    }.    sAggI
34740 6e 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72  nfo.mxReg = pPar
34750 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66  se->nMem;.    if
34760 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
34770 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  ed ) goto select
34780 5f 65 6e 64 3b 0a 23 69 66 20 53 45 4c 45 43 54  _end;.#if SELECT
34790 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
347a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
347b0 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30  ectTrace & 0x400
347c0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69   ){.      int ii
347d0 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  ;.      SELECTTR
347e0 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65  ACE(0x400,pParse
347f0 2c 70 2c 28 22 41 66 74 65 72 20 61 67 67 72 65  ,p,("After aggre
34800 67 61 74 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e  gate analysis:\n
34810 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
34820 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
34830 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20  (0, p, 0);.     
34840 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 41   for(ii=0; ii<sA
34850 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20  ggInfo.nColumn; 
34860 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73  ii++){.        s
34870 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
34880 66 28 22 61 67 67 2d 63 6f 6c 75 6d 6e 5b 25 64  f("agg-column[%d
34890 5d 20 69 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20  ] iMem=%d\n",.  
348a0 20 20 20 20 20 20 20 20 20 20 69 69 2c 20 73 41            ii, sA
348b0 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 69 5d 2e  ggInfo.aCol[ii].
348c0 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73  iMem);.        s
348d0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
348e0 70 72 28 30 2c 20 73 41 67 67 49 6e 66 6f 2e 61  pr(0, sAggInfo.a
348f0 43 6f 6c 5b 69 69 5d 2e 70 45 78 70 72 2c 20 30  Col[ii].pExpr, 0
34900 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
34910 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 41   for(ii=0; ii<sA
34920 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 69  ggInfo.nFunc; ii
34930 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
34940 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
34950 22 61 67 67 2d 66 75 6e 63 5b 25 64 5d 3a 20 69  "agg-func[%d]: i
34960 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  Mem=%d\n",.     
34970 20 20 20 20 20 20 20 69 69 2c 20 73 41 67 67 49         ii, sAggI
34980 6e 66 6f 2e 61 46 75 6e 63 5b 69 69 5d 2e 69 4d  nfo.aFunc[ii].iM
34990 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  em);.        sql
349a0 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72  ite3TreeViewExpr
349b0 28 30 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  (0, sAggInfo.aFu
349c0 6e 63 5b 69 69 5d 2e 70 45 78 70 72 2c 20 30 29  nc[ii].pExpr, 0)
349d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
349e0 23 65 6e 64 69 66 0a 0a 0a 20 20 20 20 2f 2a 20  #endif...    /* 
349f0 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61  Processing for a
34a00 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20 47  ggregates with G
34a10 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79 20  ROUP BY is very 
34a20 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20  different and.  
34a30 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63    ** much more c
34a40 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72  omplex than aggr
34a50 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61  egates without a
34a60 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a   GROUP BY..    *
34a70 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
34a80 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49  By ){.      KeyI
34a90 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
34aa0 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d  /* Keying inform
34ab0 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72  ation for the gr
34ac0 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f  oup by clause */
34ad0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 31  .      int addr1
34ae0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d  ;          /* A-
34af0 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e  vs-B comparision
34b00 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69   jump */.      i
34b10 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  nt addrOutputRow
34b20 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73  ;  /* Start of s
34b30 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
34b40 75 74 70 75 74 73 20 61 20 72 65 73 75 6c 74 20  utputs a result 
34b50 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  row */.      int
34b60 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20   regOutputRow;  
34b70 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65   /* Return addre
34b80 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
34b90 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
34ba0 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  e */.      int a
34bb0 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f  ddrSetAbort;   /
34bc0 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72 74 20  * Set the abort 
34bd0 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20  flag and return 
34be0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
34bf0 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20  rTopOfLoop;  /* 
34c00 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74  Top of the input
34c10 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69   loop */.      i
34c20 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64  nt addrSortingId
34c30 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65  x; /* The OP_Ope
34c40 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74  nEphemeral for t
34c50 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
34c60 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
34c70 64 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  drReset;      /*
34c80 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   Subroutine for 
34c90 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 61 63  resetting the ac
34ca0 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20  cumulator */.   
34cb0 20 20 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b     int regReset;
34cc0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
34cd0 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
34ce0 72 20 66 6f 72 20 72 65 73 65 74 20 73 75 62 72  r for reset subr
34cf0 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20  outine */..     
34d00 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
34d10 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
34d20 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20  e we might need 
34d30 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  a sorting index 
34d40 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c  to.      ** impl
34d50 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63  ement it.  Alloc
34d60 61 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67  ate that sorting
34d70 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20   index now.  If 
34d80 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20  it turns out.   
34d90 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
34da0 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74   not need it aft
34db0 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53  er all, the OP_S
34dc0 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 72 75  orterOpen instru
34dd0 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77  ction.      ** w
34de0 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
34df0 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a   into a Noop.  .
34e00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
34e10 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
34e20 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
34e30 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  b++;.      pKeyI
34e40 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
34e50 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
34e60 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 73  , pGroupBy, 0, s
34e70 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29  AggInfo.nColumn)
34e80 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74  ;.      addrSort
34e90 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33  ingIdx = sqlite3
34ea0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
34eb0 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20  _SorterOpen, .  
34ec0 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
34ed0 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67  .sortingIdx, sAg
34ee0 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f  gInfo.nSortingCo
34ef0 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20  lumn, .         
34f00 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49   0, (char*)pKeyI
34f10 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
34f20 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74  ;..      /* Init
34f30 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f  ialize memory lo
34f40 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20  cations used by 
34f50 47 52 4f 55 50 20 42 59 20 61 67 67 72 65 67 61  GROUP BY aggrega
34f60 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20  te processing.  
34f70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73      */.      iUs
34f80 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65  eFlag = ++pParse
34f90 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41  ->nMem;.      iA
34fa0 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61  bortFlag = ++pPa
34fb0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
34fc0 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20   regOutputRow = 
34fd0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
34fe0 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
34ff0 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
35000 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
35010 20 20 20 20 20 72 65 67 52 65 73 65 74 20 3d 20       regReset = 
35020 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
35030 20 20 20 20 20 20 61 64 64 72 52 65 73 65 74 20        addrReset 
35040 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
35050 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
35060 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d   iAMem = pParse-
35070 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20  >nMem + 1;.     
35080 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
35090 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
350a0 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20  ;.      iBMem = 
350b0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
350c0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
350d0 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79  nMem += pGroupBy
350e0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ->nExpr;.      s
350f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
35100 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
35110 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a  0, iAbortFlag);.
35120 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
35130 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f  t((v, "clear abo
35140 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
35150 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
35160 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
35170 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b  r, 0, iUseFlag);
35180 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
35190 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65  nt((v, "indicate
351a0 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70   accumulator emp
351b0 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ty"));.      sql
351c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
351d0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41  , OP_Null, 0, iA
351e0 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75  Mem, iAMem+pGrou
351f0 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a  pBy->nExpr-1);..
35200 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61        /* Begin a
35210 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20   loop that will 
35220 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72  extract all sour
35230 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50  ce rows in GROUP
35240 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20   BY order..     
35250 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69   ** This might i
35260 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72  nvolve two separ
35270 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61  ate loops with a
35280 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74  n OP_Sort in bet
35290 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a  ween, or.      *
352a0 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20  * it might be a 
352b0 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74  single loop that
352c0 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74   uses an index t
352d0 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d  o extract inform
352e0 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69  ation.      ** i
352f0 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72 64 65  n the right orde
35300 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e  r to begin with.
35310 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
35320 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
35330 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
35340 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73  egReset, addrRes
35350 65 74 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  et);.      SELEC
35360 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c  TTRACE(1,pParse,
35370 70 2c 28 22 57 68 65 72 65 42 65 67 69 6e 5c 6e  p,("WhereBegin\n
35380 22 29 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  "));.      pWInf
35390 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
353a0 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
353b0 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
353c0 70 47 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20  pGroupBy, 0,.   
353d0 20 20 20 20 20 20 20 57 48 45 52 45 5f 47 52 4f         WHERE_GRO
353e0 55 50 42 59 20 7c 20 28 6f 72 64 65 72 42 79 47  UPBY | (orderByG
353f0 72 70 20 3f 20 57 48 45 52 45 5f 53 4f 52 54 42  rp ? WHERE_SORTB
35400 59 47 52 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20  YGROUP : 0), 0. 
35410 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66       );.      if
35420 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
35430 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
35440 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
35450 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70  WhereIsOrdered(p
35460 57 49 6e 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79  WInfo)==pGroupBy
35470 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
35480 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69     /* The optimi
35490 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64  zer is able to d
354a0 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67  eliver rows in g
354b0 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f  roup by order so
354c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64  .        ** we d
354d0 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f  o not have to so
354e0 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e  rt.  The OP_Open
354f0 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  Ephemeral table 
35500 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20  will be.        
35510 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74  ** cancelled lat
35520 65 72 20 62 65 63 61 75 73 65 20 77 65 20 73 74  er because we st
35530 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20  ill need to use 
35540 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20  the pKeyInfo.   
35550 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
35560 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b  groupBySort = 0;
35570 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
35580 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72        /* Rows ar
35590 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20  e coming out in 
355a0 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64  undetermined ord
355b0 65 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  er.  We have to 
355c0 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20  push.        ** 
355d0 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20  each row into a 
355e0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74  sorting index, t
355f0 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72  erminate the fir
35600 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20  st loop,.       
35610 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76   ** then loop ov
35620 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  er the sorting i
35630 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f  ndex in order to
35640 20 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a   get the output.
35650 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f          ** in so
35660 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20  rted order.     
35670 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
35680 74 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20  t regBase;.     
35690 20 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64     int regRecord
356a0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  ;.        int nC
356b0 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ol;.        int 
356c0 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20  nGroupBy;..     
356d0 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61     explainTempTa
356e0 62 6c 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  ble(pParse, .   
356f0 20 20 20 20 20 20 20 20 20 28 73 44 69 73 74 69           (sDisti
35700 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20 28 70  nct.isTnct && (p
35710 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69  ->selFlags&SF_Di
35720 73 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20  stinct)==0) ?.  
35730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35740 20 20 22 44 49 53 54 49 4e 43 54 22 20 3a 20 22    "DISTINCT" : "
35750 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20 20  GROUP BY");..   
35760 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74       groupBySort
35770 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47   = 1;.        nG
35780 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
35790 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
357a0 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42    nCol = nGroupB
357b0 79 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e  y;.        j = n
357c0 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20  GroupBy;.       
357d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
357e0 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Info.nColumn; i+
357f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
35800 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b  ( sAggInfo.aCol[
35810 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  i].iSorterColumn
35820 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=j ){.         
35830 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20     nCol++;.     
35840 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
35850 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35860 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73  }.        regBas
35870 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  e = sqlite3GetTe
35880 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
35890 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
358a0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
358b0 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
358c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
358d0 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
358e0 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20  arse, pGroupBy, 
358f0 72 65 67 42 61 73 65 2c 20 30 2c 20 30 29 3b 0a  regBase, 0, 0);.
35900 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f          j = nGro
35910 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f  upBy;.        fo
35920 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
35930 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  o.nColumn; i++){
35940 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
35950 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
35960 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e  Col = &sAggInfo.
35970 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20  aCol[i];.       
35980 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f     if( pCol->iSo
35990 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b  rterColumn>=j ){
359a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
359b0 20 72 31 20 3d 20 6a 20 2b 20 72 65 67 42 61 73   r1 = j + regBas
359c0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e;.            s
359d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
359e0 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 70 50 61  tColumnToReg(pPa
359f0 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
35a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a10 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c       pCol->pTab,
35a20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20   pCol->iColumn, 
35a30 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31  pCol->iTable, r1
35a40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  );.            j
35a50 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
35a60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35a70 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71    regRecord = sq
35a80 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
35a90 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
35aa0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
35ab0 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
35ac0 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  ord, regBase, nC
35ad0 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  ol, regRecord);.
35ae0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
35af0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
35b00 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 73 41  SorterInsert, sA
35b10 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
35b20 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  x, regRecord);. 
35b30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
35b40 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
35b50 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  rse, regRecord);
35b60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
35b70 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
35b80 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
35b90 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
35ba0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
35bb0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
35bc0 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
35bd0 6e 67 49 64 78 50 54 61 62 20 3d 20 73 6f 72 74  ngIdxPTab = sort
35be0 50 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  PTab = pParse->n
35bf0 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73  Tab++;.        s
35c00 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  ortOut = sqlite3
35c10 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
35c20 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
35c30 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
35c40 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20   OP_OpenPseudo, 
35c50 73 6f 72 74 50 54 61 62 2c 20 73 6f 72 74 4f 75  sortPTab, sortOu
35c60 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  t, nCol);.      
35c70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
35c80 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
35c90 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Sort, sAggInfo.s
35ca0 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45  ortingIdx, addrE
35cb0 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  nd);.        Vdb
35cc0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52  eComment((v, "GR
35cd0 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 20  OUP BY sort")); 
35ce0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
35cf0 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66  .        sAggInf
35d00 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20  o.useSortingIdx 
35d10 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 1;.        sql
35d20 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
35d30 61 72 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20  ar(pParse);..   
35d40 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
35d50 66 20 74 68 65 20 69 6e 64 65 78 20 6f 72 20 74  f the index or t
35d60 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 75  emporary table u
35d70 73 65 64 20 62 79 20 74 68 65 20 47 52 4f 55 50  sed by the GROUP
35d80 20 42 59 20 73 6f 72 74 0a 20 20 20 20 20 20 2a   BY sort.      *
35d90 2a 20 77 69 6c 6c 20 6e 61 74 75 72 61 6c 6c 79  * will naturally
35da0 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e   deliver rows in
35db0 20 74 68 65 20 6f 72 64 65 72 20 72 65 71 75 69   the order requi
35dc0 72 65 64 20 62 79 20 74 68 65 20 4f 52 44 45 52  red by the ORDER
35dd0 20 42 59 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61   BY.      ** cla
35de0 75 73 65 2c 20 63 61 6e 63 65 6c 20 74 68 65 20  use, cancel the 
35df0 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
35e00 6f 70 65 6e 20 63 6f 64 65 64 20 65 61 72 6c 69  open coded earli
35e10 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  er..      **.   
35e20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61 6e     ** This is an
35e30 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20   optimization - 
35e40 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77  the correct answ
35e50 65 72 20 73 68 6f 75 6c 64 20 72 65 73 75 6c 74  er should result
35e60 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20   regardless..   
35e70 20 20 20 2a 2a 20 55 73 65 20 74 68 65 20 53 51     ** Use the SQ
35e80 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65  LITE_GroupByOrde
35e90 72 20 66 6c 61 67 20 77 69 74 68 20 53 51 4c 49  r flag with SQLI
35ea0 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
35eb0 4d 49 5a 45 52 20 74 6f 20 0a 20 20 20 20 20 20  MIZER to .      
35ec0 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 69 73 20  ** disable this 
35ed0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72  optimization for
35ee0 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
35ef0 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  s.  */.      if(
35f00 20 6f 72 64 65 72 42 79 47 72 70 20 26 26 20 4f   orderByGrp && O
35f10 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
35f20 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 47 72  ed(db, SQLITE_Gr
35f30 6f 75 70 42 79 4f 72 64 65 72 29 20 0a 20 20 20  oupByOrder) .   
35f40 20 20 20 20 26 26 20 28 67 72 6f 75 70 42 79 53      && (groupByS
35f50 6f 72 74 20 7c 7c 20 73 71 6c 69 74 65 33 57 68  ort || sqlite3Wh
35f60 65 72 65 49 73 53 6f 72 74 65 64 28 70 57 49 6e  ereIsSorted(pWIn
35f70 66 6f 29 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  fo)).      ){.  
35f80 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64        sSort.pOrd
35f90 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
35fa0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
35fb0 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f  ngeToNoop(v, sSo
35fc0 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
35fd0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
35fe0 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
35ff0 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  e current GROUP 
36000 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f  BY terms and sto
36010 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32  re in b0, b1, b2
36020 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30  ....      ** (b0
36030 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74   is memory locat
36040 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20  ion iBMem+0, b1 
36050 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20  is iBMem+1, and 
36060 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20  so forth).      
36070 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20  ** Then compare 
36080 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
36090 50 20 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e  P BY terms again
360a0 73 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  st the GROUP BY 
360b0 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66  terms.      ** f
360c0 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73  rom the previous
360d0 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73   row currently s
360e0 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c  tored in a0, a1,
360f0 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a   a2....      */.
36100 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c        addrTopOfL
36110 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oop = sqlite3Vdb
36120 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
36130 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
36140 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
36150 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rse);.      if( 
36160 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20  groupBySort ){. 
36170 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
36180 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
36190 6f 72 74 65 72 44 61 74 61 2c 20 73 41 67 67 49  orterData, sAggI
361a0 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 0a  nfo.sortingIdx,.
361b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
361c0 20 20 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75            sortOu
361d0 74 2c 20 73 6f 72 74 50 54 61 62 29 3b 0a 20 20  t, sortPTab);.  
361e0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
361f0 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d  j=0; j<pGroupBy-
36200 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  >nExpr; j++){.  
36210 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42        if( groupB
36220 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  ySort ){.       
36230 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
36240 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
36250 6e 2c 20 73 6f 72 74 50 54 61 62 2c 20 6a 2c 20  n, sortPTab, j, 
36260 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20  iBMem+j);.      
36270 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
36280 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65     sAggInfo.dire
36290 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20  ctMode = 1;.    
362a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
362b0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47  rCode(pParse, pG
362c0 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78  roupBy->a[j].pEx
362d0 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20  pr, iBMem+j);.  
362e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
362f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
36300 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
36310 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42  mpare, iAMem, iB
36320 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e  Mem, pGroupBy->n
36330 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
36340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36350 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65  (char*)sqlite3Ke
36360 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66  yInfoRef(pKeyInf
36370 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  o), P4_KEYINFO);
36380 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73  .      addr1 = s
36390 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
363a0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
363b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
363c0 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64  3(v, OP_Jump, ad
363d0 64 72 31 2b 31 2c 20 30 2c 20 61 64 64 72 31 2b  dr1+1, 0, addr1+
363e0 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
363f0 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  (v);..      /* G
36400 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
36410 74 20 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20  t runs whenever 
36420 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 68 61  the GROUP BY cha
36430 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43  nges..      ** C
36440 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 47 52  hanges in the GR
36450 4f 55 50 20 42 59 20 61 72 65 20 64 65 74 65 63  OUP BY are detec
36460 74 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69  ted by the previ
36470 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 20 20 2a  ous code.      *
36480 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65  * block.  If the
36490 72 65 20 77 65 72 65 20 6e 6f 20 63 68 61 6e 67  re were no chang
364a0 65 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 69  es, this block i
364b0 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20  s skipped..     
364c0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69   **.      ** Thi
364d0 73 20 63 6f 64 65 20 63 6f 70 69 65 73 20 63 75  s code copies cu
364e0 72 72 65 6e 74 20 67 72 6f 75 70 20 62 79 20 74  rrent group by t
364f0 65 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62 32  erms in b0,b1,b2
36500 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76  ,....      ** ov
36510 65 72 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20  er to a0,a1,a2. 
36520 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74   It then calls t
36530 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  he output subrou
36540 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e  tine.      ** an
36550 64 20 72 65 73 65 74 73 20 74 68 65 20 61 67 67  d resets the agg
36560 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
36570 6f 72 20 72 65 67 69 73 74 65 72 73 20 69 6e 20  or registers in 
36580 70 72 65 70 61 72 61 74 69 6f 6e 0a 20 20 20 20  preparation.    
36590 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 78    ** for the nex
365a0 74 20 47 52 4f 55 50 20 42 59 20 62 61 74 63 68  t GROUP BY batch
365b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
365c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
365d0 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 42 4d  Move(pParse, iBM
365e0 65 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75  em, iAMem, pGrou
365f0 70 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  pBy->nExpr);.   
36600 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
36610 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
36620 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20  , regOutputRow, 
36630 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
36640 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
36650 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e  t((v, "output on
36660 65 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20  e row"));.      
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 49 66 50 6f 73 2c 20 69  2(v, OP_IfPos, i
36690 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45  AbortFlag, addrE
366a0 6e 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  nd); VdbeCoverag
366b0 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
366c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68 65  Comment((v, "che
366d0 63 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29  ck abort flag"))
366e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
366f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
36700 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c  Gosub, regReset,
36710 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20   addrReset);.   
36720 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
36730 76 2c 20 22 72 65 73 65 74 20 61 63 63 75 6d 75  v, "reset accumu
36740 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20  lator"));..     
36750 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
36760 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
36770 61 74 6f 72 73 20 62 61 73 65 64 20 6f 6e 20 74  ators based on t
36780 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20  he content of.  
36790 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65      ** the curre
367a0 6e 74 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a  nt row.      */.
367b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
367c0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
367d0 72 31 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74  r1);.      updat
367e0 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  eAccumulator(pPa
367f0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
36800 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
36810 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
36820 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73 65 46  nteger, 1, iUseF
36830 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
36840 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64  Comment((v, "ind
36850 69 63 61 74 65 20 64 61 74 61 20 69 6e 20 61 63  icate data in ac
36860 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20  cumulator"));.. 
36870 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74       /* End of t
36880 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f  he loop.      */
36890 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70  .      if( group
368a0 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
368b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
368c0 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
368d0 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Next, sAggInfo.s
368e0 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54  ortingIdx, addrT
368f0 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  opOfLoop);.     
36900 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
36910 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  v);.      }else{
36920 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
36930 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
36940 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
36950 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
36960 70 28 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67  p(v, addrSorting
36970 49 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Idx);.      }.. 
36980 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74       /* Output t
36990 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20  he final row of 
369a0 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a  result.      */.
369b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
369c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
369d0 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  sub, regOutputRo
369e0 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  w, addrOutputRow
369f0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
36a00 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74  ment((v, "output
36a10 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a   final row"));..
36a20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76        /* Jump ov
36a30 65 72 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  er the subroutin
36a40 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  es.      */.    
36a50 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
36a60 6f 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a  o(v, addrEnd);..
36a70 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
36a80 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
36a90 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 73 69  hat outputs a si
36aa0 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20  ngle row of the 
36ab0 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20  result.      ** 
36ac0 73 65 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f  set.  This subro
36ad0 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b  utine first look
36ae0 73 20 61 74 20 74 68 65 20 69 55 73 65 46 6c 61  s at the iUseFla
36af0 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a  g.  If iUseFlag.
36b00 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73        ** is less
36b10 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
36b20 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72  o zero, the subr
36b30 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
36b40 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20  p.  If.      ** 
36b50 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63  the processing c
36b60 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65  alls for the que
36b70 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69  ry to abort, thi
36b80 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20  s subroutine.   
36b90 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73     ** increments
36ba0 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20   the iAbortFlag 
36bb0 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
36bc0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
36bd0 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64   in.      ** ord
36be0 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65  er to signal the
36bf0 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74   caller to abort
36c00 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
36c10 20 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20   addrSetAbort = 
36c20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
36c30 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
36c40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
36c50 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
36c60 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29  , 1, iAbortFlag)
36c70 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
36c80 65 6e 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f  ent((v, "set abo
36c90 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
36ca0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
36cb0 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
36cc0 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b  , regOutputRow);
36cd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
36ce0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
36cf0 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29  , addrOutputRow)
36d00 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70  ;.      addrOutp
36d10 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56  utRow = sqlite3V
36d20 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
36d30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
36d40 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
36d50 5f 49 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67  _IfPos, iUseFlag
36d60 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b  , addrOutputRow+
36d70 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  2);.      VdbeCo
36d80 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
36d90 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
36da0 20 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74   "Groupby result
36db0 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79   generator entry
36dc0 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20   point"));.     
36dd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
36de0 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
36df0 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
36e00 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67        finalizeAg
36e10 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73  gFunctions(pPars
36e20 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
36e30 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
36e40 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
36e50 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74  pHaving, addrOut
36e60 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45  putRow+1, SQLITE
36e70 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
36e80 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
36e90 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d  oop(pParse, p, -
36ea0 31 2c 20 26 73 53 6f 72 74 2c 0a 20 20 20 20 20  1, &sSort,.     
36eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36ec0 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65   &sDistinct, pDe
36ed0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
36ee0 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75            addrOu
36ef0 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53  tputRow+1, addrS
36f00 65 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20  etAbort);.      
36f10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
36f20 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
36f30 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
36f40 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
36f50 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62  ((v, "end groupb
36f60 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74  y result generat
36f70 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
36f80 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
36f90 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
36fa0 20 72 65 73 65 74 20 74 68 65 20 67 72 6f 75 70   reset the group
36fb0 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a  -by accumulator.
36fc0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
36fd0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
36fe0 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65  eLabel(v, addrRe
36ff0 73 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65  set);.      rese
37000 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  tAccumulator(pPa
37010 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
37020 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
37030 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
37040 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29  eturn, regReset)
37050 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a  ;.     .    } /*
37060 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79 2e   endif pGroupBy.
37070 20 20 42 65 67 69 6e 20 61 67 67 72 65 67 61 74    Begin aggregat
37080 65 20 71 75 65 72 69 65 73 20 77 69 74 68 6f 75  e queries withou
37090 74 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20  t GROUP BY: */. 
370a0 20 20 20 65 6c 73 65 20 7b 0a 23 69 66 6e 64 65     else {.#ifnde
370b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54  f SQLITE_OMIT_BT
370c0 52 45 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 54  REECOUNT.      T
370d0 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
370e0 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 69 73    if( (pTab = is
370f0 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26  SimpleCount(p, &
37100 73 41 67 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b  sAggInfo))!=0 ){
37110 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69  .        /* If i
37120 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72  sSimpleCount() r
37130 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
37140 20 74 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75   to a Table stru
37150 63 74 75 72 65 2c 20 74 68 65 6e 0a 20 20 20 20  cture, then.    
37160 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73      ** the SQL s
37170 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74  tatement is of t
37180 68 65 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20  he form:.       
37190 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
371a0 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
371b0 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20   FROM <tbl>.    
371c0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
371d0 2a 20 77 68 65 72 65 20 74 68 65 20 54 61 62 6c  * where the Tabl
371e0 65 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75  e structure retu
371f0 72 6e 65 64 20 72 65 70 72 65 73 65 6e 74 73 20  rned represents 
37200 74 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20  table <tbl>..   
37210 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
37220 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e  ** This statemen
37230 74 20 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74  t is so common t
37240 68 61 74 20 69 74 20 69 73 20 6f 70 74 69 6d 69  hat it is optimi
37250 7a 65 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 54  zed specially. T
37260 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50  he.        ** OP
37270 5f 43 6f 75 6e 74 20 69 6e 73 74 72 75 63 74 69  _Count instructi
37280 6f 6e 20 69 73 20 65 78 65 63 75 74 65 64 20 65  on is executed e
37290 69 74 68 65 72 20 6f 6e 20 74 68 65 20 69 6e 74  ither on the int
372a0 6b 65 79 20 74 61 62 6c 65 20 74 68 61 74 0a 20  key table that. 
372b0 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
372c0 6e 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  ns the data for 
372d0 74 61 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f  table <tbl> or o
372e0 6e 20 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e 64  n one of its ind
372f0 65 78 65 73 2e 20 49 74 0a 20 20 20 20 20 20 20  exes. It.       
37300 20 2a 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f   ** is better to
37310 20 65 78 65 63 75 74 65 20 74 68 65 20 6f 70 20   execute the op 
37320 6f 6e 20 61 6e 20 69 6e 64 65 78 2c 20 61 73 20  on an index, as 
37330 69 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6d 6f  indexes are almo
37340 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  st.        ** al
37350 77 61 79 73 20 73 70 72 65 61 64 20 61 63 72 6f  ways spread acro
37360 73 73 20 6c 65 73 73 20 70 61 67 65 73 20 74 68  ss less pages th
37370 61 6e 20 74 68 65 69 72 20 63 6f 72 72 65 73 70  an their corresp
37380 6f 6e 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20  onding tables.. 
37390 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
373a0 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 62 20    const int iDb 
373b0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
373c0 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
373d0 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
373e0 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  );.        const
373f0 20 69 6e 74 20 69 43 73 72 20 3d 20 70 50 61 72   int iCsr = pPar
37400 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
37410 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61  /* Cursor to sca
37420 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20  n b-tree */.    
37430 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
37440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37450 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
37460 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
37470 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  .        KeyInfo
37480 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20   *pKeyInfo = 0; 
37490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
374a0 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20 73 63 61   Keyinfo for sca
374b0 6e 6e 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20  nned index */.  
374c0 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65        Index *pBe
374d0 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
374e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65             /* Be
374f0 73 74 20 69 6e 64 65 78 20 66 6f 75 6e 64 20 73  st index found s
37500 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20  o far */.       
37510 20 69 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54 61   int iRoot = pTa
37520 62 2d 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20 20  b->tnum;        
37530 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
37540 67 65 20 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d  ge of scanned b-
37550 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20  tree */..       
37560 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
37570 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
37580 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73   iDb);.        s
37590 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
375a0 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
375b0 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62  b->tnum, 0, pTab
375c0 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20  ->zName);..     
375d0 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
375e0 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20   the index that 
375f0 68 61 73 20 74 68 65 20 6c 6f 77 65 73 74 20 73  has the lowest s
37600 63 61 6e 20 63 6f 73 74 2e 0a 20 20 20 20 20 20  can cost..      
37610 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
37620 28 32 30 31 31 2d 30 34 2d 31 35 29 20 44 6f 20  (2011-04-15) Do 
37630 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 73 63  not do a full sc
37640 61 6e 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72  an of an unorder
37650 65 64 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  ed index..      
37660 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
37670 28 32 30 31 33 2d 31 30 2d 30 33 29 20 44 6f 20  (2013-10-03) Do 
37680 6e 6f 74 20 63 6f 75 6e 74 20 74 68 65 20 65 6e  not count the en
37690 74 72 69 65 73 20 69 6e 20 61 20 70 61 72 74 69  tries in a parti
376a0 61 6c 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  al index..      
376b0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
376c0 49 6e 20 70 72 61 63 74 69 63 65 20 74 68 65 20  In practice the 
376d0 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
376e0 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73  e will not be us
376f0 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a  ed. It is only .
37700 20 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65          ** passe
37710 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65  d to keep OP_Ope
37720 6e 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20  nRead happy..   
37730 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
37740 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
37750 61 62 29 20 29 20 70 42 65 73 74 20 3d 20 73 71  ab) ) pBest = sq
37760 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
37770 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
37780 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
37790 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
377a0 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
377b0 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t){.          if
377c0 28 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72  ( pIdx->bUnorder
377d0 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ed==0.          
377e0 20 26 26 20 70 49 64 78 2d 3e 73 7a 49 64 78 52   && pIdx->szIdxR
377f0 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  ow<pTab->szTabRo
37800 77 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  w.           && 
37810 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68  pIdx->pPartIdxWh
37820 65 72 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ere==0.         
37830 20 20 26 26 20 28 21 70 42 65 73 74 20 7c 7c 20    && (!pBest || 
37840 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70  pIdx->szIdxRow<p
37850 42 65 73 74 2d 3e 73 7a 49 64 78 52 6f 77 29 0a  Best->szIdxRow).
37860 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
37870 20 20 20 20 20 20 20 20 20 70 42 65 73 74 20 3d           pBest =
37880 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20   pIdx;.         
37890 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
378a0 20 20 20 20 20 69 66 28 20 70 42 65 73 74 20 29       if( pBest )
378b0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f 6f  {.          iRoo
378c0 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b  t = pBest->tnum;
378d0 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49  .          pKeyI
378e0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
378f0 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72  InfoOfIndex(pPar
37900 73 65 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20  se, pBest);.    
37910 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
37920 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e  * Open a read-on
37930 6c 79 20 63 75 72 73 6f 72 2c 20 65 78 65 63 75  ly cursor, execu
37940 74 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c  te the OP_Count,
37950 20 63 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f   close the curso
37960 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  r. */.        sq
37970 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
37980 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  nt(v, OP_OpenRea
37990 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20  d, iCsr, iRoot, 
379a0 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  iDb, 1);.       
379b0 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
379c0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
379d0 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
379e0 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 4b  , -1, (char *)pK
379f0 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
37a00 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  FO);.        }. 
37a10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
37a20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
37a30 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73 41 67 67  ount, iCsr, sAgg
37a40 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d  Info.aFunc[0].iM
37a50 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  em);.        sql
37a60 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
37a70 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72  , OP_Close, iCsr
37a80 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61  );.        expla
37a90 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50  inSimpleCount(pP
37aa0 61 72 73 65 2c 20 70 54 61 62 2c 20 70 42 65 73  arse, pTab, pBes
37ab0 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  t);.      }else.
37ac0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
37ad0 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54  _OMIT_BTREECOUNT
37ae0 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20   */.      {.    
37af0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
37b00 20 72 75 6e 73 20 69 66 20 74 68 65 20 61 67 67   runs if the agg
37b10 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52  regate has no GR
37b20 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
37b30 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  The.        ** p
37b40 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63  rocessing is muc
37b50 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20  h simpler since 
37b60 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20  there is only a 
37b70 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20  single row.     
37b80 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e     ** of output.
37b90 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
37ba0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
37bb0 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20  GroupBy==0 );.  
37bc0 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d        resetAccum
37bd0 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
37be0 73 41 67 67 49 6e 66 6f 29 3b 0a 0a 20 20 20 20  sAggInfo);..    
37bf0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 71      /* If this q
37c00 75 65 72 79 20 69 73 20 61 20 63 61 6e 64 69 64  uery is a candid
37c10 61 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f  ate for the min/
37c20 6d 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  max optimization
37c30 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a  , then.        *
37c40 2a 20 6d 69 6e 4d 61 78 46 6c 61 67 20 77 69 6c  * minMaxFlag wil
37c50 6c 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 76  l have been prev
37c60 69 6f 75 73 6c 79 20 73 65 74 20 74 6f 20 65 69  iously set to ei
37c70 74 68 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  ther.        ** 
37c80 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
37c90 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52  N or WHERE_ORDER
37ca0 42 59 5f 4d 41 58 20 61 6e 64 20 70 4d 69 6e 4d  BY_MAX and pMinM
37cb0 61 78 4f 72 64 65 72 42 79 20 77 69 6c 6c 0a 20  axOrderBy will. 
37cc0 20 20 20 20 20 20 20 2a 2a 20 62 65 20 61 6e 20         ** be an 
37cd0 61 70 70 72 6f 70 72 69 61 74 65 20 4f 52 44 45  appropriate ORDE
37ce0 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20  R BY expression 
37cf0 66 6f 72 20 74 68 65 20 6f 70 74 69 6d 69 7a 61  for the optimiza
37d00 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f  tion..        */
37d10 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
37d20 20 6d 69 6e 4d 61 78 46 6c 61 67 3d 3d 57 48 45   minMaxFlag==WHE
37d30 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41  RE_ORDERBY_NORMA
37d40 4c 20 7c 7c 20 70 4d 69 6e 4d 61 78 4f 72 64 65  L || pMinMaxOrde
37d50 72 42 79 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  rBy!=0 );.      
37d60 20 20 61 73 73 65 72 74 28 20 70 4d 69 6e 4d 61    assert( pMinMa
37d70 78 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70  xOrderBy==0 || p
37d80 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79 2d 3e 6e  MinMaxOrderBy->n
37d90 45 78 70 72 3d 3d 31 20 29 3b 0a 0a 20 20 20 20  Expr==1 );..    
37da0 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
37db0 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 57 68 65  1,pParse,p,("Whe
37dc0 72 65 42 65 67 69 6e 5c 6e 22 29 29 3b 0a 20 20  reBegin\n"));.  
37dd0 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73        pWInfo = s
37de0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
37df0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
37e00 74 2c 20 70 57 68 65 72 65 2c 20 70 4d 69 6e 4d  t, pWhere, pMinM
37e10 61 78 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20  axOrderBy,.     
37e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
37e40 20 6d 69 6e 4d 61 78 46 6c 61 67 2c 20 30 29 3b   minMaxFlag, 0);
37e50 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57 49  .        if( pWI
37e60 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nfo==0 ){.      
37e70 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
37e80 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
37e90 20 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63         updateAcc
37ea0 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
37eb0 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
37ec0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
37ed0 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70  WhereIsOrdered(p
37ee0 57 49 6e 66 6f 29 3e 30 20 29 7b 0a 20 20 20 20  WInfo)>0 ){.    
37ef0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
37f00 65 47 6f 74 6f 28 76 2c 20 73 71 6c 69 74 65 33  eGoto(v, sqlite3
37f10 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28  WhereBreakLabel(
37f20 70 57 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20  pWInfo));.      
37f30 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
37f40 28 76 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64  (v, "%s() by ind
37f50 65 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ex",.           
37f60 20 20 20 20 20 28 6d 69 6e 4d 61 78 46 6c 61 67       (minMaxFlag
37f70 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  ==WHERE_ORDERBY_
37f80 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29  MIN?"min":"max")
37f90 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ));.        }.  
37fa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
37fb0 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
37fc0 20 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41         finalizeA
37fd0 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72  ggFunctions(pPar
37fe0 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
37ff0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73        }..      s
38000 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
38010 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
38020 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
38030 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64  se, pHaving, add
38040 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  rEnd, SQLITE_JUM
38050 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
38060 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
38070 70 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 30  pParse, p, -1, 0
38080 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
38090 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73              pDes
380a0 74 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72  t, addrEnd, addr
380b0 45 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  End);.    }.    
380c0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
380d0 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45  veLabel(v, addrE
380e0 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a  nd);.    .  } /*
380f0 20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65   endif aggregate
38100 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28   query */..  if(
38110 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
38120 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54  Type==WHERE_DIST
38130 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29  INCT_UNORDERED )
38140 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d  {.    explainTem
38150 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22  pTable(pParse, "
38160 44 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a  DISTINCT");.  }.
38170 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
38180 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
38190 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65  ause, then we ne
381a0 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72  ed to sort the r
381b0 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20  esults.  ** and 
381c0 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65  send them to the
381d0 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79   callback one by
381e0 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   one..  */.  if(
381f0 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
38200 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65  ){.    explainTe
38210 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 0a  mpTable(pParse,.
38220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38230 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61       sSort.nOBSa
38240 74 3e 30 20 3f 20 22 52 49 47 48 54 20 50 41 52  t>0 ? "RIGHT PAR
38250 54 20 4f 46 20 4f 52 44 45 52 20 42 59 22 3a 22  T OF ORDER BY":"
38260 4f 52 44 45 52 20 42 59 22 29 3b 0a 20 20 20 20  ORDER BY");.    
38270 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
38280 74 3d 3d 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  t==pEList );.   
38290 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69   generateSortTai
382a0 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 26 73 53  l(pParse, p, &sS
382b0 6f 72 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ort, pEList->nEx
382c0 70 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a  pr, pDest);.  }.
382d0 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
382e0 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75 65  to skip this que
382f0 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ry.  */.  sqlite
38300 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
38310 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f  l(v, iEnd);..  /
38320 2a 20 54 68 65 20 53 45 4c 45 43 54 20 68 61 73  * The SELECT has
38330 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 49 66 20   been coded. If 
38340 74 68 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f  there is an erro
38350 72 20 69 6e 20 74 68 65 20 50 61 72 73 65 20 73  r in the Parse s
38360 74 72 75 63 74 75 72 65 2c 0a 20 20 2a 2a 20 73  tructure,.  ** s
38370 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  et the return co
38380 64 65 20 74 6f 20 31 2e 20 4f 74 68 65 72 77 69  de to 1. Otherwi
38390 73 65 20 30 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  se 0. */.  rc = 
383a0 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 29  (pParse->nErr>0)
383b0 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20  ;..  /* Control 
383c0 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66  jumps to here if
383d0 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
383e0 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20  ountered above, 
383f0 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63  or upon.  ** suc
38400 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f  cessful coding o
38410 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20  f the SELECT..  
38420 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20  */.select_end:. 
38430 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   expla