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

Artifact cd3993844ab1186e80069f9de2304e730732cfea1f718e603293792d4401d037:


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 75 2f 25 64 2f 25 70 3a 20 22 2c 28 53 29  "%u/%d/%p: ",(S)
02c0: 2d 3e 73 65 6c 49 64 2c 28 50 29 2d 3e 61 64 64  ->selId,(P)->add
02d0: 72 45 78 70 6c 61 69 6e 2c 28 53 29 29 2c 5c 0a  rExplain,(S)),\.
02e0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
02f0: 50 72 69 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23  Printf X.#else.#
0300: 20 64 65 66 69 6e 65 20 53 45 4c 45 43 54 54 52   define SELECTTR
0310: 41 43 45 28 4b 2c 50 2c 53 2c 58 29 0a 23 65 6e  ACE(K,P,S,X).#en
0320: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  dif.../*.** An i
0330: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
0340: 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20  ollowing object 
0350: 69 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72  is used to recor
0360: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  d information ab
0370: 6f 75 74 0a 2a 2a 20 68 6f 77 20 74 6f 20 70 72  out.** how to pr
0380: 6f 63 65 73 73 20 74 68 65 20 44 49 53 54 49 4e  ocess the DISTIN
0390: 43 54 20 6b 65 79 77 6f 72 64 2c 20 74 6f 20 73  CT keyword, to s
03a0: 69 6d 70 6c 69 66 79 20 70 61 73 73 69 6e 67 20  implify passing 
03b0: 74 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  that information
03c0: 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 65 6c  .** into the sel
03d0: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 72  ectInnerLoop() r
03e0: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64  outine..*/.typed
03f0: 65 66 20 73 74 72 75 63 74 20 44 69 73 74 69 6e  ef struct Distin
0400: 63 74 43 74 78 20 44 69 73 74 69 6e 63 74 43 74  ctCtx DistinctCt
0410: 78 3b 0a 73 74 72 75 63 74 20 44 69 73 74 69 6e  x;.struct Distin
0420: 63 74 43 74 78 20 7b 0a 20 20 75 38 20 69 73 54  ctCtx {.  u8 isT
0430: 6e 63 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  nct;      /* Tru
0440: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
0450: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
0460: 73 65 6e 74 20 2a 2f 0a 20 20 75 38 20 65 54 6e  sent */.  u8 eTn
0470: 63 74 54 79 70 65 3b 20 20 20 2f 2a 20 4f 6e 65  ctType;   /* One
0480: 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 44 49   of the WHERE_DI
0490: 53 54 49 4e 43 54 5f 2a 20 6f 70 65 72 61 74 6f  STINCT_* operato
04a0: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62 54  rs */.  int tabT
04b0: 6e 63 74 3b 20 20 20 20 2f 2a 20 45 70 68 65 6d  nct;    /* Ephem
04c0: 65 72 61 6c 20 74 61 62 6c 65 20 75 73 65 64 20  eral table used 
04d0: 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72 6f  for DISTINCT pro
04e0: 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  cessing */.  int
04f0: 20 61 64 64 72 54 6e 63 74 3b 20 20 20 2f 2a 20   addrTnct;   /* 
0500: 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70  Address of OP_Op
0510: 65 6e 45 70 68 65 6d 65 72 61 6c 20 6f 70 63 6f  enEphemeral opco
0520: 64 65 20 66 6f 72 20 74 61 62 54 6e 63 74 20 2a  de for tabTnct *
0530: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  /.};../*.** An i
0540: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
0550: 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20  ollowing object 
0560: 69 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72  is used to recor
0570: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  d information ab
0580: 6f 75 74 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52  out.** the ORDER
0590: 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
05a0: 29 20 63 6c 61 75 73 65 20 6f 66 20 71 75 65 72  ) clause of quer
05b0: 79 20 69 73 20 62 65 69 6e 67 20 63 6f 64 65 64  y is being coded
05c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 44 65 66  ..**.** The aDef
05d0: 65 72 5b 5d 20 61 72 72 61 79 20 69 73 20 75 73  er[] array is us
05e0: 65 64 20 62 79 20 74 68 65 20 73 6f 72 74 65 72  ed by the sorter
05f0: 2d 72 65 66 65 72 65 6e 63 65 73 20 6f 70 74 69  -references opti
0600: 6d 69 7a 61 74 69 6f 6e 2e 20 46 6f 72 0a 2a 2a  mization. For.**
0610: 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69   example, assumi
0620: 6e 67 20 74 68 65 72 65 20 69 73 20 6e 6f 20 69  ng there is no i
0630: 6e 64 65 78 20 74 68 61 74 20 63 61 6e 20 62 65  ndex that can be
0640: 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 4f 52   used for the OR
0650: 44 45 52 20 42 59 2c 0a 2a 2a 20 66 6f 72 20 74  DER BY,.** for t
0660: 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  he query:.**.** 
0670: 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 69      SELECT a, bi
0680: 67 62 6c 6f 62 20 46 52 4f 4d 20 74 31 20 4f 52  gblob FROM t1 OR
0690: 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 31  DER BY a LIMIT 1
06a0: 30 3b 0a 2a 2a 0a 2a 2a 20 69 74 20 6d 61 79 20  0;.**.** it may 
06b0: 62 65 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  be more efficien
06c0: 74 20 74 6f 20 61 64 64 20 6a 75 73 74 20 74 68  t to add just th
06d0: 65 20 22 61 22 20 76 61 6c 75 65 73 20 74 6f 20  e "a" values to 
06e0: 74 68 65 20 73 6f 72 74 65 72 2c 20 61 6e 64 0a  the sorter, and.
06f0: 2a 2a 20 72 65 74 72 69 65 76 65 20 74 68 65 20  ** retrieve the 
0700: 61 73 73 6f 63 69 61 74 65 64 20 22 62 69 67 62  associated "bigb
0710: 6c 6f 62 22 20 76 61 6c 75 65 73 20 64 69 72 65  lob" values dire
0720: 63 74 6c 79 20 66 72 6f 6d 20 74 61 62 6c 65 20  ctly from table 
0730: 74 31 20 61 73 20 74 68 65 0a 2a 2a 20 31 30 20  t1 as the.** 10 
0740: 73 6d 61 6c 6c 65 73 74 20 22 61 22 20 76 61 6c  smallest "a" val
0750: 75 65 73 20 61 72 65 20 65 78 74 72 61 63 74 65  ues are extracte
0760: 64 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65  d from the sorte
0770: 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  r..**.** When th
0780: 65 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e  e sorter-referen
0790: 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ce optimization 
07a0: 69 73 20 75 73 65 64 2c 20 74 68 65 72 65 20 69  is used, there i
07b0: 73 20 6f 6e 65 20 65 6e 74 72 79 20 69 6e 20 74  s one entry in t
07c0: 68 65 0a 2a 2a 20 61 44 65 66 65 72 5b 5d 20 61  he.** aDefer[] a
07d0: 72 72 61 79 20 66 6f 72 20 65 61 63 68 20 64 61  rray for each da
07e0: 74 61 62 61 73 65 20 74 61 62 6c 65 20 74 68 61  tabase table tha
07f0: 74 20 6d 61 79 20 62 65 20 72 65 61 64 20 61 73  t may be read as
0800: 20 76 61 6c 75 65 73 20 61 72 65 0a 2a 2a 20 65   values are.** e
0810: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
0820: 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 74 79 70  e sorter..*/.typ
0830: 65 64 65 66 20 73 74 72 75 63 74 20 53 6f 72 74  edef struct Sort
0840: 43 74 78 20 53 6f 72 74 43 74 78 3b 0a 73 74 72  Ctx SortCtx;.str
0850: 75 63 74 20 53 6f 72 74 43 74 78 20 7b 0a 20 20  uct SortCtx {.  
0860: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
0870: 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  By;   /* The ORD
0880: 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20  ER BY (or GROUP 
0890: 42 59 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20  BY clause) */.  
08a0: 69 6e 74 20 6e 4f 42 53 61 74 3b 20 20 20 20 20  int nOBSat;     
08b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
08c0: 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  of ORDER BY term
08d0: 73 20 73 61 74 69 73 66 69 65 64 20 62 79 20 69  s satisfied by i
08e0: 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndices */.  int 
08f0: 69 45 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20  iECursor;       
0900: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
0910: 65 72 20 66 6f 72 20 74 68 65 20 73 6f 72 74 65  er for the sorte
0920: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  r */.  int regRe
0930: 74 75 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20  turn;        /* 
0940: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
0950: 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65   block-output re
0960: 74 75 72 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a  turn address */.
0970: 20 20 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74    int labelBkOut
0980: 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74  ;       /* Start
0990: 20 6c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 62   label for the b
09a0: 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 73 75 62 72  lock-output subr
09b0: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
09c0: 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20  addrSortIndex;  
09d0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
09e0: 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  the OP_SorterOpe
09f0: 6e 20 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65  n or OP_OpenEphe
0a00: 6d 65 72 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6c  meral */.  int l
0a10: 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20  abelDone;       
0a20: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68   /* Jump here wh
0a30: 65 6e 20 64 6f 6e 65 2c 20 65 78 3a 20 4c 49 4d  en done, ex: LIM
0a40: 49 54 20 72 65 61 63 68 65 64 20 2a 2f 0a 20 20  IT reached */.  
0a50: 75 38 20 73 6f 72 74 46 6c 61 67 73 3b 20 20 20  u8 sortFlags;   
0a60: 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72        /* Zero or
0a70: 20 6d 6f 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a   more SORTFLAG_*
0a80: 20 62 69 74 73 20 2a 2f 0a 20 20 75 38 20 62 4f   bits */.  u8 bO
0a90: 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3b  rderedInnerLoop;
0aa0: 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 72   /* ORDER BY cor
0ab0: 72 65 63 74 6c 79 20 73 6f 72 74 73 20 74 68 65  rectly sorts the
0ac0: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 23   inner loop */.#
0ad0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
0ae0: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
0af0: 45 4e 43 45 53 0a 20 20 75 38 20 6e 44 65 66 65  ENCES.  u8 nDefe
0b00: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
0b10: 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64   Number of valid
0b20: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 44 65 66   entries in aDef
0b30: 65 72 5b 5d 20 2a 2f 0a 20 20 73 74 72 75 63 74  er[] */.  struct
0b40: 20 44 65 66 65 72 72 65 64 43 73 72 20 7b 0a 20   DeferredCsr {. 
0b50: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20     Table *pTab; 
0b60: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
0b70: 64 65 66 69 6e 69 74 69 6f 6e 20 2a 2f 0a 20 20  definition */.  
0b80: 20 20 69 6e 74 20 69 43 73 72 3b 20 20 20 20 20    int iCsr;     
0b90: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
0ba0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65  number for table
0bb0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79   */.    int nKey
0bc0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
0bd0: 75 6d 62 65 72 20 6f 66 20 50 4b 20 63 6f 6c 75  umber of PK colu
0be0: 6d 6e 73 20 66 6f 72 20 74 61 62 6c 65 20 70 54  mns for table pT
0bf0: 61 62 20 28 3e 3d 31 29 20 2a 2f 0a 20 20 7d 20  ab (>=1) */.  } 
0c00: 61 44 65 66 65 72 5b 34 5d 3b 0a 23 65 6e 64 69  aDefer[4];.#endi
0c10: 66 0a 20 20 73 74 72 75 63 74 20 52 6f 77 4c 6f  f.  struct RowLo
0c20: 61 64 49 6e 66 6f 20 2a 70 44 65 66 65 72 72 65  adInfo *pDeferre
0c30: 64 52 6f 77 4c 6f 61 64 3b 20 20 2f 2a 20 44 65  dRowLoad;  /* De
0c40: 66 65 72 72 65 64 20 72 6f 77 20 6c 6f 61 64 69  ferred row loadi
0c50: 6e 67 20 69 6e 66 6f 20 6f 72 20 4e 55 4c 4c 20  ng info or NULL 
0c60: 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 53 4f  */.};.#define SO
0c70: 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72  RTFLAG_UseSorter
0c80: 20 20 30 78 30 31 20 20 20 2f 2a 20 55 73 65 20    0x01   /* Use 
0c90: 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 65  SorterOpen inste
0ca0: 61 64 20 6f 66 20 4f 70 65 6e 45 70 68 65 6d 65  ad of OpenEpheme
0cb0: 72 61 6c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65  ral */../*.** De
0cc0: 6c 65 74 65 20 61 6c 6c 20 74 68 65 20 63 6f 6e  lete all the con
0cd0: 74 65 6e 74 20 6f 66 20 61 20 53 65 6c 65 63 74  tent of a Select
0ce0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 44 65 61   structure.  Dea
0cf0: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 74 72 75  llocate the stru
0d00: 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20  cture.** itself 
0d10: 6f 6e 6c 79 20 69 66 20 62 46 72 65 65 20 69 73  only if bFree is
0d20: 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   true..*/.static
0d30: 20 76 6f 69 64 20 63 6c 65 61 72 53 65 6c 65 63   void clearSelec
0d40: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  t(sqlite3 *db, S
0d50: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 62 46  elect *p, int bF
0d60: 72 65 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70  ree){.  while( p
0d70: 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a   ){.    Select *
0d80: 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
0d90: 6f 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  or;.    sqlite3E
0da0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
0db0: 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
0dc0: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
0dd0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53  Delete(db, p->pS
0de0: 72 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rc);.    sqlite3
0df0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
0e00: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73  ->pWhere);.    s
0e10: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
0e20: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 47 72 6f  lete(db, p->pGro
0e30: 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  upBy);.    sqlit
0e40: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
0e50: 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
0e60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
0e70: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
0e80: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71  OrderBy);.    sq
0e90: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0ea0: 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
0eb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
0ec0: 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20  MIT_WINDOWFUNC. 
0ed0: 20 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57     if( OK_IF_ALW
0ee0: 41 59 53 5f 54 52 55 45 28 70 2d 3e 70 57 69 6e  AYS_TRUE(p->pWin
0ef0: 44 65 66 6e 29 20 29 7b 0a 20 20 20 20 20 20 73  Defn) ){.      s
0f00: 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c 69 73 74  qlite3WindowList
0f10: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57  Delete(db, p->pW
0f20: 69 6e 44 65 66 6e 29 3b 0a 20 20 20 20 7d 0a 23  inDefn);.    }.#
0f30: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 4f 4b  endif.    if( OK
0f40: 5f 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28  _IF_ALWAYS_TRUE(
0f50: 70 2d 3e 70 57 69 74 68 29 20 29 20 73 71 6c 69  p->pWith) ) sqli
0f60: 74 65 33 57 69 74 68 44 65 6c 65 74 65 28 64 62  te3WithDelete(db
0f70: 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a 20 20 20  , p->pWith);.   
0f80: 20 69 66 28 20 62 46 72 65 65 20 29 20 73 71 6c   if( bFree ) sql
0f90: 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
0fa0: 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70 50 72   p);.    p = pPr
0fb0: 69 6f 72 3b 0a 20 20 20 20 62 46 72 65 65 20 3d  ior;.    bFree =
0fc0: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
0fd0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 53 65   Initialize a Se
0fe0: 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75  lectDest structu
0ff0: 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  re..*/.void sqli
1000: 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
1010: 74 28 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44  t(SelectDest *pD
1020: 65 73 74 2c 20 69 6e 74 20 65 44 65 73 74 2c 20  est, int eDest, 
1030: 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 70 44  int iParm){.  pD
1040: 65 73 74 2d 3e 65 44 65 73 74 20 3d 20 28 75 38  est->eDest = (u8
1050: 29 65 44 65 73 74 3b 0a 20 20 70 44 65 73 74 2d  )eDest;.  pDest-
1060: 3e 69 53 44 50 61 72 6d 20 3d 20 69 50 61 72 6d  >iSDParm = iParm
1070: 3b 0a 20 20 70 44 65 73 74 2d 3e 7a 41 66 66 53  ;.  pDest->zAffS
1080: 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73 74  dst = 0;.  pDest
1090: 2d 3e 69 53 64 73 74 20 3d 20 30 3b 0a 20 20 70  ->iSdst = 0;.  p
10a0: 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 30 3b  Dest->nSdst = 0;
10b0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  .}.../*.** Alloc
10c0: 61 74 65 20 61 20 6e 65 77 20 53 65 6c 65 63 74  ate a new Select
10d0: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 72   structure and r
10e0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
10f0: 74 6f 20 74 68 61 74 0a 2a 2a 20 73 74 72 75 63  to that.** struc
1100: 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20  ture..*/.Select 
1110: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65  *sqlite3SelectNe
1120: 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  w(.  Parse *pPar
1130: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
1140: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1150: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
1160: 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69 63  ist,     /* whic
1170: 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63  h columns to inc
1180: 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65 73 75  lude in the resu
1190: 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  lt */.  SrcList 
11a0: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f 2a  *pSrc,        /*
11b0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
11c0: 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65 73   -- which tables
11d0: 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78   to scan */.  Ex
11e0: 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
11f0: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45      /* the WHERE
1200: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
1210: 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 2c  rList *pGroupBy,
1220: 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50 20     /* the GROUP 
1230: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  BY clause */.  E
1240: 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20 20  xpr *pHaving,   
1250: 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56 49       /* the HAVI
1260: 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  NG clause */.  E
1270: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
1280: 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44 45  y,   /* the ORDE
1290: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
12a0: 20 75 33 32 20 73 65 6c 46 6c 61 67 73 2c 20 20   u32 selFlags,  
12b0: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 70         /* Flag p
12c0: 61 72 61 6d 65 74 65 72 73 2c 20 73 75 63 68 20  arameters, such 
12d0: 61 73 20 53 46 5f 44 69 73 74 69 6e 63 74 20 2a  as SF_Distinct *
12e0: 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74  /.  Expr *pLimit
12f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d            /* LIM
1300: 49 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20  IT value.  NULL 
1310: 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a  means not used *
1320: 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
1330: 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 73 74  New;.  Select st
1340: 61 6e 64 69 6e 3b 0a 20 20 70 4e 65 77 20 3d 20  andin;.  pNew = 
1350: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
1360: 61 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c  awNN(pParse->db,
1370: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
1380: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
1390: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
13a0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
13b0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70  cFailed );.    p
13c0: 4e 65 77 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a  New = &standin;.
13d0: 20 20 7d 0a 20 20 69 66 28 20 70 45 4c 69 73 74    }.  if( pEList
13e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 45 4c 69 73  ==0 ){.    pELis
13f0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
1400: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
1410: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1430: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1440: 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 54  xpr(pParse->db,T
1450: 4b 5f 41 53 54 45 52 49 53 4b 2c 30 29 29 3b 0a  K_ASTERISK,0));.
1460: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69    }.  pNew->pELi
1470: 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 70  st = pEList;.  p
1480: 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c  New->op = TK_SEL
1490: 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c  ECT;.  pNew->sel
14a0: 46 6c 61 67 73 20 3d 20 73 65 6c 46 6c 61 67 73  Flags = selFlags
14b0: 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74  ;.  pNew->iLimit
14c0: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f   = 0;.  pNew->iO
14d0: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4e 65  ffset = 0;.  pNe
14e0: 77 2d 3e 73 65 6c 49 64 20 3d 20 2b 2b 70 50 61  w->selId = ++pPa
14f0: 72 73 65 2d 3e 6e 53 65 6c 65 63 74 3b 0a 20 20  rse->nSelect;.  
1500: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
1510: 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[0] = -1;.  pN
1520: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
1530: 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [1] = -1;.  pNew
1540: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30  ->nSelectRow = 0
1550: 3b 0a 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20  ;.  if( pSrc==0 
1560: 29 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ) pSrc = sqlite3
1570: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61  DbMallocZero(pPa
1580: 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28  rse->db, sizeof(
1590: 2a 70 53 72 63 29 29 3b 0a 20 20 70 4e 65 77 2d  *pSrc));.  pNew-
15a0: 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20  >pSrc = pSrc;.  
15b0: 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70  pNew->pWhere = p
15c0: 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 70  Where;.  pNew->p
15d0: 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70  GroupBy = pGroup
15e0: 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76  By;.  pNew->pHav
15f0: 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20  ing = pHaving;. 
1600: 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
1610: 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 4e  = pOrderBy;.  pN
1620: 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a  ew->pPrior = 0;.
1630: 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20    pNew->pNext = 
1640: 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69  0;.  pNew->pLimi
1650: 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e  t = pLimit;.  pN
1660: 65 77 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 23  ew->pWith = 0;.#
1670: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1680: 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20  IT_WINDOWFUNC.  
1690: 70 4e 65 77 2d 3e 70 57 69 6e 20 3d 20 30 3b 0a  pNew->pWin = 0;.
16a0: 20 20 70 4e 65 77 2d 3e 70 57 69 6e 44 65 66 6e    pNew->pWinDefn
16b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69   = 0;.#endif.  i
16c0: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
16d0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a  allocFailed ) {.
16e0: 20 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28      clearSelect(
16f0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 65 77  pParse->db, pNew
1700: 2c 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e  , pNew!=&standin
1710: 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b  );.    pNew = 0;
1720: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
1730: 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 53 72 63  sert( pNew->pSrc
1740: 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  !=0 || pParse->n
1750: 45 72 72 3e 30 20 29 3b 0a 20 20 7d 0a 20 20 61  Err>0 );.  }.  a
1760: 73 73 65 72 74 28 20 70 4e 65 77 21 3d 26 73 74  ssert( pNew!=&st
1770: 61 6e 64 69 6e 20 29 3b 0a 20 20 72 65 74 75 72  andin );.  retur
1780: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  n pNew;.}.../*.*
1790: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67 69 76  * Delete the giv
17a0: 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  en Select struct
17b0: 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69  ure and all of i
17c0: 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65 73  ts substructures
17d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
17e0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 73 71  3SelectDelete(sq
17f0: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
1800: 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 4f 4b 5f  t *p){.  if( OK_
1810: 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70  IF_ALWAYS_TRUE(p
1820: 29 20 29 20 63 6c 65 61 72 53 65 6c 65 63 74 28  ) ) clearSelect(
1830: 64 62 2c 20 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a  db, p, 1);.}../*
1840: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
1850: 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69 67 68  nter to the righ
1860: 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
1870: 61 74 65 6d 65 6e 74 20 69 6e 20 61 20 63 6f 6d  atement in a com
1880: 70 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  pound..*/.static
1890: 20 53 65 6c 65 63 74 20 2a 66 69 6e 64 52 69 67   Select *findRig
18a0: 68 74 6d 6f 73 74 28 53 65 6c 65 63 74 20 2a 70  htmost(Select *p
18b0: 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70  ){.  while( p->p
18c0: 4e 65 78 74 20 29 20 70 20 3d 20 70 2d 3e 70 4e  Next ) p = p->pN
18d0: 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  ext;.  return p;
18e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
18f0: 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69 65  1 to 3 identifie
1900: 72 73 20 70 72 65 63 65 64 69 6e 67 20 74 68 65  rs preceding the
1910: 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64   JOIN keyword, d
1920: 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20  etermine the.** 
1930: 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52  type of join.  R
1940: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
1950: 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 65   constant that e
1960: 78 70 72 65 73 73 65 73 20 74 68 61 74 20 74 79  xpresses that ty
1970: 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f  pe.** in terms o
1980: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1990: 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a  bit values:.**.*
19a0: 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a  *     JT_INNER.*
19b0: 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a  *     JT_CROSS.*
19c0: 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a  *     JT_OUTER.*
19d0: 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c  *     JT_NATURAL
19e0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a  .**     JT_LEFT.
19f0: 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54 0a  **     JT_RIGHT.
1a00: 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74  **.** A full out
1a10: 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20 63  er join is the c
1a20: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54  ombination of JT
1a30: 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49 47  _LEFT and JT_RIG
1a40: 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  HT..**.** If an 
1a50: 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75 70  illegal or unsup
1a60: 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65  ported join type
1a70: 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 73   is seen, then s
1a80: 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61  till return.** a
1a90: 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74 20   join type, but 
1aa0: 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  put an error in 
1ab0: 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
1ac0: 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ture..*/.int sql
1ad0: 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61 72  ite3JoinType(Par
1ae0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
1af0: 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42  n *pA, Token *pB
1b00: 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20  , Token *pC){.  
1b10: 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30  int jointype = 0
1b20: 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c  ;.  Token *apAll
1b30: 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b  [3];.  Token *p;
1b40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b60: 20 20 20 30 31 32 33 34 35 36 37 38 39 20 31 32     0123456789 12
1b70: 33 34 35 36 37 38 39 20 31 32 33 34 35 36 37 38  3456789 12345678
1b80: 39 20 31 32 33 20 2a 2f 0a 20 20 73 74 61 74 69  9 123 */.  stati
1b90: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65  c const char zKe
1ba0: 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61 74 75 72  yText[] = "natur
1bb0: 61 6c 65 66 74 6f 75 74 65 72 69 67 68 74 66 75  aleftouterightfu
1bc0: 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22 3b 0a 20  llinnercross";. 
1bd0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
1be0: 72 75 63 74 20 7b 0a 20 20 20 20 75 38 20 69 3b  ruct {.    u8 i;
1bf0: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
1c00: 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f 72 64 20  ning of keyword 
1c10: 74 65 78 74 20 69 6e 20 7a 4b 65 79 54 65 78 74  text in zKeyText
1c20: 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 6e 43 68  [] */.    u8 nCh
1c30: 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68  ar;    /* Length
1c40: 20 6f 66 20 74 68 65 20 6b 65 79 77 6f 72 64 20   of the keyword 
1c50: 69 6e 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f  in characters */
1c60: 0a 20 20 20 20 75 38 20 63 6f 64 65 3b 20 20 20  .    u8 code;   
1c70: 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70 65 20 6d    /* Join type m
1c80: 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77  ask */.  } aKeyw
1c90: 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a  ord[] = {.    /*
1ca0: 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b 20 30 2c   natural */ { 0,
1cb0: 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20    7, JT_NATURAL 
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1cd0: 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74 20 20 20  ,.    /* left   
1ce0: 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20 4a 54 5f   */ { 6,  4, JT_
1cf0: 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20  LEFT|JT_OUTER   
1d00: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1d10: 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b 20 31 30   outer   */ { 10
1d20: 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 20 20  , 5, JT_OUTER   
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1d40: 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68 74 20 20  ,.    /* right  
1d50: 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20 4a 54 5f   */ { 14, 5, JT_
1d60: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 20  RIGHT|JT_OUTER  
1d70: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1d80: 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b 20 31 39   full    */ { 19
1d90: 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f  , 4, JT_LEFT|JT_
1da0: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d  RIGHT|JT_OUTER }
1db0: 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65 72 20 20  ,.    /* inner  
1dc0: 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20 4a 54 5f   */ { 23, 5, JT_
1dd0: 49 4e 4e 45 52 20 20 20 20 20 20 20 20 20 20 20  INNER           
1de0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1df0: 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b 20 32 38   cross   */ { 28
1e00: 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54  , 5, JT_INNER|JT
1e10: 5f 43 52 4f 53 53 20 20 20 20 20 20 20 20 20 7d  _CROSS         }
1e20: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20  ,.  };.  int i, 
1e30: 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20  j;.  apAll[0] = 
1e40: 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d  pA;.  apAll[1] =
1e50: 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20   pB;.  apAll[2] 
1e60: 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  = pC;.  for(i=0;
1e70: 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d   i<3 && apAll[i]
1e80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
1e90: 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f  apAll[i];.    fo
1ea0: 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69  r(j=0; j<ArraySi
1eb0: 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b 20 6a 2b  ze(aKeyword); j+
1ec0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
1ed0: 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e  >n==aKeyword[j].
1ee0: 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20  nChar .         
1ef0: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
1f00: 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c  Cmp((char*)p->z,
1f10: 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b 65 79 77   &zKeyText[aKeyw
1f20: 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29  ord[j].i], p->n)
1f30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a  ==0 ){.        j
1f40: 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b 65 79 77  ointype |= aKeyw
1f50: 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20  ord[j].code;.   
1f60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f70: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65    }.    }.    te
1f80: 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 7c 7c 20  stcase( j==0 || 
1f90: 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20  j==1 || j==2 || 
1fa0: 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20  j==3 || j==4 || 
1fb0: 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a  j==5 || j==6 );.
1fc0: 20 20 20 20 69 66 28 20 6a 3e 3d 41 72 72 61 79      if( j>=Array
1fd0: 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 20 29  Size(aKeyword) )
1fe0: 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65  {.      jointype
1ff0: 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20   |= JT_ERROR;.  
2000: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2010: 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20  .  }.  if(.     
2020: 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f  (jointype & (JT_
2030: 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29  INNER|JT_OUTER))
2040: 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f  ==(JT_INNER|JT_O
2050: 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a  UTER) ||.     (j
2060: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52  ointype & JT_ERR
2070: 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  OR)!=0.  ){.    
2080: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 20  const char *zSp 
2090: 3d 20 22 20 22 3b 0a 20 20 20 20 61 73 73 65 72  = " ";.    asser
20a0: 74 28 20 70 42 21 3d 30 20 29 3b 0a 20 20 20 20  t( pB!=0 );.    
20b0: 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70  if( pC==0 ){ zSp
20c0: 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74 65  ++; }.    sqlite
20d0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
20e0: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e  , "unknown or un
20f0: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
2100: 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20 22 25  ype: ".       "%
2110: 54 20 25 54 25 73 25 54 22 2c 20 70 41 2c 20 70  T %T%s%T", pA, p
2120: 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20  B, zSp, pC);.   
2130: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49   jointype = JT_I
2140: 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NNER;.  }else if
2150: 28 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  ( (jointype & JT
2160: 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20 20  _OUTER)!=0 .    
2170: 20 20 20 20 20 26 26 20 28 6a 6f 69 6e 74 79 70       && (jointyp
2180: 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  e & (JT_LEFT|JT_
2190: 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c 45 46 54  RIGHT))!=JT_LEFT
21a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
21b0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
21c0: 0a 20 20 20 20 20 20 22 52 49 47 48 54 20 61 6e  .      "RIGHT an
21d0: 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49  d FULL OUTER JOI
21e0: 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65  Ns are not curre
21f0: 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29  ntly supported")
2200: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
2210: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20   JT_INNER;.  }. 
2220: 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65   return jointype
2230: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2240: 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  n the index of a
2250: 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62   column in a tab
2260: 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69  le.  Return -1 i
2270: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  f the column.** 
2280: 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
2290: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
22a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c  /.static int col
22b0: 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a  umnIndex(Table *
22c0: 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72  pTab, const char
22d0: 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69   *zCol){.  int i
22e0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
22f0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
2300: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2310: 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43  StrICmp(pTab->aC
2320: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f  ol[i].zName, zCo
2330: 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  l)==0 ) return i
2340: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
2350: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  1;.}../*.** Sear
2360: 63 68 20 74 68 65 20 66 69 72 73 74 20 4e 20 74  ch the first N t
2370: 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2c 20 66  ables in pSrc, f
2380: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
2390: 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  t, looking for a
23a0: 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61 74 20 68  .** table that h
23b0: 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  as a column name
23c0: 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20  d zCol.  .**.** 
23d0: 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73 65 74 20  When found, set 
23e0: 2a 70 69 54 61 62 20 61 6e 64 20 2a 70 69 43 6f  *piTab and *piCo
23f0: 6c 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 69  l to the table i
2400: 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  ndex and column 
2410: 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74 68 65 20  index.** of the 
2420: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
2430: 61 6e 64 20 72 65 74 75 72 6e 20 54 52 55 45 2e  and return TRUE.
2440: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20 66 6f  .**.** If not fo
2450: 75 6e 64 2c 20 72 65 74 75 72 6e 20 46 41 4c 53  und, return FALS
2460: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
2470: 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49   tableAndColumnI
2480: 6e 64 65 78 28 0a 20 20 53 72 63 4c 69 73 74 20  ndex(.  SrcList 
2490: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 2f 2a 20  *pSrc,       /* 
24a0: 41 72 72 61 79 20 6f 66 20 74 61 62 6c 65 73 20  Array of tables 
24b0: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69  to search */.  i
24c0: 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20  nt N,           
24d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
24e0: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2d   tables in pSrc-
24f0: 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63 68 20 2a  >a[] to search *
2500: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2510: 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65  zCol,    /* Name
2520: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77   of the column w
2530: 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f  e are looking fo
2540: 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61  r */.  int *piTa
2550: 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  b,          /* W
2560: 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53  rite index of pS
2570: 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20 2a 2f 0a  rc->a[] here */.
2580: 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20 20 20 20    int *piCol    
2590: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
25a0: 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d 3e 61  index of pSrc->a
25b0: 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62 2d 3e 61  [*piTab].pTab->a
25c0: 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a 29 7b  Col[] here */.){
25d0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
25e0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
25f0: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c  ooping over tabl
2600: 65 73 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20  es in pSrc */.  
2610: 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  int iCol;       
2620: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2630: 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68 69 6e 67   column matching
2640: 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73 65   zCol */..  asse
2650: 72 74 28 20 28 70 69 54 61 62 3d 3d 30 29 3d 3d  rt( (piTab==0)==
2660: 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f  (piCol==0) );  /
2670: 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69 74 68 65  * Both or neithe
2680: 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  r are NULL */.  
2690: 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b  for(i=0; i<N; i+
26a0: 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 63  +){.    iCol = c
26b0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2d  olumnIndex(pSrc-
26c0: 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c  >a[i].pTab, zCol
26d0: 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e  );.    if( iCol>
26e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
26f0: 70 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  piTab ){.       
2700: 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a 20 20 20   *piTab = i;.   
2710: 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 43       *piCol = iC
2720: 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ol;.      }.    
2730: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2740: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2750: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2760: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
2770: 20 74 6f 20 61 64 64 20 74 65 72 6d 73 20 69 6d   to add terms im
2780: 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e 20 73 79  plied by JOIN sy
2790: 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a 2a 20 57  ntax to the.** W
27a0: 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72  HERE clause expr
27b0: 65 73 73 69 6f 6e 20 6f 66 20 61 20 53 45 4c 45  ession of a SELE
27c0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  CT statement. Th
27d0: 65 20 6e 65 77 20 74 65 72 6d 2c 20 77 68 69 63  e new term, whic
27e0: 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64 20 77 69  h.** is ANDed wi
27f0: 74 68 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  th the existing 
2800: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 73  WHERE clause, is
2810: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
2820: 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e 63 6f 6c  .**    (tab1.col
2830: 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32 29 0a 2a  1 = tab2.col2).*
2840: 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 31 20  *.** where tab1 
2850: 69 73 20 74 68 65 20 69 53 72 63 27 74 68 20 74  is the iSrc'th t
2860: 61 62 6c 65 20 69 6e 20 53 72 63 4c 69 73 74 20  able in SrcList 
2870: 70 53 72 63 20 61 6e 64 20 74 61 62 32 20 69 73  pSrc and tab2 is
2880: 20 74 68 65 20 0a 2a 2a 20 28 69 53 72 63 2b 31   the .** (iSrc+1
2890: 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c  )'th. Column col
28a0: 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c  1 is column iCol
28b0: 4c 65 66 74 20 6f 66 20 74 61 62 31 2c 20 61 6e  Left of tab1, an
28c0: 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c  d col2 is.** col
28d0: 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74 20 6f 66  umn iColRight of
28e0: 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63   tab2..*/.static
28f0: 20 76 6f 69 64 20 61 64 64 57 68 65 72 65 54 65   void addWhereTe
2900: 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rm(.  Parse *pPa
2910: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
2920: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
2930: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
2940: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2960: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
2970: 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  in FROM clause *
2980: 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74 2c 20 20  /.  int iLeft,  
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
29b0: 66 69 72 73 74 20 74 61 62 6c 65 20 74 6f 20 6a  first table to j
29c0: 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20  oin in pSrc */. 
29d0: 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74 2c 20 20   int iColLeft,  
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
2a00: 75 6d 6e 20 69 6e 20 66 69 72 73 74 20 74 61 62  umn in first tab
2a10: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67  le */.  int iRig
2a20: 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ht,             
2a30: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2a40: 20 6f 66 20 73 65 63 6f 6e 64 20 74 61 62 6c 65   of second table
2a50: 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e   in pSrc */.  in
2a60: 74 20 69 43 6f 6c 52 69 67 68 74 2c 20 20 20 20  t iColRight,    
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a80: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
2a90: 20 69 6e 20 73 65 63 6f 6e 64 20 74 61 62 6c 65   in second table
2aa0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74 65   */.  int isOute
2ab0: 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20 20 20 20  rJoin,          
2ac0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2ad0: 20 74 68 69 73 20 69 73 20 61 6e 20 4f 55 54 45   this is an OUTE
2ae0: 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72  R join */.  Expr
2af0: 20 2a 2a 70 70 57 68 65 72 65 20 20 20 20 20 20   **ppWhere      
2b00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2b10: 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48 45 52 45  N/OUT: The WHERE
2b20: 20 63 6c 61 75 73 65 20 74 6f 20 61 64 64 20 74   clause to add t
2b30: 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  o */.){.  sqlite
2b40: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
2b50: 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 31 3b  db;.  Expr *pE1;
2b60: 0a 20 20 45 78 70 72 20 2a 70 45 32 3b 0a 20 20  .  Expr *pE2;.  
2b70: 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73  Expr *pEq;..  as
2b80: 73 65 72 74 28 20 69 4c 65 66 74 3c 69 52 69 67  sert( iLeft<iRig
2b90: 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ht );.  assert( 
2ba0: 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52 69 67 68  pSrc->nSrc>iRigh
2bb0: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
2bc0: 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70 54  Src->a[iLeft].pT
2bd0: 61 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ab );.  assert( 
2be0: 70 53 72 63 2d 3e 61 5b 69 52 69 67 68 74 5d 2e  pSrc->a[iRight].
2bf0: 70 54 61 62 20 29 3b 0a 0a 20 20 70 45 31 20 3d  pTab );..  pE1 =
2c00: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f   sqlite3CreateCo
2c10: 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72  lumnExpr(db, pSr
2c20: 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f 6c 4c 65  c, iLeft, iColLe
2c30: 66 74 29 3b 0a 20 20 70 45 32 20 3d 20 73 71 6c  ft);.  pE2 = sql
2c40: 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e  ite3CreateColumn
2c50: 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20 69  Expr(db, pSrc, i
2c60: 52 69 67 68 74 2c 20 69 43 6f 6c 52 69 67 68 74  Right, iColRight
2c70: 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73 71 6c 69  );..  pEq = sqli
2c80: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
2c90: 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20 70 45 32   TK_EQ, pE1, pE2
2ca0: 29 3b 0a 20 20 69 66 28 20 70 45 71 20 26 26 20  );.  if( pEq && 
2cb0: 69 73 4f 75 74 65 72 4a 6f 69 6e 20 29 7b 0a 20  isOuterJoin ){. 
2cc0: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
2cd0: 74 79 28 70 45 71 2c 20 45 50 5f 46 72 6f 6d 4a  ty(pEq, EP_FromJ
2ce0: 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72 74  oin);.    assert
2cf0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2d00: 74 79 28 70 45 71 2c 20 45 50 5f 54 6f 6b 65 6e  ty(pEq, EP_Token
2d10: 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
2d20: 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74 56   );.    ExprSetV
2d30: 56 41 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20  VAProperty(pEq, 
2d40: 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
2d50: 20 20 70 45 71 2d 3e 69 52 69 67 68 74 4a 6f 69    pEq->iRightJoi
2d60: 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 70 45  nTable = (i16)pE
2d70: 32 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 7d 0a 20  2->iTable;.  }. 
2d80: 20 2a 70 70 57 68 65 72 65 20 3d 20 73 71 6c 69   *ppWhere = sqli
2d90: 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 2a  te3ExprAnd(db, *
2da0: 70 70 57 68 65 72 65 2c 20 70 45 71 29 3b 0a 7d  ppWhere, pEq);.}
2db0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
2dc0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70  EP_FromJoin prop
2dd0: 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d  erty on all term
2de0: 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65  s of the given e
2df0: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e  xpression..** An
2e00: 64 20 73 65 74 20 74 68 65 20 45 78 70 72 2e 69  d set the Expr.i
2e10: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74  RightJoinTable t
2e20: 6f 20 69 54 61 62 6c 65 20 66 6f 72 20 65 76 65  o iTable for eve
2e30: 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a  ry term in the.*
2e40: 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  * expression..**
2e50: 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a  .** The EP_FromJ
2e60: 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 69 73 20  oin property is 
2e70: 75 73 65 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66  used on terms of
2e80: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
2e90: 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45  o tell.** the LE
2ea0: 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72  FT OUTER JOIN pr
2eb0: 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 74  ocessing logic t
2ec0: 68 61 74 20 74 68 69 73 20 74 65 72 6d 20 69 73  hat this term is
2ed0: 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20   part of the.** 
2ee0: 6a 6f 69 6e 20 72 65 73 74 72 69 63 74 69 6f 6e  join restriction
2ef0: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
2f00: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
2f10: 61 75 73 65 20 61 6e 64 20 6e 6f 74 20 61 20 70  ause and not a p
2f20: 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f  art.** of the mo
2f30: 72 65 20 67 65 6e 65 72 61 6c 20 57 48 45 52 45  re general WHERE
2f40: 20 63 6c 61 75 73 65 2e 20 20 54 68 65 73 65 20   clause.  These 
2f50: 74 65 72 6d 73 20 61 72 65 20 6d 6f 76 65 64 20  terms are moved 
2f60: 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57  over to the.** W
2f70: 48 45 52 45 20 63 6c 61 75 73 65 20 64 75 72 69  HERE clause duri
2f80: 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69  ng join processi
2f90: 6e 67 20 62 75 74 20 77 65 20 6e 65 65 64 20 74  ng but we need t
2fa0: 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 20  o remember that 
2fb0: 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74  they.** originat
2fc0: 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  ed in the ON or 
2fd0: 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a  USING clause..**
2fe0: 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 69 52 69  .** The Expr.iRi
2ff0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 65 6c  ghtJoinTable tel
3000: 6c 73 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ls the WHERE cla
3010: 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 74  use processing t
3020: 68 61 74 20 74 68 65 0a 2a 2a 20 65 78 70 72 65  hat the.** expre
3030: 73 73 69 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e  ssion depends on
3040: 20 74 61 62 6c 65 20 69 52 69 67 68 74 4a 6f 69   table iRightJoi
3050: 6e 54 61 62 6c 65 20 65 76 65 6e 20 69 66 20 74  nTable even if t
3060: 68 61 74 20 74 61 62 6c 65 20 69 73 20 6e 6f 74  hat table is not
3070: 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 6d  .** explicitly m
3080: 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20  entioned in the 
3090: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 61  expression.  Tha
30a0: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  t information is
30b0: 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72 20 63   needed.** for c
30c0: 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ases like this:.
30d0: 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
30e0: 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a  * FROM t1 LEFT J
30f0: 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74  OIN t2 ON t1.a=t
3100: 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35 0a 2a  2.b AND t1.x=5.*
3110: 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72 65 20 63  *.** The where c
3120: 6c 61 75 73 65 20 6e 65 65 64 73 20 74 6f 20 64  lause needs to d
3130: 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e  efer the handlin
3140: 67 20 6f 66 20 74 68 65 20 74 31 2e 78 3d 35 0a  g of the t1.x=5.
3150: 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20 61 66  ** term until af
3160: 74 65 72 20 74 68 65 20 74 32 20 6c 6f 6f 70 20  ter the t2 loop 
3170: 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 49 6e  of the join.  In
3180: 20 74 68 61 74 20 77 61 79 2c 20 61 0a 2a 2a 20   that way, a.** 
3190: 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77 69 6c 6c  NULL t2 row will
31a0: 20 62 65 20 69 6e 73 65 72 74 65 64 20 77 68 65   be inserted whe
31b0: 6e 65 76 65 72 20 74 31 2e 78 21 3d 35 2e 20 20  never t1.x!=5.  
31c0: 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20  If we do not.** 
31d0: 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69  defer the handli
31e0: 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20 69 74  ng of t1.x=5, it
31f0: 20 77 69 6c 6c 20 62 65 20 70 72 6f 63 65 73 73   will be process
3200: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a  ed immediately.*
3210: 2a 20 61 66 74 65 72 20 74 68 65 20 74 31 20 6c  * after the t1 l
3220: 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20 77 69 74  oop and rows wit
3230: 68 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c 20 6e  h t1.x!=5 will n
3240: 65 76 65 72 20 61 70 70 65 61 72 20 69 6e 0a 2a  ever appear in.*
3250: 2a 20 74 68 65 20 6f 75 74 70 75 74 2c 20 77 68  * the output, wh
3260: 69 63 68 20 69 73 20 69 6e 63 6f 72 72 65 63 74  ich is incorrect
3270: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3280: 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78 70   setJoinExpr(Exp
3290: 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65  r *p, int iTable
32a0: 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  ){.  while( p ){
32b0: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
32c0: 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a  erty(p, EP_FromJ
32d0: 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72 74  oin);.    assert
32e0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
32f0: 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ty(p, EP_TokenOn
3300: 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29  ly|EP_Reduced) )
3310: 3b 0a 20 20 20 20 45 78 70 72 53 65 74 56 56 41  ;.    ExprSetVVA
3320: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4e  Property(p, EP_N
3330: 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 70 2d  oReduce);.    p-
3340: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
3350: 20 3d 20 28 69 31 36 29 69 54 61 62 6c 65 3b 0a   = (i16)iTable;.
3360: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
3370: 4b 5f 46 55 4e 43 54 49 4f 4e 20 26 26 20 70 2d  K_FUNCTION && p-
3380: 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  >x.pList ){.    
3390: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
33a0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 78 2e 70  or(i=0; i<p->x.p
33b0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
33c0: 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74 4a 6f  ){.        setJo
33d0: 69 6e 45 78 70 72 28 70 2d 3e 78 2e 70 4c 69 73  inExpr(p->x.pLis
33e0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69  t->a[i].pExpr, i
33f0: 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Table);.      }.
3400: 20 20 20 20 7d 0a 20 20 20 20 73 65 74 4a 6f 69      }.    setJoi
3410: 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20  nExpr(p->pLeft, 
3420: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d  iTable);.    p =
3430: 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20   p->pRight;.  } 
3440: 0a 7d 0a 0a 2f 2a 20 55 6e 64 6f 20 74 68 65 20  .}../* Undo the 
3450: 77 6f 72 6b 20 6f 66 20 73 65 74 4a 6f 69 6e 45  work of setJoinE
3460: 78 70 72 28 29 2e 20 20 49 6e 20 74 68 65 20 65  xpr().  In the e
3470: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 70  xpression tree p
3480: 2c 20 63 6f 6e 76 65 72 74 20 65 76 65 72 79 0a  , convert every.
3490: 2a 2a 20 74 65 72 6d 20 74 68 61 74 20 69 73 20  ** term that is 
34a0: 6d 61 72 6b 65 64 20 77 69 74 68 20 45 50 5f 46  marked with EP_F
34b0: 72 6f 6d 4a 6f 69 6e 20 61 6e 64 20 69 52 69 67  romJoin and iRig
34c0: 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69 54 61  htJoinTable==iTa
34d0: 62 6c 65 20 69 6e 74 6f 0a 2a 2a 20 61 6e 20 6f  ble into.** an o
34e0: 72 64 69 6e 61 72 79 20 74 65 72 6d 20 74 68 61  rdinary term tha
34f0: 74 20 6f 6d 69 74 73 20 74 68 65 20 45 50 5f 46  t omits the EP_F
3500: 72 6f 6d 4a 6f 69 6e 20 6d 61 72 6b 2e 0a 2a 2a  romJoin mark..**
3510: 0a 2a 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73  .** This happens
3520: 20 77 68 65 6e 20 61 20 4c 45 46 54 20 4a 4f 49   when a LEFT JOI
3530: 4e 20 69 73 20 73 69 6d 70 6c 69 66 69 65 64 20  N is simplified 
3540: 69 6e 74 6f 20 61 6e 20 6f 72 64 69 6e 61 72 79  into an ordinary
3550: 20 4a 4f 49 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63   JOIN..*/.static
3560: 20 76 6f 69 64 20 75 6e 73 65 74 4a 6f 69 6e 45   void unsetJoinE
3570: 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  xpr(Expr *p, int
3580: 20 69 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c   iTable){.  whil
3590: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  e( p ){.    if( 
35a0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
35b0: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a  p, EP_FromJoin).
35c0: 20 20 20 20 20 26 26 20 28 69 54 61 62 6c 65 3c       && (iTable<
35d0: 30 20 7c 7c 20 70 2d 3e 69 52 69 67 68 74 4a 6f  0 || p->iRightJo
35e0: 69 6e 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 29  inTable==iTable)
35f0: 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 43 6c   ){.      ExprCl
3600: 65 61 72 50 72 6f 70 65 72 74 79 28 70 2c 20 45  earProperty(p, E
3610: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20  P_FromJoin);.   
3620: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70   }.    if( p->op
3630: 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 26 26  ==TK_FUNCTION &&
3640: 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20   p->x.pList ){. 
3650: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
3660: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
3670: 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  x.pList->nExpr; 
3680: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 6e  i++){.        un
3690: 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 78  setJoinExpr(p->x
36a0: 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
36b0: 70 72 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20  pr, iTable);.   
36c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75     }.    }.    u
36d0: 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e  nsetJoinExpr(p->
36e0: 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a  pLeft, iTable);.
36f0: 20 20 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68      p = p->pRigh
3700: 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  t;.  } .}../*.**
3710: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72   This routine pr
3720: 6f 63 65 73 73 65 73 20 74 68 65 20 6a 6f 69 6e  ocesses the join
3730: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
3740: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
3750: 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55  ent..** ON and U
3760: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65  SING clauses are
3770: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
3780: 65 78 74 72 61 20 74 65 72 6d 73 20 6f 66 20 74  extra terms of t
3790: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
37a0: 0a 2a 2a 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e  .** NATURAL join
37b0: 73 20 61 6c 73 6f 20 63 72 65 61 74 65 20 65 78  s also create ex
37c0: 74 72 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  tra WHERE clause
37d0: 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   terms..**.** Th
37e0: 65 20 74 65 72 6d 73 20 6f 66 20 61 20 46 52 4f  e terms of a FRO
37f0: 4d 20 63 6c 61 75 73 65 20 61 72 65 20 63 6f 6e  M clause are con
3800: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 53 65  tained in the Se
3810: 6c 65 63 74 2e 70 53 72 63 20 73 74 72 75 63 74  lect.pSrc struct
3820: 75 72 65 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74  ure..** The left
3830: 20 6d 6f 73 74 20 74 61 62 6c 65 20 69 73 20 74   most table is t
3840: 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
3850: 6e 20 53 65 6c 65 63 74 2e 70 53 72 63 2e 20 20  n Select.pSrc.  
3860: 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a  The right-most.*
3870: 2a 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 6c  * table is the l
3880: 61 73 74 20 65 6e 74 72 79 2e 20 20 54 68 65 20  ast entry.  The 
3890: 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 69 73  join operator is
38a0: 20 68 65 6c 64 20 69 6e 20 74 68 65 20 65 6e 74   held in the ent
38b0: 72 79 20 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66  ry to.** the lef
38c0: 74 2e 20 20 54 68 75 73 20 65 6e 74 72 79 20 30  t.  Thus entry 0
38d0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f   contains the jo
38e0: 69 6e 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20  in operator for 
38f0: 74 68 65 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e  the join between
3900: 0a 2a 2a 20 65 6e 74 72 69 65 73 20 30 20 61 6e  .** entries 0 an
3910: 64 20 31 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20  d 1.  Any ON or 
3920: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 73  USING clauses as
3930: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
3940: 65 20 6a 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c  e join are.** al
3950: 73 6f 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  so attached to t
3960: 68 65 20 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a  he left entry..*
3970: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3980: 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  e returns the nu
3990: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65  mber of errors e
39a0: 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73  ncountered..*/.s
39b0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
39c0: 50 72 6f 63 65 73 73 4a 6f 69 6e 28 50 61 72 73  ProcessJoin(Pars
39d0: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
39e0: 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74  t *p){.  SrcList
39f0: 20 2a 70 53 72 63 3b 20 20 20 20 20 20 20 20 20   *pSrc;         
3a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
3a10: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
3a20: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  OM clause */.  i
3a30: 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3a50: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
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 4c 65 66 74 3b  ist_item *pLeft;
3a80: 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 74 61 62       /* Left tab
3a90: 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20  le being joined 
3aa0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
3ab0: 69 73 74 5f 69 74 65 6d 20 2a 70 52 69 67 68 74  ist_item *pRight
3ac0: 3b 20 20 20 20 2f 2a 20 52 69 67 68 74 20 74 61  ;    /* Right ta
3ad0: 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64  ble being joined
3ae0: 20 2a 2f 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d   */..  pSrc = p-
3af0: 3e 70 53 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d  >pSrc;.  pLeft =
3b00: 20 26 70 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20   &pSrc->a[0];.  
3b10: 70 52 69 67 68 74 20 3d 20 26 70 4c 65 66 74 5b  pRight = &pLeft[
3b20: 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  1];.  for(i=0; i
3b30: 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69  <pSrc->nSrc-1; i
3b40: 2b 2b 2c 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c  ++, pRight++, pL
3b50: 65 66 74 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  eft++){.    Tabl
3b60: 65 20 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70  e *pRightTab = p
3b70: 52 69 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20  Right->pTab;.   
3b80: 20 69 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20   int isOuter;.. 
3b90: 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 4c 65     if( NEVER(pLe
3ba0: 66 74 2d 3e 70 54 61 62 3d 3d 30 20 7c 7c 20 70  ft->pTab==0 || p
3bb0: 52 69 67 68 74 54 61 62 3d 3d 30 29 20 29 20 63  RightTab==0) ) c
3bc0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 73 4f  ontinue;.    isO
3bd0: 75 74 65 72 20 3d 20 28 70 52 69 67 68 74 2d 3e  uter = (pRight->
3be0: 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  fg.jointype & JT
3bf0: 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a 20 20 20  _OUTER)!=0;..   
3c00: 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41 54   /* When the NAT
3c10: 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73 20  URAL keyword is 
3c20: 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48 45  present, add WHE
3c30: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
3c40: 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79  for.    ** every
3c50: 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65   column that the
3c60: 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76 65   two tables have
3c70: 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20   in common..    
3c80: 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  */.    if( pRigh
3c90: 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  t->fg.jointype &
3ca0: 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20   JT_NATURAL ){. 
3cb0: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
3cc0: 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e  >pOn || pRight->
3cd0: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
3ce0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
3cf0: 67 28 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54  g(pParse, "a NAT
3d00: 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f  URAL join may no
3d10: 74 20 68 61 76 65 20 22 0a 20 20 20 20 20 20 20  t have ".       
3d20: 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53      "an ON or US
3d30: 49 4e 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b  ING clause", 0);
3d40: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3d50: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
3d60: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 52 69 67   for(j=0; j<pRig
3d70: 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  htTab->nCol; j++
3d80: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
3d90: 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d  *zName;   /* Nam
3da0: 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  e of column in t
3db0: 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 2a  he right table *
3dc0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c  /.        int iL
3dd0: 65 66 74 3b 20 20 20 20 20 2f 2a 20 4d 61 74 63  eft;     /* Matc
3de0: 68 69 6e 67 20 6c 65 66 74 20 74 61 62 6c 65 20  hing left table 
3df0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
3e00: 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74  LeftCol;  /* Mat
3e10: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20  ching column in 
3e20: 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 2a  the left table *
3e30: 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  /..        zName
3e40: 20 3d 20 70 52 69 67 68 74 54 61 62 2d 3e 61 43   = pRightTab->aC
3e50: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol[j].zName;.   
3e60: 20 20 20 20 20 69 66 28 20 74 61 62 6c 65 41 6e       if( tableAn
3e70: 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72  dColumnIndex(pSr
3e80: 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26  c, i+1, zName, &
3e90: 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c  iLeft, &iLeftCol
3ea0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ) ){.          a
3eb0: 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61 72  ddWhereTerm(pPar
3ec0: 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c  se, pSrc, iLeft,
3ed0: 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20   iLeftCol, i+1, 
3ee0: 6a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  j,.             
3ef0: 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74 65            isOute
3f00: 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a  r, &p->pWhere);.
3f10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3f20: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
3f30: 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e  Disallow both ON
3f40: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
3f50: 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a  es in the same j
3f60: 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  oin.    */.    i
3f70: 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26  f( pRight->pOn &
3f80: 26 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  & pRight->pUsing
3f90: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
3fa0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
3fb0: 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62  , "cannot have b
3fc0: 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  oth ON and USING
3fd0: 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75   ".        "clau
3fe0: 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ses in the same 
3ff0: 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  join");.      re
4000: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  turn 1;.    }.. 
4010: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e     /* Add the ON
4020: 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65   clause to the e
4030: 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
4040: 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65  clause, connecte
4050: 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41  d by.    ** an A
4060: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20  ND operator..   
4070: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
4080: 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20  ht->pOn ){.     
4090: 20 69 66 28 20 69 73 4f 75 74 65 72 20 29 20 73   if( isOuter ) s
40a0: 65 74 4a 6f 69 6e 45 78 70 72 28 70 52 69 67 68  etJoinExpr(pRigh
40b0: 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e  t->pOn, pRight->
40c0: 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
40d0: 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  p->pWhere = sqli
40e0: 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
40f0: 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  e->db, p->pWhere
4100: 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a  , pRight->pOn);.
4110: 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f        pRight->pO
4120: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  n = 0;.    }..  
4130: 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72    /* Create extr
4140: 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57  a terms on the W
4150: 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20  HERE clause for 
4160: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  each column name
4170: 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  d.    ** in the 
4180: 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45  USING clause.  E
4190: 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74  xample: If the t
41a0: 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  wo tables to be 
41b0: 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20  joined are .    
41c0: 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74  ** A and B and t
41d0: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
41e0: 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20  names X, Y, and 
41f0: 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68 69 73  Z, then add this
4200: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57  .    ** to the W
4210: 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20  HERE clause:    
4220: 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d  A.X=B.X AND A.Y=
4230: 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a  B.Y AND A.Z=B.Z.
4240: 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e      ** Report an
4250: 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f   error if any co
4260: 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69  lumn mentioned i
4270: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
4280: 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74  se is.    ** not
4290: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f   contained in bo
42a0: 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  th tables to be 
42b0: 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  joined..    */. 
42c0: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
42d0: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49  Using ){.      I
42e0: 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  dList *pList = p
42f0: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20  Right->pUsing;. 
4300: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
4310: 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29  pList->nId; j++)
4320: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
4330: 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61  zName;     /* Na
4340: 6d 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20 69  me of the term i
4350: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
4360: 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  se */.        in
4370: 74 20 69 4c 65 66 74 3b 20 20 20 20 20 20 20 2f  t iLeft;       /
4380: 2a 20 54 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c  * Table on the l
4390: 65 66 74 20 77 69 74 68 20 6d 61 74 63 68 69 6e  eft with matchin
43a0: 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  g column name */
43b0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65  .        int iLe
43c0: 66 74 43 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c  ftCol;    /* Col
43d0: 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61  umn number of ma
43e0: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e  tching column on
43f0: 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20   the left */.   
4400: 20 20 20 20 20 69 6e 74 20 69 52 69 67 68 74 43       int iRightC
4410: 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20  ol;   /* Column 
4420: 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69  number of matchi
4430: 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65  ng column on the
4440: 20 72 69 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20   right */..     
4450: 20 20 20 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74     zName = pList
4460: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[j].zName;.  
4470: 20 20 20 20 20 20 69 52 69 67 68 74 43 6f 6c 20        iRightCol 
4480: 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52  = columnIndex(pR
4490: 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b  ightTab, zName);
44a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 52 69  .        if( iRi
44b0: 67 68 74 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20  ghtCol<0.       
44c0: 20 20 7c 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f    || !tableAndCo
44d0: 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20  lumnIndex(pSrc, 
44e0: 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65  i+1, zName, &iLe
44f0: 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20  ft, &iLeftCol). 
4500: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
4510: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4520: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
4530: 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63  not join using c
4540: 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d  olumn %s - colum
4550: 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  n ".            
4560: 22 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20  "not present in 
4570: 62 6f 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e  both tables", zN
4580: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
4590: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
45a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57    }.        addW
45b0: 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c  hereTerm(pParse,
45c0: 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c   pSrc, iLeft, iL
45d0: 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69  eftCol, i+1, iRi
45e0: 67 68 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20  ghtCol,.        
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
4600: 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65  uter, &p->pWhere
4610: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
4620: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
4630: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  .}../*.** An ins
4640: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
4650: 6a 65 63 74 20 68 6f 6c 64 73 20 69 6e 66 6f 72  ject holds infor
4660: 6d 61 74 69 6f 6e 20 28 62 65 79 6f 6e 64 20 70  mation (beyond p
4670: 50 61 72 73 65 20 61 6e 64 20 70 53 65 6c 65 63  Parse and pSelec
4680: 74 29 0a 2a 2a 20 6e 65 65 64 65 64 20 74 6f 20  t).** needed to 
4690: 6c 6f 61 64 20 74 68 65 20 6e 65 78 74 20 72 65  load the next re
46a0: 73 75 6c 74 20 72 6f 77 20 74 68 61 74 20 69 73  sult row that is
46b0: 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
46c0: 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 74  the sorter..*/.t
46d0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 52 6f  ypedef struct Ro
46e0: 77 4c 6f 61 64 49 6e 66 6f 20 52 6f 77 4c 6f 61  wLoadInfo RowLoa
46f0: 64 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20 52 6f  dInfo;.struct Ro
4700: 77 4c 6f 61 64 49 6e 66 6f 20 7b 0a 20 20 69 6e  wLoadInfo {.  in
4710: 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20  t regResult;    
4720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
4730: 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61  ore results in a
4740: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
4750: 73 20 68 65 72 65 20 2a 2f 0a 20 20 75 38 20 65  s here */.  u8 e
4760: 63 65 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20  celFlags;       
4770: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
4780: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 45 78 70   argument to Exp
4790: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 29 20  rCodeExprList() 
47a0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
47b0: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
47c0: 45 46 45 52 45 4e 43 45 53 0a 20 20 45 78 70 72  EFERENCES.  Expr
47d0: 4c 69 73 74 20 2a 70 45 78 74 72 61 3b 20 20 20  List *pExtra;   
47e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
47f0: 61 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64  a columns needed
4800: 20 62 79 20 73 6f 72 74 65 72 20 72 65 66 73 20   by sorter refs 
4810: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45 78 74 72  */.  int regExtr
4820: 61 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  aResult;        
4830: 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6c 6f    /* Where to lo
4840: 61 64 20 74 68 65 20 65 78 74 72 61 20 63 6f 6c  ad the extra col
4850: 75 6d 6e 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  umns */.#endif.}
4860: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ;../*.** This ro
4870: 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77  utine does the w
4880: 6f 72 6b 20 6f 66 20 6c 6f 61 64 69 6e 67 20 71  ork of loading q
4890: 75 65 72 79 20 64 61 74 61 20 69 6e 74 6f 20 61  uery data into a
48a0: 6e 20 61 72 72 61 79 20 6f 66 0a 2a 2a 20 72 65  n array of.** re
48b0: 67 69 73 74 65 72 73 20 73 6f 20 74 68 61 74 20  gisters so that 
48c0: 69 74 20 63 61 6e 20 62 65 20 61 64 64 65 64 20  it can be added 
48d0: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a  to the sorter..*
48e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
48f0: 6e 65 72 4c 6f 6f 70 4c 6f 61 64 52 6f 77 28 0a  nerLoopLoadRow(.
4900: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
4910: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4920: 53 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  Statement under 
4930: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
4940: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
4950: 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
4960: 54 68 65 20 71 75 65 72 79 20 62 65 69 6e 67 20  The query being 
4970: 63 6f 64 65 64 20 2a 2f 0a 20 20 52 6f 77 4c 6f  coded */.  RowLo
4980: 61 64 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  adInfo *pInfo   
4990: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6e 65        /* Info ne
49a0: 65 64 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65  eded to complete
49b0: 20 74 68 65 20 72 6f 77 20 6c 6f 61 64 20 2a 2f   the row load */
49c0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  .){.  sqlite3Exp
49d0: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
49e0: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70  arse, pSelect->p
49f0: 45 4c 69 73 74 2c 20 70 49 6e 66 6f 2d 3e 72 65  EList, pInfo->re
4a00: 67 52 65 73 75 6c 74 2c 0a 20 20 20 20 20 20 20  gResult,.       
4a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a20: 20 20 20 30 2c 20 70 49 6e 66 6f 2d 3e 65 63 65     0, pInfo->ece
4a30: 6c 46 6c 61 67 73 29 3b 0a 23 69 66 64 65 66 20  lFlags);.#ifdef 
4a40: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
4a50: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
4a60: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 70 45 78    if( pInfo->pEx
4a70: 74 72 61 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  tra ){.    sqlit
4a80: 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
4a90: 73 74 28 70 50 61 72 73 65 2c 20 70 49 6e 66 6f  st(pParse, pInfo
4aa0: 2d 3e 70 45 78 74 72 61 2c 20 70 49 6e 66 6f 2d  ->pExtra, pInfo-
4ab0: 3e 72 65 67 45 78 74 72 61 52 65 73 75 6c 74 2c  >regExtraResult,
4ac0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
4ad0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
4ae0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49  e(pParse->db, pI
4af0: 6e 66 6f 2d 3e 70 45 78 74 72 61 29 3b 0a 20 20  nfo->pExtra);.  
4b00: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
4b10: 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 4d 61  * Code the OP_Ma
4b20: 6b 65 52 65 63 6f 72 64 20 69 6e 73 74 72 75 63  keRecord instruc
4b30: 74 69 6f 6e 20 74 68 61 74 20 67 65 6e 65 72 61  tion that genera
4b40: 74 65 73 20 74 68 65 20 65 6e 74 72 79 20 74 6f  tes the entry to
4b50: 20 62 65 0a 2a 2a 20 61 64 64 65 64 20 69 6e 74   be.** added int
4b60: 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2a  o the sorter..**
4b70: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72  .** Return the r
4b80: 65 67 69 73 74 65 72 20 69 6e 20 77 68 69 63 68  egister in which
4b90: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73   the result is s
4ba0: 74 6f 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  tored..*/.static
4bb0: 20 69 6e 74 20 6d 61 6b 65 53 6f 72 74 65 72 52   int makeSorterR
4bc0: 65 63 6f 72 64 28 0a 20 20 50 61 72 73 65 20 2a  ecord(.  Parse *
4bd0: 70 50 61 72 73 65 2c 0a 20 20 53 6f 72 74 43 74  pParse,.  SortCt
4be0: 78 20 2a 70 53 6f 72 74 2c 0a 20 20 53 65 6c 65  x *pSort,.  Sele
4bf0: 63 74 20 2a 70 53 65 6c 65 63 74 2c 0a 20 20 69  ct *pSelect,.  i
4c00: 6e 74 20 72 65 67 42 61 73 65 2c 0a 20 20 69 6e  nt regBase,.  in
4c10: 74 20 6e 42 61 73 65 0a 29 7b 0a 20 20 69 6e 74  t nBase.){.  int
4c20: 20 6e 4f 42 53 61 74 20 3d 20 70 53 6f 72 74 2d   nOBSat = pSort-
4c30: 3e 6e 4f 42 53 61 74 3b 0a 20 20 56 64 62 65 20  >nOBSat;.  Vdbe 
4c40: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
4c50: 62 65 3b 0a 20 20 69 6e 74 20 72 65 67 4f 75 74  be;.  int regOut
4c60: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
4c70: 6d 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e  m;.  if( pSort->
4c80: 70 44 65 66 65 72 72 65 64 52 6f 77 4c 6f 61 64  pDeferredRowLoad
4c90: 20 29 7b 0a 20 20 20 20 69 6e 6e 65 72 4c 6f 6f   ){.    innerLoo
4ca0: 70 4c 6f 61 64 52 6f 77 28 70 50 61 72 73 65 2c  pLoadRow(pParse,
4cb0: 20 70 53 65 6c 65 63 74 2c 20 70 53 6f 72 74 2d   pSelect, pSort-
4cc0: 3e 70 44 65 66 65 72 72 65 64 52 6f 77 4c 6f 61  >pDeferredRowLoa
4cd0: 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
4ce0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4cf0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
4d00: 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42  gBase+nOBSat, nB
4d10: 61 73 65 2d 6e 4f 42 53 61 74 2c 20 72 65 67 4f  ase-nOBSat, regO
4d20: 75 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  ut);.  return re
4d30: 67 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  gOut;.}../*.** G
4d40: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
4d50: 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20  t will push the 
4d60: 72 65 63 6f 72 64 20 69 6e 20 72 65 67 69 73 74  record in regist
4d70: 65 72 73 20 72 65 67 44 61 74 61 0a 2a 2a 20 74  ers regData.** t
4d80: 68 72 6f 75 67 68 20 72 65 67 44 61 74 61 2b 6e  hrough regData+n
4d90: 44 61 74 61 2d 31 20 6f 6e 74 6f 20 74 68 65 20  Data-1 onto the 
4da0: 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  sorter..*/.stati
4db0: 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53  c void pushOntoS
4dc0: 6f 72 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a  orter(.  Parse *
4dd0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
4de0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
4df0: 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a  t */.  SortCtx *
4e00: 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20 2f 2a  pSort,        /*
4e10: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
4e20: 75 74 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ut the ORDER BY 
4e30: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65  clause */.  Sele
4e40: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20  ct *pSelect,    
4e50: 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20     /* The whole 
4e60: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
4e70: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74   */.  int regDat
4e80: 61 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a,           /* 
4e90: 46 69 72 73 74 20 72 65 67 69 73 74 65 72 20 68  First register h
4ea0: 6f 6c 64 69 6e 67 20 64 61 74 61 20 74 6f 20 62  olding data to b
4eb0: 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e  e sorted */.  in
4ec0: 74 20 72 65 67 4f 72 69 67 44 61 74 61 2c 20 20  t regOrigData,  
4ed0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65       /* First re
4ee0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64  gister holding d
4ef0: 61 74 61 20 62 65 66 6f 72 65 20 70 61 63 6b 69  ata before packi
4f00: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74  ng */.  int nDat
4f10: 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  a,             /
4f20: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
4f30: 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65 67 44  ents in the regD
4f40: 61 74 61 20 64 61 74 61 20 61 72 72 61 79 20 2a  ata data array *
4f50: 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52  /.  int nPrefixR
4f60: 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  eg         /* No
4f70: 2e 20 6f 66 20 72 65 67 20 70 72 69 6f 72 20 74  . of reg prior t
4f80: 6f 20 72 65 67 44 61 74 61 20 61 76 61 69 6c 61  o regData availa
4f90: 62 6c 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29  ble for use */.)
4fa0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
4fb0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
4fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fd0: 20 20 20 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64       /* Stmt und
4fe0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
4ff0: 2a 2f 0a 20 20 69 6e 74 20 62 53 65 71 20 3d 20  */.  int bSeq = 
5000: 28 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ((pSort->sortFla
5010: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
5020: 65 53 6f 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20  eSorter)==0);.  
5030: 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 53 6f 72  int nExpr = pSor
5040: 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  t->pOrderBy->nEx
5050: 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
5060: 20 2f 2a 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52   /* No. of ORDER
5070: 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69   BY terms */.  i
5080: 6e 74 20 6e 42 61 73 65 20 3d 20 6e 45 78 70 72  nt nBase = nExpr
5090: 20 2b 20 62 53 65 71 20 2b 20 6e 44 61 74 61 3b   + bSeq + nData;
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50b0: 2f 2a 20 46 69 65 6c 64 73 20 69 6e 20 73 6f 72  /* Fields in sor
50c0: 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ter record */.  
50d0: 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20  int regBase;    
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5100: 20 2f 2a 20 52 65 67 73 20 66 6f 72 20 73 6f 72   /* Regs for sor
5110: 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ter record */.  
5120: 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20  int regRecord = 
5130: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
5140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5150: 20 2f 2a 20 41 73 73 65 6d 62 6c 65 64 20 73 6f   /* Assembled so
5160: 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20  rter record */. 
5170: 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d 20 70 53   int nOBSat = pS
5180: 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20  ort->nOBSat;    
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51a0: 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65    /* ORDER BY te
51b0: 72 6d 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20  rms to skip */. 
51c0: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
51d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51e0: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f      /* Opcode to
51f0: 20 61 64 64 20 73 6f 72 74 65 72 20 72 65 63 6f   add sorter reco
5200: 72 64 20 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a  rd to sorter */.
5210: 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 20 20 20    int iLimit;   
5220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5230: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 63 6f       /* LIMIT co
5240: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  unter */.  int i
5250: 53 6b 69 70 20 3d 20 30 3b 20 20 20 20 20 20 20  Skip = 0;       
5260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5270: 20 45 6e 64 20 6f 66 20 74 68 65 20 73 6f 72 74   End of the sort
5280: 65 72 20 69 6e 73 65 72 74 20 6c 6f 6f 70 20 2a  er insert loop *
5290: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 62 53 65  /..  assert( bSe
52a0: 71 3d 3d 30 20 7c 7c 20 62 53 65 71 3d 3d 31 20  q==0 || bSeq==1 
52b0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 72 65 65 20 63  );..  /* Three c
52c0: 61 73 65 73 3a 0a 20 20 2a 2a 20 20 20 28 31 29  ases:.  **   (1)
52d0: 20 54 68 65 20 64 61 74 61 20 74 6f 20 62 65 20   The data to be 
52e0: 73 6f 72 74 65 64 20 68 61 73 20 61 6c 72 65 61  sorted has alrea
52f0: 64 79 20 62 65 65 6e 20 70 61 63 6b 65 64 20 69  dy been packed i
5300: 6e 74 6f 20 61 20 52 65 63 6f 72 64 0a 20 20 2a  nto a Record.  *
5310: 2a 20 20 20 20 20 20 20 62 79 20 61 20 70 72 69  *       by a pri
5320: 6f 72 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  or OP_MakeRecord
5330: 2e 20 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  .  In this case 
5340: 6e 44 61 74 61 3d 3d 31 20 61 6e 64 20 72 65 67  nData==1 and reg
5350: 44 61 74 61 0a 20 20 2a 2a 20 20 20 20 20 20 20  Data.  **       
5360: 77 69 6c 6c 20 62 65 20 63 6f 6d 70 6c 65 74 65  will be complete
5370: 6c 79 20 75 6e 72 65 6c 61 74 65 64 20 74 6f 20  ly unrelated to 
5380: 72 65 67 4f 72 69 67 44 61 74 61 2e 0a 20 20 2a  regOrigData..  *
5390: 2a 20 20 20 28 32 29 20 41 6c 6c 20 6f 75 74 70  *   (2) All outp
53a0: 75 74 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 69  ut columns are i
53b0: 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73  ncluded in the s
53c0: 6f 72 74 20 72 65 63 6f 72 64 2e 20 20 49 6e 20  ort record.  In 
53d0: 74 68 61 74 0a 20 20 2a 2a 20 20 20 20 20 20 20  that.  **       
53e0: 63 61 73 65 20 72 65 67 44 61 74 61 3d 3d 72 65  case regData==re
53f0: 67 4f 72 69 67 44 61 74 61 2e 0a 20 20 2a 2a 20  gOrigData..  ** 
5400: 20 20 28 33 29 20 53 6f 6d 65 20 6f 75 74 70 75    (3) Some outpu
5410: 74 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6f 6d  t columns are om
5420: 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73  itted from the s
5430: 6f 72 74 20 72 65 63 6f 72 64 20 64 75 65 20 74  ort record due t
5440: 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 74 68 65  o.  **       the
5450: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
5460: 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 20  ORTER_REFERENCE 
5470: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 6f 72  optimization, or
5480: 20 64 75 65 20 74 6f 20 74 68 65 0a 20 20 2a 2a   due to the.  **
5490: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43         SQLITE_EC
54a0: 45 4c 5f 4f 4d 49 54 52 45 46 20 6f 70 74 69 6d  EL_OMITREF optim
54b0: 69 7a 61 74 69 6f 6e 2c 20 6f 72 20 64 75 65 20  ization, or due 
54c0: 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20 20 20 20  to the .  **    
54d0: 20 20 20 53 6f 72 74 43 74 78 2e 70 44 65 66 65     SortCtx.pDefe
54e0: 72 72 65 64 52 6f 77 4c 6f 61 64 20 6f 70 74 69  rredRowLoad opti
54f0: 6d 69 61 74 69 6f 6e 2e 20 20 49 6e 20 61 6e 79  miation.  In any
5500: 20 6f 66 20 74 68 65 73 65 20 63 61 73 65 73 0a   of these cases.
5510: 20 20 2a 2a 20 20 20 20 20 20 20 72 65 67 4f 72    **       regOr
5520: 69 67 44 61 74 61 20 69 73 20 30 20 74 6f 20 70  igData is 0 to p
5530: 72 65 76 65 6e 74 20 74 68 69 73 20 72 6f 75 74  revent this rout
5540: 69 6e 65 20 66 72 6f 6d 20 74 72 79 69 6e 67 20  ine from trying 
5550: 74 6f 20 63 6f 70 79 0a 20 20 2a 2a 20 20 20 20  to copy.  **    
5560: 20 20 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d     values that m
5570: 69 67 68 74 20 6e 6f 74 20 79 65 74 20 65 78 69  ight not yet exi
5580: 73 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  st..  */.  asser
5590: 74 28 20 6e 44 61 74 61 3d 3d 31 20 7c 7c 20 72  t( nData==1 || r
55a0: 65 67 44 61 74 61 3d 3d 72 65 67 4f 72 69 67 44  egData==regOrigD
55b0: 61 74 61 20 7c 7c 20 72 65 67 4f 72 69 67 44 61  ata || regOrigDa
55c0: 74 61 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  ta==0 );..  if( 
55d0: 6e 50 72 65 66 69 78 52 65 67 20 29 7b 0a 20 20  nPrefixReg ){.  
55e0: 20 20 61 73 73 65 72 74 28 20 6e 50 72 65 66 69    assert( nPrefi
55f0: 78 52 65 67 3d 3d 6e 45 78 70 72 2b 62 53 65 71  xReg==nExpr+bSeq
5600: 20 29 3b 0a 20 20 20 20 72 65 67 42 61 73 65 20   );.    regBase 
5610: 3d 20 72 65 67 44 61 74 61 20 2d 20 6e 50 72 65  = regData - nPre
5620: 66 69 78 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b  fixReg;.  }else{
5630: 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 70  .    regBase = p
5640: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
5650: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
5660: 6d 20 2b 3d 20 6e 42 61 73 65 3b 0a 20 20 7d 0a  m += nBase;.  }.
5670: 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65 63    assert( pSelec
5680: 74 2d 3e 69 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  t->iOffset==0 ||
5690: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
56a0: 21 3d 30 20 29 3b 0a 20 20 69 4c 69 6d 69 74 20  !=0 );.  iLimit 
56b0: 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73  = pSelect->iOffs
56c0: 65 74 20 3f 20 70 53 65 6c 65 63 74 2d 3e 69 4f  et ? pSelect->iO
56d0: 66 66 73 65 74 2b 31 20 3a 20 70 53 65 6c 65 63  ffset+1 : pSelec
56e0: 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 70 53 6f  t->iLimit;.  pSo
56f0: 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 20 3d 20  rt->labelDone = 
5700: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
5710: 61 62 65 6c 28 76 29 3b 0a 20 20 73 71 6c 69 74  abel(v);.  sqlit
5720: 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
5730: 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  st(pParse, pSort
5740: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42  ->pOrderBy, regB
5750: 61 73 65 2c 20 72 65 67 4f 72 69 67 44 61 74 61  ase, regOrigData
5760: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
5770: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
5780: 54 45 5f 45 43 45 4c 5f 44 55 50 20 7c 20 28 72  TE_ECEL_DUP | (r
5790: 65 67 4f 72 69 67 44 61 74 61 3f 20 53 51 4c 49  egOrigData? SQLI
57a0: 54 45 5f 45 43 45 4c 5f 52 45 46 20 3a 20 30 29  TE_ECEL_REF : 0)
57b0: 29 3b 0a 20 20 69 66 28 20 62 53 65 71 20 29 7b  );.  if( bSeq ){
57c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
57d0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71  AddOp2(v, OP_Seq
57e0: 75 65 6e 63 65 2c 20 70 53 6f 72 74 2d 3e 69 45  uence, pSort->iE
57f0: 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73 65 2b  Cursor, regBase+
5800: 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 69 66  nExpr);.  }.  if
5810: 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 30 20  ( nPrefixReg==0 
5820: 26 26 20 6e 44 61 74 61 3e 30 20 29 7b 0a 20 20  && nData>0 ){.  
5830: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
5840: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
5850: 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e  gData, regBase+n
5860: 45 78 70 72 2b 62 53 65 71 2c 20 6e 44 61 74 61  Expr+bSeq, nData
5870: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4f 42  );.  }.  if( nOB
5880: 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74  Sat>0 ){.    int
5890: 20 72 65 67 50 72 65 76 4b 65 79 3b 20 20 20 2f   regPrevKey;   /
58a0: 2a 20 54 68 65 20 66 69 72 73 74 20 6e 4f 42 53  * The first nOBS
58b0: 61 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  at columns of th
58c0: 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 2a  e previous row *
58d0: 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 46 69  /.    int addrFi
58e0: 72 73 74 3b 20 20 20 20 2f 2a 20 41 64 64 72 65  rst;    /* Addre
58f0: 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 49 66 4e  ss of the OP_IfN
5900: 6f 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  ot opcode */.   
5910: 20 69 6e 74 20 61 64 64 72 4a 6d 70 3b 20 20 20   int addrJmp;   
5920: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
5930: 20 74 68 65 20 4f 50 5f 4a 75 6d 70 20 6f 70 63   the OP_Jump opc
5940: 6f 64 65 20 2a 2f 0a 20 20 20 20 56 64 62 65 4f  ode */.    VdbeO
5950: 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 2f 2a 20  p *pOp;      /* 
5960: 4f 70 63 6f 64 65 20 74 68 61 74 20 6f 70 65 6e  Opcode that open
5970: 73 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a  s the sorter */.
5980: 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20      int nKey;   
5990: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
59a0: 6f 66 20 73 6f 72 74 69 6e 67 20 6b 65 79 20 63  of sorting key c
59b0: 6f 6c 75 6d 6e 73 2c 20 69 6e 63 6c 75 64 69 6e  olumns, includin
59c0: 67 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 2a 2f  g OP_Sequence */
59d0: 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
59e0: 49 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  I;     /* Origin
59f0: 61 6c 20 4b 65 79 49 6e 66 6f 20 6f 6e 20 74 68  al KeyInfo on th
5a00: 65 20 73 6f 72 74 65 72 20 74 61 62 6c 65 20 2a  e sorter table *
5a10: 2f 0a 0a 20 20 20 20 72 65 67 52 65 63 6f 72 64  /..    regRecord
5a20: 20 3d 20 6d 61 6b 65 53 6f 72 74 65 72 52 65 63   = makeSorterRec
5a30: 6f 72 64 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ord(pParse, pSor
5a40: 74 2c 20 70 53 65 6c 65 63 74 2c 20 72 65 67 42  t, pSelect, regB
5a50: 61 73 65 2c 20 6e 42 61 73 65 29 3b 0a 20 20 20  ase, nBase);.   
5a60: 20 72 65 67 50 72 65 76 4b 65 79 20 3d 20 70 50   regPrevKey = pP
5a70: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
5a80: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
5a90: 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b  = pSort->nOBSat;
5aa0: 0a 20 20 20 20 6e 4b 65 79 20 3d 20 6e 45 78 70  .    nKey = nExp
5ab0: 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  r - pSort->nOBSa
5ac0: 74 20 2b 20 62 53 65 71 3b 0a 20 20 20 20 69 66  t + bSeq;.    if
5ad0: 28 20 62 53 65 71 20 29 7b 0a 20 20 20 20 20 20  ( bSeq ){.      
5ae0: 61 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69  addrFirst = sqli
5af0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
5b00: 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 42 61   OP_IfNot, regBa
5b10: 73 65 2b 6e 45 78 70 72 29 3b 20 0a 20 20 20 20  se+nExpr); .    
5b20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64  }else{.      add
5b30: 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33  rFirst = sqlite3
5b40: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
5b50: 5f 53 65 71 75 65 6e 63 65 54 65 73 74 2c 20 70  _SequenceTest, p
5b60: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b  Sort->iECursor);
5b70: 0a 20 20 20 20 7d 0a 20 20 20 20 56 64 62 65 43  .    }.    VdbeC
5b80: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
5b90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5ba0: 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  3(v, OP_Compare,
5bb0: 20 72 65 67 50 72 65 76 4b 65 79 2c 20 72 65 67   regPrevKey, reg
5bc0: 42 61 73 65 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42  Base, pSort->nOB
5bd0: 53 61 74 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20  Sat);.    pOp = 
5be0: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
5bf0: 28 76 2c 20 70 53 6f 72 74 2d 3e 61 64 64 72 53  (v, pSort->addrS
5c00: 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 69  ortIndex);.    i
5c10: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
5c20: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
5c30: 74 75 72 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  turn;.    pOp->p
5c40: 32 20 3d 20 6e 4b 65 79 20 2b 20 6e 44 61 74 61  2 = nKey + nData
5c50: 3b 0a 20 20 20 20 70 4b 49 20 3d 20 70 4f 70 2d  ;.    pKI = pOp-
5c60: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  >p4.pKeyInfo;.  
5c70: 20 20 6d 65 6d 73 65 74 28 70 4b 49 2d 3e 61 53    memset(pKI->aS
5c80: 6f 72 74 4f 72 64 65 72 2c 20 30 2c 20 70 4b 49  ortOrder, 0, pKI
5c90: 2d 3e 6e 4b 65 79 46 69 65 6c 64 29 3b 20 2f 2a  ->nKeyField); /*
5ca0: 20 4d 61 6b 65 73 20 4f 50 5f 4a 75 6d 70 20 74   Makes OP_Jump t
5cb0: 65 73 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73  estable */.    s
5cc0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
5cd0: 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a  P4(v, -1, (char*
5ce0: 29 70 4b 49 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  )pKI, P4_KEYINFO
5cf0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
5d00: 20 70 4b 49 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20   pKI->nAllField 
5d10: 3e 20 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c 64  > pKI->nKeyField
5d20: 2b 32 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  +2 );.    pOp->p
5d30: 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c  4.pKeyInfo = sql
5d40: 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45  ite3KeyInfoFromE
5d50: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 70  xprList(pParse,p
5d60: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c 6e  Sort->pOrderBy,n
5d70: 4f 42 53 61 74 2c 0a 20 20 20 20 20 20 20 20 20  OBSat,.         
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5da0: 20 20 70 4b 49 2d 3e 6e 41 6c 6c 46 69 65 6c 64    pKI->nAllField
5db0: 2d 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c 64 2d  -pKI->nKeyField-
5dc0: 31 29 3b 0a 20 20 20 20 61 64 64 72 4a 6d 70 20  1);.    addrJmp 
5dd0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
5de0: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
5df0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5e00: 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61  p3(v, OP_Jump, a
5e10: 64 64 72 4a 6d 70 2b 31 2c 20 30 2c 20 61 64 64  ddrJmp+1, 0, add
5e20: 72 4a 6d 70 2b 31 29 3b 20 56 64 62 65 43 6f 76  rJmp+1); VdbeCov
5e30: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 70 53  erage(v);.    pS
5e40: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20  ort->labelBkOut 
5e50: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
5e60: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 70  eLabel(v);.    p
5e70: 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 20  Sort->regReturn 
5e80: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
5e90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5ea0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
5eb0: 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52  sub, pSort->regR
5ec0: 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61  eturn, pSort->la
5ed0: 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73  belBkOut);.    s
5ee0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
5ef0: 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74  (v, OP_ResetSort
5f00: 65 72 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  er, pSort->iECur
5f10: 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 69 4c  sor);.    if( iL
5f20: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 73 71  imit ){.      sq
5f30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5f40: 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c 69  v, OP_IfNot, iLi
5f50: 6d 69 74 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65  mit, pSort->labe
5f60: 6c 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64  lDone);.      Vd
5f70: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
5f80: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
5f90: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
5fa0: 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20  addrFirst);.    
5fb0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
5fc0: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 42  ove(pParse, regB
5fd0: 61 73 65 2c 20 72 65 67 50 72 65 76 4b 65 79 2c  ase, regPrevKey,
5fe0: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b   pSort->nOBSat);
5ff0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6000: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
6010: 4a 6d 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Jmp);.  }.  if( 
6020: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a  iLimit ){.    /*
6030: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
6040: 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68  he values for th
6050: 65 20 6e 65 77 20 73 6f 72 74 65 72 20 65 6e 74  e new sorter ent
6060: 72 79 20 61 72 65 20 73 74 6f 72 65 64 0a 20 20  ry are stored.  
6070: 20 20 2a 2a 20 69 6e 20 61 6e 20 61 72 72 61 79    ** in an array
6080: 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20 54   of registers. T
6090: 68 65 79 20 6e 65 65 64 20 74 6f 20 62 65 20 63  hey need to be c
60a0: 6f 6d 70 6f 73 65 64 20 69 6e 74 6f 20 61 20 72  omposed into a r
60b0: 65 63 6f 72 64 0a 20 20 20 20 2a 2a 20 61 6e 64  ecord.    ** and
60c0: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74   inserted into t
60d0: 68 65 20 73 6f 72 74 65 72 20 69 66 20 65 69 74  he sorter if eit
60e0: 68 65 72 20 28 61 29 20 74 68 65 72 65 20 61 72  her (a) there ar
60f0: 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20  e currently.    
6100: 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 4c 49 4d  ** less than LIM
6110: 49 54 2b 4f 46 46 53 45 54 20 69 74 65 6d 73 20  IT+OFFSET items 
6120: 6f 72 20 28 62 29 20 74 68 65 20 6e 65 77 20 72  or (b) the new r
6130: 65 63 6f 72 64 20 69 73 20 73 6d 61 6c 6c 65 72  ecord is smaller
6140: 20 74 68 61 6e 20 0a 20 20 20 20 2a 2a 20 74 68   than .    ** th
6150: 65 20 6c 61 72 67 65 73 74 20 72 65 63 6f 72 64  e largest record
6160: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
6170: 65 20 73 6f 72 74 65 72 2e 20 49 66 20 28 62 29  e sorter. If (b)
6180: 20 69 73 20 74 72 75 65 20 61 6e 64 20 74 68 65   is true and the
6190: 72 65 0a 20 20 20 20 2a 2a 20 61 72 65 20 61 6c  re.    ** are al
61a0: 72 65 61 64 79 20 4c 49 4d 49 54 2b 4f 46 46 53  ready LIMIT+OFFS
61b0: 45 54 20 69 74 65 6d 73 20 69 6e 20 74 68 65 20  ET items in the 
61c0: 73 6f 72 74 65 72 2c 20 64 65 6c 65 74 65 20 74  sorter, delete t
61d0: 68 65 20 6c 61 72 67 65 73 74 0a 20 20 20 20 2a  he largest.    *
61e0: 2a 20 65 6e 74 72 79 20 62 65 66 6f 72 65 20 69  * entry before i
61f0: 6e 73 65 72 74 69 6e 67 20 74 68 65 20 6e 65 77  nserting the new
6200: 20 6f 6e 65 2e 20 54 68 69 73 20 77 61 79 20 74   one. This way t
6210: 68 65 72 65 20 61 72 65 20 6e 65 76 65 72 20 6d  here are never m
6220: 6f 72 65 20 0a 20 20 20 20 2a 2a 20 74 68 61 6e  ore .    ** than
6230: 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 69 74   LIMIT+OFFSET it
6240: 65 6d 73 20 69 6e 20 74 68 65 20 73 6f 72 74 65  ems in the sorte
6250: 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  r..    **.    **
6260: 20 49 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f   If the new reco
6270: 72 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  rd does not need
6280: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20   to be inserted 
6290: 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2c  into the sorter,
62a0: 0a 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20  .    ** jump to 
62b0: 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69  the next iterati
62c0: 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  on of the loop. 
62d0: 4f 72 2c 20 69 66 20 74 68 65 0a 20 20 20 20 2a  Or, if the.    *
62e0: 2a 20 70 53 6f 72 74 2d 3e 62 4f 72 64 65 72 65  * pSort->bOrdere
62f0: 64 49 6e 6e 65 72 4c 6f 6f 70 20 66 6c 61 67 20  dInnerLoop flag 
6300: 69 73 20 73 65 74 20 74 6f 20 69 6e 64 69 63 61  is set to indica
6310: 74 65 20 74 68 61 74 20 74 68 65 20 69 6e 6e 65  te that the inne
6320: 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 20 64 65  r.    ** loop de
6330: 6c 69 76 65 72 73 20 69 74 65 6d 73 20 69 6e 20  livers items in 
6340: 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20 6a 75  sorted order, ju
6350: 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  mp to the next i
6360: 74 65 72 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  teration.    ** 
6370: 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  of the outer loo
6380: 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  p..    */.    in
6390: 74 20 69 43 73 72 20 3d 20 70 53 6f 72 74 2d 3e  t iCsr = pSort->
63a0: 69 45 43 75 72 73 6f 72 3b 0a 20 20 20 20 73 71  iECursor;.    sq
63b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
63c0: 76 2c 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f 2c  v, OP_IfNotZero,
63d0: 20 69 4c 69 6d 69 74 2c 20 73 71 6c 69 74 65 33   iLimit, sqlite3
63e0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
63f0: 76 29 2b 34 29 3b 0a 20 20 20 20 56 64 62 65 43  v)+4);.    VdbeC
6400: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
6410: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6420: 32 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 69 43  2(v, OP_Last, iC
6430: 73 72 2c 20 30 29 3b 0a 20 20 20 20 69 53 6b 69  sr, 0);.    iSki
6440: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
6450: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
6460: 64 78 4c 45 2c 0a 20 20 20 20 20 20 20 20 20 20  dxLE,.          
6470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6480: 20 20 20 20 20 20 20 69 43 73 72 2c 20 30 2c 20         iCsr, 0, 
6490: 72 65 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20  regBase+nOBSat, 
64a0: 6e 45 78 70 72 2d 6e 4f 42 53 61 74 29 3b 0a 20  nExpr-nOBSat);. 
64b0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
64c0: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
64d0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
64e0: 44 65 6c 65 74 65 2c 20 69 43 73 72 29 3b 0a 20  Delete, iCsr);. 
64f0: 20 7d 0a 20 20 69 66 28 20 72 65 67 52 65 63 6f   }.  if( regReco
6500: 72 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 67  rd==0 ){.    reg
6510: 52 65 63 6f 72 64 20 3d 20 6d 61 6b 65 53 6f 72  Record = makeSor
6520: 74 65 72 52 65 63 6f 72 64 28 70 50 61 72 73 65  terRecord(pParse
6530: 2c 20 70 53 6f 72 74 2c 20 70 53 65 6c 65 63 74  , pSort, pSelect
6540: 2c 20 72 65 67 42 61 73 65 2c 20 6e 42 61 73 65  , regBase, nBase
6550: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f  );.  }.  if( pSo
6560: 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20  rt->sortFlags & 
6570: 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
6580: 65 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 4f  er ){.    op = O
6590: 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 3b 0a  P_SorterInsert;.
65a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20    }else{.    op 
65b0: 3d 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 3b 0a  = OP_IdxInsert;.
65c0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
65d0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70  eAddOp4Int(v, op
65e0: 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  , pSort->iECurso
65f0: 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a 20 20  r, regRecord,.  
6600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6610: 20 20 20 20 20 72 65 67 42 61 73 65 2b 6e 4f 42       regBase+nOB
6620: 53 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61  Sat, nBase-nOBSa
6630: 74 29 3b 0a 20 20 69 66 28 20 69 53 6b 69 70 20  t);.  if( iSkip 
6640: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
6650: 53 6f 72 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e  Sort->bOrderedIn
6660: 6e 65 72 4c 6f 6f 70 3d 3d 30 20 7c 7c 20 70 53  nerLoop==0 || pS
6670: 6f 72 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e  ort->bOrderedInn
6680: 65 72 4c 6f 6f 70 3d 3d 31 20 29 3b 0a 20 20 20  erLoop==1 );.   
6690: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
66a0: 67 65 50 32 28 76 2c 20 69 53 6b 69 70 2c 0a 20  geP2(v, iSkip,. 
66b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
66c0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
66d0: 29 20 2b 20 70 53 6f 72 74 2d 3e 62 4f 72 64 65  ) + pSort->bOrde
66e0: 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 29 3b 0a 20  redInnerLoop);. 
66f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
6700: 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  code to implemen
6710: 74 20 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a  t the OFFSET.*/.
6720: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
6730: 4f 66 66 73 65 74 28 0a 20 20 56 64 62 65 20 2a  Offset(.  Vdbe *
6740: 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47  v,          /* G
6750: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
6760: 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69  o this VM */.  i
6770: 6e 74 20 69 4f 66 66 73 65 74 2c 20 20 20 20 20  nt iOffset,     
6780: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
6790: 64 69 6e 67 20 74 68 65 20 6f 66 66 73 65 74 20  ding the offset 
67a0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
67b0: 20 69 43 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f   iContinue     /
67c0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73  * Jump here to s
67d0: 6b 69 70 20 74 68 65 20 63 75 72 72 65 6e 74 20  kip the current 
67e0: 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69  record */.){.  i
67f0: 66 28 20 69 4f 66 66 73 65 74 3e 30 20 29 7b 0a  f( iOffset>0 ){.
6800: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6810: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp3(v, OP_IfPo
6820: 73 2c 20 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e  s, iOffset, iCon
6830: 74 69 6e 75 65 2c 20 31 29 3b 20 56 64 62 65 43  tinue, 1); VdbeC
6840: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
6850: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
6860: 22 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 7d 0a  "OFFSET"));.  }.
6870: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64  }../*.** Add cod
6880: 65 20 74 68 61 74 20 77 69 6c 6c 20 63 68 65 63  e that will chec
6890: 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  k to make sure t
68a0: 68 65 20 4e 20 72 65 67 69 73 74 65 72 73 20 73  he N registers s
68b0: 74 61 72 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a  tarting at iMem.
68c0: 2a 2a 20 66 6f 72 6d 20 61 20 64 69 73 74 69 6e  ** form a distin
68d0: 63 74 20 65 6e 74 72 79 2e 20 20 69 54 61 62 20  ct entry.  iTab 
68e0: 69 73 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  is a sorting ind
68f0: 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20 70 72  ex that holds pr
6900: 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e  eviously.** seen
6910: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
6920: 20 74 68 65 20 4e 20 76 61 6c 75 65 73 2e 20 20   the N values.  
6930: 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6d  A new entry is m
6940: 61 64 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69  ade in iTab.** i
6950: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 4e 20  f the current N 
6960: 76 61 6c 75 65 73 20 61 72 65 20 6e 65 77 2e 0a  values are new..
6970: 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20  **.** A jump to 
6980: 61 64 64 72 52 65 70 65 61 74 20 69 73 20 6d 61  addrRepeat is ma
6990: 64 65 20 61 6e 64 20 74 68 65 20 4e 2b 31 20 76  de and the N+1 v
69a0: 61 6c 75 65 73 20 61 72 65 20 70 6f 70 70 65 64  alues are popped
69b0: 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61   from the.** sta
69c0: 63 6b 20 69 66 20 74 68 65 20 74 6f 70 20 4e 20  ck if the top N 
69d0: 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74  elements are not
69e0: 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74   distinct..*/.st
69f0: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 44 69  atic void codeDi
6a00: 73 74 69 6e 63 74 28 0a 20 20 50 61 72 73 65 20  stinct(.  Parse 
6a10: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
6a20: 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
6a30: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
6a40: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ext */.  int iTa
6a50: 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  b,          /* A
6a60: 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 75   sorting index u
6a70: 73 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20  sed to test for 
6a80: 64 69 73 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a  distinctness */.
6a90: 20 20 69 6e 74 20 61 64 64 72 52 65 70 65 61 74    int addrRepeat
6aa0: 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  ,    /* Jump to 
6ab0: 68 65 72 65 20 69 66 20 6e 6f 74 20 64 69 73 74  here if not dist
6ac0: 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c  inct */.  int N,
6ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6ae0: 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
6af0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d  ts */.  int iMem
6b00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
6b10: 72 73 74 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29  rst element */.)
6b20: 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  {.  Vdbe *v;.  i
6b30: 6e 74 20 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50  nt r1;..  v = pP
6b40: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72  arse->pVdbe;.  r
6b50: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
6b60: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
6b70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6b80: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e  p4Int(v, OP_Foun
6b90: 64 2c 20 69 54 61 62 2c 20 61 64 64 72 52 65 70  d, iTab, addrRep
6ba0: 65 61 74 2c 20 69 4d 65 6d 2c 20 4e 29 3b 20 56  eat, iMem, N); V
6bb0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
6bc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6bd0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
6be0: 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72  cord, iMem, N, r
6bf0: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
6c00: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
6c10: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61 62  _IdxInsert, iTab
6c20: 2c 20 72 31 2c 20 69 4d 65 6d 2c 20 4e 29 3b 0a  , r1, iMem, N);.
6c30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
6c40: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
6c50: 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a  USESEEKRESULT);.
6c60: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
6c70: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
6c80: 72 31 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  r1);.}..#ifdef S
6c90: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52  QLITE_ENABLE_SOR
6ca0: 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 2f  TER_REFERENCES./
6cb0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
6cc0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20  on is called as 
6cd0: 70 61 72 74 20 6f 66 20 69 6e 6e 65 72 2d 6c 6f  part of inner-lo
6ce0: 6f 70 20 67 65 6e 65 72 61 74 69 6f 6e 20 66 6f  op generation fo
6cf0: 72 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74  r a SELECT.** st
6d00: 61 74 65 6d 65 6e 74 20 77 69 74 68 20 61 6e 20  atement with an 
6d10: 4f 52 44 45 52 20 42 59 20 74 68 61 74 20 69 73  ORDER BY that is
6d20: 20 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 64 20 62   not optimized b
6d30: 79 20 61 6e 20 69 6e 64 65 78 2e 20 49 74 20 0a  y an index. It .
6d40: 2a 2a 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68  ** determines th
6d50: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 69  e expressions, i
6d60: 66 20 61 6e 79 2c 20 74 68 61 74 20 74 68 65 20  f any, that the 
6d70: 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e 63 65  sorter-reference
6d80: 20 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f   .** optimizatio
6d90: 6e 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  n should be used
6da0: 20 66 6f 72 2e 20 54 68 65 20 73 6f 72 74 65 72   for. The sorter
6db0: 2d 72 65 66 65 72 65 6e 63 65 20 6f 70 74 69 6d  -reference optim
6dc0: 69 7a 61 74 69 6f 6e 0a 2a 2a 20 69 73 20 75 73  ization.** is us
6dd0: 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 71 75  ed for SELECT qu
6de0: 65 72 69 65 73 20 6c 69 6b 65 3a 0a 2a 2a 0a 2a  eries like:.**.*
6df0: 2a 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 69  *   SELECT a, bi
6e00: 67 62 6c 6f 62 20 46 52 4f 4d 20 74 31 20 4f 52  gblob FROM t1 OR
6e10: 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 31  DER BY a LIMIT 1
6e20: 30 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f  0.**.** If the o
6e30: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75  ptimization is u
6e40: 73 65 64 20 66 6f 72 20 65 78 70 72 65 73 73 69  sed for expressi
6e50: 6f 6e 20 22 62 69 67 62 6c 6f 62 22 2c 20 74 68  on "bigblob", th
6e60: 65 6e 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  en instead of.**
6e70: 20 73 74 6f 72 69 6e 67 20 76 61 6c 75 65 73 20   storing values 
6e80: 72 65 61 64 20 66 72 6f 6d 20 74 68 61 74 20 63  read from that c
6e90: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73 6f 72  olumn in the sor
6ea0: 74 65 72 20 72 65 63 6f 72 64 73 2c 20 74 68 65  ter records, the
6eb0: 20 50 4b 20 6f 66 0a 2a 2a 20 74 68 65 20 72 6f   PK of.** the ro
6ec0: 77 20 66 72 6f 6d 20 74 61 62 6c 65 20 74 31 20  w from table t1 
6ed0: 69 73 20 73 74 6f 72 65 64 20 69 6e 73 74 65 61  is stored instea
6ee0: 64 2e 20 54 68 65 6e 2c 20 61 73 20 72 65 63 6f  d. Then, as reco
6ef0: 72 64 73 20 61 72 65 20 65 78 74 72 61 63 74 65  rds are extracte
6f00: 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 73 6f  d from.** the so
6f10: 72 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20 74  rter to return t
6f20: 6f 20 74 68 65 20 75 73 65 72 2c 20 74 68 65 20  o the user, the 
6f30: 72 65 71 75 69 72 65 64 20 76 61 6c 75 65 20 6f  required value o
6f40: 66 20 62 69 67 62 6c 6f 62 20 69 73 0a 2a 2a 20  f bigblob is.** 
6f50: 72 65 74 72 69 65 76 65 64 20 64 69 72 65 63 74  retrieved direct
6f60: 6c 79 20 66 72 6f 6d 20 74 61 62 6c 65 20 74 31  ly from table t1
6f70: 2e 20 49 66 20 74 68 65 20 76 61 6c 75 65 73 20  . If the values 
6f80: 61 72 65 20 76 65 72 79 20 6c 61 72 67 65 2c 20  are very large, 
6f90: 74 68 69 73 20 0a 2a 2a 20 63 61 6e 20 62 65 20  this .** can be 
6fa0: 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 20 74  more efficient t
6fb0: 68 61 6e 20 73 74 6f 72 69 6e 67 20 74 68 65 6d  han storing them
6fc0: 20 64 69 72 65 63 74 6c 79 20 69 6e 20 74 68 65   directly in the
6fd0: 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 73 2e   sorter records.
6fe0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 4c  .**.** The ExprL
6ff0: 69 73 74 5f 69 74 65 6d 2e 62 53 6f 72 74 65 72  ist_item.bSorter
7000: 52 65 66 20 66 6c 61 67 20 69 73 20 73 65 74 20  Ref flag is set 
7010: 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73  for each express
7020: 69 6f 6e 20 69 6e 20 70 45 4c 69 73 74 20 0a 2a  ion in pEList .*
7030: 2a 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  * for which the 
7040: 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e 63 65  sorter-reference
7050: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 73 68   optimization sh
7060: 6f 75 6c 64 20 62 65 20 65 6e 61 62 6c 65 64 2e  ould be enabled.
7070: 20 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c   .** Additionall
7080: 79 2c 20 74 68 65 20 70 53 6f 72 74 2d 3e 61 44  y, the pSort->aD
7090: 65 66 65 72 5b 5d 20 61 72 72 61 79 20 69 73 20  efer[] array is 
70a0: 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 65  populated with e
70b0: 6e 74 72 69 65 73 0a 2a 2a 20 66 6f 72 20 61 6c  ntries.** for al
70c0: 6c 20 63 75 72 73 6f 72 73 20 72 65 71 75 69 72  l cursors requir
70d0: 65 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  ed to evaluate a
70e0: 6c 6c 20 73 65 6c 65 63 74 65 64 20 65 78 70 72  ll selected expr
70f0: 65 73 73 69 6f 6e 73 2e 20 46 69 6e 61 6c 6c 79  essions. Finally
7100: 2e 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 72 69  ..** output vari
7110: 61 62 6c 65 20 28 2a 70 70 45 78 74 72 61 29 20  able (*ppExtra) 
7120: 69 73 20 73 65 74 20 74 6f 20 61 6e 20 65 78 70  is set to an exp
7130: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e  ression list con
7140: 74 61 69 6e 69 6e 67 0a 2a 2a 20 65 78 70 72 65  taining.** expre
7150: 73 73 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 65  ssions for all e
7160: 78 74 72 61 20 50 4b 20 76 61 6c 75 65 73 20 74  xtra PK values t
7170: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 73 74  hat should be st
7180: 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 73  ored in the.** s
7190: 6f 72 74 65 72 20 72 65 63 6f 72 64 73 2e 0a 2a  orter records..*
71a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
71b0: 6c 65 63 74 45 78 70 72 44 65 66 65 72 28 0a 20  lectExprDefer(. 
71c0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71e0: 20 2f 2a 20 4c 65 61 76 65 20 61 6e 79 20 65 72   /* Leave any er
71f0: 72 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 53 6f  ror here */.  So
7200: 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20  rtCtx *pSort,   
7210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7220: 20 53 6f 72 74 65 72 20 63 6f 6e 74 65 78 74 20   Sorter context 
7230: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
7240: 45 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  EList,          
7250: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
7260: 6f 6e 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72  ons destined for
7270: 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 45 78 70   sorter */.  Exp
7280: 72 4c 69 73 74 20 2a 2a 70 70 45 78 74 72 61 20  rList **ppExtra 
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
72a0: 45 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 20 61  Expressions to a
72b0: 70 70 65 6e 64 20 74 6f 20 73 6f 72 74 65 72 20  ppend to sorter 
72c0: 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69  record */.){.  i
72d0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 44 65 66  nt i;.  int nDef
72e0: 65 72 20 3d 20 30 3b 0a 20 20 45 78 70 72 4c 69  er = 0;.  ExprLi
72f0: 73 74 20 2a 70 45 78 74 72 61 20 3d 20 30 3b 0a  st *pExtra = 0;.
7300: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
7310: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
7320: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
7330: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
7340: 6d 20 3d 20 26 70 45 4c 69 73 74 2d 3e 61 5b 69  m = &pEList->a[i
7350: 5d 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  ];.    if( pItem
7360: 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
7370: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  l==0 ){.      Ex
7380: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 49 74 65  pr *pExpr = pIte
7390: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
73a0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 45  Table *pTab = pE
73b0: 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
73c0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
73d0: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78  TK_COLUMN && pEx
73e0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26  pr->iColumn>=0 &
73f0: 26 20 70 54 61 62 20 26 26 20 21 49 73 56 69 72  & pTab && !IsVir
7400: 74 75 61 6c 28 70 54 61 62 29 0a 20 20 20 20 20  tual(pTab).     
7410: 20 20 26 26 20 28 70 54 61 62 2d 3e 61 43 6f 6c    && (pTab->aCol
7420: 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
7430: 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46  .colFlags & COLF
7440: 4c 41 47 5f 53 4f 52 54 45 52 52 45 46 29 0a 20  LAG_SORTERREF). 
7450: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
7460: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66  int j;.        f
7470: 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 44 65 66 65 72  or(j=0; j<nDefer
7480: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
7490: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 61 44 65    if( pSort->aDe
74a0: 66 65 72 5b 6a 5d 2e 69 43 73 72 3d 3d 70 45 78  fer[j].iCsr==pEx
74b0: 70 72 2d 3e 69 54 61 62 6c 65 20 29 20 62 72 65  pr->iTable ) bre
74c0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
74d0: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 44 65        if( j==nDe
74e0: 66 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  fer ){.         
74f0: 20 69 66 28 20 6e 44 65 66 65 72 3d 3d 41 72 72   if( nDefer==Arr
7500: 61 79 53 69 7a 65 28 70 53 6f 72 74 2d 3e 61 44  aySize(pSort->aD
7510: 65 66 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  efer) ){.       
7520: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
7530: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
7540: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
7550: 6e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  nKey = 1;.      
7560: 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
7570: 20 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a           Index *
7580: 70 50 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  pPk = 0;.       
7590: 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77       if( !HasRow
75a0: 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
75b0: 20 20 20 20 20 20 20 20 20 20 70 50 6b 20 3d 20            pPk = 
75c0: 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
75d0: 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 4b 65 79              nKey
75f0: 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b   = pPk->nKeyCol;
7600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
7610: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b             for(k
7620: 3d 30 3b 20 6b 3c 6e 4b 65 79 3b 20 6b 2b 2b 29  =0; k<nKey; k++)
7630: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
7640: 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
7650: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
7660: 2c 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20  , TK_COLUMN, 0, 
7670: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
7680: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
7690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
76a0: 65 77 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78  ew->iTable = pEx
76b0: 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
76c0: 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
76d0: 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e  ->pTab = pExpr->
76e0: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
76f0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 43 6f 6c        pNew->iCol
7700: 75 6d 6e 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d  umn = pPk ? pPk-
7710: 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 3a 20 2d  >aiColumn[k] : -
7720: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
7730: 20 20 20 70 45 78 74 72 61 20 3d 20 73 71 6c 69     pExtra = sqli
7740: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
7750: 64 28 70 50 61 72 73 65 2c 20 70 45 78 74 72 61  d(pParse, pExtra
7760: 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , pNew);.       
7770: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7780: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7790: 20 20 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72     pSort->aDefer
77a0: 5b 6e 44 65 66 65 72 5d 2e 70 54 61 62 20 3d 20  [nDefer].pTab = 
77b0: 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20  pExpr->pTab;.   
77c0: 20 20 20 20 20 20 20 20 20 70 53 6f 72 74 2d 3e           pSort->
77d0: 61 44 65 66 65 72 5b 6e 44 65 66 65 72 5d 2e 69  aDefer[nDefer].i
77e0: 43 73 72 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  Csr = pExpr->iTa
77f0: 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ble;.           
7800: 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6e   pSort->aDefer[n
7810: 44 65 66 65 72 5d 2e 6e 4b 65 79 20 3d 20 6e 4b  Defer].nKey = nK
7820: 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey;.            
7830: 6e 44 65 66 65 72 2b 2b 3b 0a 20 20 20 20 20 20  nDefer++;.      
7840: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
7850: 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 62          pItem->b
7860: 53 6f 72 74 65 72 52 65 66 20 3d 20 31 3b 0a 20  SorterRef = 1;. 
7870: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7880: 0a 20 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72  .  pSort->nDefer
7890: 20 3d 20 28 75 38 29 6e 44 65 66 65 72 3b 0a 20   = (u8)nDefer;. 
78a0: 20 2a 70 70 45 78 74 72 61 20 3d 20 70 45 78 74   *ppExtra = pExt
78b0: 72 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ra;.}.#endif../*
78c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
78d0: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
78e0: 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69  ode for the insi
78f0: 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  de of the inner 
7900: 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c  loop.** of a SEL
7910: 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72  ECT..**.** If sr
7920: 63 54 61 62 20 69 73 20 6e 65 67 61 74 69 76 65  cTab is negative
7930: 2c 20 74 68 65 6e 20 74 68 65 20 70 2d 3e 70 45  , then the p->pE
7940: 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73  List expressions
7950: 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65  .** are evaluate
7960: 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  d in order to ge
7970: 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74  t the data for t
7980: 68 69 73 20 72 6f 77 2e 20 20 49 66 20 73 72 63  his row.  If src
7990: 54 61 62 20 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f  Tab is.** zero o
79a0: 72 20 6d 6f 72 65 2c 20 74 68 65 6e 20 64 61 74  r more, then dat
79b0: 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d  a is pulled from
79c0: 20 73 72 63 54 61 62 20 61 6e 64 20 70 2d 3e 70   srcTab and p->p
79d0: 45 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e  EList is used on
79e0: 6c 79 20 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68  ly .** to get th
79f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
7a00: 6d 6e 73 20 61 6e 64 20 74 68 65 20 63 6f 6c 6c  mns and the coll
7a10: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
7a20: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a  or each column..
7a30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
7a40: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a  electInnerLoop(.
7a50: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
7a60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
7a70: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
7a80: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7aa0: 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c  The complete sel
7ab0: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ect statement be
7ac0: 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69  ing coded */.  i
7ad0: 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20 20 20  nt srcTab,      
7ae0: 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64         /* Pull d
7af0: 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61  ata from this ta
7b00: 62 6c 65 20 69 66 20 6e 6f 6e 2d 6e 65 67 61 74  ble if non-negat
7b10: 69 76 65 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78  ive */.  SortCtx
7b20: 20 2a 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20   *pSort,        
7b30: 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c   /* If not NULL,
7b40: 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20   info on how to 
7b50: 70 72 6f 63 65 73 73 20 4f 52 44 45 52 20 42 59  process ORDER BY
7b60: 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74   */.  DistinctCt
7b70: 78 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a  x *pDistinct, /*
7b80: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e   If not NULL, in
7b90: 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f  fo on how to pro
7ba0: 63 65 73 73 20 44 49 53 54 49 4e 43 54 20 2a 2f  cess DISTINCT */
7bb0: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
7bc0: 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f  Dest,      /* Ho
7bd0: 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20  w to dispose of 
7be0: 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  the results */. 
7bf0: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20   int iContinue, 
7c00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
7c10: 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75   here to continu
7c20: 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20  e with next row 
7c30: 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20  */.  int iBreak 
7c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7c50: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65  Jump here to bre
7c60: 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e  ak out of the in
7c70: 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20  ner loop */.){. 
7c80: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
7c90: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
7ca0: 69 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74  i;.  int hasDist
7cb0: 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20 20  inct;           
7cc0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
7cd0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
7ce0: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
7cf0: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
7d00: 73 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20  st->eDest;   /* 
7d10: 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f  How to dispose o
7d20: 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  f results */.  i
7d30: 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74  nt iParm = pDest
7d40: 2d 3e 69 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69  ->iSDParm; /* Fi
7d50: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
7d60: 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20  disposal method 
7d70: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74  */.  int nResult
7d80: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
7d90: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
7da0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  sult columns */.
7db0: 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67    int nPrefixReg
7dc0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
7dd0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
7de0: 20 72 65 67 69 73 74 65 72 73 20 62 65 66 6f 72   registers befor
7df0: 65 20 72 65 67 52 65 73 75 6c 74 20 2a 2f 0a 20  e regResult */. 
7e00: 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20 73 52 6f   RowLoadInfo sRo
7e10: 77 4c 6f 61 64 49 6e 66 6f 3b 20 20 20 2f 2a 20  wLoadInfo;   /* 
7e20: 49 6e 66 6f 20 66 6f 72 20 64 65 66 65 72 72 65  Info for deferre
7e30: 64 20 72 6f 77 20 6c 6f 61 64 69 6e 67 20 2a 2f  d row loading */
7e40: 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 2c 20  ..  /* Usually, 
7e50: 72 65 67 52 65 73 75 6c 74 20 69 73 20 74 68 65  regResult is the
7e60: 20 66 69 72 73 74 20 63 65 6c 6c 20 69 6e 20 61   first cell in a
7e70: 6e 20 61 72 72 61 79 20 6f 66 20 6d 65 6d 6f 72  n array of memor
7e80: 79 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 63 6f 6e  y cells.  ** con
7e90: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72  taining the curr
7ea0: 65 6e 74 20 72 65 73 75 6c 74 20 72 6f 77 2e 20  ent result row. 
7eb0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 72 65 67  In this case reg
7ec0: 4f 72 69 67 20 69 73 20 73 65 74 20 74 6f 20 74  Orig is set to t
7ed0: 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 76 61 6c  he.  ** same val
7ee0: 75 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ue. However, if 
7ef0: 74 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  the results are 
7f00: 62 65 69 6e 67 20 73 65 6e 74 20 74 6f 20 74 68  being sent to th
7f10: 65 20 73 6f 72 74 65 72 2c 20 74 68 65 0a 20 20  e sorter, the.  
7f20: 2a 2a 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6e  ** values for an
7f30: 79 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  y expressions th
7f40: 61 74 20 61 72 65 20 61 6c 73 6f 20 70 61 72 74  at are also part
7f50: 20 6f 66 20 74 68 65 20 73 6f 72 74 2d 6b 65 79   of the sort-key
7f60: 20 61 72 65 20 6f 6d 69 74 74 65 64 0a 20 20 2a   are omitted.  *
7f70: 2a 20 66 72 6f 6d 20 74 68 69 73 20 61 72 72 61  * from this arra
7f80: 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  y. In this case 
7f90: 72 65 67 4f 72 69 67 20 69 73 20 73 65 74 20 74  regOrig is set t
7fa0: 6f 20 7a 65 72 6f 2e 20 20 2a 2f 0a 20 20 69 6e  o zero.  */.  in
7fb0: 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20  t regResult;    
7fc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
7fd0: 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c  rt of memory hol
7fe0: 64 69 6e 67 20 63 75 72 72 65 6e 74 20 72 65 73  ding current res
7ff0: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ults */.  int re
8000: 67 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20  gOrig;          
8010: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
8020: 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67  f memory holding
8030: 20 66 75 6c 6c 20 72 65 73 75 6c 74 20 28 6f 72   full result (or
8040: 20 30 29 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74   0) */..  assert
8050: 28 20 76 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ( v );.  assert(
8060: 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b   p->pEList!=0 );
8070: 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d  .  hasDistinct =
8080: 20 70 44 69 73 74 69 6e 63 74 20 3f 20 70 44 69   pDistinct ? pDi
8090: 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70  stinct->eTnctTyp
80a0: 65 20 3a 20 57 48 45 52 45 5f 44 49 53 54 49 4e  e : WHERE_DISTIN
80b0: 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70  CT_NOOP;.  if( p
80c0: 53 6f 72 74 20 26 26 20 70 53 6f 72 74 2d 3e 70  Sort && pSort->p
80d0: 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 70 53 6f  OrderBy==0 ) pSo
80e0: 72 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53  rt = 0;.  if( pS
80f0: 6f 72 74 3d 3d 30 20 26 26 20 21 68 61 73 44 69  ort==0 && !hasDi
8100: 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73  stinct ){.    as
8110: 73 65 72 74 28 20 69 43 6f 6e 74 69 6e 75 65 21  sert( iContinue!
8120: 3d 30 20 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66  =0 );.    codeOf
8130: 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73  fset(v, p->iOffs
8140: 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a  et, iContinue);.
8150: 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74    }..  /* Pull t
8160: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
8170: 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65  umns..  */.  nRe
8180: 73 75 6c 74 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c  sultCol = p->pEL
8190: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69  ist->nExpr;..  i
81a0: 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d  f( pDest->iSdst=
81b0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53  =0 ){.    if( pS
81c0: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 72  ort ){.      nPr
81d0: 65 66 69 78 52 65 67 20 3d 20 70 53 6f 72 74 2d  efixReg = pSort-
81e0: 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
81f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 28 70 53  ;.      if( !(pS
8200: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
8210: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
8220: 74 65 72 29 20 29 20 6e 50 72 65 66 69 78 52 65  ter) ) nPrefixRe
8230: 67 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72 73  g++;.      pPars
8240: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 72 65 66  e->nMem += nPref
8250: 69 78 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20  ixReg;.    }.   
8260: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
8270: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
8280: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
8290: 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a   += nResultCol;.
82a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65 73    }else if( pDes
82b0: 74 2d 3e 69 53 64 73 74 2b 6e 52 65 73 75 6c 74  t->iSdst+nResult
82c0: 43 6f 6c 20 3e 20 70 50 61 72 73 65 2d 3e 6e 4d  Col > pParse->nM
82d0: 65 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  em ){.    /* Thi
82e0: 73 20 69 73 20 61 6e 20 65 72 72 6f 72 20 63 6f  s is an error co
82f0: 6e 64 69 74 69 6f 6e 20 74 68 61 74 20 63 61 6e  ndition that can
8300: 20 72 65 73 75 6c 74 2c 20 66 6f 72 20 65 78 61   result, for exa
8310: 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 53 45 4c  mple, when a SEL
8320: 45 43 54 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  ECT.    ** on th
8330: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
8340: 65 20 6f 66 20 61 6e 20 49 4e 53 45 52 54 20 63  e of an INSERT c
8350: 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 72 65 73  ontains more res
8360: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e  ult columns than
8370: 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20 61 72  .    ** there ar
8380: 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  e columns in the
8390: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65   table on the le
83a0: 66 74 2e 20 20 54 68 65 20 65 72 72 6f 72 20 77  ft.  The error w
83b0: 69 6c 6c 20 62 65 20 63 61 75 67 68 74 0a 20 20  ill be caught.  
83c0: 20 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72 74 65    ** and reporte
83d0: 64 20 6c 61 74 65 72 2e 20 20 42 75 74 20 77 65  d later.  But we
83e0: 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75   need to make su
83f0: 72 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79  re enough memory
8400: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20   is allocated.  
8410: 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 6f 74    ** to avoid ot
8420: 68 65 72 20 73 70 75 72 69 6f 75 73 20 65 72 72  her spurious err
8430: 6f 72 73 20 69 6e 20 74 68 65 20 6d 65 61 6e 74  ors in the meant
8440: 69 6d 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 72  ime. */.    pPar
8450: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73  se->nMem += nRes
8460: 75 6c 74 43 6f 6c 3b 0a 20 20 7d 0a 20 20 70 44  ultCol;.  }.  pD
8470: 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 6e 52 65  est->nSdst = nRe
8480: 73 75 6c 74 43 6f 6c 3b 0a 20 20 72 65 67 4f 72  sultCol;.  regOr
8490: 69 67 20 3d 20 72 65 67 52 65 73 75 6c 74 20 3d  ig = regResult =
84a0: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20   pDest->iSdst;. 
84b0: 20 69 66 28 20 73 72 63 54 61 62 3e 3d 30 20 29   if( srcTab>=0 )
84c0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
84d0: 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b  <nResultCol; i++
84e0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
84f0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
8500: 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c  _Column, srcTab,
8510: 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 29   i, regResult+i)
8520: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
8530: 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 2d  ent((v, "%s", p-
8540: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  >pEList->a[i].zN
8550: 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ame));.    }.  }
8560: 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 21 3d  else if( eDest!=
8570: 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 23 69  SRT_Exists ){.#i
8580: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
8590: 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45  LE_SORTER_REFERE
85a0: 4e 43 45 53 0a 20 20 20 20 45 78 70 72 4c 69 73  NCES.    ExprLis
85b0: 74 20 2a 70 45 78 74 72 61 20 3d 20 30 3b 0a 23  t *pExtra = 0;.#
85c0: 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20  endif.    /* If 
85d0: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
85e0: 69 73 20 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e  is an EXISTS(...
85f0: 29 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  ) expression, th
8600: 65 20 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20  e actual.    ** 
8610: 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20  values returned 
8620: 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 61 72  by the SELECT ar
8630: 65 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a  e not required..
8640: 20 20 20 20 2a 2f 0a 20 20 20 20 75 38 20 65 63      */.    u8 ec
8650: 65 6c 46 6c 61 67 73 3b 20 20 20 20 2f 2a 20 22  elFlags;    /* "
8660: 65 63 65 6c 22 20 69 73 20 61 6e 20 61 62 62 72  ecel" is an abbr
8670: 65 76 69 61 74 69 6f 6e 20 6f 66 20 22 45 78 70  eviation of "Exp
8680: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 22 20 2a  rCodeExprList" *
8690: 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  /.    ExprList *
86a0: 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20  pEList;.    if( 
86b0: 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c  eDest==SRT_Mem |
86c0: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  | eDest==SRT_Out
86d0: 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  put || eDest==SR
86e0: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20  T_Coroutine ){. 
86f0: 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73 20 3d       ecelFlags =
8700: 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
8710: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8720: 20 20 20 65 63 65 6c 46 6c 61 67 73 20 3d 20 30     ecelFlags = 0
8730: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
8740: 70 53 6f 72 74 20 26 26 20 68 61 73 44 69 73 74  pSort && hasDist
8750: 69 6e 63 74 3d 3d 30 20 26 26 20 65 44 65 73 74  inct==0 && eDest
8760: 21 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 26  !=SRT_EphemTab &
8770: 26 20 65 44 65 73 74 21 3d 53 52 54 5f 54 61 62  & eDest!=SRT_Tab
8780: 6c 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46  le ){.      /* F
8790: 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
87a0: 6f 6e 20 69 6e 20 70 2d 3e 70 45 4c 69 73 74 20  on in p->pEList 
87b0: 74 68 61 74 20 69 73 20 61 20 63 6f 70 79 20 6f  that is a copy o
87c0: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
87d0: 69 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  in.      ** the 
87e0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
87f0: 28 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79  (pSort->pOrderBy
8800: 29 2c 20 73 65 74 20 74 68 65 20 61 73 73 6f 63  ), set the assoc
8810: 69 61 74 65 64 20 0a 20 20 20 20 20 20 2a 2a 20  iated .      ** 
8820: 69 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75  iOrderByCol valu
8830: 65 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68  e to one more th
8840: 61 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  an the index of 
8850: 74 68 65 20 4f 52 44 45 52 20 42 59 20 0a 20 20  the ORDER BY .  
8860: 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
8870: 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 6f 72  n within the sor
8880: 74 2d 6b 65 79 20 74 68 61 74 20 70 75 73 68 4f  t-key that pushO
8890: 6e 74 6f 53 6f 72 74 65 72 28 29 20 77 69 6c 6c  ntoSorter() will
88a0: 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 20   generate..     
88b0: 20 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 77 73 20   ** This allows 
88c0: 74 68 65 20 70 2d 3e 70 45 4c 69 73 74 20 66 69  the p->pEList fi
88d0: 65 6c 64 20 74 6f 20 62 65 20 6f 6d 69 74 74 65  eld to be omitte
88e0: 64 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65  d from the sorte
88f0: 64 20 72 65 63 6f 72 64 2c 0a 20 20 20 20 20 20  d record,.      
8900: 2a 2a 20 73 61 76 69 6e 67 20 73 70 61 63 65 20  ** saving space 
8910: 61 6e 64 20 43 50 55 20 63 79 63 6c 65 73 2e 20  and CPU cycles. 
8920: 20 2a 2f 0a 20 20 20 20 20 20 65 63 65 6c 46 6c   */.      ecelFl
8930: 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 45  ags |= (SQLITE_E
8940: 43 45 4c 5f 4f 4d 49 54 52 45 46 7c 53 51 4c 49  CEL_OMITREF|SQLI
8950: 54 45 5f 45 43 45 4c 5f 52 45 46 29 3b 0a 0a 20  TE_ECEL_REF);.. 
8960: 20 20 20 20 20 66 6f 72 28 69 3d 70 53 6f 72 74       for(i=pSort
8970: 2d 3e 6e 4f 42 53 61 74 3b 20 69 3c 70 53 6f 72  ->nOBSat; i<pSor
8980: 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  t->pOrderBy->nEx
8990: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
89a0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
89b0: 20 69 66 28 20 28 6a 20 3d 20 70 53 6f 72 74 2d   if( (j = pSort-
89c0: 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e  >pOrderBy->a[i].
89d0: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29  u.x.iOrderByCol)
89e0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
89f0: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 2d 31  p->pEList->a[j-1
8a00: 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
8a10: 6c 20 3d 20 69 2b 31 2d 70 53 6f 72 74 2d 3e 6e  l = i+1-pSort->n
8a20: 4f 42 53 61 74 3b 0a 20 20 20 20 20 20 20 20 7d  OBSat;.        }
8a30: 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20  .      }.#ifdef 
8a40: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
8a50: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
8a60: 20 20 20 20 20 20 73 65 6c 65 63 74 45 78 70 72        selectExpr
8a70: 44 65 66 65 72 28 70 50 61 72 73 65 2c 20 70 53  Defer(pParse, pS
8a80: 6f 72 74 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  ort, p->pEList, 
8a90: 26 70 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20  &pExtra);.      
8aa0: 69 66 28 20 70 45 78 74 72 61 20 26 26 20 70 50  if( pExtra && pP
8ab0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
8ac0: 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Failed==0 ){.   
8ad0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
8ae0: 20 61 72 65 20 61 6e 79 20 65 78 74 72 61 20 50   are any extra P
8af0: 4b 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 61 64 64  K columns to add
8b00: 20 74 6f 20 74 68 65 20 73 6f 72 74 65 72 20 72   to the sorter r
8b10: 65 63 6f 72 64 73 2c 0a 20 20 20 20 20 20 20 20  ecords,.        
8b20: 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 65 78 74 72  ** allocate extr
8b30: 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61  a memory cells a
8b40: 6e 64 20 61 64 6a 75 73 74 20 74 68 65 20 4f 70  nd adjust the Op
8b50: 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20  enEphemeral .   
8b60: 20 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74       ** instruct
8b70: 69 6f 6e 20 74 6f 20 61 63 63 6f 75 6e 74 20 66  ion to account f
8b80: 6f 72 20 74 68 65 20 6c 61 72 67 65 72 20 72 65  or the larger re
8b90: 63 6f 72 64 73 2e 20 54 68 69 73 20 69 73 20 6f  cords. This is o
8ba0: 6e 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  nly.        ** r
8bb0: 65 71 75 69 72 65 64 20 69 66 20 74 68 65 72 65  equired if there
8bc0: 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   are one or more
8bd0: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
8be0: 61 62 6c 65 73 20 77 69 74 68 0a 20 20 20 20 20  ables with.     
8bf0: 20 20 20 2a 2a 20 63 6f 6d 70 6f 73 69 74 65 20     ** composite 
8c00: 70 72 69 6d 61 72 79 20 6b 65 79 73 20 69 6e 20  primary keys in 
8c10: 74 68 65 20 53 6f 72 74 43 74 78 2e 61 44 65 66  the SortCtx.aDef
8c20: 65 72 5b 5d 20 61 72 72 61 79 2e 20 20 2a 2f 0a  er[] array.  */.
8c30: 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a          VdbeOp *
8c40: 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
8c50: 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74 2d  eGetOp(v, pSort-
8c60: 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b  >addrSortIndex);
8c70: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32  .        pOp->p2
8c80: 20 2b 3d 20 28 70 45 78 74 72 61 2d 3e 6e 45 78   += (pExtra->nEx
8c90: 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 44 65 66  pr - pSort->nDef
8ca0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  er);.        pOp
8cb0: 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ->p4.pKeyInfo->n
8cc0: 41 6c 6c 46 69 65 6c 64 20 2b 3d 20 28 70 45 78  AllField += (pEx
8cd0: 74 72 61 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f  tra->nExpr - pSo
8ce0: 72 74 2d 3e 6e 44 65 66 65 72 29 3b 0a 20 20 20  rt->nDefer);.   
8cf0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
8d00: 6d 20 2b 3d 20 70 45 78 74 72 61 2d 3e 6e 45 78  m += pExtra->nEx
8d10: 70 72 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  pr;.      }.#end
8d20: 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a  if..      /* Adj
8d30: 75 73 74 20 6e 52 65 73 75 6c 74 43 6f 6c 20 74  ust nResultCol t
8d40: 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 63 6f  o account for co
8d50: 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6f  lumns that are o
8d60: 6d 69 74 74 65 64 0a 20 20 20 20 20 20 2a 2a 20  mitted.      ** 
8d70: 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20  from the sorter 
8d80: 62 79 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  by the optimizat
8d90: 69 6f 6e 73 20 69 6e 20 74 68 69 73 20 62 72 61  ions in this bra
8da0: 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20 70 45 4c  nch */.      pEL
8db0: 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
8dc0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
8dd0: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
8de0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
8df0: 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  f( pEList->a[i].
8e00: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e  u.x.iOrderByCol>
8e10: 30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  0.#ifdef SQLITE_
8e20: 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45  ENABLE_SORTER_RE
8e30: 46 45 52 45 4e 43 45 53 0a 20 20 20 20 20 20 20  FERENCES.       
8e40: 20 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 61 5b 69    || pEList->a[i
8e50: 5d 2e 62 53 6f 72 74 65 72 52 65 66 0a 23 65 6e  ].bSorterRef.#en
8e60: 64 69 66 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  dif.        ){. 
8e70: 20 20 20 20 20 20 20 20 20 6e 52 65 73 75 6c 74           nResult
8e80: 43 6f 6c 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20  Col--;.         
8e90: 20 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a 20 20   regOrig = 0;.  
8ea0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
8eb0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
8ec0: 20 72 65 67 4f 72 69 67 20 29 3b 0a 20 20 20 20   regOrig );.    
8ed0: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
8ee0: 74 3d 3d 53 52 54 5f 53 65 74 20 29 3b 0a 20 20  t==SRT_Set );.  
8ef0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
8f00: 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 3b 0a  est==SRT_Mem );.
8f10: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
8f20: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
8f30: 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74 65  tine );.      te
8f40: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
8f50: 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
8f60: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
8f70: 3d 3d 53 52 54 5f 53 65 74 20 7c 7c 20 65 44 65  ==SRT_Set || eDe
8f80: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 0a 20 20 20  st==SRT_Mem .   
8f90: 20 20 20 20 20 20 20 20 7c 7c 20 65 44 65 73 74          || eDest
8fa0: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
8fb0: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  || eDest==SRT_Ou
8fc0: 74 70 75 74 20 29 3b 0a 20 20 20 20 7d 0a 20 20  tput );.    }.  
8fd0: 20 20 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 2e 72    sRowLoadInfo.r
8fe0: 65 67 52 65 73 75 6c 74 20 3d 20 72 65 67 52 65  egResult = regRe
8ff0: 73 75 6c 74 3b 0a 20 20 20 20 73 52 6f 77 4c 6f  sult;.    sRowLo
9000: 61 64 49 6e 66 6f 2e 65 63 65 6c 46 6c 61 67 73  adInfo.ecelFlags
9010: 20 3d 20 65 63 65 6c 46 6c 61 67 73 3b 0a 23 69   = ecelFlags;.#i
9020: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
9030: 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45  LE_SORTER_REFERE
9040: 4e 43 45 53 0a 20 20 20 20 73 52 6f 77 4c 6f 61  NCES.    sRowLoa
9050: 64 49 6e 66 6f 2e 70 45 78 74 72 61 20 3d 20 70  dInfo.pExtra = p
9060: 45 78 74 72 61 3b 0a 20 20 20 20 73 52 6f 77 4c  Extra;.    sRowL
9070: 6f 61 64 49 6e 66 6f 2e 72 65 67 45 78 74 72 61  oadInfo.regExtra
9080: 52 65 73 75 6c 74 20 3d 20 72 65 67 52 65 73 75  Result = regResu
9090: 6c 74 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  lt + nResultCol;
90a0: 0a 20 20 20 20 69 66 28 20 70 45 78 74 72 61 20  .    if( pExtra 
90b0: 29 20 6e 52 65 73 75 6c 74 43 6f 6c 20 2b 3d 20  ) nResultCol += 
90c0: 70 45 78 74 72 61 2d 3e 6e 45 78 70 72 3b 0a 23  pExtra->nExpr;.#
90d0: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 2d  endif.    if( p-
90e0: 3e 69 4c 69 6d 69 74 0a 20 20 20 20 20 26 26 20  >iLimit.     && 
90f0: 28 65 63 65 6c 46 6c 61 67 73 20 26 20 53 51 4c  (ecelFlags & SQL
9100: 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46  ITE_ECEL_OMITREF
9110: 29 21 3d 30 20 0a 20 20 20 20 20 26 26 20 6e 50  )!=0 .     && nP
9120: 72 65 66 69 78 52 65 67 3e 30 0a 20 20 20 20 29  refixReg>0.    )
9130: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
9140: 70 53 6f 72 74 21 3d 30 20 29 3b 0a 20 20 20 20  pSort!=0 );.    
9150: 20 20 61 73 73 65 72 74 28 20 68 61 73 44 69 73    assert( hasDis
9160: 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20  tinct==0 );.    
9170: 20 20 70 53 6f 72 74 2d 3e 70 44 65 66 65 72 72    pSort->pDeferr
9180: 65 64 52 6f 77 4c 6f 61 64 20 3d 20 26 73 52 6f  edRowLoad = &sRo
9190: 77 4c 6f 61 64 49 6e 66 6f 3b 0a 20 20 20 20 20  wLoadInfo;.     
91a0: 20 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a 20 20   regOrig = 0;.  
91b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
91c0: 6e 6e 65 72 4c 6f 6f 70 4c 6f 61 64 52 6f 77 28  nnerLoopLoadRow(
91d0: 70 50 61 72 73 65 2c 20 70 2c 20 26 73 52 6f 77  pParse, p, &sRow
91e0: 4c 6f 61 64 49 6e 66 6f 29 3b 0a 20 20 20 20 7d  LoadInfo);.    }
91f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
9200: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
9210: 72 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f  rd was present o
9220: 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
9230: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20  tement.  ** and 
9240: 74 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65  this row has bee
9250: 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74  n seen before, t
9260: 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20  hen do not make 
9270: 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61  this row.  ** pa
9280: 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rt of the result
9290: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73  ..  */.  if( has
92a0: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
92b0: 73 77 69 74 63 68 28 20 70 44 69 73 74 69 6e 63  switch( pDistinc
92c0: 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 29 7b 0a  t->eTnctType ){.
92d0: 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45        case WHERE
92e0: 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
92f0: 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62  D: {.        Vdb
9300: 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 20  eOp *pOp;       
9310: 20 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65       /* No longe
9320: 72 20 72 65 71 75 69 72 65 64 20 4f 70 65 6e 45  r required OpenE
9330: 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20  phemeral instr. 
9340: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
9350: 4a 75 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20  Jump;           
9360: 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69     /* Jump desti
9370: 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  nation */.      
9380: 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20    int regPrev;  
9390: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
93a0: 76 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74 65 6e  vious row conten
93b0: 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a  t */..        /*
93c0: 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
93d0: 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73  for the previous
93e0: 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20   row */.        
93f0: 72 65 67 50 72 65 76 20 3d 20 70 50 61 72 73 65  regPrev = pParse
9400: 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20  ->nMem+1;.      
9410: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
9420: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20  = nResultCol;.. 
9430: 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65         /* Change
9440: 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   the OP_OpenEphe
9450: 6d 65 72 61 6c 20 63 6f 64 65 64 20 65 61 72 6c  meral coded earl
9460: 69 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c  ier to an OP_Nul
9470: 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74  l.        ** set
9480: 73 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61 72 65  s the MEM_Cleare
9490: 64 20 62 69 74 20 6f 6e 20 74 68 65 20 66 69 72  d bit on the fir
94a0: 73 74 20 72 65 67 69 73 74 65 72 20 6f 66 20 74  st register of t
94b0: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  he.        ** pr
94c0: 65 76 69 6f 75 73 20 76 61 6c 75 65 2e 20 20 54  evious value.  T
94d0: 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74  his will cause t
94e0: 68 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77 20 74  he OP_Ne below t
94f0: 6f 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20 20  o always.       
9500: 20 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68 65 20   ** fail on the 
9510: 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20  first iteration 
9520: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 65 76 65 6e  of the loop even
9530: 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20   if the first.  
9540: 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 69 73 20        ** row is 
9550: 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20 20 20  all NULLs..     
9560: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71     */.        sq
9570: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
9580: 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e  oNoop(v, pDistin
9590: 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20  ct->addrTnct);. 
95a0: 20 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c         pOp = sql
95b0: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
95c0: 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72   pDistinct->addr
95d0: 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Tnct);.        p
95e0: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
95f0: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f  Null;.        pO
9600: 70 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20 20 20  p->p1 = 1;.     
9610: 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72 65 67     pOp->p2 = reg
9620: 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 20 20 69  Prev;..        i
9630: 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Jump = sqlite3Vd
9640: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
9650: 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20   + nResultCol;. 
9660: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
9670: 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b  i<nResultCol; i+
9680: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 43 6f  +){.          Co
9690: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
96a0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
96b0: 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c  q(pParse, p->pEL
96c0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
96d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
96e0: 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 20 29  i<nResultCol-1 )
96f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
9700: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
9710: 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73  v, OP_Ne, regRes
9720: 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65  ult+i, iJump, re
9730: 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20  gPrev+i);.      
9740: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
9750: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
9760: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9770: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9780: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20  ddOp3(v, OP_Eq, 
9790: 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 43 6f  regResult+i, iCo
97a0: 6e 74 69 6e 75 65 2c 20 72 65 67 50 72 65 76 2b  ntinue, regPrev+
97b0: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
97c0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
97d0: 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  .           }.  
97e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
97f0: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
9800: 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  1, (const char *
9810: 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
9820: 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  EQ);.          s
9830: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
9840: 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c  P5(v, SQLITE_NUL
9850: 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  LEQ);.        }.
9860: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9870: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
9880: 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d 70  ntAddr(v)==iJump
9890: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
98a0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
98b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
98c0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
98d0: 43 6f 70 79 2c 20 72 65 67 52 65 73 75 6c 74 2c  Copy, regResult,
98e0: 20 72 65 67 50 72 65 76 2c 20 6e 52 65 73 75 6c   regPrev, nResul
98f0: 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20  tCol-1);.       
9900: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
9910: 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
9920: 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
9930: 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  E: {.        sql
9940: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
9950: 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63  Noop(v, pDistinc
9960: 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20  t->addrTnct);.  
9970: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9980: 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65 66 61     }..      defa
9990: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 61  ult: {.        a
99a0: 73 73 65 72 74 28 20 70 44 69 73 74 69 6e 63 74  ssert( pDistinct
99b0: 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45  ->eTnctType==WHE
99c0: 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52  RE_DISTINCT_UNOR
99d0: 44 45 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20  DERED );.       
99e0: 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50   codeDistinct(pP
99f0: 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2d  arse, pDistinct-
9a00: 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e 74 69  >tabTnct, iConti
9a10: 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  nue, nResultCol,
9a20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9a30: 20 20 20 20 20 20 72 65 67 52 65 73 75 6c 74 29        regResult)
9a40: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9a50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9a60: 20 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20     if( pSort==0 
9a70: 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66 66  ){.      codeOff
9a80: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
9a90: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  t, iContinue);. 
9aa0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74     }.  }..  swit
9ab0: 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20  ch( eDest ){.   
9ac0: 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64 65   /* In this mode
9ad0: 2c 20 77 72 69 74 65 20 65 61 63 68 20 71 75 65  , write each que
9ae0: 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65  ry result to the
9af0: 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d 70   key of the temp
9b00: 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62  orary.    ** tab
9b10: 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f  le iParm..    */
9b20: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9b30: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
9b40: 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20 53 52  LECT.    case SR
9b50: 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20  T_Union: {.     
9b60: 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 72   int r1;.      r
9b70: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
9b80: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
9b90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9ba0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
9bb0: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
9bc0: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20  lt, nResultCol, 
9bd0: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
9be0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
9bf0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
9c00: 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 65 67 52   iParm, r1, regR
9c10: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
9c20: 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
9c30: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
9c40: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
9c50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9c60: 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63  .    /* Construc
9c70: 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20  t a record from 
9c80: 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74  the query result
9c90: 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66  , but instead of
9ca0: 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74  .    ** saving t
9cb0: 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20  hat record, use 
9cc0: 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64  it as a key to d
9cd0: 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66  elete elements f
9ce0: 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74  rom.    ** the t
9cf0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
9d00: 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Parm..    */.   
9d10: 20 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74   case SRT_Except
9d20: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
9d30: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
9d40: 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 50 61  P_IdxDelete, iPa
9d50: 72 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rm, regResult, n
9d60: 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20  ResultCol);.    
9d70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
9d80: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
9d90: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
9da0: 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  LECT */..    /* 
9db0: 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
9dc0: 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61   as data using a
9dd0: 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20   unique key..   
9de0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
9df0: 5f 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20  _Fifo:.    case 
9e00: 53 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a 20 20  SRT_DistFifo:.  
9e10: 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65    case SRT_Table
9e20: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  :.    case SRT_E
9e30: 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
9e40: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
9e50: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
9e60: 61 72 73 65 2c 20 6e 50 72 65 66 69 78 52 65 67  arse, nPrefixReg
9e70: 2b 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  +1);.      testc
9e80: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
9e90: 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74  Table );.      t
9ea0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
9eb0: 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a  SRT_EphemTab );.
9ec0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9ed0: 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f 20  eDest==SRT_Fifo 
9ee0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
9ef0: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  e( eDest==SRT_Di
9f00: 73 74 46 69 66 6f 20 29 3b 0a 20 20 20 20 20 20  stFifo );.      
9f10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9f20: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
9f30: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
9f40: 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 2b 6e 50  ResultCol, r1+nP
9f50: 72 65 66 69 78 52 65 67 29 3b 0a 23 69 66 6e 64  refixReg);.#ifnd
9f60: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
9f70: 54 45 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  TE.      if( eDe
9f80: 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f  st==SRT_DistFifo
9f90: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
9fa0: 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  f the destinatio
9fb0: 6e 20 69 73 20 44 69 73 74 46 69 66 6f 2c 20 74  n is DistFifo, t
9fc0: 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50 61 72  hen cursor (iPar
9fd0: 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20 20 20  m+1) is open.   
9fe0: 20 20 20 20 20 2a 2a 20 6f 6e 20 61 6e 20 65 70       ** on an ep
9ff0: 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 2e 20 49  hemeral index. I
a000: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
a010: 77 20 69 73 20 61 6c 72 65 61 64 79 20 70 72 65  w is already pre
a020: 73 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  sent.        ** 
a030: 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20 64 6f  in the index, do
a040: 20 6e 6f 74 20 77 72 69 74 65 20 69 74 20 74 6f   not write it to
a050: 20 74 68 65 20 6f 75 74 70 75 74 2e 20 49 66 20   the output. If 
a060: 6e 6f 74 2c 20 61 64 64 20 74 68 65 0a 20 20 20  not, add the.   
a070: 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20       ** current 
a080: 72 6f 77 20 74 6f 20 74 68 65 20 69 6e 64 65 78  row to the index
a090: 20 61 6e 64 20 70 72 6f 63 65 65 64 20 77 69 74   and proceed wit
a0a0: 68 20 77 72 69 74 69 6e 67 20 69 74 20 74 6f 20  h writing it to 
a0b0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  the.        ** o
a0c0: 75 74 70 75 74 20 74 61 62 6c 65 20 61 73 20 77  utput table as w
a0d0: 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ell.  */.       
a0e0: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
a0f0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
a100: 64 72 28 76 29 20 2b 20 34 3b 0a 20 20 20 20 20  dr(v) + 4;.     
a110: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a120: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
a130: 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 61 64  und, iParm+1, ad
a140: 64 72 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20  dr, r1, 0);.    
a150: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
a160: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
a170: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
a180: 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  t(v, OP_IdxInser
a190: 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 31 2c 72  t, iParm+1, r1,r
a1a0: 65 67 52 65 73 75 6c 74 2c 6e 52 65 73 75 6c 74  egResult,nResult
a1b0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 61 73  Col);.        as
a1c0: 73 65 72 74 28 20 70 53 6f 72 74 3d 3d 30 20 29  sert( pSort==0 )
a1d0: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
a1e0: 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74  .      if( pSort
a1f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
a200: 72 74 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 72  rt( regResult==r
a210: 65 67 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20  egOrig );.      
a220: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
a230: 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20  (pParse, pSort, 
a240: 70 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65 67  p, r1+nPrefixReg
a250: 2c 20 72 65 67 4f 72 69 67 2c 20 31 2c 20 6e 50  , regOrig, 1, nP
a260: 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20  refixReg);.     
a270: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a280: 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33  int r2 = sqlite3
a290: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
a2a0: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
a2b0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a2c0: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50   OP_NewRowid, iP
a2d0: 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  arm, r2);.      
a2e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a2f0: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
a300: 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29  , iParm, r1, r2)
a310: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a320: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
a330: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
a340: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a350: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
a360: 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20  Parse, r2);.    
a370: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
a380: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
a390: 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 50  e(pParse, r1, nP
a3a0: 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20 20  refixReg+1);.   
a3b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a3c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a3d0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
a3e0: 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63    /* If we are c
a3f0: 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f  reating a set fo
a400: 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53  r an "expr IN (S
a410: 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73  ELECT ...)" cons
a420: 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68  truct,.    ** th
a430: 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20  en there should 
a440: 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d  be a single item
a450: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
a460: 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a  Write this.    *
a470: 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20  * item into the 
a480: 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62  set table with b
a490: 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a  ogus data..    *
a4a0: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
a4b0: 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  et: {.      if( 
a4c0: 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  pSort ){.       
a4d0: 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61   /* At first gla
a4e0: 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68  nce you would th
a4f0: 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74  ink we could opt
a500: 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20  imize out the.  
a510: 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42        ** ORDER B
a520: 59 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 73  Y in this case s
a530: 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f  ince the order o
a540: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
a550: 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   set.        ** 
a560: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e  does not matter.
a570: 20 20 42 75 74 20 74 68 65 72 65 20 6d 69 67 68    But there migh
a580: 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61  t be a LIMIT cla
a590: 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20  use, in which.  
a5a0: 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68        ** case th
a5b0: 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74  e order does mat
a5c0: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ter */.        p
a5d0: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20  ushOntoSorter(. 
a5e0: 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
a5f0: 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67  e, pSort, p, reg
a600: 52 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c  Result, regOrig,
a610: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72   nResultCol, nPr
a620: 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20  efixReg);.      
a630: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
a640: 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
a650: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
a660: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
a670: 74 28 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  t( sqlite3Strlen
a680: 33 30 28 70 44 65 73 74 2d 3e 7a 41 66 66 53 64  30(pDest->zAffSd
a690: 73 74 29 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c 20  st)==nResultCol 
a6a0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
a6b0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
a6c0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
a6d0: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
a6e0: 74 43 6f 6c 2c 20 0a 20 20 20 20 20 20 20 20 20  tCol, .         
a6f0: 20 20 20 72 31 2c 20 70 44 65 73 74 2d 3e 7a 41     r1, pDest->zA
a700: 66 66 53 64 73 74 2c 20 6e 52 65 73 75 6c 74 43  ffSdst, nResultC
a710: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
a720: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
a730: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
a740: 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  se, regResult, n
a750: 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20  ResultCol);.    
a760: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a770: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
a780: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
a790: 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74 2c 20   r1, regResult, 
a7a0: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
a7b0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
a7c0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
a7d0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a  e, r1);.      }.
a7e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a7f0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e   }..    /* If an
a800: 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74  y row exist in t
a810: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72  he result set, r
a820: 65 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20  ecord that fact 
a830: 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a  and abort..    *
a840: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  /.    case SRT_E
a850: 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73  xists: {.      s
a860: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a870: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
a880: 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  1, iParm);.     
a890: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
a8a0: 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e  ause will termin
a8b0: 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72  ate the loop for
a8c0: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
a8d0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
a8e0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
a8f0: 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61  calar select tha
a900: 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
a910: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
a920: 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68  .    ** store th
a930: 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  e results in the
a940: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d   appropriate mem
a950: 6f 72 79 20 63 65 6c 6c 20 6f 72 20 61 72 72 61  ory cell or arra
a960: 79 20 6f 66 20 0a 20 20 20 20 2a 2a 20 6d 65 6d  y of .    ** mem
a970: 6f 72 79 20 63 65 6c 6c 73 20 61 6e 64 20 62 72  ory cells and br
a980: 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 73  eak out of the s
a990: 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
a9a0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
a9b0: 6d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  m: {.      if( p
a9c0: 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
a9d0: 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43  assert( nResultC
a9e0: 6f 6c 3c 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74  ol<=pDest->nSdst
a9f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68   );.        push
aa00: 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 20 20  OntoSorter(.    
aa10: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
aa20: 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73  pSort, p, regRes
aa30: 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52  ult, regOrig, nR
aa40: 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72 65 66 69  esultCol, nPrefi
aa50: 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xReg);.      }el
aa60: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
aa70: 72 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d  rt( nResultCol==
aa80: 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 29 3b 0a  pDest->nSdst );.
aa90: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
aaa0: 72 65 67 52 65 73 75 6c 74 3d 3d 69 50 61 72 6d  regResult==iParm
aab0: 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   );.        /* T
aac0: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
aad0: 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66  will jump out of
aae0: 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
aaf0: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
ab00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
ab10: 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
ab20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
ab30: 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 63 61  QUERY */..    ca
ab40: 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  se SRT_Coroutine
ab50: 3a 20 20 20 20 20 20 20 2f 2a 20 53 65 6e 64 20  :       /* Send 
ab60: 64 61 74 61 20 74 6f 20 61 20 63 6f 2d 72 6f 75  data to a co-rou
ab70: 74 69 6e 65 20 2a 2f 0a 20 20 20 20 63 61 73 65  tine */.    case
ab80: 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b 20 20   SRT_Output: {  
ab90: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
aba0: 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  the results */. 
abb0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
abc0: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
abd0: 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ine );.      tes
abe0: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
abf0: 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20  T_Output );.    
ac00: 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20    if( pSort ){. 
ac10: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
ac20: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 53  orter(pParse, pS
ac30: 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c  ort, p, regResul
ac40: 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52 65 73  t, regOrig, nRes
ac50: 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20  ultCol,.        
ac60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
ac70: 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20  PrefixReg);.    
ac80: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73    }else if( eDes
ac90: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
aca0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
acb0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
acc0: 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74   OP_Yield, pDest
acd0: 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  ->iSDParm);.    
ace0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
acf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ad00: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
ad10: 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  ow, regResult, n
ad20: 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20  ResultCol);.    
ad30: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
ad40: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
ad50: 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  ge(pParse, regRe
ad60: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
ad70: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
ad80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
ad90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ada0: 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20 57 72  IT_CTE.    /* Wr
adb0: 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ite the results 
adc0: 69 6e 74 6f 20 61 20 70 72 69 6f 72 69 74 79 20  into a priority 
add0: 71 75 65 75 65 20 74 68 61 74 20 69 73 20 6f 72  queue that is or
ade0: 64 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  der according to
adf0: 0a 20 20 20 20 2a 2a 20 70 44 65 73 74 2d 3e 70  .    ** pDest->p
ae00: 4f 72 64 65 72 42 79 20 28 69 6e 20 70 53 4f 29  OrderBy (in pSO)
ae10: 2e 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  .  pDest->iSDPar
ae20: 6d 20 28 69 6e 20 69 50 61 72 6d 29 20 69 73 20  m (in iParm) is 
ae30: 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20 61  the cursor for a
ae40: 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 77  n.    ** index w
ae50: 69 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72 2b 32  ith pSO->nExpr+2
ae60: 20 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69 6c 64   columns.  Build
ae70: 20 61 20 6b 65 79 20 75 73 69 6e 67 20 70 53 4f   a key using pSO
ae80: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 0a 20   for the first. 
ae90: 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78 70 72     ** pSO->nExpr
aea0: 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6d   columns, then m
aeb0: 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b 65 79  ake sure all key
aec0: 73 20 61 72 65 20 75 6e 69 71 75 65 20 62 79 20  s are unique by 
aed0: 61 64 64 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20  adding a.    ** 
aee0: 66 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65 6e 63  final OP_Sequenc
aef0: 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 6c  e column.  The l
af00: 61 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68  ast column is th
af10: 65 20 72 65 63 6f 72 64 20 61 73 20 61 20 62 6c  e record as a bl
af20: 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ob..    */.    c
af30: 61 73 65 20 53 52 54 5f 44 69 73 74 51 75 65 75  ase SRT_DistQueu
af40: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
af50: 51 75 65 75 65 3a 20 7b 0a 20 20 20 20 20 20 69  Queue: {.      i
af60: 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20 69  nt nKey;.      i
af70: 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 20  nt r1, r2, r3;. 
af80: 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 65 73       int addrTes
af90: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78 70  t = 0;.      Exp
afa0: 72 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20 20 20  rList *pSO;.    
afb0: 20 20 70 53 4f 20 3d 20 70 44 65 73 74 2d 3e 70    pSO = pDest->p
afc0: 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 61  OrderBy;.      a
afd0: 73 73 65 72 74 28 20 70 53 4f 20 29 3b 0a 20 20  ssert( pSO );.  
afe0: 20 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f 2d 3e      nKey = pSO->
aff0: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 31 20  nExpr;.      r1 
b000: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
b010: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
b020: 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47     r2 = sqlite3G
b030: 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
b040: 73 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20  se, nKey+2);.   
b050: 20 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65 79 2b     r3 = r2+nKey+
b060: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  1;.      if( eDe
b070: 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75  st==SRT_DistQueu
b080: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
b090: 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  If the destinati
b0a0: 6f 6e 20 69 73 20 44 69 73 74 51 75 65 75 65 2c  on is DistQueue,
b0b0: 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50   then cursor (iP
b0c0: 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20  arm+1) is open. 
b0d0: 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 20 73         ** on a s
b0e0: 65 63 6f 6e 64 20 65 70 68 65 6d 65 72 61 6c 20  econd ephemeral 
b0f0: 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73  index that holds
b100: 20 61 6c 6c 20 76 61 6c 75 65 73 20 65 76 65 72   all values ever
b110: 79 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20 20  y previously.   
b120: 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74 6f       ** added to
b130: 20 74 68 65 20 71 75 65 75 65 2e 20 2a 2f 0a 20   the queue. */. 
b140: 20 20 20 20 20 20 20 61 64 64 72 54 65 73 74 20         addrTest 
b150: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
b160: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
b170: 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30 2c 20  nd, iParm+1, 0, 
b180: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1a0: 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75           regResu
b1b0: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  lt, nResultCol);
b1c0: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
b1d0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
b1e0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
b1f0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
b200: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
b210: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
b220: 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 69 66  l, r3);.      if
b230: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
b240: 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20  tQueue ){.      
b250: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b260: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
b270: 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 33  ert, iParm+1, r3
b280: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
b290: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
b2a0: 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  , OPFLAG_USESEEK
b2b0: 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20 20 7d  RESULT);.      }
b2c0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
b2d0: 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20 20  i<nKey; i++){.  
b2e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b2f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
b300: 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  opy,.           
b310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
b320: 65 67 52 65 73 75 6c 74 20 2b 20 70 53 4f 2d 3e  egResult + pSO->
b330: 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  a[i].u.x.iOrderB
b340: 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20 20 20  yCol - 1,.      
b350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b360: 20 20 20 20 72 32 2b 69 29 3b 0a 20 20 20 20 20      r2+i);.     
b370: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
b380: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b390: 5f 53 65 71 75 65 6e 63 65 2c 20 69 50 61 72 6d  _Sequence, iParm
b3a0: 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20 20 20  , r2+nKey);.    
b3b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b3c0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
b3d0: 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79 2b 32  cord, r2, nKey+2
b3e0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
b3f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
b400: 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  t(v, OP_IdxInser
b410: 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 32  t, iParm, r1, r2
b420: 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20  , nKey+2);.     
b430: 20 69 66 28 20 61 64 64 72 54 65 73 74 20 29 20   if( addrTest ) 
b440: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
b450: 65 72 65 28 76 2c 20 61 64 64 72 54 65 73 74 29  ere(v, addrTest)
b460: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
b470: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
b480: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
b490: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
b4a0: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
b4b0: 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20   r2, nKey+2);.  
b4c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b4d0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
b4e0: 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 0a  E_OMIT_CTE */...
b4f0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
b500: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
b510: 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72  R).    /* Discar
b520: 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20  d the results.  
b530: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
b540: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
b550: 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a  ts inside.    **
b560: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54   the body of a T
b570: 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75 72  RIGGER.  The pur
b580: 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c  pose of such sel
b590: 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a  ects is to call.
b5a0: 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69      ** user-defi
b5b0: 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  ned functions th
b5c0: 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66 66  at have side eff
b5d0: 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74  ects.  We do not
b5e0: 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f   care.    ** abo
b5f0: 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65  ut the actual re
b600: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
b610: 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ect..    */.    
b620: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
b630: 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d   assert( eDest==
b640: 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20  SRT_Discard );. 
b650: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b660: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  }.#endif.  }..  
b670: 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65  /* Jump to the e
b680: 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  nd of the loop i
b690: 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72  f the LIMIT is r
b6a0: 65 61 63 68 65 64 2e 20 20 45 78 63 65 70 74 2c  eached.  Except,
b6b0: 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65 20 69   if.  ** there i
b6c0: 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e 20 77  s a sorter, in w
b6d0: 68 69 63 68 20 63 61 73 65 20 74 68 65 20 73 6f  hich case the so
b6e0: 72 74 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  rter has already
b6f0: 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20 74 68   limited.  ** th
b700: 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75 73 2e  e output for us.
b710: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 6f 72  .  */.  if( pSor
b720: 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69 6d 69  t==0 && p->iLimi
b730: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
b740: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b750: 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70  _DecrJumpZero, p
b760: 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  ->iLimit, iBreak
b770: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
b780: 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  v);.  }.}../*.**
b790: 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49   Allocate a KeyI
b7a0: 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66 66 69  nfo object suffi
b7b0: 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e 64  cient for an ind
b7c0: 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f 6c 75  ex of N key colu
b7d0: 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65 78 74  mns and.** X ext
b7e0: 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b  ra columns..*/.K
b7f0: 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b  eyInfo *sqlite3K
b800: 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71 6c 69  eyInfoAlloc(sqli
b810: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 2c 20  te3 *db, int N, 
b820: 69 6e 74 20 58 29 7b 0a 20 20 69 6e 74 20 6e 45  int X){.  int nE
b830: 78 74 72 61 20 3d 20 28 4e 2b 58 29 2a 28 73 69  xtra = (N+X)*(si
b840: 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31  zeof(CollSeq*)+1
b850: 29 20 2d 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  ) - sizeof(CollS
b860: 65 71 2a 29 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  eq*);.  KeyInfo 
b870: 2a 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  *p = sqlite3DbMa
b880: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
b890: 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20  zeof(KeyInfo) + 
b8a0: 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20 70  nExtra);.  if( p
b8b0: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74   ){.    p->aSort
b8c0: 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 2d  Order = (u8*)&p-
b8d0: 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20 20  >aColl[N+X];.   
b8e0: 20 70 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 3d 20   p->nKeyField = 
b8f0: 28 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e 6e  (u16)N;.    p->n
b900: 41 6c 6c 46 69 65 6c 64 20 3d 20 28 75 31 36 29  AllField = (u16)
b910: 28 4e 2b 58 29 3b 0a 20 20 20 20 70 2d 3e 65 6e  (N+X);.    p->en
b920: 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20  c = ENC(db);.   
b930: 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20   p->db = db;.   
b940: 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20   p->nRef = 1;.  
b950: 20 20 6d 65 6d 73 65 74 28 26 70 5b 31 5d 2c 20    memset(&p[1], 
b960: 30 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20 7d 65  0, nExtra);.  }e
b970: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
b980: 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20  OomFault(db);.  
b990: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
b9a0: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
b9b0: 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  e a KeyInfo obje
b9c0: 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  ct.*/.void sqlit
b9d0: 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 4b  e3KeyInfoUnref(K
b9e0: 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66  eyInfo *p){.  if
b9f0: 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ( p ){.    asser
ba00: 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  t( p->nRef>0 );.
ba10: 20 20 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a 20      p->nRef--;. 
ba20: 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d     if( p->nRef==
ba30: 30 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  0 ) sqlite3DbFre
ba40: 65 4e 4e 28 70 2d 3e 64 62 2c 20 70 29 3b 0a 20  eNN(p->db, p);. 
ba50: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
ba60: 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 20 74   a new pointer t
ba70: 6f 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  o a KeyInfo obje
ba80: 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73  ct.*/.KeyInfo *s
ba90: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66  qlite3KeyInfoRef
baa0: 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20  (KeyInfo *p){.  
bab0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73  if( p ){.    ass
bac0: 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29  ert( p->nRef>0 )
bad0: 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b  ;.    p->nRef++;
bae0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
baf0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
bb00: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65  E_DEBUG./*.** Re
bb10: 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 20 4b  turn TRUE if a K
bb20: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 61  eyInfo object ca
bb30: 6e 20 62 65 20 63 68 61 6e 67 65 2e 20 20 54 68  n be change.  Th
bb40: 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  e KeyInfo object
bb50: 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  .** can only be 
bb60: 63 68 61 6e 67 65 64 20 69 66 20 74 68 69 73 20  changed if this 
bb70: 69 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65  is just a single
bb80: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
bb90: 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  e object..**.** 
bba0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
bbb0: 75 73 65 64 20 6f 6e 6c 79 20 69 6e 73 69 64 65  used only inside
bbc0: 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61   of assert() sta
bbd0: 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20  tements..*/.int 
bbe0: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
bbf0: 57 72 69 74 65 61 62 6c 65 28 4b 65 79 49 6e 66  Writeable(KeyInf
bc00: 6f 20 2a 70 29 7b 20 72 65 74 75 72 6e 20 70 2d  o *p){ return p-
bc10: 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23 65 6e 64  >nRef==1; }.#end
bc20: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
bc30: 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  UG */../*.** Giv
bc40: 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  en an expression
bc50: 20 6c 69 73 74 2c 20 67 65 6e 65 72 61 74 65 20   list, generate 
bc60: 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
bc70: 75 72 65 20 74 68 61 74 20 72 65 63 6f 72 64 73  ure that records
bc80: 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  .** the collatin
bc90: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65  g sequence for e
bca0: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ach expression i
bcb0: 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  n that expressio
bcc0: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  n list..**.** If
bcd0: 20 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73   the ExprList is
bce0: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20   an ORDER BY or 
bcf0: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
bd00: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 69  then the resulti
bd10: 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74  ng.** KeyInfo st
bd20: 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f  ructure is appro
bd30: 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69  priate for initi
bd40: 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61  alizing a virtua
bd50: 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d  l index to.** im
bd60: 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 63 6c 61  plement that cla
bd70: 75 73 65 2e 20 20 49 66 20 74 68 65 20 45 78 70  use.  If the Exp
bd80: 72 4c 69 73 74 20 69 73 20 74 68 65 20 72 65 73  rList is the res
bd90: 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c  ult set of a SEL
bda0: 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  ECT.** then the 
bdb0: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
bdc0: 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  e is appropriate
bdd0: 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e   for initializin
bde0: 67 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69  g a virtual.** i
bdf0: 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  ndex to implemen
be00: 74 20 61 20 44 49 53 54 49 4e 43 54 20 74 65 73  t a DISTINCT tes
be10: 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  t..**.** Space t
be20: 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e  o hold the KeyIn
be30: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
be40: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
be50: 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c 69  lloc.  The calli
be60: 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  ng.** function i
be70: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
be80: 72 20 73 65 65 69 6e 67 20 74 68 61 74 20 74 68  r seeing that th
be90: 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20  is structure is 
bea0: 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72  eventually.** fr
beb0: 65 65 64 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20  eed..*/.KeyInfo 
bec0: 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46  *sqlite3KeyInfoF
bed0: 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50  romExprList(.  P
bee0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
bef0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
bf00: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
bf10: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
bf20: 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65 79   /* Form the Key
bf30: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f 6d  Info object from
bf40: 20 74 68 69 73 20 45 78 70 72 4c 69 73 74 20 2a   this ExprList *
bf50: 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20  /.  int iStart, 
bf60: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69           /* Begi
bf70: 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f 6c 75  n with this colu
bf80: 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a 20  mn of pList */. 
bf90: 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20 20 20   int nExtra     
bfa0: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69        /* Add thi
bfb0: 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63 6f 6c  s many extra col
bfc0: 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e 64 20  umns to the end 
bfd0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 78 70  */.){.  int nExp
bfe0: 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49  r;.  KeyInfo *pI
bff0: 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78  nfo;.  struct Ex
c000: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
c010: 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  em;.  sqlite3 *d
c020: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
c030: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70    int i;..  nExp
c040: 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  r = pList->nExpr
c050: 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69  ;.  pInfo = sqli
c060: 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
c070: 64 62 2c 20 6e 45 78 70 72 2d 69 53 74 61 72 74  db, nExpr-iStart
c080: 2c 20 6e 45 78 74 72 61 2b 31 29 3b 0a 20 20 69  , nExtra+1);.  i
c090: 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20  f( pInfo ){.    
c0a0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
c0b0: 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
c0c0: 65 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20  e(pInfo) );.    
c0d0: 66 6f 72 28 69 3d 69 53 74 61 72 74 2c 20 70 49  for(i=iStart, pI
c0e0: 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2b 69 53 74  tem=pList->a+iSt
c0f0: 61 72 74 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b  art; i<nExpr; i+
c100: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
c110: 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b     pInfo->aColl[
c120: 69 2d 69 53 74 61 72 74 5d 20 3d 20 73 71 6c 69  i-iStart] = sqli
c130: 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71  te3ExprNNCollSeq
c140: 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
c150: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 70 49  pExpr);.      pI
c160: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
c170: 69 2d 69 53 74 61 72 74 5d 20 3d 20 70 49 74 65  i-iStart] = pIte
c180: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  m->sortOrder;.  
c190: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
c1a0: 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pInfo;.}../*.**
c1b0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e   Name of the con
c1c0: 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72  nection operator
c1d0: 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72  , used for error
c1e0: 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74   messages..*/.st
c1f0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
c200: 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e  *selectOpName(in
c210: 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a  t id){.  char *z
c220: 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20 29  ;.  switch( id )
c230: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c  {.    case TK_AL
c240: 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e  L:       z = "UN
c250: 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61  ION ALL";   brea
c260: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
c270: 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49  NTERSECT: z = "I
c280: 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72 65  NTERSECT";   bre
c290: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
c2a0: 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22  EXCEPT:    z = "
c2b0: 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62 72  EXCEPT";      br
c2c0: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
c2d0: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20  :           z = 
c2e0: 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62  "UNION";       b
c2f0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
c300: 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  rn z;.}..#ifndef
c310: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
c320: 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  LAIN./*.** Unles
c330: 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55  s an "EXPLAIN QU
c340: 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e  ERY PLAN" comman
c350: 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65  d is being proce
c360: 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ssed, this funct
c370: 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f  ion.** is a no-o
c380: 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  p. Otherwise, it
c390: 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72   adds a single r
c3a0: 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20  ow of output to 
c3b0: 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a  the EQP result,.
c3c0: 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70  ** where the cap
c3d0: 74 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66  tion is of the f
c3e0: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55 53  orm:.**.**   "US
c3f0: 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f  E TEMP B-TREE FO
c400: 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68 65  R xxx".**.** whe
c410: 72 65 20 78 78 78 20 69 73 20 6f 6e 65 20 6f 66  re xxx is one of
c420: 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22 4f 52   "DISTINCT", "OR
c430: 44 45 52 20 42 59 22 20 6f 72 20 22 47 52 4f 55  DER BY" or "GROU
c440: 50 20 42 59 22 2e 20 45 78 61 63 74 6c 79 20 77  P BY". Exactly w
c450: 68 69 63 68 0a 2a 2a 20 69 73 20 64 65 74 65 72  hich.** is deter
c460: 6d 69 6e 65 64 20 62 79 20 74 68 65 20 7a 55 73  mined by the zUs
c470: 61 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  age argument..*/
c480: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
c490: 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 50 61  lainTempTable(Pa
c4a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
c4b0: 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67 65 29  st char *zUsage)
c4c0: 7b 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79  {.  ExplainQuery
c4d0: 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c  Plan((pParse, 0,
c4e0: 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45   "USE TEMP B-TRE
c4f0: 45 20 46 4f 52 20 25 73 22 2c 20 7a 55 73 61 67  E FOR %s", zUsag
c500: 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73  e));.}../*.** As
c510: 73 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  sign expression 
c520: 62 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41  b to lvalue a. A
c530: 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20   second, no-op, 
c540: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20  version of this 
c550: 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76  macro.** is prov
c560: 69 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45  ided when SQLITE
c570: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73  _OMIT_EXPLAIN is
c580: 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20 61   defined. This a
c590: 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a 2a  llows the code.*
c5a0: 2a 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65  * in sqlite3Sele
c5b0: 63 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20 76  ct() to assign v
c5c0: 61 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74 75  alues to structu
c5d0: 72 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62  re member variab
c5e0: 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79  les that.** only
c5f0: 20 65 78 69 73 74 20 69 66 20 53 51 4c 49 54 45   exist if SQLITE
c600: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73  _OMIT_EXPLAIN is
c610: 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69 74   not defined wit
c620: 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74  hout polluting t
c630: 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 20  he.** code with 
c640: 23 69 66 6e 64 65 66 20 64 69 72 65 63 74 69 76  #ifndef directiv
c650: 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20  es..*/.# define 
c660: 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
c670: 72 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23  r(a, b) a = b..#
c680: 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65  else./* No-op ve
c690: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78  rsions of the ex
c6a0: 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74  plainXXX() funct
c6b0: 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e  ions and macros.
c6c0: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70   */.# define exp
c6d0: 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c  lainTempTable(y,
c6e0: 7a 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  z).# define expl
c6f0: 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c  ainSetInteger(y,
c700: 7a 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  z).#endif.../*.*
c710: 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  * If the inner l
c720: 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74 65  oop was generate
c730: 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75  d using a non-nu
c740: 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67 75  ll pOrderBy argu
c750: 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  ment,.** then th
c760: 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20 70  e results were p
c770: 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65  laced in a sorte
c780: 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f  r.  After the lo
c790: 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64  op is terminated
c7a0: 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72  .** we need to r
c7b0: 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e  un the sorter an
c7c0: 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65 73  d output the res
c7d0: 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  ults.  The follo
c7e0: 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  wing.** routine 
c7f0: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
c800: 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20  de needed to do 
c810: 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  that..*/.static 
c820: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72  void generateSor
c830: 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a  tTail(.  Parse *
c840: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
c850: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
c860: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
c870: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
c880: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
c890: 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74    SortCtx *pSort
c8a0: 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69  ,   /* Informati
c8b0: 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20  on on the ORDER 
c8c0: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
c8d0: 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt nColumn,     
c8e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
c8f0: 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f  lumns of data */
c900: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
c910: 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68  Dest /* Write th
c920: 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73  e sorted results
c930: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 64   here */.){.  Vd
c940: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
c950: 70 56 64 62 65 3b 20 20 20 20 20 20 20 20 20 20  pVdbe;          
c960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
c970: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
c980: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ment */.  int ad
c990: 64 72 42 72 65 61 6b 20 3d 20 70 53 6f 72 74 2d  drBreak = pSort-
c9a0: 3e 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20 20  >labelDone;     
c9b0: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
c9c0: 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70  ere to exit loop
c9d0: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f   */.  int addrCo
c9e0: 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
c9f0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
ca00: 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  ;  /* Jump here 
ca10: 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20 2a  for next cycle *
ca20: 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20  /.  int addr;   
ca30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca40: 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 6f 75      /* Top of ou
ca50: 74 70 75 74 20 6c 6f 6f 70 2e 20 4a 75 6d 70 20  tput loop. Jump 
ca60: 66 6f 72 20 4e 65 78 74 2e 20 2a 2f 0a 20 20 69  for Next. */.  i
ca70: 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b  nt addrOnce = 0;
ca80: 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 45  .  int iTab;.  E
ca90: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
caa0: 79 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65  y = pSort->pOrde
cab0: 72 42 79 3b 0a 20 20 69 6e 74 20 65 44 65 73 74  rBy;.  int eDest
cac0: 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b   = pDest->eDest;
cad0: 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70  .  int iParm = p
cae0: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 0a 20  Dest->iSDParm;. 
caf0: 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20 69   int regRow;.  i
cb00: 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 20 20 69  nt regRowid;.  i
cb10: 6e 74 20 69 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e  nt iCol;.  int n
cb20: 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  Key;            
cb30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
cb40: 6d 62 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75  mber of key colu
cb50: 6d 6e 73 20 69 6e 20 73 6f 72 74 65 72 20 72 65  mns in sorter re
cb60: 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 69 53  cord */.  int iS
cb70: 6f 72 74 54 61 62 3b 20 20 20 20 20 20 20 20 20  ortTab;         
cb80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72            /* Sor
cb90: 74 65 72 20 63 75 72 73 6f 72 20 74 6f 20 72 65  ter cursor to re
cba0: 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ad from */.  int
cbb0: 20 69 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b 20   i;.  int bSeq; 
cbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbd0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
cbe0: 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 69   sorter record i
cbf0: 6e 63 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f 2e  ncludes seq. no.
cc00: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 4b 65   */.  int nRefKe
cc10: 79 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20  y = 0;.  struct 
cc20: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
cc30: 4f 75 74 45 78 20 3d 20 70 2d 3e 70 45 4c 69 73  OutEx = p->pELis
cc40: 74 2d 3e 61 3b 0a 0a 20 20 61 73 73 65 72 74 28  t->a;..  assert(
cc50: 20 61 64 64 72 42 72 65 61 6b 3c 30 20 29 3b 0a   addrBreak<0 );.
cc60: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62    if( pSort->lab
cc70: 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 73  elBkOut ){.    s
cc80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
cc90: 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53  (v, OP_Gosub, pS
cca0: 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  ort->regReturn, 
ccb0: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
ccc0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
ccd0: 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 42  dbeGoto(v, addrB
cce0: 72 65 61 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74  reak);.    sqlit
ccf0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
cd00: 65 6c 28 76 2c 20 70 53 6f 72 74 2d 3e 6c 61 62  el(v, pSort->lab
cd10: 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 7d 0a 0a 23  elBkOut);.  }..#
cd20: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
cd30: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
cd40: 45 4e 43 45 53 0a 20 20 2f 2a 20 4f 70 65 6e 20  ENCES.  /* Open 
cd50: 61 6e 79 20 63 75 72 73 6f 72 73 20 6e 65 65 64  any cursors need
cd60: 65 64 20 66 6f 72 20 73 6f 72 74 65 72 2d 72 65  ed for sorter-re
cd70: 66 65 72 65 6e 63 65 20 65 78 70 72 65 73 73 69  ference expressi
cd80: 6f 6e 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ons */.  for(i=0
cd90: 3b 20 69 3c 70 53 6f 72 74 2d 3e 6e 44 65 66 65  ; i<pSort->nDefe
cda0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 61 62  r; i++){.    Tab
cdb0: 6c 65 20 2a 70 54 61 62 20 3d 20 70 53 6f 72 74  le *pTab = pSort
cdc0: 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 70 54 61 62  ->aDefer[i].pTab
cdd0: 3b 0a 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20  ;.    int iDb = 
cde0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
cdf0: 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
ce00: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
ce10: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e  .    sqlite3Open
ce20: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 53  Table(pParse, pS
ce30: 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 69  ort->aDefer[i].i
ce40: 43 73 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  Csr, iDb, pTab, 
ce50: 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20  OP_OpenRead);.  
ce60: 20 20 6e 52 65 66 4b 65 79 20 3d 20 4d 41 58 28    nRefKey = MAX(
ce70: 6e 52 65 66 4b 65 79 2c 20 70 53 6f 72 74 2d 3e  nRefKey, pSort->
ce80: 61 44 65 66 65 72 5b 69 5d 2e 6e 4b 65 79 29 3b  aDefer[i].nKey);
ce90: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
cea0: 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43  Tab = pSort->iEC
ceb0: 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 65 44 65  ursor;.  if( eDe
cec0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c  st==SRT_Output |
ced0: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  | eDest==SRT_Cor
cee0: 6f 75 74 69 6e 65 20 7c 7c 20 65 44 65 73 74 3d  outine || eDest=
cef0: 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20  =SRT_Mem ){.    
cf00: 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20  regRowid = 0;.  
cf10: 20 20 72 65 67 52 6f 77 20 3d 20 70 44 65 73 74    regRow = pDest
cf20: 2d 3e 69 53 64 73 74 3b 0a 20 20 7d 65 6c 73 65  ->iSdst;.  }else
cf30: 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d  {.    regRowid =
cf40: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
cf50: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
cf60: 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  regRow = sqlite3
cf70: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
cf80: 72 73 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  rse, nColumn);. 
cf90: 20 7d 0a 20 20 6e 4b 65 79 20 3d 20 70 4f 72 64   }.  nKey = pOrd
cfa0: 65 72 42 79 2d 3e 6e 45 78 70 72 20 2d 20 70 53  erBy->nExpr - pS
cfb0: 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 69  ort->nOBSat;.  i
cfc0: 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c  f( pSort->sortFl
cfd0: 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55  ags & SORTFLAG_U
cfe0: 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20  seSorter ){.    
cff0: 69 6e 74 20 72 65 67 53 6f 72 74 4f 75 74 20 3d  int regSortOut =
d000: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
d010: 0a 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20  .    iSortTab = 
d020: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
d030: 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c      if( pSort->l
d040: 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20  abelBkOut ){.   
d050: 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71     addrOnce = sq
d060: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
d070: 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62  v, OP_Once); Vdb
d080: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
d090: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
d0a0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d0b0: 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 53 6f 72  OpenPseudo, iSor
d0c0: 74 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74  tTab, regSortOut
d0d0: 2c 20 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 2b  , .        nKey+
d0e0: 31 2b 6e 43 6f 6c 75 6d 6e 2b 6e 52 65 66 4b 65  1+nColumn+nRefKe
d0f0: 79 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72  y);.    if( addr
d100: 4f 6e 63 65 20 29 20 73 71 6c 69 74 65 33 56 64  Once ) sqlite3Vd
d110: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
d120: 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 61 64 64  drOnce);.    add
d130: 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  r = 1 + sqlite3V
d140: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d150: 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 54 61 62  SorterSort, iTab
d160: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
d170: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
d180: 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65  );.    codeOffse
d190: 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
d1a0: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a   addrContinue);.
d1b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d1c0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp3(v, OP_Sort
d1d0: 65 72 44 61 74 61 2c 20 69 54 61 62 2c 20 72 65  erData, iTab, re
d1e0: 67 53 6f 72 74 4f 75 74 2c 20 69 53 6f 72 74 54  gSortOut, iSortT
d1f0: 61 62 29 3b 0a 20 20 20 20 62 53 65 71 20 3d 20  ab);.    bSeq = 
d200: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
d210: 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74  addr = 1 + sqlit
d220: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d230: 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20 61  OP_Sort, iTab, a
d240: 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43  ddrBreak); VdbeC
d250: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
d260: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d  codeOffset(v, p-
d270: 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f  >iOffset, addrCo
d280: 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 69 53 6f  ntinue);.    iSo
d290: 72 74 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20  rtTab = iTab;.  
d2a0: 20 20 62 53 65 71 20 3d 20 31 3b 0a 20 20 7d 0a    bSeq = 1;.  }.
d2b0: 20 20 66 6f 72 28 69 3d 30 2c 20 69 43 6f 6c 3d    for(i=0, iCol=
d2c0: 6e 4b 65 79 2b 62 53 65 71 2d 31 3b 20 69 3c 6e  nKey+bSeq-1; i<n
d2d0: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 23 69  Column; i++){.#i
d2e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
d2f0: 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45  LE_SORTER_REFERE
d300: 4e 43 45 53 0a 20 20 20 20 69 66 28 20 61 4f 75  NCES.    if( aOu
d310: 74 45 78 5b 69 5d 2e 62 53 6f 72 74 65 72 52 65  tEx[i].bSorterRe
d320: 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 65  f ) continue;.#e
d330: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 61 4f 75  ndif.    if( aOu
d340: 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  tEx[i].u.x.iOrde
d350: 72 42 79 43 6f 6c 3d 3d 30 20 29 20 69 43 6f 6c  rByCol==0 ) iCol
d360: 2b 2b 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  ++;.  }.#ifdef S
d370: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52  QLITE_ENABLE_SOR
d380: 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20  TER_REFERENCES. 
d390: 20 69 66 28 20 70 53 6f 72 74 2d 3e 6e 44 65 66   if( pSort->nDef
d3a0: 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4b  er ){.    int iK
d3b0: 65 79 20 3d 20 69 43 6f 6c 2b 31 3b 0a 20 20 20  ey = iCol+1;.   
d3c0: 20 69 6e 74 20 72 65 67 4b 65 79 20 3d 20 73 71   int regKey = sq
d3d0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
d3e0: 65 28 70 50 61 72 73 65 2c 20 6e 52 65 66 4b 65  e(pParse, nRefKe
d3f0: 79 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30  y);..    for(i=0
d400: 3b 20 69 3c 70 53 6f 72 74 2d 3e 6e 44 65 66 65  ; i<pSort->nDefe
d410: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; i++){.      i
d420: 6e 74 20 69 43 73 72 20 3d 20 70 53 6f 72 74 2d  nt iCsr = pSort-
d430: 3e 61 44 65 66 65 72 5b 69 5d 2e 69 43 73 72 3b  >aDefer[i].iCsr;
d440: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
d450: 61 62 20 3d 20 70 53 6f 72 74 2d 3e 61 44 65 66  ab = pSort->aDef
d460: 65 72 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20  er[i].pTab;.    
d470: 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 53 6f    int nKey = pSo
d480: 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 6e 4b  rt->aDefer[i].nK
d490: 65 79 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  ey;..      sqlit
d4a0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
d4b0: 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 73 72  OP_NullRow, iCsr
d4c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 48 61 73  );.      if( Has
d4d0: 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
d4e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d4f0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
d500: 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62 2c  olumn, iSortTab,
d510: 20 69 4b 65 79 2b 2b 2c 20 72 65 67 4b 65 79 29   iKey++, regKey)
d520: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
d530: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
d540: 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 69 43 73  P_SeekRowid, iCs
d550: 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  r, .            
d560: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
d570: 6e 74 41 64 64 72 28 76 29 2b 31 2c 20 72 65 67  ntAddr(v)+1, reg
d580: 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Key);.      }els
d590: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b  e{.        int k
d5a0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a  ;.        int iJ
d5b0: 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  mp;.        asse
d5c0: 72 74 28 20 73 71 6c 69 74 65 33 50 72 69 6d 61  rt( sqlite3Prima
d5d0: 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
d5e0: 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 6e 4b 65 79 20  ->nKeyCol==nKey 
d5f0: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b  );.        for(k
d600: 3d 30 3b 20 6b 3c 6e 4b 65 79 3b 20 6b 2b 2b 29  =0; k<nKey; k++)
d610: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
d620: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
d630: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72   OP_Column, iSor
d640: 74 54 61 62 2c 20 69 4b 65 79 2b 2b 2c 20 72 65  tTab, iKey++, re
d650: 67 4b 65 79 2b 6b 29 3b 0a 20 20 20 20 20 20 20  gKey+k);.       
d660: 20 7d 0a 20 20 20 20 20 20 20 20 69 4a 6d 70 20   }.        iJmp 
d670: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
d680: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
d690: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d6a0: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
d6b0: 53 65 65 6b 47 45 2c 20 69 43 73 72 2c 20 69 4a  SeekGE, iCsr, iJ
d6c0: 6d 70 2b 32 2c 20 72 65 67 4b 65 79 2c 20 6e 4b  mp+2, regKey, nK
d6d0: 65 79 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ey);.        sql
d6e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
d6f0: 74 28 76 2c 20 4f 50 5f 49 64 78 4c 45 2c 20 69  t(v, OP_IdxLE, i
d700: 43 73 72 2c 20 69 4a 6d 70 2b 33 2c 20 72 65 67  Csr, iJmp+3, reg
d710: 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20  Key, nKey);.    
d720: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d730: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp1(v, OP_Null
d740: 52 6f 77 2c 20 69 43 73 72 29 3b 0a 20 20 20 20  Row, iCsr);.    
d750: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
d760: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
d770: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
d780: 67 4b 65 79 2c 20 6e 52 65 66 4b 65 79 29 3b 0a  gKey, nRefKey);.
d790: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72    }.#endif.  for
d7a0: 28 69 3d 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 69 3e  (i=nColumn-1; i>
d7b0: 3d 30 3b 20 69 2d 2d 29 7b 0a 23 69 66 64 65 66  =0; i--){.#ifdef
d7c0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
d7d0: 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53  ORTER_REFERENCES
d7e0: 0a 20 20 20 20 69 66 28 20 61 4f 75 74 45 78 5b  .    if( aOutEx[
d7f0: 69 5d 2e 62 53 6f 72 74 65 72 52 65 66 20 29 7b  i].bSorterRef ){
d800: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
d810: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61  prCode(pParse, a
d820: 4f 75 74 45 78 5b 69 5d 2e 70 45 78 70 72 2c 20  OutEx[i].pExpr, 
d830: 72 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20 7d  regRow+i);.    }
d840: 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
d850: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 52 65 61  {.      int iRea
d860: 64 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4f 75  d;.      if( aOu
d870: 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  tEx[i].u.x.iOrde
d880: 72 42 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  rByCol ){.      
d890: 20 20 69 52 65 61 64 20 3d 20 61 4f 75 74 45 78    iRead = aOutEx
d8a0: 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
d8b0: 43 6f 6c 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c  Col-1;.      }el
d8c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 52 65 61  se{.        iRea
d8d0: 64 20 3d 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20  d = iCol--;.    
d8e0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
d8f0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
d900: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54  P_Column, iSortT
d910: 61 62 2c 20 69 52 65 61 64 2c 20 72 65 67 52 6f  ab, iRead, regRo
d920: 77 2b 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65  w+i);.      Vdbe
d930: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
d940: 2c 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d  , aOutEx[i].zNam
d950: 65 3f 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d  e?aOutEx[i].zNam
d960: 65 20 3a 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 53  e : aOutEx[i].zS
d970: 70 61 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pan));.    }.  }
d980: 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74  .  switch( eDest
d990: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54   ){.    case SRT
d9a0: 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65  _Table:.    case
d9b0: 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b   SRT_EphemTab: {
d9c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d9d0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
d9e0: 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20  ewRowid, iParm, 
d9f0: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
da00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
da10: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
da20: 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20   iParm, regRow, 
da30: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
da40: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
da50: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
da60: 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72  PPEND);.      br
da70: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
da80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
da90: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
daa0: 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
dab0: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
dac0: 6e 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  n==sqlite3Strlen
dad0: 33 30 28 70 44 65 73 74 2d 3e 7a 41 66 66 53 64  30(pDest->zAffSd
dae0: 73 74 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  st) );.      sql
daf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
db00: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
db10: 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e   regRow, nColumn
db20: 2c 20 72 65 67 52 6f 77 69 64 2c 0a 20 20 20 20  , regRowid,.    
db30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db40: 20 20 20 20 70 44 65 73 74 2d 3e 7a 41 66 66 53      pDest->zAffS
db50: 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  dst, nColumn);. 
db60: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
db70: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
db80: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
db90: 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ow, nColumn);.  
dba0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
dbb0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
dbc0: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
dbd0: 20 72 65 67 52 6f 77 69 64 2c 20 72 65 67 52 6f   regRowid, regRo
dbe0: 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  w, nColumn);.   
dbf0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
dc00: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
dc10: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
dc20: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
dc30: 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  ll terminate the
dc40: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
dc50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
dc60: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
dc70: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
dc80: 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52  ssert( eDest==SR
dc90: 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73  T_Output || eDes
dca0: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
dcb0: 20 29 3b 20 0a 20 20 20 20 20 20 74 65 73 74 63   ); .      testc
dcc0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
dcd0: 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
dce0: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
dcf0: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
dd00: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  ;.      if( eDes
dd10: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
dd20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
dd30: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
dd40: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 44 65 73  _ResultRow, pDes
dd50: 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d  t->iSdst, nColum
dd60: 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  n);.        sqli
dd70: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
dd80: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
dd90: 65 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c  e, pDest->iSdst,
dda0: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
ddb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ddc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ddd0: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
dde0: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
ddf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
de00: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
de10: 20 69 66 28 20 72 65 67 52 6f 77 69 64 20 29 7b   if( regRowid ){
de20: 0a 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d  .    if( eDest==
de30: 53 52 54 5f 53 65 74 20 29 7b 0a 20 20 20 20 20  SRT_Set ){.     
de40: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
de50: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
de60: 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e   regRow, nColumn
de70: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
de80: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
de90: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
dea0: 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20 7d  , regRow);.    }
deb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
dec0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
ded0: 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  e, regRowid);.  
dee0: 7d 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f  }.  /* The botto
def0: 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20  m of the loop.  
df00: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
df10: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
df20: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
df30: 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74   if( pSort->sort
df40: 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47  Flags & SORTFLAG
df50: 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20  _UseSorter ){.  
df60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
df70: 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
df80: 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Next, iTab, addr
df90: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
dfa0: 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  v);.  }else{.   
dfb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dfc0: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  p2(v, OP_Next, i
dfd0: 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62 65  Tab, addr); Vdbe
dfe0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
dff0: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 72 65  .  if( pSort->re
e000: 67 52 65 74 75 72 6e 20 29 20 73 71 6c 69 74 65  gReturn ) sqlite
e010: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
e020: 50 5f 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d  P_Return, pSort-
e030: 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 73  >regReturn);.  s
e040: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
e050: 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72  eLabel(v, addrBr
e060: 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  eak);.}../*.** R
e070: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
e080: 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74  to a string cont
e090: 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c  aining the 'decl
e0a0: 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66  aration type' of
e0b0: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
e0c0: 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73 74  on pExpr. The st
e0d0: 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61  ring may be trea
e0e0: 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62 79  ted as static by
e0f0: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
e100: 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74 6f 20 65  ** Also try to e
e110: 73 74 69 6d 61 74 65 20 74 68 65 20 73 69 7a 65  stimate the size
e120: 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   of the returned
e130: 20 76 61 6c 75 65 20 61 6e 64 20 72 65 74 75 72   value and retur
e140: 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74  n that.** result
e150: 20 69 6e 20 2a 70 45 73 74 57 69 64 74 68 2e 0a   in *pEstWidth..
e160: 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  **.** The declar
e170: 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68  ation type is th
e180: 65 20 65 78 61 63 74 20 64 61 74 61 74 79 70 65  e exact datatype
e190: 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72   definition extr
e1a0: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  acted from the.*
e1b0: 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54  * original CREAT
e1c0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
e1d0: 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  t if the express
e1e0: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  ion is a column.
e1f0: 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74   The.** declarat
e200: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52  ion type for a R
e210: 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e  OWID field is IN
e220: 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77  TEGER. Exactly w
e230: 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f  hen an expressio
e240: 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  n.** is consider
e250: 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20  ed a column can 
e260: 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68  be complex in th
e270: 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75  e presence of su
e280: 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a  bqueries. The.**
e290: 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72   result-set expr
e2a0: 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66  ession in all of
e2b0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53   the following S
e2c0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
e2d0: 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72   is .** consider
e2e0: 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74  ed a column by t
e2f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
e300: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c  .**   SELECT col
e310: 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20   FROM tbl;.**   
e320: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63  SELECT (SELECT c
e330: 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20  ol FROM tbl;.** 
e340: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
e350: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a   col FROM tbl);.
e360: 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63 20  **   SELECT abc 
e370: 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c  FROM (SELECT col
e380: 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c   AS abc FROM tbl
e390: 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65  );.** .** The de
e3a0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66  claration type f
e3b0: 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  or any expressio
e3c0: 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63  n other than a c
e3d0: 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a  olumn is NULL..*
e3e0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
e3f0: 65 20 68 61 73 20 65 69 74 68 65 72 20 33 20 6f  e has either 3 o
e400: 72 20 36 20 70 61 72 61 6d 65 74 65 72 73 20 64  r 6 parameters d
e410: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
e420: 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68  her or not.** th
e430: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
e440: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20  COLUMN_METADATA 
e450: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
e460: 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a  ion is used..*/.
e470: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
e480: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
e490: 44 41 54 41 0a 23 20 64 65 66 69 6e 65 20 63 6f  DATA.# define co
e4a0: 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44  lumnType(A,B,C,D
e4b0: 2c 45 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d  ,E) columnTypeIm
e4c0: 70 6c 28 41 2c 42 2c 43 2c 44 2c 45 29 0a 23 65  pl(A,B,C,D,E).#e
e4d0: 6c 73 65 20 2f 2a 20 69 66 20 21 64 65 66 69 6e  lse /* if !defin
e4e0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
e4f0: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
e500: 29 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 63 6f  ) */.# define co
e510: 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44  lumnType(A,B,C,D
e520: 2c 45 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d  ,E) columnTypeIm
e530: 70 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 0a 73  pl(A,B).#endif.s
e540: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
e550: 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c   *columnTypeImpl
e560: 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  (.  NameContext 
e570: 2a 70 4e 43 2c 20 0a 23 69 66 6e 64 65 66 20 53  *pNC, .#ifndef S
e580: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
e590: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 45  UMN_METADATA.  E
e5a0: 78 70 72 20 2a 70 45 78 70 72 0a 23 65 6c 73 65  xpr *pExpr.#else
e5b0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a  .  Expr *pExpr,.
e5c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
e5d0: 7a 4f 72 69 67 44 62 2c 0a 20 20 63 6f 6e 73 74  zOrigDb,.  const
e5e0: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 54 61   char **pzOrigTa
e5f0: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
e600: 2a 2a 70 7a 4f 72 69 67 43 6f 6c 0a 23 65 6e 64  **pzOrigCol.#end
e610: 69 66 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e  if.){.  char con
e620: 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20  st *zType = 0;. 
e630: 20 69 6e 74 20 6a 3b 0a 23 69 66 64 65 66 20 53   int j;.#ifdef S
e640: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
e650: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 63  UMN_METADATA.  c
e660: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
e670: 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  Db = 0;.  char c
e680: 6f 6e 73 74 20 2a 7a 4f 72 69 67 54 61 62 20 3d  onst *zOrigTab =
e690: 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
e6a0: 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a   *zOrigCol = 0;.
e6b0: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
e6c0: 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ( pExpr!=0 );.  
e6d0: 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72  assert( pNC->pSr
e6e0: 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73  cList!=0 );.  as
e6f0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
e700: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
e710: 3b 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  ;  /* This routi
e720: 6e 65 20 72 75 6e 65 73 20 62 65 66 6f 72 65 20  ne runes before 
e730: 61 67 67 72 65 67 61 74 65 73 0a 20 20 20 20 20  aggregates.     
e740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e760: 20 20 2a 2a 20 61 72 65 20 70 72 6f 63 65 73 73    ** are process
e770: 65 64 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20  ed */.  switch( 
e780: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
e790: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
e7a0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
e7b0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
e7c0: 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74  column. Locate t
e7d0: 68 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f 6c  he table the col
e7e0: 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20  umn is being.   
e7f0: 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20     ** extracted 
e800: 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74  from in NameCont
e810: 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54 68  ext.pSrcList. Th
e820: 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65 20  is table may be 
e830: 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61  real.      ** da
e840: 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20  tabase table or 
e850: 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20  a subquery..    
e860: 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65    */.      Table
e870: 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20   *pTab = 0;     
e880: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
e890: 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e  structure column
e8a0: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
e8b0: 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65  om */.      Sele
e8c0: 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20 20  ct *pS = 0;     
e8d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63          /* Selec
e8e0: 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  t the column is 
e8f0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a  extracted from *
e900: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  /.      int iCol
e910: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
e920: 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20  n;  /* Index of 
e930: 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a  column in pTab *
e940: 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  /.      while( p
e950: 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20  NC && !pTab ){. 
e960: 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a         SrcList *
e970: 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pTabList = pNC->
e980: 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20  pSrcList;.      
e990: 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62    for(j=0;j<pTab
e9a0: 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54  List->nSrc && pT
e9b0: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75  abList->a[j].iCu
e9c0: 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61  rsor!=pExpr->iTa
e9d0: 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20  ble;j++);.      
e9e0: 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74    if( j<pTabList
e9f0: 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20  ->nSrc ){.      
ea00: 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c      pTab = pTabL
ea10: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a  ist->a[j].pTab;.
ea20: 20 20 20 20 20 20 20 20 20 20 70 53 20 3d 20 70            pS = p
ea30: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53  TabList->a[j].pS
ea40: 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d  elect;.        }
ea50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ea60: 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74  pNC = pNC->pNext
ea70: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ea80: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
ea90: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
eaa0: 20 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65    /* At one time
eab0: 2c 20 63 6f 64 65 20 73 75 63 68 20 61 73 20 22  , code such as "
eac0: 53 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77 69  SELECT new.x" wi
ead0: 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 20 77  thin a trigger w
eae0: 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ould.        ** 
eaf0: 63 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64 69  cause this condi
eb00: 74 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69  tion to run.  Si
eb10: 6e 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61 76  nce then, we hav
eb20: 65 20 72 65 73 74 72 75 63 74 75 72 65 64 20 68  e restructured h
eb30: 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  ow.        ** tr
eb40: 69 67 67 65 72 20 63 6f 64 65 20 69 73 20 67 65  igger code is ge
eb50: 6e 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20 74  nerated and so t
eb60: 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  his condition is
eb70: 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20   no longer .    
eb80: 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e      ** possible.
eb90: 20 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e   However, it can
eba0: 20 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20 66   still be true f
ebb0: 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69  or statements li
ebc0: 6b 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ke.        ** th
ebd0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20  e following:.   
ebe0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
ebf0: 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
ec00: 45 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45 52  E t1(col INTEGER
ec10: 29 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  );.        **   
ec20: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 74  SELECT (SELECT t
ec30: 31 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d  1.col) FROM FROM
ec40: 20 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a   t1;.        **.
ec50: 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20          ** when 
ec60: 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20  columnType() is 
ec70: 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78  called on the ex
ec80: 70 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c  pression "t1.col
ec90: 22 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20  " in the .      
eca0: 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e    ** sub-select.
ecb0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73   In this case, s
ecc0: 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  et the column ty
ecd0: 70 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e  pe to NULL, even
ece0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 75  .        ** thou
ecf0: 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65 61  gh it should rea
ed00: 6c 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52 22  lly be "INTEGER"
ed10: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
ed20: 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
ed30: 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61  not a problem, a
ed40: 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70  s the column typ
ed50: 65 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69 73  e of "t1.col" is
ed60: 20 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20 2a   never.        *
ed70: 2a 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c  * used. When col
ed80: 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c  umnType() is cal
ed90: 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65  led on the expre
eda0: 73 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a  ssion .        *
edb0: 2a 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63 6f  * "(SELECT t1.co
edc0: 6c 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63 74  l)", the correct
edd0: 20 74 79 70 65 20 69 73 20 72 65 74 75 72 6e 65   type is returne
ede0: 64 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53 45  d (see the TK_SE
edf0: 4c 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a 20  LECT.        ** 
ee00: 62 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a  branch below.  *
ee10: 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
ee20: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
ee30: 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20  assert( pTab && 
ee40: 70 45 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61  pExpr->pTab==pTa
ee50: 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  b );.      if( p
ee60: 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  S ){.        /* 
ee70: 54 68 65 20 22 74 61 62 6c 65 22 20 69 73 20 61  The "table" is a
ee80: 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65  ctually a sub-se
ee90: 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77 20 69  lect or a view i
eea0: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
eeb0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  e.        ** of 
eec0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
eed0: 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65  ment. Return the
eee0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
eef0: 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20  e and origin.   
ef00: 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72       ** data for
ef10: 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20   the result-set 
ef20: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75  column of the su
ef30: 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20  b-select..      
ef40: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
ef50: 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c   iCol>=0 && iCol
ef60: 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <pS->pEList->nEx
ef70: 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pr ){.          
ef80: 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65  /* If iCol is le
ef90: 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
efa0: 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  en the expressio
efb0: 6e 20 72 65 71 75 65 73 74 73 20 74 68 65 0a 20  n requests the. 
efc0: 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69           ** rowi
efd0: 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c  d of the sub-sel
efe0: 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69  ect or view. Thi
eff0: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
f000: 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20  legal (see .    
f010: 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61        ** test ca
f020: 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20  se misc2.2.2) - 
f030: 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61  it always evalua
f040: 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20  tes to NULL..   
f050: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
f060: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
f070: 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45  sNC;.          E
f080: 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c  xpr *p = pS->pEL
f090: 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78  ist->a[iCol].pEx
f0a0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  pr;.          sN
f0b0: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d  C.pSrcList = pS-
f0c0: 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20  >pSrc;.         
f0d0: 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43   sNC.pNext = pNC
f0e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
f0f0: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
f100: 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  arse;.          
f110: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
f120: 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f 72 69  pe(&sNC, p,&zOri
f130: 67 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c 26 7a  gDb,&zOrigTab,&z
f140: 4f 72 69 67 43 6f 6c 29 3b 20 0a 20 20 20 20 20  OrigCol); .     
f150: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
f160: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72  {.        /* A r
f170: 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 61 20 43  eal table or a C
f180: 54 45 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  TE table */.    
f190: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53 20      assert( !pS 
f1a0: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
f1b0: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
f1c0: 45 54 41 44 41 54 41 0a 20 20 20 20 20 20 20 20  ETADATA.        
f1d0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
f1e0: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
f1f0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
f200: 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20   iCol==XN_ROWID 
f210: 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69  || (iCol>=0 && i
f220: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Col<pTab->nCol) 
f230: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
f240: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Col<0 ){.       
f250: 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45     zType = "INTE
f260: 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20  GER";.          
f270: 7a 4f 72 69 67 43 6f 6c 20 3d 20 22 72 6f 77 69  zOrigCol = "rowi
f280: 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  d";.        }els
f290: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  e{.          zOr
f2a0: 69 67 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43  igCol = pTab->aC
f2b0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a  ol[iCol].zName;.
f2c0: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
f2d0: 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54  = sqlite3ColumnT
f2e0: 79 70 65 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  ype(&pTab->aCol[
f2f0: 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20  iCol],0);.      
f300: 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72 69    }.        zOri
f310: 67 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  gTab = pTab->zNa
f320: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
f330: 70 4e 43 2d 3e 70 50 61 72 73 65 20 26 26 20 70  pNC->pParse && p
f340: 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  Tab->pSchema ){.
f350: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
f360: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
f370: 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50  aToIndex(pNC->pP
f380: 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
f390: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
f3a0: 20 20 20 20 7a 4f 72 69 67 44 62 20 3d 20 70 4e      zOrigDb = pN
f3b0: 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  C->pParse->db->a
f3c0: 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
f3d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6c 73  ;.        }.#els
f3e0: 65 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  e.        assert
f3f0: 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44  ( iCol==XN_ROWID
f400: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
f410: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
f420: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
f430: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
f440: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54      zType = "INT
f450: 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 7d  EGER";.        }
f460: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
f470: 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 43  zType = sqlite3C
f480: 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62 2d  olumnType(&pTab-
f490: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b 0a  >aCol[iCol],0);.
f4a0: 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
f4b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
f4c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
f4d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f4e0: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
f4f0: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
f500: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
f510: 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d  ession is a sub-
f520: 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74  select. Return t
f530: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
f540: 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ype and.      **
f550: 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72   origin info for
f560: 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75   the single colu
f570: 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  mn in the result
f580: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
f590: 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  CT.      ** stat
f5a0: 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ement..      */.
f5b0: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
f5c0: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c  t sNC;.      Sel
f5d0: 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d  ect *pS = pExpr-
f5e0: 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  >x.pSelect;.    
f5f0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e    Expr *p = pS->
f600: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
f610: 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
f620: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
f630: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
f640: 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
f650: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
f660: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73  S->pSrc;.      s
f670: 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a  NC.pNext = pNC;.
f680: 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65        sNC.pParse
f690: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
f6a0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f        zType = co
f6b0: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
f6c0: 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72  , &zOrigDb, &zOr
f6d0: 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c  igTab, &zOrigCol
f6e0: 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ); .      break;
f6f0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
f700: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
f710: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
f720: 45 54 41 44 41 54 41 20 20 0a 20 20 69 66 28 20  ETADATA  .  if( 
f730: 70 7a 4f 72 69 67 44 62 20 29 7b 0a 20 20 20 20  pzOrigDb ){.    
f740: 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67 54 61  assert( pzOrigTa
f750: 62 20 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20 29  b && pzOrigCol )
f760: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 44 62 20  ;.    *pzOrigDb 
f770: 3d 20 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20 2a  = zOrigDb;.    *
f780: 70 7a 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72 69  pzOrigTab = zOri
f790: 67 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  gTab;.    *pzOri
f7a0: 67 43 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c 3b  gCol = zOrigCol;
f7b0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
f7c0: 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f  turn zType;.}../
f7d0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
f7e0: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c  de that will tel
f7f0: 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20 64  l the VDBE the d
f800: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 73  eclaration types
f810: 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69   of columns.** i
f820: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
f830: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
f840: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
f850: 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  ypes(.  Parse *p
f860: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
f870: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
f880: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
f890: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
f8a0: 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78  f tables */.  Ex
f8b0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
f8c0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
f8d0: 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65   defining the re
f8e0: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 23  sult set */.){.#
f8f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f900: 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 56 64  IT_DECLTYPE.  Vd
f910: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
f920: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
f930: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
f940: 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  C;.  sNC.pSrcLis
f950: 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
f960: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
f970: 72 73 65 3b 0a 20 20 73 4e 43 2e 70 4e 65 78 74  rse;.  sNC.pNext
f980: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
f990: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
f9a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
f9b0: 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   *p = pEList->a[
f9c0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f  i].pExpr;.    co
f9d0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
f9e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
f9f0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
fa00: 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74 20  ADATA.    const 
fa10: 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20  char *zOrigDb = 
fa20: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
fa30: 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b  r *zOrigTab = 0;
fa40: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
fa50: 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20  *zOrigCol = 0;. 
fa60: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
fa70: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
fa80: 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54  zOrigDb, &zOrigT
fa90: 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b 0a  ab, &zOrigCol);.
faa0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62 65  .    /* The vdbe
fab0: 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73 20 6f   must make its o
fac0: 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63  wn copy of the c
fad0: 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f  olumn-type and o
fae0: 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c  ther .    ** col
faf0: 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73 74 72  umn specific str
fb00: 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20 74 68  ings, in case th
fb10: 65 20 73 63 68 65 6d 61 20 69 73 20 72 65 73 65  e schema is rese
fb20: 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a 20 20  t before this.  
fb30: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63    ** virtual mac
fb40: 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e  hine is deleted.
fb50: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
fb60: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
fb70: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
fb80: 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69 67 44  DATABASE, zOrigD
fb90: 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  b, SQLITE_TRANSI
fba0: 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
fbb0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
fbc0: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41  v, i, COLNAME_TA
fbd0: 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c 20 53  BLE, zOrigTab, S
fbe0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
fbf0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
fc00: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
fc10: 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e  , COLNAME_COLUMN
fc20: 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53 51 4c 49  , zOrigCol, SQLI
fc30: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 23  TE_TRANSIENT);.#
fc40: 65 6c 73 65 0a 20 20 20 20 7a 54 79 70 65 20 3d  else.    zType =
fc50: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
fc60: 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23  , p, 0, 0, 0);.#
fc70: 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65  endif.    sqlite
fc80: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
fc90: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45  v, i, COLNAME_DE
fca0: 43 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c 20 53  CLTYPE, zType, S
fcb0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
fcc0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
fcd0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
fce0: 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 29 20 2a  OMIT_DECLTYPE) *
fcf0: 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  /.}.../*.** Comp
fd00: 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ute the column n
fd10: 61 6d 65 73 20 66 6f 72 20 61 20 53 45 4c 45 43  ames for a SELEC
fd20: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  T statement..**.
fd30: 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 67 75 61 72  ** The only guar
fd40: 61 6e 74 65 65 20 74 68 61 74 20 53 51 4c 69 74  antee that SQLit
fd50: 65 20 6d 61 6b 65 73 20 61 62 6f 75 74 20 63 6f  e makes about co
fd60: 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 73 20 74 68  lumn names is th
fd70: 61 74 20 69 66 20 74 68 65 0a 2a 2a 20 63 6f 6c  at if the.** col
fd80: 75 6d 6e 20 68 61 73 20 61 6e 20 41 53 20 63 6c  umn has an AS cl
fd90: 61 75 73 65 20 61 73 73 69 67 6e 69 6e 67 20 69  ause assigning i
fda0: 74 20 61 20 6e 61 6d 65 2c 20 74 68 61 74 20 77  t a name, that w
fdb0: 69 6c 6c 20 62 65 20 74 68 65 20 6e 61 6d 65 20  ill be the name 
fdc0: 75 73 65 64 2e 0a 2a 2a 20 54 68 61 74 20 69 73  used..** That is
fdd0: 20 74 68 65 20 6f 6e 6c 79 20 64 6f 63 75 6d 65   the only docume
fde0: 6e 74 65 64 20 67 75 61 72 61 6e 74 65 65 2e 20  nted guarantee. 
fdf0: 20 48 6f 77 65 76 65 72 2c 20 63 6f 75 6e 74 6c   However, countl
fe00: 65 73 73 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  ess applications
fe10: 0a 2a 2a 20 64 65 76 65 6c 6f 70 65 64 20 6f 76  .** developed ov
fe20: 65 72 20 74 68 65 20 79 65 61 72 73 20 68 61 76  er the years hav
fe30: 65 20 6d 61 64 65 20 62 61 73 65 6c 65 73 73 20  e made baseless 
fe40: 61 73 73 75 6d 70 74 69 6f 6e 73 20 61 62 6f 75  assumptions abou
fe50: 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 2a  t column names.*
fe60: 2a 20 61 6e 64 20 77 69 6c 6c 20 62 72 65 61 6b  * and will break
fe70: 20 69 66 20 74 68 6f 73 65 20 61 73 73 75 6d 70   if those assump
fe80: 74 69 6f 6e 73 20 63 68 61 6e 67 65 73 2e 20 20  tions changes.  
fe90: 48 65 6e 63 65 2c 20 75 73 65 20 65 78 74 72 65  Hence, use extre
fea0: 6d 65 20 63 61 75 74 69 6f 6e 0a 2a 2a 20 77 68  me caution.** wh
feb0: 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 69  en modifying thi
fec0: 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 61 76 6f  s routine to avo
fed0: 69 64 20 62 72 65 61 6b 69 6e 67 20 6c 65 67 61  id breaking lega
fee0: 63 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 41 6c  cy..**.** See Al
fef0: 73 6f 3a 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  so: sqlite3Colum
ff00: 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 29  nsFromExprList()
ff10: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 52 41 47 4d  .**.** The PRAGM
ff20: 41 20 73 68 6f 72 74 5f 63 6f 6c 75 6d 6e 5f 6e  A short_column_n
ff30: 61 6d 65 73 20 61 6e 64 20 50 52 41 47 4d 41 20  ames and PRAGMA 
ff40: 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  full_column_name
ff50: 73 20 73 65 74 74 69 6e 67 73 20 61 72 65 0a 2a  s settings are.*
ff60: 2a 20 64 65 70 72 65 63 61 74 65 64 2e 20 20 54  * deprecated.  T
ff70: 68 65 20 64 65 66 61 75 6c 74 20 73 65 74 74 69  he default setti
ff80: 6e 67 20 69 73 20 73 68 6f 72 74 3d 4f 4e 2c 20  ng is short=ON, 
ff90: 66 75 6c 6c 3d 4f 46 46 2e 20 20 39 39 2e 39 25  full=OFF.  99.9%
ffa0: 20 6f 66 20 61 6c 6c 0a 2a 2a 20 61 70 70 6c 69   of all.** appli
ffb0: 63 61 74 69 6f 6e 73 20 73 68 6f 75 6c 64 20 6f  cations should o
ffc0: 70 65 72 61 74 65 20 74 68 69 73 20 77 61 79 2e  perate this way.
ffd0: 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
ffe0: 77 65 20 6e 65 65 64 20 74 6f 20 73 75 70 70 6f  we need to suppo
fff0: 72 74 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20  rt the.** other 
10000 6d 6f 64 65 73 20 66 6f 72 20 6c 65 67 61 63 79  modes for legacy
10010 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 68 6f 72 74  :.**.**    short
10020 3d 4f 46 46 2c 20 66 75 6c 6c 3d 4f 46 46 3a 20  =OFF, full=OFF: 
10030 20 20 20 20 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65       Column name
10040 20 69 73 20 74 68 65 20 74 65 78 74 20 6f 66 20   is the text of 
10050 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68  the expression h
10060 61 73 20 69 74 0a 2a 2a 20 20 20 20 20 20 20 20  as it.**        
10070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10080 20 20 20 20 20 20 6f 72 69 67 69 6e 61 6c 6c 79        originally
10090 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 20   appears in the 
100a0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
100b0 2e 20 20 49 6e 0a 2a 2a 20 20 20 20 20 20 20 20  .  In.**        
100c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100d0 20 20 20 20 20 20 6f 74 68 65 72 20 77 6f 72 64        other word
100e0 73 2c 20 74 68 65 20 7a 53 70 61 6e 20 6f 66 20  s, the zSpan of 
100f0 74 68 65 20 72 65 73 75 6c 74 20 65 78 70 72 65  the result expre
10100 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ssion..**.**    
10110 73 68 6f 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f  short=ON, full=O
10120 46 46 3a 20 20 20 20 20 20 20 28 54 68 69 73 20  FF:       (This 
10130 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 73  is the default s
10140 65 74 74 69 6e 67 29 2e 20 20 49 66 20 74 68 65  etting).  If the
10150 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 20   result.**      
10160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10170 20 20 20 20 20 20 20 20 72 65 66 65 72 73 20 64          refers d
10180 69 72 65 63 74 6c 79 20 74 6f 20 61 20 74 61 62  irectly to a tab
10190 6c 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20  le column, then 
101a0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
101b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101c0 20 20 20 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d      result colum
101d0 6e 20 6e 61 6d 65 20 69 73 20 6a 75 73 74 20 74  n name is just t
101e0 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a  he table column.
101f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
10200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10210 6e 61 6d 65 3a 20 43 4f 4c 55 4d 4e 2e 20 20 4f  name: COLUMN.  O
10220 74 68 65 72 77 69 73 65 20 75 73 65 20 7a 53 70  therwise use zSp
10230 61 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 66 75 6c  an..**.**    ful
10240 6c 3d 4f 4e 2c 20 73 68 6f 72 74 3d 41 4e 59 3a  l=ON, short=ANY:
10250 20 20 20 20 20 20 20 49 66 20 74 68 65 20 72 65         If the re
10260 73 75 6c 74 20 72 65 66 65 72 73 20 64 69 72 65  sult refers dire
10270 63 74 6c 79 20 74 6f 20 61 20 74 61 62 6c 65 20  ctly to a table 
10280 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 20 20 20 20 20  column,.**      
10290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102a0 20 20 20 20 20 20 20 20 74 68 65 6e 20 74 68 65          then the
102b0 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e   result column n
102c0 61 6d 65 20 77 69 74 68 20 74 68 65 20 74 61 62  ame with the tab
102d0 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 20 20 20  le name.**      
102e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102f0 20 20 20 20 20 20 20 20 70 72 65 66 69 78 2c 20          prefix, 
10300 65 78 3a 20 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e  ex: TABLE.COLUMN
10310 2e 20 20 4f 74 68 65 72 77 69 73 65 20 75 73 65  .  Otherwise use
10320 20 7a 53 70 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69   zSpan..*/.stati
10330 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43  c void generateC
10340 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61  olumnNames(.  Pa
10350 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
10360 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
10370 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
10380 2a 70 53 65 6c 65 63 74 20 20 20 20 20 2f 2a 20  *pSelect     /* 
10390 47 65 6e 65 72 61 74 65 20 63 6f 6c 75 6d 6e 20  Generate column 
103a0 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20 53  names for this S
103b0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
103c0 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
103d0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
103e0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 54 61 62 6c  .  int i;.  Tabl
103f0 65 20 2a 70 54 61 62 3b 0a 20 20 53 72 63 4c 69  e *pTab;.  SrcLi
10400 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20  st *pTabList;.  
10410 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
10420 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
10430 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
10440 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 3b 20 20 20  int fullName;   
10450 20 2f 2a 20 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e   /* TABLE.COLUMN
10460 20 69 66 20 6e 6f 20 41 53 20 63 6c 61 75 73 65   if no AS clause
10470 20 61 6e 64 20 69 73 20 61 20 64 69 72 65 63 74   and is a direct
10480 20 74 61 62 6c 65 20 72 65 66 20 2a 2f 0a 20 20   table ref */.  
10490 69 6e 74 20 73 72 63 4e 61 6d 65 3b 20 20 20 20  int srcName;    
104a0 20 2f 2a 20 43 4f 4c 55 4d 4e 20 6f 72 20 54 41   /* COLUMN or TA
104b0 42 4c 45 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e 6f  BLE.COLUMN if no
104c0 20 41 53 20 63 6c 61 75 73 65 20 61 6e 64 20 69   AS clause and i
104d0 73 20 64 69 72 65 63 74 20 2a 2f 0a 0a 23 69 66  s direct */..#if
104e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
104f0 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66  _EXPLAIN.  /* If
10500 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c   this is an EXPL
10510 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73  AIN, skip this s
10520 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  tep */.  if( pPa
10530 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
10540 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
10550 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50  #endif..  if( pP
10560 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
10570 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 2f 2a  t ) return;.  /*
10580 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72   Column names ar
10590 65 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  e determined by 
105a0 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65  the left-most te
105b0 72 6d 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  rm of a compound
105c0 20 73 65 6c 65 63 74 20 2a 2f 0a 20 20 77 68 69   select */.  whi
105d0 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  le( pSelect->pPr
105e0 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20  ior ) pSelect = 
105f0 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b  pSelect->pPrior;
10600 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31  .  SELECTTRACE(1
10610 2c 70 50 61 72 73 65 2c 70 53 65 6c 65 63 74 2c  ,pParse,pSelect,
10620 28 22 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6c  ("generating col
10630 75 6d 6e 20 6e 61 6d 65 73 5c 6e 22 29 29 3b 0a  umn names\n"));.
10640 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 53 65    pTabList = pSe
10650 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 70 45  lect->pSrc;.  pE
10660 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
10670 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74  pEList;.  assert
10680 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( v!=0 );.  asse
10690 72 74 28 20 70 54 61 62 4c 69 73 74 21 3d 30 20  rt( pTabList!=0 
106a0 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c  );.  pParse->col
106b0 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20  NamesSet = 1;.  
106c0 66 75 6c 6c 4e 61 6d 65 20 3d 20 28 64 62 2d 3e  fullName = (db->
106d0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
106e0 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b  ullColNames)!=0;
106f0 0a 20 20 73 72 63 4e 61 6d 65 20 3d 20 28 64 62  .  srcName = (db
10700 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
10710 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21  _ShortColNames)!
10720 3d 30 20 7c 7c 20 66 75 6c 6c 4e 61 6d 65 3b 0a  =0 || fullName;.
10730 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
10740 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73  NumCols(v, pELis
10750 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72  t->nExpr);.  for
10760 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
10770 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
10780 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73   Expr *p = pELis
10790 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 0a  t->a[i].pExpr;..
107a0 20 20 20 20 61 73 73 65 72 74 28 20 70 21 3d 30      assert( p!=0
107b0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
107c0 70 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f  p->op!=TK_AGG_CO
107d0 4c 55 4d 4e 20 29 3b 20 20 2f 2a 20 41 67 67 20  LUMN );  /* Agg 
107e0 70 72 6f 63 65 73 73 69 6e 67 20 68 61 73 20 6e  processing has n
107f0 6f 74 20 72 75 6e 20 79 65 74 20 2a 2f 0a 20 20  ot run yet */.  
10800 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21    assert( p->op!
10810 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d  =TK_COLUMN || p-
10820 3e 70 54 61 62 21 3d 30 20 29 3b 20 2f 2a 20 43  >pTab!=0 ); /* C
10830 6f 76 65 72 69 6e 67 20 69 64 78 20 6e 6f 74 20  overing idx not 
10840 79 65 74 20 63 6f 64 65 64 20 2a 2f 0a 20 20 20  yet coded */.   
10850 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69   if( pEList->a[i
10860 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ].zName ){.     
10870 20 2f 2a 20 41 6e 20 41 53 20 63 6c 61 75 73 65   /* An AS clause
10880 20 61 6c 77 61 79 73 20 74 61 6b 65 73 20 66 69   always takes fi
10890 72 73 74 20 70 72 69 6f 72 69 74 79 20 2a 2f 0a  rst priority */.
108a0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
108b0 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
108c0 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71  .zName;.      sq
108d0 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
108e0 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
108f0 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53  E_NAME, zName, S
10900 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
10910 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
10920 73 72 63 4e 61 6d 65 20 26 26 20 70 2d 3e 6f 70  srcName && p->op
10930 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
10940 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b       char *zCol;
10950 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
10960 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  = p->iColumn;.  
10970 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 54      pTab = p->pT
10980 61 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ab;.      assert
10990 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ( pTab!=0 );.   
109a0 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
109b0 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
109c0 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ey;.      assert
109d0 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69  ( iCol==-1 || (i
109e0 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
109f0 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20  Tab->nCol) );.  
10a00 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
10a10 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
10a20 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20   "rowid";.      
10a30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
10a40 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
10a50 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  [iCol].zName;.  
10a60 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
10a70 66 75 6c 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20  fullName ){.    
10a80 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
10a90 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  = 0;.        zNa
10aa0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
10ab0 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c  ntf(db, "%s.%s",
10ac0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43   pTab->zName, zC
10ad0 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
10ae0 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
10af0 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
10b00 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51  _NAME, zName, SQ
10b10 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  LITE_DYNAMIC);. 
10b20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10b30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
10b40 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
10b50 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43  COLNAME_NAME, zC
10b60 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  ol, SQLITE_TRANS
10b70 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20  IENT);.      }. 
10b80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10b90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
10ba0 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70  pEList->a[i].zSp
10bb0 61 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a 3d  an;.      z = z=
10bc0 3d 30 20 3f 20 73 71 6c 69 74 65 33 4d 50 72 69  =0 ? sqlite3MPri
10bd0 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25  ntf(db, "column%
10be0 64 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69 74  d", i+1) : sqlit
10bf0 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a  e3DbStrDup(db, z
10c00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10c10 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
10c20 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
10c30 45 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59 4e  E, z, SQLITE_DYN
10c40 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  AMIC);.    }.  }
10c50 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  .  generateColum
10c60 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70  nTypes(pParse, p
10c70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
10c80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
10c90 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
10ca0 69 73 74 20 28 77 68 69 63 68 20 69 73 20 72 65  ist (which is re
10cb0 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f 66  ally the list of
10cc0 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
10cd0 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72 65  that form the re
10ce0 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45  sult set of a SE
10cf0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29 20  LECT statement) 
10d00 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72 69  compute appropri
10d10 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61  ate.** column na
10d20 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20  mes for a table 
10d30 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64 20  that would hold 
10d40 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
10d50 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63  ist..**.** All c
10d60 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c 6c  olumn names will
10d70 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a   be unique..**.*
10d80 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d  * Only the colum
10d90 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d 70  n names are comp
10da0 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54  uted.  Column.zT
10db0 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c  ype, Column.zCol
10dc0 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20  l,.** and other 
10dd0 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d 6e  fields of Column
10de0 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a   are zeroed..**.
10df0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
10e00 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  _OK on success. 
10e10 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
10e20 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63  ocation error oc
10e30 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e  curs,.** store N
10e40 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61 6e  ULL in *paCol an
10e50 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e  d 0 in *pnCol an
10e60 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
10e70 4e 4f 4d 45 4d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  NOMEM..**.** The
10e80 20 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65 65 20   only guarantee 
10e90 74 68 61 74 20 53 51 4c 69 74 65 20 6d 61 6b 65  that SQLite make
10ea0 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e  s about column n
10eb0 61 6d 65 73 20 69 73 20 74 68 61 74 20 69 66 20  ames is that if 
10ec0 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61  the.** column ha
10ed0 73 20 61 6e 20 41 53 20 63 6c 61 75 73 65 20 61  s an AS clause a
10ee0 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 6e 61  ssigning it a na
10ef0 6d 65 2c 20 74 68 61 74 20 77 69 6c 6c 20 62 65  me, that will be
10f00 20 74 68 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a   the name used..
10f10 2a 2a 20 54 68 61 74 20 69 73 20 74 68 65 20 6f  ** That is the o
10f20 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 65 64 20 67  nly documented g
10f30 75 61 72 61 6e 74 65 65 2e 20 20 48 6f 77 65 76  uarantee.  Howev
10f40 65 72 2c 20 63 6f 75 6e 74 6c 65 73 73 20 61 70  er, countless ap
10f50 70 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65  plications.** de
10f60 76 65 6c 6f 70 65 64 20 6f 76 65 72 20 74 68 65  veloped over the
10f70 20 79 65 61 72 73 20 68 61 76 65 20 6d 61 64 65   years have made
10f80 20 62 61 73 65 6c 65 73 73 20 61 73 73 75 6d 70   baseless assump
10f90 74 69 6f 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75  tions about colu
10fa0 6d 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20  mn names.** and 
10fb0 77 69 6c 6c 20 62 72 65 61 6b 20 69 66 20 74 68  will break if th
10fc0 6f 73 65 20 61 73 73 75 6d 70 74 69 6f 6e 73 20  ose assumptions 
10fd0 63 68 61 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c  changes.  Hence,
10fe0 20 75 73 65 20 65 78 74 72 65 6d 65 20 63 61 75   use extreme cau
10ff0 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64  tion.** when mod
11000 69 66 79 69 6e 67 20 74 68 69 73 20 72 6f 75 74  ifying this rout
11010 69 6e 65 20 74 6f 20 61 76 6f 69 64 20 62 72 65  ine to avoid bre
11020 61 6b 69 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a  aking legacy..**
11030 0a 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20 67 65  .** See Also: ge
11040 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
11050 73 28 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  s().*/.int sqlit
11060 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  e3ColumnsFromExp
11070 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
11080 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
11090 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
110a0 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
110b0 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20  t *pEList,      
110c0 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66 72   /* Expr list fr
110d0 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72 69  om which to deri
110e0 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ve column names 
110f0 2a 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c 2c  */.  i16 *pnCol,
11100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11110 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
11120 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65   of columns here
11130 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70   */.  Column **p
11140 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a  aCol          /*
11150 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20 63   Write the new c
11160 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65 20  olumn list here 
11170 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
11180 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
11190 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ;   /* Database 
111a0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
111b0 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
111c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
111d0 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
111e0 20 20 75 33 32 20 63 6e 74 3b 20 20 20 20 20 20    u32 cnt;      
111f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11200 20 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f 20   Index added to 
11210 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75 6e  make the name un
11220 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e  ique */.  Column
11230 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20   *aCol, *pCol;  
11240 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
11250 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c 74  ping over result
11260 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
11270 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
11280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11290 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
112a0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
112b0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
112c0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
112d0 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65    /* Column name
112e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
112f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11300 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d    /* Size of nam
11310 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a  e in zName[] */.
11320 20 20 48 61 73 68 20 68 74 3b 20 20 20 20 20 20    Hash ht;      
11330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11340 20 48 61 73 68 20 74 61 62 6c 65 20 6f 66 20 63   Hash table of c
11350 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 0a  olumn names */..
11360 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69    sqlite3HashIni
11370 74 28 26 68 74 29 3b 0a 20 20 69 66 28 20 70 45  t(&ht);.  if( pE
11380 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c  List ){.    nCol
11390 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
113a0 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c  ;.    aCol = sql
113b0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
113c0 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c  (db, sizeof(aCol
113d0 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20  [0])*nCol);.    
113e0 74 65 73 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d  testcase( aCol==
113f0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f  0 );.    if( nCo
11400 6c 3e 33 32 37 36 37 20 29 20 6e 43 6f 6c 20 3d  l>32767 ) nCol =
11410 20 33 32 37 36 37 3b 0a 20 20 7d 65 6c 73 65 7b   32767;.  }else{
11420 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20  .    nCol = 0;. 
11430 20 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d     aCol = 0;.  }
11440 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 3d  .  assert( nCol=
11450 3d 28 69 31 36 29 6e 43 6f 6c 20 29 3b 0a 20 20  =(i16)nCol );.  
11460 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20  *pnCol = nCol;. 
11470 20 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a   *paCol = aCol;.
11480 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c  .  for(i=0, pCol
11490 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 20 26 26  =aCol; i<nCol &&
114a0 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
114b0 65 64 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ed; i++, pCol++)
114c0 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20  {.    /* Get an 
114d0 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65  appropriate name
114e0 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a   for the column.
114f0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
11500 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
11510 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29  a[i].zName)!=0 )
11520 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
11530 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e  e column contain
11540 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22  s an "AS <name>"
11550 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61   phrase, use <na
11560 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20  me> as the name 
11570 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
11580 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c 45 78      Expr *pColEx
11590 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
115a0 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69  SkipCollate(pELi
115b0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
115c0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 43  .      while( pC
115d0 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44  olExpr->op==TK_D
115e0 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OT ){.        pC
115f0 6f 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45 78 70  olExpr = pColExp
11600 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
11610 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45     assert( pColE
11620 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
11630 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
11640 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  pColExpr->op!=TK
11650 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
11660 20 20 20 20 20 69 66 28 20 70 43 6f 6c 45 78 70       if( pColExp
11670 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
11680 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
11690 6f 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74  or columns use t
116a0 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e  he column name n
116b0 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ame */.        i
116c0 6e 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78  nt iCol = pColEx
116d0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
116e0 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
116f0 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61   = pColExpr->pTa
11700 62 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  b;.        asser
11710 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
11720 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
11730 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e   ) iCol = pTab->
11740 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 7a  iPKey;.        z
11750 4e 61 6d 65 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f  Name = iCol>=0 ?
11760 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
11770 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64  ].zName : "rowid
11780 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ";.      }else i
11790 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d  f( pColExpr->op=
117a0 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20  =TK_ID ){.      
117b0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
117c0 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f 6c 45  asProperty(pColE
117d0 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
117e0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  ) );.        zNa
117f0 6d 65 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 75  me = pColExpr->u
11800 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d  .zToken;.      }
11810 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
11820 20 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61   Use the origina
11830 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f  l text of the co
11840 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lumn expression 
11850 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20  as its name */. 
11860 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70         zName = p
11870 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  EList->a[i].zSpa
11880 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
11890 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29  .    if( zName )
118a0 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  {.      zName = 
118b0 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
118c0 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
118d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e 61  }else{.      zNa
118e0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
118f0 6e 74 66 28 64 62 2c 22 63 6f 6c 75 6d 6e 25 64  ntf(db,"column%d
11900 22 2c 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a 20  ",i+1);.    }.. 
11910 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
11920 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
11930 69 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74  is unique.  If t
11940 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75  he name is not u
11950 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70  nique,.    ** ap
11960 70 65 6e 64 20 61 6e 20 69 6e 74 65 67 65 72 20  pend an integer 
11970 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74  to the name so t
11980 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75  hat it becomes u
11990 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  nique..    */.  
119a0 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77    cnt = 0;.    w
119b0 68 69 6c 65 28 20 7a 4e 61 6d 65 20 26 26 20 73  hile( zName && s
119c0 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
119d0 68 74 2c 20 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  ht, zName)!=0 ){
119e0 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73  .      nName = s
119f0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
11a00 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Name);.      if(
11a10 20 6e 4e 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20   nName>0 ){.    
11a20 20 20 20 20 66 6f 72 28 6a 3d 6e 4e 61 6d 65 2d      for(j=nName-
11a30 31 3b 20 6a 3e 30 20 26 26 20 73 71 6c 69 74 65  1; j>0 && sqlite
11a40 33 49 73 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6a  3Isdigit(zName[j
11a50 5d 29 3b 20 6a 2d 2d 29 7b 7d 0a 20 20 20 20 20  ]); j--){}.     
11a60 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 6a 5d 3d     if( zName[j]=
11a70 3d 27 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6a  =':' ) nName = j
11a80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11a90 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
11aa0 50 72 69 6e 74 66 28 64 62 2c 20 22 25 2e 2a 7a  Printf(db, "%.*z
11ab0 3a 25 75 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61  :%u", nName, zNa
11ac0 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20  me, ++cnt);.    
11ad0 20 20 69 66 28 20 63 6e 74 3e 33 20 29 20 73 71    if( cnt>3 ) sq
11ae0 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
11af0 28 73 69 7a 65 6f 66 28 63 6e 74 29 2c 20 26 63  (sizeof(cnt), &c
11b00 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nt);.    }.    p
11b10 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  Col->zName = zNa
11b20 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  me;.    sqlite3C
11b30 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46  olumnPropertiesF
11b40 72 6f 6d 4e 61 6d 65 28 30 2c 20 70 43 6f 6c 29  romName(0, pCol)
11b50 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20  ;.    if( zName 
11b60 26 26 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e  && sqlite3HashIn
11b70 73 65 72 74 28 26 68 74 2c 20 7a 4e 61 6d 65 2c  sert(&ht, zName,
11b80 20 70 43 6f 6c 29 3d 3d 70 43 6f 6c 20 29 7b 0a   pCol)==pCol ){.
11b90 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d        sqlite3Oom
11ba0 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 7d  Fault(db);.    }
11bb0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61  .  }.  sqlite3Ha
11bc0 73 68 43 6c 65 61 72 28 26 68 74 29 3b 0a 20 20  shClear(&ht);.  
11bd0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
11be0 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28  iled ){.    for(
11bf0 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a  j=0; j<i; j++){.
11c00 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
11c10 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e  ree(db, aCol[j].
11c20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
11c30 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
11c40 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a  db, aCol);.    *
11c50 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a  paCol = 0;.    *
11c60 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72  pnCol = 0;.    r
11c70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
11c80 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  EM_BKPT;.  }.  r
11c90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11ca0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79  .}../*.** Add ty
11cb0 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  pe and collation
11cc0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
11cd0 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61  a column list ba
11ce0 73 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45  sed on.** a SELE
11cf0 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
11d00 20 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20   .** The column 
11d10 6c 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79 20  list presumably 
11d20 63 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63 74  came from select
11d30 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45  ColumnNamesFromE
11d40 78 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68  xprList()..** Th
11d50 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61  e column list ha
11d60 73 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f  s only names, no
11d70 74 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61  t types or colla
11d80 74 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20  tions.  This.** 
11d90 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68 72  routine goes thr
11da0 6f 75 67 68 20 61 6e 64 20 61 64 64 73 20 74 68  ough and adds th
11db0 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c  e types and coll
11dc0 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ations..**.** Th
11dd0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75 69  is routine requi
11de0 72 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64 65  res that all ide
11df0 6e 74 69 66 69 65 72 73 20 69 6e 20 74 68 65 20  ntifiers in the 
11e00 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d  SELECT.** statem
11e10 65 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e  ent be resolved.
11e20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
11e30 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  SelectAddColumnT
11e40 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
11e50 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
11e60 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
11e70 69 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a  ing contexts */.
11e80 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
11e90 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 63          /* Add c
11ea0 6f 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72  olumn type infor
11eb0 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 74  mation to this t
11ec0 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  able */.  Select
11ed0 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20   *pSelect       
11ee0 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20 74  /* SELECT used t
11ef0 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70 65  o determine type
11f00 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  s and collations
11f10 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
11f20 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
11f30 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  b;.  NameContext
11f40 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a   sNC;.  Column *
11f50 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  pCol;.  CollSeq 
11f60 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b  *pColl;.  int i;
11f70 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73 74  .  Expr *p;.  st
11f80 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
11f90 65 6d 20 2a 61 3b 0a 0a 20 20 61 73 73 65 72 74  em *a;..  assert
11fa0 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a  ( pSelect!=0 );.
11fb0 20 20 61 73 73 65 72 74 28 20 28 70 53 65 6c 65    assert( (pSele
11fc0 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ct->selFlags & S
11fd0 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20 29  F_Resolved)!=0 )
11fe0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
11ff0 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d  ->nCol==pSelect-
12000 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c  >pEList->nExpr |
12010 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
12020 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ed );.  if( db->
12030 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
12040 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28  eturn;.  memset(
12050 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
12060 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72  sNC));.  sNC.pSr
12070 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  cList = pSelect-
12080 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65  >pSrc;.  a = pSe
12090 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b  lect->pEList->a;
120a0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c  .  for(i=0, pCol
120b0 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70  =pTab->aCol; i<p
120c0 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  Tab->nCol; i++, 
120d0 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  pCol++){.    con
120e0 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a  st char *zType;.
120f0 20 20 20 20 69 6e 74 20 6e 2c 20 6d 3b 0a 20 20      int n, m;.  
12100 20 20 70 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72    p = a[i].pExpr
12110 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  ;.    zType = co
12120 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
12130 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
12140 2f 2a 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d  /* pCol->szEst =
12150 20 2e 2e 2e 20 2f 2f 20 43 6f 6c 75 6d 6e 20 73   ... // Column s
12160 69 7a 65 20 65 73 74 20 66 6f 72 20 53 45 4c 45  ize est for SELE
12170 43 54 20 74 61 62 6c 65 73 20 6e 65 76 65 72 20  CT tables never 
12180 75 73 65 64 20 2a 2f 0a 20 20 20 20 70 43 6f 6c  used */.    pCol
12190 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c  ->affinity = sql
121a0 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
121b0 28 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 79  (p);.    if( zTy
121c0 70 65 20 29 7b 0a 20 20 20 20 20 20 6d 20 3d 20  pe ){.      m = 
121d0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
121e0 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20 6e 20  zType);.      n 
121f0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
12200 30 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  0(pCol->zName);.
12210 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d        pCol->zNam
12220 65 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  e = sqlite3DbRea
12230 6c 6c 6f 63 4f 72 46 72 65 65 28 64 62 2c 20 70  llocOrFree(db, p
12240 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 6e 2b 6d 2b  Col->zName, n+m+
12250 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  2);.      if( pC
12260 6f 6c 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  ol->zName ){.   
12270 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 43 6f       memcpy(&pCo
12280 6c 2d 3e 7a 4e 61 6d 65 5b 6e 2b 31 5d 2c 20 7a  l->zName[n+1], z
12290 54 79 70 65 2c 20 6d 2b 31 29 3b 0a 20 20 20 20  Type, m+1);.    
122a0 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61      pCol->colFla
122b0 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 41  gs |= COLFLAG_HA
122c0 53 54 59 50 45 3b 0a 20 20 20 20 20 20 7d 0a 20  STYPE;.      }. 
122d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 6f     }.    if( pCo
122e0 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20 29  l->affinity==0 )
122f0 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
12300 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  = SQLITE_AFF_BLO
12310 42 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  B;.    pColl = s
12320 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
12330 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  q(pParse, p);.  
12340 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70    if( pColl && p
12350 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20 29 7b  Col->zColl==0 ){
12360 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f  .      pCol->zCo
12370 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  ll = sqlite3DbSt
12380 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e  rDup(db, pColl->
12390 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
123a0 7d 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52  }.  pTab->szTabR
123b0 6f 77 20 3d 20 31 3b 20 2f 2a 20 41 6e 79 20 6e  ow = 1; /* Any n
123c0 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 77 6f  on-zero value wo
123d0 72 6b 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rks */.}../*.** 
123e0 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73  Given a SELECT s
123f0 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61  tatement, genera
12400 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  te a Table struc
12410 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
12420 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  bes.** the resul
12430 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45  t set of that SE
12440 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  LECT..*/.Table *
12450 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
12460 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a  OfSelect(Parse *
12470 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
12480 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c  pSelect){.  Tabl
12490 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  e *pTab;.  sqlit
124a0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
124b0 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64  >db;.  int saved
124c0 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46  Flags;..  savedF
124d0 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73  lags = db->flags
124e0 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
124f0 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c   ~SQLITE_FullCol
12500 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61  Names;.  db->fla
12510 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f  gs |= SQLITE_Sho
12520 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71  rtColNames;.  sq
12530 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
12540 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
12550 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73   0);.  if( pPars
12560 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
12570 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65   0;.  while( pSe
12580 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  lect->pPrior ) p
12590 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
125a0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e  ->pPrior;.  db->
125b0 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61  flags = savedFla
125c0 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  gs;.  pTab = sql
125d0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
125e0 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
125f0 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  e) );.  if( pTab
12600 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
12610 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68  n 0;.  }.  /* Th
12620 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  e sqlite3ResultS
12630 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20  etOfSelect() is 
12640 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74  only used n cont
12650 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61  exts where looka
12660 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73  side.  ** is dis
12670 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  abled */.  asser
12680 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  t( db->lookaside
12690 2e 62 44 69 73 61 62 6c 65 20 29 3b 0a 20 20 70  .bDisable );.  p
126a0 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31  Tab->nTabRef = 1
126b0 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20  ;.  pTab->zName 
126c0 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f  = 0;.  pTab->nRo
126d0 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61  wLogEst = 200; a
126e0 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69  ssert( 200==sqli
126f0 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37  te3LogEst(104857
12700 36 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  6) );.  sqlite3C
12710 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
12720 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  st(pParse, pSele
12730 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61  ct->pEList, &pTa
12740 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e  b->nCol, &pTab->
12750 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  aCol);.  sqlite3
12760 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  SelectAddColumnT
12770 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
12780 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53  pParse, pTab, pS
12790 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e  elect);.  pTab->
127a0 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66  iPKey = -1;.  if
127b0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
127c0 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
127d0 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
127e0 20 70 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75   pTab);.    retu
127f0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
12800 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
12810 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f 72  * Get a VDBE for
12820 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73 65   the given parse
12830 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61  r context.  Crea
12840 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
12850 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66  necessary..** If
12860 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
12870 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e  , return NULL an
12880 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67  d leave a messag
12890 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
128a0 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74  Vdbe *sqlite3Get
128b0 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72  Vdbe(Parse *pPar
128c0 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  se){.  if( pPars
128d0 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20  e->pVdbe ){.    
128e0 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 70  return pParse->p
128f0 56 64 62 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Vdbe;.  }.  if( 
12900 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65  pParse->pTopleve
12910 6c 3d 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d  l==0.   && Optim
12920 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70  izationEnabled(p
12930 50 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45  Parse->db,SQLITE
12940 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29  _FactorOutConst)
12950 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  .  ){.    pParse
12960 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20  ->okConstFactor 
12970 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
12980 6e 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65  n sqlite3VdbeCre
12990 61 74 65 28 70 50 61 72 73 65 29 3b 0a 7d 0a 0a  ate(pParse);.}..
129a0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
129b0 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  he iLimit and iO
129c0 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20  ffset fields of 
129d0 74 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64  the SELECT based
129e0 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69   on the.** pLimi
129f0 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  t expressions.  
12a00 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20 61 6e  pLimit->pLeft an
12a10 64 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74  d pLimit->pRight
12a20 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73   hold the expres
12a30 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70  sions.** that ap
12a40 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67  pear in the orig
12a50 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  inal SQL stateme
12a60 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d  nt after the LIM
12a70 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a  IT and OFFSET.**
12a80 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e   keywords.  Or N
12a90 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79  ULL if those key
12aa0 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65  words are omitte
12ab0 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  d. iLimit and iO
12ac0 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68  ffset .** are th
12ad0 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79  e integer memory
12ae0 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
12af0 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75  s for counters u
12b00 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a  sed to compute .
12b10 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64  ** the limit and
12b20 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65   offset.  If the
12b30 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61  re is no limit a
12b40 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68  nd/or offset, th
12b50 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e  en .** iLimit an
12b60 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65  d iOffset are ne
12b70 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  gative..**.** Th
12b80 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67  is routine chang
12b90 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  es the values of
12ba0 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
12bb0 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61  set only if.** a
12bc0 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74   limit or offset
12bd0 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
12be0 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20 61 6e 64  Limit->pLeft and
12bf0 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 2e   pLimit->pRight.
12c00 20 20 69 4c 69 6d 69 74 0a 2a 2a 20 61 6e 64 20    iLimit.** and 
12c10 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68  iOffset should h
12c20 61 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20  ave been preset 
12c30 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64  to appropriate d
12c40 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20 28 7a  efault values (z
12c50 65 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f  ero).** prior to
12c60 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
12c70 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utine..**.** The
12c80 20 69 4f 66 66 73 65 74 20 72 65 67 69 73 74 65   iOffset registe
12c90 72 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29  r (if it exists)
12ca0 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
12cb0 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20  to the value.** 
12cc0 6f 66 20 74 68 65 20 4f 46 46 53 45 54 2e 20 20  of the OFFSET.  
12cd0 54 68 65 20 69 4c 69 6d 69 74 20 72 65 67 69 73  The iLimit regis
12ce0 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ter is initializ
12cf0 65 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65  ed to LIMIT.  Re
12d00 67 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65  gister.** iOffse
12d10 74 2b 31 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  t+1 is initializ
12d20 65 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53  ed to LIMIT+OFFS
12d30 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69  ET..**.** Only i
12d40 66 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 21  f pLimit->pLeft!
12d50 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20  =0 do the limit 
12d60 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a  registers get.**
12d70 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65   redefined.  The
12d80 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
12d90 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72  tor uses this pr
12da0 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a  operty to force.
12db0 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20  ** the reuse of 
12dc0 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61  the same limit a
12dd0 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74  nd offset regist
12de0 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69  ers across multi
12df0 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  ple.** SELECT st
12e00 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  atements..*/.sta
12e10 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65  tic void compute
12e20 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50  LimitRegisters(P
12e30 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
12e40 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72  lect *p, int iBr
12e50 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  eak){.  Vdbe *v 
12e60 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69  = 0;.  int iLimi
12e70 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66  t = 0;.  int iOf
12e80 66 73 65 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  fset;.  int n;. 
12e90 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20   Expr *pLimit = 
12ea0 70 2d 3e 70 4c 69 6d 69 74 3b 0a 0a 20 20 69 66  p->pLimit;..  if
12eb0 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65  ( p->iLimit ) re
12ec0 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  turn;..  /* .  *
12ed0 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77  * "LIMIT -1" alw
12ee0 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f  ays shows all ro
12ef0 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f  ws.  There is so
12f00 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65  me.  ** controve
12f10 72 73 79 20 61 62 6f 75 74 20 77 68 61 74 20 74  rsy about what t
12f20 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76  he correct behav
12f30 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20  ior should be.. 
12f40 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   ** The current 
12f50 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
12f60 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54  nterprets "LIMIT
12f70 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a   0" to mean.  **
12f80 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20   no rows..  */. 
12f90 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
12fa0 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
12fb0 20 20 69 66 28 20 70 4c 69 6d 69 74 20 29 7b 0a    if( pLimit ){.
12fc0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 6d      assert( pLim
12fd0 69 74 2d 3e 6f 70 3d 3d 54 4b 5f 4c 49 4d 49 54  it->op==TK_LIMIT
12fe0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12ff0 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 21 3d 30  pLimit->pLeft!=0
13000 20 29 3b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69   );.    p->iLimi
13010 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70  t = iLimit = ++p
13020 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
13030 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
13040 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
13050 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
13060 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
13070 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 4c  ExprIsInteger(pL
13080 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 29  imit->pLeft, &n)
13090 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
130a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
130b0 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c  P_Integer, n, iL
130c0 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62  imit);.      Vdb
130d0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
130e0 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  MIT counter"));.
130f0 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29        if( n==0 )
13100 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
13110 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 69 42 72  3VdbeGoto(v, iBr
13120 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  eak);.      }els
13130 65 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d  e if( n>=0 && p-
13140 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 73 71 6c 69  >nSelectRow>sqli
13150 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e  te3LogEst((u64)n
13160 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ) ){.        p->
13170 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c  nSelectRow = sql
13180 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29  ite3LogEst((u64)
13190 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73  n);.        p->s
131a0 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 46 69  elFlags |= SF_Fi
131b0 78 65 64 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  xedLimit;.      
131c0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
131d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
131e0 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69 6d 69  de(pParse, pLimi
131f0 74 2d 3e 70 4c 65 66 74 2c 20 69 4c 69 6d 69 74  t->pLeft, iLimit
13200 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13210 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
13220 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d  _MustBeInt, iLim
13230 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  it); VdbeCoverag
13240 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
13250 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d  Comment((v, "LIM
13260 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  IT counter"));. 
13270 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13280 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e  AddOp2(v, OP_IfN
13290 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65  ot, iLimit, iBre
132a0 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
132b0 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e(v);.    }.    
132c0 69 66 28 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67  if( pLimit->pRig
132d0 68 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  ht ){.      p->i
132e0 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74  Offset = iOffset
132f0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
13300 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  m;.      pParse-
13310 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c  >nMem++;   /* Al
13320 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61 20  locate an extra 
13330 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d  register for lim
13340 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20  it+offset */.   
13350 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
13360 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69 6d 69  de(pParse, pLimi
13370 74 2d 3e 70 52 69 67 68 74 2c 20 69 4f 66 66 73  t->pRight, iOffs
13380 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
13390 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
133a0 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f  OP_MustBeInt, iO
133b0 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65  ffset); VdbeCove
133c0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56  rage(v);.      V
133d0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
133e0 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29  OFFSET counter")
133f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13400 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
13410 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c 20 69 4c  _OffsetLimit, iL
13420 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2b 31 2c  imit, iOffset+1,
13430 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20   iOffset);.     
13440 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
13450 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29   "LIMIT+OFFSET")
13460 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
13470 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13480 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
13490 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ECT./*.** Return
134a0 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
134b0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
134c0 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c  nce for the iCol
134d0 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a  -th column of.**
134e0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
134f0 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  for the compound
13500 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e  -select statemen
13510 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e  t "p".  Return N
13520 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f  ULL if.** the co
13530 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61  lumn has no defa
13540 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ult collating se
13550 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  quence..**.** Th
13560 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
13570 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d  ence for the com
13580 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20  pound select is 
13590 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a  taken from the.*
135a0 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  * left-most term
135b0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 74   of the select t
135c0 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  hat has a collat
135d0 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f  ing sequence..*/
135e0 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20  .static CollSeq 
135f0 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c  *multiSelectColl
13600 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
13610 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
13620 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53  t iCol){.  CollS
13630 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20  eq *pRet;.  if( 
13640 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
13650 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c   pRet = multiSel
13660 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
13670 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43  e, p->pPrior, iC
13680 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ol);.  }else{.  
13690 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a    pRet = 0;.  }.
136a0 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
136b0 30 20 29 3b 0a 20 20 2f 2a 20 69 43 6f 6c 20 6d  0 );.  /* iCol m
136c0 75 73 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e  ust be less than
136d0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
136e0 72 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61 6e  r.  Otherwise an
136f0 20 65 72 72 6f 72 20 77 6f 75 6c 64 0a 20 20 2a   error would.  *
13700 2a 20 68 61 76 65 20 62 65 65 6e 20 74 68 72 6f  * have been thro
13710 77 6e 20 64 75 72 69 6e 67 20 6e 61 6d 65 20 72  wn during name r
13720 65 73 6f 6c 75 74 69 6f 6e 20 61 6e 64 20 77 65  esolution and we
13730 20 77 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20   would not have 
13740 67 6f 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73  gotten.  ** this
13750 20 66 61 72 20 2a 2f 0a 20 20 69 66 28 20 70 52   far */.  if( pR
13760 65 74 3d 3d 30 20 26 26 20 41 4c 57 41 59 53 28  et==0 && ALWAYS(
13770 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e  iCol<p->pEList->
13780 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 70 52  nExpr) ){.    pR
13790 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
137a0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
137b0 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  p->pEList->a[iCo
137c0 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20  l].pExpr);.  }. 
137d0 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
137e0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63  ./*.** The selec
137f0 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  t statement pass
13800 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
13810 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
13820 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a  compound SELECT.
13830 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52  ** with an ORDER
13840 20 42 59 20 63 6c 61 75 73 65 2e 20 54 68 69 73   BY clause. This
13850 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
13860 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20  tes and returns 
13870 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73 74 72  a KeyInfo.** str
13880 75 63 74 75 72 65 20 73 75 69 74 61 62 6c 65 20  ucture suitable 
13890 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67  for implementing
138a0 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a   the ORDER BY..*
138b0 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
138c0 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ld the KeyInfo s
138d0 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61  tructure is obta
138e0 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
138f0 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  . The calling.**
13900 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73   function is res
13910 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73  ponsible for ens
13920 75 72 69 6e 67 20 74 68 61 74 20 74 68 69 73 20  uring that this 
13930 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65  structure is eve
13940 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64  ntually.** freed
13950 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49  ..*/.static KeyI
13960 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74  nfo *multiSelect
13970 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 50  OrderByKeyInfo(P
13980 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
13990 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 6e 45 78  lect *p, int nEx
139a0 74 72 61 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  tra){.  ExprList
139b0 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e   *pOrderBy = p->
139c0 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20  pOrderBy;.  int 
139d0 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  nOrderBy = p->pO
139e0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
139f0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
13a00 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79  Parse->db;.  Key
13a10 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20 73 71 6c  Info *pRet = sql
13a20 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
13a30 28 64 62 2c 20 6e 4f 72 64 65 72 42 79 2b 6e 45  (db, nOrderBy+nE
13a40 78 74 72 61 2c 20 31 29 3b 0a 20 20 69 66 28 20  xtra, 1);.  if( 
13a50 70 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  pRet ){.    int 
13a60 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
13a70 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
13a80 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  {.      struct E
13a90 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
13aa0 74 65 6d 20 3d 20 26 70 4f 72 64 65 72 42 79 2d  tem = &pOrderBy-
13ab0 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 45 78 70  >a[i];.      Exp
13ac0 72 20 2a 70 54 65 72 6d 20 3d 20 70 49 74 65 6d  r *pTerm = pItem
13ad0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 43  ->pExpr;.      C
13ae0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a  ollSeq *pColl;..
13af0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
13b00 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
13b10 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ate ){.        p
13b20 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
13b30 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
13b40 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
13b50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
13b60 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
13b70 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
13b80 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  , p, pItem->u.x.
13b90 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 29 3b 0a  iOrderByCol-1);.
13ba0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
13bb0 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64  l==0 ) pColl = d
13bc0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
13bd0 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
13be0 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20  a[i].pExpr =.   
13bf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
13c00 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69  prAddCollateStri
13c10 6e 67 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  ng(pParse, pTerm
13c20 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
13c30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
13c40 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
13c50 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
13c60 28 70 52 65 74 29 20 29 3b 0a 20 20 20 20 20 20  (pRet) );.      
13c70 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  pRet->aColl[i] =
13c80 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 52   pColl;.      pR
13c90 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  et->aSortOrder[i
13ca0 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ] = pOrderBy->a[
13cb0 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
13cc0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
13cd0 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64  n pRet;.}..#ifnd
13ce0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
13cf0 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  TE./*.** This ro
13d00 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
13d10 56 44 42 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d  VDBE code to com
13d20 70 75 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  pute the content
13d30 20 6f 66 20 61 20 57 49 54 48 20 52 45 43 55 52   of a WITH RECUR
13d40 53 49 56 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66  SIVE.** query of
13d50 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
13d60 20 20 20 3c 72 65 63 75 72 73 69 76 65 2d 74 61     <recursive-ta
13d70 62 6c 65 3e 20 41 53 20 28 3c 73 65 74 75 70 2d  ble> AS (<setup-
13d80 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c  query> UNION [AL
13d90 4c 5d 20 3c 72 65 63 75 72 73 69 76 65 2d 71 75  L] <recursive-qu
13da0 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20 20 20 20  ery>).**        
13db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13dc0 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20   \___________/  
13dd0 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
13de0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20  ___________/.** 
13df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e00 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
13e10 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ior             
13e20 20 20 20 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a           p.**.**
13e30 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 65 78 61  .** There is exa
13e40 63 74 6c 79 20 6f 6e 65 20 72 65 66 65 72 65 6e  ctly one referen
13e50 63 65 20 74 6f 20 74 68 65 20 72 65 63 75 72 73  ce to the recurs
13e60 69 76 65 2d 74 61 62 6c 65 20 69 6e 20 74 68 65  ive-table in the
13e70 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20   FROM clause.** 
13e80 6f 66 20 72 65 63 75 72 73 69 76 65 2d 71 75 65  of recursive-que
13e90 72 79 2c 20 6d 61 72 6b 65 64 20 77 69 74 68 20  ry, marked with 
13ea0 74 68 65 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d  the SrcList->a[]
13eb0 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20  .fg.isRecursive 
13ec0 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  flag..**.** The 
13ed0 73 65 74 75 70 2d 71 75 65 72 79 20 72 75 6e 73  setup-query runs
13ee0 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72 61 74   once to generat
13ef0 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 73 65 74  e an initial set
13f00 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 67 6f   of rows that go
13f10 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65 75 65  .** into a Queue
13f20 20 74 61 62 6c 65 2e 20 20 52 6f 77 73 20 61 72   table.  Rows ar
13f30 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
13f40 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
13f50 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20   one by.** one. 
13f60 20 45 61 63 68 20 72 6f 77 20 65 78 74 72 61 63   Each row extrac
13f70 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 20 69  ted from Queue i
13f80 73 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73  s output to pDes
13f90 74 2e 20 20 54 68 65 6e 20 74 68 65 20 73 69 6e  t.  Then the sin
13fa0 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74 65 64  gle.** extracted
13fb0 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74 68 65   row (now in the
13fc0 20 69 43 75 72 72 65 6e 74 20 74 61 62 6c 65 29   iCurrent table)
13fd0 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e   becomes the con
13fe0 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72  tent of the.** r
13ff0 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 66  ecursive-table f
14000 6f 72 20 61 20 72 65 63 75 72 73 69 76 65 2d 71  or a recursive-q
14010 75 65 72 79 20 72 75 6e 2e 20 20 54 68 65 20 6f  uery run.  The o
14020 75 74 70 75 74 20 6f 66 20 74 68 65 20 72 65 63  utput of the rec
14030 75 72 73 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20  ursive-query.** 
14040 69 73 20 61 64 64 65 64 20 62 61 63 6b 20 69 6e  is added back in
14050 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61 62  to the Queue tab
14060 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74 68 65  le.  Then anothe
14070 72 20 72 6f 77 20 69 73 20 65 78 74 72 61 63 74  r row is extract
14080 65 64 20 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a  ed from Queue.**
14090 20 61 6e 64 20 74 68 65 20 69 74 65 72 61 74 69   and the iterati
140a0 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74  on continues unt
140b0 69 6c 20 74 68 65 20 51 75 65 75 65 20 74 61 62  il the Queue tab
140c0 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a  le is empty..**.
140d0 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 6f 75  ** If the compou
140e0 6e 64 20 71 75 65 72 79 20 6f 70 65 72 61 74 6f  nd query operato
140f0 72 20 69 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20  r is UNION then 
14100 6e 6f 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77  no duplicate row
14110 73 20 61 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e  s are ever.** in
14120 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20  serted into the 
14130 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68  Queue table.  Th
14140 65 20 69 44 69 73 74 69 6e 63 74 20 74 61 62 6c  e iDistinct tabl
14150 65 20 6b 65 65 70 73 20 61 20 63 6f 70 79 20 6f  e keeps a copy o
14160 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68  f all rows.** th
14170 61 74 20 68 61 76 65 20 65 76 65 72 20 62 65 65  at have ever bee
14180 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  n inserted into 
14190 51 75 65 75 65 20 61 6e 64 20 63 61 75 73 65 73  Queue and causes
141a0 20 64 75 70 6c 69 63 61 74 65 73 20 74 6f 20 62   duplicates to b
141b0 65 0a 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20  e.** discarded. 
141c0 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   If the operator
141d0 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74   is UNION ALL, t
141e0 68 65 6e 20 64 75 70 6c 69 63 61 74 65 73 20 61  hen duplicates a
141f0 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a  re allowed..** .
14200 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  ** If the query 
14210 68 61 73 20 61 6e 20 4f 52 44 45 52 20 42 59 2c  has an ORDER BY,
14220 20 74 68 65 6e 20 65 6e 74 72 69 65 73 20 69 6e   then entries in
14230 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
14240 20 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20   are kept in.** 
14250 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 20 61  ORDER BY order a
14260 6e 64 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  nd the first ent
14270 72 79 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ry is extracted 
14280 66 6f 72 20 65 61 63 68 20 63 79 63 6c 65 2e 20  for each cycle. 
14290 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f   Without.** an O
142a0 52 44 45 52 20 42 59 2c 20 74 68 65 20 51 75 65  RDER BY, the Que
142b0 75 65 20 74 61 62 6c 65 20 69 73 20 6a 75 73 74  ue table is just
142c0 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49   a FIFO..**.** I
142d0 66 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  f a LIMIT clause
142e0 20 69 73 20 70 72 6f 76 69 64 65 64 2c 20 74 68   is provided, th
142f0 65 6e 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e  en the iteration
14300 20 73 74 6f 70 73 20 61 66 74 65 72 20 4c 49 4d   stops after LIM
14310 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20  IT rows.** have 
14320 62 65 65 6e 20 6f 75 74 70 75 74 20 74 6f 20 70  been output to p
14330 44 65 73 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f  Dest.  A LIMIT o
14340 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20  f zero means to 
14350 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77 73 20 61  output no rows a
14360 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65  nd a.** negative
14370 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20   LIMIT means to 
14380 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e  output all rows.
14390 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c    If there is al
143a0 73 6f 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61  so an OFFSET cla
143b0 75 73 65 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f  use.** with a po
143c0 73 69 74 69 76 65 20 76 61 6c 75 65 2c 20 74 68  sitive value, th
143d0 65 6e 20 74 68 65 20 66 69 72 73 74 20 4f 46 46  en the first OFF
143e0 53 45 54 20 6f 75 74 70 75 74 73 20 61 72 65 20  SET outputs are 
143f0 64 69 73 63 61 72 64 65 64 20 72 61 74 68 65 72  discarded rather
14400 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67 20 73  .** than being s
14410 65 6e 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54  ent to pDest.  T
14420 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64  he LIMIT count d
14430 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e  oes not begin un
14440 74 69 6c 20 61 66 74 65 72 20 4f 46 46 53 45 54  til after OFFSET
14450 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65 20 62 65  .** rows have be
14460 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73  en skipped..*/.s
14470 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
14480 61 74 65 57 69 74 68 52 65 63 75 72 73 69 76 65  ateWithRecursive
14490 51 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a  Query(.  Parse *
144a0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
144b0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
144c0 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
144d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
144e0 54 68 65 20 72 65 63 75 72 73 69 76 65 20 53 45  The recursive SE
144f0 4c 45 43 54 20 74 6f 20 62 65 20 63 6f 64 65 64  LECT to be coded
14500 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
14510 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
14520 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
14530 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
14540 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
14550 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20  rc = p->pSrc;   
14560 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
14570 6c 61 75 73 65 20 6f 66 20 74 68 65 20 72 65 63  lause of the rec
14580 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a  ursive query */.
14590 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e    int nCol = p->
145a0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20  pEList->nExpr;  
145b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
145c0 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 63 75  umns in the recu
145d0 72 73 69 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20  rsive table */. 
145e0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
145f0 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f  e->pVdbe;      /
14600 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
14610 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63  tatement under c
14620 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
14630 20 53 65 6c 65 63 74 20 2a 70 53 65 74 75 70 20   Select *pSetup 
14640 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f  = p->pPrior;   /
14650 2a 20 54 68 65 20 73 65 74 75 70 20 71 75 65 72  * The setup quer
14660 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  y */.  int addrT
14670 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
14680 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
14690 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  he loop */.  int
146a0 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42   addrCont, addrB
146b0 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f  reak;      /* CO
146c0 4e 54 49 4e 55 45 20 61 6e 64 20 42 52 45 41 4b  NTINUE and BREAK
146d0 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a 20 20   addresses */.  
146e0 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30  int iCurrent = 0
146f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
14700 20 54 68 65 20 43 75 72 72 65 6e 74 20 74 61 62   The Current tab
14710 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43  le */.  int regC
14720 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20  urrent;         
14730 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
14740 72 20 68 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e  r holding Curren
14750 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  t table */.  int
14760 20 69 51 75 65 75 65 3b 20 20 20 20 20 20 20 20   iQueue;        
14770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
14780 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f  e Queue table */
14790 0a 20 20 69 6e 74 20 69 44 69 73 74 69 6e 63 74  .  int iDistinct
147a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
147b0 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20 75 6e   /* To ensure un
147c0 69 71 75 65 20 72 65 73 75 6c 74 73 20 69 66 20  ique results if 
147d0 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65  UNION */.  int e
147e0 44 65 73 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b  Dest = SRT_Fifo;
147f0 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
14800 74 6f 20 77 72 69 74 65 20 74 6f 20 51 75 65 75  to write to Queu
14810 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  e */.  SelectDes
14820 74 20 64 65 73 74 51 75 65 75 65 3b 20 20 20 20  t destQueue;    
14830 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 44 65       /* SelectDe
14840 73 74 20 74 61 72 67 65 74 74 69 6e 67 20 74 68  st targetting th
14850 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f  e Queue table */
14860 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
14870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14880 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
14890 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
148a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148b0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
148c0 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  de */.  ExprList
148d0 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20   *pOrderBy;     
148e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44        /* The ORD
148f0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
14900 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20    Expr *pLimit; 
14910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14920 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49 54 20 61  /* Saved LIMIT a
14930 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69  nd OFFSET */.  i
14940 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20 72 65 67  nt regLimit, reg
14950 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  Offset;      /* 
14960 52 65 67 69 73 74 65 72 73 20 75 73 65 64 20 62  Registers used b
14970 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  y LIMIT and OFFS
14980 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61  ET */..  /* Obta
14990 69 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  in authorization
149a0 20 74 6f 20 64 6f 20 61 20 72 65 63 75 72 73 69   to do a recursi
149b0 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 66  ve query */.  if
149c0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
149d0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
149e0 45 5f 52 45 43 55 52 53 49 56 45 2c 20 30 2c 20  E_RECURSIVE, 0, 
149f0 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  0, 0) ) return;.
14a00 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68  .  /* Process th
14a10 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  e LIMIT and OFFS
14a20 45 54 20 63 6c 61 75 73 65 73 2c 20 69 66 20 74  ET clauses, if t
14a30 68 65 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 61  hey exist */.  a
14a40 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74  ddrBreak = sqlit
14a50 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
14a60 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74  v);.  p->nSelect
14a70 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34  Row = 320;  /* 4
14a80 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f   billion rows */
14a90 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
14aa0 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
14ab0 20 70 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a   p, addrBreak);.
14ac0 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
14ad0 69 6d 69 74 3b 0a 20 20 72 65 67 4c 69 6d 69 74  imit;.  regLimit
14ae0 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20   = p->iLimit;.  
14af0 72 65 67 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69  regOffset = p->i
14b00 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70 4c 69  Offset;.  p->pLi
14b10 6d 69 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 4c  mit = 0;.  p->iL
14b20 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  imit = p->iOffse
14b30 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65 72 42  t = 0;.  pOrderB
14b40 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
14b50 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
14b60 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
14b70 6f 66 20 74 68 65 20 43 75 72 72 65 6e 74 20 74  of the Current t
14b80 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  able */.  for(i=
14b90 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 53 72 63  0; ALWAYS(i<pSrc
14ba0 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b 0a 20  ->nSrc); i++){. 
14bb0 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69     if( pSrc->a[i
14bc0 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65  ].fg.isRecursive
14bd0 20 29 7b 0a 20 20 20 20 20 20 69 43 75 72 72 65   ){.      iCurre
14be0 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e  nt = pSrc->a[i].
14bf0 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 62  iCursor;.      b
14c00 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
14c10 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63  .  /* Allocate c
14c20 75 72 73 6f 72 73 20 6e 75 6d 62 65 72 73 20 66  ursors numbers f
14c30 6f 72 20 51 75 65 75 65 20 61 6e 64 20 44 69 73  or Queue and Dis
14c40 74 69 6e 63 74 2e 20 20 54 68 65 20 63 75 72 73  tinct.  The curs
14c50 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20 20  or number for.  
14c60 2a 2a 20 74 68 65 20 44 69 73 74 69 6e 63 74 20  ** the Distinct 
14c70 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 65 78  table must be ex
14c80 61 63 74 6c 79 20 6f 6e 65 20 67 72 65 61 74 65  actly one greate
14c90 72 20 74 68 61 6e 20 51 75 65 75 65 20 69 6e 20  r than Queue in 
14ca0 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74  order.  ** for t
14cb0 68 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 20  he SRT_DistFifo 
14cc0 61 6e 64 20 53 52 54 5f 44 69 73 74 51 75 65 75  and SRT_DistQueu
14cd0 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 20 74  e destinations t
14ce0 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51 75  o work. */.  iQu
14cf0 65 75 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  eue = pParse->nT
14d00 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6f  ab++;.  if( p->o
14d10 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
14d20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65     eDest = pOrde
14d30 72 42 79 20 3f 20 53 52 54 5f 44 69 73 74 51 75  rBy ? SRT_DistQu
14d40 65 75 65 20 3a 20 53 52 54 5f 44 69 73 74 46 69  eue : SRT_DistFi
14d50 66 6f 3b 0a 20 20 20 20 69 44 69 73 74 69 6e 63  fo;.    iDistinc
14d60 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
14d70 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
14d80 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42   eDest = pOrderB
14d90 79 20 3f 20 53 52 54 5f 51 75 65 75 65 20 3a 20  y ? SRT_Queue : 
14da0 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20 20  SRT_Fifo;.  }.  
14db0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
14dc0 74 49 6e 69 74 28 26 64 65 73 74 51 75 65 75 65  tInit(&destQueue
14dd0 2c 20 65 44 65 73 74 2c 20 69 51 75 65 75 65 29  , eDest, iQueue)
14de0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
14df0 20 63 75 72 73 6f 72 73 20 66 6f 72 20 43 75 72   cursors for Cur
14e00 72 65 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e 64  rent, Queue, and
14e10 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20 20   Distinct. */.  
14e20 72 65 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b 70  regCurrent = ++p
14e30 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73  Parse->nMem;.  s
14e40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
14e50 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
14e60 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20 72 65 67  o, iCurrent, reg
14e70 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b 0a  Current, nCol);.
14e80 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
14e90 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  {.    KeyInfo *p
14ea0 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74 69 53  KeyInfo = multiS
14eb0 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49  electOrderByKeyI
14ec0 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31  nfo(pParse, p, 1
14ed0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14ee0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
14ef0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51  penEphemeral, iQ
14f00 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  ueue, pOrderBy->
14f10 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20  nExpr+2, 0,.    
14f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f30 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
14f40 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
14f50 20 20 20 20 64 65 73 74 51 75 65 75 65 2e 70 4f      destQueue.pO
14f60 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
14f70 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
14f80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14f90 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
14fa0 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 6e  meral, iQueue, n
14fb0 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62 65  Col);.  }.  Vdbe
14fc0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75 65  Comment((v, "Que
14fd0 75 65 20 74 61 62 6c 65 22 29 29 3b 0a 20 20 69  ue table"));.  i
14fe0 66 28 20 69 44 69 73 74 69 6e 63 74 20 29 7b 0a  f( iDistinct ){.
14ff0 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
15000 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  phm[0] = sqlite3
15010 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15020 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
15030 69 44 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20  iDistinct, 0);. 
15040 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c     p->selFlags |
15050 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72  = SF_UsesEphemer
15060 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65  al;.  }..  /* De
15070 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42  tach the ORDER B
15080 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68  Y clause from th
15090 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  e compound SELEC
150a0 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72  T */.  p->pOrder
150b0 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 74  By = 0;..  /* St
150c0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
150d0 6f 66 20 74 68 65 20 73 65 74 75 70 2d 71 75 65  of the setup-que
150e0 72 79 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f 0a  ry in Queue. */.
150f0 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20    pSetup->pNext 
15100 3d 20 30 3b 0a 20 20 45 78 70 6c 61 69 6e 51 75  = 0;.  ExplainQu
15110 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
15120 20 31 2c 20 22 53 45 54 55 50 22 29 29 3b 0a 20   1, "SETUP"));. 
15130 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
15140 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 74  ect(pParse, pSet
15150 75 70 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b  up, &destQueue);
15160 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74  .  pSetup->pNext
15170 20 3d 20 70 3b 0a 20 20 69 66 28 20 72 63 20 29   = p;.  if( rc )
15180 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72 65 63   goto end_of_rec
15190 75 72 73 69 76 65 5f 71 75 65 72 79 3b 0a 0a 20  ursive_query;.. 
151a0 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 65 78   /* Find the nex
151b0 74 20 72 6f 77 20 69 6e 20 74 68 65 20 51 75 65  t row in the Que
151c0 75 65 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68  ue and output th
151d0 61 74 20 72 6f 77 20 2a 2f 0a 20 20 61 64 64 72  at row */.  addr
151e0 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
151f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
15200 77 69 6e 64 2c 20 69 51 75 65 75 65 2c 20 61 64  wind, iQueue, ad
15210 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f  drBreak); VdbeCo
15220 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a  verage(v);..  /*
15230 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 6e 65   Transfer the ne
15240 78 74 20 72 6f 77 20 69 6e 20 51 75 65 75 65 20  xt row in Queue 
15250 6f 76 65 72 20 74 6f 20 43 75 72 72 65 6e 74 20  over to Current 
15260 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
15270 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp1(v, OP_Nul
15280 6c 52 6f 77 2c 20 69 43 75 72 72 65 6e 74 29 3b  lRow, iCurrent);
15290 20 2f 2a 20 54 6f 20 72 65 73 65 74 20 63 6f 6c   /* To reset col
152a0 75 6d 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 69  umn cache */.  i
152b0 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
152c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
152d0 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
152e0 6e 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65  n, iQueue, pOrde
152f0 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65  rBy->nExpr+1, re
15300 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 65 6c  gCurrent);.  }el
15310 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
15320 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15330 52 6f 77 44 61 74 61 2c 20 69 51 75 65 75 65 2c  RowData, iQueue,
15340 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20   regCurrent);.  
15350 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
15360 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65  ddOp1(v, OP_Dele
15370 74 65 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20  te, iQueue);..  
15380 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 73 69  /* Output the si
15390 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72  ngle row in Curr
153a0 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 43 6f 6e  ent */.  addrCon
153b0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
153c0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63  akeLabel(v);.  c
153d0 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 72 65 67  odeOffset(v, reg
153e0 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74  Offset, addrCont
153f0 29 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72  );.  selectInner
15400 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
15410 69 43 75 72 72 65 6e 74 2c 0a 20 20 20 20 20 20  iCurrent,.      
15420 30 2c 20 30 2c 20 70 44 65 73 74 2c 20 61 64 64  0, 0, pDest, add
15430 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61 6b  rCont, addrBreak
15440 29 3b 0a 20 20 69 66 28 20 72 65 67 4c 69 6d 69  );.  if( regLimi
15450 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
15460 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15470 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 72  _DecrJumpZero, r
15480 65 67 4c 69 6d 69 74 2c 20 61 64 64 72 42 72 65  egLimit, addrBre
15490 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ak);.    VdbeCov
154a0 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20  erage(v);.  }.  
154b0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
154c0 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43  veLabel(v, addrC
154d0 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20 45 78 65 63  ont);..  /* Exec
154e0 75 74 65 20 74 68 65 20 72 65 63 75 72 73 69 76  ute the recursiv
154f0 65 20 53 45 4c 45 43 54 20 74 61 6b 69 6e 67 20  e SELECT taking 
15500 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69  the single row i
15510 6e 20 43 75 72 72 65 6e 74 20 61 73 0a 20 20 2a  n Current as.  *
15520 2a 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  * the value for 
15530 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 74 61  the recursive-ta
15540 62 6c 65 2e 20 53 74 6f 72 65 20 74 68 65 20 72  ble. Store the r
15550 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 51 75  esults in the Qu
15560 65 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  eue..  */.  if( 
15570 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
15580 5f 41 67 67 72 65 67 61 74 65 20 29 7b 0a 20 20  _Aggregate ){.  
15590 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
155a0 67 28 70 50 61 72 73 65 2c 20 22 72 65 63 75 72  g(pParse, "recur
155b0 73 69 76 65 20 61 67 67 72 65 67 61 74 65 20 71  sive aggregate q
155c0 75 65 72 69 65 73 20 6e 6f 74 20 73 75 70 70 6f  ueries not suppo
155d0 72 74 65 64 22 29 3b 0a 20 20 7d 65 6c 73 65 7b  rted");.  }else{
155e0 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
155f0 20 30 3b 0a 20 20 20 20 45 78 70 6c 61 69 6e 51   0;.    ExplainQ
15600 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
15610 2c 20 31 2c 20 22 52 45 43 55 52 53 49 56 45 20  , 1, "RECURSIVE 
15620 53 54 45 50 22 29 29 3b 0a 20 20 20 20 73 71 6c  STEP"));.    sql
15630 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
15640 65 2c 20 70 2c 20 26 64 65 73 74 51 75 65 75 65  e, p, &destQueue
15650 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
15660 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20  ->pPrior==0 );. 
15670 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
15680 53 65 74 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Setup;.  }..  /*
15690 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20 74 68   Keep running th
156a0 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68 65  e loop until the
156b0 20 51 75 65 75 65 20 69 73 20 65 6d 70 74 79 20   Queue is empty 
156c0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
156d0 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f 70 29  Goto(v, addrTop)
156e0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
156f0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
15700 64 64 72 42 72 65 61 6b 29 3b 0a 0a 65 6e 64 5f  ddrBreak);..end_
15710 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65  of_recursive_que
15720 72 79 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70  ry:.  sqlite3Exp
15730 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  rListDelete(pPar
15740 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65  se->db, p->pOrde
15750 72 42 79 29 3b 0a 20 20 70 2d 3e 70 4f 72 64 65  rBy);.  p->pOrde
15760 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
15770 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
15780 69 6d 69 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  imit;.  return;.
15790 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
157a0 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a  TE_OMIT_CTE */..
157b0 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
157c0 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69 63 20  ences */.static 
157d0 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  int multiSelectO
157e0 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
157f0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
15800 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
15810 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
15820 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
15830 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
15840 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
15850 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
15860 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
15870 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
15880 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
15890 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ts */.);../*.** 
158a0 48 61 6e 64 6c 65 20 74 68 65 20 73 70 65 63 69  Handle the speci
158b0 61 6c 20 63 61 73 65 20 6f 66 20 61 20 63 6f 6d  al case of a com
158c0 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61  pound-select tha
158d0 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f  t originates fro
158e0 6d 20 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63 6c  m a.** VALUES cl
158f0 61 75 73 65 2e 20 20 42 79 20 68 61 6e 64 6c 69  ause.  By handli
15900 6e 67 20 74 68 69 73 20 61 73 20 61 20 73 70 65  ng this as a spe
15910 63 69 61 6c 20 63 61 73 65 2c 20 77 65 20 61 76  cial case, we av
15920 6f 69 64 20 64 65 65 70 0a 2a 2a 20 72 65 63 75  oid deep.** recu
15930 72 73 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73 20  rsion, and thus 
15940 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 65  do not need to e
15950 6e 66 6f 72 63 65 20 74 68 65 20 53 51 4c 49 54  nforce the SQLIT
15960 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  E_LIMIT_COMPOUND
15970 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61 20  _SELECT.** on a 
15980 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 2a  VALUES clause..*
15990 2a 0a 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65  *.** Because the
159a0 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 6f   Select object o
159b0 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61  riginates from a
159c0 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 3a 0a   VALUES clause:.
159d0 2a 2a 20 20 20 28 31 29 20 54 68 65 72 65 20 69  **   (1) There i
159e0 73 20 6e 6f 20 4c 49 4d 49 54 20 6f 72 20 4f 46  s no LIMIT or OF
159f0 46 53 45 54 20 6f 72 20 65 6c 73 65 20 74 68 65  FSET or else the
15a00 72 65 20 69 73 20 61 20 4c 49 4d 49 54 20 6f 66  re is a LIMIT of
15a10 20 65 78 61 63 74 6c 79 20 31 0a 2a 2a 20 20 20   exactly 1.**   
15a20 28 32 29 20 41 6c 6c 20 74 65 72 6d 73 20 61 72  (2) All terms ar
15a30 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a 20 20  e UNION ALL.**  
15a40 20 28 33 29 20 54 68 65 72 65 20 69 73 20 6e 6f   (3) There is no
15a50 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
15a60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 4c 49 4d 49  .**.** The "LIMI
15a70 54 20 6f 66 20 65 78 61 63 74 6c 79 20 31 22 20  T of exactly 1" 
15a80 63 61 73 65 20 6f 66 20 63 6f 6e 64 69 74 69 6f  case of conditio
15a90 6e 20 28 31 29 20 63 6f 6d 65 73 20 61 62 6f 75  n (1) comes abou
15aa0 74 20 77 68 65 6e 20 61 20 56 41 4c 55 45 53 0a  t when a VALUES.
15ab0 2a 2a 20 63 6c 61 75 73 65 20 6f 63 63 75 72 73  ** clause occurs
15ac0 20 77 69 74 68 69 6e 20 73 63 61 6c 61 72 20 65   within scalar e
15ad0 78 70 72 65 73 73 69 6f 6e 20 28 65 78 3a 20 22  xpression (ex: "
15ae0 53 45 4c 45 43 54 20 28 56 41 4c 55 45 53 28 31  SELECT (VALUES(1
15af0 29 2c 28 32 29 2c 28 33 29 29 22 29 2e 0a 2a 2a  ),(2),(3))")..**
15b00 20 54 68 65 20 73 71 6c 69 74 65 33 43 6f 64 65   The sqlite3Code
15b10 53 75 62 73 65 6c 65 63 74 20 77 69 6c 6c 20 68  Subselect will h
15b20 61 76 65 20 61 64 64 65 64 20 74 68 65 20 4c 49  ave added the LI
15b30 4d 49 54 20 31 20 63 6c 61 75 73 65 20 69 6e 20  MIT 1 clause in 
15b40 74 68 74 20 63 61 73 65 2e 0a 2a 2a 20 53 69 6e  tht case..** Sin
15b50 63 65 20 74 68 65 20 6c 69 6d 69 74 20 69 73 20  ce the limit is 
15b60 65 78 61 63 74 6c 79 20 31 2c 20 77 65 20 6f 6e  exactly 1, we on
15b70 6c 79 20 6e 65 65 64 20 74 6f 20 65 76 61 6c 75  ly need to evalu
15b80 74 65 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  tes the left-mos
15b90 74 20 56 41 4c 55 45 53 2e 0a 2a 2f 0a 73 74 61  t VALUES..*/.sta
15ba0 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
15bb0 65 63 74 56 61 6c 75 65 73 28 0a 20 20 50 61 72  ectValues(.  Par
15bc0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
15bd0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
15be0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
15bf0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
15c00 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
15c10 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
15c20 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
15c30 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
15c40 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
15c50 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
15c60 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
15c70 74 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 69 6e  t nRow = 1;.  in
15c80 74 20 72 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t rc = 0;.  int 
15c90 62 53 68 6f 77 41 6c 6c 20 3d 20 70 2d 3e 70 4c  bShowAll = p->pL
15ca0 69 6d 69 74 3d 3d 30 3b 0a 20 20 61 73 73 65 72  imit==0;.  asser
15cb0 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  t( p->selFlags &
15cc0 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29   SF_MultiValue )
15cd0 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73 73 65  ;.  do{.    asse
15ce0 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
15cf0 26 20 53 46 5f 56 61 6c 75 65 73 20 29 3b 0a 20  & SF_Values );. 
15d00 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
15d10 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e  ==TK_ALL || (p->
15d20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26  op==TK_SELECT &&
15d30 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 29 20 29   p->pPrior==0) )
15d40 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
15d50 3e 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 2d 3e  >pNext==0 || p->
15d60 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70  pEList->nExpr==p
15d70 2d 3e 70 4e 65 78 74 2d 3e 70 45 4c 69 73 74 2d  ->pNext->pEList-
15d80 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 69 66  >nExpr );.    if
15d90 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
15da0 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65   break;.    asse
15db0 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 2d 3e 70  rt( p->pPrior->p
15dc0 4e 65 78 74 3d 3d 70 20 29 3b 0a 20 20 20 20 70  Next==p );.    p
15dd0 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
15de0 20 20 6e 52 6f 77 20 2b 3d 20 62 53 68 6f 77 41    nRow += bShowA
15df0 6c 6c 3b 0a 20 20 7d 77 68 69 6c 65 28 31 29 3b  ll;.  }while(1);
15e00 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50  .  ExplainQueryP
15e10 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c 20  lan((pParse, 0, 
15e20 22 53 43 41 4e 20 25 64 20 43 4f 4e 53 54 41 4e  "SCAN %d CONSTAN
15e30 54 20 52 4f 57 25 73 22 2c 20 6e 52 6f 77 2c 0a  T ROW%s", nRow,.
15e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e50 20 20 20 20 6e 52 6f 77 3d 3d 31 20 3f 20 22 22      nRow==1 ? ""
15e60 20 3a 20 22 53 22 29 29 3b 0a 20 20 77 68 69 6c   : "S"));.  whil
15e70 65 28 20 70 20 29 7b 0a 20 20 20 20 73 65 6c 65  e( p ){.    sele
15e80 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
15e90 73 65 2c 20 70 2c 20 2d 31 2c 20 30 2c 20 30 2c  se, p, -1, 0, 0,
15ea0 20 70 44 65 73 74 2c 20 31 2c 20 31 29 3b 0a 20   pDest, 1, 1);. 
15eb0 20 20 20 69 66 28 20 21 62 53 68 6f 77 41 6c 6c     if( !bShowAll
15ec0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 2d   ) break;.    p-
15ed0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 52  >nSelectRow = nR
15ee0 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  ow;.    p = p->p
15ef0 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Next;.  }.  retu
15f00 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
15f10 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
15f20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73  called to proces
15f30 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  s a compound que
15f40 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20  ry form from.** 
15f50 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  two or more sepa
15f60 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73 69  rate queries usi
15f70 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20  ng UNION, UNION 
15f80 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a  ALL, EXCEPT, or.
15f90 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a  ** INTERSECT.**.
15fa0 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f  ** "p" points to
15fb0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
15fc0 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69  of the two queri
15fd0 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f  es.  the query o
15fe0 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73  n the.** left is
15ff0 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65   p->pPrior.  The
16000 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c   left query coul
16010 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70  d also be a comp
16020 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e  ound query.** in
16030 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73   which case this
16040 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
16050 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
16060 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ely. .**.** The 
16070 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74  results of the t
16080 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74  otal query are t
16090 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
160a0 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  o a destination.
160b0 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74  ** of type eDest
160c0 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20   with parameter 
160d0 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  iParm..**.** Exa
160e0 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65  mple 1:  Conside
160f0 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f  r a three-way co
16100 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65  mpound SQL state
16110 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment..**.**     
16120 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
16130 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20   UNION SELECT b 
16140 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45  FROM t2 UNION SE
16150 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
16160 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d  *.** This statem
16170 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70  ent is parsed up
16180 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
16190 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20  **     SELECT c 
161a0 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20  FROM t3.**      
161b0 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d  |.**      `-----
161c0 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  >  SELECT b FROM
161d0 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   t2.**          
161e0 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
161f0 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d            `-----
16200 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f  ->  SELECT a FRO
16210 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  M t1.**.** The a
16220 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61  rrows in the dia
16230 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65  gram above repre
16240 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e  sent the Select.
16250 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a  pPrior pointer..
16260 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  ** So if this ro
16270 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
16280 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20  with p equal to 
16290 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68  the t3 query, th
162a0 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c  en.** pPrior wil
162b0 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72  l be the t2 quer
162c0 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62  y.  p->op will b
162d0 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68  e TK_UNION in th
162e0 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e  is case..**.** N
162f0 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75  otice that becau
16300 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51  se of the way SQ
16310 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70  Lite parses comp
16320 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68  ound SELECTs, th
16330 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
16340 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67  selects always g
16350 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74  roup from left t
16360 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74  o right..*/.stat
16370 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
16380 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
16390 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
163a0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
163b0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
163c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
163d0 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
163e0 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
163f0 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
16400 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
16410 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
16420 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
16430 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
16440 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20  SQLITE_OK;   /* 
16450 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f  Success code fro
16460 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  m a subroutine *
16470 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
16480 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
16490 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
164a0 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
164b0 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
164c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
164d0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
164e0 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
164f0 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
16500 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72  t;      /* Alter
16510 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73 74  native data dest
16520 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  ination */.  Sel
16530 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30  ect *pDelete = 0
16540 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73  ;  /* Chain of s
16550 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f  imple selects to
16560 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c   delete */.  sql
16570 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
16580 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
16590 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  onnection */..  
165a0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
165b0 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
165c0 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73  Y or LIMIT claus
165d0 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43  e on prior SELEC
165e0 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74  Ts.  Only.  ** t
165f0 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d  he last (right-m
16600 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74  ost) SELECT in t
16610 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61  he series may ha
16620 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  ve an ORDER BY o
16630 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20  r LIMIT..  */.  
16640 61 73 73 65 72 74 28 20 70 20 26 26 20 70 2d 3e  assert( p && p->
16650 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43 61  pPrior );  /* Ca
16660 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 67  lling function g
16670 75 61 72 61 6e 74 65 65 73 20 74 68 69 73 20 6d  uarantees this m
16680 75 63 68 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  uch */.  assert(
16690 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
166a0 53 46 5f 52 65 63 75 72 73 69 76 65 29 3d 3d 30  SF_Recursive)==0
166b0 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c   || p->op==TK_AL
166c0 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  L || p->op==TK_U
166d0 4e 49 4f 4e 20 29 3b 0a 20 20 64 62 20 3d 20 70  NION );.  db = p
166e0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72  Parse->db;.  pPr
166f0 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
16700 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74  .  dest = *pDest
16710 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  ;.  if( pPrior->
16720 70 4f 72 64 65 72 42 79 20 7c 7c 20 70 50 72 69  pOrderBy || pPri
16730 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  or->pLimit ){.  
16740 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
16750 67 28 70 50 61 72 73 65 2c 22 25 73 20 63 6c 61  g(pParse,"%s cla
16760 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20  use should come 
16770 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66  after %s not bef
16780 6f 72 65 22 2c 0a 20 20 20 20 20 20 70 50 72 69  ore",.      pPri
16790 6f 72 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20  or->pOrderBy!=0 
167a0 3f 20 22 4f 52 44 45 52 20 42 59 22 20 3a 20 22  ? "ORDER BY" : "
167b0 4c 49 4d 49 54 22 2c 20 73 65 6c 65 63 74 4f 70  LIMIT", selectOp
167c0 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
167d0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
167e0 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
167f0 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20  end;.  }..  v = 
16800 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
16810 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
16820 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68  ( v!=0 );  /* Th
16830 65 20 56 44 42 45 20 61 6c 72 65 61 64 79 20 63  e VDBE already c
16840 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c 69 6e  reated by callin
16850 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20  g function */.. 
16860 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 64   /* Create the d
16870 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f  estination tempo
16880 72 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65  rary table if ne
16890 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69  cessary.  */.  i
168a0 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53  f( dest.eDest==S
168b0 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20  RT_EphemTab ){. 
168c0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
168d0 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c 69  List );.    sqli
168e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
168f0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
16900 6c 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c  l, dest.iSDParm,
16910 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
16920 72 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65  r);.    dest.eDe
16930 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a  st = SRT_Table;.
16940 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61    }..  /* Specia
16950 6c 20 68 61 6e 64 6c 69 6e 67 20 66 6f 72 20 61  l handling for a
16960 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74   compound-select
16970 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73   that originates
16980 20 61 73 20 61 20 56 41 4c 55 45 53 20 63 6c 61   as a VALUES cla
16990 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  use..  */.  if( 
169a0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
169b0 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29 7b 0a 20  _MultiValue ){. 
169c0 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c     rc = multiSel
169d0 65 63 74 56 61 6c 75 65 73 28 70 50 61 72 73 65  ectValues(pParse
169e0 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  , p, &dest);.   
169f0 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
16a00 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
16a10 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
16a20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73  SELECTs in the s
16a30 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68  tatement have th
16a40 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
16a50 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69   elements.  ** i
16a60 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20 73  n their result s
16a70 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ets..  */.  asse
16a80 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26  rt( p->pEList &&
16a90 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20   pPrior->pEList 
16aa0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
16ab0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70  pEList->nExpr==p
16ac0 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e  Prior->pEList->n
16ad0 45 78 70 72 20 29 3b 0a 0a 23 69 66 6e 64 65 66  Expr );..#ifndef
16ae0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
16af0 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
16b00 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
16b10 65 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  e ){.    generat
16b20 65 57 69 74 68 52 65 63 75 72 73 69 76 65 51 75  eWithRecursiveQu
16b30 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ery(pParse, p, &
16b40 64 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  dest);.  }else.#
16b50 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70  endif..  /* Comp
16b60 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74 68 61  ound SELECTs tha
16b70 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  t have an ORDER 
16b80 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 68 61  BY clause are ha
16b90 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79  ndled separately
16ba0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
16bb0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
16bc0 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65  return multiSele
16bd0 63 74 4f 72 64 65 72 42 79 28 70 50 61 72 73 65  ctOrderBy(pParse
16be0 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d  , p, pDest);.  }
16bf0 65 6c 73 65 7b 0a 0a 23 69 66 6e 64 65 66 20 53  else{..#ifndef S
16c00 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
16c10 49 4e 0a 20 20 20 20 69 66 28 20 70 50 72 69 6f  IN.    if( pPrio
16c20 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a  r->pPrior==0 ){.
16c30 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65        ExplainQue
16c40 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
16c50 31 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 51 55 45  1, "COMPOUND QUE
16c60 52 59 22 29 29 3b 0a 20 20 20 20 20 20 45 78 70  RY"));.      Exp
16c70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70  lainQueryPlan((p
16c80 50 61 72 73 65 2c 20 31 2c 20 22 4c 45 46 54 2d  Parse, 1, "LEFT-
16c90 4d 4f 53 54 20 53 55 42 51 55 45 52 59 22 29 29  MOST SUBQUERY"))
16ca0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
16cb0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
16cc0 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66  code for the lef
16cd0 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45  t and right SELE
16ce0 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  CT statements.. 
16cf0 20 20 20 2a 2f 0a 20 20 20 20 73 77 69 74 63 68     */.    switch
16d00 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20  ( p->op ){.     
16d10 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a   case TK_ALL: {.
16d20 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
16d30 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
16d40 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  t nLimit;.      
16d50 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f    assert( !pPrio
16d60 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20  r->pLimit );.   
16d70 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69       pPrior->iLi
16d80 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b  mit = p->iLimit;
16d90 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d  .        pPrior-
16da0 3e 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f  >iOffset = p->iO
16db0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 70  ffset;.        p
16dc0 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20  Prior->pLimit = 
16dd0 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
16de0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
16df0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
16e00 72 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20 20  rior, &dest);.  
16e10 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
16e20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
16e30 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
16e40 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
16e50 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
16e60 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72  }.        p->pPr
16e70 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ior = 0;.       
16e80 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72   p->iLimit = pPr
16e90 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20  ior->iLimit;.   
16ea0 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20       p->iOffset 
16eb0 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65  = pPrior->iOffse
16ec0 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  t;.        if( p
16ed0 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
16ee0 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
16ef0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
16f00 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 70 2d 3e 69  , OP_IfNot, p->i
16f10 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65  Limit); VdbeCove
16f20 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
16f30 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
16f40 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20 69  v, "Jump ahead i
16f50 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22  f LIMIT reached"
16f60 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ));.          if
16f70 28 20 70 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a  ( p->iOffset ){.
16f80 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
16f90 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
16fa0 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c   OP_OffsetLimit,
16fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
16fd0 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e 69 4f 66  ->iLimit, p->iOf
16fe0 66 73 65 74 2b 31 2c 20 70 2d 3e 69 4f 66 66 73  fset+1, p->iOffs
16ff0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  et);.          }
17000 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17010 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50     ExplainQueryP
17020 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20  lan((pParse, 1, 
17030 22 55 4e 49 4f 4e 20 41 4c 4c 22 29 29 3b 0a 20  "UNION ALL"));. 
17040 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
17050 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
17060 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  , p, &dest);.   
17070 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
17080 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
17090 20 20 20 20 20 20 20 20 70 44 65 6c 65 74 65 20          pDelete 
170a0 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
170b0 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
170c0 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20   pPrior;.       
170d0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
170e0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
170f0 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c  d(p->nSelectRow,
17100 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
17110 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Row);.        if
17120 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  ( pPrior->pLimit
17130 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c  .         && sql
17140 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
17150 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  r(pPrior->pLimit
17160 2d 3e 70 4c 65 66 74 2c 20 26 6e 4c 69 6d 69 74  ->pLeft, &nLimit
17170 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 6e 4c  ).         && nL
17180 69 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e 53 65  imit>0 && p->nSe
17190 6c 65 63 74 52 6f 77 20 3e 20 73 71 6c 69 74 65  lectRow > sqlite
171a0 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 4c 69  3LogEst((u64)nLi
171b0 6d 69 74 29 20 0a 20 20 20 20 20 20 20 20 29 7b  mit) .        ){
171c0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 53  .          p->nS
171d0 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
171e0 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 4c  e3LogEst((u64)nL
171f0 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  imit);.        }
17200 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
17210 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  r ){.          s
17220 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
17230 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
17240 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
17250 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
17260 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
17270 50 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20 54  PT:.      case T
17280 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  K_UNION: {.     
17290 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b     int unionTab;
172a0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
172b0 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70  mber of the temp
172c0 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72   table holding r
172d0 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 20  esult */.       
172e0 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20   u8 op = 0;     
172f0 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
17300 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20  SRT_ operations 
17310 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66  to apply to self
17320 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
17330 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20  priorOp;     /* 
17340 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  The SRT_ operati
17350 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70  on to apply to p
17360 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a  rior selects */.
17370 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c          Expr *pL
17380 69 6d 69 74 3b 20 20 20 20 2f 2a 20 53 61 76 65  imit;    /* Save
17390 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e  d values of p->n
173a0 4c 69 6d 69 74 20 20 2a 2f 0a 20 20 20 20 20 20  Limit  */.      
173b0 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
173c0 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 75      SelectDest u
173d0 6e 69 6f 6e 64 65 73 74 3b 0a 20 20 0a 20 20 20  niondest;.  .   
173e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
173f0 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  ->op==TK_EXCEPT 
17400 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
17410 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ase( p->op==TK_U
17420 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  NION );.        
17430 70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e  priorOp = SRT_Un
17440 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ion;.        if(
17450 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69   dest.eDest==pri
17460 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  orOp ){.        
17470 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73    /* We can reus
17480 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  e a temporary ta
17490 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ble generated by
174a0 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72   a SELECT to our
174b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 69  .          ** ri
174c0 67 68 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ght..          *
174d0 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
174e0 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30  rt( p->pLimit==0
174f0 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20   );      /* Not 
17500 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77  allowed on leftw
17510 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a  ard elements */.
17520 20 20 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54            unionT
17530 61 62 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72  ab = dest.iSDPar
17540 6d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  m;.        }else
17550 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
17560 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  e will need to c
17570 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65  reate our own te
17580 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f  mporary table to
17590 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20   hold the.      
175a0 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69      ** intermedi
175b0 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20  ate results..   
175c0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
175d0 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70      unionTab = p
175e0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
175f0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
17600 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
17610 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  );.          add
17620 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
17630 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
17640 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e  Ephemeral, union
17650 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Tab, 0);.       
17660 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
17670 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d  drOpenEphm[0] ==
17680 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20   -1 );.         
17690 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
176a0 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [0] = addr;.    
176b0 20 20 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d        findRightm
176c0 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73  ost(p)->selFlags
176d0 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
176e0 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  eral;.          
176f0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
17700 74 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t );.        }. 
17710 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64   .        /* Cod
17720 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
17730 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c  tements to our l
17740 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  eft.        */. 
17750 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
17760 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
17770 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
17780 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
17790 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72  t(&uniondest, pr
177a0 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29  iorOp, unionTab)
177b0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
177c0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
177d0 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e  rse, pPrior, &un
177e0 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20  iondest);.      
177f0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
17800 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
17810 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
17820 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
17830 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
17840 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61  rrent SELECT sta
17850 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 2a  tement.        *
17860 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  /.        if( p-
17870 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29  >op==TK_EXCEPT )
17880 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 20 3d  {.          op =
17890 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20   SRT_Except;.   
178a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
178b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
178c0 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
178d0 0a 20 20 20 20 20 20 20 20 20 20 6f 70 20 3d 20  .          op = 
178e0 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20  SRT_Union;.     
178f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e     }.        p->
17900 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
17910 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e      pLimit = p->
17920 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  pLimit;.        
17930 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
17940 20 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73 74         uniondest
17950 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20  .eDest = op;.   
17960 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72       ExplainQuer
17970 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31  yPlan((pParse, 1
17980 2c 20 22 25 73 20 55 53 49 4e 47 20 54 45 4d 50  , "%s USING TEMP
17990 20 42 2d 54 52 45 45 22 2c 0a 20 20 20 20 20 20   B-TREE",.      
179a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179b0 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
179c0 28 70 2d 3e 6f 70 29 29 29 3b 0a 20 20 20 20 20  (p->op)));.     
179d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
179e0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
179f0 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20   &uniondest);.  
17a00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17a10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
17a20 0a 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72  .        /* Quer
17a30 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20  y flattening in 
17a40 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20  sqlite3Select() 
17a50 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e  might refill p->
17a60 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20 20  pOrderBy..      
17a70 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20    ** Be sure to 
17a80 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72  delete p->pOrder
17a90 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74  By, therefore, t
17aa0 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79  o avoid a memory
17ab0 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20   leak. */.      
17ac0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
17ad0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
17ae0 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
17af0 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
17b00 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 70  Prior;.        p
17b10 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
17b20 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4f  r;.        p->pO
17b30 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
17b40 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
17b50 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 20  K_UNION ){.     
17b60 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
17b70 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
17b80 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74  stAdd(p->nSelect
17b90 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65  Row, pPrior->nSe
17ba0 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  lectRow);.      
17bb0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
17bc0 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
17bd0 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
17be0 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
17bf0 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = pLimit;.      
17c00 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b    p->iLimit = 0;
17c10 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  .        p->iOff
17c20 73 65 74 20 3d 20 30 3b 0a 20 20 0a 20 20 20 20  set = 0;.  .    
17c30 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74      /* Convert t
17c40 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74  he data in the t
17c50 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
17c60 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72  nto whatever for
17c70 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  m.        ** it 
17c80 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65  is that we curre
17c90 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20  ntly need..     
17ca0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
17cb0 73 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d  sert( unionTab==
17cc0 64 65 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20  dest.iSDParm || 
17cd0 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f  dest.eDest!=prio
17ce0 72 4f 70 20 29 3b 0a 20 20 20 20 20 20 20 20 69  rOp );.        i
17cf0 66 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70  f( dest.eDest!=p
17d00 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20  riorOp ){.      
17d10 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
17d20 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20  Break, iStart;. 
17d30 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
17d40 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
17d50 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d          iBreak =
17d60 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
17d70 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
17d80 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
17d90 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
17da0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  (v);.          c
17db0 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
17dc0 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
17dd0 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
17de0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17df0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
17e00 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72  d, unionTab, iBr
17e10 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
17e20 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
17e30 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
17e40 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
17e50 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  (v);.          s
17e60 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
17e70 50 61 72 73 65 2c 20 70 2c 20 75 6e 69 6f 6e 54  Parse, p, unionT
17e80 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab,.            
17e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
17ea0 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74   0, &dest, iCont
17eb0 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
17ec0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17ed0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
17ee0 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  iCont);.        
17ef0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17f00 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
17f10 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74  unionTab, iStart
17f20 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
17f30 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  v);.          sq
17f40 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
17f50 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29  Label(v, iBreak)
17f60 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
17f70 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17f80 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e   OP_Close, union
17f90 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Tab, 0);.       
17fa0 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
17fb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17fc0 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28  default: assert(
17fd0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52   p->op==TK_INTER
17fe0 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20  SECT ); {.      
17ff0 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32    int tab1, tab2
18000 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  ;.        int iC
18010 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
18020 61 72 74 3b 0a 20 20 20 20 20 20 20 20 45 78 70  art;.        Exp
18030 72 20 2a 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  r *pLimit;.     
18040 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
18050 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
18060 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a 20  intersectdest;. 
18070 20 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20         int r1;. 
18080 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 54   .        /* INT
18090 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65 72  ERSECT is differ
180a0 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68  ent from the oth
180b0 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65 71  ers since it req
180c0 75 69 72 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  uires.        **
180d0 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74   two temporary t
180e0 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74  ables.  Hence it
180f0 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73   has its own cas
18100 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20  e.  Begin.      
18110 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69    ** by allocati
18120 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65  ng the tables we
18130 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20   will need..    
18140 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 74      */.        t
18150 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab1 = pParse->nT
18160 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 74 61  ab++;.        ta
18170 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b2 = pParse->nTa
18180 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  b++;.        ass
18190 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
181a0 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20 20 20  ==0 );.  .      
181b0 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
181c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
181d0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
181e0 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
181f0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
18200 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
18210 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  -1 );.        p-
18220 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
18230 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20   = addr;.       
18240 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70   findRightmost(p
18250 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  )->selFlags |= S
18260 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
18270 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
18280 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
18290 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  .        /* Code
182a0 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20   the SELECTs to 
182b0 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65  our left into te
182c0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
182d0 61 62 31 22 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ab1"..        */
182e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
182f0 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
18300 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20 53  intersectdest, S
18310 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b  RT_Union, tab1);
18320 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
18330 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
18340 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74  se, pPrior, &int
18350 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20  ersectdest);.   
18360 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
18370 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75           goto mu
18380 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
18390 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20          }.  .   
183a0 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
183b0 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
183c0 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
183d0 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20  able "tab2".    
183e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
183f0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
18400 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
18410 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62  enEphemeral, tab
18420 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  2, 0);.        a
18430 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
18440 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20  enEphm[1] == -1 
18450 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64  );.        p->ad
18460 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
18470 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 70 2d  addr;.        p-
18480 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
18490 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
184a0 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20  >pLimit;.       
184b0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
184c0 20 20 20 20 20 20 20 20 69 6e 74 65 72 73 65 63          intersec
184d0 74 64 65 73 74 2e 69 53 44 50 61 72 6d 20 3d 20  tdest.iSDParm = 
184e0 74 61 62 32 3b 0a 20 20 20 20 20 20 20 20 45 78  tab2;.        Ex
184f0 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28  plainQueryPlan((
18500 70 50 61 72 73 65 2c 20 31 2c 20 22 25 73 20 55  pParse, 1, "%s U
18510 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45  SING TEMP B-TREE
18520 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
18530 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 6c               sel
18540 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
18550 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
18560 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
18570 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72  Parse, p, &inter
18580 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20  sectdest);.     
18590 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
185a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
185b0 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20        pDelete = 
185c0 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  p->pPrior;.     
185d0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
185e0 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 69  Prior;.        i
185f0 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
18600 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74  >pPrior->nSelect
18610 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Row ){.         
18620 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
18630 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
18640 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Row;.        }. 
18650 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
18660 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
18670 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20  pLimit);.       
18680 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
18690 6d 69 74 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  mit;.  .        
186a0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
186b0 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74   to take the int
186c0 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  ersection of the
186d0 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20   two temporary. 
186e0 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73         ** tables
186f0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
18700 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
18710 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
18720 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74    iBreak = sqlit
18730 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
18740 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e  v);.        iCon
18750 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
18760 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
18770 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
18780 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
18790 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20  e, p, iBreak);. 
187a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
187b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
187c0 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72  ewind, tab1, iBr
187d0 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
187e0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 72  ge(v);.        r
187f0 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
18800 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
18810 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
18820 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18830 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c  2(v, OP_RowData,
18840 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20 20   tab1, r1);.    
18850 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18860 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e  ddOp4Int(v, OP_N
18870 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69  otFound, tab2, i
18880 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b 0a 20 20  Cont, r1, 0);.  
18890 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
188a0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
188b0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
188c0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
188d0 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63 74  ;.        select
188e0 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
188f0 2c 20 70 2c 20 74 61 62 31 2c 0a 20 20 20 20 20  , p, tab1,.     
18900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18910 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20     0, 0, &dest, 
18920 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a  iCont, iBreak);.
18930 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18940 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
18950 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
18960 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18970 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
18980 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 20   tab1, iStart); 
18990 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
189a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
189b0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
189c0 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
189d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
189e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
189f0 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  se, tab2, 0);.  
18a00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18a10 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
18a20 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  ose, tab1, 0);. 
18a30 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
18a40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
18a50 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
18a60 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20  OMIT_EXPLAIN.   
18a70 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30   if( p->pNext==0
18a80 20 29 7b 0a 20 20 20 20 20 20 45 78 70 6c 61 69   ){.      Explai
18a90 6e 51 75 65 72 79 50 6c 61 6e 50 6f 70 28 70 50  nQueryPlanPop(pP
18aa0 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 23  arse);.    }.  #
18ab0 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20 2f  endif.  }.  .  /
18ac0 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74  * Compute collat
18ad0 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75 73  ing sequences us
18ae0 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70  ed by .  ** temp
18af0 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65  orary tables nee
18b00 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ded to implement
18b10 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
18b20 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63  lect..  ** Attac
18b30 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  h the KeyInfo st
18b40 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74  ructure to all t
18b50 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
18b60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
18b70 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62  section is run b
18b80 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  y the right-most
18b90 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
18ba0 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c  t only..  ** SEL
18bb0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
18bc0 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79  o the left alway
18bd0 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74  s skip this part
18be0 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  .  The right-mos
18bf0 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69  t.  ** SELECT mi
18c00 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68  ght also skip th
18c10 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68 61  is part if it ha
18c20 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
18c30 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f  ause and.  ** no
18c40 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65   temp tables are
18c50 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a   required..  */.
18c60 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
18c70 73 20 26 20 53 46 5f 55 73 65 73 45 70 68 65 6d  s & SF_UsesEphem
18c80 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  eral ){.    int 
18c90 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
18ca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
18cb0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
18cc0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
18cd0 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  fo;            /
18ce0 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
18cf0 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65 73  ence for the res
18d00 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53  ult set */.    S
18d10 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20  elect *pLoop;   
18d20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18d30 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f  For looping thro
18d40 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74 65  ugh SELECT state
18d50 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c  ments */.    Col
18d60 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20  lSeq **apColl;  
18d70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
18d80 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67  r looping throug
18d90 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  h pKeyInfo->aCol
18da0 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  l[] */.    int n
18db0 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
18dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
18dd0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
18de0 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a   result set */..
18df0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
18e00 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e  Next==0 );.    n
18e10 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  Col = p->pEList-
18e20 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79  >nExpr;.    pKey
18e30 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
18e40 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
18e50 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  Col, 1);.    if(
18e60 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20   !pKeyInfo ){.  
18e70 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18e80 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
18e90 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
18ea0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
18eb0 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f     for(i=0, apCo
18ec0 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  ll=pKeyInfo->aCo
18ed0 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c  ll; i<nCol; i++,
18ee0 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20   apColl++){.    
18ef0 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74    *apColl = mult
18f00 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
18f10 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20  Parse, p, i);.  
18f20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f      if( 0==*apCo
18f30 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61  ll ){.        *a
18f40 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
18f50 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  tColl;.      }. 
18f60 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c     }..    for(pL
18f70 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c  oop=p; pLoop; pL
18f80 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f  oop=pLoop->pPrio
18f90 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  r){.      for(i=
18fa0 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<2; i++){.  
18fb0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
18fc0 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e   pLoop->addrOpen
18fd0 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Ephm[i];.       
18fe0 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20   if( addr<0 ){. 
18ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b           /* If [
19000 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68 65  0] is unused the
19010 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e  n [1] is also un
19020 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e  used.  So we can
19030 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  .          ** al
19040 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72  ways safely abor
19050 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65  t as soon as the
19060 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c   first unused sl
19070 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20  ot is found */. 
19080 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
19090 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e   pLoop->addrOpen
190a0 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20  Ephm[1]<0 );.   
190b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
190c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
190d0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
190e0 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f  eP2(v, addr, nCo
190f0 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
19100 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
19110 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29  v, addr, (char*)
19120 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65  sqlite3KeyInfoRe
19130 66 28 70 4b 65 79 49 6e 66 6f 29 2c 0a 20 20 20  f(pKeyInfo),.   
19140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19150 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49           P4_KEYI
19160 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  NFO);.        pL
19170 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  oop->addrOpenEph
19180 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20  m[i] = -1;.     
19190 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
191a0 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
191b0 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a  (pKeyInfo);.  }.
191c0 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e  .multi_select_en
191d0 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73  d:.  pDest->iSds
191e0 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a  t = dest.iSdst;.
191f0 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d    pDest->nSdst =
19200 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20 73   dest.nSdst;.  s
19210 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
19220 74 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29 3b  te(db, pDelete);
19230 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19240 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
19250 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
19260 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ELECT */../*.** 
19270 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 6f  Error message fo
19280 72 20 77 68 65 6e 20 74 77 6f 20 6f 72 20 6d 6f  r when two or mo
19290 72 65 20 74 65 72 6d 73 20 6f 66 20 61 20 63 6f  re terms of a co
192a0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 68 61  mpound select ha
192b0 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  ve different.** 
192c0 73 69 7a 65 20 72 65 73 75 6c 74 20 73 65 74 73  size result sets
192d0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
192e0 33 53 65 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54  3SelectWrongNumT
192f0 65 72 6d 73 45 72 72 6f 72 28 50 61 72 73 65 20  ermsError(Parse 
19300 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
19310 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73 65  *p){.  if( p->se
19320 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75  lFlags & SF_Valu
19330 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  es ){.    sqlite
19340 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
19350 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d 75  , "all VALUES mu
19360 73 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  st have the same
19370 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   number of terms
19380 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ");.  }else{.   
19390 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
193a0 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54  (pParse, "SELECT
193b0 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e  s to the left an
193c0 64 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20  d right of %s". 
193d0 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61       " do not ha
193e0 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
193f0 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
19400 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e  umns", selectOpN
19410 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d  ame(p->op));.  }
19420 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  .}../*.** Code a
19430 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  n output subrout
19440 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74  ine for a corout
19450 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ine implementati
19460 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43  on of a.** SELEC
19470 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a  T statment..**.*
19480 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20 62 65  * The data to be
19490 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61   output is conta
194a0 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53 64  ined in pIn->iSd
194b0 73 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a  st.  There are.*
194c0 2a 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c  * pIn->nSdst col
194d0 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75  umns to be outpu
194e0 74 2e 20 20 70 44 65 73 74 20 69 73 20 77 68 65  t.  pDest is whe
194f0 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 73 68  re the output sh
19500 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e  ould.** be sent.
19510 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e  .**.** regReturn
19520 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
19530 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20 68  f the register h
19540 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f  olding the subro
19550 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20  utine.** return 
19560 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49  address..**.** I
19570 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e  f regPrev>0 then
19580 20 69 74 20 69 73 20 74 68 65 20 66 69 72 73 74   it is the first
19590 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20 76   register in a v
195a0 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65  ector that.** re
195b0 63 6f 72 64 73 20 74 68 65 20 70 72 65 76 69 6f  cords the previo
195c0 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b  us output.  mem[
195d0 72 65 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c  regPrev] is a fl
195e0 61 67 20 74 68 61 74 20 69 73 20 66 61 6c 73 65  ag that is false
195f0 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 73  .** if there has
19600 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75   been no previou
19610 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65  s output.  If re
19620 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64  gPrev>0 then cod
19630 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65  e is.** generate
19640 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 64 75  d to suppress du
19650 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49  plicates.  pKeyI
19660 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20  nfo is used for 
19670 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79  comparing.** key
19680 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
19690 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70  LIMIT found in p
196a0 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63  ->iLimit is reac
196b0 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69  hed, jump immedi
196c0 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65  ately to.** iBre
196d0 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ak..*/.static in
196e0 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  t generateOutput
196f0 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61  Subroutine(.  Pa
19700 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
19710 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
19720 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
19730 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
19740 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
19750 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
19760 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
19770 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  In,        /* Co
19780 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e  routine supplyin
19790 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65  g data */.  Sele
197a0 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
197b0 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
197c0 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f  send the data */
197d0 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e  .  int regReturn
197e0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
197f0 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  e return address
19800 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
19810 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20 20 20  nt regPrev,     
19820 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f         /* Previo
19830 75 73 20 72 65 73 75 6c 74 20 72 65 67 69 73 74  us result regist
19840 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65  er.  No uniquene
19850 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79  ss if 0 */.  Key
19860 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
19870 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70       /* For comp
19880 61 72 69 6e 67 20 77 69 74 68 20 70 72 65 76 69  aring with previ
19890 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69  ous entry */.  i
198a0 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20  nt iBreak       
198b0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
198c0 65 72 65 20 69 66 20 77 65 20 68 69 74 20 74 68  ere if we hit th
198d0 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20  e LIMIT */.){.  
198e0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
198f0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
19900 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20  Continue;.  int 
19910 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20  addr;..  addr = 
19920 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
19930 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43 6f  ntAddr(v);.  iCo
19940 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
19950 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
19960 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73  ;..  /* Suppress
19970 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20   duplicates for 
19980 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61  UNION, EXCEPT, a
19990 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20  nd INTERSECT .  
199a0 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65 76  */.  if( regPrev
199b0 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
199c0 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 61 64  1, addr2;.    ad
199d0 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
199e0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
199f0 4e 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 20 56  Not, regPrev); V
19a00 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
19a10 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69      addr2 = sqli
19a20 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
19a30 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e   OP_Compare, pIn
19a40 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76  ->iSdst, regPrev
19a50 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a  +1, pIn->nSdst,.
19a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
19a80 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49  har*)sqlite3KeyI
19a90 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29  nfoRef(pKeyInfo)
19aa0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
19ab0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19ac0 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
19ad0 20 61 64 64 72 32 2b 32 2c 20 69 43 6f 6e 74 69   addr2+2, iConti
19ae0 6e 75 65 2c 20 61 64 64 72 32 2b 32 29 3b 20 56  nue, addr2+2); V
19af0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
19b00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
19b10 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
19b20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
19b30 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
19b40 6f 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  opy, pIn->iSdst,
19b50 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d   regPrev+1, pIn-
19b60 3e 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20 20 73  >nSdst-1);.    s
19b70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19b80 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
19b90 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 7d  1, regPrev);.  }
19ba0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
19bb0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
19bc0 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
19bd0 2a 20 53 75 70 70 72 65 73 73 20 74 68 65 20 66  * Suppress the f
19be0 69 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74 72  irst OFFSET entr
19bf0 69 65 73 20 69 66 20 74 68 65 72 65 20 69 73 20  ies if there is 
19c00 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  an OFFSET clause
19c10 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73  .  */.  codeOffs
19c20 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et(v, p->iOffset
19c30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20  , iContinue);.. 
19c40 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e   assert( pDest->
19c50 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74  eDest!=SRT_Exist
19c60 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  s );.  assert( p
19c70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54  Dest->eDest!=SRT
19c80 5f 54 61 62 6c 65 20 29 3b 0a 20 20 73 77 69 74  _Table );.  swit
19c90 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  ch( pDest->eDest
19ca0 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65   ){.    /* Store
19cb0 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64   the result as d
19cc0 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71  ata using a uniq
19cd0 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20  ue key..    */. 
19ce0 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
19cf0 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e  mTab: {.      in
19d00 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
19d10 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
19d20 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d  ;.      int r2 =
19d30 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
19d40 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
19d50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19d60 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
19d70 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74  cord, pIn->iSdst
19d80 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72 31  , pIn->nSdst, r1
19d90 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19da0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19db0 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73 74  _NewRowid, pDest
19dc0 2d 3e 69 53 44 50 61 72 6d 2c 20 72 32 29 3b 0a  ->iSDParm, r2);.
19dd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19de0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
19df0 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44  sert, pDest->iSD
19e00 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20  Parm, r1, r2);. 
19e10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19e20 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
19e30 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
19e40 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
19e50 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
19e60 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r2);.      sqlit
19e70 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
19e80 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
19e90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19ea0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
19eb0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
19ec0 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
19ed0 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66  creating a set f
19ee0 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28  or an "expr IN (
19ef0 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a 20 20  SELECT ...)"..  
19f00 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
19f10 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69  T_Set: {.      i
19f20 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 74 65 73  nt r1;.      tes
19f30 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73  tcase( pIn->nSds
19f40 74 3e 31 20 29 3b 0a 20 20 20 20 20 20 72 31 20  t>1 );.      r1 
19f50 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
19f60 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
19f70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19f80 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
19f90 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73  ecord, pIn->iSds
19fa0 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 0a  t, pIn->nSdst, .
19fb0 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 70 44            r1, pD
19fc0 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20 70  est->zAffSdst, p
19fd0 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20  In->nSdst);.    
19fe0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
19ff0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
1a000 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
1a010 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
1a020 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1a030 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
1a040 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44  OP_IdxInsert, pD
1a050 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31  est->iSDParm, r1
1a060 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a070 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
1a080 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
1a090 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dst);.      sqli
1a0a0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1a0b0 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
1a0c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a0d0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
1a0e0 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65  s is a scalar se
1a0f0 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72  lect that is par
1a100 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
1a110 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
1a120 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
1a130 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72  s in the appropr
1a140 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iate memory cell
1a150 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20   and break out. 
1a160 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61     ** of the sca
1a170 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
1a180 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
1a190 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1a1a0 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c   pIn->nSdst==1 |
1a1b0 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  | pParse->nErr>0
1a1c0 20 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 70   );  testcase( p
1a1d0 49 6e 2d 3e 6e 53 64 73 74 21 3d 31 20 29 3b 0a  In->nSdst!=1 );.
1a1e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a1f0 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
1a200 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44  , pIn->iSdst, pD
1a210 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31 29  est->iSDParm, 1)
1a220 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;.      /* The L
1a230 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c  IMIT clause will
1a240 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65   jump out of the
1a250 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
1a260 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a270 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   }.#endif /* #if
1a280 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a290 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20  _SUBQUERY */..  
1a2a0 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 73    /* The results
1a2b0 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61   are stored in a
1a2c0 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67   sequence of reg
1a2d0 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74  isters.    ** st
1a2e0 61 72 74 69 6e 67 20 61 74 20 70 44 65 73 74 2d  arting at pDest-
1a2f0 3e 69 53 64 73 74 2e 20 20 54 68 65 6e 20 74 68  >iSdst.  Then th
1a300 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65  e co-routine yie
1a310 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lds..    */.    
1a320 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69  case SRT_Corouti
1a330 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ne: {.      if( 
1a340 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20  pDest->iSdst==0 
1a350 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74  ){.        pDest
1a360 2d 3e 69 53 64 73 74 20 3d 20 73 71 6c 69 74 65  ->iSdst = sqlite
1a370 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
1a380 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  arse, pIn->nSdst
1a390 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74  );.        pDest
1a3a0 2d 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e  ->nSdst = pIn->n
1a3b0 53 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Sdst;.      }.  
1a3c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1a3d0 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
1a3e0 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73  pIn->iSdst, pDes
1a3f0 74 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  t->iSdst, pIn->n
1a400 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Sdst);.      sql
1a410 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
1a420 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73  , OP_Yield, pDes
1a430 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  t->iSDParm);.   
1a440 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1a450 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20  .    /* If none 
1a460 6f 66 20 74 68 65 20 61 62 6f 76 65 2c 20 74 68  of the above, th
1a470 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 64 65  en the result de
1a480 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62  stination must b
1a490 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74  e.    ** SRT_Out
1a4a0 70 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69  put.  This routi
1a4b0 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
1a4c0 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65  ed with any othe
1a4d0 72 0a 20 20 20 20 2a 2a 20 64 65 73 74 69 6e 61  r.    ** destina
1a4e0 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  tion other than 
1a4f0 74 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64  the ones handled
1a500 20 61 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75   above or SRT_Ou
1a510 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  tput..    **.   
1a520 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74 70   ** For SRT_Outp
1a530 75 74 2c 20 72 65 73 75 6c 74 73 20 61 72 65 20  ut, results are 
1a540 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75  stored in a sequ
1a550 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
1a560 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e  s.  .    ** Then
1a570 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f   the OP_ResultRo
1a580 77 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64  w opcode is used
1a590 20 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74 65   to cause sqlite
1a5a0 33 5f 73 74 65 70 28 29 20 74 6f 0a 20 20 20 20  3_step() to.    
1a5b0 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65  ** return the ne
1a5c0 78 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74  xt row of result
1a5d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
1a5e0 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
1a5f0 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65  sert( pDest->eDe
1a600 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
1a610 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1a620 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a630 52 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e  ResultRow, pIn->
1a640 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
1a650 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1a660 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
1a670 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
1a680 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e   pIn->iSdst, pIn
1a690 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
1a6a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1a6b0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
1a6c0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f  he end of the lo
1a6d0 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20  op if the LIMIT 
1a6e0 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f  is reached..  */
1a6f0 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
1a700 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1a710 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a720 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d  DecrJumpZero, p-
1a730 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29  >iLimit, iBreak)
1a740 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1a750 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
1a760 65 72 61 74 65 20 74 68 65 20 73 75 62 72 6f 75  erate the subrou
1a770 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f  tine return.  */
1a780 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
1a790 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
1a7a0 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69  ontinue);.  sqli
1a7b0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
1a7c0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52   OP_Return, regR
1a7d0 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72  eturn);..  retur
1a7e0 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n addr;.}../*.**
1a7f0 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6d   Alternative com
1a800 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f 64  pound select cod
1a810 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72 20  e generator for 
1a820 63 61 73 65 73 20 77 68 65 6e 20 74 68 65 72 65  cases when there
1a830 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52 20  .** is an ORDER 
1a840 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  BY clause..**.**
1a850 20 57 65 20 61 73 73 75 6d 65 20 61 20 71 75 65   We assume a que
1a860 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ry of the follow
1a870 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  ing form:.**.** 
1a880 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20 20       <selectA>  
1a890 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c  <operator>  <sel
1a8a0 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59 20  ectB>  ORDER BY 
1a8b0 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a  <orderbylist>.**
1a8c0 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69  .** <operator> i
1a8d0 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41  s one of UNION A
1a8e0 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  LL, UNION, EXCEP
1a8f0 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54 2e  T, or INTERSECT.
1a900 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69 73    The idea.** is
1a910 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c 73   to code both <s
1a920 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c  electA> and <sel
1a930 65 63 74 42 3e 20 77 69 74 68 20 74 68 65 20 4f  ectB> with the O
1a940 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
1a950 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73  s.** co-routines
1a960 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65 20  .  Then run the 
1a970 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20 70  co-routines in p
1a980 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67  arallel and merg
1a990 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  e the results.**
1a9a0 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
1a9b0 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  .  In addition t
1a9c0 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74  o the two corout
1a9d0 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65 6c  ines (called sel
1a9e0 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65  ectA and.** sele
1a9f0 63 74 42 29 20 74 68 65 72 65 20 61 72 65 20 37  ctB) there are 7
1aa00 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a   subroutines:.**
1aa10 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20 20  .**    outA:    
1aa20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20  Move the output 
1aa30 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41 20 63  of the selectA c
1aa40 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68  oroutine into th
1aa50 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20  e output.**     
1aa60 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63          of the c
1aa70 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a  ompound query..*
1aa80 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20 20  *.**    outB:   
1aa90 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74   Move the output
1aaa0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42 20   of the selectB 
1aab0 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74  coroutine into t
1aac0 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20  he output.**    
1aad0 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
1aae0 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20  compound query. 
1aaf0 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64   (Only generated
1ab00 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a   for UNION and.*
1ab10 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e  *             UN
1ab20 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50 54  ION ALL.  EXCEPT
1ab30 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54 20   and INSERTSECT 
1ab40 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61 20 72  never output a r
1ab50 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ow that.**      
1ab60 20 20 20 20 20 20 20 61 70 70 65 61 72 73 20 6f         appears o
1ab70 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a  nly in B.).**.**
1ab80 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61 6c      AltB:    Cal
1ab90 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  led when there i
1aba0 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68  s data from both
1abb0 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
1abc0 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65  A<B..**.**    Ae
1abd0 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  qB:    Called wh
1abe0 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61  en there is data
1abf0 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75   from both corou
1ac00 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a  tines and A==B..
1ac10 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 20  **.**    AgtB:  
1ac20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68    Called when th
1ac30 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d  ere is data from
1ac40 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73   both coroutines
1ac50 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20   and A>B..**.** 
1ac60 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c     EofA:    Call
1ac70 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20  ed when data is 
1ac80 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73  exhausted from s
1ac90 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20  electA..**.**   
1aca0 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65 64   EofB:    Called
1acb0 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78   when data is ex
1acc0 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c  hausted from sel
1acd0 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ectB..**.** The 
1ace0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
1acf0 66 20 74 68 65 20 6c 61 74 74 65 72 20 66 69 76  f the latter fiv
1ad00 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64 65  e subroutines de
1ad10 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a  pend on which .*
1ad20 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20  * <operator> is 
1ad30 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20  used:.**.**.**  
1ad40 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e             UNION
1ad50 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e 49   ALL         UNI
1ad60 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20 45 58  ON            EX
1ad70 43 45 50 54 20 20 20 20 20 20 20 20 20 20 49 4e  CEPT          IN
1ad80 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20 20  TERSECT.**      
1ad90 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
1ada0 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
1adb0 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
1adc0 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
1add0 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74  -------.**   Alt
1ade0 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41  B:   outA, nextA
1adf0 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
1ae00 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  A       outA, ne
1ae10 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74  xtA         next
1ae20 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20  A.**.**   AeqB: 
1ae30 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
1ae40 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20        nextA     
1ae50 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20          nextA   
1ae60 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
1ae70 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20  A.**.**   AgtB: 
1ae80 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
1ae90 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
1aea0 20 20 20 20 20 20 20 20 6e 65 78 74 42 20 20 20          nextB   
1aeb0 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a 2a           nextB.*
1aec0 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f  *.**   EofA:   o
1aed0 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
1aee0 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
1aef0 20 20 20 20 20 68 61 6c 74 20 20 20 20 20 20 20       halt       
1af00 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a        halt.**.**
1af10 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c     EofB:   outA,
1af20 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41   nextA      outA
1af30 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75  , nextA       ou
1af40 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
1af50 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20    halt.**.** In 
1af60 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c 20  the AltB, AeqB, 
1af70 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75 74  and AgtB subrout
1af80 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20  ines, an EOF on 
1af90 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  A following next
1afa0 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20 69  A.** causes an i
1afb0 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f  mmediate jump to
1afc0 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f 46   EofA and an EOF
1afd0 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20   on B following 
1afe0 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a 20  nextB causes.** 
1aff0 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d  an immediate jum
1b000 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74 68  p to EofB.  With
1b010 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42  in EofA and EofB
1b020 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74  , and EOF on ent
1b030 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  ry or.** followi
1b040 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65 73 20  ng nextX causes 
1b050 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  a jump to the en
1b060 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  d of the select 
1b070 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a  processing..**.*
1b080 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d 6f  * Duplicate remo
1b090 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e  val in the UNION
1b0a0 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e  , EXCEPT, and IN
1b0b0 54 45 52 53 45 43 54 20 63 61 73 65 73 20 69 73  TERSECT cases is
1b0c0 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68   handled.** with
1b0d0 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73 75  in the output su
1b0e0 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 72  broutine.  The r
1b0f0 65 67 50 72 65 76 20 72 65 67 69 73 74 65 72 20  egPrev register 
1b100 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70 72  set holds the pr
1b110 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70  eviously.** outp
1b120 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d  ut value.  A com
1b130 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20  parison is made 
1b140 61 67 61 69 6e 73 74 20 74 68 69 73 20 76 61 6c  against this val
1b150 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75  ue and the outpu
1b160 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64 20  t.** is skipped 
1b170 69 66 20 74 68 65 20 6e 65 78 74 20 72 65 73 75  if the next resu
1b180 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68 65  lts would be the
1b190 20 73 61 6d 65 20 61 73 20 74 68 65 20 70 72 65   same as the pre
1b1a0 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  vious..**.** The
1b1b0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
1b1c0 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65  plan is to imple
1b1d0 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f 72  ment the two cor
1b1e0 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76 65  outines and seve
1b1f0 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 73  n.** subroutines
1b200 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75 74   first, then put
1b210 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67   the control log
1b220 69 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  ic at the bottom
1b230 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  .  Like this:.**
1b240 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f 74  .**          got
1b250 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f  o Init.**     co
1b260 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  A: coroutine for
1b270 20 6c 65 66 74 20 71 75 65 72 79 20 28 41 29 0a   left query (A).
1b280 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f  **     coB: coro
1b290 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20  utine for right 
1b2a0 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20 20  query (B).**    
1b2b0 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65  outA: output one
1b2c0 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20   row of A.**    
1b2d0 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65  outB: output one
1b2e0 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e   row of B (UNION
1b2f0 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   and UNION ALL o
1b300 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a  nly).**    EofA:
1b310 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a   ....**    EofB:
1b320 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a   ....**    AltB:
1b330 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a   ....**    AeqB:
1b340 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a   ....**    AgtB:
1b350 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a   ....**    Init:
1b360 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f   initialize coro
1b370 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 0a  utine registers.
1b380 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c  **          yiel
1b390 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20  d coA.**        
1b3a0 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74 6f    if eof(A) goto
1b3b0 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20 20   EofA.**        
1b3c0 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20    yield coB.**  
1b3d0 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 42          if eof(B
1b3e0 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20  ) goto EofB.**  
1b3f0 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20    Cmpr: Compare 
1b400 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20 20  A, B.**         
1b410 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71 42   Jump AltB, AeqB
1b420 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e  , AgtB.**     En
1b430 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  d: ....**.** We 
1b440 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c  call AltB, AeqB,
1b450 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64   AgtB, EofA, and
1b460 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69 6e   EofB "subroutin
1b470 65 73 22 20 62 75 74 20 74 68 65 79 20 61 72 65  es" but they are
1b480 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79   not.** actually
1b490 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f   called using Go
1b4a0 73 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f 20  sub and they do 
1b4b0 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f 66  not Return.  Eof
1b4c0 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a  A and EofB loop.
1b4d0 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74  ** until all dat
1b4e0 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20 74  a is exhausted t
1b4f0 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  hen jump to the 
1b500 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c 74  "end" labe.  Alt
1b510 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20  B, AeqB,.** and 
1b520 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69 74  AgtB jump to eit
1b530 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65  her L2 or to one
1b540 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66 42   of EofA or EofB
1b550 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
1b560 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
1b570 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63 20  D_SELECT.static 
1b580 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  int multiSelectO
1b590 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
1b5a0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
1b5b0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
1b5c0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
1b5d0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
1b5e0 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
1b5f0 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
1b600 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
1b610 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
1b620 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
1b630 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
1b640 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
1b650 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
1b660 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1b670 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  s */.  Select *p
1b680 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20  Prior;       /* 
1b690 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69  Another SELECT i
1b6a0 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75  mmediately to ou
1b6b0 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65  r left */.  Vdbe
1b6c0 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
1b6d0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1b6e0 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20  de to this VDBE 
1b6f0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
1b700 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44 65  destA;     /* De
1b710 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f  stination for co
1b720 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53  routine A */.  S
1b730 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 42 3b  electDest destB;
1b740 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74       /* Destinat
1b750 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e  ion for coroutin
1b760 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  e B */.  int reg
1b770 41 64 64 72 41 3b 20 20 20 20 20 20 20 20 20 2f  AddrA;         /
1b780 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
1b790 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20  er for select-A 
1b7a0 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  coroutine */.  i
1b7b0 6e 74 20 72 65 67 41 64 64 72 42 3b 20 20 20 20  nt regAddrB;    
1b7c0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1b7d0 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
1b7e0 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20  ect-B coroutine 
1b7f0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c  */.  int addrSel
1b800 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41 64  ectA;      /* Ad
1b810 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
1b820 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20  ect-A coroutine 
1b830 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c  */.  int addrSel
1b840 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41 64  ectB;      /* Ad
1b850 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
1b860 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20  ect-B coroutine 
1b870 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 41  */.  int regOutA
1b880 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ;          /* Ad
1b890 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
1b8a0 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20  or the output-A 
1b8b0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
1b8c0 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20 20  int regOutB;    
1b8d0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1b8e0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68   register for th
1b8f0 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f  e output-B subro
1b900 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
1b910 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20 20  ddrOutA;        
1b920 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
1b930 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72  he output-A subr
1b940 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1b950 61 64 64 72 4f 75 74 42 20 3d 20 30 3b 20 20 20  addrOutB = 0;   
1b960 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1b970 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62  the output-B sub
1b980 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1b990 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20 20   addrEofA;      
1b9a0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
1b9b0 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65 78   the select-A-ex
1b9c0 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69  hausted subrouti
1b9d0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
1b9e0 45 6f 66 41 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a  EofA_noB;     /*
1b9f0 20 41 6c 74 65 72 6e 61 74 65 20 61 64 64 72 45   Alternate addrE
1ba00 6f 66 41 20 69 66 20 42 20 69 73 20 75 6e 69 6e  ofA if B is unin
1ba10 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69  itialized */.  i
1ba20 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20 20  nt addrEofB;    
1ba30 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1ba40 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d  of the select-B-
1ba50 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75  exhausted subrou
1ba60 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
1ba70 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20 20  drAltB;         
1ba80 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
1ba90 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e 65  e A<B subroutine
1baa0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 65   */.  int addrAe
1bab0 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  qB;         /* A
1bac0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3d  ddress of the A=
1bad0 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  =B subroutine */
1bae0 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74 42 3b  .  int addrAgtB;
1baf0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
1bb00 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20 73  ess of the A>B s
1bb10 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
1bb20 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20  nt regLimitA;   
1bb30 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65       /* Limit re
1bb40 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
1bb50 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  t-A */.  int reg
1bb60 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20 2f  LimitB;        /
1bb70 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72  * Limit register
1bb80 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f   for select-A */
1bb90 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20  .  int regPrev; 
1bba0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 61           /* A ra
1bbb0 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nge of registers
1bbc0 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f 75   to hold previou
1bbd0 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e  s output */.  in
1bbe0 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20 20  t savedLimit;   
1bbf0 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c      /* Saved val
1bc00 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20  ue of p->iLimit 
1bc10 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f 66  */.  int savedOf
1bc20 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 61  fset;      /* Sa
1bc30 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e  ved value of p->
1bc40 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74  iOffset */.  int
1bc50 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20 20   labelCmpr;     
1bc60 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20     /* Label for 
1bc70 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
1bc80 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d   merge algorithm
1bc90 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45   */.  int labelE
1bca0 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  nd;         /* L
1bcb0 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e 64  abel for the end
1bcc0 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c 20   of the overall 
1bcd0 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20  SELECT stmt */. 
1bce0 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20   int addr1;     
1bcf0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69         /* Jump i
1bd00 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74  nstructions that
1bd10 20 67 65 74 20 72 65 74 61 72 67 65 74 74 65 64   get retargetted
1bd20 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
1bd30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1bd40 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b  ne of TK_ALL, TK
1bd50 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50  _UNION, TK_EXCEP
1bd60 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  T, TK_INTERSECT 
1bd70 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
1bd80 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f  eyDup = 0; /* Co
1bd90 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61  mparison informa
1bda0 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61  tion for duplica
1bdb0 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20  te removal */.  
1bdc0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72  KeyInfo *pKeyMer
1bdd0 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69  ge;   /* Compari
1bde0 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  son information 
1bdf0 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77 73  for merging rows
1be00 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
1be10 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  b;          /* D
1be20 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1be30 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  on */.  ExprList
1be40 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a   *pOrderBy;   /*
1be50 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
1be60 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  ause */.  int nO
1be70 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20  rderBy;         
1be80 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
1be90 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ms in the ORDER 
1bea0 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
1beb0 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20  nt *aPermute;   
1bec0 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20       /* Mapping 
1bed0 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74 65  from ORDER BY te
1bee0 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73 65  rms to result se
1bef0 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20  t columns */..  
1bf00 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
1bf10 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rBy!=0 );.  asse
1bf20 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29  rt( pKeyDup==0 )
1bf30 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63  ; /* "Managed" c
1bf40 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20  ode needs this. 
1bf50 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a   Ticket #3382. *
1bf60 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
1bf70 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73  >db;.  v = pPars
1bf80 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
1bf90 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20  rt( v!=0 );     
1bfa0 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72    /* Already thr
1bfb0 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66  own the error if
1bfc0 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c   VDBE alloc fail
1bfd0 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64  ed */.  labelEnd
1bfe0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1bff0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61  keLabel(v);.  la
1c000 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65  belCmpr = sqlite
1c010 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1c020 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20  );...  /* Patch 
1c030 75 70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  up the ORDER BY 
1c040 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70  clause.  */.  op
1c050 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50   = p->op;  .  pP
1c060 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
1c070 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69  ;.  assert( pPri
1c080 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  or->pOrderBy==0 
1c090 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  );.  pOrderBy = 
1c0a0 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61  p->pOrderBy;.  a
1c0b0 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20  ssert( pOrderBy 
1c0c0 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  );.  nOrderBy = 
1c0d0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
1c0e0 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61  ..  /* For opera
1c0f0 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20  tors other than 
1c100 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76  UNION ALL we hav
1c110 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
1c120 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44  hat.  ** the ORD
1c130 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76  ER BY clause cov
1c140 65 72 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f  ers every term o
1c150 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
1c160 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d  .  Add.  ** term
1c170 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42  s to the ORDER B
1c180 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65  Y clause as nece
1c190 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ssary..  */.  if
1c1a0 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op!=TK_ALL ){.
1c1b0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d      for(i=1; db-
1c1c0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
1c1d0 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74   && i<=p->pEList
1c1e0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
1c1f0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
1c200 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1c210 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c  ;.      for(j=0,
1c220 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d   pItem=pOrderBy-
1c230 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20  >a; j<nOrderBy; 
1c240 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  j++, pItem++){. 
1c250 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1c260 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
1c270 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20  ByCol>0 );.     
1c280 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e     if( pItem->u.
1c290 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 69  x.iOrderByCol==i
1c2a0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1c2b0 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e  }.      if( j==n
1c2c0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
1c2d0 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20     Expr *pNew = 
1c2e0 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
1c2f0 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a  TK_INTEGER, 0);.
1c300 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
1c310 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
1c320 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
1c330 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c          pNew->fl
1c340 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c  ags |= EP_IntVal
1c350 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ue;.        pNew
1c360 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a  ->u.iValue = i;.
1c370 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65          p->pOrde
1c380 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 20 3d  rBy = pOrderBy =
1c390 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1c3a0 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
1c3b0 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a  OrderBy, pNew);.
1c3c0 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 64          if( pOrd
1c3d0 65 72 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d  erBy ) pOrderBy-
1c3e0 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 75  >a[nOrderBy++].u
1c3f0 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d  .x.iOrderByCol =
1c400 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d   (u16)i;.      }
1c410 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1c420 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d   Compute the com
1c430 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74  parison permutat
1c440 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20  ion and keyinfo 
1c450 74 68 61 74 20 69 73 20 75 73 65 64 20 77 69 74  that is used wit
1c460 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75  h.  ** the permu
1c470 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 64  tation used to d
1c480 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
1c490 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66  next.  ** row of
1c4a0 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66   results comes f
1c4b0 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73  rom selectA or s
1c4c0 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64  electB.  Also ad
1c4d0 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20  d explicit.  ** 
1c4e0 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68  collations to th
1c4f0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1c500 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20  e terms so that 
1c510 77 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72  when the subquer
1c520 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ies.  ** to the 
1c530 72 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65  right and the le
1c540 66 74 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ft are evaluated
1c550 2c 20 74 68 65 79 20 75 73 65 20 74 68 65 20 63  , they use the c
1c560 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c  orrect.  ** coll
1c570 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50  ation..  */.  aP
1c580 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33  ermute = sqlite3
1c590 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
1c5a0 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e  , sizeof(int)*(n
1c5b0 4f 72 64 65 72 42 79 20 2b 20 31 29 29 3b 0a 20  OrderBy + 1));. 
1c5c0 20 69 66 28 20 61 50 65 72 6d 75 74 65 20 29 7b   if( aPermute ){
1c5d0 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
1c5e0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1c5f0 3b 0a 20 20 20 20 61 50 65 72 6d 75 74 65 5b 30  ;.    aPermute[0
1c600 5d 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  ] = nOrderBy;.  
1c610 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 74 65 6d    for(i=1, pItem
1c620 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c  =pOrderBy->a; i<
1c630 3d 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20  =nOrderBy; i++, 
1c640 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
1c650 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75  assert( pItem->u
1c660 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30  .x.iOrderByCol>0
1c670 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1c680 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
1c690 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c  derByCol<=p->pEL
1c6a0 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
1c6b0 20 20 20 20 61 50 65 72 6d 75 74 65 5b 69 5d 20      aPermute[i] 
1c6c0 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  = pItem->u.x.iOr
1c6d0 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b 0a 20 20  derByCol - 1;.  
1c6e0 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72 67    }.    pKeyMerg
1c6f0 65 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  e = multiSelectO
1c700 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50  rderByKeyInfo(pP
1c710 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 7d  arse, p, 1);.  }
1c720 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65  else{.    pKeyMe
1c730 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  rge = 0;.  }..  
1c740 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68 65 20  /* Reattach the 
1c750 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1c760 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20  to the query..  
1c770 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  */.  p->pOrderBy
1c780 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70   = pOrderBy;.  p
1c790 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
1c7a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
1c7b0 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  tDup(pParse->db,
1c7c0 20 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a   pOrderBy, 0);..
1c7d0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
1c7e0 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72 61  range of tempora
1c7f0 72 79 20 72 65 67 69 73 74 65 72 73 20 61 6e 64  ry registers and
1c800 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65   the KeyInfo nee
1c810 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ded.  ** for the
1c820 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65 6d 6f   logic that remo
1c830 76 65 73 20 64 75 70 6c 69 63 61 74 65 20 72 65  ves duplicate re
1c840 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e 20 74  sult rows when t
1c850 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  he.  ** operator
1c860 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50   is UNION, EXCEP
1c870 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54 20  T, or INTERSECT 
1c880 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41  (but not UNION A
1c890 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  LL)..  */.  if( 
1c8a0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op==TK_ALL ){.  
1c8b0 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b 0a 20    regPrev = 0;. 
1c8c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1c8d0 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73  nExpr = p->pELis
1c8e0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 73  t->nExpr;.    as
1c8f0 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d  sert( nOrderBy>=
1c900 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  nExpr || db->mal
1c910 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
1c920 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72 73   regPrev = pPars
1c930 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
1c940 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
1c950 45 78 70 72 2b 31 3b 0a 20 20 20 20 73 71 6c 69  Expr+1;.    sqli
1c960 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1c970 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
1c980 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20 70 4b  regPrev);.    pK
1c990 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65 33 4b  eyDup = sqlite3K
1c9a0 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20  eyInfoAlloc(db, 
1c9b0 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20 20 69  nExpr, 1);.    i
1c9c0 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a 20 20  f( pKeyDup ){.  
1c9d0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
1c9e0 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
1c9f0 65 61 62 6c 65 28 70 4b 65 79 44 75 70 29 20 29  eable(pKeyDup) )
1ca00 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
1ca10 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a   i<nExpr; i++){.
1ca20 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d          pKeyDup-
1ca30 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74  >aColl[i] = mult
1ca40 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
1ca50 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20  Parse, p, i);.  
1ca60 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61        pKeyDup->a
1ca70 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30  SortOrder[i] = 0
1ca80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ca90 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72    }. .  /* Separ
1caa0 61 74 65 20 74 68 65 20 6c 65 66 74 20 61 6e 64  ate the left and
1cab0 20 74 68 65 20 72 69 67 68 74 20 71 75 65 72 79   the right query
1cac0 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65   from one anothe
1cad0 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69  r.  */.  p->pPri
1cae0 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f 72  or = 0;.  pPrior
1caf0 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 73  ->pNext = 0;.  s
1cb00 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64  qlite3ResolveOrd
1cb10 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65  erGroupBy(pParse
1cb20 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  , p, p->pOrderBy
1cb30 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 69 66  , "ORDER");.  if
1cb40 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72  ( pPrior->pPrior
1cb50 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
1cb60 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  e3ResolveOrderGr
1cb70 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 50  oupBy(pParse, pP
1cb80 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f  rior, pPrior->pO
1cb90 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29  rderBy, "ORDER")
1cba0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ;.  }..  /* Comp
1cbb0 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20 72 65  ute the limit re
1cbc0 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d  gisters */.  com
1cbd0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
1cbe0 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 6c 61  rs(pParse, p, la
1cbf0 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20 70  belEnd);.  if( p
1cc00 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d  ->iLimit && op==
1cc10 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65  TK_ALL ){.    re
1cc20 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72  gLimitA = ++pPar
1cc30 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65  se->nMem;.    re
1cc40 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72  gLimitB = ++pPar
1cc50 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71  se->nMem;.    sq
1cc60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1cc70 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69  v, OP_Copy, p->i
1cc80 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66  Offset ? p->iOff
1cc90 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69  set+1 : p->iLimi
1cca0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
1ccb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccc0 20 20 20 20 20 72 65 67 4c 69 6d 69 74 41 29 3b       regLimitA);
1ccd0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1cce0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
1ccf0 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20 72 65  y, regLimitA, re
1cd00 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73  gLimitB);.  }els
1cd10 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41  e{.    regLimitA
1cd20 20 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 30   = regLimitB = 0
1cd30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
1cd40 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
1cd50 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70  >pLimit);.  p->p
1cd60 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 72 65  Limit = 0;..  re
1cd70 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72 73  gAddrA = ++pPars
1cd80 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64  e->nMem;.  regAd
1cd90 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  drB = ++pParse->
1cda0 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20  nMem;.  regOutA 
1cdb0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1cdc0 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b  ;.  regOutB = ++
1cdd0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1cde0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
1cdf0 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20 53 52  tInit(&destA, SR
1ce00 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  T_Coroutine, reg
1ce10 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65  AddrA);.  sqlite
1ce20 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
1ce30 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f  &destB, SRT_Coro
1ce40 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29  utine, regAddrB)
1ce50 3b 0a 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72  ;..  ExplainQuer
1ce60 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31  yPlan((pParse, 1
1ce70 2c 20 22 4d 45 52 47 45 20 28 25 73 29 22 2c 20  , "MERGE (%s)", 
1ce80 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
1ce90 6f 70 29 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  op)));..  /* Gen
1cea0 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e  erate a coroutin
1ceb0 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
1cec0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
1ced0 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c  nt to the.  ** l
1cee0 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  eft of the compo
1cef0 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74  und operator - t
1cf00 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20  he "A" select.. 
1cf10 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74   */.  addrSelect
1cf20 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  A = sqlite3VdbeC
1cf30 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
1cf40 31 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  1;.  addr1 = sql
1cf50 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1cf60 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
1cf70 6e 65 2c 20 72 65 67 41 64 64 72 41 2c 20 30 2c  ne, regAddrA, 0,
1cf80 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20   addrSelectA);. 
1cf90 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1cfa0 20 22 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29   "left SELECT"))
1cfb0 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d  ;.  pPrior->iLim
1cfc0 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a  it = regLimitA;.
1cfd0 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
1cfe0 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22  an((pParse, 1, "
1cff0 4c 45 46 54 22 29 29 3b 0a 20 20 73 71 6c 69 74  LEFT"));.  sqlit
1d000 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
1d010 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 41 29   pPrior, &destA)
1d020 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 45  ;.  sqlite3VdbeE
1d030 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72  ndCoroutine(v, r
1d040 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69  egAddrA);.  sqli
1d050 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
1d060 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 2f 2a  v, addr1);..  /*
1d070 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f   Generate a coro
1d080 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74  utine to evaluat
1d090 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
1d0a0 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20  tement on .  ** 
1d0b0 74 68 65 20 72 69 67 68 74 20 2d 20 74 68 65 20  the right - the 
1d0c0 22 42 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a  "B" select.  */.
1d0d0 20 20 61 64 64 72 53 65 6c 65 63 74 42 20 3d 20    addrSelectB = 
1d0e0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1d0f0 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20  ntAddr(v) + 1;. 
1d100 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
1d110 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1d120 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20  _InitCoroutine, 
1d130 72 65 67 41 64 64 72 42 2c 20 30 2c 20 61 64 64  regAddrB, 0, add
1d140 72 53 65 6c 65 63 74 42 29 3b 0a 20 20 56 64 62  rSelectB);.  Vdb
1d150 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 69  eComment((v, "ri
1d160 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20  ght SELECT"));. 
1d170 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d   savedLimit = p-
1d180 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65 64  >iLimit;.  saved
1d190 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66  Offset = p->iOff
1d1a0 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74  set;.  p->iLimit
1d1b0 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20   = regLimitB;.  
1d1c0 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 20  p->iOffset = 0; 
1d1d0 20 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79   .  ExplainQuery
1d1e0 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c  Plan((pParse, 1,
1d1f0 20 22 52 49 47 48 54 22 29 29 3b 0a 20 20 73 71   "RIGHT"));.  sq
1d200 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
1d210 73 65 2c 20 70 2c 20 26 64 65 73 74 42 29 3b 0a  se, p, &destB);.
1d220 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61    p->iLimit = sa
1d230 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69  vedLimit;.  p->i
1d240 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64 4f 66  Offset = savedOf
1d250 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 56  fset;.  sqlite3V
1d260 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28  dbeEndCoroutine(
1d270 76 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20  v, regAddrB);.. 
1d280 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
1d290 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
1d2a0 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65  utputs the curre
1d2b0 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 41 0a  nt row of the A.
1d2c0 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74    ** select as t
1d2d0 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72  he next output r
1d2e0 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  ow of the compou
1d2f0 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a  nd select..  */.
1d300 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1d310 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f  t((v, "Output ro
1d320 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a  utine for A"));.
1d330 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67 65 6e    addrOutA = gen
1d340 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f  erateOutputSubro
1d350 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20  utine(pParse,.  
1d360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1d370 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73 74 2c  , &destA, pDest,
1d380 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20 20 20   regOutA,.      
1d390 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50 72             regPr
1d3a0 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62  ev, pKeyDup, lab
1d3b0 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20  elEnd);.  .  /* 
1d3c0 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
1d3d0 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
1d3e0 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ts the current r
1d3f0 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a  ow of the B.  **
1d400 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e   select as the n
1d410 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f  ext output row o
1d420 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
1d430 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  elect..  */.  if
1d440 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ( op==TK_ALL || 
1d450 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
1d460 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
1d470 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20  ent((v, "Output 
1d480 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29  routine for B"))
1d490 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d  ;.    addrOutB =
1d4a0 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
1d4b0 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65  ubroutine(pParse
1d4c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d4d0 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44     p, &destB, pD
1d4e0 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20  est, regOutB,.  
1d4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1d500 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c  egPrev, pKeyDup,
1d510 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a   labelEnd);.  }.
1d520 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f    sqlite3KeyInfo
1d530 55 6e 72 65 66 28 70 4b 65 79 44 75 70 29 3b 0a  Unref(pKeyDup);.
1d540 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1d550 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72   subroutine to r
1d560 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75  un when the resu
1d570 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20  lts from select 
1d580 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75  A.  ** are exhau
1d590 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61  sted and only da
1d5a0 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42 20 72  ta in select B r
1d5b0 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  emains..  */.  i
1d5c0 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  f( op==TK_EXCEPT
1d5d0 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52   || op==TK_INTER
1d5e0 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
1d5f0 45 6f 66 41 5f 6e 6f 42 20 3d 20 61 64 64 72 45  EofA_noB = addrE
1d600 6f 66 41 20 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a  ofA = labelEnd;.
1d610 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56    }else{  .    V
1d620 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1d630 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72 6f 75  v, "eof-A subrou
1d640 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64  tine"));.    add
1d650 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56  rEofA = sqlite3V
1d660 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1d670 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20  Gosub, regOutB, 
1d680 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 61  addrOutB);.    a
1d690 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 73 71  ddrEofA_noB = sq
1d6a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1d6b0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1d6c0 41 64 64 72 42 2c 20 6c 61 62 65 6c 45 6e 64 29  AddrB, labelEnd)
1d6d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6f0 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
1d700 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
1d710 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
1d720 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d  ddrEofA);.    p-
1d730 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71  >nSelectRow = sq
1d740 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70  lite3LogEstAdd(p
1d750 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70 50  ->nSelectRow, pP
1d760 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
1d770 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
1d780 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
1d790 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74  ne to run when t
1d7a0 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  he results from 
1d7b0 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61 72  select B.  ** ar
1d7c0 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20  e exhausted and 
1d7d0 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c  only data in sel
1d7e0 65 63 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20  ect A remains.. 
1d7f0 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
1d800 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20  _INTERSECT ){.  
1d810 20 20 61 64 64 72 45 6f 66 42 20 3d 20 61 64 64    addrEofB = add
1d820 72 45 6f 66 41 3b 0a 20 20 20 20 69 66 28 20 70  rEofA;.    if( p
1d830 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 70  ->nSelectRow > p
1d840 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
1d850 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  w ) p->nSelectRo
1d860 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  w = pPrior->nSel
1d870 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b  ectRow;.  }else{
1d880 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43    .    VdbeNoopC
1d890 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d  omment((v, "eof-
1d8a0 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
1d8b0 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20  .    addrEofB = 
1d8c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d8d0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
1d8e0 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41  egOutA, addrOutA
1d8f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1d900 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1d910 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
1d920 6c 61 62 65 6c 45 6e 64 29 3b 20 56 64 62 65 43  labelEnd); VdbeC
1d930 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1d940 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1d950 76 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20  v, addrEofB);.  
1d960 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
1d970 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20   code to handle 
1d980 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c 42 0a  the case of A<B.
1d990 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
1d9a0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74  omment((v, "A-lt
1d9b0 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
1d9c0 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d 20 73  ;.  addrAltB = s
1d9d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1d9e0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
1d9f0 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29  gOutA, addrOutA)
1da00 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1da10 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1da20 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64  d, regAddrA, add
1da30 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65  rEofA); VdbeCove
1da40 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
1da50 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61  e3VdbeGoto(v, la
1da60 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20  belCmpr);..  /* 
1da70 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1da80 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65   handle the case
1da90 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20   of A==B.  */.  
1daa0 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  if( op==TK_ALL )
1dab0 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d  {.    addrAeqB =
1dac0 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c   addrAltB;.  }el
1dad0 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  se if( op==TK_IN
1dae0 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
1daf0 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c  ddrAeqB = addrAl
1db00 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74 42  tB;.    addrAltB
1db10 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
1db20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1db30 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75 62  ((v, "A-eq-B sub
1db40 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20  routine"));.    
1db50 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20 73  addrAeqB =.    s
1db60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1db70 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1db80 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41  gAddrA, addrEofA
1db90 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1dba0 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
1dbb0 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c  dbeGoto(v, label
1dbc0 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Cmpr);.  }..  /*
1dbd0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1dbe0 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
1dbf0 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20  e of A>B.  */.  
1dc00 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1dc10 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62 72  (v, "A-gt-B subr
1dc20 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64  outine"));.  add
1dc30 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33 56  rAgtB = sqlite3V
1dc40 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1dc50 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  );.  if( op==TK_
1dc60 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e  ALL || op==TK_UN
1dc70 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ION ){.    sqlit
1dc80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1dc90 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
1dca0 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20  B, addrOutB);.  
1dcb0 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
1dcc0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1dcd0 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64  d, regAddrB, add
1dce0 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65  rEofB); VdbeCove
1dcf0 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
1dd00 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61  e3VdbeGoto(v, la
1dd10 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20  belCmpr);..  /* 
1dd20 54 68 69 73 20 63 6f 64 65 20 72 75 6e 73 20 6f  This code runs o
1dd30 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  nce to initializ
1dd40 65 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20 20  e everything..  
1dd50 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1dd60 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
1dd70 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
1dd80 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1dd90 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61  eld, regAddrA, a
1dda0 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b 20 56 64  ddrEofA_noB); Vd
1ddb0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1ddc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ddd0 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1dde0 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f  regAddrB, addrEo
1ddf0 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  fB); VdbeCoverag
1de00 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c  e(v);..  /* Impl
1de10 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d  ement the main m
1de20 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20  erge loop.  */. 
1de30 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1de40 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65  lveLabel(v, labe
1de50 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  lCmpr);.  sqlite
1de60 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1de70 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30  P_Permutation, 0
1de80 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 61  , 0, 0, (char*)a
1de90 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41  Permute, P4_INTA
1dea0 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65 33  RRAY);.  sqlite3
1deb0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1dec0 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e  _Compare, destA.
1ded0 69 53 64 73 74 2c 20 64 65 73 74 42 2e 69 53 64  iSdst, destB.iSd
1dee0 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20  st, nOrderBy,.  
1def0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df00 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
1df10 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59 49  eyMerge, P4_KEYI
1df20 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  NFO);.  sqlite3V
1df30 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
1df40 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29 3b 0a  PFLAG_PERMUTE);.
1df50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1df60 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
1df70 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41 65  addrAltB, addrAe
1df80 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b 20 56  qB, addrAgtB); V
1df90 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1dfa0 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
1dfb0 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20  e this point in 
1dfc0 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e 61  order to termina
1dfd0 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20  te the query..  
1dfe0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1dff0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1e000 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a  labelEnd);..  /*
1e010 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65 20   Reassembly the 
1e020 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 73  compound query s
1e030 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62  o that it will b
1e040 65 20 66 72 65 65 64 20 63 6f 72 72 65 63 74 6c  e freed correctl
1e050 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63 61  y.  ** by the ca
1e060 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a  lling function *
1e070 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
1e080 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
1e090 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
1e0a0 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d   p->pPrior);.  }
1e0b0 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70  .  p->pPrior = p
1e0c0 50 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f 72 2d  Prior;.  pPrior-
1e0d0 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20 20 2f  >pNext = p;..  /
1e0e0 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72 74  *** TBD:  Insert
1e0f0 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c   subroutine call
1e100 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f  s to close curso
1e110 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65  rs on incomplete
1e120 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69  .  **** subqueri
1e130 65 73 20 2a 2a 2a 2a 2f 0a 20 20 45 78 70 6c 61  es ****/.  Expla
1e140 69 6e 51 75 65 72 79 50 6c 61 6e 50 6f 70 28 70  inQueryPlanPop(p
1e150 50 61 72 73 65 29 3b 0a 20 20 72 65 74 75 72 6e  Parse);.  return
1e160 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 21 3d 30   pParse->nErr!=0
1e170 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
1e180 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1e190 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
1e1a0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
1e1b0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 0a 2f 2a  E_OMIT_VIEW)../*
1e1c0 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
1e1d0 74 68 65 20 53 75 62 73 74 43 6f 6e 74 65 78 74  the SubstContext
1e1e0 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69 62 65   object describe
1e1f0 73 20 61 6e 20 73 75 62 73 74 69 74 75 74 69 6f  s an substitutio
1e200 6e 20 65 64 69 74 0a 2a 2a 20 74 6f 20 62 65 20  n edit.** to be 
1e210 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 61 20 70  performed on a p
1e220 61 72 73 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a  arse tree..**.**
1e230 20 41 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20   All references 
1e240 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61  to columns in ta
1e250 62 6c 65 20 69 54 61 62 6c 65 20 61 72 65 20 74  ble iTable are t
1e260 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20 62 79  o be replaced by
1e270 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
1e280 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  * expressions in
1e290 20 70 45 4c 69 73 74 2e 0a 2a 2f 0a 74 79 70 65   pEList..*/.type
1e2a0 64 65 66 20 73 74 72 75 63 74 20 53 75 62 73 74  def struct Subst
1e2b0 43 6f 6e 74 65 78 74 20 7b 0a 20 20 50 61 72 73  Context {.  Pars
1e2c0 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
1e2d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
1e2e0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1e2f0 20 20 69 6e 74 20 69 54 61 62 6c 65 3b 20 20 20    int iTable;   
1e300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1e310 65 70 6c 61 63 65 20 72 65 66 65 72 65 6e 63 65  eplace reference
1e320 73 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  s to this table 
1e330 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77 54 61 62  */.  int iNewTab
1e340 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  le;            /
1e350 2a 20 4e 65 77 20 74 61 62 6c 65 20 6e 75 6d 62  * New table numb
1e360 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c 65  er */.  int isLe
1e370 66 74 4a 6f 69 6e 3b 20 20 20 20 20 20 20 20 20  ftJoin;         
1e380 20 20 2f 2a 20 41 64 64 20 54 4b 5f 49 46 5f 4e    /* Add TK_IF_N
1e390 55 4c 4c 5f 52 4f 57 20 6f 70 63 6f 64 65 73 20  ULL_ROW opcodes 
1e3a0 6f 6e 20 65 61 63 68 20 72 65 70 6c 61 63 65 6d  on each replacem
1e3b0 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ent */.  ExprLis
1e3c0 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
1e3d0 20 20 20 2f 2a 20 52 65 70 6c 61 63 65 6d 65 6e     /* Replacemen
1e3e0 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f  t expressions */
1e3f0 0a 7d 20 53 75 62 73 74 43 6f 6e 74 65 78 74 3b  .} SubstContext;
1e400 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63  ../* Forward Dec
1e410 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61  larations */.sta
1e420 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
1e430 70 72 4c 69 73 74 28 53 75 62 73 74 43 6f 6e 74  prList(SubstCont
1e440 65 78 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29  ext*, ExprList*)
1e450 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  ;.static void su
1e460 62 73 74 53 65 6c 65 63 74 28 53 75 62 73 74 43  bstSelect(SubstC
1e470 6f 6e 74 65 78 74 2a 2c 20 53 65 6c 65 63 74 2a  ontext*, Select*
1e480 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53  , int);../*.** S
1e490 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  can through the 
1e4a0 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
1e4b0 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79  .  Replace every
1e4c0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a   reference to.**
1e4d0 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62   a column in tab
1e4e0 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65  le number iTable
1e4f0 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
1e500 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a  the iColumn-th.*
1e510 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73  * entry in pELis
1e520 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72  t.  (But leave r
1e530 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
1e540 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a   ROWID column .*
1e550 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a  * unchanged.).**
1e560 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1e570 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
1e580 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65  flattening proce
1e590 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65 72  dure.  A subquer
1e5a0 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c  y.** whose resul
1e5b0 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64  t set is defined
1e5c0 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65 61   by pEList appea
1e5d0 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74  rs as entry in t
1e5e0 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73  he.** FROM claus
1e5f0 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75  e of a SELECT su
1e600 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42 45  ch that the VDBE
1e610 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64   cursor assigned
1e620 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d   to that.** FORM
1e630 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73   clause entry is
1e640 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72   iTable.  This r
1e650 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 74 68 65  outine makes the
1e660 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63   necessary .** c
1e670 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20  hanges to pExpr 
1e680 73 6f 20 74 68 61 74 20 69 74 20 72 65 66 65 72  so that it refer
1e690 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  s directly to th
1e6a0 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a  e source table.*
1e6b0 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
1e6c0 79 20 72 61 74 68 65 72 20 74 68 65 20 72 65 73  y rather the res
1e6d0 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 73  ult set of the s
1e6e0 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  ubquery..*/.stat
1e6f0 69 63 20 45 78 70 72 20 2a 73 75 62 73 74 45 78  ic Expr *substEx
1e700 70 72 28 0a 20 20 53 75 62 73 74 43 6f 6e 74 65  pr(.  SubstConte
1e710 78 74 20 2a 70 53 75 62 73 74 2c 20 20 2f 2a 20  xt *pSubst,  /* 
1e720 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  Description of t
1e730 68 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20  he substitution 
1e740 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
1e750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
1e760 78 70 72 20 69 6e 20 77 68 69 63 68 20 73 75 62  xpr in which sub
1e770 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 73  stitution occurs
1e780 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78   */.){.  if( pEx
1e790 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  pr==0 ) return 0
1e7a0 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
1e7b0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1e7c0 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 26  P_FromJoin).   &
1e7d0 26 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a  & pExpr->iRightJ
1e7e0 6f 69 6e 54 61 62 6c 65 3d 3d 70 53 75 62 73 74  oinTable==pSubst
1e7f0 2d 3e 69 54 61 62 6c 65 0a 20 20 29 7b 0a 20 20  ->iTable.  ){.  
1e800 20 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a    pExpr->iRightJ
1e810 6f 69 6e 54 61 62 6c 65 20 3d 20 70 53 75 62 73  oinTable = pSubs
1e820 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20  t->iNewTable;.  
1e830 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  }.  if( pExpr->o
1e840 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
1e850 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
1e860 53 75 62 73 74 2d 3e 69 54 61 62 6c 65 20 29 7b  Subst->iTable ){
1e870 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
1e880 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  iColumn<0 ){.   
1e890 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
1e8a0 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73  K_NULL;.    }els
1e8b0 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  e{.      Expr *p
1e8c0 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20  New;.      Expr 
1e8d0 2a 70 43 6f 70 79 20 3d 20 70 53 75 62 73 74 2d  *pCopy = pSubst-
1e8e0 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72  >pEList->a[pExpr
1e8f0 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72  ->iColumn].pExpr
1e900 3b 0a 20 20 20 20 20 20 45 78 70 72 20 69 66 4e  ;.      Expr ifN
1e910 75 6c 6c 52 6f 77 3b 0a 20 20 20 20 20 20 61 73  ullRow;.      as
1e920 73 65 72 74 28 20 70 53 75 62 73 74 2d 3e 70 45  sert( pSubst->pE
1e930 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70 72  List!=0 && pExpr
1e940 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 53 75 62 73 74  ->iColumn<pSubst
1e950 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
1e960 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e970 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30   pExpr->pLeft==0
1e980 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68   && pExpr->pRigh
1e990 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  t==0 );.      if
1e9a0 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56  ( sqlite3ExprIsV
1e9b0 65 63 74 6f 72 28 70 43 6f 70 79 29 20 29 7b 0a  ector(pCopy) ){.
1e9c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1e9d0 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 70 53  ectorErrorMsg(pS
1e9e0 75 62 73 74 2d 3e 70 50 61 72 73 65 2c 20 70 43  ubst->pParse, pC
1e9f0 6f 70 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  opy);.      }els
1ea00 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
1ea10 65 33 20 2a 64 62 20 3d 20 70 53 75 62 73 74 2d  e3 *db = pSubst-
1ea20 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20  >pParse->db;.   
1ea30 20 20 20 20 20 69 66 28 20 70 53 75 62 73 74 2d       if( pSubst-
1ea40 3e 69 73 4c 65 66 74 4a 6f 69 6e 20 26 26 20 70  >isLeftJoin && p
1ea50 43 6f 70 79 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Copy->op!=TK_COL
1ea60 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
1ea70 20 6d 65 6d 73 65 74 28 26 69 66 4e 75 6c 6c 52   memset(&ifNullR
1ea80 6f 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 66  ow, 0, sizeof(if
1ea90 4e 75 6c 6c 52 6f 77 29 29 3b 0a 20 20 20 20 20  NullRow));.     
1eaa0 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 6f       ifNullRow.o
1eab0 70 20 3d 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52  p = TK_IF_NULL_R
1eac0 4f 57 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  OW;.          if
1ead0 4e 75 6c 6c 52 6f 77 2e 70 4c 65 66 74 20 3d 20  NullRow.pLeft = 
1eae0 70 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 20  pCopy;.         
1eaf0 20 69 66 4e 75 6c 6c 52 6f 77 2e 69 54 61 62 6c   ifNullRow.iTabl
1eb00 65 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65 77  e = pSubst->iNew
1eb10 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
1eb20 20 70 43 6f 70 79 20 3d 20 26 69 66 4e 75 6c 6c   pCopy = &ifNull
1eb30 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Row;.        }. 
1eb40 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
1eb50 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
1eb60 20 70 43 6f 70 79 2c 20 30 29 3b 0a 20 20 20 20   pCopy, 0);.    
1eb70 20 20 20 20 69 66 28 20 70 4e 65 77 20 26 26 20      if( pNew && 
1eb80 70 53 75 62 73 74 2d 3e 69 73 4c 65 66 74 4a 6f  pSubst->isLeftJo
1eb90 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  in ){.          
1eba0 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
1ebb0 70 4e 65 77 2c 20 45 50 5f 43 61 6e 42 65 4e 75  pNew, EP_CanBeNu
1ebc0 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ll);.        }. 
1ebd0 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20         if( pNew 
1ebe0 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  && ExprHasProper
1ebf0 74 79 28 70 45 78 70 72 2c 45 50 5f 46 72 6f 6d  ty(pExpr,EP_From
1ec00 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  Join) ){.       
1ec10 20 20 20 70 4e 65 77 2d 3e 69 52 69 67 68 74 4a     pNew->iRightJ
1ec20 6f 69 6e 54 61 62 6c 65 20 3d 20 70 45 78 70 72  oinTable = pExpr
1ec30 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
1ec40 65 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  e;.          Exp
1ec50 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 4e 65  rSetProperty(pNe
1ec60 77 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  w, EP_FromJoin);
1ec70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ec80 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
1ec90 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
1eca0 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d  .        pExpr =
1ecb0 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20   pNew;.      }. 
1ecc0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1ecd0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
1ece0 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20  =TK_IF_NULL_ROW 
1ecf0 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  && pExpr->iTable
1ed00 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c 65  ==pSubst->iTable
1ed10 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
1ed20 3e 69 54 61 62 6c 65 20 3d 20 70 53 75 62 73 74  >iTable = pSubst
1ed30 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20  ->iNewTable;.   
1ed40 20 7d 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c   }.    pExpr->pL
1ed50 65 66 74 20 3d 20 73 75 62 73 74 45 78 70 72 28  eft = substExpr(
1ed60 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 70  pSubst, pExpr->p
1ed70 4c 65 66 74 29 3b 0a 20 20 20 20 70 45 78 70 72  Left);.    pExpr
1ed80 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62 73 74  ->pRight = subst
1ed90 45 78 70 72 28 70 53 75 62 73 74 2c 20 70 45 78  Expr(pSubst, pEx
1eda0 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
1edb0 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
1edc0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
1edd0 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
1ede0 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 70     substSelect(p
1edf0 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 78 2e  Subst, pExpr->x.
1ee00 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20 20 20  pSelect, 1);.   
1ee10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75   }else{.      su
1ee20 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62  bstExprList(pSub
1ee30 73 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  st, pExpr->x.pLi
1ee40 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  st);.    }.  }. 
1ee50 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d   return pExpr;.}
1ee60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
1ee70 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20 53 75  stExprList(.  Su
1ee80 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62  bstContext *pSub
1ee90 73 74 2c 20 2f 2a 20 44 65 73 63 72 69 70 74 69  st, /* Descripti
1eea0 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74 69  on of the substi
1eeb0 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  tution */.  Expr
1eec0 4c 69 73 74 20 2a 70 4c 69 73 74 20 20 20 20 20  List *pList     
1eed0 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63 61    /* List to sca
1eee0 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20 74  n and in which t
1eef0 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74  o make substitut
1ef00 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  es */.){.  int i
1ef10 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
1ef20 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
1ef30 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
1ef40 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
1ef50 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
1ef60 72 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53  r = substExpr(pS
1ef70 75 62 73 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  ubst, pList->a[i
1ef80 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a  ].pExpr);.  }.}.
1ef90 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
1efa0 74 53 65 6c 65 63 74 28 0a 20 20 53 75 62 73 74  tSelect(.  Subst
1efb0 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74 2c  Context *pSubst,
1efc0 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
1efd0 6f 66 20 74 68 65 20 73 75 62 73 74 69 74 75 74  of the substitut
1efe0 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ion */.  Select 
1eff0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
1f000 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
1f010 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d  nt in which to m
1f020 61 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e  ake substitution
1f030 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 50 72 69  s */.  int doPri
1f040 6f 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or           /* 
1f050 44 6f 20 73 75 62 73 74 69 74 75 74 65 73 20 6f  Do substitutes o
1f060 6e 20 70 2d 3e 70 50 72 69 6f 72 20 74 6f 6f 20  n p->pPrior too 
1f070 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20  */.){.  SrcList 
1f080 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74 20  *pSrc;.  struct 
1f090 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1f0a0 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tem;.  int i;.  
1f0b0 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b  if( !p ) return;
1f0c0 0a 20 20 64 6f 7b 0a 20 20 20 20 73 75 62 73 74  .  do{.    subst
1f0d0 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c  ExprList(pSubst,
1f0e0 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20   p->pEList);.   
1f0f0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
1f100 53 75 62 73 74 2c 20 70 2d 3e 70 47 72 6f 75 70  Subst, p->pGroup
1f110 42 79 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78  By);.    substEx
1f120 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70  prList(pSubst, p
1f130 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
1f140 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75   p->pHaving = su
1f150 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20  bstExpr(pSubst, 
1f160 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  p->pHaving);.   
1f170 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62   p->pWhere = sub
1f180 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70  stExpr(pSubst, p
1f190 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 70  ->pWhere);.    p
1f1a0 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
1f1b0 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21     assert( pSrc!
1f1c0 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  =0 );.    for(i=
1f1d0 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74 65  pSrc->nSrc, pIte
1f1e0 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b 20  m=pSrc->a; i>0; 
1f1f0 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i--, pItem++){. 
1f200 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74       substSelect
1f210 28 70 53 75 62 73 74 2c 20 70 49 74 65 6d 2d 3e  (pSubst, pItem->
1f220 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20 20 20  pSelect, 1);.   
1f230 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
1f240 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20  .isTabFunc ){.  
1f250 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c        substExprL
1f260 69 73 74 28 70 53 75 62 73 74 2c 20 70 49 74 65  ist(pSubst, pIte
1f270 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 29 3b  m->u1.pFuncArg);
1f280 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f290 20 7d 77 68 69 6c 65 28 20 64 6f 50 72 69 6f 72   }while( doPrior
1f2a0 20 26 26 20 28 70 20 3d 20 70 2d 3e 70 50 72 69   && (p = p->pPri
1f2b0 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a 23 65 6e 64  or)!=0 );.}.#end
1f2c0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
1f2d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1f2e0 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
1f2f0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
1f300 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  W) */..#if !defi
1f310 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1f320 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
1f330 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1f340 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68  T_VIEW)./*.** Th
1f350 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
1f360 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73  pts to flatten s
1f370 75 62 71 75 65 72 69 65 73 20 61 73 20 61 20 70  ubqueries as a p
1f380 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d  erformance optim
1f390 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ization..** This
1f3a0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1f3b0 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63   1 if it makes c
1f3c0 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20  hanges and 0 if 
1f3d0 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 63  no flattening oc
1f3e0 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75  curs..**.** To u
1f3f0 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f  nderstand the co
1f400 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e  ncept of flatten
1f410 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68  ing, consider th
1f420 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71  e following.** q
1f430 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  uery:.**.**     
1f440 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53  SELECT a FROM (S
1f450 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
1f460 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
1f470 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a  00) WHERE a>5.**
1f480 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20  .** The default 
1f490 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74  way of implement
1f4a0 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69  ing this query i
1f4b0 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  s to execute the
1f4c0 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72  .** subquery fir
1f4d0 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  st and store the
1f4e0 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65   results in a te
1f4f0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74  mporary table, t
1f500 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f  hen.** run the o
1f510 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68  uter query on th
1f520 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  at temporary tab
1f530 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72  le.  This requir
1f540 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73  es two.** passes
1f550 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20   over the data. 
1f560 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65   Furthermore, be
1f570 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72  cause the tempor
1f580 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73  ary table.** has
1f590 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65   no indices, the
1f5a0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e   WHERE clause on
1f5b0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1f5c0 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70   cannot be.** op
1f5d0 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  timized..**.** T
1f5e0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
1f5f0 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20  mpts to rewrite 
1f600 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20  queries such as 
1f610 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a  the above into.*
1f620 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20  * a single flat 
1f630 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69  select, like thi
1f640 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
1f650 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f  ECT x+y AS a FRO
1f660 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30  M t1 WHERE z<100
1f670 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54   AND a>5.**.** T
1f680 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
1f690 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 6c  d for this simpl
1f6a0 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20  ification gives 
1f6b0 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a  the same result.
1f6c0 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20  ** but only has 
1f6d0 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61  to scan the data
1f6e0 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61   once.  And beca
1f6f0 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68  use indices migh
1f700 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74  t .** exist on t
1f710 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63  he table t1, a c
1f720 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20  omplete scan of 
1f730 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62  the data might b
1f740 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a  e.** avoided..**
1f750 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69  .** Flattening i
1f760 73 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65  s subject to the
1f770 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74   following const
1f780 72 61 69 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 28  raints:.**.**  (
1f790 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65  **)  We no longe
1f7a0 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61  r attempt to fla
1f7b0 74 74 65 6e 20 61 67 67 72 65 67 61 74 65 20 73  tten aggregate s
1f7c0 75 62 71 75 65 72 69 65 73 2e 20 57 61 73 3a 0a  ubqueries. Was:.
1f7d0 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 73 75  **        The su
1f7e0 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
1f7f0 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f  uter query canno
1f800 74 20 62 6f 74 68 20 62 65 20 61 67 67 72 65 67  t both be aggreg
1f810 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  ates..**.**  (**
1f820 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20  )  We no longer 
1f830 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74  attempt to flatt
1f840 65 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62  en aggregate sub
1f850 71 75 65 72 69 65 73 2e 20 57 61 73 3a 0a 2a 2a  queries. Was:.**
1f860 20 20 20 20 20 20 20 20 28 32 29 20 49 66 20 74          (2) If t
1f870 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61  he subquery is a
1f880 6e 20 61 67 67 72 65 67 61 74 65 20 74 68 65 6e  n aggregate then
1f890 0a 2a 2a 20 20 20 20 20 20 20 20 28 32 61 29 20  .**        (2a) 
1f8a0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1f8b0 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 20 6a 6f  must not be a jo
1f8c0 69 6e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  in and.**       
1f8d0 20 28 32 62 29 20 74 68 65 20 6f 75 74 65 72 20   (2b) the outer 
1f8e0 71 75 65 72 79 20 6d 75 73 74 20 6e 6f 74 20 75  query must not u
1f8f0 73 65 20 73 75 62 71 75 65 72 69 65 73 0a 2a 2a  se subqueries.**
1f900 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 74 68               oth
1f910 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 20  er than the one 
1f920 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
1f930 75 65 72 79 20 74 68 61 74 20 69 73 20 61 20 63  uery that is a c
1f940 61 6e 64 69 64 61 74 65 0a 2a 2a 20 20 20 20 20  andidate.**     
1f950 20 20 20 20 20 20 20 20 66 6f 72 20 66 6c 61 74          for flat
1f960 74 65 6e 69 6e 67 2e 20 20 28 54 68 69 73 20 69  tening.  (This i
1f970 73 20 64 75 65 20 74 6f 20 74 69 63 6b 65 74 20  s due to ticket 
1f980 5b 32 66 37 31 37 30 64 37 33 62 66 39 61 62 66  [2f7170d73bf9abf
1f990 38 30 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  80].**          
1f9a0 20 20 20 66 72 6f 6d 20 32 30 31 35 2d 30 32 2d     from 2015-02-
1f9b0 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29  09.).**.**   (3)
1f9c0 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
1f9d0 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f  y is the right o
1f9e0 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54  perand of a LEFT
1f9f0 20 4a 4f 49 4e 20 74 68 65 6e 0a 2a 2a 20 20 20   JOIN then.**   
1fa00 20 20 20 20 20 28 33 61 29 20 74 68 65 20 73 75       (3a) the su
1fa10 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62  bquery may not b
1fa20 65 20 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a 2a 20  e a join and.** 
1fa30 20 20 20 20 20 20 20 28 33 62 29 20 74 68 65 20         (3b) the 
1fa40 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1fa50 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20  he subquery may 
1fa60 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 76 69  not contain a vi
1fa70 72 74 75 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  rtual.**        
1fa80 20 20 20 20 20 74 61 62 6c 65 20 61 6e 64 0a 2a       table and.*
1fa90 2a 20 20 20 20 20 20 20 20 28 33 63 29 20 74 68  *        (3c) th
1faa0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61  e outer query ma
1fab0 79 20 6e 6f 74 20 62 65 20 61 6e 20 61 67 67 72  y not be an aggr
1fac0 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  egate..**.**   (
1fad0 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  4)  The subquery
1fae0 20 63 61 6e 20 6e 6f 74 20 62 65 20 44 49 53 54   can not be DIST
1faf0 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  INCT..**.**  (**
1fb00 29 20 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20  )  At one point 
1fb10 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34 29  restrictions (4)
1fb20 20 61 6e 64 20 28 35 29 20 64 65 66 69 6e 65 64   and (5) defined
1fb30 20 61 20 73 75 62 73 65 74 20 6f 66 20 44 49 53   a subset of DIS
1fb40 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  TINCT.**        
1fb50 73 75 62 2d 71 75 65 72 69 65 73 20 74 68 61 74  sub-queries that
1fb60 20 77 65 72 65 20 65 78 63 6c 75 64 65 64 20 66   were excluded f
1fb70 72 6f 6d 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  rom this optimiz
1fb80 61 74 69 6f 6e 2e 20 52 65 73 74 72 69 63 74 69  ation. Restricti
1fb90 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 28 34  on .**        (4
1fba0 29 20 68 61 73 20 73 69 6e 63 65 20 62 65 65 6e  ) has since been
1fbb0 20 65 78 70 61 6e 64 65 64 20 74 6f 20 65 78 63   expanded to exc
1fbc0 6c 75 64 65 20 61 6c 6c 20 44 49 53 54 49 4e 43  lude all DISTINC
1fbd0 54 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  T subqueries..**
1fbe0 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f  .**  (**)  We no
1fbf0 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20   longer attempt 
1fc00 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65  to flatten aggre
1fc10 67 61 74 65 20 73 75 62 71 75 65 72 69 65 73 2e  gate subqueries.
1fc20 20 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20    Was:.**       
1fc30 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
1fc40 20 69 73 20 61 67 67 72 65 67 61 74 65 2c 20 74   is aggregate, t
1fc50 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d  he outer query m
1fc60 61 79 20 6e 6f 74 20 62 65 20 44 49 53 54 49 4e  ay not be DISTIN
1fc70 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20  CT..**.**   (7) 
1fc80 20 54 68 65 20 73 75 62 71 75 65 72 79 20 6d 75   The subquery mu
1fc90 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d 20 63  st have a FROM c
1fca0 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20 46  lause.  TODO:  F
1fcb0 6f 72 20 73 75 62 71 75 65 72 69 65 73 20 77 69  or subqueries wi
1fcc0 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  thout.**        
1fcd0 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20 63  A FROM clause, c
1fce0 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 61  onsider adding a
1fcf0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 69 74   FROM clause wit
1fd00 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a  h the special.**
1fd10 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 73 71          table sq
1fd20 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74 20 63  lite_once that c
1fd30 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73 69 6e  onsists of a sin
1fd40 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69  gle row containi
1fd50 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 73  ng a.**        s
1fd60 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  ingle NULL..**.*
1fd70 2a 20 20 20 28 38 29 20 20 49 66 20 74 68 65 20  *   (8)  If the 
1fd80 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c 49  subquery uses LI
1fd90 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75 74  MIT then the out
1fda0 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  er query may not
1fdb0 20 62 65 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a   be a join..**.*
1fdc0 2a 20 20 20 28 39 29 20 20 49 66 20 74 68 65 20  *   (9)  If the 
1fdd0 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c 49  subquery uses LI
1fde0 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75 74  MIT then the out
1fdf0 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  er query may not
1fe00 20 62 65 20 61 67 67 72 65 67 61 74 65 2e 0a 2a   be aggregate..*
1fe10 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 52 65 73 74  *.**  (**)  Rest
1fe20 72 69 63 74 69 6f 6e 20 28 31 30 29 20 77 61 73  riction (10) was
1fe30 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
1fe40 65 20 63 6f 64 65 20 6f 6e 20 32 30 30 35 2d 30  e code on 2005-0
1fe50 32 2d 30 35 20 62 75 74 20 77 65 0a 2a 2a 20 20  2-05 but we.**  
1fe60 20 20 20 20 20 20 61 63 63 69 64 65 6e 74 6c 79        accidently
1fe70 20 63 61 72 72 69 65 64 20 74 68 65 20 63 6f 6d   carried the com
1fe80 6d 65 6e 74 20 66 6f 72 77 61 72 64 20 75 6e 74  ment forward unt
1fe90 69 6c 20 32 30 31 34 2d 30 39 2d 31 35 2e 20 20  il 2014-09-15.  
1fea0 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20  Original.**     
1feb0 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 3a 20 22     constraint: "
1fec0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1fed0 69 73 20 61 67 67 72 65 67 61 74 65 20 74 68 65  is aggregate the
1fee0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1fef0 79 20 0a 2a 2a 20 20 20 20 20 20 20 20 6d 61 79  y .**        may
1ff00 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 2e 22   not use LIMIT."
1ff10 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68  .**.**  (11)  Th
1ff20 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
1ff30 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d  he outer query m
1ff40 61 79 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65  ay not both have
1ff50 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1ff60 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  s..**.**  (**)  
1ff70 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e  Not implemented.
1ff80 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f 20    Subsumed into 
1ff90 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29 2e  restriction (3).
1ffa0 20 20 57 61 73 20 70 72 65 76 69 6f 75 73 6c 79    Was previously
1ffb0 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73 65 70  .**        a sep
1ffc0 61 72 61 74 65 20 72 65 73 74 72 69 63 74 69 6f  arate restrictio
1ffd0 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f 6d 20  n deriving from 
1ffe0 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a  ticket #350..**.
1fff0 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20 73 75  **  (13)  The su
20000 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65 72  bquery and outer
20010 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62   query may not b
20020 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a  oth use LIMIT..*
20030 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20  *.**  (14)  The 
20040 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
20050 20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a   use OFFSET..**.
20060 2a 2a 20 20 28 31 35 29 20 20 49 66 20 74 68 65  **  (15)  If the
20070 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
20080 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75  part of a compou
20090 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20  nd select, then 
200a0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75  the.**        su
200b0 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 75  bquery may not u
200c0 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 20 20 20 20  se LIMIT..**    
200d0 20 20 20 20 28 53 65 65 20 74 69 63 6b 65 74 20      (See ticket 
200e0 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65 74  #2339 and ticket
200f0 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e 0a   [02a8e81d44])..
20100 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 49 66 20  **.**  (16)  If 
20110 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
20120 69 73 20 61 67 67 72 65 67 61 74 65 2c 20 74 68  is aggregate, th
20130 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 79 20  en the subquery 
20140 6d 61 79 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  may not.**      
20150 20 20 75 73 65 20 4f 52 44 45 52 20 42 59 2e 20    use ORDER BY. 
20160 20 28 54 69 63 6b 65 74 20 23 32 39 34 32 29 20   (Ticket #2942) 
20170 20 54 68 69 73 20 75 73 65 64 20 74 6f 20 6e 6f   This used to no
20180 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20 20  t matter.**     
20190 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e 74 72     until we intr
201a0 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f 75 70  oduced the group
201b0 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63 74 69  _concat() functi
201c0 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37  on.  .**.**  (17
201d0 29 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  )  If the subque
201e0 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
201f0 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 0a 2a 2a   select, then.**
20200 20 20 20 20 20 20 20 20 28 31 37 61 29 20 61 6c          (17a) al
20210 6c 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61  l compound opera
20220 74 6f 72 73 20 6d 75 73 74 20 62 65 20 61 20 55  tors must be a U
20230 4e 49 4f 4e 20 41 4c 4c 2c 20 61 6e 64 0a 2a 2a  NION ALL, and.**
20240 20 20 20 20 20 20 20 20 28 31 37 62 29 20 6e 6f          (17b) no
20250 20 74 65 72 6d 73 20 77 69 74 68 69 6e 20 74 68   terms within th
20260 65 20 73 75 62 71 75 65 72 79 20 63 6f 6d 70 6f  e subquery compo
20270 75 6e 64 20 6d 61 79 20 62 65 20 61 67 67 72 65  und may be aggre
20280 67 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  gate.**         
20290 20 20 20 20 20 6f 72 20 44 49 53 54 49 4e 43 54       or DISTINCT
202a0 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  , and.**        
202b0 28 31 37 63 29 20 65 76 65 72 79 20 74 65 72 6d  (17c) every term
202c0 20 77 69 74 68 69 6e 20 74 68 65 20 73 75 62 71   within the subq
202d0 75 65 72 79 20 63 6f 6d 70 6f 75 6e 64 20 6d 75  uery compound mu
202e0 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d 20 63  st have a FROM c
202f0 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  lause.**        
20300 28 31 37 64 29 20 74 68 65 20 6f 75 74 65 72 20  (17d) the outer 
20310 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
20320 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
20330 20 28 31 37 64 31 29 20 61 67 67 72 65 67 61 74   (17d1) aggregat
20340 65 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20  e, or.**        
20350 20 20 20 20 20 20 28 31 37 64 32 29 20 44 49 53        (17d2) DIS
20360 54 49 4e 43 54 2c 20 6f 72 0a 2a 2a 20 20 20 20  TINCT, or.**    
20370 20 20 20 20 20 20 20 20 20 20 28 31 37 64 33 29            (17d3)
20380 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
20390 20 20 20 20 20 20 54 68 65 20 70 61 72 65 6e 74        The parent
203a0 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79 20 6d   and sub-query m
203b0 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45 52 45  ay contain WHERE
203c0 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a 65 63   clauses. Subjec
203d0 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 72  t to.**        r
203e0 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33 29 20  ules (11), (13) 
203f0 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79 20 6d  and (14), they m
20400 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20  ay also contain 
20410 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20 20  ORDER BY,.**    
20420 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46      LIMIT and OF
20430 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 20 54  FSET clauses.  T
20440 68 65 20 73 75 62 71 75 65 72 79 20 63 61 6e 6e  he subquery cann
20450 6f 74 20 75 73 65 20 61 6e 79 20 63 6f 6d 70 6f  ot use any compo
20460 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70  und.**        op
20470 65 72 61 74 6f 72 20 6f 74 68 65 72 20 74 68 61  erator other tha
20480 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65 63 61  n UNION ALL beca
20490 75 73 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65  use all the othe
204a0 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20  r compound.**   
204b0 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73 20 68       operators h
204c0 61 76 65 20 61 6e 20 69 6d 70 6c 69 65 64 20 44  ave an implied D
204d0 49 53 54 49 4e 43 54 20 77 68 69 63 68 20 69 73  ISTINCT which is
204e0 20 64 69 73 61 6c 6c 6f 77 65 64 20 62 79 0a 2a   disallowed by.*
204f0 2a 20 20 20 20 20 20 20 20 72 65 73 74 72 69 63  *        restric
20500 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a 20  tion (4)..**.** 
20510 20 20 20 20 20 20 20 41 6c 73 6f 2c 20 65 61 63         Also, eac
20520 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 74  h component of t
20530 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d 75 73  he sub-query mus
20540 74 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d  t return the sam
20550 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20 20  e number.**     
20560 20 20 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c     of result col
20570 75 6d 6e 73 2e 20 54 68 69 73 20 69 73 20 61 63  umns. This is ac
20580 74 75 61 6c 6c 79 20 61 20 72 65 71 75 69 72 65  tually a require
20590 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 6f 6d  ment for any com
205a0 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  pound.**        
205b0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
205c0 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20 63 6f  , but all the co
205d0 64 65 20 68 65 72 65 20 64 6f 65 73 20 69 73 20  de here does is 
205e0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 6e  make sure that n
205f0 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 63 68  o.**        such
20600 20 28 69 6c 6c 65 67 61 6c 29 20 73 75 62 2d 71   (illegal) sub-q
20610 75 65 72 79 20 69 73 20 66 6c 61 74 74 65 6e 65  uery is flattene
20620 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  d. The caller wi
20630 6c 6c 20 64 65 74 65 63 74 20 74 68 65 0a 2a 2a  ll detect the.**
20640 20 20 20 20 20 20 20 20 73 79 6e 74 61 78 20 65          syntax e
20650 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72 6e 20  rror and return 
20660 61 20 64 65 74 61 69 6c 65 64 20 6d 65 73 73 61  a detailed messa
20670 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29 20  ge..**.**  (18) 
20680 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
20690 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
206a0 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c 6c  select, then all
206b0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a   terms of the.**
206c0 20 20 20 20 20 20 20 20 4f 52 44 45 52 20 42 59          ORDER BY
206d0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 70   clause of the p
206e0 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20 73 69  arent must be si
206f0 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20  mple references 
20700 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f  to .**        co
20710 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 75 62  lumns of the sub
20720 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28  -query..**.**  (
20730 31 39 29 20 20 49 66 20 74 68 65 20 73 75 62 71  19)  If the subq
20740 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54 20  uery uses LIMIT 
20750 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71  then the outer q
20760 75 65 72 79 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20  uery may not.** 
20770 20 20 20 20 20 20 20 68 61 76 65 20 61 20 57 48         have a WH
20780 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ERE clause..**.*
20790 2a 20 20 28 32 30 29 20 20 49 66 20 74 68 65 20  *  (20)  If the 
207a0 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
207b0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
207c0 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f 74  then it must not
207d0 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
207e0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
207f0 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37 37 33  e.  Ticket #3773
20800 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65 6c 61  .  We could rela
20810 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  x this constrain
20820 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d 65  t.**        some
20830 77 68 61 74 20 62 79 20 73 61 79 69 6e 67 20 74  what by saying t
20840 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 6f 66  hat the terms of
20850 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
20860 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20 20  ause must.**    
20870 20 20 20 20 61 70 70 65 61 72 20 61 73 20 75 6e      appear as un
20880 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c 74 20  modified result 
20890 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f  columns in the o
208a0 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 75 74  uter query.  But
208b0 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 68 61   we.**        ha
208c0 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a  ve other optimiz
208d0 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20 74  ations in mind t
208e0 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 61 74  o deal with that
208f0 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32   case..**.**  (2
20900 31 29 20 20 49 66 20 74 68 65 20 73 75 62 71 75  1)  If the subqu
20910 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54 20 74  ery uses LIMIT t
20920 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75  hen the outer qu
20930 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a  ery may not be.*
20940 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43  *        DISTINC
20950 54 2e 20 20 28 53 65 65 20 74 69 63 6b 65 74 20  T.  (See ticket 
20960 5b 37 35 32 65 31 36 34 36 66 63 5d 29 2e 0a 2a  [752e1646fc])..*
20970 2a 0a 2a 2a 20 20 28 32 32 29 20 20 54 68 65 20  *.**  (22)  The 
20980 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
20990 20 62 65 20 61 20 72 65 63 75 72 73 69 76 65 20   be a recursive 
209a0 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  CTE..**.**  (**)
209b0 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f 20    Subsumed into 
209c0 72 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37 64  restriction (17d
209d0 33 29 2e 20 20 57 61 73 3a 20 49 66 20 74 68 65  3).  Was: If the
209e0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 0a   outer query is.
209f0 2a 2a 20 20 20 20 20 20 20 20 61 20 72 65 63 75  **        a recu
20a00 72 73 69 76 65 20 43 54 45 2c 20 74 68 65 6e 20  rsive CTE, then 
20a10 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d 61  the sub-query ma
20a20 79 20 6e 6f 74 20 62 65 20 61 20 63 6f 6d 70 6f  y not be a compo
20a30 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 20 20 20  und query..**   
20a40 20 20 20 20 20 54 68 69 73 20 72 65 73 74 72 69       This restri
20a50 63 74 69 6f 6e 20 69 73 20 62 65 63 61 75 73 65  ction is because
20a60 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68   transforming th
20a70 65 0a 2a 2a 20 20 20 20 20 20 20 20 70 61 72 65  e.**        pare
20a80 6e 74 20 74 6f 20 61 20 63 6f 6d 70 6f 75 6e 64  nt to a compound
20a90 20 71 75 65 72 79 20 63 6f 6e 66 75 73 65 73 20   query confuses 
20aa0 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 68 61  the code that ha
20ab0 6e 64 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  ndles.**        
20ac0 72 65 63 75 72 73 69 76 65 20 71 75 65 72 69 65  recursive querie
20ad0 73 20 69 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74  s in multiSelect
20ae0 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20  ()..**.**  (**) 
20af0 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 74   We no longer at
20b00 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74 65 6e  tempt to flatten
20b10 20 61 67 67 72 65 67 61 74 65 20 73 75 62 71 75   aggregate subqu
20b20 65 72 69 65 73 2e 20 20 57 61 73 3a 0a 2a 2a 20  eries.  Was:.** 
20b30 20 20 20 20 20 20 20 54 68 65 20 73 75 62 71 75         The subqu
20b40 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61  ery may not be a
20b50 6e 20 61 67 67 72 65 67 61 74 65 20 74 68 61 74  n aggregate that
20b60 20 75 73 65 73 20 74 68 65 20 62 75 69 6c 74 2d   uses the built-
20b70 69 6e 20 6d 69 6e 28 29 20 6f 72 20 0a 2a 2a 20  in min() or .** 
20b80 20 20 20 20 20 20 20 6f 72 20 6d 61 78 28 29 20         or max() 
20b90 66 75 6e 63 74 69 6f 6e 73 2e 20 20 28 57 69 74  functions.  (Wit
20ba0 68 6f 75 74 20 74 68 69 73 20 72 65 73 74 72 69  hout this restri
20bb0 63 74 69 6f 6e 2c 20 61 20 71 75 65 72 79 20 6c  ction, a query l
20bc0 69 6b 65 3a 0a 2a 2a 20 20 20 20 20 20 20 20 22  ike:.**        "
20bd0 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 28 53  SELECT x FROM (S
20be0 45 4c 45 43 54 20 6d 61 78 28 79 29 2c 20 78 20  ELECT max(y), x 
20bf0 46 52 4f 4d 20 74 31 29 22 20 77 6f 75 6c 64 20  FROM t1)" would 
20c00 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 0a  not necessarily.
20c10 2a 2a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  **        return
20c20 20 74 68 65 20 76 61 6c 75 65 20 58 20 66 6f 72   the value X for
20c30 20 77 68 69 63 68 20 59 20 77 61 73 20 6d 61 78   which Y was max
20c40 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 20 20 28 32  imal.).**.**  (2
20c50 35 29 20 20 49 66 20 65 69 74 68 65 72 20 74 68  5)  If either th
20c60 65 20 73 75 62 71 75 65 72 79 20 6f 72 20 74 68  e subquery or th
20c70 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 63  e parent query c
20c80 6f 6e 74 61 69 6e 73 20 61 20 77 69 6e 64 6f 77  ontains a window
20c90 0a 2a 2a 20 20 20 20 20 20 20 20 66 75 6e 63 74  .**        funct
20ca0 69 6f 6e 20 69 6e 20 74 68 65 20 73 65 6c 65 63  ion in the selec
20cb0 74 20 6c 69 73 74 20 6f 72 20 4f 52 44 45 52 20  t list or ORDER 
20cc0 42 59 20 63 6c 61 75 73 65 2c 20 66 6c 61 74 74  BY clause, flatt
20cd0 65 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  ening.**        
20ce0 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64  is not attempted
20cf0 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  ..**.**.** In th
20d00 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20  is routine, the 
20d10 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  "p" parameter is
20d20 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
20d30 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a  e outer query..*
20d40 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69  * The subquery i
20d50 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72  s p->pSrc->a[iFr
20d60 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74  om].  isAgg is t
20d70 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72  rue if the outer
20d80 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61   query.** uses a
20d90 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
20da0 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
20db0 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c  s not attempted,
20dc0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
20dd0 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74   a no-op and ret
20de0 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c  urns 0..** If fl
20df0 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65  attening is atte
20e00 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69  mpted this routi
20e10 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a  ne returns 1..**
20e20 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65  .** All of the e
20e30 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73  xpression analys
20e40 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e  is must occur on
20e50 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20   both the outer 
20e60 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65  query and.** the
20e70 20 73 75 62 71 75 65 72 79 20 62 65 66 6f 72 65   subquery before
20e80 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   this routine ru
20e90 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
20ea0 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72  t flattenSubquer
20eb0 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
20ec0 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
20ed0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
20ee0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
20ef0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
20f00 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45  rent or outer SE
20f10 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
20f20 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20  /.  int iFrom,  
20f30 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
20f40 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  x in p->pSrc->a[
20f50 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73  ] of the inner s
20f60 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  ubquery */.  int
20f70 20 69 73 41 67 67 20 20 20 20 20 20 20 20 20 20   isAgg          
20f80 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74    /* True if out
20f90 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61  er SELECT uses a
20fa0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
20fb0 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ns */.){.  const
20fc0 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74   char *zSavedAut
20fd0 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73  hContext = pPars
20fe0 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b  e->zAuthContext;
20ff0 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65  .  Select *pPare
21000 6e 74 3b 20 20 20 20 2f 2a 20 43 75 72 72 65 6e  nt;    /* Curren
21010 74 20 55 4e 49 4f 4e 20 41 4c 4c 20 74 65 72 6d  t UNION ALL term
21020 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 71 75   of the other qu
21030 65 72 79 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ery */.  Select 
21040 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20  *pSub;       /* 
21050 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  The inner query 
21060 6f 72 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f  or "subquery" */
21070 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 31  .  Select *pSub1
21080 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ;      /* Pointe
21090 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 6d 6f  r to the rightmo
210a0 73 74 20 73 65 6c 65 63 74 20 69 6e 20 73 75 62  st select in sub
210b0 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c  -query */.  SrcL
210c0 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20  ist *pSrc;      
210d0 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
210e0 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
210f0 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69  query */.  SrcLi
21100 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f  st *pSubSrc;   /
21110 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
21120 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
21130 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65  y */.  int iPare
21140 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44  nt;        /* VD
21150 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
21160 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65 73   of the pSub res
21170 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61 62  ult set temp tab
21180 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77  le */.  int iNew
21190 50 61 72 65 6e 74 20 3d 20 2d 31 3b 2f 2a 20 52  Parent = -1;/* R
211a0 65 70 6c 61 63 65 6d 65 6e 74 20 74 61 62 6c 65  eplacement table
211b0 20 66 6f 72 20 69 50 61 72 65 6e 74 20 2a 2f 0a   for iParent */.
211c0 20 20 69 6e 74 20 69 73 4c 65 66 74 4a 6f 69 6e    int isLeftJoin
211d0 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69 66   = 0; /* True if
211e0 20 70 53 75 62 20 69 73 20 74 68 65 20 72 69 67   pSub is the rig
211f0 68 74 20 73 69 64 65 20 6f 66 20 61 20 4c 45 46  ht side of a LEF
21200 54 20 4a 4f 49 4e 20 2a 2f 20 20 20 20 0a 20 20  T JOIN */    .  
21210 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
21220 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
21230 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ter */.  Expr *p
21240 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20  Where;          
21250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
21260 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
21270 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
21280 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d  t_item *pSubitem
21290 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75  ;   /* The subqu
212a0 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
212b0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
212c0 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  b;..  /* Check t
212d0 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e  o see if flatten
212e0 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
212f0 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
21300 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ot..  */.  asser
21310 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
21320 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  ert( p->pPrior==
21330 30 20 29 3b 0a 20 20 69 66 28 20 4f 70 74 69 6d  0 );.  if( Optim
21340 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
21350 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72 79  db, SQLITE_Query
21360 46 6c 61 74 74 65 6e 65 72 29 20 29 20 72 65 74  Flattener) ) ret
21370 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20  urn 0;.  pSrc = 
21380 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
21390 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d  t( pSrc && iFrom
213a0 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72  >=0 && iFrom<pSr
213b0 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75  c->nSrc );.  pSu
213c0 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61  bitem = &pSrc->a
213d0 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65  [iFrom];.  iPare
213e0 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69  nt = pSubitem->i
213f0 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d  Cursor;.  pSub =
21400 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
21410 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  ct;.  assert( pS
21420 75 62 21 3d 30 20 29 3b 0a 0a 23 69 66 6e 64 65  ub!=0 );..#ifnde
21430 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
21440 4e 44 4f 57 46 55 4e 43 0a 20 20 69 66 28 20 70  NDOWFUNC.  if( p
21450 2d 3e 70 57 69 6e 20 7c 7c 20 70 53 75 62 2d 3e  ->pWin || pSub->
21460 70 57 69 6e 20 29 20 72 65 74 75 72 6e 20 30 3b  pWin ) return 0;
21470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21480 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
21490 20 28 32 35 29 20 2a 2f 0a 23 65 6e 64 69 66 0a   (25) */.#endif.
214a0 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75  .  pSubSrc = pSu
214b0 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  b->pSrc;.  asser
214c0 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20  t( pSubSrc );.  
214d0 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73  /* Prior to vers
214e0 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20  ion 3.1.2, when 
214f0 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
21500 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c   had to be simpl
21510 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a  e constants,.  *
21520 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20  * not arbitrary 
21530 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20  expressions, we 
21540 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d  allowed some com
21550 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20  bining of LIMIT 
21560 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20  and OFFSET.  ** 
21570 62 65 63 61 75 73 65 20 74 68 65 79 20 63 6f 75  because they cou
21580 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61  ld be computed a
21590 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20  t compile-time. 
215a0 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20   But when LIMIT 
215b0 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20  and OFFSET.  ** 
215c0 62 65 63 61 6d 65 20 61 72 62 69 74 72 61 72 79  became arbitrary
215d0 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65   expressions, we
215e0 20 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20   were forced to 
215f0 61 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73  add restrictions
21600 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28   (13).  ** and (
21610 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53  14). */.  if( pS
21620 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d  ub->pLimit && p-
21630 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >pLimit ) return
21640 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
21650 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
21660 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53  (13) */.  if( pS
21670 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 53  ub->pLimit && pS
21680 75 62 2d 3e 70 4c 69 6d 69 74 2d 3e 70 52 69 67  ub->pLimit->pRig
21690 68 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ht ) return 0;  
216a0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
216b0 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 28 70  (14) */.  if( (p
216c0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
216d0 43 6f 6d 70 6f 75 6e 64 29 21 3d 30 20 26 26 20  Compound)!=0 && 
216e0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  pSub->pLimit ){.
216f0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
21700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21720 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
21730 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a  riction (15) */.
21740 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53 72    }.  if( pSubSr
21750 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74  c->nSrc==0 ) ret
21760 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
21770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21780 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20  Restriction (7) 
21790 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
217a0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
217b0 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20  stinct ) return 
217c0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
217d0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29 20  Restriction (4) 
217e0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
217f0 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72 63 2d  pLimit && (pSrc-
21800 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67  >nSrc>1 || isAgg
21810 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  ) ){.     return
21820 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52   0;         /* R
21830 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38 29 28  estrictions (8)(
21840 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  9) */.  }.  if( 
21850 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70  p->pOrderBy && p
21860 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
21870 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
21880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 2f 2a 20 52 65 73            /* Res
218b0 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f  triction (11) */
218c0 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67  .  }.  if( isAgg
218d0 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72   && pSub->pOrder
218e0 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  By ) return 0;  
218f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21900 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 36   Restriction (16
21910 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
21920 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 57  >pLimit && p->pW
21930 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
21940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21950 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 39   Restriction (19
21960 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
21970 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d 3e 73  >pLimit && (p->s
21980 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
21990 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20 20 20  tinct)!=0 ){.   
219a0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
219b0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
219c0 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 20  on (21) */.  }. 
219d0 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c   if( pSub->selFl
219e0 61 67 73 20 26 20 28 53 46 5f 52 65 63 75 72 73  ags & (SF_Recurs
219f0 69 76 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ive) ){.    retu
21a00 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69 63  rn 0; /* Restric
21a10 74 69 6f 6e 73 20 28 32 32 29 20 2a 2f 0a 20 20  tions (22) */.  
21a20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  }..  /*.  ** If 
21a30 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
21a40 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
21a50 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  d of a LEFT JOIN
21a60 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  , then the.  ** 
21a70 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
21a80 20 62 65 20 61 20 6a 6f 69 6e 20 69 74 73 65 6c   be a join itsel
21a90 66 20 28 33 61 29 2e 20 45 78 61 6d 70 6c 65 20  f (3a). Example 
21aa0 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e  of why this is n
21ab0 6f 74 0a 20 20 2a 2a 20 61 6c 6c 6f 77 65 64 3a  ot.  ** allowed:
21ac0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
21ad0 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52     t1 LEFT OUTER
21ae0 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74   JOIN (t2 JOIN t
21af0 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  3).  **.  ** If 
21b00 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61  we flatten the a
21b10 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67  bove, we would g
21b20 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  et.  **.  **    
21b30 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55       (t1 LEFT OU
21b40 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49  TER JOIN t2) JOI
21b50 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77  N t3.  **.  ** w
21b60 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61  hich is not at a
21b70 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e  ll the same thin
21b80 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  g..  **.  ** If 
21b90 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
21ba0 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
21bb0 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  d of a LEFT JOIN
21bc0 2c 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72  , then the outer
21bd0 0a 20 20 2a 2a 20 71 75 65 72 79 20 63 61 6e 6e  .  ** query cann
21be0 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65 67 61  ot be an aggrega
21bf0 74 65 2e 20 28 33 63 29 20 20 54 68 69 73 20 69  te. (3c)  This i
21c00 73 20 61 6e 20 61 72 74 69 66 61 63 74 20 6f 66  s an artifact of
21c10 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 61 67   the way.  ** ag
21c20 67 72 65 67 61 74 65 73 20 61 72 65 20 70 72 6f  gregates are pro
21c30 63 65 73 73 65 64 20 2d 20 74 68 65 72 65 20 69  cessed - there i
21c40 73 20 6e 6f 20 6d 65 63 68 61 6e 69 73 6d 20 74  s no mechanism t
21c50 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 0a 20  o determine if. 
21c60 20 2a 2a 20 74 68 65 20 4c 45 46 54 20 4a 4f 49   ** the LEFT JOI
21c70 4e 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62  N table should b
21c80 65 20 61 6c 6c 2d 4e 55 4c 4c 2e 0a 20 20 2a 2a  e all-NULL..  **
21c90 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74  .  ** See also t
21ca0 69 63 6b 65 74 73 20 23 33 30 36 2c 20 23 33 35  ickets #306, #35
21cb0 30 2c 20 61 6e 64 20 23 33 33 30 30 2e 0a 20 20  0, and #3300..  
21cc0 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62 69 74  */.  if( (pSubit
21cd0 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  em->fg.jointype 
21ce0 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29  & JT_OUTER)!=0 )
21cf0 7b 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f 69 6e  {.    isLeftJoin
21d00 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 53   = 1;.    if( pS
21d10 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c  ubSrc->nSrc>1 ||
21d20 20 69 73 41 67 67 20 7c 7c 20 49 73 56 69 72 74   isAgg || IsVirt
21d30 75 61 6c 28 70 53 75 62 53 72 63 2d 3e 61 5b 30  ual(pSubSrc->a[0
21d40 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ].pTab) ){.     
21d50 20 2f 2a 20 20 28 33 61 29 20 20 20 20 20 20 20   /*  (3a)       
21d60 20 20 20 20 20 20 28 33 63 29 20 20 20 20 20 28        (3c)     (
21d70 33 62 29 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  3b) */.      ret
21d80 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
21d90 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
21da0 58 54 52 41 5f 49 46 4e 55 4c 4c 52 4f 57 0a 20  XTRA_IFNULLROW. 
21db0 20 65 6c 73 65 20 69 66 28 20 69 46 72 6f 6d 3e   else if( iFrom>
21dc0 30 20 26 26 20 21 69 73 41 67 67 20 29 7b 0a 20  0 && !isAgg ){. 
21dd0 20 20 20 2f 2a 20 53 65 74 74 69 6e 67 20 69 73     /* Setting is
21de0 4c 65 66 74 4a 6f 69 6e 20 74 6f 20 2d 31 20 63  LeftJoin to -1 c
21df0 61 75 73 65 73 20 4f 50 5f 49 66 4e 75 6c 6c 52  auses OP_IfNullR
21e00 6f 77 20 6f 70 63 6f 64 65 73 20 74 6f 20 62 65  ow opcodes to be
21e10 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 0a 20   generated for. 
21e20 20 20 20 2a 2a 20 65 76 65 72 79 20 72 65 66 65     ** every refe
21e30 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 72 65 73  rence to any res
21e40 75 6c 74 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20  ult column from 
21e50 73 75 62 71 75 65 72 79 20 69 6e 20 61 20 6a 6f  subquery in a jo
21e60 69 6e 2c 20 65 76 65 6e 0a 20 20 20 20 2a 2a 20  in, even.    ** 
21e70 74 68 6f 75 67 68 20 74 68 65 79 20 61 72 65 20  though they are 
21e80 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20  not necessary.  
21e90 54 68 69 73 20 77 69 6c 6c 20 73 74 72 65 73 73  This will stress
21ea0 2d 74 65 73 74 20 74 68 65 20 4f 50 5f 49 66 4e  -test the OP_IfN
21eb0 75 6c 6c 52 6f 77 20 0a 20 20 20 20 2a 2a 20 6f  ullRow .    ** o
21ec0 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 69 73  pcode. */.    is
21ed0 4c 65 66 74 4a 6f 69 6e 20 3d 20 2d 31 3b 0a 20  LeftJoin = -1;. 
21ee0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
21ef0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37 29  Restriction (17)
21f00 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  : If the sub-que
21f10 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
21f20 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74   SELECT, then it
21f30 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f   must.  ** use o
21f40 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c  nly the UNION AL
21f50 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20  L operator. And 
21f60 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70  none of the simp
21f70 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65  le select querie
21f80 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65  s.  ** that make
21f90 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   up the compound
21fa0 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f   SELECT are allo
21fb0 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67  wed to be aggreg
21fc0 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a  ate or distinct.
21fd0 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20    ** queries..  
21fe0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
21ff0 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  Prior ){.    if(
22000 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
22010 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
22020 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  0;  /* Restricti
22030 6f 6e 20 28 32 30 29 20 2a 2f 0a 20 20 20 20 7d  on (20) */.    }
22040 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20 7c  .    if( isAgg |
22050 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  | (p->selFlags &
22060 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
22070 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d   || pSrc->nSrc!=
22080 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  1 ){.      retur
22090 6e 20 30 3b 20 2f 2a 20 28 31 37 64 31 29 2c 20  n 0; /* (17d1), 
220a0 28 31 37 64 32 29 2c 20 6f 72 20 28 31 37 64 33  (17d2), or (17d3
220b0 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 66  ) */.    }.    f
220c0 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70  or(pSub1=pSub; p
220d0 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62  Sub1; pSub1=pSub
220e0 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  1->pPrior){.    
220f0 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75    testcase( (pSu
22100 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
22110 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
22120 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44  ggregate))==SF_D
22130 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20  istinct );.     
22140 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62   testcase( (pSub
22150 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
22160 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
22170 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67  gregate))==SF_Ag
22180 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20  gregate );.     
22190 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70   assert( pSub->p
221a0 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Src!=0 );.      
221b0 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 45  assert( pSub->pE
221c0 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 53 75  List->nExpr==pSu
221d0 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  b1->pEList->nExp
221e0 72 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  r );.      if( (
221f0 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
22200 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
22210 46 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d 30  F_Aggregate))!=0
22220 20 20 20 20 2f 2a 20 28 31 37 62 29 20 2a 2f 0a      /* (17b) */.
22230 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31         || (pSub1
22240 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62  ->pPrior && pSub
22250 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 20  1->op!=TK_ALL)  
22260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22270 2a 20 28 31 37 61 29 20 2a 2f 0a 20 20 20 20 20  * (17a) */.     
22280 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72 63    || pSub1->pSrc
22290 2d 3e 6e 53 72 63 3c 31 20 20 20 20 20 20 20 20  ->nSrc<1        
222a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 37            /* (17
222c0 63 29 20 2a 2f 0a 20 20 20 20 20 20 29 7b 0a 20  c) */.      ){. 
222d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
222e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
222f0 65 73 74 63 61 73 65 28 20 70 53 75 62 31 2d 3e  estcase( pSub1->
22300 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a  pSrc->nSrc>1 );.
22310 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
22320 73 74 72 69 63 74 69 6f 6e 20 28 31 38 29 2e 20  striction (18). 
22330 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f  */.    if( p->pO
22340 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
22350 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f  int ii;.      fo
22360 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f  r(ii=0; ii<p->pO
22370 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
22380 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
22390 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61  ( p->pOrderBy->a
223a0 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  [ii].u.x.iOrderB
223b0 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  yCol==0 ) return
223c0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
223d0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 2d 72  }.  }..  /* Ex-r
223e0 65 73 74 72 69 63 74 69 6f 6e 20 28 32 33 29 3a  estriction (23):
223f0 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 77  .  ** The only w
22400 61 79 20 74 68 61 74 20 74 68 65 20 72 65 63 75  ay that the recu
22410 72 73 69 76 65 20 70 61 72 74 20 6f 66 20 61 20  rsive part of a 
22420 43 54 45 20 63 61 6e 20 63 6f 6e 74 61 69 6e 20  CTE can contain 
22430 61 20 63 6f 6d 70 6f 75 6e 64 0a 20 20 2a 2a 20  a compound.  ** 
22440 73 75 62 71 75 65 72 79 20 69 73 20 66 6f 72 20  subquery is for 
22450 74 68 65 20 73 75 62 71 75 65 72 79 20 74 6f 20  the subquery to 
22460 62 65 20 6f 6e 65 20 74 65 72 6d 20 6f 66 20 61  be one term of a
22470 20 6a 6f 69 6e 2e 20 20 42 75 74 20 69 66 20 74   join.  But if t
22480 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79  he.  ** subquery
22490 20 69 73 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e   is a join, then
224a0 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20   the flattening 
224b0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
224c0 20 73 74 6f 70 70 65 64 20 62 79 0a 20 20 2a 2a   stopped by.  **
224d0 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37   restriction (17
224e0 64 33 29 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  d3).  */.  asser
224f0 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  t( (p->selFlags 
22500 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 29 3d  & SF_Recursive)=
22510 3d 30 20 7c 7c 20 70 53 75 62 2d 3e 70 50 72 69  =0 || pSub->pPri
22520 6f 72 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 2a 2a  or==0 );..  /***
22530 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  ** If we reach t
22540 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74  his point, flatt
22550 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74  ening is permitt
22560 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45 4c  ed. *****/.  SEL
22570 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73  ECTTRACE(1,pPars
22580 65 2c 70 2c 28 22 66 6c 61 74 74 65 6e 20 25 75  e,p,("flatten %u
22590 2e 25 70 20 66 72 6f 6d 20 74 65 72 6d 20 25 64  .%p from term %d
225a0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
225b0 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 73 65          pSub->se
225c0 6c 49 64 2c 20 70 53 75 62 2c 20 69 46 72 6f 6d  lId, pSub, iFrom
225d0 29 29 3b 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72  ));..  /* Author
225e0 69 7a 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ize the subquery
225f0 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41   */.  pParse->zA
22600 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53 75  uthContext = pSu
22610 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  bitem->zName;.  
22620 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71  TESTONLY(i =) sq
22630 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
22640 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45  Parse, SQLITE_SE
22650 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  LECT, 0, 0, 0);.
22660 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 53    testcase( i==S
22670 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20  QLITE_DENY );.  
22680 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
22690 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74  text = zSavedAut
226a0 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20  hContext;..  /* 
226b0 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
226c0 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   is a compound S
226d0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
226e0 20 74 68 65 6e 20 28 62 79 20 72 65 73 74 72 69   then (by restri
226f0 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61  ctions.  ** 17 a
22700 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69 74 20  nd 18 above) it 
22710 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20  must be a UNION 
22720 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65  ALL and the pare
22730 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20 0a 20  nt query must . 
22740 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20 66 6f   ** be of the fo
22750 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  rm:.  **.  **   
22760 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c    SELECT <expr-l
22770 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d  ist> FROM (<sub-
22780 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63  query>) <where-c
22790 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a  lause> .  **.  *
227a0 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e  * followed by an
227b0 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49  y ORDER BY, LIMI
227c0 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20  T and/or OFFSET 
227d0 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c  clauses. This bl
227e0 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73  ock.  ** creates
227f0 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66 20 74   N-1 copies of t
22800 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
22810 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52 44 45  without any ORDE
22820 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a  R BY, LIMIT or .
22830 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61 75    ** OFFSET clau
22840 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68  ses and joins th
22850 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68  em to the left-h
22860 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20  and-side of the 
22870 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73  original.  ** us
22880 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  ing UNION ALL op
22890 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68 69 73  erators. In this
228a0 20 63 61 73 65 20 4e 20 69 73 20 74 68 65 20 6e   case N is the n
228b0 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a  umber of simple.
228c0 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74 61 74    ** select stat
228d0 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f  ements in the co
228e0 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79  mpound sub-query
228f0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d  ..  **.  ** Exam
22900 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ple:.  **.  **  
22910 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52     SELECT a+1 FR
22920 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20 20 20  OM (.  **       
22930 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
22940 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55  ab.  **        U
22950 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
22960 20 20 20 20 20 53 45 4c 45 43 54 20 79 20 46 52       SELECT y FR
22970 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20  OM tab.  **     
22980 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
22990 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
229a0 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61  abs(z*2) FROM ta
229b0 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20 57 48  b2.  **     ) WH
229c0 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52 20 42  ERE a!=5 ORDER B
229d0 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72  Y 1.  **.  ** Tr
229e0 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a  ansformed into:.
229f0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
22a00 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 74 61  LECT x+1 FROM ta
22a10 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35 0a 20  b WHERE x+1!=5. 
22a20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c   **     UNION AL
22a30 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  L.  **     SELEC
22a40 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62 20 57  T y+1 FROM tab W
22a50 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a  HERE y+1!=5.  **
22a60 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
22a70 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61   **     SELECT a
22a80 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74  bs(z*2)+1 FROM t
22a90 61 62 32 20 57 48 45 52 45 20 61 62 73 28 7a 2a  ab2 WHERE abs(z*
22aa0 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20  2)+1!=5.  **    
22ab0 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a   ORDER BY 1.  **
22ac0 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68  .  ** We call th
22ad0 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64  is the "compound
22ae0 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65  -subquery flatte
22af0 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ning"..  */.  fo
22b00 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  r(pSub=pSub->pPr
22b10 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75 62 3d  ior; pSub; pSub=
22b20 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  pSub->pPrior){. 
22b30 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b     Select *pNew;
22b40 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
22b50 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
22b60 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70 72 20  derBy;.    Expr 
22b70 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69  *pLimit = p->pLi
22b80 6d 69 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  mit;.    Select 
22b90 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72  *pPrior = p->pPr
22ba0 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  ior;.    p->pOrd
22bb0 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d  erBy = 0;.    p-
22bc0 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70  >pSrc = 0;.    p
22bd0 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
22be0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
22bf0 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
22c00 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
22c10 20 70 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 70   p, 0);.    p->p
22c20 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
22c30 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
22c40 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
22c50 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  p->pSrc = pSrc;.
22c60 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41      p->op = TK_A
22c70 4c 4c 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  LL;.    if( pNew
22c80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
22c90 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
22ca0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
22cb0 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d    pNew->pPrior =
22cc0 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69   pPrior;.      i
22cd0 66 28 20 70 50 72 69 6f 72 20 29 20 70 50 72 69  f( pPrior ) pPri
22ce0 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77  or->pNext = pNew
22cf0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4e  ;.      pNew->pN
22d00 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 70  ext = p;.      p
22d10 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b  ->pPrior = pNew;
22d20 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41  .      SELECTTRA
22d30 43 45 28 32 2c 70 50 61 72 73 65 2c 70 2c 28 22  CE(2,pParse,p,("
22d40 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
22d50 79 20 66 6c 61 74 74 65 6e 65 72 22 0a 20 20 20  y flattener".   
22d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d70 20 20 20 20 20 20 20 20 20 20 20 22 20 63 72 65             " cre
22d80 61 74 65 73 20 25 75 20 61 73 20 70 65 65 72 5c  ates %u as peer\
22d90 6e 22 2c 70 4e 65 77 2d 3e 73 65 6c 49 64 29 29  n",pNew->selId))
22da0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
22db0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
22dc0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
22dd0 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61  ..  /* Begin fla
22de0 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72 6f  ttening the iFro
22df0 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68  m-th entry of th
22e00 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20  e FROM clause . 
22e10 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65 72   ** in the outer
22e20 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70   query..  */.  p
22e30 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70 53  Sub = pSub1 = pS
22e40 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b  ubitem->pSelect;
22e50 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68  ..  /* Delete th
22e60 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  e transient tabl
22e70 65 20 73 74 72 75 63 74 75 72 65 20 61 73 73 6f  e structure asso
22e80 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ciated with the.
22e90 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a 20 20    ** subquery.  
22ea0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  */.  sqlite3DbFr
22eb0 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d  ee(db, pSubitem-
22ec0 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 73  >zDatabase);.  s
22ed0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
22ee0 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
22ef0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
22f00 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d  ee(db, pSubitem-
22f10 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53 75 62  >zAlias);.  pSub
22f20 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  item->zDatabase 
22f30 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  = 0;.  pSubitem-
22f40 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53  >zName = 0;.  pS
22f50 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d  ubitem->zAlias =
22f60 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
22f70 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20  pSelect = 0;..  
22f80 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74 69 6e  /* Defer deletin
22f90 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65  g the Table obje
22fa0 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ct associated wi
22fb0 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  th the.  ** subq
22fc0 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64 65 20  uery until code 
22fd0 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20 20  generation is.  
22fe0 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e  ** complete, sin
22ff0 63 65 20 74 68 65 72 65 20 6d 61 79 20 73 74 69  ce there may sti
23000 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e 70 54  ll exist Expr.pT
23010 61 62 20 65 6e 74 72 69 65 73 20 74 68 61 74 0a  ab entries that.
23020 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68    ** refer to th
23030 65 20 73 75 62 71 75 65 72 79 20 65 76 65 6e 20  e subquery even 
23040 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67  after flattening
23050 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34 36 2e  .  Ticket #3346.
23060 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62 69  .  **.  ** pSubi
23070 74 65 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c 77  tem->pTab is alw
23080 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20  ays non-NULL by 
23090 74 65 73 74 20 72 65 73 74 72 69 63 74 69 6f 6e  test restriction
230a0 73 20 61 6e 64 20 74 65 73 74 73 20 61 62 6f 76  s and tests abov
230b0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41 4c  e..  */.  if( AL
230c0 57 41 59 53 28 70 53 75 62 69 74 65 6d 2d 3e 70  WAYS(pSubitem->p
230d0 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 54  Tab!=0) ){.    T
230e0 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c 20  able *pTabToDel 
230f0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  = pSubitem->pTab
23100 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 54 6f  ;.    if( pTabTo
23110 44 65 6c 2d 3e 6e 54 61 62 52 65 66 3d 3d 31 20  Del->nTabRef==1 
23120 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20 2a  ){.      Parse *
23130 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
23140 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
23150 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
23160 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74  pTabToDel->pNext
23170 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65 76  Zombie = pToplev
23180 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a  el->pZombieTab;.
23190 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d        pToplevel-
231a0 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70 54  >pZombieTab = pT
231b0 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c  abToDel;.    }el
231c0 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54 6f  se{.      pTabTo
231d0 44 65 6c 2d 3e 6e 54 61 62 52 65 66 2d 2d 3b 0a  Del->nTabRef--;.
231e0 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69 74      }.    pSubit
231f0 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20  em->pTab = 0;.  
23200 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
23210 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20  owing loop runs 
23220 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 65  once for each te
23230 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64  rm in a compound
23240 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 66  -subquery.  ** f
23250 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64 65  lattening (as de
23260 73 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e 20  scribed above). 
23270 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67   If we are doing
23280 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69 6e   a different kin
23290 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65  d.  ** of flatte
232a0 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65 6e  ning - a flatten
232b0 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ing other than a
232c0 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65   compound-subque
232d0 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a  ry flattening -.
232e0 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 6c    ** then this l
232f0 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e  oop only runs on
23300 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ce..  **.  ** Th
23310 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c  is loop moves al
23320 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c  l of the FROM el
23330 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75  ements of the su
23340 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a  bquery into the.
23350 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    ** the FROM cl
23360 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
23370 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65  r query.  Before
23380 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d   doing this, rem
23390 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63  ember.  ** the c
233a0 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
233b0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75   the original ou
233c0 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65  ter query FROM e
233d0 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69  lement in.  ** i
233e0 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61  Parent.  The iPa
233f0 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c  rent cursor will
23400 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20   never be used. 
23410 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65   Subsequent code
23420 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20  .  ** will scan 
23430 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b  expressions look
23440 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20  ing for iParent 
23450 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72  references and r
23460 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73  eplace.  ** thos
23470 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74  e references wit
23480 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  h expressions th
23490 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68  at resolve to th
234a0 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a  e subquery FROM.
234b0 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65    ** elements we
234c0 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67   are now copying
234d0 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28   in..  */.  for(
234e0 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72 65  pParent=p; pPare
234f0 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61 72  nt; pParent=pPar
23500 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75  ent->pPrior, pSu
23510 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b  b=pSub->pPrior){
23520 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63  .    int nSubSrc
23530 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79 70  ;.    u8 jointyp
23540 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 53  e = 0;.    pSubS
23550 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b  rc = pSub->pSrc;
23560 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
23570 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79 20  use of subquery 
23580 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20 3d  */.    nSubSrc =
23590 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20   pSubSrc->nSrc; 
235a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
235b0 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79 20  rms in subquery 
235c0 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
235d0 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e     pSrc = pParen
235e0 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20  t->pSrc;     /* 
235f0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
23600 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
23610 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 20  /..    if( pSrc 
23620 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
23630 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20   pParent==p );  
23640 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74 68  /* First time th
23650 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a  rough the loop *
23660 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65  /.      jointype
23670 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e   = pSubitem->fg.
23680 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65  jointype;.    }e
23690 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
236a0 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b  t( pParent!=p );
236b0 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62    /* 2nd and sub
236c0 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68  sequent times th
236d0 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a  rough the loop *
236e0 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70  /.      pSrc = p
236f0 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73  Parent->pSrc = s
23700 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
23710 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29  end(db, 0, 0, 0)
23720 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63  ;.      if( pSrc
23730 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
23740 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
23750 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
23760 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
23770 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
23780 54 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  The subquery use
23790 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20  s a single slot 
237a0 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
237b0 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a  se of the outer.
237c0 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49      ** query.  I
237d0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68  f the subquery h
237e0 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  as more than one
237f0 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20   element in its 
23800 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20  FROM clause,.   
23810 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20   ** then expand 
23820 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
23830 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f  to make space fo
23840 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c  r it to hold all
23850 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a   elements.    **
23860 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
23870 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
23880 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a  Example:.    **.
23890 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54      **    SELECT
238a0 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53   * FROM tabA, (S
238b0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62  ELECT * FROM sub
238c0 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a  1, sub2), tabB;.
238d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
238e0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68 61  e outer query ha
238f0 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73  s 3 slots in its
23900 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f   FROM clause.  O
23910 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20  ne slot of the. 
23920 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72     ** outer quer
23930 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c  y (the middle sl
23940 6f 74 29 20 69 73 20 75 73 65 64 20 62 79 20 74  ot) is used by t
23950 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54 68  he subquery.  Th
23960 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c  e next.    ** bl
23970 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c  ock of code will
23980 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65   expand the oute
23990 72 20 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61  r query FROM cla
239a0 75 73 65 20 74 6f 20 34 20 73 6c 6f 74 73 2e 0a  use to 4 slots..
239b0 20 20 20 20 2a 2a 20 54 68 65 20 6d 69 64 64 6c      ** The middl
239c0 65 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e 64  e slot is expand
239d0 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20  ed to two slots 
239e0 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65  in order to make
239f0 20 73 70 61 63 65 0a 20 20 20 20 2a 2a 20 66 6f   space.    ** fo
23a00 72 20 74 68 65 20 74 77 6f 20 65 6c 65 6d 65 6e  r the two elemen
23a10 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ts in the FROM c
23a20 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62  lause of the sub
23a30 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  query..    */.  
23a40 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20    if( nSubSrc>1 
23a50 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  ){.      pParent
23a60 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d 20  ->pSrc = pSrc = 
23a70 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e  sqlite3SrcListEn
23a80 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c 20  large(db, pSrc, 
23a90 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b  nSubSrc-1,iFrom+
23aa0 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  1);.      if( db
23ab0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
23ac0 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
23ad0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
23ae0 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20      /* Transfer 
23af0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
23b00 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 73  terms from the s
23b10 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65  ubquery into the
23b20 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
23b30 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ery..    */.    
23b40 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53  for(i=0; i<nSubS
23b50 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
23b60 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
23b70 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b  ete(db, pSrc->a[
23b80 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29  i+iFrom].pUsing)
23b90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
23ba0 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d  pSrc->a[i+iFrom]
23bb0 2e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30  .fg.isTabFunc==0
23bc0 20 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e   );.      pSrc->
23bd0 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75  a[i+iFrom] = pSu
23be0 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  bSrc->a[i];.    
23bf0 20 20 69 4e 65 77 50 61 72 65 6e 74 20 3d 20 70    iNewParent = p
23c00 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75  SubSrc->a[i].iCu
23c10 72 73 6f 72 3b 0a 20 20 20 20 20 20 6d 65 6d 73  rsor;.      mems
23c20 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69  et(&pSubSrc->a[i
23c30 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75  ], 0, sizeof(pSu
23c40 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20  bSrc->a[i]));.  
23c50 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b    }.    pSrc->a[
23c60 69 46 72 6f 6d 5d 2e 66 67 2e 6a 6f 69 6e 74 79  iFrom].fg.jointy
23c70 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20  pe = jointype;. 
23c80 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65 67   .    /* Now beg
23c90 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67 20  in substituting 
23ca0 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 20  subquery result 
23cb0 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  set expressions 
23cc0 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65 66 65  for .    ** refe
23cd0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50  rences to the iP
23ce0 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74  arent in the out
23cf0 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a  er query..    **
23d00 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65   .    ** Example
23d10 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
23d20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a    SELECT a+5, b*
23d30 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  10 FROM (SELECT 
23d40 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41  x*3 AS a, y+10 A
23d50 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45  S b FROM t1) WHE
23d60 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20 20  RE a>b;.    **  
23d70 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   \              
23d80 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f         \________
23d90 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f  _____ subquery _
23da0 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20  _________/      
23db0 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20 20      /.    **    
23dc0 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
23dd0 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65  ______ outer que
23de0 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ry _____________
23df0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23e00 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  _/.    **.    **
23e10 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72   We look at ever
23e20 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
23e30 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
23e40 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20  and every place 
23e50 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20 22 61  we see.    ** "a
23e60 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
23e70 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20  "x*3" and every 
23e80 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62 22  place we see "b"
23e90 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22   we substitute "
23ea0 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20  y+10"..    */.  
23eb0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64    if( pSub->pOrd
23ec0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 2f 2a  erBy ){.      /*
23ed0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
23ee0 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f 72  any non-zero iOr
23ef0 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65 73 20  derByCol values 
23f00 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
23f10 65 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52  e.      ** ORDER
23f20 20 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65   BY column expre
23f30 73 73 69 6f 6e 20 69 73 20 69 64 65 6e 74 69 63  ssion is identic
23f40 61 6c 20 74 6f 20 74 68 65 20 69 4f 72 64 65 72  al to the iOrder
23f50 42 79 43 6f 6c 27 74 68 0a 20 20 20 20 20 20 2a  ByCol'th.      *
23f60 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 74  * expression ret
23f70 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20  urned by SELECT 
23f80 73 74 61 74 65 6d 65 6e 74 20 70 53 75 62 2e 20  statement pSub. 
23f90 53 69 6e 63 65 20 74 68 65 73 65 20 76 61 6c 75  Since these valu
23fa0 65 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20 6e  es.      ** do n
23fb0 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 63  ot necessarily c
23fc0 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 63 6f 6c  orrespond to col
23fd0 75 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54 20 73  umns in SELECT s
23fe0 74 61 74 65 6d 65 6e 74 20 70 50 61 72 65 6e 74  tatement pParent
23ff0 2c 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20  ,.      ** zero 
24000 74 68 65 6d 20 62 65 66 6f 72 65 20 74 72 61 6e  them before tran
24010 73 66 65 72 69 6e 67 20 74 68 65 20 4f 52 44 45  sfering the ORDE
24020 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20  R BY clause..   
24030 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e     **.      ** N
24040 6f 74 20 64 6f 69 6e 67 20 74 68 69 73 20 6d 61  ot doing this ma
24050 79 20 63 61 75 73 65 20 61 6e 20 65 72 72 6f 72  y cause an error
24060 20 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74   if a subsequent
24070 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20   call to this.  
24080 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20      ** function 
24090 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74  attempts to flat
240a0 74 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73  ten a compound s
240b0 75 62 2d 71 75 65 72 79 20 69 6e 74 6f 20 70 50  ub-query into pP
240c0 61 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 28  arent.      ** (
240d0 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68 69  the only way thi
240e0 73 20 63 61 6e 20 68 61 70 70 65 6e 20 69 73 20  s can happen is 
240f0 69 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  if the compound 
24100 73 75 62 2d 71 75 65 72 79 20 69 73 0a 20 20 20  sub-query is.   
24110 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20     ** currently 
24120 70 61 72 74 20 6f 66 20 70 53 75 62 2d 3e 70 53  part of pSub->pS
24130 72 63 29 2e 20 53 65 65 20 74 69 63 6b 65 74 20  rc). See ticket 
24140 5b 64 31 31 61 36 65 39 30 38 66 5d 2e 20 20 2a  [d11a6e908f].  *
24150 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
24160 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75   *pOrderBy = pSu
24170 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  b->pOrderBy;.   
24180 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f     for(i=0; i<pO
24190 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
241a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 72  ++){.        pOr
241b0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e  derBy->a[i].u.x.
241c0 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b  iOrderByCol = 0;
241d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
241e0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
241f0 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
24200 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f       pParent->pO
24210 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
24220 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70  y;.      pSub->p
24230 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
24240 20 7d 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20   }.    pWhere = 
24250 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
24260 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65 2c  b, pSub->pWhere,
24270 20 30 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4c   0);.    if( isL
24280 65 66 74 4a 6f 69 6e 3e 30 20 29 7b 0a 20 20 20  eftJoin>0 ){.   
24290 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70     setJoinExpr(p
242a0 57 68 65 72 65 2c 20 69 4e 65 77 50 61 72 65 6e  Where, iNewParen
242b0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  t);.    }.    pP
242c0 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20  arent->pWhere = 
242d0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
242e0 62 2c 20 70 57 68 65 72 65 2c 20 70 50 61 72 65  b, pWhere, pPare
242f0 6e 74 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  nt->pWhere);.   
24300 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
24310 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ailed==0 ){.    
24320 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 78    SubstContext x
24330 3b 0a 20 20 20 20 20 20 78 2e 70 50 61 72 73 65  ;.      x.pParse
24340 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 20   = pParse;.     
24350 20 78 2e 69 54 61 62 6c 65 20 3d 20 69 50 61 72   x.iTable = iPar
24360 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e 69 4e 65  ent;.      x.iNe
24370 77 54 61 62 6c 65 20 3d 20 69 4e 65 77 50 61 72  wTable = iNewPar
24380 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e 69 73 4c  ent;.      x.isL
24390 65 66 74 4a 6f 69 6e 20 3d 20 69 73 4c 65 66 74  eftJoin = isLeft
243a0 4a 6f 69 6e 3b 0a 20 20 20 20 20 20 78 2e 70 45  Join;.      x.pE
243b0 4c 69 73 74 20 3d 20 70 53 75 62 2d 3e 70 45 4c  List = pSub->pEL
243c0 69 73 74 3b 0a 20 20 20 20 20 20 73 75 62 73 74  ist;.      subst
243d0 53 65 6c 65 63 74 28 26 78 2c 20 70 50 61 72 65  Select(&x, pPare
243e0 6e 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  nt, 0);.    }.  
243f0 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74  .    /* The flat
24400 74 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64  tened query is d
24410 69 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65  istinct if eithe
24420 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74  r the inner or t
24430 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
24440 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63  query is distinc
24450 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  t. .    */.    p
24460 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73  Parent->selFlags
24470 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61   |= pSub->selFla
24480 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
24490 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ;.  .    /*.    
244a0 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  ** SELECT ... FR
244b0 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c  OM (SELECT ... L
244c0 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29  IMIT a OFFSET b)
244d0 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20   LIMIT x OFFSET 
244e0 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y;.    **.    **
244f0 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20   One is tempted 
24500 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61 20  to try to add a 
24510 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65  and b to combine
24520 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75   the limits.  Bu
24530 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f  t this.    ** do
24540 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65  es not work if e
24550 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e  ither limit is n
24560 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a  egative..    */.
24570 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c      if( pSub->pL
24580 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50  imit ){.      pP
24590 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20  arent->pLimit = 
245a0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20  pSub->pLimit;.  
245b0 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74      pSub->pLimit
245c0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
245d0 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20  .  /* Finially, 
245e0 64 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c  delete what is l
245f0 65 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75  eft of the subqu
24600 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  ery and return. 
24610 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a   ** success..  *
24620 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  /.  sqlite3Selec
24630 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62  tDelete(db, pSub
24640 31 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54  1);..#if SELECTT
24650 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
24660 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
24670 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
24680 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
24690 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x100,pParse,p,
246a0 28 22 41 66 74 65 72 20 66 6c 61 74 74 65 6e 69  ("After flatteni
246b0 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71  ng:\n"));.    sq
246c0 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
246d0 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
246e0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
246f0 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
24700 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
24710 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
24720 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
24730 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a  ITE_OMIT_VIEW) *
24740 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75 63  /../*.** A struc
24750 74 75 72 65 20 74 6f 20 6b 65 65 70 20 74 72 61  ture to keep tra
24760 63 6b 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65  ck of all of the
24770 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 74   column values t
24780 68 61 74 20 6d 75 73 74 20 62 65 0a 2a 2a 20 63  hat must be.** c
24790 6f 6e 73 74 61 6e 74 20 69 6e 20 61 20 57 48 45  onstant in a WHE
247a0 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 74 79  RE clause..*/.ty
247b0 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65  pedef struct Whe
247c0 72 65 43 6f 6e 73 74 20 57 68 65 72 65 43 6f 6e  reConst WhereCon
247d0 73 74 3b 0a 73 74 72 75 63 74 20 57 68 65 72 65  st;.struct Where
247e0 43 6f 6e 73 74 20 7b 0a 20 20 73 71 6c 69 74 65  Const {.  sqlite
247f0 33 20 2a 64 62 3b 20 20 20 20 20 2f 2a 20 44 61  3 *db;     /* Da
24800 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 2c 20  tabase pointer, 
24810 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 44  used by sqlite3D
24820 62 52 65 61 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20  bRealloc() */.  
24830 69 6e 74 20 6e 43 6f 6e 73 74 3b 20 20 20 20 20  int nConst;     
24840 20 2f 2a 20 4e 75 6d 62 65 72 20 66 6f 72 20 43   /* Number for C
24850 4f 4c 55 4d 4e 3d 43 4f 4e 53 54 41 4e 54 20 74  OLUMN=CONSTANT t
24860 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  erms */.  int nC
24870 68 6e 67 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  hng;       /* Nu
24880 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 61 20  mber of times a 
24890 63 6f 6e 73 74 61 6e 74 20 69 73 20 70 72 6f 70  constant is prop
248a0 61 67 61 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  agated */.  Expr
248b0 20 2a 2a 61 70 45 78 70 72 3b 20 20 20 2f 2a 20   **apExpr;   /* 
248c0 5b 69 2a 32 5d 20 69 73 20 43 4f 4c 55 4d 4e 20  [i*2] is COLUMN 
248d0 61 6e 64 20 5b 69 2a 32 2b 31 5d 20 69 73 20 43  and [i*2+1] is C
248e0 4f 4e 53 54 41 4e 54 20 2a 2f 0a 7d 3b 0a 0a 2f  ONSTANT */.};../
248f0 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
24900 6e 74 72 79 20 74 6f 20 74 68 65 20 70 43 6f 6e  ntry to the pCon
24910 73 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61  st object.*/.sta
24920 74 69 63 20 76 6f 69 64 20 63 6f 6e 73 74 49 6e  tic void constIn
24930 73 65 72 74 28 0a 20 20 57 68 65 72 65 43 6f 6e  sert(.  WhereCon
24940 73 74 20 2a 70 43 6f 6e 73 74 2c 0a 20 20 45 78  st *pConst,.  Ex
24950 70 72 20 2a 70 43 6f 6c 75 6d 6e 2c 0a 20 20 45  pr *pColumn,.  E
24960 78 70 72 20 2a 70 56 61 6c 75 65 0a 29 7b 0a 20  xpr *pValue.){. 
24970 20 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2b   pConst->nConst+
24980 2b 3b 0a 20 20 70 43 6f 6e 73 74 2d 3e 61 70 45  +;.  pConst->apE
24990 78 70 72 20 3d 20 73 71 6c 69 74 65 33 44 62 52  xpr = sqlite3DbR
249a0 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 43 6f  eallocOrFree(pCo
249b0 6e 73 74 2d 3e 64 62 2c 20 70 43 6f 6e 73 74 2d  nst->db, pConst-
249c0 3e 61 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20  >apExpr,.       
249d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249e0 20 20 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74    pConst->nConst
249f0 2a 32 2a 73 69 7a 65 6f 66 28 45 78 70 72 2a 29  *2*sizeof(Expr*)
24a00 29 3b 0a 20 20 69 66 28 20 70 43 6f 6e 73 74 2d  );.  if( pConst-
24a10 3e 61 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20  >apExpr==0 ){.  
24a20 20 20 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74    pConst->nConst
24a30 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
24a40 20 20 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70     pConst->apExp
24a50 72 5b 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74  r[pConst->nConst
24a60 2a 32 2d 32 5d 20 3d 20 70 43 6f 6c 75 6d 6e 3b  *2-2] = pColumn;
24a70 0a 20 20 20 20 70 43 6f 6e 73 74 2d 3e 61 70 45  .    pConst->apE
24a80 78 70 72 5b 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e  xpr[pConst->nCon
24a90 73 74 2a 32 2d 31 5d 20 3d 20 70 56 61 6c 75 65  st*2-1] = pValue
24aa0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
24ab0 69 6e 64 20 61 6c 6c 20 69 6e 73 74 61 6e 63 65  ind all instance
24ac0 73 20 6f 66 20 43 4f 4c 55 4d 4e 3d 43 4f 4e 53  s of COLUMN=CONS
24ad0 54 41 4e 54 20 6f 72 20 43 4f 4e 53 54 41 4e 54  TANT or CONSTANT
24ae0 3d 43 4f 4c 55 4d 4e 20 69 6e 20 70 45 78 70 72  =COLUMN in pExpr
24af0 20 74 68 61 74 0a 2a 2a 20 6d 75 73 74 20 62 65   that.** must be
24b00 20 74 72 75 65 20 28 74 68 61 74 20 61 72 65 20   true (that are 
24b10 70 61 72 74 20 6f 66 20 74 68 65 20 41 4e 44 2d  part of the AND-
24b20 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 29  connected terms)
24b30 20 61 6e 64 20 61 64 64 20 65 61 63 68 0a 2a 2a   and add each.**
24b40 20 74 6f 20 70 43 6f 6e 73 74 2e 0a 2a 2f 0a 73   to pConst..*/.s
24b50 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 64 43  tatic void findC
24b60 6f 6e 73 74 49 6e 57 68 65 72 65 28 57 68 65 72  onstInWhere(Wher
24b70 65 43 6f 6e 73 74 20 2a 70 43 6f 6e 73 74 2c 20  eConst *pConst, 
24b80 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
24b90 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
24ba0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 45 78 70  eturn;.  if( Exp
24bb0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
24bc0 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
24bd0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
24be0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
24bf0 4e 44 20 29 7b 0a 20 20 20 20 66 69 6e 64 43 6f  ND ){.    findCo
24c00 6e 73 74 49 6e 57 68 65 72 65 28 70 43 6f 6e 73  nstInWhere(pCons
24c10 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
24c20 29 3b 0a 20 20 20 20 66 69 6e 64 43 6f 6e 73 74  );.    findConst
24c30 49 6e 57 68 65 72 65 28 70 43 6f 6e 73 74 2c 20  InWhere(pConst, 
24c40 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
24c50 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
24c60 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
24c70 54 4b 5f 45 51 20 29 20 72 65 74 75 72 6e 3b 0a  TK_EQ ) return;.
24c80 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
24c90 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20  >pRight!=0 );.  
24ca0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
24cb0 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 69 66 28  Left!=0 );.  if(
24cc0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e   pExpr->pRight->
24cd0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
24ce0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
24cf0 6e 73 74 61 6e 74 28 70 45 78 70 72 2d 3e 70 4c  nstant(pExpr->pL
24d00 65 66 74 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73  eft) ){.    cons
24d10 74 49 6e 73 65 72 74 28 70 43 6f 6e 73 74 2c 20  tInsert(pConst, 
24d20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 70  pExpr->pRight, p
24d30 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
24d40 7d 65 6c 73 65 0a 20 20 69 66 28 20 70 45 78 70  }else.  if( pExp
24d50 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  r->pLeft->op==TK
24d60 5f 43 4f 4c 55 4d 4e 20 26 26 20 73 71 6c 69 74  _COLUMN && sqlit
24d70 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
24d80 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 20  (pExpr->pRight) 
24d90 29 7b 0a 20 20 20 20 63 6f 6e 73 74 49 6e 73 65  ){.    constInse
24da0 72 74 28 70 43 6f 6e 73 74 2c 20 70 45 78 70 72  rt(pConst, pExpr
24db0 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
24dc0 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  pRight);.  }.}..
24dd0 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
24de0 57 61 6c 6b 65 72 20 65 78 70 72 65 73 73 69 6f  Walker expressio
24df0 6e 20 63 61 6c 6c 62 61 63 6b 2e 20 20 70 45 78  n callback.  pEx
24e00 70 72 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  pr is a candidat
24e10 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
24e20 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20 62  to be replaced b
24e30 79 20 61 20 76 61 6c 75 65 2e 20 20 49 66 20 70  y a value.  If p
24e40 45 78 70 72 20 69 73 20 65 71 75 69 76 61 6c 65  Expr is equivale
24e50 6e 74 20 74 6f 20 6f 6e 65 20 6f 66 20 74 68 65  nt to one of the
24e60 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65  .** columns name
24e70 64 20 69 6e 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  d in pWalker->u.
24e80 70 43 6f 6e 73 74 2c 20 74 68 65 6e 20 6f 76 65  pConst, then ove
24e90 72 77 72 69 74 65 20 69 74 20 77 69 74 68 20 69  rwrite it with i
24ea0 74 73 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  ts.** correspond
24eb0 69 6e 67 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  ing value..*/.st
24ec0 61 74 69 63 20 69 6e 74 20 70 72 6f 70 61 67 61  atic int propaga
24ed0 74 65 43 6f 6e 73 74 61 6e 74 45 78 70 72 52 65  teConstantExprRe
24ee0 77 72 69 74 65 28 57 61 6c 6b 65 72 20 2a 70 57  write(Walker *pW
24ef0 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
24f00 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  pr){.  int i;.  
24f10 57 68 65 72 65 43 6f 6e 73 74 20 2a 70 43 6f 6e  WhereConst *pCon
24f20 73 74 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  st;.  if( pExpr-
24f30 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
24f40 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
24f50 69 6e 75 65 3b 0a 20 20 70 43 6f 6e 73 74 20 3d  inue;.  pConst =
24f60 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 43 6f 6e   pWalker->u.pCon
24f70 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  st;.  for(i=0; i
24f80 3c 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 3b  <pConst->nConst;
24f90 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
24fa0 2a 70 43 6f 6c 75 6d 6e 20 3d 20 70 43 6f 6e 73  *pColumn = pCons
24fb0 74 2d 3e 61 70 45 78 70 72 5b 69 2a 32 5d 3b 0a  t->apExpr[i*2];.
24fc0 20 20 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e 3d      if( pColumn=
24fd0 3d 70 45 78 70 72 20 29 20 63 6f 6e 74 69 6e 75  =pExpr ) continu
24fe0 65 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 75  e;.    if( pColu
24ff0 6d 6e 2d 3e 69 54 61 62 6c 65 21 3d 70 45 78 70  mn->iTable!=pExp
25000 72 2d 3e 69 54 61 62 6c 65 20 29 20 63 6f 6e 74  r->iTable ) cont
25010 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43  inue;.    if( pC
25020 6f 6c 75 6d 6e 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  olumn->iColumn!=
25030 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29  pExpr->iColumn )
25040 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 2f   continue;.    /
25050 2a 20 41 20 6d 61 74 63 68 20 69 73 20 66 6f 75  * A match is fou
25060 6e 64 2e 20 20 54 72 61 6e 73 66 6f 72 6d 20 74  nd.  Transform t
25070 68 65 20 43 4f 4c 55 4d 4e 20 69 6e 74 6f 20 61  he COLUMN into a
25080 20 43 4f 4e 53 54 41 4e 54 20 2a 2f 0a 20 20 20   CONSTANT */.   
25090 20 70 43 6f 6e 73 74 2d 3e 6e 43 68 6e 67 2b 2b   pConst->nChng++
250a0 3b 0a 20 20 20 20 45 78 70 72 43 6c 65 61 72 50  ;.    ExprClearP
250b0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
250c0 50 5f 4c 65 61 66 29 3b 0a 20 20 20 20 70 45 78  P_Leaf);.    pEx
250d0 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 55 50 4c 55  pr->op = TK_UPLU
250e0 53 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c  S;.    pExpr->pL
250f0 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
25100 72 44 75 70 28 70 43 6f 6e 73 74 2d 3e 64 62 2c  rDup(pConst->db,
25110 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 5b   pConst->apExpr[
25120 69 2a 32 2b 31 5d 2c 20 30 29 3b 0a 20 20 20 20  i*2+1], 0);.    
25130 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
25140 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 7d  urn WRC_Prune;.}
25150 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 57 48 45 52  ../*.** The WHER
25160 45 2d 63 6c 61 75 73 65 20 63 6f 6e 73 74 61 6e  E-clause constan
25170 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6f 70  t propagation op
25180 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  timization..**.*
25190 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63  * If the WHERE c
251a0 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 74  lause contains t
251b0 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
251c0 20 43 4f 4c 55 4d 4e 3d 43 4f 4e 53 54 41 4e 54   COLUMN=CONSTANT
251d0 20 6f 72 0a 2a 2a 20 43 4f 4e 53 54 41 4e 54 3d   or.** CONSTANT=
251e0 43 4f 4c 55 4d 4e 20 74 68 61 74 20 6d 75 73 74  COLUMN that must
251f0 20 62 65 20 74 72 65 65 20 28 69 6e 20 6f 74 68   be tree (in oth
25200 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65  er words, if the
25210 20 74 65 72 6d 73 20 74 6f 70 2d 6c 65 76 65 6c   terms top-level
25220 0a 2a 2a 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65  .** AND-connecte
25230 64 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65  d terms that are
25240 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 4f   not part of a O
25250 4e 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 61 20  N clause from a 
25260 4c 45 46 54 20 4a 4f 49 4e 29 0a 2a 2a 20 74 68  LEFT JOIN).** th
25270 65 6e 20 74 68 72 6f 75 67 68 6f 75 74 20 74 68  en throughout th
25280 65 20 71 75 65 72 79 20 72 65 70 6c 61 63 65 20  e query replace 
25290 61 6c 6c 20 6f 74 68 65 72 20 6f 63 63 75 72 72  all other occurr
252a0 65 6e 63 65 73 20 6f 66 20 43 4f 4c 55 4d 4e 0a  ences of COLUMN.
252b0 2a 2a 20 77 69 74 68 20 43 4f 4e 53 54 41 4e 54  ** with CONSTANT
252c0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
252d0 70 6c 65 2c 20 74 68 65 20 71 75 65 72 79 3a 0a  ple, the query:.
252e0 2a 2a 0a 2a 2a 20 20 20 20 20 20 53 45 4c 45 43  **.**      SELEC
252f0 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c  T * FROM t1, t2,
25300 20 74 33 20 57 48 45 52 45 20 74 31 2e 61 3d 33   t3 WHERE t1.a=3
25310 39 20 41 4e 44 20 74 32 2e 62 3d 74 31 2e 61 20  9 AND t2.b=t1.a 
25320 41 4e 44 20 74 33 2e 63 3d 74 32 2e 62 0a 2a 2a  AND t3.c=t2.b.**
25330 0a 2a 2a 20 49 73 20 74 72 61 6e 73 66 6f 72 6d  .** Is transform
25340 65 64 20 69 6e 74 6f 0a 2a 2a 0a 2a 2a 20 20 20  ed into.**.**   
25350 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
25360 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52   t1, t2, t3 WHER
25370 45 20 74 31 2e 61 3d 33 39 20 41 4e 44 20 74 32  E t1.a=39 AND t2
25380 2e 62 3d 33 39 20 41 4e 44 20 74 33 2e 63 3d 33  .b=39 AND t3.c=3
25390 39 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  9.**.** Return t
253a0 72 75 65 20 69 66 20 61 6e 79 20 74 72 61 6e 73  rue if any trans
253b0 66 6f 72 6d 61 74 69 6f 6e 73 20 77 68 65 72 65  formations where
253c0 20 6d 61 64 65 20 61 6e 64 20 66 61 6c 73 65 20   made and false 
253d0 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69  if not..*/.stati
253e0 63 20 69 6e 74 20 70 72 6f 70 61 67 61 74 65 43  c int propagateC
253f0 6f 6e 73 74 61 6e 74 73 28 0a 20 20 50 61 72 73  onstants(.  Pars
25400 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
25410 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
25420 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
25430 2a 70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  *p        /* The
25440 20 71 75 65 72 79 20 69 6e 20 77 68 69 63 68 20   query in which 
25450 74 6f 20 70 72 6f 70 61 67 61 74 65 20 63 6f 6e  to propagate con
25460 73 74 61 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 57  stants */.){.  W
25470 68 65 72 65 43 6f 6e 73 74 20 78 3b 0a 20 20 57  hereConst x;.  W
25480 61 6c 6b 65 72 20 77 3b 0a 20 20 69 6e 74 20 6e  alker w;.  int n
25490 43 68 6e 67 20 3d 20 30 3b 0a 20 20 78 2e 64 62  Chng = 0;.  x.db
254a0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
254b0 20 64 6f 7b 0a 20 20 20 20 78 2e 6e 43 6f 6e 73   do{.    x.nCons
254c0 74 20 3d 20 30 3b 0a 20 20 20 20 78 2e 6e 43 68  t = 0;.    x.nCh
254d0 6e 67 20 3d 20 30 3b 0a 20 20 20 20 78 2e 61 70  ng = 0;.    x.ap
254e0 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 66 69  Expr = 0;.    fi
254f0 6e 64 43 6f 6e 73 74 49 6e 57 68 65 72 65 28 26  ndConstInWhere(&
25500 78 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  x, p->pWhere);. 
25510 20 20 20 69 66 28 20 78 2e 6e 43 6f 6e 73 74 20     if( x.nConst 
25520 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
25530 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
25540 29 3b 0a 20 20 20 20 20 20 77 2e 70 50 61 72 73  );.      w.pPars
25550 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20  e = pParse;.    
25560 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
25570 6b 20 3d 20 70 72 6f 70 61 67 61 74 65 43 6f 6e  k = propagateCon
25580 73 74 61 6e 74 45 78 70 72 52 65 77 72 69 74 65  stantExprRewrite
25590 3b 0a 20 20 20 20 20 20 77 2e 78 53 65 6c 65 63  ;.      w.xSelec
255a0 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69  tCallback = sqli
255b0 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f  te3SelectWalkNoo
255c0 70 3b 0a 20 20 20 20 20 20 77 2e 78 53 65 6c 65  p;.      w.xSele
255d0 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b  ctCallback2 = 0;
255e0 0a 20 20 20 20 20 20 77 2e 77 61 6c 6b 65 72 44  .      w.walkerD
255f0 65 70 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  epth = 0;.      
25600 77 2e 75 2e 70 43 6f 6e 73 74 20 3d 20 26 78 3b  w.u.pConst = &x;
25610 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61  .      sqlite3Wa
25620 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 29 3b  lkSelect(&w, p);
25630 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
25640 46 72 65 65 28 78 2e 64 62 2c 20 78 2e 61 70 45  Free(x.db, x.apE
25650 78 70 72 29 3b 0a 20 20 20 20 20 20 6e 43 68 6e  xpr);.      nChn
25660 67 20 2b 3d 20 78 2e 6e 43 68 6e 67 3b 0a 20 20  g += x.nChng;.  
25670 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 78 2e    }.  }while( x.
25680 6e 43 68 6e 67 20 29 3b 20 20 0a 20 20 72 65 74  nChng );  .  ret
25690 75 72 6e 20 6e 43 68 6e 67 3b 0a 7d 0a 0a 23 69  urn nChng;.}..#i
256a0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
256b0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
256c0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
256d0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f  ITE_OMIT_VIEW)./
256e0 2a 0a 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73  *.** Make copies
256f0 20 6f 66 20 72 65 6c 65 76 61 6e 74 20 57 48 45   of relevant WHE
25700 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
25710 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
25720 72 79 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 57  ry into.** the W
25730 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 73  HERE clause of s
25740 75 62 71 75 65 72 79 2e 20 20 45 78 61 6d 70 6c  ubquery.  Exampl
25750 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  e:.**.**    SELE
25760 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT * FROM (SELEC
25770 54 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53  T a AS x, c-d AS
25780 20 79 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52   y FROM t1) WHER
25790 45 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a  E x=5 AND y=10;.
257a0 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65  **.** Transforme
257b0 64 20 69 6e 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20  d into:.**.**   
257c0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28   SELECT * FROM (
257d0 53 45 4c 45 43 54 20 61 20 41 53 20 78 2c 20 63  SELECT a AS x, c
257e0 2d 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31 20  -d AS y FROM t1 
257f0 57 48 45 52 45 20 61 3d 35 20 41 4e 44 20 63 2d  WHERE a=5 AND c-
25800 64 3d 31 30 29 0a 2a 2a 20 20 20 20 20 57 48 45  d=10).**     WHE
25810 52 45 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b  RE x=5 AND y=10;
25820 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 6f 70 65 20  .**.** The hope 
25830 69 73 20 74 68 61 74 20 74 68 65 20 74 65 72 6d  is that the term
25840 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69  s added to the i
25850 6e 6e 65 72 20 71 75 65 72 79 20 77 69 6c 6c 20  nner query will 
25860 6d 61 6b 65 20 69 74 20 6d 6f 72 65 0a 2a 2a 20  make it more.** 
25870 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a  efficient..**.**
25880 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   Do not attempt 
25890 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
258a0 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  n if:.**.**   (1
258b0 29 20 28 2a 2a 20 54 68 69 73 20 72 65 73 74 72  ) (** This restr
258c0 69 63 74 69 6f 6e 20 77 61 73 20 72 65 6d 6f 76  iction was remov
258d0 65 64 20 6f 6e 20 32 30 31 37 2d 30 39 2d 32 39  ed on 2017-09-29
258e0 2e 20 20 57 65 20 75 73 65 64 20 74 6f 0a 2a 2a  .  We used to.**
258f0 20 20 20 20 20 20 20 20 20 20 20 64 69 73 61 6c             disal
25900 6c 6f 77 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  low this optimiz
25910 61 74 69 6f 6e 20 66 6f 72 20 61 67 67 72 65 67  ation for aggreg
25920 61 74 65 20 73 75 62 71 75 65 72 69 65 73 2c 20  ate subqueries, 
25930 62 75 74 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20  but now.**      
25940 20 20 20 20 20 69 74 20 69 73 20 61 6c 6c 6f 77       it is allow
25950 65 64 20 62 79 20 70 75 74 74 69 6e 67 20 74 68  ed by putting th
25960 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e  e extra terms on
25970 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   the HAVING clau
25980 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  se..**          
25990 20 54 68 65 20 61 64 64 65 64 20 48 41 56 49 4e   The added HAVIN
259a0 47 20 63 6c 61 75 73 65 20 69 73 20 70 6f 69 6e  G clause is poin
259b0 74 6c 65 73 73 20 69 66 20 74 68 65 20 73 75 62  tless if the sub
259c0 71 75 65 72 79 20 6c 61 63 6b 73 0a 2a 2a 20 20  query lacks.**  
259d0 20 20 20 20 20 20 20 20 20 61 20 47 52 4f 55 50           a GROUP
259e0 20 42 59 20 63 6c 61 75 73 65 2e 20 20 42 75 74   BY clause.  But
259f0 20 73 75 63 68 20 61 20 48 41 56 49 4e 47 20 63   such a HAVING c
25a00 6c 61 75 73 65 20 69 73 20 61 6c 73 6f 20 68 61  lause is also ha
25a10 72 6d 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 20  rmless.**       
25a20 20 20 20 20 73 6f 20 74 68 65 72 65 20 64 6f 65      so there doe
25a30 73 20 6e 6f 74 20 61 70 70 65 61 72 20 74 6f 20  s not appear to 
25a40 62 65 20 61 6e 79 20 72 65 61 73 6f 6e 20 74 6f  be any reason to
25a50 20 61 64 64 20 65 78 74 72 61 20 6c 6f 67 69 63   add extra logic
25a60 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 74 6f  .**           to
25a70 20 73 75 70 70 72 65 73 73 20 69 74 2e 20 2a 2a   suppress it. **
25a80 29 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 54 68  ).**.**   (2) Th
25a90 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73  e inner query is
25aa0 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 70   the recursive p
25ab0 61 72 74 20 6f 66 20 61 20 63 6f 6d 6d 6f 6e 20  art of a common 
25ac0 74 61 62 6c 65 20 65 78 70 72 65 73 73 69 6f 6e  table expression
25ad0 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 54 68  ..**.**   (3) Th
25ae0 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 68 61  e inner query ha
25af0 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  s a LIMIT clause
25b00 20 28 73 69 6e 63 65 20 74 68 65 20 63 68 61 6e   (since the chan
25b10 67 65 73 20 74 6f 20 74 68 65 20 57 48 45 52 45  ges to the WHERE
25b20 0a 2a 2a 20 20 20 20 20 20 20 63 6c 61 75 73 65  .**       clause
25b30 20 77 6f 75 6c 64 20 63 68 61 6e 67 65 20 74 68   would change th
25b40 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65  e meaning of the
25b50 20 4c 49 4d 49 54 29 2e 0a 2a 2a 0a 2a 2a 20 20   LIMIT)..**.**  
25b60 20 28 34 29 20 54 68 65 20 69 6e 6e 65 72 20 71   (4) The inner q
25b70 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68  uery is the righ
25b80 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c  t operand of a L
25b90 45 46 54 20 4a 4f 49 4e 20 61 6e 64 20 74 68 65  EFT JOIN and the
25ba0 0a 2a 2a 20 20 20 20 20 20 20 65 78 70 72 65 73  .**       expres
25bb0 73 69 6f 6e 20 74 6f 20 62 65 20 70 75 73 68 65  sion to be pushe
25bc0 64 20 64 6f 77 6e 20 64 6f 65 73 20 6e 6f 74 20  d down does not 
25bd0 63 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e  come from the ON
25be0 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20   clause.**      
25bf0 20 6f 6e 20 74 68 61 74 20 4c 45 46 54 20 4a 4f   on that LEFT JO
25c00 49 4e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20  IN..**.**   (5) 
25c10 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
25c20 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67   expression orig
25c30 69 6e 61 74 65 73 20 69 6e 20 74 68 65 20 4f 4e  inates in the ON
25c40 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
25c50 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 61 20 4c  .**       of a L
25c60 45 46 54 20 4a 4f 49 4e 20 77 68 65 72 65 20 69  EFT JOIN where i
25c70 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 74 68  Cursor is not th
25c80 65 20 72 69 67 68 74 2d 68 61 6e 64 20 74 61 62  e right-hand tab
25c90 6c 65 20 6f 66 20 74 68 61 74 0a 2a 2a 20 20 20  le of that.**   
25ca0 20 20 20 20 6c 65 66 74 20 6a 6f 69 6e 2e 20 20      left join.  
25cb0 41 6e 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  An example:.**.*
25cc0 2a 20 20 20 20 20 20 20 20 20 20 20 53 45 4c 45  *           SELE
25cd0 43 54 20 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  CT *.**         
25ce0 20 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 31    FROM (SELECT 1
25cf0 20 41 53 20 61 31 20 55 4e 49 4f 4e 20 41 4c 4c   AS a1 UNION ALL
25d00 20 53 45 4c 45 43 54 20 32 29 20 41 53 20 61 61   SELECT 2) AS aa
25d10 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4a 4f  .**           JO
25d20 49 4e 20 28 53 45 4c 45 43 54 20 31 20 41 53 20  IN (SELECT 1 AS 
25d30 62 32 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  b2 UNION ALL SEL
25d40 45 43 54 20 32 29 20 41 53 20 62 62 20 4f 4e 20  ECT 2) AS bb ON 
25d50 28 61 31 3d 62 32 29 0a 2a 2a 20 20 20 20 20 20  (a1=b2).**      
25d60 20 20 20 20 20 4c 45 46 54 20 4a 4f 49 4e 20 28       LEFT JOIN (
25d70 53 45 4c 45 43 54 20 38 20 41 53 20 63 33 20 55  SELECT 8 AS c3 U
25d80 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
25d90 39 29 20 41 53 20 63 63 20 4f 4e 20 28 62 32 3d  9) AS cc ON (b2=
25da0 32 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  2);.**.**       
25db0 54 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77  The correct answ
25dc0 65 72 20 69 73 20 74 68 72 65 65 20 72 6f 77 73  er is three rows
25dd0 3a 20 20 28 31 2c 31 2c 4e 55 4c 4c 29 2c 28 32  :  (1,1,NULL),(2
25de0 2c 32 2c 38 29 2c 28 32 2c 32 2c 39 29 2e 0a 2a  ,2,8),(2,2,9)..*
25df0 2a 20 20 20 20 20 20 20 42 75 74 20 69 66 20 74  *       But if t
25e00 68 65 20 28 62 32 3d 32 29 20 74 65 72 6d 20 77  he (b2=2) term w
25e10 65 72 65 20 74 6f 20 62 65 20 70 75 73 68 65 64  ere to be pushed
25e20 20 64 6f 77 6e 20 69 6e 74 6f 20 74 68 65 20 62   down into the b
25e30 62 20 73 75 62 71 75 65 72 79 2c 0a 2a 2a 20 20  b subquery,.**  
25e40 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 28 31       then the (1
25e50 2c 31 2c 4e 55 4c 4c 29 20 72 6f 77 20 77 6f 75  ,1,NULL) row wou
25e60 6c 64 20 62 65 20 73 75 70 70 72 65 73 73 65 64  ld be suppressed
25e70 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 54 68  ..**.**   (6) Th
25e80 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 66 65  e inner query fe
25e90 61 74 75 72 65 73 20 6f 6e 65 20 6f 72 20 6d 6f  atures one or mo
25ea0 72 65 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69  re window-functi
25eb0 6f 6e 73 20 28 73 69 6e 63 65 20 0a 2a 2a 20 20  ons (since .**  
25ec0 20 20 20 20 20 63 68 61 6e 67 65 73 20 74 6f 20       changes to 
25ed0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
25ee0 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 71 75   of the inner qu
25ef0 65 72 79 20 63 6f 75 6c 64 20 63 68 61 6e 67 65  ery could change
25f00 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 77   the .**       w
25f10 69 6e 64 6f 77 20 6f 76 65 72 20 77 68 69 63 68  indow over which
25f20 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
25f30 73 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64  s are calculated
25f40 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  )..**.** Return 
25f50 30 20 69 66 20 6e 6f 20 63 68 61 6e 67 65 73 20  0 if no changes 
25f60 61 72 65 20 6d 61 64 65 20 61 6e 64 20 6e 6f 6e  are made and non
25f70 2d 7a 65 72 6f 20 69 66 20 6f 6e 65 20 6f 72 20  -zero if one or 
25f80 6d 6f 72 65 20 57 48 45 52 45 20 63 6c 61 75 73  more WHERE claus
25f90 65 0a 2a 2a 20 74 65 72 6d 73 20 61 72 65 20 64  e.** terms are d
25fa0 75 70 6c 69 63 61 74 65 64 20 69 6e 74 6f 20 74  uplicated into t
25fb0 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a  he subquery..*/.
25fc0 73 74 61 74 69 63 20 69 6e 74 20 70 75 73 68 44  static int pushD
25fd0 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 0a 20  ownWhereTerms(. 
25fe0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
25ff0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
26000 63 6f 6e 74 65 78 74 20 28 66 6f 72 20 6d 61 6c  context (for mal
26010 6c 6f 63 28 29 20 61 6e 64 20 65 72 72 6f 72 20  loc() and error 
26020 72 65 70 6f 72 74 69 6e 67 29 20 2a 2f 0a 20 20  reporting) */.  
26030 53 65 6c 65 63 74 20 2a 70 53 75 62 71 2c 20 20  Select *pSubq,  
26040 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62        /* The sub
26050 71 75 65 72 79 20 77 68 6f 73 65 20 57 48 45 52  query whose WHER
26060 45 20 63 6c 61 75 73 65 20 69 73 20 74 6f 20 62  E clause is to b
26070 65 20 61 75 67 6d 65 6e 74 65 64 20 2a 2f 0a 20  e augmented */. 
26080 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20   Expr *pWhere,  
26090 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
260a0 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ERE clause of th
260b0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
260c0 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72 2c 20  .  int iCursor, 
260d0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
260e0 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
260f0 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
26100 6e 74 20 69 73 4c 65 66 74 4a 6f 69 6e 20 20 20  nt isLeftJoin   
26110 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
26120 70 53 75 62 71 20 69 73 20 74 68 65 20 72 69 67  pSubq is the rig
26130 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46  ht term of a LEF
26140 54 20 4a 4f 49 4e 20 2a 2f 0a 29 7b 0a 20 20 45  T JOIN */.){.  E
26150 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  xpr *pNew;.  int
26160 20 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20 69 66   nChng = 0;.  if
26170 28 20 70 57 68 65 72 65 3d 3d 30 20 29 20 72 65  ( pWhere==0 ) re
26180 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 53  turn 0;.  if( pS
26190 75 62 71 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ubq->selFlags & 
261a0 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 20 72  SF_Recursive ) r
261b0 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 72 65 73  eturn 0;  /* res
261c0 74 72 69 63 74 69 6f 6e 20 28 32 29 20 2a 2f 0a  triction (2) */.
261d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
261e0 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a  OMIT_WINDOWFUNC.
261f0 20 20 69 66 28 20 70 53 75 62 71 2d 3e 70 57 69    if( pSubq->pWi
26200 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  n ) return 0;   
26210 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20   /* restriction 
26220 28 36 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23  (6) */.#endif..#
26230 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
26240 55 47 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65  UG.  /* Only the
26250 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20 61   first term of a
26260 20 63 6f 6d 70 6f 75 6e 64 20 63 61 6e 20 68 61   compound can ha
26270 76 65 20 61 20 57 49 54 48 20 63 6c 61 75 73 65  ve a WITH clause
26280 2e 20 20 42 75 74 20 6d 61 6b 65 0a 20 20 2a 2a  .  But make.  **
26290 20 73 75 72 65 20 6e 6f 20 6f 74 68 65 72 20 74   sure no other t
262a0 65 72 6d 73 20 61 72 65 20 6d 61 72 6b 65 64 20  erms are marked 
262b0 53 46 5f 52 65 63 75 72 73 69 76 65 20 69 6e 20  SF_Recursive in 
262c0 63 61 73 65 20 73 6f 6d 65 74 68 69 6e 67 20 63  case something c
262d0 68 61 6e 67 65 73 0a 20 20 2a 2a 20 69 6e 20 74  hanges.  ** in t
262e0 68 65 20 66 75 74 75 72 65 2e 0a 20 20 2a 2f 0a  he future..  */.
262f0 20 20 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a    {.    Select *
26300 70 58 3b 20 20 0a 20 20 20 20 66 6f 72 28 70 58  pX;  .    for(pX
26310 3d 70 53 75 62 71 3b 20 70 58 3b 20 70 58 3d 70  =pSubq; pX; pX=p
26320 58 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  X->pPrior){.    
26330 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 73    assert( (pX->s
26340 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 52 65  elFlags & (SF_Re
26350 63 75 72 73 69 76 65 29 29 3d 3d 30 20 29 3b 0a  cursive))==0 );.
26360 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
26370 0a 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e 70  ..  if( pSubq->p
26380 4c 69 6d 69 74 21 3d 30 20 29 7b 0a 20 20 20 20  Limit!=0 ){.    
26390 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73  return 0; /* res
263a0 74 72 69 63 74 69 6f 6e 20 28 33 29 20 2a 2f 0a  triction (3) */.
263b0 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 57 68    }.  while( pWh
263c0 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20  ere->op==TK_AND 
263d0 29 7b 0a 20 20 20 20 6e 43 68 6e 67 20 2b 3d 20  ){.    nChng += 
263e0 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72  pushDownWhereTer
263f0 6d 73 28 70 50 61 72 73 65 2c 20 70 53 75 62 71  ms(pParse, pSubq
26400 2c 20 70 57 68 65 72 65 2d 3e 70 52 69 67 68 74  , pWhere->pRight
26410 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
26420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26430 20 20 69 43 75 72 73 6f 72 2c 20 69 73 4c 65 66    iCursor, isLef
26440 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 57 68 65  tJoin);.    pWhe
26450 72 65 20 3d 20 70 57 68 65 72 65 2d 3e 70 4c 65  re = pWhere->pLe
26460 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  ft;.  }.  if( is
26470 4c 65 66 74 4a 6f 69 6e 0a 20 20 20 26 26 20 28  LeftJoin.   && (
26480 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
26490 70 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a 6f  pWhere,EP_FromJo
264a0 69 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  in)==0.         
264b0 7c 7c 20 70 57 68 65 72 65 2d 3e 69 52 69 67 68  || pWhere->iRigh
264c0 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 69 43 75 72  tJoinTable!=iCur
264d0 73 6f 72 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  sor).  ){.    re
264e0 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72  turn 0; /* restr
264f0 69 63 74 69 6f 6e 20 28 34 29 20 2a 2f 0a 20 20  iction (4) */.  
26500 7d 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  }.  if( ExprHasP
26510 72 6f 70 65 72 74 79 28 70 57 68 65 72 65 2c 45  roperty(pWhere,E
26520 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 26 26 20 70  P_FromJoin) && p
26530 57 68 65 72 65 2d 3e 69 52 69 67 68 74 4a 6f 69  Where->iRightJoi
26540 6e 54 61 62 6c 65 21 3d 69 43 75 72 73 6f 72 20  nTable!=iCursor 
26550 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
26560 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20   /* restriction 
26570 28 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  (5) */.  }.  if(
26580 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61   sqlite3ExprIsTa
26590 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70 57 68 65  bleConstant(pWhe
265a0 72 65 2c 20 69 43 75 72 73 6f 72 29 20 29 7b 0a  re, iCursor) ){.
265b0 20 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20      nChng++;.   
265c0 20 77 68 69 6c 65 28 20 70 53 75 62 71 20 29 7b   while( pSubq ){
265d0 0a 20 20 20 20 20 20 53 75 62 73 74 43 6f 6e 74  .      SubstCont
265e0 65 78 74 20 78 3b 0a 20 20 20 20 20 20 70 4e 65  ext x;.      pNe
265f0 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  w = sqlite3ExprD
26600 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
26610 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 20  Where, 0);.     
26620 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28 70   unsetJoinExpr(p
26630 4e 65 77 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  New, -1);.      
26640 78 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  x.pParse = pPars
26650 65 3b 0a 20 20 20 20 20 20 78 2e 69 54 61 62 6c  e;.      x.iTabl
26660 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20 20  e = iCursor;.   
26670 20 20 20 78 2e 69 4e 65 77 54 61 62 6c 65 20 3d     x.iNewTable =
26680 20 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20   iCursor;.      
26690 78 2e 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 30  x.isLeftJoin = 0
266a0 3b 0a 20 20 20 20 20 20 78 2e 70 45 4c 69 73 74  ;.      x.pEList
266b0 20 3d 20 70 53 75 62 71 2d 3e 70 45 4c 69 73 74   = pSubq->pEList
266c0 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73  ;.      pNew = s
266d0 75 62 73 74 45 78 70 72 28 26 78 2c 20 70 4e 65  ubstExpr(&x, pNe
266e0 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  w);.      if( pS
266f0 75 62 71 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ubq->selFlags & 
26700 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 7b 0a  SF_Aggregate ){.
26710 20 20 20 20 20 20 20 20 70 53 75 62 71 2d 3e 70          pSubq->p
26720 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  Having = sqlite3
26730 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e  ExprAnd(pParse->
26740 64 62 2c 20 70 53 75 62 71 2d 3e 70 48 61 76 69  db, pSubq->pHavi
26750 6e 67 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  ng, pNew);.     
26760 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26770 70 53 75 62 71 2d 3e 70 57 68 65 72 65 20 3d 20  pSubq->pWhere = 
26780 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
26790 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 75 62 71  Parse->db, pSubq
267a0 2d 3e 70 57 68 65 72 65 2c 20 70 4e 65 77 29 3b  ->pWhere, pNew);
267b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
267c0 53 75 62 71 20 3d 20 70 53 75 62 71 2d 3e 70 50  Subq = pSubq->pP
267d0 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rior;.    }.  }.
267e0 20 20 72 65 74 75 72 6e 20 6e 43 68 6e 67 3b 0a    return nChng;.
267f0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
26800 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
26810 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
26820 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
26830 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a  IT_VIEW) */../*.
26840 2a 2a 20 54 68 65 20 70 46 75 6e 63 20 69 73 20  ** The pFunc is 
26850 74 68 65 20 6f 6e 6c 79 20 61 67 67 72 65 67 61  the only aggrega
26860 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74  te function in t
26870 68 65 20 71 75 65 72 79 2e 20 20 43 68 65 63 6b  he query.  Check
26880 20 74 6f 20 73 65 65 0a 2a 2a 20 69 66 20 74 68   to see.** if th
26890 65 20 71 75 65 72 79 20 69 73 20 61 20 63 61 6e  e query is a can
268a0 64 69 64 61 74 65 20 66 6f 72 20 74 68 65 20 6d  didate for the m
268b0 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a 61 74  in/max optimizat
268c0 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ion. .**.** If t
268d0 68 65 20 71 75 65 72 79 20 69 73 20 61 20 63 61  he query is a ca
268e0 6e 64 69 64 61 74 65 20 66 6f 72 20 74 68 65 20  ndidate for the 
268f0 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a 61  min/max optimiza
26900 74 69 6f 6e 2c 20 74 68 65 6e 20 73 65 74 0a 2a  tion, then set.*
26910 2a 20 2a 70 70 4d 69 6e 4d 61 78 20 74 6f 20 62  * *ppMinMax to b
26920 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  e an ORDER BY cl
26930 61 75 73 65 20 74 6f 20 62 65 20 75 73 65 64 20  ause to be used 
26940 66 6f 72 20 74 68 65 20 6f 70 74 69 6d 69 7a 61  for the optimiza
26950 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72 65 74 75  tion.** and retu
26960 72 6e 20 65 69 74 68 65 72 20 57 48 45 52 45 5f  rn either WHERE_
26970 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57  ORDERBY_MIN or W
26980 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58  HERE_ORDERBY_MAX
26990 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 0a 2a 2a   depending on.**
269a0 20 77 68 65 74 68 65 72 20 70 46 75 6e 63 20 69   whether pFunc i
269b0 73 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  s a min() or max
269c0 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  () function..**.
269d0 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  ** If the query 
269e0 69 73 20 6e 6f 74 20 61 20 63 61 6e 64 69 64 61  is not a candida
269f0 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d  te for the min/m
26a00 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  ax optimization,
26a10 20 72 65 74 75 72 6e 0a 2a 2a 20 57 48 45 52 45   return.** WHERE
26a20 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 20  _ORDERBY_NORMAL 
26a30 28 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 7a  (which must be z
26a40 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ero)..**.** This
26a50 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65   routine must be
26a60 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 67   called after ag
26a70 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
26a80 73 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 6c  s have been.** l
26a90 6f 63 61 74 65 64 20 62 75 74 20 62 65 66 6f 72  ocated but befor
26aa0 65 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74  e their argument
26ab0 73 20 68 61 76 65 20 62 65 65 6e 20 73 75 62 6a  s have been subj
26ac0 65 63 74 65 64 20 74 6f 20 61 67 67 72 65 67 61  ected to aggrega
26ad0 74 65 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2e 0a  te.** analysis..
26ae0 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e  */.static u8 min
26af0 4d 61 78 51 75 65 72 79 28 73 71 6c 69 74 65 33  MaxQuery(sqlite3
26b00 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 46 75 6e   *db, Expr *pFun
26b10 63 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70  c, ExprList **pp
26b20 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 65  MinMax){.  int e
26b30 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  Ret = WHERE_ORDE
26b40 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20 20  RBY_NORMAL;     
26b50 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
26b60 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
26b70 70 45 4c 69 73 74 20 3d 20 70 46 75 6e 63 2d 3e  pEList = pFunc->
26b80 78 2e 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 41  x.pList;    /* A
26b90 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 67 67 20  rguments to agg 
26ba0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f  function */.  co
26bb0 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 3b  nst char *zFunc;
26bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bd0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61      /* Name of a
26be0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
26bf0 6e 20 70 46 75 6e 63 20 2a 2f 0a 20 20 45 78 70  n pFunc */.  Exp
26c00 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
26c10 0a 20 20 75 38 20 73 6f 72 74 4f 72 64 65 72 3b  .  u8 sortOrder;
26c20 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 70 4d  ..  assert( *ppM
26c30 69 6e 4d 61 78 3d 3d 30 20 29 3b 0a 20 20 61 73  inMax==0 );.  as
26c40 73 65 72 74 28 20 70 46 75 6e 63 2d 3e 6f 70 3d  sert( pFunc->op=
26c50 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
26c60 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74   );.  if( pEList
26c70 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e  ==0 || pEList->n
26c80 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
26c90 20 65 52 65 74 3b 0a 20 20 7a 46 75 6e 63 20 3d   eRet;.  zFunc =
26ca0 20 70 46 75 6e 63 2d 3e 75 2e 7a 54 6f 6b 65 6e   pFunc->u.zToken
26cb0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
26cc0 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d  trICmp(zFunc, "m
26cd0 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65  in")==0 ){.    e
26ce0 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  Ret = WHERE_ORDE
26cf0 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 73 6f 72  RBY_MIN;.    sor
26d00 74 4f 72 64 65 72 20 3d 20 53 51 4c 49 54 45 5f  tOrder = SQLITE_
26d10 53 4f 5f 41 53 43 3b 0a 20 20 7d 65 6c 73 65 20  SO_ASC;.  }else 
26d20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
26d30 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78 22 29  mp(zFunc, "max")
26d40 3d 3d 30 20 29 7b 0a 20 20 20 20 65 52 65 74 20  ==0 ){.    eRet 
26d50 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
26d60 4d 41 58 3b 0a 20 20 20 20 73 6f 72 74 4f 72 64  MAX;.    sortOrd
26d70 65 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 44  er = SQLITE_SO_D
26d80 45 53 43 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ESC;.  }else{.  
26d90 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 20    return eRet;. 
26da0 20 7d 0a 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d   }.  *ppMinMax =
26db0 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69   pOrderBy = sqli
26dc0 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
26dd0 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20  b, pEList, 0);. 
26de0 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
26df0 79 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  y!=0 || db->mall
26e00 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
26e10 28 20 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72  ( pOrderBy ) pOr
26e20 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 73 6f 72 74  derBy->a[0].sort
26e30 4f 72 64 65 72 20 3d 20 73 6f 72 74 4f 72 64 65  Order = sortOrde
26e40 72 3b 0a 20 20 72 65 74 75 72 6e 20 65 52 65 74  r;.  return eRet
26e50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
26e60 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
26e70 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
26e80 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
26e90 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65  an aggregate que
26ea0 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  ry..** The secon
26eb0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  d argument is th
26ec0 65 20 61 73 73 6f 63 69 61 74 65 64 20 61 67 67  e associated agg
26ed0 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65  regate-info obje
26ee0 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  ct. This .** fun
26ef0 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20 74  ction tests if t
26f00 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20  he SELECT is of 
26f10 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
26f20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
26f30 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a  ) FROM <tbl>.**.
26f40 2a 2a 20 77 68 65 72 65 20 74 61 62 6c 65 20 69  ** where table i
26f50 73 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  s a database tab
26f60 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73 65  le, not a sub-se
26f70 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 49 66  lect or view. If
26f80 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f   the query.** do
26f90 65 73 20 6d 61 74 63 68 20 74 68 69 73 20 70 61  es match this pa
26fa0 74 74 65 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f  ttern, then a po
26fb0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61 62  inter to the Tab
26fc0 6c 65 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73  le object repres
26fd0 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20  enting.** <tbl> 
26fe0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
26ff0 65 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74  erwise, 0 is ret
27000 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
27010 20 54 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65   Table *isSimple
27020 43 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c  Count(Select *p,
27030 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
27040 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  fo){.  Table *pT
27050 61 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70  ab;.  Expr *pExp
27060 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  r;..  assert( !p
27070 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20  ->pGroupBy );.. 
27080 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 7c   if( p->pWhere |
27090 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  | p->pEList->nEx
270a0 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e  pr!=1 .   || p->
270b0 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c  pSrc->nSrc!=1 ||
270c0 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
270d0 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20 20  Select.  ){.    
270e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
270f0 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  pTab = p->pSrc->
27100 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78  a[0].pTab;.  pEx
27110 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  pr = p->pEList->
27120 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73  a[0].pExpr;.  as
27130 73 65 72 74 28 20 70 54 61 62 20 26 26 20 21 70  sert( pTab && !p
27140 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26 20  Tab->pSelect && 
27150 70 45 78 70 72 20 29 3b 0a 0a 20 20 69 66 28 20  pExpr );..  if( 
27160 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
27170 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
27180 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
27190 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72  AGG_FUNCTION ) r
271a0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e  eturn 0;.  if( N
271b0 45 56 45 52 28 70 41 67 67 49 6e 66 6f 2d 3e 6e  EVER(pAggInfo->n
271c0 46 75 6e 63 3d 3d 30 29 20 29 20 72 65 74 75 72  Func==0) ) retur
271d0 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41 67 67  n 0;.  if( (pAgg
271e0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70  Info->aFunc[0].p
271f0 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 26  Func->funcFlags&
27200 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e  SQLITE_FUNC_COUN
27210 54 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  T)==0 ) return 0
27220 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66  ;.  if( pExpr->f
27230 6c 61 67 73 26 45 50 5f 44 69 73 74 69 6e 63 74  lags&EP_Distinct
27240 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
27250 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
27260 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f 75  /*.** If the sou
27270 72 63 65 2d 6c 69 73 74 20 69 74 65 6d 20 70 61  rce-list item pa
27280 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
27290 65 6e 74 20 77 61 73 20 61 75 67 6d 65 6e 74 65  ent was augmente
272a0 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44  d with an.** IND
272b0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
272c0 74 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61  then try to loca
272d0 74 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  te the specified
272e0 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 72 65   index. If there
272f0 0a 2a 2a 20 77 61 73 20 73 75 63 68 20 61 20 63  .** was such a c
27300 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6e 61  lause and the na
27310 6d 65 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74  med index cannot
27320 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   be found, retur
27330 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52  n .** SQLITE_ERR
27340 4f 52 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20  OR and leave an 
27350 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e  error in pParse.
27360 20 4f 74 68 65 72 77 69 73 65 2c 20 70 6f 70 75   Otherwise, popu
27370 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e  late .** pFrom->
27380 70 49 6e 64 65 78 20 61 6e 64 20 72 65 74 75 72  pIndex and retur
27390 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  n SQLITE_OK..*/.
273a0 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78  int sqlite3Index
273b0 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65  edByLookup(Parse
273c0 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74   *pParse, struct
273d0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
273e0 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72  From){.  if( pFr
273f0 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70 46 72 6f  om->pTab && pFro
27400 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
27410 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  y ){.    Table *
27420 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
27430 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49  ab;.    char *zI
27440 6e 64 65 78 65 64 42 79 20 3d 20 70 46 72 6f 6d  ndexedBy = pFrom
27450 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 3b  ->u1.zIndexedBy;
27460 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
27470 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
27480 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20  Tab->pIndex; .  
27490 20 20 20 20 20 20 70 49 64 78 20 26 26 20 73 71        pIdx && sq
274a0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 64  lite3StrICmp(pId
274b0 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78  x->zName, zIndex
274c0 65 64 42 79 29 3b 20 0a 20 20 20 20 20 20 20 20  edBy); .        
274d0 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
274e0 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
274f0 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 73  !pIdx ){.      s
27500 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
27510 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
27520 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64  index: %s", zInd
27530 65 78 65 64 42 79 2c 20 30 29 3b 0a 20 20 20 20  exedBy, 0);.    
27540 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
27550 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20  chema = 1;.     
27560 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
27570 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
27580 70 46 72 6f 6d 2d 3e 70 49 42 49 6e 64 65 78 20  pFrom->pIBIndex 
27590 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65  = pIdx;.  }.  re
275a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
275b0 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63 74 20 63  }./*.** Detect c
275c0 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73  ompound SELECT s
275d0 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 75  tatements that u
275e0 73 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  se an ORDER BY c
275f0 6c 61 75 73 65 20 77 69 74 68 20 0a 2a 2a 20 61  lause with .** a
27600 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  n alternative co
27610 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
27620 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  ..**.**    SELEC
27630 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58  T ... FROM t1 EX
27640 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20  CEPT SELECT ... 
27650 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59  FROM t2 ORDER BY
27660 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a   .. COLLATE ....
27670 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20  **.** These are 
27680 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 73  rewritten as a s
27690 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  ubquery:.**.**  
276a0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
276b0 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d  (SELECT ... FROM
276c0 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43   t1 EXCEPT SELEC
276d0 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 29 0a 2a  T ... FROM t2).*
276e0 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 2e  *     ORDER BY .
276f0 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a  .. COLLATE ....*
27700 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66  *.** This transf
27710 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 63 65  ormation is nece
27720 73 73 61 72 79 20 62 65 63 61 75 73 65 20 74 68  ssary because th
27730 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  e multiSelectOrd
27740 65 72 42 79 28 29 20 72 6f 75 74 69 6e 65 0a 2a  erBy() routine.*
27750 2a 20 61 62 6f 76 65 20 74 68 61 74 20 67 65 6e  * above that gen
27760 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
27770 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53  for a compound S
27780 45 4c 45 43 54 20 77 69 74 68 20 61 6e 20 4f 52  ELECT with an OR
27790 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a  DER BY clause.**
277a0 20 75 73 65 73 20 61 20 6d 65 72 67 65 20 61 6c   uses a merge al
277b0 67 6f 72 69 74 68 6d 20 74 68 61 74 20 72 65 71  gorithm that req
277c0 75 69 72 65 73 20 74 68 65 20 73 61 6d 65 20 63  uires the same c
277d0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
277e0 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75  e on the.** resu
277f0 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e  lt columns as on
27800 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
27810 61 75 73 65 2e 20 20 53 65 65 20 74 69 63 6b 65  ause.  See ticke
27820 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77 77 2e  t.** http://www.
27830 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69  sqlite.org/src/i
27840 6e 66 6f 2f 36 37 30 39 35 37 34 64 32 61 0a 2a  nfo/6709574d2a.*
27850 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66  *.** This transf
27860 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  ormation is only
27870 20 6e 65 65 64 65 64 20 66 6f 72 20 45 58 43 45   needed for EXCE
27880 50 54 2c 20 49 4e 54 45 52 53 45 43 54 2c 20 61  PT, INTERSECT, a
27890 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65  nd UNION..** The
278a0 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
278b0 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e 65 20 77  tor works fine w
278c0 69 74 68 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  ith multiSelectO
278d0 72 64 65 72 42 79 28 29 20 65 76 65 6e 20 77 68  rderBy() even wh
278e0 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20  en.** there are 
278f0 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73 20 69 6e  COLLATE terms in
27900 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a   the ORDER BY..*
27910 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e  /.static int con
27920 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65  vertCompoundSele
27930 63 74 54 6f 53 75 62 71 75 65 72 79 28 57 61 6c  ctToSubquery(Wal
27940 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
27950 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
27960 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  i;.  Select *pNe
27970 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 58 3b  w;.  Select *pX;
27980 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
27990 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
279a0 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 53 72 63  t_item *a;.  Src
279b0 4c 69 73 74 20 2a 70 4e 65 77 53 72 63 3b 0a 20  List *pNewSrc;. 
279c0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a   Parse *pParse;.
279d0 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a    Token dummy;..
279e0 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d    if( p->pPrior=
279f0 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
27a00 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28 20  Continue;.  if( 
27a10 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  p->pOrderBy==0 )
27a20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
27a30 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58 3d 70  inue;.  for(pX=p
27a40 3b 20 70 58 20 26 26 20 28 70 58 2d 3e 6f 70 3d  ; pX && (pX->op=
27a50 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f  =TK_ALL || pX->o
27a60 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b 20 70  p==TK_SELECT); p
27a70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a  X=pX->pPrior){}.
27a80 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 72 65    if( pX==0 ) re
27a90 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
27aa0 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f 72 64  e;.  a = p->pOrd
27ab0 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72 28 69  erBy->a;.  for(i
27ac0 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  =p->pOrderBy->nE
27ad0 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  xpr-1; i>=0; i--
27ae0 29 7b 0a 20 20 20 20 69 66 28 20 61 5b 69 5d 2e  ){.    if( a[i].
27af0 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
27b00 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72 65 61  P_Collate ) brea
27b10 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 30  k;.  }.  if( i<0
27b20 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
27b30 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49 66  ntinue;..  /* If
27b40 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
27b50 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73  oint, that means
27b60 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74   the transformat
27b70 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 2e  ion is required.
27b80 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20   */..  pParse = 
27b90 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
27ba0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
27bb0 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  db;.  pNew = sql
27bc0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
27bd0 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
27be0 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
27bf0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
27c00 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73 65 74  _Abort;.  memset
27c10 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69 7a 65  (&dummy, 0, size
27c20 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20 70 4e  of(dummy));.  pN
27c30 65 77 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  ewSrc = sqlite3S
27c40 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d  rcListAppendFrom
27c50 54 65 72 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c  Term(pParse,0,0,
27c60 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c  0,&dummy,pNew,0,
27c70 30 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 53 72  0);.  if( pNewSr
27c80 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  c==0 ) return WR
27c90 43 5f 41 62 6f 72 74 3b 0a 20 20 2a 70 4e 65 77  C_Abort;.  *pNew
27ca0 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70 53 72 63   = *p;.  p->pSrc
27cb0 20 3d 20 70 4e 65 77 53 72 63 3b 0a 20 20 70 2d   = pNewSrc;.  p-
27cc0 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
27cd0 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
27ce0 70 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74  pParse, 0, sqlit
27cf0 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 41 53  e3Expr(db, TK_AS
27d00 54 45 52 49 53 4b 2c 20 30 29 29 3b 0a 20 20 70  TERISK, 0));.  p
27d10 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
27d20 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20  ;.  p->pWhere = 
27d30 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  0;.  pNew->pGrou
27d40 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  pBy = 0;.  pNew-
27d50 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20 20  >pHaving = 0;.  
27d60 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
27d70 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20   0;.  p->pPrior 
27d80 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  = 0;.  p->pNext 
27d90 3d 20 30 3b 0a 20 20 70 2d 3e 70 57 69 74 68 20  = 0;.  p->pWith 
27da0 3d 20 30 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  = 0;.  p->selFla
27db0 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75  gs &= ~SF_Compou
27dc0 6e 64 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70  nd;.  assert( (p
27dd0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
27de0 43 6f 6e 76 65 72 74 65 64 29 3d 3d 30 20 29 3b  Converted)==0 );
27df0 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  .  p->selFlags |
27e00 3d 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 3b 0a  = SF_Converted;.
27e10 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
27e20 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a 20 20 70  pPrior!=0 );.  p
27e30 4e 65 77 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65  New->pPrior->pNe
27e40 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65  xt = pNew;.  pNe
27e50 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  w->pLimit = 0;. 
27e60 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
27e70 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  inue;.}../*.** C
27e80 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
27e90 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
27ea0 65 72 6d 20 70 46 72 6f 6d 20 68 61 73 20 74 61  erm pFrom has ta
27eb0 62 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e 63 74  ble-valued funct
27ec0 69 6f 6e 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73  ion.** arguments
27ed0 2e 20 20 49 66 20 69 74 20 64 6f 65 73 2c 20 6c  .  If it does, l
27ee0 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
27ef0 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 20  ssage in pParse 
27f00 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f  and return.** no
27f10 6e 2d 7a 65 72 6f 2c 20 73 69 6e 63 65 20 70 46  n-zero, since pF
27f20 72 6f 6d 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  rom is not allow
27f30 65 64 20 74 6f 20 62 65 20 61 20 74 61 62 6c 65  ed to be a table
27f40 2d 76 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e  -valued function
27f50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27f60 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e  cannotBeFunction
27f70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
27f80 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
27f90 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69  tem *pFrom){.  i
27fa0 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 54  f( pFrom->fg.isT
27fb0 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 73 71  abFunc ){.    sq
27fc0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
27fd0 61 72 73 65 2c 20 22 27 25 73 27 20 69 73 20 6e  arse, "'%s' is n
27fe0 6f 74 20 61 20 66 75 6e 63 74 69 6f 6e 22 2c 20  ot a function", 
27ff0 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pFrom->zName);. 
28000 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
28010 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
28020 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28030 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72  MIT_CTE./*.** Ar
28040 67 75 6d 65 6e 74 20 70 57 69 74 68 20 28 77 68  gument pWith (wh
28050 69 63 68 20 6d 61 79 20 62 65 20 4e 55 4c 4c 29  ich may be NULL)
28060 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c 69 6e   points to a lin
28070 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e 65 73 74  ked list of nest
28080 65 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f 6e 74  ed .** WITH cont
28090 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e 65 72  exts, from inner
280a0 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e 20 49   to outermost. I
280b0 66 20 74 68 65 20 74 61 62 6c 65 20 69 64 65 6e  f the table iden
280c0 74 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 46 52  tified by .** FR
280d0 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e  OM clause elemen
280e0 74 20 70 49 74 65 6d 20 69 73 20 72 65 61 6c 6c  t pItem is reall
280f0 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65  y a common-table
28100 2d 65 78 70 72 65 73 73 69 6f 6e 20 28 43 54 45  -expression (CTE
28110 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  ) .** then retur
28120 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
28130 68 65 20 43 54 45 20 64 65 66 69 6e 69 74 69 6f  he CTE definitio
28140 6e 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c 65  n for that table
28150 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 72  . Otherwise.** r
28160 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  eturn NULL..**.*
28170 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  * If a non-NULL 
28180 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65  value is returne
28190 64 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74 65 78  d, set *ppContex
281a0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
281b0 65 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65 63 74  e With.** object
281c0 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e   that the return
281d0 65 64 20 43 54 45 20 62 65 6c 6f 6e 67 73 20 74  ed CTE belongs t
281e0 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  o..*/.static str
281f0 75 63 74 20 43 74 65 20 2a 73 65 61 72 63 68 57  uct Cte *searchW
28200 69 74 68 28 0a 20 20 57 69 74 68 20 2a 70 57 69  ith(.  With *pWi
28210 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
28220 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
28230 74 20 69 6e 6e 65 72 6d 6f 73 74 20 57 49 54 48  t innermost WITH
28240 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
28250 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
28260 20 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f 2a 20   *pItem,     /* 
28270 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d  FROM clause elem
28280 65 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65 20 2a  ent to resolve *
28290 2f 0a 20 20 57 69 74 68 20 2a 2a 70 70 43 6f 6e  /.  With **ppCon
282a0 74 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20  text            
282b0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49 54 48      /* OUT: WITH
282c0 20 63 6c 61 75 73 65 20 72 65 74 75 72 6e 20 76   clause return v
282d0 61 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20  alue belongs to 
282e0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
282f0 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28  ar *zName;.  if(
28300 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
28310 65 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65 20 3d  e==0 && (zName =
28320 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d   pItem->zName)!=
28330 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a 70  0 ){.    With *p
28340 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 57 69 74  ;.    for(p=pWit
28350 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75 74 65  h; p; p=p->pOute
28360 72 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  r){.      int i;
28370 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
28380 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b  i<p->nCte; i++){
28390 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
283a0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d  ite3StrICmp(zNam
283b0 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  e, p->a[i].zName
283c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
283d0 20 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d 20 70    *ppContext = p
283e0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
283f0 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20  rn &p->a[i];.   
28400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
28410 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
28420 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63  n 0;.}../* The c
28430 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6d 61  ode generator ma
28440 69 6e 74 61 69 6e 73 20 61 20 73 74 61 63 6b 20  intains a stack 
28450 6f 66 20 61 63 74 69 76 65 20 57 49 54 48 20 63  of active WITH c
28460 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74 68 20 74  lauses.** with t
28470 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 57 49  he inner-most WI
28480 54 48 20 63 6c 61 75 73 65 20 62 65 69 6e 67 20  TH clause being 
28490 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  at the top of th
284a0 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  e stack..**.** T
284b0 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75 73 68  his routine push
284c0 65 73 20 74 68 65 20 57 49 54 48 20 63 6c 61 75  es the WITH clau
284d0 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  se passed as the
284e0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
284f0 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74 6f 70  .** onto the top
28500 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20 49   of the stack. I
28510 66 20 61 72 67 75 6d 65 6e 74 20 62 46 72 65 65  f argument bFree
28520 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
28530 68 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75  his.** WITH clau
28540 73 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  se will never be
28550 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65   popped from the
28560 20 73 74 61 63 6b 2e 20 49 6e 20 74 68 69 73 20   stack. In this 
28570 63 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f 75 6c  case it.** shoul
28580 64 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67  d be freed along
28590 20 77 69 74 68 20 74 68 65 20 50 61 72 73 65 20   with the Parse 
285a0 6f 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68 65 72  object. In other
285b0 20 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a 2a 20   cases, when.** 
285c0 62 46 72 65 65 3d 3d 30 2c 20 74 68 65 20 57 69  bFree==0, the Wi
285d0 74 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62  th object will b
285e0 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69  e freed along wi
285f0 74 68 20 74 68 65 20 53 45 4c 45 43 54 20 0a 2a  th the SELECT .*
28600 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74 68  * statement with
28610 20 77 68 69 63 68 20 69 74 20 69 73 20 61 73 73   which it is ass
28620 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64  ociated..*/.void
28630 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68   sqlite3WithPush
28640 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
28650 57 69 74 68 20 2a 70 57 69 74 68 2c 20 75 38 20  With *pWith, u8 
28660 62 46 72 65 65 29 7b 0a 20 20 61 73 73 65 72 74  bFree){.  assert
28670 28 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20 28 70  ( bFree==0 || (p
28680 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 30 20  Parse->pWith==0 
28690 26 26 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68  && pParse->pWith
286a0 54 6f 46 72 65 65 3d 3d 30 29 20 29 3b 0a 20 20  ToFree==0) );.  
286b0 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20  if( pWith ){.   
286c0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
286d0 3e 70 57 69 74 68 21 3d 70 57 69 74 68 20 29 3b  >pWith!=pWith );
286e0 0a 20 20 20 20 70 57 69 74 68 2d 3e 70 4f 75 74  .    pWith->pOut
286f0 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69  er = pParse->pWi
28700 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  th;.    pParse->
28710 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20  pWith = pWith;. 
28720 20 20 20 69 66 28 20 62 46 72 65 65 20 29 20 70     if( bFree ) p
28730 50 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46 72  Parse->pWithToFr
28740 65 65 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d 0a  ee = pWith;.  }.
28750 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
28760 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66  nction checks if
28770 20 61 72 67 75 6d 65 6e 74 20 70 46 72 6f 6d 20   argument pFrom 
28780 72 65 66 65 72 73 20 74 6f 20 61 20 43 54 45 20  refers to a CTE 
28790 64 65 63 6c 61 72 65 64 20 62 79 20 0a 2a 2a 20  declared by .** 
287a0 61 20 57 49 54 48 20 63 6c 61 75 73 65 20 6f 6e  a WITH clause on
287b0 20 74 68 65 20 73 74 61 63 6b 20 63 75 72 72 65   the stack curre
287c0 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65 64 20  ntly maintained 
287d0 62 79 20 74 68 65 20 70 61 72 73 65 72 2e 20 41  by the parser. A
287e0 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72 65 6e  nd,.** if curren
287f0 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61  tly processing a
28800 20 43 54 45 20 65 78 70 72 65 73 73 69 6f 6e 2c   CTE expression,
28810 20 69 66 20 69 74 20 69 73 20 61 20 72 65 63 75   if it is a recu
28820 72 73 69 76 65 0a 2a 2a 20 72 65 66 65 72 65 6e  rsive.** referen
28830 63 65 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ce to the curren
28840 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  t CTE..**.** If 
28850 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e 74 6f  pFrom falls into
28860 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 74   either of the t
28870 77 6f 20 63 61 74 65 67 6f 72 69 65 73 20 61 62  wo categories ab
28880 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ove, pFrom->pTab
28890 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69  .** and other fi
288a0 65 6c 64 73 20 61 72 65 20 70 6f 70 75 6c 61 74  elds are populat
288b0 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20  ed accordingly. 
288c0 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  The caller shoul
288d0 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46 72 6f  d check.** (pFro
288e0 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f 20 64  m->pTab!=0) to d
288f0 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
28900 20 6f 72 20 6e 6f 74 20 61 20 73 75 63 63 65 73   or not a succes
28910 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20 77 61  sful match.** wa
28920 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57  s found..**.** W
28930 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
28940 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c 20  match is found, 
28950 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
28960 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f  urned if no erro
28970 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49 66 20  r.** occurs. If 
28980 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  an error does oc
28990 63 75 72 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65  cur, an error me
289a0 73 73 61 67 65 20 69 73 20 73 74 6f 72 65 64 20  ssage is stored 
289b0 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73 65 72  in the.** parser
289c0 20 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f 72 20   and some error 
289d0 63 6f 64 65 20 6f 74 68 65 72 20 74 68 61 6e 20  code other than 
289e0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
289f0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
28a00 74 20 77 69 74 68 45 78 70 61 6e 64 28 0a 20 20  t withExpand(.  
28a10 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
28a20 20 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69   .  struct SrcLi
28a30 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 0a 29  st_item *pFrom.)
28a40 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
28a50 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
28a60 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  rse;.  sqlite3 *
28a70 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
28a80 0a 20 20 73 74 72 75 63 74 20 43 74 65 20 2a 70  .  struct Cte *p
28a90 43 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cte;            
28aa0 20 20 20 2f 2a 20 4d 61 74 63 68 65 64 20 43 54     /* Matched CT
28ab0 45 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f  E (or NULL if no
28ac0 20 6d 61 74 63 68 29 20 2a 2f 0a 20 20 57 69 74   match) */.  Wit
28ad0 68 20 2a 70 57 69 74 68 3b 20 20 20 20 20 20 20  h *pWith;       
28ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28af0 57 49 54 48 20 63 6c 61 75 73 65 20 74 68 61 74  WITH clause that
28b00 20 70 43 74 65 20 62 65 6c 6f 6e 67 73 20 74 6f   pCte belongs to
28b10 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
28b20 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
28b30 0a 0a 20 20 70 43 74 65 20 3d 20 73 65 61 72 63  ..  pCte = searc
28b40 68 57 69 74 68 28 70 50 61 72 73 65 2d 3e 70 57  hWith(pParse->pW
28b50 69 74 68 2c 20 70 46 72 6f 6d 2c 20 26 70 57 69  ith, pFrom, &pWi
28b60 74 68 29 3b 0a 20 20 69 66 28 20 70 43 74 65 20  th);.  if( pCte 
28b70 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
28b80 61 62 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  ab;.    ExprList
28b90 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53 65   *pEList;.    Se
28ba0 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20  lect *pSel;.    
28bb0 53 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b 20 20  Select *pLeft;  
28bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28bd0 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43   Left-most SELEC
28be0 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
28bf0 20 20 20 69 6e 74 20 62 4d 61 79 52 65 63 75 72     int bMayRecur
28c00 73 69 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  sive;           
28c10 20 2f 2a 20 54 72 75 65 20 69 66 20 63 6f 6d 70   /* True if comp
28c20 6f 75 6e 64 20 6a 6f 69 6e 65 64 20 62 79 20 55  ound joined by U
28c30 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a 20 20  NION [ALL] */.  
28c40 20 20 57 69 74 68 20 2a 70 53 61 76 65 64 57 69    With *pSavedWi
28c50 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
28c60 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65  /* Initial value
28c70 20 6f 66 20 70 50 61 72 73 65 2d 3e 70 57 69 74   of pParse->pWit
28c80 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20  h */..    /* If 
28c90 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69 73  pCte->zCteErr is
28ca0 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74 68 69   non-NULL at thi
28cb0 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68  s point, then th
28cc0 69 73 20 69 73 20 61 6e 20 69 6c 6c 65 67 61 6c  is is an illegal
28cd0 0a 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76  .    ** recursiv
28ce0 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 43  e reference to C
28cf0 54 45 20 70 43 74 65 2e 20 4c 65 61 76 65 20 61  TE pCte. Leave a
28d00 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73  n error in pPars
28d10 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20  e and return.   
28d20 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20 70 43   ** early. If pC
28d30 74 65 2d 3e 7a 43 74 65 45 72 72 20 69 73 20 4e  te->zCteErr is N
28d40 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 69  ULL, then this i
28d50 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76  s not a recursiv
28d60 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 20 20 20  e reference..   
28d70 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
28d80 2c 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a 20  , proceed.  */. 
28d90 20 20 20 69 66 28 20 70 43 74 65 2d 3e 7a 43 74     if( pCte->zCt
28da0 65 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71  eErr ){.      sq
28db0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
28dc0 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a 43 74 65  arse, pCte->zCte
28dd0 45 72 72 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  Err, pCte->zName
28de0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
28df0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
28e00 20 20 7d 0a 20 20 20 20 69 66 28 20 63 61 6e 6e    }.    if( cann
28e10 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50 61  otBeFunction(pPa
28e20 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 20 72 65  rse, pFrom) ) re
28e30 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
28e40 52 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  R;..    assert( 
28e50 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
28e60 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61  ;.    pFrom->pTa
28e70 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
28e80 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
28e90 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
28ea0 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d  );.    if( pTab=
28eb0 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
28ec0 41 62 6f 72 74 3b 0a 20 20 20 20 70 54 61 62 2d  Abort;.    pTab-
28ed0 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20 20  >nTabRef = 1;.  
28ee0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
28ef0 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
28f00 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29  db, pCte->zName)
28f10 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65  ;.    pTab->iPKe
28f20 79 20 3d 20 2d 31 3b 0a 20 20 20 20 70 54 61 62  y = -1;.    pTab
28f30 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32  ->nRowLogEst = 2
28f40 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d  00; assert( 200=
28f50 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
28f60 30 34 38 35 37 36 29 20 29 3b 0a 20 20 20 20 70  048576) );.    p
28f70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
28f80 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 20 7c 20   TF_Ephemeral | 
28f90 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69  TF_NoVisibleRowi
28fa0 64 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53  d;.    pFrom->pS
28fb0 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
28fc0 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 43 74  electDup(db, pCt
28fd0 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  e->pSelect, 0);.
28fe0 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
28ff0 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
29000 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
29010 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28  KPT;.    assert(
29020 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20   pFrom->pSelect 
29030 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  );..    /* Check
29040 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65   if this is a re
29050 63 75 72 73 69 76 65 20 43 54 45 2e 20 2a 2f 0a  cursive CTE. */.
29060 20 20 20 20 70 53 65 6c 20 3d 20 70 46 72 6f 6d      pSel = pFrom
29070 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 62  ->pSelect;.    b
29080 4d 61 79 52 65 63 75 72 73 69 76 65 20 3d 20 28  MayRecursive = (
29090 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c   pSel->op==TK_AL
290a0 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54  L || pSel->op==T
290b0 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 69  K_UNION );.    i
290c0 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65  f( bMayRecursive
290d0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
290e0 0a 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a  .      SrcList *
290f0 70 53 72 63 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSrc = pFrom->pS
29100 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20  elect->pSrc;.   
29110 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53     for(i=0; i<pS
29120 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  rc->nSrc; i++){.
29130 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53          struct S
29140 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
29150 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 5d  em = &pSrc->a[i]
29160 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
29170 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d  tem->zDatabase==
29180 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  0 .         && p
29190 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a  Item->zName!=0 .
291a0 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73           && 0==s
291b0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49  qlite3StrICmp(pI
291c0 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74 65  tem->zName, pCte
291d0 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20 20  ->zName).       
291e0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
291f0 70 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pItem->pTab = pT
29200 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49  ab;.          pI
29210 74 65 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73  tem->fg.isRecurs
29220 69 76 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ive = 1;.       
29230 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66     pTab->nTabRef
29240 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  ++;.          pS
29250 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  el->selFlags |= 
29260 53 46 5f 52 65 63 75 72 73 69 76 65 3b 0a 20 20  SF_Recursive;.  
29270 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
29280 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e      }..    /* On
29290 6c 79 20 6f 6e 65 20 72 65 63 75 72 73 69 76 65  ly one recursive
292a0 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 70 65   reference is pe
292b0 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a 20 20 20  rmitted. */ .   
292c0 20 69 66 28 20 70 54 61 62 2d 3e 6e 54 61 62 52   if( pTab->nTabR
292d0 65 66 3e 32 20 29 7b 0a 20 20 20 20 20 20 73 71  ef>2 ){.      sq
292e0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 0a 20  lite3ErrorMsg(. 
292f0 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c           pParse,
29300 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 66 65 72   "multiple refer
29310 65 6e 63 65 73 20 74 6f 20 72 65 63 75 72 73 69  ences to recursi
29320 76 65 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 70  ve table: %s", p
29330 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20  Cte->zName.     
29340 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
29350 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
29360 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
29370 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3d 3d   pTab->nTabRef==
29380 31 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  1 || .          
29390 20 20 28 28 70 53 65 6c 2d 3e 73 65 6c 46 6c 61    ((pSel->selFla
293a0 67 73 26 53 46 5f 52 65 63 75 72 73 69 76 65 29  gs&SF_Recursive)
293b0 20 26 26 20 70 54 61 62 2d 3e 6e 54 61 62 52 65   && pTab->nTabRe
293c0 66 3d 3d 32 20 29 29 3b 0a 0a 20 20 20 20 70 43  f==2 ));..    pC
293d0 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 63  te->zCteErr = "c
293e0 69 72 63 75 6c 61 72 20 72 65 66 65 72 65 6e 63  ircular referenc
293f0 65 3a 20 25 73 22 3b 0a 20 20 20 20 70 53 61 76  e: %s";.    pSav
29400 65 64 57 69 74 68 20 3d 20 70 50 61 72 73 65 2d  edWith = pParse-
29410 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72  >pWith;.    pPar
29420 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
29430 68 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52  h;.    if( bMayR
29440 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
29450 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
29460 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b   = pSel->pPrior;
29470 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
29480 50 72 69 6f 72 2d 3e 70 57 69 74 68 3d 3d 30 20  Prior->pWith==0 
29490 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  );.      pPrior-
294a0 3e 70 57 69 74 68 20 3d 20 70 53 65 6c 2d 3e 70  >pWith = pSel->p
294b0 57 69 74 68 3b 0a 20 20 20 20 20 20 73 71 6c 69  With;.      sqli
294c0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
294d0 61 6c 6b 65 72 2c 20 70 50 72 69 6f 72 29 3b 0a  alker, pPrior);.
294e0 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 57        pPrior->pW
294f0 69 74 68 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ith = 0;.    }el
29500 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
29510 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
29520 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  ker, pSel);.    
29530 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57  }.    pParse->pW
29540 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 0a 20 20  ith = pWith;..  
29550 20 20 66 6f 72 28 70 4c 65 66 74 3d 70 53 65 6c    for(pLeft=pSel
29560 3b 20 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 3b  ; pLeft->pPrior;
29570 20 70 4c 65 66 74 3d 70 4c 65 66 74 2d 3e 70 50   pLeft=pLeft->pP
29580 72 69 6f 72 29 3b 0a 20 20 20 20 70 45 4c 69 73  rior);.    pELis
29590 74 20 3d 20 70 4c 65 66 74 2d 3e 70 45 4c 69 73  t = pLeft->pELis
295a0 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d  t;.    if( pCte-
295b0 3e 70 43 6f 6c 73 20 29 7b 0a 20 20 20 20 20 20  >pCols ){.      
295c0 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  if( pEList && pE
295d0 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 43 74  List->nExpr!=pCt
295e0 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 20  e->pCols->nExpr 
295f0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
29600 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
29610 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73  e, "table %s has
29620 20 25 64 20 76 61 6c 75 65 73 20 66 6f 72 20 25   %d values for %
29630 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20 20  d columns",.    
29640 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 4e          pCte->zN
29650 61 6d 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ame, pEList->nEx
29660 70 72 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73 2d  pr, pCte->pCols-
29670 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 20 20 29  >nExpr.        )
29680 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
29690 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65 64  ->pWith = pSaved
296a0 57 69 74 68 3b 0a 20 20 20 20 20 20 20 20 72 65  With;.        re
296b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
296c0 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
296d0 20 70 45 4c 69 73 74 20 3d 20 70 43 74 65 2d 3e   pEList = pCte->
296e0 70 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20 20  pCols;.    }..  
296f0 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73    sqlite3Columns
29700 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
29710 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 26 70 54  rse, pEList, &pT
29720 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d  ab->nCol, &pTab-
29730 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20  >aCol);.    if( 
29740 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b  bMayRecursive ){
29750 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 2d  .      if( pSel-
29760 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
29770 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
29780 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72      pCte->zCteEr
29790 72 20 3d 20 22 6d 75 6c 74 69 70 6c 65 20 72 65  r = "multiple re
297a0 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
297b0 65 73 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d  es: %s";.      }
297c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
297d0 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 72  te->zCteErr = "r
297e0 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
297f0 63 65 20 69 6e 20 61 20 73 75 62 71 75 65 72 79  ce in a subquery
29800 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20  : %s";.      }. 
29810 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
29820 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
29830 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pSel);.    }.   
29840 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d   pCte->zCteErr =
29850 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   0;.    pParse->
29860 70 57 69 74 68 20 3d 20 70 53 61 76 65 64 57 69  pWith = pSavedWi
29870 74 68 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  th;.  }..  retur
29880 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
29890 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
298a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f  QLITE_OMIT_CTE./
298b0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45  *.** If the SELE
298c0 43 54 20 70 61 73 73 65 64 20 61 73 20 74 68 65  CT passed as the
298d0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
298e0 20 68 61 73 20 61 6e 20 61 73 73 6f 63 69 61 74   has an associat
298f0 65 64 20 57 49 54 48 20 0a 2a 2a 20 63 6c 61 75  ed WITH .** clau
29900 73 65 2c 20 70 6f 70 20 69 74 20 66 72 6f 6d 20  se, pop it from 
29910 74 68 65 20 73 74 61 63 6b 20 73 74 6f 72 65 64  the stack stored
29920 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
29930 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a  Parse object..**
29940 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
29950 6e 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65  n is used as the
29960 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b   xSelectCallback
29970 32 28 29 20 63 61 6c 6c 62 61 63 6b 20 62 79 0a  2() callback by.
29980 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
29990 45 78 70 61 6e 64 28 29 20 77 68 65 6e 20 77 61  Expand() when wa
299a0 6c 6b 69 6e 67 20 61 20 53 45 4c 45 43 54 20 74  lking a SELECT t
299b0 72 65 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 74  ree to resolve t
299c0 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e  able.** names an
299d0 64 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61  d other FROM cla
299e0 75 73 65 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a  use elements. .*
299f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
29a00 6c 65 63 74 50 6f 70 57 69 74 68 28 57 61 6c 6b  lectPopWith(Walk
29a10 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
29a20 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  ect *p){.  Parse
29a30 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b   *pParse = pWalk
29a40 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 66  er->pParse;.  if
29a50 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f 54  ( OK_IF_ALWAYS_T
29a60 52 55 45 28 70 50 61 72 73 65 2d 3e 70 57 69 74  RUE(pParse->pWit
29a70 68 29 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d  h) && p->pPrior=
29a80 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a  =0 ){.    With *
29a90 70 57 69 74 68 20 3d 20 66 69 6e 64 52 69 67 68  pWith = findRigh
29aa0 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68 3b  tmost(p)->pWith;
29ab0 0a 20 20 20 20 69 66 28 20 70 57 69 74 68 21 3d  .    if( pWith!=
29ac0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
29ad0 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68  t( pParse->pWith
29ae0 3d 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20 20  ==pWith );.     
29af0 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
29b00 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 3b 0a   pWith->pOuter;.
29b10 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73      }.  }.}.#els
29b20 65 0a 23 64 65 66 69 6e 65 20 73 65 6c 65 63 74  e.#define select
29b30 50 6f 70 57 69 74 68 20 30 0a 23 65 6e 64 69 66  PopWith 0.#endif
29b40 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 53 72 63 4c  ../*.** The SrcL
29b50 69 73 74 5f 69 74 65 6d 20 73 74 72 75 63 74 75  ist_item structu
29b60 72 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  re passed as the
29b70 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
29b80 20 72 65 70 72 65 73 65 6e 74 73 20 61 0a 2a 2a   represents a.**
29b90 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68   sub-query in th
29ba0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
29bb0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
29bc0 65 6e 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ent. This functi
29bd0 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20  on.** allocates 
29be0 61 6e 64 20 70 6f 70 75 6c 61 74 65 73 20 74 68  and populates th
29bf0 65 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 2e 70  e SrcList_item.p
29c00 54 61 62 20 6f 62 6a 65 63 74 2e 20 49 66 20 73  Tab object. If s
29c10 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 53 51  uccessful,.** SQ
29c20 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
29c30 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
29c40 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  if an OOM error 
29c50 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a  is encountered,.
29c60 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  ** SQLITE_NOMEM.
29c70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
29c80 78 70 61 6e 64 53 75 62 71 75 65 72 79 28 50 61  xpandSubquery(Pa
29c90 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72  rse *pParse, str
29ca0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
29cb0 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 53 65 6c 65   *pFrom){.  Sele
29cc0 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d  ct *pSel = pFrom
29cd0 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 54 61 62  ->pSelect;.  Tab
29ce0 6c 65 20 2a 70 54 61 62 3b 0a 0a 20 20 61 73 73  le *pTab;..  ass
29cf0 65 72 74 28 20 70 53 65 6c 20 29 3b 0a 20 20 70  ert( pSel );.  p
29d00 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
29d10 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  b = sqlite3DbMal
29d20 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
29d30 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
29d40 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  ));.  if( pTab==
29d50 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
29d60 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 54 61 62 2d  E_NOMEM;.  pTab-
29d70 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20 20  >nTabRef = 1;.  
29d80 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61  if( pFrom->zAlia
29d90 73 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 7a  s ){.    pTab->z
29da0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
29db0 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  StrDup(pParse->d
29dc0 62 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73  b, pFrom->zAlias
29dd0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
29de0 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  pTab->zName = sq
29df0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61  lite3MPrintf(pPa
29e00 72 73 65 2d 3e 64 62 2c 20 22 73 75 62 71 75 65  rse->db, "subque
29e10 72 79 5f 25 75 22 2c 20 70 53 65 6c 2d 3e 73 65  ry_%u", pSel->se
29e20 6c 49 64 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  lId);.  }.  whil
29e30 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20  e( pSel->pPrior 
29e40 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e  ){ pSel = pSel->
29e50 70 50 72 69 6f 72 3b 20 7d 0a 20 20 73 71 6c 69  pPrior; }.  sqli
29e60 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
29e70 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
29e80 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 26 70 54 61  Sel->pEList,&pTa
29e90 62 2d 3e 6e 43 6f 6c 2c 26 70 54 61 62 2d 3e 61  b->nCol,&pTab->a
29ea0 43 6f 6c 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50  Col);.  pTab->iP
29eb0 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62  Key = -1;.  pTab
29ec0 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32  ->nRowLogEst = 2
29ed0 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d  00; assert( 200=
29ee0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
29ef0 30 34 38 35 37 36 29 20 29 3b 0a 20 20 70 54 61  048576) );.  pTa
29f00 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  b->tabFlags |= T
29f10 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 0a 20 20  F_Ephemeral;..  
29f20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
29f30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
29f40 72 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c  routine is a Wal
29f50 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ker callback for
29f60 20 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53   "expanding" a S
29f70 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
29f80 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20  .** "Expanding" 
29f90 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20  means to do the 
29fa0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
29fb0 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75      (1)  Make su
29fc0 72 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  re VDBE cursor n
29fd0 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e  umbers have been
29fe0 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65   assigned to eve
29ff0 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c  ry.**         el
2a000 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f  ement of the FRO
2a010 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  M clause..**.** 
2a020 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20     (2)  Fill in 
2a030 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  the pTabList->a[
2a040 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e  ].pTab fields in
2a050 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61   the SrcList tha
2a060 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65  t .**         de
2a070 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73  fines FROM claus
2a080 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20 61  e.  When views a
2a090 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f  ppear in the FRO
2a0a0 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20  M clause,.**    
2a0b0 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69       fill pTabLi
2a0c0 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20  st->a[].pSelect 
2a0d0 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
2a0e0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
2a0f0 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74  ent.**         t
2a100 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
2a110 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79  he view.  A copy
2a120 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20   is made of the 
2a130 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a  view's SELECT.**
2a140 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65           stateme
2a150 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61  nt so that we ca
2a160 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20  n freely modify 
2a170 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73  or delete that s
2a180 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
2a190 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72      without worr
2a1a0 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69  ying about messi
2a1b0 6e 67 20 75 70 20 74 68 65 20 70 65 72 73 69 73  ng up the persis
2a1c0 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74  tent representat
2a1d0 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f  ion.**         o
2a1e0 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a  f the view..**.*
2a1f0 2a 20 20 20 20 28 33 29 20 20 41 64 64 20 74 65  *    (3)  Add te
2a200 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45  rms to the WHERE
2a210 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d   clause to accom
2a220 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55 52  modate the NATUR
2a230 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20  AL keyword.**   
2a240 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61        on joins a
2a250 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53  nd the ON and US
2a260 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f  ING clause of jo
2a270 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34  ins..**.**    (4
2a280 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74  )  Scan the list
2a290 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
2a2a0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 28 70  he result set (p
2a2b0 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a  EList) looking.*
2a2c0 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e  *         for in
2a2d0 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22  stances of the "
2a2e0 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74  *" operator or t
2a2f0 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61  he TABLE.* opera
2a300 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  tor..**         
2a310 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64  If found, expand
2a320 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20   each "*" to be 
2a330 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  every column in 
2a340 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20  every table.**  
2a350 20 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45         and TABLE
2a360 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20 63  .* to be every c
2a370 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a  olumn in TABLE..
2a380 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  **.*/.static int
2a390 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28   selectExpander(
2a3a0 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
2a3b0 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50   Select *p){.  P
2a3c0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
2a3d0 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
2a3e0 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20    int i, j, k;. 
2a3f0 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
2a400 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  st;.  ExprList *
2a410 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74  pEList;.  struct
2a420 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2a430 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20  From;.  sqlite3 
2a440 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
2a450 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c 20 2a 70  ;.  Expr *pE, *p
2a460 52 69 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a 20  Right, *pExpr;. 
2a470 20 75 31 36 20 73 65 6c 46 6c 61 67 73 20 3d 20   u16 selFlags = 
2a480 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 20 20 75  p->selFlags;.  u
2a490 33 32 20 65 6c 69 73 74 46 6c 61 67 73 20 3d 20  32 elistFlags = 
2a4a0 30 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67  0;..  p->selFlag
2a4b0 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64  s |= SF_Expanded
2a4c0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
2a4d0 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20 20  ocFailed  ){.   
2a4e0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
2a4f0 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
2a500 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20   p->pSrc!=0 );. 
2a510 20 69 66 28 20 28 73 65 6c 46 6c 61 67 73 20 26   if( (selFlags &
2a520 20 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30   SF_Expanded)!=0
2a530 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
2a540 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20  RC_Prune;.  }.  
2a550 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
2a560 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70  rc;.  pEList = p
2a570 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c 69  ->pEList;.  sqli
2a580 74 65 33 57 69 74 68 50 75 73 68 28 70 50 61 72  te3WithPush(pPar
2a590 73 65 2c 20 70 2d 3e 70 57 69 74 68 2c 20 30 29  se, p->pWith, 0)
2a5a0 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
2a5b0 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
2a5c0 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67   have been assig
2a5d0 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69  ned to all entri
2a5e0 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46  es in.  ** the F
2a5f0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
2a600 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
2a610 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  nt..  */.  sqlit
2a620 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
2a630 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70  ursors(pParse, p
2a640 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20  TabList);..  /* 
2a650 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61  Look up every ta
2a660 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65  ble named in the
2a670 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
2a680 74 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a  the select.  If.
2a690 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66    ** an entry of
2a6a0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2a6b0 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20 69   is a subquery i
2a6c0 6e 73 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c  nstead of a tabl
2a6d0 65 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20  e or view,.  ** 
2a6e0 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 74 72  then create a tr
2a6f0 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74  ansient table st
2a700 72 75 63 74 75 72 65 20 74 6f 20 64 65 73 63 72  ructure to descr
2a710 69 62 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ibe the subquery
2a720 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
2a730 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
2a740 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
2a750 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
2a760 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  m++){.    Table 
2a770 2a 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72  *pTab;.    asser
2a780 74 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52  t( pFrom->fg.isR
2a790 65 63 75 72 73 69 76 65 3d 3d 30 20 7c 7c 20 70  ecursive==0 || p
2a7a0 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 3b  From->pTab!=0 );
2a7b0 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
2a7c0 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 29  fg.isRecursive )
2a7d0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
2a7e0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
2a7f0 61 62 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66  ab==0 );.#ifndef
2a800 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
2a810 0a 20 20 20 20 69 66 28 20 77 69 74 68 45 78 70  .    if( withExp
2a820 61 6e 64 28 70 57 61 6c 6b 65 72 2c 20 70 46 72  and(pWalker, pFr
2a830 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  om) ) return WRC
2a840 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69 66 28 20  _Abort;.    if( 
2a850 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29 20 7b 7d  pFrom->pTab ) {}
2a860 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20   else.#endif.   
2a870 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d   if( pFrom->zNam
2a880 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  e==0 ){.#ifndef 
2a890 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
2a8a0 55 45 52 59 0a 20 20 20 20 20 20 53 65 6c 65 63  UERY.      Selec
2a8b0 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d  t *pSel = pFrom-
2a8c0 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
2a8d0 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69  /* A sub-query i
2a8e0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2a8f0 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f  e of a SELECT */
2a900 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2a910 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Sel!=0 );.      
2a920 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
2a930 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab==0 );.      
2a940 69 66 28 20 73 71 6c 69 74 65 33 57 61 6c 6b 53  if( sqlite3WalkS
2a950 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
2a960 53 65 6c 29 20 29 20 72 65 74 75 72 6e 20 57 52  Sel) ) return WR
2a970 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 69  C_Abort;.      i
2a980 66 28 20 73 71 6c 69 74 65 33 45 78 70 61 6e 64  f( sqlite3Expand
2a990 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c  Subquery(pParse,
2a9a0 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e   pFrom) ) return
2a9b0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 23 65 6e 64   WRC_Abort;.#end
2a9c0 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
2a9d0 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61      /* An ordina
2a9e0 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  ry table or view
2a9f0 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f   name in the FRO
2aa00 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
2aa10 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
2aa20 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20  >pTab==0 );.    
2aa30 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
2aa40 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
2aa50 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50  cateTableItem(pP
2aa60 61 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b  arse, 0, pFrom);
2aa70 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
2aa80 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
2aa90 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 69 66 28  Abort;.      if(
2aaa0 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e 3d   pTab->nTabRef>=
2aab0 30 78 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20  0xffff ){.      
2aac0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2aad0 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
2aae0 61 6e 79 20 72 65 66 65 72 65 6e 63 65 73 20 74  any references t
2aaf0 6f 20 5c 22 25 73 5c 22 3a 20 6d 61 78 20 36 35  o \"%s\": max 65
2ab00 35 33 35 22 2c 0a 20 20 20 20 20 20 20 20 20 20  535",.          
2ab10 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
2ab20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54         pFrom->pT
2ab30 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ab = 0;.        
2ab40 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
2ab50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2ab60 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b  pTab->nTabRef++;
2ab70 0a 20 20 20 20 20 20 69 66 28 20 21 49 73 56 69  .      if( !IsVi
2ab80 72 74 75 61 6c 28 70 54 61 62 29 20 26 26 20 63  rtual(pTab) && c
2ab90 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28  annotBeFunction(
2aba0 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29  pParse, pFrom) )
2abb0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2abc0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
2abd0 20 20 7d 0a 23 69 66 20 21 64 65 66 69 6e 65 64    }.#if !defined
2abe0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
2abf0 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28  W) || !defined (
2ac00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2ac10 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20  UALTABLE).      
2ac20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
2ac30 61 62 29 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65  ab) || pTab->pSe
2ac40 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
2ac50 69 31 36 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  i16 nCol;.      
2ac60 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 69 65    if( sqlite3Vie
2ac70 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
2ac80 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 20  pParse, pTab) ) 
2ac90 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
2aca0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2acb0 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  ( pFrom->pSelect
2acc0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
2acd0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  From->pSelect = 
2ace0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
2acf0 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65  (db, pTab->pSele
2ad00 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ct, 0);.        
2ad10 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f  nCol = pTab->nCo
2ad20 6c 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  l;.        pTab-
2ad30 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20  >nCol = -1;.    
2ad40 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
2ad50 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
2ad60 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  From->pSelect);.
2ad70 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43          pTab->nC
2ad80 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20  ol = nCol;.     
2ad90 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
2ada0 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  .    /* Locate t
2adb0 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 62  he index named b
2adc0 79 20 74 68 65 20 49 4e 44 45 58 45 44 20 42 59  y the INDEXED BY
2add0 20 63 6c 61 75 73 65 2c 20 69 66 20 61 6e 79 2e   clause, if any.
2ade0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
2adf0 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b  te3IndexedByLook
2ae00 75 70 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d  up(pParse, pFrom
2ae10 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
2ae20 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
2ae30 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f   }.  }..  /* Pro
2ae40 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79  cess NATURAL key
2ae50 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e  words, and ON an
2ae60 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
2ae70 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20  of joins..  */. 
2ae80 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2ae90 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65 50  ailed || sqliteP
2aea0 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73  rocessJoin(pPars
2aeb0 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74  e, p) ){.    ret
2aec0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
2aed0 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65   }..  /* For eve
2aee0 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75  ry "*" that occu
2aef0 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  rs in the column
2af00 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68   list, insert th
2af10 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20  e names of.  ** 
2af20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61  all columns in a
2af30 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20  ll tables.  And 
2af40 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e  for every TABLE.
2af50 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d  * insert the nam
2af60 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63  es.  ** of all c
2af70 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e  olumns in TABLE.
2af80 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 73    The parser ins
2af90 65 72 74 65 64 20 61 20 73 70 65 63 69 61 6c 20  erted a special 
2afa0 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20  expression.  ** 
2afb0 77 69 74 68 20 74 68 65 20 54 4b 5f 41 53 54 45  with the TK_ASTE
2afc0 52 49 53 4b 20 6f 70 65 72 61 74 6f 72 20 66 6f  RISK operator fo
2afd0 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74 20  r each "*" that 
2afe0 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  it found in the 
2aff0 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6c 69 73 74  column.  ** list
2b000 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
2b010 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74   code just has t
2b020 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f  o locate the TK_
2b030 41 53 54 45 52 49 53 4b 0a 20 20 2a 2a 20 65 78  ASTERISK.  ** ex
2b040 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78  pressions and ex
2b050 70 61 6e 64 20 65 61 63 68 20 6f 6e 65 20 74 6f  pand each one to
2b060 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c   the list of all
2b070 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a 20 20 2a 2a   columns in.  **
2b080 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a   all tables..  *
2b090 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74  *.  ** The first
2b0a0 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b   loop just check
2b0b0 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  s to see if ther
2b0c0 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70  e are any "*" op
2b0d0 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61  erators.  ** tha
2b0e0 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67  t need expanding
2b0f0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30  ..  */.  for(k=0
2b100 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; k<pEList->nExp
2b110 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 70 45 20  r; k++){.    pE 
2b120 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70  = pEList->a[k].p
2b130 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45  Expr;.    if( pE
2b140 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49 53  ->op==TK_ASTERIS
2b150 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61  K ) break;.    a
2b160 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54  ssert( pE->op!=T
2b170 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69  K_DOT || pE->pRi
2b180 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  ght!=0 );.    as
2b190 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b  sert( pE->op!=TK
2b1a0 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c 65  _DOT || (pE->pLe
2b1b0 66 74 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c 65  ft!=0 && pE->pLe
2b1c0 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20 29  ft->op==TK_ID) )
2b1d0 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70  ;.    if( pE->op
2b1e0 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e  ==TK_DOT && pE->
2b1f0 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41  pRight->op==TK_A
2b200 53 54 45 52 49 53 4b 20 29 20 62 72 65 61 6b 3b  STERISK ) break;
2b210 0a 20 20 20 20 65 6c 69 73 74 46 6c 61 67 73 20  .    elistFlags 
2b220 7c 3d 20 70 45 2d 3e 66 6c 61 67 73 3b 0a 20 20  |= pE->flags;.  
2b230 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74  }.  if( k<pEList
2b240 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f  ->nExpr ){.    /
2b250 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67  *.    ** If we g
2b260 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73  et here it means
2b270 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
2b280 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
2b290 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20  more "*".    ** 
2b2a0 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e  operators that n
2b2b0 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64  eed to be expand
2b2c0 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67  ed.  Loop throug
2b2d0 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
2b2e0 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  n.    ** in the 
2b2f0 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65  result set and e
2b300 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62  xpand them one b
2b310 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  y one..    */.  
2b320 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
2b330 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69  t_item *a = pELi
2b340 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c  st->a;.    ExprL
2b350 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  ist *pNew = 0;. 
2b360 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70     int flags = p
2b370 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
2b380 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61  ;.    int longNa
2b390 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53  mes = (flags & S
2b3a0 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
2b3b0 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  es)!=0.         
2b3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
2b3d0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
2b3e0 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d  ShortColNames)==
2b3f0 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b  0;..    for(k=0;
2b400 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
2b410 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 70 45  ; k++){.      pE
2b420 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20   = a[k].pExpr;. 
2b430 20 20 20 20 20 65 6c 69 73 74 46 6c 61 67 73 20       elistFlags 
2b440 7c 3d 20 70 45 2d 3e 66 6c 61 67 73 3b 0a 20 20  |= pE->flags;.  
2b450 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 2d      pRight = pE-
2b460 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61  >pRight;.      a
2b470 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54  ssert( pE->op!=T
2b480 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 21  K_DOT || pRight!
2b490 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
2b4a0 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52  pE->op!=TK_ASTER
2b4b0 49 53 4b 0a 20 20 20 20 20 20 20 26 26 20 28 70  ISK.       && (p
2b4c0 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
2b4d0 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f   pRight->op!=TK_
2b4e0 41 53 54 45 52 49 53 4b 29 0a 20 20 20 20 20 20  ASTERISK).      
2b4f0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
2b500 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 65 78  is particular ex
2b510 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f  pression does no
2b520 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
2b530 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  anded..        *
2b540 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  /.        pNew =
2b550 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2b560 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
2b570 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29  New, a[k].pExpr)
2b580 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
2b590 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ew ){.          
2b5a0 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
2b5b0 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61  xpr-1].zName = a
2b5c0 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [k].zName;.     
2b5d0 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65       pNew->a[pNe
2b5e0 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61  w->nExpr-1].zSpa
2b5f0 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a  n = a[k].zSpan;.
2b600 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a            a[k].z
2b610 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
2b620 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d      a[k].zSpan =
2b630 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
2b640 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72        a[k].pExpr
2b650 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
2b660 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
2b670 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
2b680 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42   a "*" or a "TAB
2b690 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20  LE.*" and needs 
2b6a0 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  to be.        **
2b6b0 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20   expanded. */.  
2b6c0 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53        int tableS
2b6d0 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  een = 0;      /*
2b6e0 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54   Set to 1 when T
2b6f0 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a  ABLE matches */.
2b700 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
2b710 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Name = 0;       
2b720 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20  /* text of name 
2b730 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20  of TABLE */.    
2b740 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
2b750 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20  TK_DOT ){.      
2b760 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
2b770 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20  pLeft!=0 );.    
2b780 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
2b790 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2b7a0 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74  E->pLeft, EP_Int
2b7b0 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
2b7c0 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d      zTName = pE-
2b7d0 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e  >pLeft->u.zToken
2b7e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2b7f0 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72      for(i=0, pFr
2b800 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
2b810 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
2b820 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
2b830 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65  .          Table
2b840 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
2b850 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
2b860 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70  Select *pSub = p
2b870 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
2b880 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
2b890 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d  TabName = pFrom-
2b8a0 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  >zAlias;.       
2b8b0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2b8c0 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a  SchemaName = 0;.
2b8d0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
2b8e0 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  b;.          if(
2b8f0 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a   zTabName==0 ){.
2b900 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62              zTab
2b910 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  Name = pTab->zNa
2b920 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  me;.          }.
2b930 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 62            if( db
2b940 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2b950 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2b960 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c    if( pSub==0 ||
2b970 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73   (pSub->selFlags
2b980 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d   & SF_NestedFrom
2b990 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2b9a0 20 20 20 20 70 53 75 62 20 3d 20 30 3b 0a 20 20      pSub = 0;.  
2b9b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
2b9c0 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53  Name && sqlite3S
2b9d0 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a  trICmp(zTName, z
2b9e0 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  TabName)!=0 ){. 
2b9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
2ba00 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
2ba10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2ba20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
2ba30 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
2ba40 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
2ba50 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63 68              zSch
2ba60 65 6d 61 4e 61 6d 65 20 3d 20 69 44 62 3e 3d 30  emaName = iDb>=0
2ba70 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   ? db->aDb[iDb].
2ba80 7a 44 62 53 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a  zDbSName : "*";.
2ba90 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2baa0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2bab0 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
2bac0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
2bad0 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61  har *zName = pTa
2bae0 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
2baf0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  ;.            ch
2bb00 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f  ar *zColname;  /
2bb10 2a 20 54 68 65 20 63 6f 6d 70 75 74 65 64 20 63  * The computed c
2bb20 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
2bb30 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
2bb40 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61  zToFree;   /* Ma
2bb50 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67 20 74 68  lloced string th
2bb60 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66  at needs to be f
2bb70 72 65 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  reed */.        
2bb80 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61      Token sColna
2bb90 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64  me;  /* Computed
2bba0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20   column name as 
2bbb0 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20  a token */..    
2bbc0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2bbd0 7a 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 20  zName );.       
2bbe0 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
2bbf0 26 26 20 70 53 75 62 0a 20 20 20 20 20 20 20 20  && pSub.        
2bc00 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 4d       && sqlite3M
2bc10 61 74 63 68 53 70 61 6e 4e 61 6d 65 28 70 53 75  atchSpanName(pSu
2bc20 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  b->pEList->a[j].
2bc30 7a 53 70 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65  zSpan, 0, zTName
2bc40 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  , 0)==0.        
2bc50 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2bc60 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2bc70 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20             }..  
2bc80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
2bc90 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b  a column is mark
2bca0 65 64 20 61 73 20 27 68 69 64 64 65 6e 27 2c 20  ed as 'hidden', 
2bcb0 6f 6d 69 74 20 69 74 20 66 72 6f 6d 20 74 68 65  omit it from the
2bcc0 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20 20   expanded.      
2bcd0 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d        ** result-
2bce0 73 65 74 20 6c 69 73 74 20 75 6e 6c 65 73 73 20  set list unless 
2bcf0 74 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 74  the SELECT has t
2bd00 68 65 20 53 46 5f 49 6e 63 6c 75 64 65 48 69 64  he SF_IncludeHid
2bd10 64 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  den.            
2bd20 2a 2a 20 62 69 74 20 73 65 74 2e 0a 20 20 20 20  ** bit set..    
2bd30 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2bd40 20 20 20 20 20 20 20 69 66 28 20 28 70 2d 3e 73         if( (p->s
2bd50 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 49 6e 63  elFlags & SF_Inc
2bd60 6c 75 64 65 48 69 64 64 65 6e 29 3d 3d 30 0a 20  ludeHidden)==0. 
2bd70 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 49              && I
2bd80 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70  sHiddenColumn(&p
2bd90 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 0a 20  Tab->aCol[j]) . 
2bda0 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
2bdb0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
2bdc0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2bdd0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2bde0 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 0a  tableSeen = 1;..
2bdf0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2be00 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30  i>0 && zTName==0
2be10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2be20 20 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 66 67    if( (pFrom->fg
2be30 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e  .jointype & JT_N
2be40 41 54 55 52 41 4c 29 21 3d 30 0a 20 20 20 20 20  ATURAL)!=0.     
2be50 20 20 20 20 20 20 20 20 20 20 20 26 26 20 74 61             && ta
2be60 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65  bleAndColumnInde
2be70 78 28 70 54 61 62 4c 69 73 74 2c 20 69 2c 20 7a  x(pTabList, i, z
2be80 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20 20 20 20  Name, 0, 0).    
2be90 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
2bea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2beb0 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69  In a NATURAL joi
2bec0 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e  n, omit the join
2bed0 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68   columns from th
2bee0 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e .             
2bef0 20 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20 74     ** table to t
2bf00 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20  he right of the 
2bf10 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  join */.        
2bf20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2bf30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2bf40 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
2bf50 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73  if( sqlite3IdLis
2bf60 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d 3e 70 55  tIndex(pFrom->pU
2bf70 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20  sing, zName)>=0 
2bf80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2bf90 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20     /* In a join 
2bfa0 77 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61  with a USING cla
2bfb0 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e  use, omit column
2bfc0 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20  s in the.       
2bfd0 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e           ** usin
2bfe0 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68  g clause from th
2bff0 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72  e table on the r
2c000 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ight. */.       
2c010 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
2c020 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
2c030 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
2c040 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69  .            pRi
2c050 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
2c060 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61  r(db, TK_ID, zNa
2c070 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
2c080 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d   zColname = zNam
2c090 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  e;.            z
2c0a0 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  ToFree = 0;.    
2c0b0 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67          if( long
2c0c0 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73  Names || pTabLis
2c0d0 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20  t->nSrc>1 ){.   
2c0e0 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
2c0f0 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20  *pLeft;.        
2c100 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71        pLeft = sq
2c110 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
2c120 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a  _ID, zTabName);.
2c130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
2c140 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
2c150 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f  pr(pParse, TK_DO
2c160 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  T, pLeft, pRight
2c170 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2c180 20 69 66 28 20 7a 53 63 68 65 6d 61 4e 61 6d 65   if( zSchemaName
2c190 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c1a0 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69      pLeft = sqli
2c1b0 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
2c1c0 44 2c 20 7a 53 63 68 65 6d 61 4e 61 6d 65 29 3b  D, zSchemaName);
2c1d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c1e0 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
2c1f0 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
2c200 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 45 78  _DOT, pLeft, pEx
2c210 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pr);.           
2c220 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2c230 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73     if( longNames
2c240 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c250 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73      zColname = s
2c260 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
2c270 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e  , "%s.%s", zTabN
2c280 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ame, zName);.   
2c290 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f               zTo
2c2a0 46 72 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b  Free = zColname;
2c2b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2c2c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
2c2d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2c2e0 20 20 70 45 78 70 72 20 3d 20 70 52 69 67 68 74    pExpr = pRight
2c2f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2c300 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
2c310 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
2c320 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
2c330 20 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20   pNew, pExpr);. 
2c340 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2c350 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 73 43 6f  e3TokenInit(&sCo
2c360 6c 6e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29  lname, zColname)
2c370 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
2c380 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
2c390 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 65  Name(pParse, pNe
2c3a0 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30 29  w, &sColname, 0)
2c3b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2c3c0 28 20 70 4e 65 77 20 26 26 20 28 70 2d 3e 73 65  ( pNew && (p->se
2c3d0 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74  lFlags & SF_Nest
2c3e0 65 64 46 72 6f 6d 29 21 3d 30 20 29 7b 0a 20 20  edFrom)!=0 ){.  
2c3f0 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
2c400 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
2c410 20 2a 70 58 20 3d 20 26 70 4e 65 77 2d 3e 61 5b   *pX = &pNew->a[
2c420 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  pNew->nExpr-1];.
2c430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2c440 28 20 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20  ( pSub ){.      
2c450 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53            pX->zS
2c460 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53  pan = sqlite3DbS
2c470 74 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e  trDup(db, pSub->
2c480 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70  pEList->a[j].zSp
2c490 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  an);.           
2c4a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2c4b0 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20  X->zSpan==0 );. 
2c4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
2c4d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2c4e0 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20      pX->zSpan = 
2c4f0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
2c500 62 2c 20 22 25 73 2e 25 73 2e 25 73 22 2c 0a 20  b, "%s.%s.%s",. 
2c510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c530 20 20 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d            zSchem
2c540 61 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 2c  aName, zTabName,
2c550 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20   zColname);.    
2c560 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
2c570 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d  case( pX->zSpan=
2c580 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
2c590 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2c5a0 20 20 20 20 70 58 2d 3e 62 53 70 61 6e 49 73 54      pX->bSpanIsT
2c5b0 61 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ab = 1;.        
2c5c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2c5d0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2c5e0 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20  db, zToFree);.  
2c5f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c600 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2c610 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20  !tableSeen ){.  
2c620 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
2c630 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  me ){.          
2c640 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2c650 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
2c660 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a  ch table: %s", z
2c670 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  TName);.        
2c680 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2c690 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2c6a0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
2c6b0 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65   tables specifie
2c6c0 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  d");.          }
2c6d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c6e0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
2c6f0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
2c700 74 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a  te(db, pEList);.
2c710 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20      p->pEList = 
2c720 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pNew;.  }.  if( 
2c730 70 2d 3e 70 45 4c 69 73 74 20 29 7b 0a 20 20 20  p->pEList ){.   
2c740 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e   if( p->pEList->
2c750 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74  nExpr>db->aLimit
2c760 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
2c770 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 20 20 73  LUMN] ){.      s
2c780 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2c790 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
2c7a0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75   columns in resu
2c7b0 6c 74 20 73 65 74 22 29 3b 0a 20 20 20 20 20 20  lt set");.      
2c7c0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
2c7d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2c7e0 28 65 6c 69 73 74 46 6c 61 67 73 20 26 20 28 45  (elistFlags & (E
2c7f0 50 5f 48 61 73 46 75 6e 63 7c 45 50 5f 53 75 62  P_HasFunc|EP_Sub
2c800 71 75 65 72 79 29 29 21 3d 30 20 29 7b 0a 20 20  query))!=0 ){.  
2c810 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
2c820 7c 3d 20 53 46 5f 43 6f 6d 70 6c 65 78 52 65 73  |= SF_ComplexRes
2c830 75 6c 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ult;.    }.  }. 
2c840 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2c850 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e  inue;.}../*.** N
2c860 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72  o-op routine for
2c870 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65 20   the parse-tree 
2c880 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68  walker..**.** Wh
2c890 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
2c8a0 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45  is the Walker.xE
2c8b0 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e  xprCallback then
2c8c0 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
2c8d0 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20  s.** are walked 
2c8e0 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69  without any acti
2c8f0 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20  ons being taken 
2c900 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50  at each node.  P
2c910 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68  resumably,.** wh
2c920 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
2c930 69 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b  is used for Walk
2c940 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  er.xExprCallback
2c950 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72   then .** Walker
2c960 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2c970 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f   is set to do so
2c980 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66  mething useful f
2c990 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62  or every .** sub
2c9a0 71 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72  query in the par
2c9b0 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74  ser tree..*/.int
2c9c0 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b   sqlite3ExprWalk
2c9d0 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74  Noop(Walker *Not
2c9e0 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55  Used, Expr *NotU
2c9f0 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
2ca00 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
2ca10 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
2ca20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2ca30 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e  inue;.}../*.** N
2ca40 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72  o-op routine for
2ca50 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65 20   the parse-tree 
2ca60 77 61 6c 6b 65 72 20 66 6f 72 20 53 45 4c 45 43  walker for SELEC
2ca70 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a  T statements..**
2ca80 20 73 75 62 71 75 65 72 79 20 69 6e 20 74 68 65   subquery in the
2ca90 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f   parser tree..*/
2caa0 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65  .int sqlite3Sele
2cab0 63 74 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65  ctWalkNoop(Walke
2cac0 72 20 2a 4e 6f 74 55 73 65 64 2c 20 53 65 6c 65  r *NotUsed, Sele
2cad0 63 74 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20  ct *NotUsed2){. 
2cae0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2caf0 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
2cb00 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
2cb10 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
2cb20 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55  .#if SQLITE_DEBU
2cb30 47 0a 2f 2a 0a 2a 2a 20 41 6c 77 61 79 73 20 61  G./*.** Always a
2cb40 73 73 65 72 74 2e 20 20 54 68 69 73 20 78 53 65  ssert.  This xSe
2cb50 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 69 6d  lectCallback2 im
2cb60 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 72 6f  plementation pro
2cb70 76 65 73 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ves that the.** 
2cb80 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
2cb90 20 69 73 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65   is never invoke
2cba0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
2cbb0 65 33 53 65 6c 65 63 74 57 61 6c 6b 41 73 73 65  e3SelectWalkAsse
2cbc0 72 74 32 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55  rt2(Walker *NotU
2cbd0 73 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74  sed, Select *Not
2cbe0 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
2cbf0 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
2cc00 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
2cc10 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 7d    assert( 0 );.}
2cc20 0a 23 65 6e 64 69 66 0a 2f 2a 0a 2a 2a 20 54 68  .#endif./*.** Th
2cc30 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70 61  is routine "expa
2cc40 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20 73 74  nds" a SELECT st
2cc50 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20  atement and all 
2cc60 6f 66 20 69 74 73 20 73 75 62 71 75 65 72 69 65  of its subquerie
2cc70 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74 69  s..** For additi
2cc80 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
2cc90 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61 6e   on what it mean
2cca0 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61 20  s to "expand" a 
2ccb0 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d  SELECT.** statem
2ccc0 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f 6d  ent, see the com
2ccd0 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c 65  ment on the sele
2cce0 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72 20  ctExpand worker 
2ccf0 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a  callback above..
2cd00 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20  **.** Expanding 
2cd10 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
2cd20 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20  nt is the first 
2cd30 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73 69  step in processi
2cd40 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  ng a.** SELECT s
2cd50 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 53  tatement.  The S
2cd60 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
2cd70 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64  must be expanded
2cd80 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20   before.** name 
2cd90 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65  resolution is pe
2cda0 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  rformed..**.** I
2cdb0 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
2cdc0 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20  wrong, an error 
2cdd0 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74  message is writt
2cde0 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a  en into pParse..
2cdf0 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  ** The calling f
2ce00 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74 65  unction can dete
2ce10 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 62  ct the problem b
2ce20 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61  y looking at pPa
2ce30 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64  rse->nErr.** and
2ce40 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  /or pParse->db->
2ce50 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f  mallocFailed..*/
2ce60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
2ce70 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
2ce80 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2ce90 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
2cea0 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
2ceb0 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
2cec0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c  = sqlite3ExprWal
2ced0 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73  kNoop;.  w.pPars
2cee0 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69 66  e = pParse;.  if
2cef0 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f 54  ( OK_IF_ALWAYS_T
2cf00 52 55 45 28 70 50 61 72 73 65 2d 3e 68 61 73 43  RUE(pParse->hasC
2cf10 6f 6d 70 6f 75 6e 64 29 20 29 7b 0a 20 20 20 20  ompound) ){.    
2cf20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
2cf30 6b 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f  k = convertCompo
2cf40 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75  undSelectToSubqu
2cf50 65 72 79 3b 0a 20 20 20 20 77 2e 78 53 65 6c 65  ery;.    w.xSele
2cf60 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b  ctCallback2 = 0;
2cf70 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  .    sqlite3Walk
2cf80 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65  Select(&w, pSele
2cf90 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53 65  ct);.  }.  w.xSe
2cfa0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
2cfb0 65 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20  electExpander;. 
2cfc0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
2cfd0 63 6b 32 20 3d 20 73 65 6c 65 63 74 50 6f 70 57  ck2 = selectPopW
2cfe0 69 74 68 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  ith;.  sqlite3Wa
2cff0 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65  lkSelect(&w, pSe
2d000 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  lect);.}...#ifnd
2d010 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
2d020 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68  UBQUERY./*.** Th
2d030 69 73 20 69 73 20 61 20 57 61 6c 6b 65 72 2e 78  is is a Walker.x
2d040 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 63  SelectCallback c
2d050 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20  allback for the 
2d060 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 79 70  sqlite3SelectTyp
2d070 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72  eInfo().** inter
2d080 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  face..**.** For 
2d090 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65  each FROM-clause
2d0a0 20 73 75 62 71 75 65 72 79 2c 20 61 64 64 20 43   subquery, add C
2d0b0 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20  olumn.zType and 
2d0c0 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20  Column.zColl.** 
2d0d0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74  information to t
2d0e0 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
2d0f0 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e  re that represen
2d100 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ts the result se
2d110 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73 75 62  t.** of that sub
2d120 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  query..**.** The
2d130 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
2d140 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73   that represents
2d150 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
2d160 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a  was constructed.
2d170 2a 2a 20 62 79 20 73 65 6c 65 63 74 45 78 70 61  ** by selectExpa
2d180 6e 64 65 72 28 29 20 62 75 74 20 74 68 65 20 74  nder() but the t
2d190 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  ype and collatio
2d1a0 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61  n information wa
2d1b0 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20  s omitted.** at 
2d1c0 74 68 61 74 20 70 6f 69 6e 74 20 62 65 63 61 75  that point becau
2d1d0 73 65 20 69 64 65 6e 74 69 66 69 65 72 73 20 68  se identifiers h
2d1e0 61 64 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ad not yet been 
2d1f0 72 65 73 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a  resolved.  This.
2d200 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
2d210 6c 6c 65 64 20 61 66 74 65 72 20 69 64 65 6e 74  lled after ident
2d220 69 66 69 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e  ifier resolution
2d230 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2d240 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65   selectAddSubque
2d250 72 79 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65  ryTypeInfo(Walke
2d260 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
2d270 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20  ct *p){.  Parse 
2d280 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69  *pParse;.  int i
2d290 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
2d2a0 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  bList;.  struct 
2d2b0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
2d2c0 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rom;..  assert( 
2d2d0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
2d2e0 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20 69  _Resolved );.  i
2d2f0 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
2d300 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20   SF_HasTypeInfo 
2d310 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 73  ) return;.  p->s
2d320 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61  elFlags |= SF_Ha
2d330 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 70 50 61  sTypeInfo;.  pPa
2d340 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
2d350 50 61 72 73 65 3b 0a 20 20 70 54 61 62 4c 69 73  Parse;.  pTabLis
2d360 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 66  t = p->pSrc;.  f
2d370 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
2d380 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
2d390 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
2d3a0 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
2d3b0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46  Table *pTab = pF
2d3c0 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61  rom->pTab;.    a
2d3d0 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
2d3e0 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d  ;.    if( (pTab-
2d3f0 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
2d400 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a  phemeral)!=0 ){.
2d410 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71        /* A sub-q
2d420 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d  uery in the FROM
2d430 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
2d440 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c  ECT */.      Sel
2d450 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f  ect *pSel = pFro
2d460 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
2d470 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20    if( pSel ){.  
2d480 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65        while( pSe
2d490 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c  l->pPrior ) pSel
2d4a0 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b   = pSel->pPrior;
2d4b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2d4c0 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  SelectAddColumnT
2d4d0 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
2d4e0 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53  pParse, pTab, pS
2d4f0 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  el);.      }.   
2d500 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
2d510 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2d520 74 69 6e 65 20 61 64 64 73 20 64 61 74 61 74 79  tine adds dataty
2d530 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67  pe and collating
2d540 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d   sequence inform
2d550 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20  ation to.** the 
2d560 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 73  Table structures
2d570 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61   of all FROM-cla
2d580 75 73 65 20 73 75 62 71 75 65 72 69 65 73 20 69  use subqueries i
2d590 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  n a.** SELECT st
2d5a0 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55  atement..**.** U
2d5b0 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
2d5c0 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c  after name resol
2d5d0 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ution..*/.static
2d5e0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c   void sqlite3Sel
2d5f0 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 50  ectAddTypeInfo(P
2d600 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
2d610 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
2d620 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2d630 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 57  MIT_SUBQUERY.  W
2d640 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53 65  alker w;.  w.xSe
2d650 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
2d660 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b  qlite3SelectWalk
2d670 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63  Noop;.  w.xSelec
2d680 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c  tCallback2 = sel
2d690 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79  ectAddSubqueryTy
2d6a0 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70  peInfo;.  w.xExp
2d6b0 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69  rCallback = sqli
2d6c0 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b  te3ExprWalkNoop;
2d6d0 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
2d6e0 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57  arse;.  sqlite3W
2d6f0 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
2d700 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d  elect);.#endif.}
2d710 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
2d720 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20  utine sets up a 
2d730 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2d740 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e   for processing.
2d750 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69    The.** followi
2d760 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68  ng is accomplish
2d770 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  ed:.**.**     * 
2d780 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d   VDBE Cursor num
2d790 62 65 72 73 20 61 72 65 20 61 73 73 69 67 6e 65  bers are assigne
2d7a0 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c  d to all FROM-cl
2d7b0 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20  ause terms..**  
2d7c0 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c 20     *  Ephemeral 
2d7d0 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72  Table objects ar
2d7e0 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c  e created for al
2d7f0 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  l FROM-clause su
2d800 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20  bqueries..**    
2d810 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47   *  ON and USING
2d820 20 63 6c 61 75 73 65 73 20 61 72 65 20 73 68 69   clauses are shi
2d830 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45 20  fted into WHERE 
2d840 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20  statements.**   
2d850 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20 22    *  Wildcards "
2d860 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22  *" and "TABLE.*"
2d870 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73 20   in result sets 
2d880 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a  are expanded..**
2d890 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66 69       *  Identifi
2d8a0 65 72 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f  ers in expressio
2d8b0 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20 74 6f  n are matched to
2d8c0 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54   tables..**.** T
2d8d0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73  his routine acts
2d8e0 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20   recursively on 
2d8f0 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20 77  all subqueries w
2d900 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43 54  ithin the SELECT
2d910 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2d920 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20 50  3SelectPrep(.  P
2d930 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
2d940 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
2d950 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
2d960 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
2d970 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
2d980 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
2d990 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a  being coded. */.
2d9a0 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
2d9b0 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65  OuterNC  /* Name
2d9c0 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e   context for con
2d9d0 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 61  tainer */.){.  a
2d9e0 73 73 65 72 74 28 20 70 21 3d 30 20 7c 7c 20 70  ssert( p!=0 || p
2d9f0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
2da00 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
2da10 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
2da20 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
2da30 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c  rn;.  if( p->sel
2da40 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54 79  Flags & SF_HasTy
2da50 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b  peInfo ) return;
2da60 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
2da70 45 78 70 61 6e 64 28 70 50 61 72 73 65 2c 20 70  Expand(pParse, p
2da80 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
2da90 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d  >nErr || pParse-
2daa0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
2dab0 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  d ) return;.  sq
2dac0 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65  lite3ResolveSele
2dad0 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  ctNames(pParse, 
2dae0 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20  p, pOuterNC);.  
2daf0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
2db00 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
2db10 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
2db20 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
2db30 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66  SelectAddTypeInf
2db40 6f 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a  o(pParse, p);.}.
2db50 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65  ./*.** Reset the
2db60 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
2db70 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ulator..**.** Th
2db80 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
2db90 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74  mulator is a set
2dba0 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73   of memory cells
2dbb0 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e   that hold.** in
2dbc0 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c  termediate resul
2dbd0 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61  ts while calcula
2dbe0 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74  ting an aggregat
2dbf0 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  e.  This.** rout
2dc00 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ine generates co
2dc10 64 65 20 74 68 61 74 20 73 74 6f 72 65 73 20 4e  de that stores N
2dc20 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74  ULLs in all of t
2dc30 68 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63  hose memory.** c
2dc40 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ells..*/.static 
2dc50 76 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d 75  void resetAccumu
2dc60 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61  lator(Parse *pPa
2dc70 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
2dc80 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
2dc90 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
2dca0 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  be;.  int i;.  s
2dcb0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
2dcc0 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 6e 74  nc *pFunc;.  int
2dcd0 20 6e 52 65 67 20 3d 20 70 41 67 67 49 6e 66 6f   nReg = pAggInfo
2dce0 2d 3e 6e 46 75 6e 63 20 2b 20 70 41 67 67 49 6e  ->nFunc + pAggIn
2dcf0 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69  fo->nColumn;.  i
2dd00 66 28 20 6e 52 65 67 3d 3d 30 20 29 20 72 65 74  f( nReg==0 ) ret
2dd10 75 72 6e 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  urn;.#ifdef SQLI
2dd20 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65  TE_DEBUG.  /* Ve
2dd30 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20 41 67  rify that all Ag
2dd40 67 49 6e 66 6f 20 72 65 67 69 73 74 65 72 73 20  gInfo registers 
2dd50 61 72 65 20 77 69 74 68 69 6e 20 74 68 65 20 72  are within the r
2dd60 61 6e 67 65 20 73 70 65 63 69 66 69 65 64 20 62  ange specified b
2dd70 79 0a 20 20 2a 2a 20 41 67 67 49 6e 66 6f 2e 6d  y.  ** AggInfo.m
2dd80 6e 52 65 67 2e 2e 41 67 67 49 6e 66 6f 2e 6d 78  nReg..AggInfo.mx
2dd90 52 65 67 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  Reg */.  assert(
2dda0 20 6e 52 65 67 3d 3d 70 41 67 67 49 6e 66 6f 2d   nReg==pAggInfo-
2ddb0 3e 6d 78 52 65 67 2d 70 41 67 67 49 6e 66 6f 2d  >mxReg-pAggInfo-
2ddc0 3e 6d 6e 52 65 67 2b 31 20 29 3b 0a 20 20 66 6f  >mnReg+1 );.  fo
2ddd0 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
2dde0 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  o->nColumn; i++)
2ddf0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 41  {.    assert( pA
2de00 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e  ggInfo->aCol[i].
2de10 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  iMem>=pAggInfo->
2de20 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26  mnReg.         &
2de30 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  & pAggInfo->aCol
2de40 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e  [i].iMem<=pAggIn
2de50 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d  fo->mxReg );.  }
2de60 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41  .  for(i=0; i<pA
2de70 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
2de80 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
2de90 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
2dea0 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e  [i].iMem>=pAggIn
2deb0 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20  fo->mnReg.      
2dec0 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e     && pAggInfo->
2ded0 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3c 3d 70  aFunc[i].iMem<=p
2dee0 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29  AggInfo->mxReg )
2def0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
2df00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2df10 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
2df20 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2c  pAggInfo->mnReg,
2df30 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67   pAggInfo->mxReg
2df40 29 3b 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d 70  );.  for(pFunc=p
2df50 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20  AggInfo->aFunc, 
2df60 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
2df70 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75  >nFunc; i++, pFu
2df80 6e 63 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  nc++){.    if( p
2df90 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e  Func->iDistinct>
2dfa0 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  =0 ){.      Expr
2dfb0 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45   *pE = pFunc->pE
2dfc0 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
2dfd0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2dfe0 72 74 79 28 70 45 2c 20 45 50 5f 78 49 73 53 65  rty(pE, EP_xIsSe
2dff0 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69  lect) );.      i
2e000 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d  f( pE->x.pList==
2e010 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73 74  0 || pE->x.pList
2e020 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20  ->nExpr!=1 ){.  
2e030 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2e040 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44  orMsg(pParse, "D
2e050 49 53 54 49 4e 43 54 20 61 67 67 72 65 67 61 74  ISTINCT aggregat
2e060 65 73 20 6d 75 73 74 20 68 61 76 65 20 65 78 61  es must have exa
2e070 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20 20  ctly one ".     
2e080 20 20 20 20 20 20 22 61 72 67 75 6d 65 6e 74 22        "argument"
2e090 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63  );.        pFunc
2e0a0 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31  ->iDistinct = -1
2e0b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2e0c0 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a         KeyInfo *
2e0d0 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
2e0e0 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  e3KeyInfoFromExp
2e0f0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
2e100 2d 3e 78 2e 70 4c 69 73 74 2c 30 2c 30 29 3b 0a  ->x.pList,0,0);.
2e110 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2e120 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
2e130 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
2e140 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c  Func->iDistinct,
2e150 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
2e160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e170 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
2e180 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
2e190 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2e1a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
2e1b0 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c   the OP_AggFinal
2e1c0 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65  ize opcode for e
2e1d0 76 65 72 79 20 61 67 67 72 65 67 61 74 65 20 66  very aggregate f
2e1e0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  unction.** in th
2e1f0 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74  e AggInfo struct
2e200 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ure..*/.static v
2e210 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46  oid finalizeAggF
2e220 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a  unctions(Parse *
2e230 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
2e240 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
2e250 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
2e260 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
2e270 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
2e280 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72  _func *pF;.  for
2e290 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66  (i=0, pF=pAggInf
2e2a0 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67  o->aFunc; i<pAgg
2e2b0 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
2e2c0 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70  , pF++){.    Exp
2e2d0 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
2e2e0 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  F->pExpr->x.pLis
2e2f0 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  t;.    assert( !
2e300 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2e310 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49  pF->pExpr, EP_xI
2e320 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
2e330 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2e340 32 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c  2(v, OP_AggFinal
2e350 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73  , pF->iMem, pLis
2e360 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  t ? pList->nExpr
2e370 20 3a 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74   : 0);.    sqlit
2e380 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
2e390 2c 20 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f  , pF->pFunc, P4_
2e3a0 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a  FUNCDEF);.  }.}.
2e3b0 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74  ../*.** Update t
2e3c0 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d  he accumulator m
2e3d0 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20  emory cells for 
2e3e0 61 6e 20 61 67 67 72 65 67 61 74 65 20 62 61 73  an aggregate bas
2e3f0 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72  ed on.** the cur
2e400 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
2e410 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72  tion..**.** If r
2e420 65 67 41 63 63 20 69 73 20 6e 6f 6e 2d 7a 65 72  egAcc is non-zer
2e430 6f 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  o and there are 
2e440 6e 6f 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  no min() or max(
2e450 29 20 61 67 67 72 65 67 61 74 65 73 0a 2a 2a 20  ) aggregates.** 
2e460 69 6e 20 70 41 67 67 49 6e 66 6f 2c 20 74 68 65  in pAggInfo, the
2e470 6e 20 6f 6e 6c 79 20 70 6f 70 75 6c 61 74 65 20  n only populate 
2e480 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41  the pAggInfo->nA
2e490 63 63 75 6d 75 6c 61 74 6f 72 20 61 63 63 75 6d  ccumulator accum
2e4a0 75 6c 61 74 6f 72 0a 2a 2a 20 72 65 67 69 73 74  ulator.** regist
2e4b0 65 72 73 20 69 20 72 65 67 69 73 74 65 72 20 72  ers i register r
2e4c0 65 67 41 63 63 20 63 6f 6e 74 61 69 6e 73 20 30  egAcc contains 0
2e4d0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
2e4e0 6c 20 74 61 6b 65 20 63 61 72 65 0a 2a 2a 20 6f  l take care.** o
2e4f0 66 20 73 65 74 74 69 6e 67 20 61 6e 64 20 63 6c  f setting and cl
2e500 65 61 72 69 6e 67 20 72 65 67 41 63 63 2e 0a 2a  earing regAcc..*
2e510 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70  /.static void up
2e520 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28  dateAccumulator(
2e530 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
2e540 6e 74 20 72 65 67 41 63 63 2c 20 41 67 67 49 6e  nt regAcc, AggIn
2e550 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
2e560 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
2e570 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
2e580 69 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20  i;.  int regHit 
2e590 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48  = 0;.  int addrH
2e5a0 69 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74  itTest = 0;.  st
2e5b0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
2e5c0 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20  c *pF;.  struct 
2e5d0 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b  AggInfo_col *pC;
2e5e0 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69  ..  pAggInfo->di
2e5f0 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  rectMode = 1;.  
2e600 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67  for(i=0, pF=pAgg
2e610 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70  Info->aFunc; i<p
2e620 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
2e630 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20  i++, pF++){.    
2e640 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e  int nArg;.    in
2e650 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a  t addrNext = 0;.
2e660 20 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a      int regAgg;.
2e670 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
2e680 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
2e690 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73  >x.pList;.    as
2e6a0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2e6b0 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72  operty(pF->pExpr
2e6c0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
2e6d0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
2e6e0 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d   ){.      nArg =
2e6f0 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
2e700 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 73 71       regAgg = sq
2e710 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
2e720 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b  e(pParse, nArg);
2e730 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2e740 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
2e750 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65  Parse, pList, re
2e760 67 41 67 67 2c 20 30 2c 20 53 51 4c 49 54 45 5f  gAgg, 0, SQLITE_
2e770 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20 7d  ECEL_DUP);.    }
2e780 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67  else{.      nArg
2e790 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41   = 0;.      regA
2e7a0 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  gg = 0;.    }.  
2e7b0 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69    if( pF->iDisti
2e7c0 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  nct>=0 ){.      
2e7d0 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74  addrNext = sqlit
2e7e0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
2e7f0 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  v);.      testca
2e800 73 65 28 20 6e 41 72 67 3d 3d 30 20 29 3b 20 20  se( nArg==0 );  
2e810 2f 2a 20 45 72 72 6f 72 20 63 6f 6e 64 69 74 69  /* Error conditi
2e820 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  on */.      test
2e830 63 61 73 65 28 20 6e 41 72 67 3e 31 20 29 3b 20  case( nArg>1 ); 
2e840 20 20 2f 2a 20 41 6c 73 6f 20 61 6e 20 65 72 72    /* Also an err
2e850 6f 72 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65  or */.      code
2e860 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c  Distinct(pParse,
2e870 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20   pF->iDistinct, 
2e880 61 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67  addrNext, 1, reg
2e890 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Agg);.    }.    
2e8a0 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66  if( pF->pFunc->f
2e8b0 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
2e8c0 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20  E_FUNC_NEEDCOLL 
2e8d0 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
2e8e0 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20   *pColl = 0;.   
2e8f0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
2e900 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
2e910 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
2e920 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
2e930 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74  !=0 );  /* pList
2e940 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63  !=0 if pF->pFunc
2e950 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f   has NEEDCOLL */
2e960 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
2e970 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  pItem=pList->a; 
2e980 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67  !pColl && j<nArg
2e990 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
2e9a0 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
2e9b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2e9c0 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65  Seq(pParse, pIte
2e9d0 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
2e9e0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43   }.      if( !pC
2e9f0 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  oll ){.        p
2ea00 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
2ea10 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
2ea20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2ea30 72 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41 67  regHit==0 && pAg
2ea40 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61  gInfo->nAccumula
2ea50 74 6f 72 20 29 20 72 65 67 48 69 74 20 3d 20 2b  tor ) regHit = +
2ea60 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2ea70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ea80 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp4(v, OP_Col
2ea90 6c 53 65 71 2c 20 72 65 67 48 69 74 2c 20 30 2c  lSeq, regHit, 0,
2eaa0 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c   0, (char *)pCol
2eab0 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
2eac0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2ead0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2eae0 50 5f 41 67 67 53 74 65 70 2c 20 30 2c 20 72 65  P_AggStep, 0, re
2eaf0 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 29 3b  gAgg, pF->iMem);
2eb00 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2eb10 41 70 70 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e  AppendP4(v, pF->
2eb20 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
2eb30 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  F);.    sqlite3V
2eb40 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28  dbeChangeP5(v, (
2eb50 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71  u8)nArg);.    sq
2eb60 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
2eb70 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
2eb80 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72  rse, regAgg, nAr
2eb90 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  g);.    sqlite3R
2eba0 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
2ebb0 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20  pParse, regAgg, 
2ebc0 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61  nArg);.    if( a
2ebd0 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ddrNext ){.     
2ebe0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
2ebf0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
2ec00 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Next);.      sql
2ec10 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
2ec20 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
2ec30 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f  }.  }..  /* Befo
2ec40 72 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68  re populating th
2ec50 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65  e accumulator re
2ec60 67 69 73 74 65 72 73 2c 20 63 6c 65 61 72 20 74  gisters, clear t
2ec70 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
2ec80 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
2ec90 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 72   if any of the r
2eca0 65 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76  equired column v
2ecb0 61 6c 75 65 73 20 61 72 65 20 61 6c 72 65 61 64  alues are alread
2ecc0 79 20 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20  y present .  ** 
2ecd0 69 6e 20 72 65 67 69 73 74 65 72 73 2c 20 73 71  in registers, sq
2ece0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 20  lite3ExprCode() 
2ecf0 6d 61 79 20 75 73 65 20 4f 50 5f 53 43 6f 70 79  may use OP_SCopy
2ed00 20 74 6f 20 63 6f 70 79 20 74 68 65 20 76 61 6c   to copy the val
2ed10 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69  ue.  ** to pC->i
2ed20 4d 65 6d 2e 20 42 75 74 20 62 79 20 74 68 65 20  Mem. But by the 
2ed30 74 69 6d 65 20 74 68 65 20 76 61 6c 75 65 20 69  time the value i
2ed40 73 20 75 73 65 64 2c 20 74 68 65 20 6f 72 69 67  s used, the orig
2ed50 69 6e 61 6c 20 72 65 67 69 73 74 65 72 0a 20 20  inal register.  
2ed60 2a 2a 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ** may have been
2ed70 20 75 73 65 64 2c 20 69 6e 76 61 6c 69 64 61 74   used, invalidat
2ed80 69 6e 67 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ing the underlyi
2ed90 6e 67 20 62 75 66 66 65 72 20 68 6f 6c 64 69 6e  ng buffer holdin
2eda0 67 20 74 68 65 0a 20 20 2a 2a 20 74 65 78 74 20  g the.  ** text 
2edb0 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53  or blob value. S
2edc0 65 65 20 74 69 63 6b 65 74 20 5b 38 38 33 30 33  ee ticket [88303
2edd0 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a  4dcb5]..  **.  *
2ede0 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69  * Another soluti
2edf0 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 63  on would be to c
2ee00 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 53 43 6f  hange the OP_SCo
2ee10 70 79 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20  py used to copy 
2ee20 63 61 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75  cached.  ** valu
2ee30 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79  es to an OP_Copy
2ee40 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67  ..  */.  if( reg
2ee50 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e  Hit==0 && pAggIn
2ee60 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  fo->nAccumulator
2ee70 20 29 7b 0a 20 20 20 20 72 65 67 48 69 74 20 3d   ){.    regHit =
2ee80 20 72 65 67 41 63 63 3b 0a 20 20 7d 0a 20 20 69   regAcc;.  }.  i
2ee90 66 28 20 72 65 67 48 69 74 20 29 7b 0a 20 20 20  f( regHit ){.   
2eea0 20 61 64 64 72 48 69 74 54 65 73 74 20 3d 20 73   addrHitTest = s
2eeb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
2eec0 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48 69  (v, OP_If, regHi
2eed0 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
2eee0 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (v);.  }.  sqlit
2eef0 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
2ef00 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28  (pParse);.  for(
2ef10 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f  i=0, pC=pAggInfo
2ef20 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e  ->aCol; i<pAggIn
2ef30 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  fo->nAccumulator
2ef40 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20  ; i++, pC++){.  
2ef50 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
2ef60 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45  e(pParse, pC->pE
2ef70 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a  xpr, pC->iMem);.
2ef80 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e    }.  pAggInfo->
2ef90 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a  directMode = 0;.
2efa0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
2efb0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
2efc0 0a 20 20 69 66 28 20 61 64 64 72 48 69 74 54 65  .  if( addrHitTe
2efd0 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  st ){.    sqlite
2efe0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
2eff0 20 61 64 64 72 48 69 74 54 65 73 74 29 3b 0a 20   addrHitTest);. 
2f000 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
2f010 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c  a single OP_Expl
2f020 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ain instruction 
2f030 74 6f 20 74 68 65 20 56 44 42 45 20 74 6f 20 65  to the VDBE to e
2f040 78 70 6c 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a  xplain a simple.
2f050 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71 75 65 72  ** count(*) quer
2f060 79 20 28 22 53 45 4c 45 43 54 20 63 6f 75 6e 74  y ("SELECT count
2f070 28 2a 29 20 46 52 4f 4d 20 70 54 61 62 22 29 2e  (*) FROM pTab").
2f080 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
2f090 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
2f0a0 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
2f0b0 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a  ainSimpleCount(.
2f0c0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2f0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f0e0 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
2f0f0 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
2f100 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
2f110 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
2f120 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a   being queried *
2f130 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
2f140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f150 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65      /* Index use
2f160 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63  d to optimize sc
2f170 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29  an, or NULL */.)
2f180 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
2f190 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
2f1a0 20 20 69 6e 74 20 62 43 6f 76 65 72 20 3d 20 28    int bCover = (
2f1b0 70 49 64 78 21 3d 30 20 26 26 20 28 48 61 73 52  pIdx!=0 && (HasR
2f1c0 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20 21 49  owid(pTab) || !I
2f1d0 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  sPrimaryKeyIndex
2f1e0 28 70 49 64 78 29 29 29 3b 0a 20 20 20 20 73 71  (pIdx)));.    sq
2f1f0 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61 69 6e  lite3VdbeExplain
2f200 28 70 50 61 72 73 65 2c 20 30 2c 20 22 53 43 41  (pParse, 0, "SCA
2f210 4e 20 54 41 42 4c 45 20 25 73 25 73 25 73 22 2c  N TABLE %s%s%s",
2f220 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  .        pTab->z
2f230 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 62 43  Name,.        bC
2f240 6f 76 65 72 20 3f 20 22 20 55 53 49 4e 47 20 43  over ? " USING C
2f250 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20 22 20  OVERING INDEX " 
2f260 3a 20 22 22 2c 0a 20 20 20 20 20 20 20 20 62 43  : "",.        bC
2f270 6f 76 65 72 20 3f 20 70 49 64 78 2d 3e 7a 4e 61  over ? pIdx->zNa
2f280 6d 65 20 3a 20 22 22 0a 20 20 20 20 29 3b 0a 20  me : "".    );. 
2f290 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
2f2a0 69 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c  ine explainSimpl
2f2b0 65 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65  eCount(a,b,c).#e
2f2c0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69  ndif../*.** sqli
2f2d0 74 65 33 57 61 6c 6b 45 78 70 72 28 29 20 63 61  te3WalkExpr() ca
2f2e0 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20 68  llback used by h
2f2f0 61 76 69 6e 67 54 6f 57 68 65 72 65 28 29 2e 0a  avingToWhere()..
2f300 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 64  **.** If the nod
2f310 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  e passed to the 
2f320 63 61 6c 6c 62 61 63 6b 20 69 73 20 61 20 54 4b  callback is a TK
2f330 5f 41 4e 44 20 6e 6f 64 65 2c 20 72 65 74 75 72  _AND node, retur
2f340 6e 20 0a 2a 2a 20 57 52 43 5f 43 6f 6e 74 69 6e  n .** WRC_Contin
2f350 75 65 20 74 6f 20 74 65 6c 6c 20 73 71 6c 69 74  ue to tell sqlit
2f360 65 33 57 61 6c 6b 45 78 70 72 28 29 20 74 6f 20  e3WalkExpr() to 
2f370 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
2f380 63 68 69 6c 64 20 6e 6f 64 65 73 2e 0a 2a 2a 0a  child nodes..**.
2f390 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
2f3a0 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 2e 20  turn WRC_Prune. 
2f3b0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 6c  In this case, al
2f3c0 73 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  so check if the 
2f3d0 0a 2a 2a 20 73 75 62 2d 65 78 70 72 65 73 73 69  .** sub-expressi
2f3e0 6f 6e 20 6d 61 74 63 68 65 73 20 74 68 65 20 63  on matches the c
2f3f0 72 69 74 65 72 69 61 20 66 6f 72 20 62 65 69 6e  riteria for bein
2f400 67 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 57  g moved to the W
2f410 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65 2e 20  HERE.** clause. 
2f420 49 66 20 73 6f 2c 20 61 64 64 20 69 74 20 74 6f  If so, add it to
2f430 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2f440 65 20 61 6e 64 20 72 65 70 6c 61 63 65 20 74 68  e and replace th
2f450 65 20 73 75 62 2d 65 78 70 72 65 73 73 69 6f 6e  e sub-expression
2f460 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 48  .** within the H
2f470 41 56 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e  AVING expression
2f480 20 77 69 74 68 20 61 20 63 6f 6e 73 74 61 6e 74   with a constant
2f490 20 22 31 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   "1"..*/.static 
2f4a0 69 6e 74 20 68 61 76 69 6e 67 54 6f 57 68 65 72  int havingToWher
2f4b0 65 45 78 70 72 43 62 28 57 61 6c 6b 65 72 20 2a  eExprCb(Walker *
2f4c0 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
2f4d0 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78  Expr){.  if( pEx
2f4e0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 4e 44 20 29  pr->op!=TK_AND )
2f4f0 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53  {.    Select *pS
2f500 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53   = pWalker->u.pS
2f510 65 6c 65 63 74 3b 0a 20 20 20 20 69 66 28 20 73  elect;.    if( s
2f520 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
2f530 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 70 57  tantOrGroupBy(pW
2f540 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20 70  alker->pParse, p
2f550 45 78 70 72 2c 20 70 53 2d 3e 70 47 72 6f 75 70  Expr, pS->pGroup
2f560 42 79 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  By) ){.      sql
2f570 69 74 65 33 20 2a 64 62 20 3d 20 70 57 61 6c 6b  ite3 *db = pWalk
2f580 65 72 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  er->pParse->db;.
2f590 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
2f5a0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
2f5b0 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  loc(db, TK_INTEG
2f5c0 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54  ER, &sqlite3IntT
2f5d0 6f 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b 0a 20 20  okens[1], 0);.  
2f5e0 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
2f5f0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 57          Expr *pW
2f600 68 65 72 65 20 3d 20 70 53 2d 3e 70 57 68 65 72  here = pS->pWher
2f610 65 3b 0a 20 20 20 20 20 20 20 20 53 57 41 50 28  e;.        SWAP(
2f620 45 78 70 72 2c 20 2a 70 4e 65 77 2c 20 2a 70 45  Expr, *pNew, *pE
2f630 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  xpr);.        pN
2f640 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
2f650 41 6e 64 28 64 62 2c 20 70 57 68 65 72 65 2c 20  And(db, pWhere, 
2f660 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70  pNew);.        p
2f670 53 2d 3e 70 57 68 65 72 65 20 3d 20 70 4e 65 77  S->pWhere = pNew
2f680 3b 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65  ;.        pWalke
2f690 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20  r->eCode = 1;.  
2f6a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2f6b0 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
2f6c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  ;.  }.  return W
2f6d0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
2f6e0 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65  /*.** Transfer e
2f6f0 6c 69 67 69 62 6c 65 20 74 65 72 6d 73 20 66 72  ligible terms fr
2f700 6f 6d 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  om the HAVING cl
2f710 61 75 73 65 20 6f 66 20 61 20 71 75 65 72 79 2c  ause of a query,
2f720 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 70 72 6f   which is.** pro
2f730 63 65 73 73 65 64 20 61 66 74 65 72 20 67 72 6f  cessed after gro
2f740 75 70 69 6e 67 2c 20 74 6f 20 74 68 65 20 57 48  uping, to the WH
2f750 45 52 45 20 63 6c 61 75 73 65 2c 20 77 68 69 63  ERE clause, whic
2f760 68 20 69 73 20 70 72 6f 63 65 73 73 65 64 20 62  h is processed b
2f770 65 66 6f 72 65 0a 2a 2a 20 67 72 6f 75 70 69 6e  efore.** groupin
2f780 67 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  g. For example, 
2f790 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a  the query:.**.**
2f7a0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
2f7b0 20 3c 74 61 62 6c 65 73 3e 20 57 48 45 52 45 20   <tables> WHERE 
2f7c0 61 3d 3f 20 47 52 4f 55 50 20 42 59 20 62 20 48  a=? GROUP BY b H
2f7d0 41 56 49 4e 47 20 62 3d 3f 20 41 4e 44 20 63 3d  AVING b=? AND c=
2f7e0 3f 0a 2a 2a 0a 2a 2a 20 63 61 6e 20 62 65 20 72  ?.**.** can be r
2f7f0 65 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a  ewritten as:.**.
2f800 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
2f810 4f 4d 20 3c 74 61 62 6c 65 73 3e 20 57 48 45 52  OM <tables> WHER
2f820 45 20 61 3d 3f 20 41 4e 44 20 62 3d 3f 20 47 52  E a=? AND b=? GR
2f830 4f 55 50 20 42 59 20 62 20 48 41 56 49 4e 47 20  OUP BY b HAVING 
2f840 63 3d 3f 0a 2a 2a 0a 2a 2a 20 41 20 74 65 72 6d  c=?.**.** A term
2f850 20 6f 66 20 74 68 65 20 48 41 56 49 4e 47 20 65   of the HAVING e
2f860 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 6c 69  xpression is eli
2f870 67 69 62 6c 65 20 66 6f 72 20 74 72 61 6e 73 66  gible for transf
2f880 65 72 20 69 66 20 69 74 20 63 6f 6e 73 69 73 74  er if it consist
2f890 73 0a 2a 2a 20 65 6e 74 69 72 65 6c 79 20 6f 66  s.** entirely of
2f8a0 20 63 6f 6e 73 74 61 6e 74 73 20 61 6e 64 20 65   constants and e
2f8b0 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
2f8c0 61 72 65 20 61 6c 73 6f 20 47 52 4f 55 50 20 42  are also GROUP B
2f8d0 59 20 74 65 72 6d 73 20 74 68 61 74 0a 2a 2a 20  Y terms that.** 
2f8e0 75 73 65 20 74 68 65 20 22 42 49 4e 41 52 59 22  use the "BINARY"
2f8f0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
2f900 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nce..*/.static v
2f910 6f 69 64 20 68 61 76 69 6e 67 54 6f 57 68 65 72  oid havingToWher
2f920 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
2f930 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 57   Select *p){.  W
2f940 61 6c 6b 65 72 20 73 57 61 6c 6b 65 72 3b 0a 20  alker sWalker;. 
2f950 20 6d 65 6d 73 65 74 28 26 73 57 61 6c 6b 65 72   memset(&sWalker
2f960 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 61 6c  , 0, sizeof(sWal
2f970 6b 65 72 29 29 3b 0a 20 20 73 57 61 6c 6b 65 72  ker));.  sWalker
2f980 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
2f990 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70  ;.  sWalker.xExp
2f9a0 72 43 61 6c 6c 62 61 63 6b 20 3d 20 68 61 76 69  rCallback = havi
2f9b0 6e 67 54 6f 57 68 65 72 65 45 78 70 72 43 62 3b  ngToWhereExprCb;
2f9c0 0a 20 20 73 57 61 6c 6b 65 72 2e 75 2e 70 53 65  .  sWalker.u.pSe
2f9d0 6c 65 63 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69  lect = p;.  sqli
2f9e0 74 65 33 57 61 6c 6b 45 78 70 72 28 26 73 57 61  te3WalkExpr(&sWa
2f9f0 6c 6b 65 72 2c 20 70 2d 3e 70 48 61 76 69 6e 67  lker, p->pHaving
2fa00 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  );.#if SELECTTRA
2fa10 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
2fa20 20 73 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 26   sWalker.eCode &
2fa30 26 20 28 73 71 6c 69 74 65 33 53 65 6c 65 63 74  & (sqlite3Select
2fa40 54 72 61 63 65 20 26 20 30 78 31 30 30 29 21 3d  Trace & 0x100)!=
2fa50 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54  0 ){.    SELECTT
2fa60 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73  RACE(0x100,pPars
2fa70 65 2c 70 2c 28 22 4d 6f 76 65 20 48 41 56 49 4e  e,p,("Move HAVIN
2fa80 47 20 74 65 72 6d 73 20 69 6e 74 6f 20 57 48 45  G terms into WHE
2fa90 52 45 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71  RE:\n"));.    sq
2faa0 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
2fab0 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
2fac0 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
2fad0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
2fae0 66 20 74 68 65 20 70 54 68 69 73 20 65 6e 74 72  f the pThis entr
2faf0 79 20 6f 66 20 70 54 61 62 4c 69 73 74 20 69 73  y of pTabList is
2fb00 20 61 20 73 65 6c 66 2d 6a 6f 69 6e 20 6f 66 20   a self-join of 
2fb10 61 20 70 72 69 6f 72 20 76 69 65 77 2e 0a 2a 2a  a prior view..**
2fb20 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   If it is, then 
2fb30 72 65 74 75 72 6e 20 74 68 65 20 53 72 63 4c 69  return the SrcLi
2fb40 73 74 5f 69 74 65 6d 20 66 6f 72 20 74 68 65 20  st_item for the 
2fb50 70 72 69 6f 72 20 76 69 65 77 2e 20 20 49 66 20  prior view.  If 
2fb60 69 74 20 69 73 20 6e 6f 74 2c 0a 2a 2a 20 74 68  it is not,.** th
2fb70 65 6e 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  en return 0..*/.
2fb80 73 74 61 74 69 63 20 73 74 72 75 63 74 20 53 72  static struct Sr
2fb90 63 4c 69 73 74 5f 69 74 65 6d 20 2a 69 73 53 65  cList_item *isSe
2fba0 6c 66 4a 6f 69 6e 56 69 65 77 28 0a 20 20 53 72  lfJoinView(.  Sr
2fbb0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
2fbc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
2fbd0 61 72 63 68 20 66 6f 72 20 73 65 6c 66 2d 6a 6f  arch for self-jo
2fbe0 69 6e 73 20 69 6e 20 74 68 69 73 20 46 52 4f 4d  ins in this FROM
2fbf0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
2fc00 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2fc10 20 2a 70 54 68 69 73 20 20 20 2f 2a 20 53 65 61   *pThis   /* Sea
2fc20 72 63 68 20 66 6f 72 20 70 72 69 6f 72 20 72 65  rch for prior re
2fc30 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20  ference to this 
2fc40 73 75 62 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20  subquery */.){. 
2fc50 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2fc60 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 66  item *pItem;.  f
2fc70 6f 72 28 70 49 74 65 6d 20 3d 20 70 54 61 62 4c  or(pItem = pTabL
2fc80 69 73 74 2d 3e 61 3b 20 70 49 74 65 6d 3c 70 54  ist->a; pItem<pT
2fc90 68 69 73 3b 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  his; pItem++){. 
2fca0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
2fcb0 65 6c 65 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69  elect==0 ) conti
2fcc0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49 74  nue;.    if( pIt
2fcd0 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74  em->fg.viaCorout
2fce0 69 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ine ) continue;.
2fcf0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
2fd00 4e 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  Name==0 ) contin
2fd10 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ue;.    if( sqli
2fd20 74 65 33 5f 73 74 72 69 63 6d 70 28 70 49 74 65  te3_stricmp(pIte
2fd30 6d 2d 3e 7a 44 61 74 61 62 61 73 65 2c 20 70 54  m->zDatabase, pT
2fd40 68 69 73 2d 3e 7a 44 61 74 61 62 61 73 65 29 21  his->zDatabase)!
2fd50 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2fd60 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
2fd70 74 72 69 63 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e  tricmp(pItem->zN
2fd80 61 6d 65 2c 20 70 54 68 69 73 2d 3e 7a 4e 61 6d  ame, pThis->zNam
2fd90 65 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  e)!=0 ) continue
2fda0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
2fdb0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20  3ExprCompare(0, 
2fdc0 0a 20 20 20 20 20 20 20 20 20 20 70 54 68 69 73  .          pThis
2fdd0 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 57 68 65 72  ->pSelect->pWher
2fde0 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  e, pItem->pSelec
2fdf0 74 2d 3e 70 57 68 65 72 65 2c 20 2d 31 29 20 0a  t->pWhere, -1) .
2fe00 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
2fe10 54 68 65 20 76 69 65 77 20 77 61 73 20 6d 6f 64  The view was mod
2fe20 69 66 69 65 64 20 62 79 20 73 6f 6d 65 20 6f 74  ified by some ot
2fe30 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  her optimization
2fe40 20 73 75 63 68 20 61 73 0a 20 20 20 20 20 20 2a   such as.      *
2fe50 2a 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54  * pushDownWhereT
2fe60 65 72 6d 73 28 29 20 2a 2f 0a 20 20 20 20 20 20  erms() */.      
2fe70 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
2fe80 20 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d      return pItem
2fe90 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
2fea0 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
2feb0 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f  TE_COUNTOFVIEW_O
2fec0 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a  PTIMIZATION./*.*
2fed0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 74 72 61  * Attempt to tra
2fee0 6e 73 66 6f 72 6d 20 61 20 71 75 65 72 79 20 6f  nsform a query o
2fef0 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a  f the form.**.**
2ff00 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
2ff10 28 2a 29 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  (*) FROM (SELECT
2ff20 20 78 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e   x FROM t1 UNION
2ff30 20 41 4c 4c 20 53 45 4c 45 43 54 20 79 20 46 52   ALL SELECT y FR
2ff40 4f 4d 20 74 32 29 0a 2a 2a 0a 2a 2a 20 49 6e 74  OM t2).**.** Int
2ff50 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  o this:.**.**   
2ff60 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
2ff70 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
2ff80 29 2b 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  )+(SELECT count(
2ff90 2a 29 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 0a 2a  *) FROM t2).**.*
2ffa0 2a 20 54 68 65 20 74 72 61 6e 73 66 6f 72 6d 61  * The transforma
2ffb0 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  tion only works 
2ffc0 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
2ffd0 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
2ffe0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54 68 65  :.**.**   *  The
2fff0 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20 55   subquery is a U
30000 4e 49 4f 4e 20 41 4c 4c 20 6f 66 20 74 77 6f 20  NION ALL of two 
30010 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 0a 2a 2a  or more terms.**
30020 20 20 20 2a 20 20 54 68 65 72 65 20 69 73 20 6e     *  There is n
30030 6f 20 57 48 45 52 45 20 6f 72 20 47 52 4f 55 50  o WHERE or GROUP
30040 20 42 59 20 6f 72 20 48 41 56 49 4e 47 20 63 6c   BY or HAVING cl
30050 61 75 73 65 73 20 6f 6e 20 74 68 65 20 73 75 62  auses on the sub
30060 71 75 65 72 69 65 73 0a 2a 2a 20 20 20 2a 20 20  queries.**   *  
30070 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
30080 69 73 20 61 20 73 69 6d 70 6c 65 20 63 6f 75 6e  is a simple coun
30090 74 28 2a 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  t(*).**.** Retur
300a0 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6f 70  n TRUE if the op
300b0 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 6e  timization is un
300c0 64 65 72 74 61 6b 65 6e 2e 0a 2a 2f 0a 73 74 61  dertaken..*/.sta
300d0 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 4f 66 56  tic int countOfV
300e0 69 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28  iewOptimization(
300f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
30100 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 65 6c  elect *p){.  Sel
30110 65 63 74 20 2a 70 53 75 62 2c 20 2a 70 50 72 69  ect *pSub, *pPri
30120 6f 72 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70  or;.  Expr *pExp
30130 72 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f 75 6e  r;.  Expr *pCoun
30140 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
30150 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  ;.  if( (p->selF
30160 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
30170 61 74 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ate)==0 ) return
30180 20 30 3b 20 20 20 2f 2a 20 54 68 69 73 20 69 73   0;   /* This is
30190 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f   an aggregate */
301a0 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74  .  if( p->pEList
301b0 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74  ->nExpr!=1 ) ret
301c0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
301d0 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 72       /* Single r
301e0 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  esult column */.
301f0 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c    pExpr = p->pEL
30200 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
30210 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
30220 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  !=TK_AGG_FUNCTIO
30230 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  N ) return 0;   
30240 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 69       /* Result i
30250 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a  s an aggregate *
30260 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  /.  if( sqlite3_
30270 73 74 72 69 63 6d 70 28 70 45 78 70 72 2d 3e 75  stricmp(pExpr->u
30280 2e 7a 54 6f 6b 65 6e 2c 22 63 6f 75 6e 74 22 29  .zToken,"count")
30290 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
302a0 20 49 73 20 63 6f 75 6e 74 28 29 20 2a 2f 0a 20   Is count() */. 
302b0 20 69 66 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c   if( pExpr->x.pL
302c0 69 73 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20  ist!=0 ) return 
302d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
302e0 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f     /* Must be co
302f0 75 6e 74 28 2a 29 20 2a 2f 0a 20 20 69 66 28 20  unt(*) */.  if( 
30300 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  p->pSrc->nSrc!=1
30310 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
30320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30330 20 4f 6e 65 20 74 61 62 6c 65 20 69 6e 20 46 52   One table in FR
30340 4f 4d 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20  OM  */.  pSub = 
30350 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  p->pSrc->a[0].pS
30360 65 6c 65 63 74 3b 0a 20 20 69 66 28 20 70 53 75  elect;.  if( pSu
30370 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  b==0 ) return 0;
30380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
303a0 65 20 46 52 4f 4d 20 69 73 20 61 20 73 75 62 71  e FROM is a subq
303b0 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 70 53  uery */.  if( pS
303c0 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20  ub->pPrior==0 ) 
303d0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
303e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
303f0 75 73 74 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e  ust be a compoun
30400 64 20 72 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20  d ry */.  do{.  
30410 20 20 69 66 28 20 70 53 75 62 2d 3e 6f 70 21 3d    if( pSub->op!=
30420 54 4b 5f 41 4c 4c 20 26 26 20 70 53 75 62 2d 3e  TK_ALL && pSub->
30430 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20  pPrior ) return 
30440 30 3b 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 55  0;  /* Must be U
30450 4e 49 4f 4e 20 41 4c 4c 20 2a 2f 0a 20 20 20 20  NION ALL */.    
30460 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65  if( pSub->pWhere
30470 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
30480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30490 20 20 2f 2a 20 4e 6f 20 57 48 45 52 45 20 63 6c    /* No WHERE cl
304a0 61 75 73 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  ause */.    if( 
304b0 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
304c0 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 20   SF_Aggregate ) 
304d0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a  return 0;     /*
304e0 20 4e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   Not an aggregat
304f0 65 20 2a 2f 0a 20 20 20 20 70 53 75 62 20 3d 20  e */.    pSub = 
30500 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 20 20  pSub->pPrior;   
30510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30520 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
30530 70 65 61 74 20 6f 76 65 72 20 63 6f 6d 70 6f 75  peat over compou
30540 6e 64 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20  nd */.  }while( 
30550 70 53 75 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  pSub );..  /* If
30560 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
30570 6f 69 6e 74 20 74 68 65 6e 20 69 74 20 69 73 20  oint then it is 
30580 4f 4b 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68  OK to perform th
30590 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  e transformation
305a0 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 50 61 72   */..  db = pPar
305b0 73 65 2d 3e 64 62 3b 0a 20 20 70 43 6f 75 6e 74  se->db;.  pCount
305c0 20 3d 20 70 45 78 70 72 3b 0a 20 20 70 45 78 70   = pExpr;.  pExp
305d0 72 20 3d 20 30 3b 0a 20 20 70 53 75 62 20 3d 20  r = 0;.  pSub = 
305e0 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  p->pSrc->a[0].pS
305f0 65 6c 65 63 74 3b 0a 20 20 70 2d 3e 70 53 72 63  elect;.  p->pSrc
30600 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 3d  ->a[0].pSelect =
30610 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63   0;.  sqlite3Src
30620 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
30630 2d 3e 70 53 72 63 29 3b 0a 20 20 70 2d 3e 70 53  ->pSrc);.  p->pS
30640 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  rc = sqlite3DbMa
30650 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
30660 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 2d 3e  >db, sizeof(*p->
30670 70 53 72 63 29 29 3b 0a 20 20 77 68 69 6c 65 28  pSrc));.  while(
30680 20 70 53 75 62 20 29 7b 0a 20 20 20 20 45 78 70   pSub ){.    Exp
30690 72 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 70 50  r *pTerm;.    pP
306a0 72 69 6f 72 20 3d 20 70 53 75 62 2d 3e 70 50 72  rior = pSub->pPr
306b0 69 6f 72 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70  ior;.    pSub->p
306c0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  Prior = 0;.    p
306d0 53 75 62 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  Sub->pNext = 0;.
306e0 20 20 20 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61      pSub->selFla
306f0 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61  gs |= SF_Aggrega
30700 74 65 3b 0a 20 20 20 20 70 53 75 62 2d 3e 73 65  te;.    pSub->se
30710 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f  lFlags &= ~SF_Co
30720 6d 70 6f 75 6e 64 3b 0a 20 20 20 20 70 53 75 62  mpound;.    pSub
30730 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30  ->nSelectRow = 0
30740 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
30750 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
30760 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
30770 20 20 20 70 54 65 72 6d 20 3d 20 70 50 72 69 6f     pTerm = pPrio
30780 72 20 3f 20 73 71 6c 69 74 65 33 45 78 70 72 44  r ? sqlite3ExprD
30790 75 70 28 64 62 2c 20 70 43 6f 75 6e 74 2c 20 30  up(db, pCount, 0
307a0 29 20 3a 20 70 43 6f 75 6e 74 3b 0a 20 20 20 20  ) : pCount;.    
307b0 70 53 75 62 2d 3e 70 45 4c 69 73 74 20 3d 20 73  pSub->pEList = s
307c0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
307d0 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
307e0 70 54 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72  pTerm);.    pTer
307f0 6d 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  m = sqlite3PExpr
30800 28 70 50 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45  (pParse, TK_SELE
30810 43 54 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  CT, 0, 0);.    s
30820 71 6c 69 74 65 33 50 45 78 70 72 41 64 64 53 65  qlite3PExprAddSe
30830 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 65  lect(pParse, pTe
30840 72 6d 2c 20 70 53 75 62 29 3b 0a 20 20 20 20 69  rm, pSub);.    i
30850 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20  f( pExpr==0 ){. 
30860 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 54 65       pExpr = pTe
30870 72 6d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  rm;.    }else{. 
30880 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
30890 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
308a0 2c 20 54 4b 5f 50 4c 55 53 2c 20 70 54 65 72 6d  , TK_PLUS, pTerm
308b0 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  , pExpr);.    }.
308c0 20 20 20 20 70 53 75 62 20 3d 20 70 50 72 69 6f      pSub = pPrio
308d0 72 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 45 4c 69  r;.  }.  p->pELi
308e0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 20 3d  st->a[0].pExpr =
308f0 20 70 45 78 70 72 3b 0a 20 20 70 2d 3e 73 65 6c   pExpr;.  p->sel
30900 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 41 67 67  Flags &= ~SF_Agg
30910 72 65 67 61 74 65 3b 0a 0a 23 69 66 20 53 45 4c  regate;..#if SEL
30920 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
30930 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
30940 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30  lectTrace & 0x40
30950 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54  0 ){.    SELECTT
30960 52 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73  RACE(0x400,pPars
30970 65 2c 70 2c 28 22 41 66 74 65 72 20 63 6f 75 6e  e,p,("After coun
30980 74 2d 6f 66 2d 76 69 65 77 20 6f 70 74 69 6d 69  t-of-view optimi
30990 7a 61 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20  zation:\n"));.  
309a0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
309b0 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
309c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
309d0 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
309e0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 55 4e  f /* SQLITE_COUN
309f0 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41  TOFVIEW_OPTIMIZA
30a00 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  TION */../*.** G
30a10 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
30a20 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
30a30 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74  ement given in t
30a40 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20  he p argument.  
30a50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
30a60 74 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20  ts are returned 
30a70 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
30a80 20 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75   SelectDest stru
30a90 63 74 75 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f  cture..** See co
30aa0 6d 6d 65 6e 74 73 20 69 6e 20 73 71 6c 69 74 65  mments in sqlite
30ab0 49 6e 74 2e 68 20 66 6f 72 20 66 75 72 74 68 65  Int.h for furthe
30ac0 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  r information..*
30ad0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
30ae0 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  e returns the nu
30af0 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
30b00 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61   If any errors a
30b10 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65  re.** encountere
30b20 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f  d, then an appro
30b30 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73  priate error mes
30b40 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a  sage is left in.
30b50 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  ** pParse->zErrM
30b60 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  sg..**.** This r
30b70 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20  outine does NOT 
30b80 66 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20  free the Select 
30b90 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
30ba0 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c   in.  The.** cal
30bb0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65  ling function ne
30bc0 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  eds to do that..
30bd0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
30be0 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
30bf0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
30c00 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
30c10 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
30c20 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
30c30 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
30c40 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
30c50 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63  oded. */.  Selec
30c60 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
30c70 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
30c80 77 69 74 68 20 74 68 65 20 71 75 65 72 79 20 72  with the query r
30c90 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
30ca0 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
30cb0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
30cc0 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72  unters */.  Wher
30cd0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
30ce0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f     /* Return fro
30cf0 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  m sqlite3WhereBe
30d00 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20  gin() */.  Vdbe 
30d10 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
30d20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
30d30 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63   machine under c
30d40 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
30d50 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20   int isAgg;     
30d60 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
30d70 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73  for select lists
30d80 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22   like "count(*)"
30d90 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
30da0 70 45 4c 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20  pEList = 0;  /* 
30db0 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  List of columns 
30dc0 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20  to extract. */. 
30dd0 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
30de0 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  st;     /* List 
30df0 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c  of tables to sel
30e00 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78  ect from */.  Ex
30e10 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
30e20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
30e30 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  E clause.  May b
30e40 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
30e50 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20  List *pGroupBy; 
30e60 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20     /* The GROUP 
30e70 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
30e80 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
30e90 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20  r *pHaving;     
30ea0 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e      /* The HAVIN
30eb0 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  G clause.  May b
30ec0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
30ed0 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  rc = 1;         
30ee0 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
30ef0 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20  eturn from this 
30f00 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69  function */.  Di
30f10 73 74 69 6e 63 74 43 74 78 20 73 44 69 73 74 69  stinctCtx sDisti
30f20 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20  nct; /* Info on 
30f30 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20  how to code the 
30f40 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
30f50 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 73 53   */.  SortCtx sS
30f60 6f 72 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ort;         /* 
30f70 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63  Info on how to c
30f80 6f 64 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ode the ORDER BY
30f90 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 41 67 67   clause */.  Agg
30fa0 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20  Info sAggInfo;  
30fb0 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
30fc0 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67 72 65  on used by aggre
30fd0 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a  gate queries */.
30fe0 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20    int iEnd;     
30ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
31000 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f  ess of the end o
31010 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20  f the query */. 
31020 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
31030 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
31040 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
31050 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  on */.  ExprList
31060 20 2a 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79   *pMinMaxOrderBy
31070 20 3d 20 30 3b 20 20 2f 2a 20 41 64 64 65 64 20   = 0;  /* Added 
31080 4f 52 44 45 52 20 42 59 20 66 6f 72 20 6d 69 6e  ORDER BY for min
31090 2f 6d 61 78 20 71 75 65 72 69 65 73 20 2a 2f 0a  /max queries */.
310a0 20 20 75 38 20 6d 69 6e 4d 61 78 46 6c 61 67 3b    u8 minMaxFlag;
310b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
310c0 20 2f 2a 20 46 6c 61 67 20 66 6f 72 20 6d 69 6e   /* Flag for min
310d0 2f 6d 61 78 20 71 75 65 72 69 65 73 20 2a 2f 0a  /max queries */.
310e0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
310f0 64 62 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  db;.  v = sqlite
31100 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
31110 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
31120 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
31130 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
31140 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
31150 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
31160 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
31170 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45  rse, SQLITE_SELE
31180 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72  CT, 0, 0, 0) ) r
31190 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65  eturn 1;.  memse
311a0 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20  t(&sAggInfo, 0, 
311b0 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29  sizeof(sAggInfo)
311c0 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  );.#if SELECTTRA
311d0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 53 45 4c  CE_ENABLED.  SEL
311e0 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73  ECTTRACE(1,pPars
311f0 65 2c 70 2c 20 28 22 62 65 67 69 6e 20 70 72 6f  e,p, ("begin pro
31200 63 65 73 73 69 6e 67 3a 5c 6e 22 2c 20 70 50 61  cessing:\n", pPa
31210 72 73 65 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e  rse->addrExplain
31220 29 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ));.  if( sqlite
31230 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
31240 78 31 30 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x100 ){.    sqli
31250 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
31260 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a  t(0, p, 0);.  }.
31270 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
31280 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
31290 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
312a0 21 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29  !=SRT_DistFifo )
312b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
312c0 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44  OrderBy==0 || pD
312d0 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
312e0 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  Fifo );.  assert
312f0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
31300 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
31310 21 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20  !=SRT_DistQueue 
31320 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
31330 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70  pOrderBy==0 || p
31340 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54  Dest->eDest!=SRT
31350 5f 51 75 65 75 65 20 29 3b 0a 20 20 69 66 28 20  _Queue );.  if( 
31360 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
31370 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 61  (pDest) ){.    a
31380 73 73 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65  ssert(pDest->eDe
31390 73 74 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c  st==SRT_Exists |
313a0 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
313b0 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20  SRT_Union || .  
313c0 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e           pDest->
313d0 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70  eDest==SRT_Excep
313e0 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  t || pDest->eDes
313f0 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 7c  t==SRT_Discard |
31400 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65  |.           pDe
31410 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 51  st->eDest==SRT_Q
31420 75 65 75 65 20 20 7c 7c 20 70 44 65 73 74 2d 3e  ueue  || pDest->
31430 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46  eDest==SRT_DistF
31440 69 66 6f 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ifo ||.         
31450 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
31460 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 7c 7c  SRT_DistQueue ||
31470 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
31480 52 54 5f 46 69 66 6f 29 3b 0a 20 20 20 20 2f 2a  RT_Fifo);.    /*
31490 20 49 66 20 4f 52 44 45 52 20 42 59 20 6d 61 6b   If ORDER BY mak
314a0 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65  es no difference
314b0 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 74   in the output t
314c0 68 65 6e 20 6e 65 69 74 68 65 72 20 64 6f 65 73  hen neither does
314d0 0a 20 20 20 20 2a 2a 20 44 49 53 54 49 4e 43 54  .    ** DISTINCT
314e0 20 73 6f 20 69 74 20 63 61 6e 20 62 65 20 72 65   so it can be re
314f0 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20  moved too. */.  
31500 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
31510 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
31520 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 2d  OrderBy);.    p-
31530 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
31540 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26     p->selFlags &
31550 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a  = ~SF_Distinct;.
31560 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c    }.  sqlite3Sel
31570 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20  ectPrep(pParse, 
31580 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61  p, 0);.  if( pPa
31590 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
315a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
315b0 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
315c0 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65  _end;.  }.  asse
315d0 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30  rt( p->pEList!=0
315e0 20 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52   );.#if SELECTTR
315f0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
31600 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
31610 72 61 63 65 20 26 20 30 78 31 30 34 20 29 7b 0a  race & 0x104 ){.
31620 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
31630 30 78 31 30 34 2c 70 50 61 72 73 65 2c 70 2c 20  0x104,pParse,p, 
31640 28 22 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73  ("after name res
31650 6f 6c 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20  olution:\n"));. 
31660 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
31670 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
31680 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
31690 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73   if( pDest->eDes
316a0 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
316b0 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c  .    generateCol
316c0 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
316d0 20 70 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65   p);.  }..#ifnde
316e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
316f0 4e 44 4f 57 46 55 4e 43 0a 20 20 69 66 28 20 73  NDOWFUNC.  if( s
31700 71 6c 69 74 65 33 57 69 6e 64 6f 77 52 65 77 72  qlite3WindowRewr
31710 69 74 65 28 70 50 61 72 73 65 2c 20 70 29 20 29  ite(pParse, p) )
31720 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  {.    goto selec
31730 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 69 66 20 53  t_end;.  }.#if S
31740 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
31750 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
31760 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78  SelectTrace & 0x
31770 31 30 38 20 29 7b 0a 20 20 20 20 53 45 4c 45 43  108 ){.    SELEC
31780 54 54 52 41 43 45 28 30 78 31 30 34 2c 70 50 61  TTRACE(0x104,pPa
31790 72 73 65 2c 70 2c 20 28 22 61 66 74 65 72 20 77  rse,p, ("after w
317a0 69 6e 64 6f 77 20 72 65 77 72 69 74 65 3a 5c 6e  indow rewrite:\n
317b0 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
317c0 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
317d0 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , p, 0);.  }.#en
317e0 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
317f0 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
31800 46 55 4e 43 20 2a 2f 0a 20 20 70 54 61 62 4c 69  FUNC */.  pTabLi
31810 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
31820 69 73 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46  isAgg = (p->selF
31830 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
31840 61 74 65 29 21 3d 30 3b 0a 20 20 6d 65 6d 73 65  ate)!=0;.  memse
31850 74 28 26 73 53 6f 72 74 2c 20 30 2c 20 73 69 7a  t(&sSort, 0, siz
31860 65 6f 66 28 73 53 6f 72 74 29 29 3b 0a 20 20 73  eof(sSort));.  s
31870 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
31880 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20  p->pOrderBy;..  
31890 2f 2a 20 54 72 79 20 74 6f 20 76 61 72 69 6f 75  /* Try to variou
318a0 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  s optimizations 
318b0 28 66 6c 61 74 74 65 6e 69 6e 67 20 73 75 62 71  (flattening subq
318c0 75 65 72 69 65 73 2c 20 61 6e 64 20 73 74 72 65  ueries, and stre
318d0 6e 67 74 68 0a 20 20 2a 2a 20 72 65 64 75 63 74  ngth.  ** reduct
318e0 69 6f 6e 20 6f 66 20 6a 6f 69 6e 20 6f 70 65 72  ion of join oper
318f0 61 74 6f 72 73 29 20 69 6e 20 74 68 65 20 46 52  ators) in the FR
31900 4f 4d 20 63 6c 61 75 73 65 20 75 70 20 69 6e 74  OM clause up int
31910 6f 20 74 68 65 20 6d 61 69 6e 20 71 75 65 72 79  o the main query
31920 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  .  */.#if !defin
31930 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
31940 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
31950 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
31960 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30  _VIEW).  for(i=0
31970 3b 20 21 70 2d 3e 70 50 72 69 6f 72 20 26 26 20  ; !p->pPrior && 
31980 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
31990 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
319a0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
319b0 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  *pItem = &pTabLi
319c0 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65  st->a[i];.    Se
319d0 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74  lect *pSub = pIt
319e0 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  em->pSelect;.   
319f0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
31a00 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 0a 20 20 20  Item->pTab;..   
31a10 20 2f 2a 20 43 6f 6e 76 65 72 74 20 4c 45 46 54   /* Convert LEFT
31a20 20 4a 4f 49 4e 20 69 6e 74 6f 20 4a 4f 49 4e 20   JOIN into JOIN 
31a30 69 66 20 74 68 65 72 65 20 61 72 65 20 74 65 72  if there are ter
31a40 6d 73 20 6f 66 20 74 68 65 20 72 69 67 68 74 20  ms of the right 
31a50 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 6f 66 20  table.    ** of 
31a60 74 68 65 20 4c 45 46 54 20 4a 4f 49 4e 20 75 73  the LEFT JOIN us
31a70 65 64 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ed in the WHERE 
31a80 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  clause..    */. 
31a90 20 20 20 69 66 28 20 28 70 49 74 65 6d 2d 3e 66     if( (pItem->f
31aa0 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  g.jointype & JT_
31ab0 4c 45 46 54 29 21 3d 30 0a 20 20 20 20 20 26 26  LEFT)!=0.     &&
31ac0 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c   sqlite3ExprImpl
31ad0 69 65 73 4e 6f 6e 4e 75 6c 6c 52 6f 77 28 70 2d  iesNonNullRow(p-
31ae0 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e  >pWhere, pItem->
31af0 69 43 75 72 73 6f 72 29 0a 20 20 20 20 20 26 26  iCursor).     &&
31b00 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
31b10 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
31b20 53 69 6d 70 6c 69 66 79 4a 6f 69 6e 29 0a 20 20  SimplifyJoin).  
31b30 20 20 29 7b 0a 20 20 20 20 20 20 53 45 4c 45 43    ){.      SELEC
31b40 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61  TTRACE(0x100,pPa
31b50 72 73 65 2c 70 2c 0a 20 20 20 20 20 20 20 20 20  rse,p,.         
31b60 20 20 20 20 20 20 20 28 22 4c 45 46 54 2d 4a 4f         ("LEFT-JO
31b70 49 4e 20 73 69 6d 70 6c 69 66 69 65 73 20 74 6f  IN simplifies to
31b80 20 4a 4f 49 4e 20 6f 6e 20 74 65 72 6d 20 25 64   JOIN on term %d
31b90 5c 6e 22 2c 69 29 29 3b 0a 20 20 20 20 20 20 70  \n",i));.      p
31ba0 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  Item->fg.jointyp
31bb0 65 20 26 3d 20 7e 28 4a 54 5f 4c 45 46 54 7c 4a  e &= ~(JT_LEFT|J
31bc0 54 5f 4f 55 54 45 52 29 3b 0a 20 20 20 20 20 20  T_OUTER);.      
31bd0 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d  unsetJoinExpr(p-
31be0 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e  >pWhere, pItem->
31bf0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a  iCursor);.    }.
31c00 0a 20 20 20 20 2f 2a 20 4e 6f 20 66 75 74 68 65  .    /* No futhe
31c10 72 20 61 63 74 69 6f 6e 20 69 66 20 74 68 69 73  r action if this
31c20 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f   term of the FRO
31c30 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 20 61  M clause is no a
31c40 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20   subquery */.   
31c50 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63   if( pSub==0 ) c
31c60 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
31c70 20 43 61 74 63 68 20 6d 69 73 6d 61 74 63 68 20   Catch mismatch 
31c80 69 6e 20 74 68 65 20 64 65 63 6c 61 72 65 64 20  in the declared 
31c90 63 6f 6c 75 6d 6e 73 20 6f 66 20 61 20 76 69 65  columns of a vie
31ca0 77 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  w and the number
31cb0 20 6f 66 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d   of.    ** colum
31cc0 6e 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54  ns in the SELECT
31cd0 20 6f 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20   on the RHS */. 
31ce0 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f     if( pTab->nCo
31cf0 6c 21 3d 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d  l!=pSub->pEList-
31d00 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
31d10 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
31d20 70 50 61 72 73 65 2c 20 22 65 78 70 65 63 74 65  pParse, "expecte
31d30 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 66 6f 72  d %d columns for
31d40 20 27 25 73 27 20 62 75 74 20 67 6f 74 20 25 64   '%s' but got %d
31d50 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
31d60 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e           pTab->n
31d70 43 6f 6c 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  Col, pTab->zName
31d80 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  , pSub->pEList->
31d90 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 67 6f  nExpr);.      go
31da0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
31db0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20     }..    /* Do 
31dc0 6e 6f 74 20 74 72 79 20 74 6f 20 66 6c 61 74 74  not try to flatt
31dd0 65 6e 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  en an aggregate 
31de0 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a  subquery..    **
31df0 0a 20 20 20 20 2a 2a 20 46 6c 61 74 74 65 6e 69  .    ** Flatteni
31e00 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ng an aggregate 
31e10 73 75 62 71 75 65 72 79 20 69 73 20 6f 6e 6c 79  subquery is only
31e20 20 70 6f 73 73 69 62 6c 65 20 69 66 20 74 68 65   possible if the
31e30 20 6f 75 74 65 72 20 71 75 65 72 79 0a 20 20 20   outer query.   
31e40 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69   ** is not a joi
31e50 6e 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6f  n.  But if the o
31e60 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
31e70 74 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74  t a join, then t
31e80 68 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20  he subquery.    
31e90 2a 2a 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 65  ** will be imple
31ea0 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72  mented as a co-r
31eb0 6f 75 74 69 6e 65 20 61 6e 64 20 74 68 65 72 65  outine and there
31ec0 20 69 73 20 6e 6f 20 61 64 76 61 6e 74 61 67 65   is no advantage
31ed0 20 74 6f 0a 20 20 20 20 2a 2a 20 66 6c 61 74 74   to.    ** flatt
31ee0 65 6e 69 6e 67 20 69 6e 20 74 68 61 74 20 63 61  ening in that ca
31ef0 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
31f00 66 28 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61  f( (pSub->selFla
31f10 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
31f20 65 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  e)!=0 ) continue
31f30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  ;.    assert( pS
31f40 75 62 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20  ub->pGroupBy==0 
31f50 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
31f60 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 6f  e outer query co
31f70 6e 74 61 69 6e 73 20 61 20 22 63 6f 6d 70 6c 65  ntains a "comple
31f80 78 22 20 72 65 73 75 6c 74 20 73 65 74 20 28 74  x" result set (t
31f90 68 61 74 20 69 73 2c 0a 20 20 20 20 2a 2a 20 69  hat is,.    ** i
31fa0 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
31fb0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
31fc0 65 72 79 20 75 73 65 73 20 66 75 6e 63 74 69 6f  ery uses functio
31fd0 6e 73 20 6f 72 20 73 75 62 71 75 65 72 69 65 73  ns or subqueries
31fe0 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20  ).    ** and if 
31ff0 74 68 65 20 73 75 62 71 75 65 72 79 20 63 6f 6e  the subquery con
32000 74 61 69 6e 73 20 61 6e 20 4f 52 44 45 52 20 42  tains an ORDER B
32010 59 20 63 6c 61 75 73 65 20 61 6e 64 20 69 66 0a  Y clause and if.
32020 20 20 20 20 2a 2a 20 69 74 20 77 69 6c 6c 20 62      ** it will b
32030 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  e implemented as
32040 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 2c 20 74   a co-routine, t
32050 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74  hen do not flatt
32060 65 6e 2e 20 20 54 68 69 73 0a 20 20 20 20 2a 2a  en.  This.    **
32070 20 72 65 73 74 72 69 63 74 69 6f 6e 20 61 6c 6c   restriction all
32080 6f 77 73 20 53 51 4c 20 63 6f 6e 73 74 72 75 63  ows SQL construc
32090 74 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20  ts like this:.  
320a0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 53 45 4c    **.    **  SEL
320b0 45 43 54 20 65 78 70 65 6e 73 69 76 65 5f 66 75  ECT expensive_fu
320c0 6e 63 74 69 6f 6e 28 78 29 0a 20 20 20 20 2a 2a  nction(x).    **
320d0 20 20 20 20 46 52 4f 4d 20 28 53 45 4c 45 43 54      FROM (SELECT
320e0 20 78 20 46 52 4f 4d 20 74 61 62 20 4f 52 44 45   x FROM tab ORDE
320f0 52 20 42 59 20 79 20 4c 49 4d 49 54 20 31 30 29  R BY y LIMIT 10)
32100 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
32110 54 68 65 20 65 78 70 65 6e 73 69 76 65 5f 66 75  The expensive_fu
32120 6e 63 74 69 6f 6e 28 29 20 69 73 20 6f 6e 6c 79  nction() is only
32130 20 63 6f 6d 70 75 74 65 64 20 6f 6e 20 74 68 65   computed on the
32140 20 31 30 20 72 6f 77 73 20 74 68 61 74 0a 20 20   10 rows that.  
32150 20 20 2a 2a 20 61 72 65 20 6f 75 74 70 75 74 2c    ** are output,
32160 20 72 61 74 68 65 72 20 74 68 61 6e 20 65 76 65   rather than eve
32170 72 79 20 72 6f 77 20 6f 66 20 74 68 65 20 74 61  ry row of the ta
32180 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ble..    **.    
32190 2a 2a 20 54 68 65 20 72 65 71 75 69 72 65 6d 65  ** The requireme
321a0 6e 74 20 74 68 61 74 20 74 68 65 20 6f 75 74 65  nt that the oute
321b0 72 20 71 75 65 72 79 20 68 61 76 65 20 61 20 63  r query have a c
321c0 6f 6d 70 6c 65 78 20 72 65 73 75 6c 74 20 73 65  omplex result se
321d0 74 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 74  t.    ** means t
321e0 68 61 74 20 66 6c 61 74 74 65 6e 69 6e 67 20 64  hat flattening d
321f0 6f 65 73 20 6f 63 63 75 72 20 6f 6e 20 73 69 6d  oes occur on sim
32200 70 6c 65 72 20 53 51 4c 20 63 6f 6e 73 74 72 61  pler SQL constra
32210 69 6e 74 73 20 77 69 74 68 6f 75 74 0a 20 20 20  ints without.   
32220 20 2a 2a 20 74 68 65 20 65 78 70 65 6e 73 69 76   ** the expensiv
32230 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20 6c 69 6b  e_function() lik
32240 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
32250 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20    SELECT x FROM 
32260 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74  (SELECT x FROM t
32270 61 62 20 4f 52 44 45 52 20 42 59 20 79 20 4c 49  ab ORDER BY y LI
32280 4d 49 54 20 31 30 29 3b 0a 20 20 20 20 2a 2f 0a  MIT 10);.    */.
32290 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f      if( pSub->pO
322a0 72 64 65 72 42 79 21 3d 30 0a 20 20 20 20 20 26  rderBy!=0.     &
322b0 26 20 69 3d 3d 30 0a 20 20 20 20 20 26 26 20 28  & i==0.     && (
322c0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
322d0 5f 43 6f 6d 70 6c 65 78 52 65 73 75 6c 74 29 21  _ComplexResult)!
322e0 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 61 62  =0.     && (pTab
322f0 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20  List->nSrc==1.  
32300 20 20 20 20 20 20 20 7c 7c 20 28 70 54 61 62 4c         || (pTabL
32310 69 73 74 2d 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69  ist->a[1].fg.joi
32320 6e 74 79 70 65 26 28 4a 54 5f 4c 45 46 54 7c 4a  ntype&(JT_LEFT|J
32330 54 5f 43 52 4f 53 53 29 29 21 3d 30 29 0a 20 20  T_CROSS))!=0).  
32340 20 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69    ){.      conti
32350 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nue;.    }..    
32360 69 66 28 20 66 6c 61 74 74 65 6e 53 75 62 71 75  if( flattenSubqu
32370 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ery(pParse, p, i
32380 2c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20  , isAgg) ){.    
32390 20 20 2f 2a 20 54 68 69 73 20 73 75 62 71 75 65    /* This subque
323a0 72 79 20 63 61 6e 20 62 65 20 61 62 73 6f 72 62  ry can be absorb
323b0 65 64 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65  ed into its pare
323c0 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 20 3d  nt. */.      i =
323d0 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   -1;.    }.    p
323e0 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
323f0 63 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  c;.    if( db->m
32400 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
32410 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
32420 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c     if( !Ignorabl
32430 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20  eOrderby(pDest) 
32440 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70  ){.      sSort.p
32450 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
32460 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  derBy;.    }.  }
32470 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
32480 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
32490 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f  POUND_SELECT.  /
324a0 2a 20 48 61 6e 64 6c 65 20 63 6f 6d 70 6f 75 6e  * Handle compoun
324b0 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
324c0 6e 74 73 20 75 73 69 6e 67 20 74 68 65 20 73 65  nts using the se
324d0 70 61 72 61 74 65 20 6d 75 6c 74 69 53 65 6c 65  parate multiSele
324e0 63 74 28 29 0a 20 20 2a 2a 20 70 72 6f 63 65 64  ct().  ** proced
324f0 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ure..  */.  if( 
32500 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
32510 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63   rc = multiSelec
32520 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65  t(pParse, p, pDe
32530 73 74 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  st);.#if SELECTT
32540 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
32550 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
32560 2c 70 50 61 72 73 65 2c 70 2c 28 22 65 6e 64 20  ,pParse,p,("end 
32570 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20  compound-select 
32580 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b  processing\n"));
32590 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69 74 65  .    if( (sqlite
325a0 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
325b0 78 32 30 30 30 29 21 3d 30 20 26 26 20 45 78 70  x2000)!=0 && Exp
325c0 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 50 61 72  lainQueryPlanPar
325d0 65 6e 74 28 70 50 61 72 73 65 29 3d 3d 30 20 29  ent(pParse)==0 )
325e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  {.      sqlite3T
325f0 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
32600 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65   p, 0);.    }.#e
32610 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 2d 3e  ndif.    if( p->
32620 70 4e 65 78 74 3d 3d 30 20 29 20 45 78 70 6c 61  pNext==0 ) Expla
32630 69 6e 51 75 65 72 79 50 6c 61 6e 50 6f 70 28 70  inQueryPlanPop(p
32640 50 61 72 73 65 29 3b 0a 20 20 20 20 72 65 74 75  Parse);.    retu
32650 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
32660 66 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68  f..  /* For each
32670 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f   term in the FRO
32680 4d 20 63 6c 61 75 73 65 2c 20 64 6f 20 74 77 6f  M clause, do two
32690 20 74 68 69 6e 67 73 3a 0a 20 20 2a 2a 20 28 31   things:.  ** (1
326a0 29 20 41 75 74 68 6f 72 69 7a 65 64 20 75 6e 72  ) Authorized unr
326b0 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 73  eferenced tables
326c0 0a 20 20 2a 2a 20 28 32 29 20 47 65 6e 65 72 61  .  ** (2) Genera
326d0 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20  te code for all 
326e0 73 75 62 2d 71 75 65 72 69 65 73 0a 20 20 2a 2f  sub-queries.  */
326f0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
32700 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
32710 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
32720 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
32730 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
32740 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74  a[i];.    Select
32750 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53  Dest dest;.    S
32760 65 6c 65 63 74 20 2a 70 53 75 62 3b 0a 23 69 66  elect *pSub;.#if
32770 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
32780 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
32790 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
327a0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20  TE_OMIT_VIEW).  
327b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
327c0 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b  avedAuthContext;
327d0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
327e0 49 73 73 75 65 20 53 51 4c 49 54 45 5f 52 45 41  Issue SQLITE_REA
327f0 44 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 73  D authorizations
32800 20 77 69 74 68 20 61 20 66 61 6b 65 20 63 6f 6c   with a fake col
32810 75 6d 6e 20 6e 61 6d 65 20 66 6f 72 20 61 6e 79  umn name for any
32820 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 74  .    ** tables t
32830 68 61 74 20 61 72 65 20 72 65 66 65 72 65 6e 63  hat are referenc
32840 65 64 20 62 75 74 20 66 72 6f 6d 20 77 68 69 63  ed but from whic
32850 68 20 6e 6f 20 76 61 6c 75 65 73 20 61 72 65 20  h no values are 
32860 65 78 74 72 61 63 74 65 64 2e 0a 20 20 20 20 2a  extracted..    *
32870 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68  * Examples of wh
32880 65 72 65 20 74 68 65 73 65 20 6b 69 6e 64 73 20  ere these kinds 
32890 6f 66 20 6e 75 6c 6c 20 53 51 4c 49 54 45 5f 52  of null SQLITE_R
328a0 45 41 44 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  EAD authorizatio
328b0 6e 73 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20  ns.    ** would 
328c0 6f 63 63 75 72 3a 0a 20 20 20 20 2a 2a 0a 20 20  occur:.    **.  
328d0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
328e0 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
328f0 3b 20 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52 45  ;   -- SQLITE_RE
32900 41 44 20 74 31 2e 22 22 0a 20 20 20 20 2a 2a 20  AD t1."".    ** 
32910 20 20 20 20 53 45 4c 45 43 54 20 74 31 2e 2a 20      SELECT t1.* 
32920 46 52 4f 4d 20 74 31 2c 20 74 32 3b 20 20 20 2d  FROM t1, t2;   -
32930 2d 20 53 51 4c 49 54 45 5f 52 45 41 44 20 74 32  - SQLITE_READ t2
32940 2e 22 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ."".    **.    *
32950 2a 20 54 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d  * The fake colum
32960 6e 20 6e 61 6d 65 20 69 73 20 61 6e 20 65 6d 70  n name is an emp
32970 74 79 20 73 74 72 69 6e 67 2e 20 20 49 74 20 69  ty string.  It i
32980 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  s possible for a
32990 20 74 61 62 6c 65 20 74 6f 0a 20 20 20 20 2a 2a   table to.    **
329a0 20 68 61 76 65 20 61 20 63 6f 6c 75 6d 6e 20 6e   have a column n
329b0 61 6d 65 64 20 62 79 20 74 68 65 20 65 6d 70 74  amed by the empt
329c0 79 20 73 74 72 69 6e 67 2c 20 69 6e 20 77 68 69  y string, in whi
329d0 63 68 20 63 61 73 65 20 74 68 65 72 65 20 69 73  ch case there is
329e0 20 6e 6f 20 77 61 79 20 74 6f 0a 20 20 20 20 2a   no way to.    *
329f0 2a 20 64 69 73 74 69 6e 67 75 69 73 68 20 62 65  * distinguish be
32a00 74 77 65 65 6e 20 61 6e 20 75 6e 72 65 66 65 72  tween an unrefer
32a10 65 6e 63 65 64 20 74 61 62 6c 65 20 61 6e 64 20  enced table and 
32a20 61 6e 20 61 63 74 75 61 6c 20 72 65 66 65 72 65  an actual refere
32a30 6e 63 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  nce to the.    *
32a40 2a 20 22 22 20 63 6f 6c 75 6d 6e 2e 20 54 68 65  * "" column. The
32a50 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e   original design
32a60 20 77 61 73 20 66 6f 72 20 74 68 65 20 66 61 6b   was for the fak
32a70 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 74 6f  e column name to
32a80 20 62 65 20 61 20 4e 55 4c 4c 2c 0a 20 20 20 20   be a NULL,.    
32a90 2a 2a 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62  ** which would b
32aa0 65 20 75 6e 61 6d 62 69 67 75 6f 75 73 2e 20 20  e unambiguous.  
32ab0 42 75 74 20 6c 65 67 61 63 79 20 61 75 74 68 6f  But legacy autho
32ac0 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63  rization callbac
32ad0 6b 73 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20  ks might.    ** 
32ae0 61 73 73 75 6d 65 20 74 68 65 20 63 6f 6c 75 6d  assume the colum
32af0 6e 20 6e 61 6d 65 20 69 73 20 6e 6f 6e 2d 4e 55  n name is non-NU
32b00 4c 4c 20 61 6e 64 20 73 65 67 66 61 75 6c 74 2e  LL and segfault.
32b10 20 20 54 68 65 20 75 73 65 20 6f 66 20 61 6e 20    The use of an 
32b20 65 6d 70 74 79 0a 20 20 20 20 2a 2a 20 73 74 72  empty.    ** str
32b30 69 6e 67 20 66 6f 72 20 74 68 65 20 66 61 6b 65  ing for the fake
32b40 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 73 65 65   column name see
32b50 6d 73 20 73 61 66 65 72 2e 0a 20 20 20 20 2a 2f  ms safer..    */
32b60 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
32b70 63 6f 6c 55 73 65 64 3d 3d 30 20 29 7b 0a 20 20  colUsed==0 ){.  
32b80 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 68 43      sqlite3AuthC
32b90 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
32ba0 49 54 45 5f 52 45 41 44 2c 20 70 49 74 65 6d 2d  ITE_READ, pItem-
32bb0 3e 7a 4e 61 6d 65 2c 20 22 22 2c 20 70 49 74 65  >zName, "", pIte
32bc0 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
32bd0 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e     }..#if !defin
32be0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
32bf0 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
32c00 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
32c10 5f 56 49 45 57 29 0a 20 20 20 20 2f 2a 20 47 65  _VIEW).    /* Ge
32c20 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
32c30 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20  all sub-queries 
32c40 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
32c50 73 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 53  se.    */.    pS
32c60 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c  ub = pItem->pSel
32c70 65 63 74 3b 0a 20 20 20 20 69 66 28 20 70 53 75  ect;.    if( pSu
32c80 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  b==0 ) continue;
32c90 0a 0a 20 20 20 20 2f 2a 20 53 6f 6d 65 74 69 6d  ..    /* Sometim
32ca0 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20  es the code for 
32cb0 61 20 73 75 62 71 75 65 72 79 20 77 69 6c 6c 20  a subquery will 
32cc0 62 65 20 67 65 6e 65 72 61 74 65 64 20 6d 6f 72  be generated mor
32cd0 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e  e than.    ** on
32ce0 63 65 2c 20 69 66 20 74 68 65 20 73 75 62 71 75  ce, if the subqu
32cf0 65 72 79 20 69 73 20 70 61 72 74 20 6f 66 20 74  ery is part of t
32d00 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
32d10 69 6e 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a  in a LEFT JOIN,.
32d20 20 20 20 20 2a 2a 20 66 6f 72 20 65 78 61 6d 70      ** for examp
32d30 6c 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  le.  In that cas
32d40 65 2c 20 64 6f 20 6e 6f 74 20 72 65 67 65 6e 65  e, do not regene
32d50 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f  rate the code to
32d60 20 6d 61 6e 69 66 65 73 74 0a 20 20 20 20 2a 2a   manifest.    **
32d70 20 61 20 76 69 65 77 20 6f 72 20 74 68 65 20 63   a view or the c
32d80 6f 2d 72 6f 75 74 69 6e 65 20 74 6f 20 69 6d 70  o-routine to imp
32d90 6c 65 6d 65 6e 74 20 61 20 76 69 65 77 2e 20 20  lement a view.  
32da0 54 68 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e  The first instan
32db0 63 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 75 66  ce.    ** is suf
32dc0 66 69 63 69 65 6e 74 2c 20 74 68 6f 75 67 68 20  ficient, though 
32dd0 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74  the subroutine t
32de0 6f 20 6d 61 6e 69 66 65 73 74 20 74 68 65 20 76  o manifest the v
32df0 69 65 77 20 64 6f 65 73 20 6e 65 65 64 0a 20 20  iew does need.  
32e00 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 6f 6b    ** to be invok
32e10 65 64 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20  ed again. */.   
32e20 20 69 66 28 20 70 49 74 65 6d 2d 3e 61 64 64 72   if( pItem->addr
32e30 46 69 6c 6c 53 75 62 20 29 7b 0a 20 20 20 20 20  FillSub ){.     
32e40 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 76   if( pItem->fg.v
32e50 69 61 43 6f 72 6f 75 74 69 6e 65 3d 3d 30 20 29  iaCoroutine==0 )
32e60 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
32e70 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
32e80 20 6d 61 6e 69 66 65 73 74 73 20 74 68 65 20 76   manifests the v
32e90 69 65 77 20 6d 69 67 68 74 20 62 65 20 61 20 6f  iew might be a o
32ea0 6e 65 2d 74 69 6d 65 20 72 6f 75 74 69 6e 65 2c  ne-time routine,
32eb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 69  .        ** or i
32ec0 74 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  t might need to 
32ed0 62 65 20 72 65 72 75 6e 20 6f 6e 20 65 61 63 68  be rerun on each
32ee0 20 69 74 65 72 61 74 69 6f 6e 20 62 65 63 61 75   iteration becau
32ef0 73 65 20 69 74 0a 20 20 20 20 20 20 20 20 2a 2a  se it.        **
32f00 20 65 6e 63 6f 64 65 73 20 61 20 63 6f 72 72 65   encodes a corre
32f10 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 2e 20  lated subquery. 
32f20 2a 2f 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  */.        testc
32f30 61 73 65 28 20 73 71 6c 69 74 65 33 56 64 62 65  ase( sqlite3Vdbe
32f40 47 65 74 4f 70 28 76 2c 20 70 49 74 65 6d 2d 3e  GetOp(v, pItem->
32f50 61 64 64 72 46 69 6c 6c 53 75 62 29 2d 3e 6f 70  addrFillSub)->op
32f60 63 6f 64 65 3d 3d 4f 50 5f 4f 6e 63 65 20 29 3b  code==OP_Once );
32f70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
32f80 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
32f90 5f 47 6f 73 75 62 2c 20 70 49 74 65 6d 2d 3e 72  _Gosub, pItem->r
32fa0 65 67 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d  egReturn, pItem-
32fb0 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20  >addrFillSub);. 
32fc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e       }.      con
32fd0 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  tinue;.    }..  
32fe0 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50    /* Increment P
32ff0 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20  arse.nHeight by 
33000 74 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68  the height of th
33010 65 20 6c 61 72 67 65 73 74 20 65 78 70 72 65 73  e largest expres
33020 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65  sion.    ** tree
33030 20 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20   referred to by 
33040 74 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74  this, the parent
33050 20 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69   select. The chi
33060 6c 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a  ld select.    **
33070 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70   may contain exp
33080 72 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66  ression trees of
33090 20 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20   at most.    ** 
330a0 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52  (SQLITE_MAX_EXPR
330b0 5f 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65  _DEPTH-Parse.nHe
330c0 69 67 68 74 29 20 68 65 69 67 68 74 2e 20 54 68  ight) height. Th
330d0 69 73 20 69 73 20 61 20 62 69 74 0a 20 20 20 20  is is a bit.    
330e0 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61  ** more conserva
330f0 74 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73  tive than necess
33100 61 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61  ary, but much ea
33110 73 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63  sier than enforc
33120 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78  ing.    ** an ex
33130 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a  act limit..    *
33140 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48  /.    pParse->nH
33150 65 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33  eight += sqlite3
33160 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74  SelectExprHeight
33170 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20  (p);..    /* Do 
33180 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 70 72 6f  the constant pro
33190 70 61 67 61 74 69 6f 6e 20 6f 70 74 69 6d 69 7a  pagation optimiz
331a0 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 28  ation */.    if(
331b0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
331c0 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
331d0 50 72 6f 70 61 67 61 74 65 43 6f 6e 73 74 29 0a  PropagateConst).
331e0 20 20 20 20 20 26 26 20 70 72 6f 70 61 67 61 74       && propagat
331f0 65 43 6f 6e 73 74 61 6e 74 73 28 70 50 61 72 73  eConstants(pPars
33200 65 2c 20 70 29 0a 20 20 20 20 29 7b 0a 23 69 66  e, p).    ){.#if
33210 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
33220 42 4c 45 44 0a 20 20 20 20 20 20 69 66 28 20 73  BLED.      if( s
33230 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
33240 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20  e & 0x100 ){.   
33250 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45       SELECTTRACE
33260 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x100,pParse,p,
33270 28 22 41 66 74 65 72 20 63 6f 6e 73 74 61 6e 74  ("After constant
33280 20 70 72 6f 70 61 67 61 74 69 6f 6e 3a 5c 6e 22   propagation:\n"
33290 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ));.        sqli
332a0 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
332b0 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20  t(0, p, 0);.    
332c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
332d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 53 45 4c 45  else{.      SELE
332e0 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50  CTTRACE(0x100,pP
332f0 61 72 73 65 2c 70 2c 28 22 43 6f 6e 73 74 61 6e  arse,p,("Constan
33300 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6e 6f  t propagation no
33310 74 20 70 6f 73 73 69 62 6c 65 5c 6e 22 29 29 3b  t possible\n"));
33320 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
33330 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 63 6f  ake copies of co
33340 6e 73 74 61 6e 74 20 57 48 45 52 45 2d 63 6c 61  nstant WHERE-cla
33350 75 73 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65  use terms in the
33360 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 77   outer query dow
33370 6e 0a 20 20 20 20 2a 2a 20 69 6e 73 69 64 65 20  n.    ** inside 
33380 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54  the subquery.  T
33390 68 69 73 20 63 61 6e 20 68 65 6c 70 20 74 68 65  his can help the
333a0 20 73 75 62 71 75 65 72 79 20 74 6f 20 72 75 6e   subquery to run
333b0 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 6c   more efficientl
333c0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
333d0 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  ( OptimizationEn
333e0 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
333f0 5f 50 75 73 68 44 6f 77 6e 29 0a 20 20 20 20 20  _PushDown).     
33400 26 26 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65  && pushDownWhere
33410 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20 70 53  Terms(pParse, pS
33420 75 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70  ub, p->pWhere, p
33430 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 0a 20  Item->iCursor,. 
33440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33450 20 20 20 20 20 20 20 20 20 20 28 70 49 74 65 6d            (pItem
33460 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20  ->fg.jointype & 
33470 4a 54 5f 4f 55 54 45 52 29 21 3d 30 29 0a 20 20  JT_OUTER)!=0).  
33480 20 20 29 7b 0a 23 69 66 20 53 45 4c 45 43 54 54    ){.#if SELECTT
33490 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
334a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
334b0 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30  lectTrace & 0x10
334c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 53 45 4c  0 ){.        SEL
334d0 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70  ECTTRACE(0x100,p
334e0 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20  Parse,p,("After 
334f0 57 48 45 52 45 2d 63 6c 61 75 73 65 20 70 75 73  WHERE-clause pus
33500 68 2d 64 6f 77 6e 3a 5c 6e 22 29 29 3b 0a 20 20  h-down:\n"));.  
33510 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
33520 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
33530 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  , 0);.      }.#e
33540 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
33550 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43        SELECTTRAC
33560 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70  E(0x100,pParse,p
33570 2c 28 22 50 75 73 68 2d 64 6f 77 6e 20 6e 6f 74  ,("Push-down not
33580 20 70 6f 73 73 69 62 6c 65 5c 6e 22 29 29 3b 0a   possible\n"));.
33590 20 20 20 20 7d 0a 0a 20 20 20 20 7a 53 61 76 65      }..    zSave
335a0 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  dAuthContext = p
335b0 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
335c0 65 78 74 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ext;.    pParse-
335d0 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
335e0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20  pItem->zName;.. 
335f0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
33600 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ode to implement
33610 20 74 68 65 20 73 75 62 71 75 65 72 79 0a 20 20   the subquery.  
33620 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
33630 73 75 62 71 75 65 72 79 20 69 73 20 69 6d 70 6c  subquery is impl
33640 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d  emented as a co-
33650 72 6f 75 74 69 6e 65 20 69 66 20 74 68 65 20 73  routine if the s
33660 75 62 71 75 65 72 79 20 69 73 0a 20 20 20 20 2a  ubquery is.    *
33670 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  * guaranteed to 
33680 62 65 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  be the outer loo
33690 70 20 28 73 6f 20 74 68 61 74 20 69 74 20 64 6f  p (so that it do
336a0 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
336b0 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 75 74 65  e.    ** compute
336c0 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65  d more than once
336d0 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
336e0 54 4f 44 4f 3a 20 41 72 65 20 74 68 65 72 65 20  TODO: Are there 
336f0 6f 74 68 65 72 20 72 65 61 73 6f 6e 73 20 62 65  other reasons be
33700 73 69 64 65 20 28 31 29 20 74 6f 20 75 73 65 20  side (1) to use 
33710 61 20 63 6f 2d 72 6f 75 74 69 6e 65 0a 20 20 20  a co-routine.   
33720 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   ** implementati
33730 6f 6e 3f 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on?.    */.    i
33740 66 28 20 69 3d 3d 30 0a 20 20 20 20 20 26 26 20  f( i==0.     && 
33750 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d  (pTabList->nSrc=
33760 3d 31 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  =1.            |
33770 7c 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31  | (pTabList->a[1
33780 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a  ].fg.jointype&(J
33790 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29  T_LEFT|JT_CROSS)
337a0 29 21 3d 30 29 20 20 2f 2a 20 28 31 29 20 2a 2f  )!=0)  /* (1) */
337b0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
337c0 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d   Implement a co-
337d0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
337e0 6c 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c  l return a singl
337f0 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73  e row of the res
33800 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74  ult.      ** set
33810 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74   on each invocat
33820 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
33830 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 20      int addrTop 
33840 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
33850 72 65 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a 20  rentAddr(v)+1;. 
33860 20 20 20 20 0a 20 20 20 20 20 20 70 49 74 65 6d      .      pItem
33870 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  ->regReturn = ++
33880 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
33890 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
338a0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74  ddOp3(v, OP_Init
338b0 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d  Coroutine, pItem
338c0 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 30 2c 20  ->regReturn, 0, 
338d0 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20  addrTop);.      
338e0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
338f0 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61  "%s", pItem->pTa
33900 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
33910 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c    pItem->addrFil
33920 6c 53 75 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a  lSub = addrTop;.
33930 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
33940 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
33950 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t, SRT_Coroutine
33960 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
33970 72 6e 29 3b 0a 20 20 20 20 20 20 45 78 70 6c 61  rn);.      Expla
33980 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
33990 72 73 65 2c 20 31 2c 20 22 43 4f 2d 52 4f 55 54  rse, 1, "CO-ROUT
339a0 49 4e 45 20 25 75 22 2c 20 70 53 75 62 2d 3e 73  INE %u", pSub->s
339b0 65 6c 49 64 29 29 3b 0a 20 20 20 20 20 20 73 71  elId));.      sq
339c0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
339d0 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
339e0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70  ;.      pItem->p
339f0 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
33a00 3d 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52  = pSub->nSelectR
33a10 6f 77 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  ow;.      pItem-
33a20 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
33a30 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65   = 1;.      pIte
33a40 6d 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 64  m->regResult = d
33a50 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 20 20 20  est.iSdst;.     
33a60 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43   sqlite3VdbeEndC
33a70 6f 72 6f 75 74 69 6e 65 28 76 2c 20 70 49 74 65  oroutine(v, pIte
33a80 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  m->regReturn);. 
33a90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
33aa0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
33ab0 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 73 71  Top-1);.      sq
33ac0 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65  lite3ClearTempRe
33ad0 67 43 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a  gCache(pParse);.
33ae0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33af0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
33b00 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77  ubroutine that w
33b10 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68 65  ill fill an ephe
33b20 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 74 68  meral table with
33b30 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  .      ** the co
33b40 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 73 75  ntent of this su
33b50 62 71 75 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e  bquery.  pItem->
33b60 61 64 64 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c  addrFillSub will
33b70 20 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20   point.      ** 
33b80 74 6f 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  to the address o
33b90 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  f the generated 
33ba0 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 70 49 74  subroutine.  pIt
33bb0 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20 20  em->regReturn.  
33bc0 20 20 20 20 2a 2a 20 69 73 20 61 20 72 65 67 69      ** is a regi
33bd0 73 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 74  ster allocated t
33be0 6f 20 68 6f 6c 64 20 74 68 65 20 73 75 62 72 6f  o hold the subro
33bf0 75 74 69 6e 65 20 72 65 74 75 72 6e 20 61 64 64  utine return add
33c00 72 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ress.      */.  
33c10 20 20 20 20 69 6e 74 20 74 6f 70 41 64 64 72 3b      int topAddr;
33c20 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 41  .      int onceA
33c30 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ddr = 0;.      i
33c40 6e 74 20 72 65 74 41 64 64 72 3b 0a 20 20 20 20  nt retAddr;.    
33c50 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
33c60 5f 69 74 65 6d 20 2a 70 50 72 69 6f 72 3b 0a 0a  _item *pPrior;..
33c70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
33c80 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
33c90 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74  ==0 );.      pIt
33ca0 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20  em->regReturn = 
33cb0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
33cc0 20 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20        topAddr = 
33cd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
33ce0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
33cf0 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65   0, pItem->regRe
33d00 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74  turn);.      pIt
33d10 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
33d20 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20  = topAddr+1;.   
33d30 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
33d40 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30  .isCorrelated==0
33d50 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
33d60 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
33d70 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64  s not correlated
33d80 20 61 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e   and if we are n
33d90 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20  ot inside of.   
33da0 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65       ** a trigge
33db0 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20  r, then we only 
33dc0 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  need to compute 
33dd0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
33de0 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 20 20   subquery.      
33df0 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20    ** once. */.  
33e00 20 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d        onceAddr =
33e10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
33e20 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20  p0(v, OP_Once); 
33e30 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
33e40 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
33e50 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69  ment((v, "materi
33e60 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70  alize \"%s\"", p
33e70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
33e80 65 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  e));.      }else
33e90 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4e 6f  {.        VdbeNo
33ea0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d  opComment((v, "m
33eb0 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c  aterialize \"%s\
33ec0 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  "", pItem->pTab-
33ed0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
33ee0 7d 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d  }.      pPrior =
33ef0 20 69 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28   isSelfJoinView(
33f00 70 54 61 62 4c 69 73 74 2c 20 70 49 74 65 6d 29  pTabList, pItem)
33f10 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69  ;.      if( pPri
33f20 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  or ){.        sq
33f30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
33f40 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70  v, OP_OpenDup, p
33f50 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70  Item->iCursor, p
33f60 50 72 69 6f 72 2d 3e 69 43 75 72 73 6f 72 29 3b  Prior->iCursor);
33f70 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
33f80 20 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74   pPrior->pSelect
33f90 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  !=0 );.        p
33fa0 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  Sub->nSelectRow 
33fb0 3d 20 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63  = pPrior->pSelec
33fc0 74 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  t->nSelectRow;. 
33fd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
33fe0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
33ff0 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
34000 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70   SRT_EphemTab, p
34010 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
34020 20 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51          ExplainQ
34030 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
34040 2c 20 31 2c 20 22 4d 41 54 45 52 49 41 4c 49 5a  , 1, "MATERIALIZ
34050 45 20 25 75 22 2c 20 70 53 75 62 2d 3e 73 65 6c  E %u", pSub->sel
34060 49 64 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Id));.        sq
34070 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
34080 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
34090 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
340a0 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f  pItem->pTab->nRo
340b0 77 4c 6f 67 45 73 74 20 3d 20 70 53 75 62 2d 3e  wLogEst = pSub->
340c0 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
340d0 20 20 69 66 28 20 6f 6e 63 65 41 64 64 72 20 29    if( onceAddr )
340e0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
340f0 48 65 72 65 28 76 2c 20 6f 6e 63 65 41 64 64 72  Here(v, onceAddr
34100 29 3b 0a 20 20 20 20 20 20 72 65 74 41 64 64 72  );.      retAddr
34110 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
34120 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
34130 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  n, pItem->regRet
34140 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65  urn);.      Vdbe
34150 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64  Comment((v, "end
34160 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61   %s", pItem->pTa
34170 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
34180 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
34190 6e 67 65 50 31 28 76 2c 20 74 6f 70 41 64 64 72  ngeP1(v, topAddr
341a0 2c 20 72 65 74 41 64 64 72 29 3b 0a 20 20 20 20  , retAddr);.    
341b0 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65    sqlite3ClearTe
341c0 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73  mpRegCache(pPars
341d0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
341e0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
341f0 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  ed ) goto select
34200 5f 65 6e 64 3b 0a 20 20 20 20 70 50 61 72 73 65  _end;.    pParse
34210 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c  ->nHeight -= sql
34220 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65  ite3SelectExprHe
34230 69 67 68 74 28 70 29 3b 0a 20 20 20 20 70 50 61  ight(p);.    pPa
34240 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
34250 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f  t = zSavedAuthCo
34260 6e 74 65 78 74 3b 0a 23 65 6e 64 69 66 0a 20 20  ntext;.#endif.  
34270 7d 0a 0a 20 20 2f 2a 20 56 61 72 69 6f 75 73 20  }..  /* Various 
34280 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
34290 53 45 4c 45 43 54 20 63 6f 70 69 65 64 20 69 6e  SELECT copied in
342a0 74 6f 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  to local variabl
342b0 65 73 20 66 6f 72 0a 20 20 2a 2a 20 63 6f 6e 76  es for.  ** conv
342c0 65 6e 69 65 6e 63 65 20 2a 2f 0a 20 20 70 45 4c  enience */.  pEL
342d0 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
342e0 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70  .  pWhere = p->p
342f0 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42  Where;.  pGroupB
34300 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
34310 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e  .  pHaving = p->
34320 70 48 61 76 69 6e 67 3b 0a 20 20 73 44 69 73 74  pHaving;.  sDist
34330 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20 28 70  inct.isTnct = (p
34340 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
34350 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23  Distinct)!=0;..#
34360 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
34370 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
34380 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
34390 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 53  & 0x400 ){.    S
343a0 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30 30  ELECTTRACE(0x400
343b0 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65  ,pParse,p,("Afte
343c0 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  r all FROM-claus
343d0 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22 29 29  e analysis:\n"))
343e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
343f0 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
34400 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
34410 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
34420 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54 49  COUNTOFVIEW_OPTI
34430 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 4f  MIZATION.  if( O
34440 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
34450 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75  ed(db, SQLITE_Qu
34460 65 72 79 46 6c 61 74 74 65 6e 65 72 7c 53 51 4c  eryFlattener|SQL
34470 49 54 45 5f 43 6f 75 6e 74 4f 66 56 69 65 77 29  ITE_CountOfView)
34480 0a 20 20 20 26 26 20 63 6f 75 6e 74 4f 66 56 69  .   && countOfVi
34490 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28 70  ewOptimization(p
344a0 50 61 72 73 65 2c 20 70 29 0a 20 20 29 7b 0a 20  Parse, p).  ){. 
344b0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
344c0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73  cFailed ) goto s
344d0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70  elect_end;.    p
344e0 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
344f0 74 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20  t;.    pTabList 
34500 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 7d 0a 23  = p->pSrc;.  }.#
34510 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
34520 68 65 20 71 75 65 72 79 20 69 73 20 44 49 53 54  he query is DIST
34530 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44  INCT with an ORD
34540 45 52 20 42 59 20 62 75 74 20 69 73 20 6e 6f 74  ER BY but is not
34550 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c 20 61   an aggregate, a
34560 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  nd .  ** if the 
34570 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73 20 74  select-list is t
34580 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 4f  he same as the O
34590 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20 74 68  RDER BY list, th
345a0 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a 20 20  en this query.  
345b0 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69 74  ** can be rewrit
345c0 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50 20 42  ten as a GROUP B
345d0 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  Y. In other word
345e0 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20  s, this:.  **.  
345f0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 44 49  **     SELECT DI
34600 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20  STINCT xyz FROM 
34610 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78 79 7a  ... ORDER BY xyz
34620 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72  .  **.  ** is tr
34630 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20  ansformed to:.  
34640 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
34650 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20  CT xyz FROM ... 
34660 47 52 4f 55 50 20 42 59 20 78 79 7a 20 4f 52 44  GROUP BY xyz ORD
34670 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20  ER BY xyz.  **. 
34680 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66   ** The second f
34690 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72 65 64  orm is preferred
346a0 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64   as a single ind
346b0 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c  ex (or temp-tabl
346c0 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20  e) may be .  ** 
346d0 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68  used for both th
346e0 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 44  e ORDER BY and D
346f0 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69  ISTINCT processi
34700 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c  ng. As originall
34710 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20  y .  ** written 
34720 74 68 65 20 71 75 65 72 79 20 6d 75 73 74 20 75  the query must u
34730 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20  se a temp-table 
34740 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  for at least one
34750 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a 20   of the ORDER . 
34760 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54 49   ** BY and DISTI
34770 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65  NCT, and an inde
34780 78 20 6f 72 20 73 65 70 61 72 61 74 65 20 74 65  x or separate te
34790 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68 65  mp-table for the
347a0 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69   other..  */.  i
347b0 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
347c0 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
347d0 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
347e0 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20 26  F_Distinct .   &
347f0 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  & sqlite3ExprLis
34800 74 43 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e 70  tCompare(sSort.p
34810 4f 72 64 65 72 42 79 2c 20 70 45 4c 69 73 74 2c  OrderBy, pEList,
34820 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20   -1)==0.  ){.   
34830 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
34840 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20  ~SF_Distinct;.  
34850 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
34860 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
34870 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
34880 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20  , pEList, 0);.  
34890 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61 74    /* Notice that
348a0 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20 53 46   even thought SF
348b0 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20 62 65  _Distinct has be
348c0 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f 6d 20  en cleared from 
348d0 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20  p->selFlags,.   
348e0 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69 6e 63   ** the sDistinc
348f0 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74 69 6c  t.isTnct is stil
34900 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c 20 69  l set.  Hence, i
34910 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e 74 73  sTnct represents
34920 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67   the.    ** orig
34930 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f 66 20  inal setting of 
34940 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63 74 20  the SF_Distinct 
34950 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20 63 75  flag, not the cu
34960 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f  rrent setting */
34970 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 44 69  .    assert( sDi
34980 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b  stinct.isTnct );
34990 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ..#if SELECTTRAC
349a0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66  E_ENABLED.    if
349b0 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
349c0 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a  race & 0x400 ){.
349d0 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43        SELECTTRAC
349e0 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70  E(0x400,pParse,p
349f0 2c 28 22 54 72 61 6e 73 66 6f 72 6d 20 44 49 53  ,("Transform DIS
34a00 54 49 4e 43 54 20 69 6e 74 6f 20 47 52 4f 55 50  TINCT into GROUP
34a10 20 42 59 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20   BY:\n"));.     
34a20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
34a30 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
34a40 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
34a50 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
34a60 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
34a70 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 63 72 65  clause, then cre
34a80 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ate an ephemeral
34a90 20 69 6e 64 65 78 20 74 6f 0a 20 20 2a 2a 20 64   index to.  ** d
34aa0 6f 20 74 68 65 20 73 6f 72 74 69 6e 67 2e 20 20  o the sorting.  
34ab0 42 75 74 20 74 68 69 73 20 73 6f 72 74 69 6e 67  But this sorting
34ac0 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
34ad0 20 6d 69 67 68 74 20 65 6e 64 20 75 70 0a 20 20   might end up.  
34ae0 2a 2a 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20  ** being unused 
34af0 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e 20  if the data can 
34b00 62 65 20 65 78 74 72 61 63 74 65 64 20 69 6e 20  be extracted in 
34b10 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72  pre-sorted order
34b20 2e 0a 20 20 2a 2a 20 49 66 20 74 68 61 74 20 69  ..  ** If that i
34b30 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
34b40 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   the OP_OpenEphe
34b50 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
34b60 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 63  n will be.  ** c
34b70 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f  hanged to an OP_
34b80 4e 6f 6f 70 20 6f 6e 63 65 20 77 65 20 66 69 67  Noop once we fig
34b90 75 72 65 20 6f 75 74 20 74 68 61 74 20 74 68 65  ure out that the
34ba0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69   sorting index i
34bb0 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65 65 64 65  s.  ** not neede
34bc0 64 2e 20 20 54 68 65 20 73 53 6f 72 74 2e 61 64  d.  The sSort.ad
34bd0 64 72 53 6f 72 74 49 6e 64 65 78 20 76 61 72 69  drSortIndex vari
34be0 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20  able is used to 
34bf0 66 61 63 69 6c 69 74 61 74 65 0a 20 20 2a 2a 20  facilitate.  ** 
34c00 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a  that change..  *
34c10 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f  /.  if( sSort.pO
34c20 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65  rderBy ){.    Ke
34c30 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
34c40 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
34c50 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72  sqlite3KeyInfoFr
34c60 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 20 20  omExprList(.    
34c70 20 20 20 20 70 50 61 72 73 65 2c 20 73 53 6f 72      pParse, sSor
34c80 74 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c 20 70  t.pOrderBy, 0, p
34c90 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
34ca0 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73 6f     sSort.iECurso
34cb0 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
34cc0 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64  ++;.    sSort.ad
34cd0 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20  drSortIndex =.  
34ce0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
34cf0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
34d00 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20  Ephemeral,.     
34d10 20 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72       sSort.iECur
34d20 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65  sor, sSort.pOrde
34d30 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70 45 4c  rBy->nExpr+1+pEL
34d40 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a 20  ist->nExpr, 0,. 
34d50 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
34d60 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
34d70 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a 20 20  INFO.      );.  
34d80 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f 72 74  }else{.    sSort
34d90 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d  .addrSortIndex =
34da0 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   -1;.  }..  /* I
34db0 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
34dc0 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74  destined for a t
34dd0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
34de0 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e  open that table.
34df0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73  .  */.  if( pDes
34e00 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  t->eDest==SRT_Ep
34e10 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71  hemTab ){.    sq
34e20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
34e30 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
34e40 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ral, pDest->iSDP
34e50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  arm, pEList->nEx
34e60 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  pr);.  }..  /* S
34e70 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a  et the limiter..
34e80 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71    */.  iEnd = sq
34e90 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
34ea0 65 6c 28 76 29 3b 0a 20 20 69 66 28 20 28 70 2d  el(v);.  if( (p-
34eb0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 46  >selFlags & SF_F
34ec0 69 78 65 64 4c 69 6d 69 74 29 3d 3d 30 20 29 7b  ixedLimit)==0 ){
34ed0 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52  .    p->nSelectR
34ee0 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20  ow = 320;  /* 4 
34ef0 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a  billion rows */.
34f00 20 20 7d 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d    }.  computeLim
34f10 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
34f20 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20  se, p, iEnd);.  
34f30 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30  if( p->iLimit==0
34f40 20 26 26 20 73 53 6f 72 74 2e 61 64 64 72 53 6f   && sSort.addrSo
34f50 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20  rtIndex>=0 ){.  
34f60 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
34f70 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 73 53 6f  ngeOpcode(v, sSo
34f80 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
34f90 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 29  , OP_SorterOpen)
34fa0 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f 72 74  ;.    sSort.sort
34fb0 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46 4c 41  Flags |= SORTFLA
34fc0 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20 20 7d  G_UseSorter;.  }
34fd0 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e 20 65  ..  /* Open an e
34fe0 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74  phemeral index t
34ff0 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69  o use for the di
35000 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f  stinct set..  */
35010 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
35020 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
35030 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63   ){.    sDistinc
35040 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50 61 72  t.tabTnct = pPar
35050 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
35060 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72 54 6e  sDistinct.addrTn
35070 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ct = sqlite3Vdbe
35080 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
35090 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20  nEphemeral,.    
350a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
350b0 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62     sDistinct.tab
350c0 54 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20  Tnct, 0, 0,.    
350d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
350e0 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65     (char*)sqlite
350f0 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  3KeyInfoFromExpr
35100 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e  List(pParse, p->
35110 70 45 4c 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20  pEList,0,0),.   
35120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35130 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b      P4_KEYINFO);
35140 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
35150 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45  ChangeP5(v, BTRE
35160 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20  E_UNORDERED);.  
35170 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63    sDistinct.eTnc
35180 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49  tType = WHERE_DI
35190 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
351a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
351b0 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
351c0 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  pe = WHERE_DISTI
351d0 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20  NCT_NOOP;.  }.. 
351e0 20 69 66 28 20 21 69 73 41 67 67 20 26 26 20 70   if( !isAgg && p
351f0 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20  GroupBy==0 ){.  
35200 20 20 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61 74    /* No aggregat
35210 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  e functions and 
35220 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  no GROUP BY clau
35230 73 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 77 63  se */.    u16 wc
35240 74 72 6c 46 6c 61 67 73 20 3d 20 28 73 44 69 73  trlFlags = (sDis
35250 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20 57  tinct.isTnct ? W
35260 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
35270 43 54 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20  CT : 0).        
35280 20 20 20 20 20 20 20 20 20 20 20 7c 20 28 70 2d             | (p-
35290 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 46  >selFlags & SF_F
352a0 69 78 65 64 4c 69 6d 69 74 29 3b 0a 23 69 66 6e  ixedLimit);.#ifn
352b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
352c0 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 57  WINDOWFUNC.    W
352d0 69 6e 64 6f 77 20 2a 70 57 69 6e 20 3d 20 70 2d  indow *pWin = p-
352e0 3e 70 57 69 6e 3b 20 20 20 20 20 20 2f 2a 20 4d  >pWin;      /* M
352f0 61 73 74 65 72 20 77 69 6e 64 6f 77 20 6f 62 6a  aster window obj
35300 65 63 74 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f  ect (or NULL) */
35310 0a 20 20 20 20 69 66 28 20 70 57 69 6e 20 29 7b  .    if( pWin ){
35320 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 69  .      sqlite3Wi
35330 6e 64 6f 77 43 6f 64 65 49 6e 69 74 28 70 50 61  ndowCodeInit(pPa
35340 72 73 65 2c 20 70 57 69 6e 29 3b 0a 20 20 20 20  rse, pWin);.    
35350 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73  }.#endif.    ass
35360 65 72 74 28 20 57 48 45 52 45 5f 55 53 45 5f 4c  ert( WHERE_USE_L
35370 49 4d 49 54 3d 3d 53 46 5f 46 69 78 65 64 4c 69  IMIT==SF_FixedLi
35380 6d 69 74 20 29 3b 0a 0a 0a 20 20 20 20 2f 2a 20  mit );...    /* 
35390 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61  Begin the databa
353a0 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20  se scan. */.    
353b0 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50  SELECTTRACE(1,pP
353c0 61 72 73 65 2c 70 2c 28 22 57 68 65 72 65 42 65  arse,p,("WhereBe
353d0 67 69 6e 5c 6e 22 29 29 3b 0a 20 20 20 20 70 57  gin\n"));.    pW
353e0 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
353f0 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
35400 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
35410 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  e, sSort.pOrderB
35420 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
35430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35440 20 20 70 2d 3e 70 45 4c 69 73 74 2c 20 77 63 74    p->pEList, wct
35450 72 6c 46 6c 61 67 73 2c 20 70 2d 3e 6e 53 65 6c  rlFlags, p->nSel
35460 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 69 66 28  ectRow);.    if(
35470 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
35480 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
35490 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
354a0 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74  reOutputRowCount
354b0 28 70 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53  (pWInfo) < p->nS
354c0 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20  electRow ){.    
354d0 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
354e0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75  = sqlite3WhereOu
354f0 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49  tputRowCount(pWI
35500 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nfo);.    }.    
35510 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73  if( sDistinct.is
35520 54 6e 63 74 20 26 26 20 73 71 6c 69 74 65 33 57  Tnct && sqlite3W
35530 68 65 72 65 49 73 44 69 73 74 69 6e 63 74 28 70  hereIsDistinct(p
35540 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20  WInfo) ){.      
35550 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
35560 79 70 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65  ype = sqlite3Whe
35570 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49  reIsDistinct(pWI
35580 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nfo);.    }.    
35590 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  if( sSort.pOrder
355a0 42 79 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72  By ){.      sSor
355b0 74 2e 6e 4f 42 53 61 74 20 3d 20 73 71 6c 69 74  t.nOBSat = sqlit
355c0 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64  e3WhereIsOrdered
355d0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
355e0 73 53 6f 72 74 2e 62 4f 72 64 65 72 65 64 49 6e  sSort.bOrderedIn
355f0 6e 65 72 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65  nerLoop = sqlite
35600 33 57 68 65 72 65 4f 72 64 65 72 65 64 49 6e 6e  3WhereOrderedInn
35610 65 72 4c 6f 6f 70 28 70 57 49 6e 66 6f 29 3b 0a  erLoop(pWInfo);.
35620 20 20 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e        if( sSort.
35630 6e 4f 42 53 61 74 3d 3d 73 53 6f 72 74 2e 70 4f  nOBSat==sSort.pO
35640 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b  rderBy->nExpr ){
35650 0a 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70  .        sSort.p
35660 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
35670 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
35680 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20 69 6e  /* If sorting in
35690 64 65 78 20 74 68 61 74 20 77 61 73 20 63 72 65  dex that was cre
356a0 61 74 65 64 20 62 79 20 61 20 70 72 69 6f 72 20  ated by a prior 
356b0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
356c0 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63   .    ** instruc
356d0 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f  tion ended up no
356e0 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64 2c 20  t being needed, 
356f0 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20  then change the 
35700 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
35710 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20  .    ** into an 
35720 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  OP_Noop..    */.
35730 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e 61 64      if( sSort.ad
35740 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26  drSortIndex>=0 &
35750 26 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  & sSort.pOrderBy
35760 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
35770 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
35780 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64  Noop(v, sSort.ad
35790 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20  drSortIndex);.  
357a0 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
357b0 20 70 2d 3e 70 45 4c 69 73 74 3d 3d 70 45 4c 69   p->pEList==pELi
357c0 73 74 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  st );.#ifndef SQ
357d0 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
357e0 46 55 4e 43 0a 20 20 20 20 69 66 28 20 70 57 69  FUNC.    if( pWi
357f0 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  n ){.      int a
35800 64 64 72 47 6f 73 75 62 20 3d 20 73 71 6c 69 74  ddrGosub = sqlit
35810 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
35820 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  v);.      int iC
35830 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
35840 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
35850 20 20 20 20 20 69 6e 74 20 69 42 72 65 61 6b 20       int iBreak 
35860 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
35870 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
35880 20 69 6e 74 20 72 65 67 47 6f 73 75 62 20 3d 20   int regGosub = 
35890 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
358a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 69  .      sqlite3Wi
358b0 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 70 50 61  ndowCodeStep(pPa
358c0 72 73 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c 20  rse, p, pWInfo, 
358d0 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f  regGosub, addrGo
358e0 73 75 62 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  sub);..      sql
358f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
35900 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42  , OP_Goto, 0, iB
35910 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
35920 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
35930 61 62 65 6c 28 76 2c 20 61 64 64 72 47 6f 73 75  abel(v, addrGosu
35940 62 29 3b 0a 20 20 20 20 20 20 56 64 62 65 4e 6f  b);.      VdbeNo
35950 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  opComment((v, "i
35960 6e 6e 65 72 2d 6c 6f 6f 70 20 73 75 62 72 6f 75  nner-loop subrou
35970 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 20 20 73  tine"));.      s
35980 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
35990 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73  Parse, p, -1, &s
359a0 53 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63 74  Sort, &sDistinct
359b0 2c 20 70 44 65 73 74 2c 20 69 43 6f 6e 74 2c 20  , pDest, iCont, 
359c0 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
359d0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
359e0 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
359f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
35a00 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
35a10 52 65 74 75 72 6e 2c 20 72 65 67 47 6f 73 75 62  Return, regGosub
35a20 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
35a30 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 69 6e  ment((v, "end in
35a40 6e 65 72 2d 6c 6f 6f 70 20 73 75 62 72 6f 75 74  ner-loop subrout
35a50 69 6e 65 22 29 29 3b 0a 20 20 20 20 20 20 73 71  ine"));.      sq
35a60 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
35a70 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29  Label(v, iBreak)
35a80 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
35a90 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
35aa0 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a  T_WINDOWFUNC */.
35ab0 20 20 20 20 7b 0a 20 20 20 20 20 20 2f 2a 20 55      {.      /* U
35ac0 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  se the standard 
35ad0 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20  inner loop. */. 
35ae0 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
35af0 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
35b00 2d 31 2c 20 26 73 53 6f 72 74 2c 20 26 73 44 69  -1, &sSort, &sDi
35b10 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20  stinct, pDest,. 
35b20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
35b30 57 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62  WhereContinueLab
35b40 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20 20  el(pWInfo),.    
35b50 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
35b60 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49  reBreakLabel(pWI
35b70 6e 66 6f 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  nfo));..      /*
35b80 20 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   End the databas
35b90 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
35ba0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
35bb0 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
35bc0 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  fo);.    }.  }el
35bd0 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  se{.    /* This 
35be0 63 61 73 65 20 77 68 65 6e 20 74 68 65 72 65 20  case when there 
35bf0 65 78 69 73 74 20 61 67 67 72 65 67 61 74 65 20  exist aggregate 
35c00 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20 47  functions or a G
35c10 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 20  ROUP BY clause. 
35c20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f     ** or both */
35c30 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  .    NameContext
35c40 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65   sNC;    /* Name
35c50 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f   context for pro
35c60 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74  cessing aggregat
35c70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
35c80 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20  .    int iAMem; 
35c90 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
35ca0 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f  t Mem address fo
35cb0 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e  r storing curren
35cc0 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20  t GROUP BY */.  
35cd0 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20    int iBMem;    
35ce0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
35cf0 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70  em address for p
35d00 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59  revious GROUP BY
35d10 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65   */.    int iUse
35d20 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d  Flag;       /* M
35d30 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69  em address holdi
35d40 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69  ng flag indicati
35d50 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  ng that at least
35d60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
35d70 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20           ** one 
35d80 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74  row of the input
35d90 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74   to the aggregat
35da0 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20  or has been.    
35db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35dc0 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64      ** processed
35dd0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f   */.    int iAbo
35de0 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d  rtFlag;     /* M
35df0 65 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68  em address which
35e00 20 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62   causes query ab
35e10 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20  ort if positive 
35e20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70  */.    int group
35e30 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f  BySort;    /* Ro
35e40 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75  ws come from sou
35e50 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20  rce in GROUP BY 
35e60 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  order */.    int
35e70 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20   addrEnd;       
35e80 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65   /* End of proce
35e90 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53  ssing for this S
35ea0 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74  ELECT */.    int
35eb0 20 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20 20   sortPTab = 0;  
35ec0 20 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65 20   /* Pseudotable 
35ed0 75 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20 73  used to decode s
35ee0 6f 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20 2a  orting results *
35ef0 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f 75  /.    int sortOu
35f00 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74  t = 0;    /* Out
35f10 70 75 74 20 72 65 67 69 73 74 65 72 20 66 72 6f  put register fro
35f20 6d 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a  m the sorter */.
35f30 20 20 20 20 69 6e 74 20 6f 72 64 65 72 42 79 47      int orderByG
35f40 72 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20  rp = 0; /* True 
35f50 69 66 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  if the GROUP BY 
35f60 61 6e 64 20 4f 52 44 45 52 20 42 59 20 61 72 65  and ORDER BY are
35f70 20 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a 20 20   the same */..  
35f80 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20    /* Remove any 
35f90 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20  and all aliases 
35fa0 62 65 74 77 65 65 6e 20 74 68 65 20 72 65 73 75  between the resu
35fb0 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20  lt set and the. 
35fc0 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63     ** GROUP BY c
35fd0 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  lause..    */.  
35fe0 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
35ff0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20  {.      int k;  
36000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36010 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
36020 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73  unter */.      s
36030 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
36040 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20  tem *pItem;  /* 
36050 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
36060 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
36070 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20   list */..      
36080 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d  for(k=p->pEList-
36090 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d  >nExpr, pItem=p-
360a0 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b  >pEList->a; k>0;
360b0 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   k--, pItem++){.
360c0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75          pItem->u
360d0 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20  .x.iAlias = 0;. 
360e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
360f0 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  (k=pGroupBy->nEx
36100 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70  pr, pItem=pGroup
36110 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c  By->a; k>0; k--,
36120 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
36130 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41     pItem->u.x.iA
36140 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  lias = 0;.      
36150 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
36160 36 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  66==sqlite3LogEs
36170 74 28 31 30 30 29 20 29 3b 0a 20 20 20 20 20 20  t(100) );.      
36180 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  if( p->nSelectRo
36190 77 3e 36 36 20 29 20 70 2d 3e 6e 53 65 6c 65 63  w>66 ) p->nSelec
361a0 74 52 6f 77 20 3d 20 36 36 3b 0a 20 20 20 20 7d  tRow = 66;.    }
361b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
361c0 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  rt( 0==sqlite3Lo
361d0 67 45 73 74 28 31 29 20 29 3b 0a 20 20 20 20 20  gEst(1) );.     
361e0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
361f0 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
36200 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f  * If there is bo
36210 74 68 20 61 20 47 52 4f 55 50 20 42 59 20 61 6e  th a GROUP BY an
36220 64 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  d an ORDER BY cl
36230 61 75 73 65 20 61 6e 64 20 74 68 65 79 20 61 72  ause and they ar
36240 65 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74 69 63  e.    ** identic
36250 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20  al, then it may 
36260 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  be possible to d
36270 69 73 61 62 6c 65 20 74 68 65 20 4f 52 44 45 52  isable the ORDER
36280 20 42 59 20 63 6c 61 75 73 65 20 0a 20 20 20 20   BY clause .    
36290 2a 2a 20 6f 6e 20 74 68 65 20 67 72 6f 75 6e 64  ** on the ground
362a0 73 20 74 68 61 74 20 74 68 65 20 47 52 4f 55 50  s that the GROUP
362b0 20 42 59 20 77 69 6c 6c 20 63 61 75 73 65 20 65   BY will cause e
362c0 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20  lements to come 
362d0 6f 75 74 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74  out .    ** in t
362e0 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72  he correct order
362f0 2e 20 49 74 20 61 6c 73 6f 20 6d 61 79 20 6e 6f  . It also may no
36300 74 20 2d 20 74 68 65 20 47 52 4f 55 50 20 42 59  t - the GROUP BY
36310 20 6d 69 67 68 74 20 75 73 65 20 61 0a 20 20 20   might use a.   
36320 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6e 64   ** database ind
36330 65 78 20 74 68 61 74 20 63 61 75 73 65 73 20 72  ex that causes r
36340 6f 77 73 20 74 6f 20 62 65 20 67 72 6f 75 70 65  ows to be groupe
36350 64 20 74 6f 67 65 74 68 65 72 20 61 73 20 72 65  d together as re
36360 71 75 69 72 65 64 0a 20 20 20 20 2a 2a 20 62 75  quired.    ** bu
36370 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 73  t not actually s
36380 6f 72 74 65 64 2e 20 45 69 74 68 65 72 20 77 61  orted. Either wa
36390 79 2c 20 72 65 63 6f 72 64 20 74 68 65 20 66 61  y, record the fa
363a0 63 74 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  ct that the.    
363b0 2a 2a 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20  ** ORDER BY and 
363c0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 73  GROUP BY clauses
363d0 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 62 79   are the same by
363e0 20 73 65 74 74 69 6e 67 20 74 68 65 20 6f 72 64   setting the ord
363f0 65 72 42 79 47 72 70 0a 20 20 20 20 2a 2a 20 76  erByGrp.    ** v
36400 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20  ariable.  */.   
36410 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
36420 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 47 72 6f  ListCompare(pGro
36430 75 70 42 79 2c 20 73 53 6f 72 74 2e 70 4f 72 64  upBy, sSort.pOrd
36440 65 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a  erBy, -1)==0 ){.
36450 20 20 20 20 20 20 6f 72 64 65 72 42 79 47 72 70        orderByGrp
36460 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 0a 20 20   = 1;.    }. .  
36470 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 61    /* Create a la
36480 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77  bel to jump to w
36490 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 61  hen we want to a
364a0 62 6f 72 74 20 74 68 65 20 71 75 65 72 79 20 2a  bort the query *
364b0 2f 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20  /.    addrEnd = 
364c0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
364d0 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a  abel(v);..    /*
364e0 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55   Convert TK_COLU
364f0 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b  MN nodes into TK
36500 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20  _AGG_COLUMN and 
36510 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a  make entries in.
36520 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20      ** sAggInfo 
36530 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46  for all TK_AGG_F
36540 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e  UNCTION nodes in
36550 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   expressions of 
36560 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43  the.    ** SELEC
36570 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  T statement..   
36580 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
36590 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
365a0 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50  NC));.    sNC.pP
365b0 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
365c0 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
365d0 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20  = pTabList;.    
365e0 73 4e 43 2e 75 4e 43 2e 70 41 67 67 49 6e 66 6f  sNC.uNC.pAggInfo
365f0 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20   = &sAggInfo;.  
36600 20 20 56 56 41 5f 4f 4e 4c 59 28 20 73 4e 43 2e    VVA_ONLY( sNC.
36610 6e 63 46 6c 61 67 73 20 3d 20 4e 43 5f 55 41 67  ncFlags = NC_UAg
36620 67 49 6e 66 6f 3b 20 29 0a 20 20 20 20 73 41 67  gInfo; ).    sAg
36630 67 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20 70 50  gInfo.mnReg = pP
36640 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
36650 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74    sAggInfo.nSort
36660 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f  ingColumn = pGro
36670 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d  upBy ? pGroupBy-
36680 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20  >nExpr : 0;.    
36690 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42  sAggInfo.pGroupB
366a0 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20  y = pGroupBy;.  
366b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
366c0 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
366d0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
366e0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
366f0 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73  eAggList(&sNC, s
36700 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 29 3b 0a  Sort.pOrderBy);.
36710 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
36720 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 47 72  ){.      if( pGr
36730 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20  oupBy ){.       
36740 20 61 73 73 65 72 74 28 20 70 57 68 65 72 65 3d   assert( pWhere=
36750 3d 70 2d 3e 70 57 68 65 72 65 20 29 3b 0a 20 20  =p->pWhere );.  
36760 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48        assert( pH
36770 61 76 69 6e 67 3d 3d 70 2d 3e 70 48 61 76 69 6e  aving==p->pHavin
36780 67 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  g );.        ass
36790 65 72 74 28 20 70 47 72 6f 75 70 42 79 3d 3d 70  ert( pGroupBy==p
367a0 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 20 20  ->pGroupBy );.  
367b0 20 20 20 20 20 20 68 61 76 69 6e 67 54 6f 57 68        havingToWh
367c0 65 72 65 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ere(pParse, p);.
367d0 20 20 20 20 20 20 20 20 70 57 68 65 72 65 20 3d          pWhere =
367e0 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20   p->pWhere;.    
367f0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
36800 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
36810 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61  egates(&sNC, pHa
36820 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ving);.    }.   
36830 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d   sAggInfo.nAccum
36840 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66  ulator = sAggInf
36850 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69  o.nColumn;.    i
36860 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d  f( p->pGroupBy==
36870 30 20 26 26 20 70 2d 3e 70 48 61 76 69 6e 67 3d  0 && p->pHaving=
36880 3d 30 20 26 26 20 73 41 67 67 49 6e 66 6f 2e 6e  =0 && sAggInfo.n
36890 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20 20 20  Func==1 ){.     
368a0 20 6d 69 6e 4d 61 78 46 6c 61 67 20 3d 20 6d 69   minMaxFlag = mi
368b0 6e 4d 61 78 51 75 65 72 79 28 64 62 2c 20 73 41  nMaxQuery(db, sA
368c0 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e  ggInfo.aFunc[0].
368d0 70 45 78 70 72 2c 20 26 70 4d 69 6e 4d 61 78 4f  pExpr, &pMinMaxO
368e0 72 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 65 6c  rderBy);.    }el
368f0 73 65 7b 0a 20 20 20 20 20 20 6d 69 6e 4d 61 78  se{.      minMax
36900 46 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f 52 44  Flag = WHERE_ORD
36910 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  ERBY_NORMAL;.   
36920 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
36930 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63  i<sAggInfo.nFunc
36940 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; i++){.      as
36950 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
36960 6f 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e  operty(sAggInfo.
36970 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20  aFunc[i].pExpr, 
36980 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
36990 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61  .      sNC.ncFla
369a0 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75  gs |= NC_InAggFu
369b0 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  nc;.      sqlite
369c0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
369d0 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e  ist(&sNC, sAggIn
369e0 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70  fo.aFunc[i].pExp
369f0 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  r->x.pList);.   
36a00 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26     sNC.ncFlags &
36a10 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b  = ~NC_InAggFunc;
36a20 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49  .    }.    sAggI
36a30 6e 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72  nfo.mxReg = pPar
36a40 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66  se->nMem;.    if
36a50 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
36a60 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  ed ) goto select
36a70 5f 65 6e 64 3b 0a 23 69 66 20 53 45 4c 45 43 54  _end;.#if SELECT
36a80 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
36a90 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
36aa0 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30  ectTrace & 0x400
36ab0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69   ){.      int ii
36ac0 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  ;.      SELECTTR
36ad0 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65  ACE(0x400,pParse
36ae0 2c 70 2c 28 22 41 66 74 65 72 20 61 67 67 72 65  ,p,("After aggre
36af0 67 61 74 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e  gate analysis:\n
36b00 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
36b10 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
36b20 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20  (0, p, 0);.     
36b30 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 41   for(ii=0; ii<sA
36b40 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20  ggInfo.nColumn; 
36b50 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73  ii++){.        s
36b60 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
36b70 66 28 22 61 67 67 2d 63 6f 6c 75 6d 6e 5b 25 64  f("agg-column[%d
36b80 5d 20 69 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20  ] iMem=%d\n",.  
36b90 20 20 20 20 20 20 20 20 20 20 69 69 2c 20 73 41            ii, sA
36ba0 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 69 5d 2e  ggInfo.aCol[ii].
36bb0 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73  iMem);.        s
36bc0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
36bd0 70 72 28 30 2c 20 73 41 67 67 49 6e 66 6f 2e 61  pr(0, sAggInfo.a
36be0 43 6f 6c 5b 69 69 5d 2e 70 45 78 70 72 2c 20 30  Col[ii].pExpr, 0
36bf0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
36c00 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 41   for(ii=0; ii<sA
36c10 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 69  ggInfo.nFunc; ii
36c20 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
36c30 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
36c40 22 61 67 67 2d 66 75 6e 63 5b 25 64 5d 3a 20 69  "agg-func[%d]: i
36c50 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  Mem=%d\n",.     
36c60 20 20 20 20 20 20 20 69 69 2c 20 73 41 67 67 49         ii, sAggI
36c70 6e 66 6f 2e 61 46 75 6e 63 5b 69 69 5d 2e 69 4d  nfo.aFunc[ii].iM
36c80 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  em);.        sql
36c90 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72  ite3TreeViewExpr
36ca0 28 30 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  (0, sAggInfo.aFu
36cb0 6e 63 5b 69 69 5d 2e 70 45 78 70 72 2c 20 30 29  nc[ii].pExpr, 0)
36cc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
36cd0 23 65 6e 64 69 66 0a 0a 0a 20 20 20 20 2f 2a 20  #endif...    /* 
36ce0 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61  Processing for a
36cf0 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20 47  ggregates with G
36d00 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79 20  ROUP BY is very 
36d10 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20  different and.  
36d20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63    ** much more c
36d30 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72  omplex than aggr
36d40 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61  egates without a
36d50 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a   GROUP BY..    *
36d60 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
36d70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49  By ){.      KeyI
36d80 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
36d90 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d  /* Keying inform
36da0 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72  ation for the gr
36db0 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f  oup by clause */
36dc0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 31  .      int addr1
36dd0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d  ;          /* A-
36de0 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e  vs-B comparision
36df0 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69   jump */.      i
36e00 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  nt addrOutputRow
36e10 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73  ;  /* Start of s
36e20 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
36e30 75 74 70 75 74 73 20 61 20 72 65 73 75 6c 74 20  utputs a result 
36e40 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  row */.      int
36e50 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20   regOutputRow;  
36e60 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65   /* Return addre
36e70 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
36e80 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
36e90 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  e */.      int a
36ea0 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f  ddrSetAbort;   /
36eb0 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72 74 20  * Set the abort 
36ec0 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20  flag and return 
36ed0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
36ee0 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20  rTopOfLoop;  /* 
36ef0 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74  Top of the input
36f00 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69   loop */.      i
36f10 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64  nt addrSortingId
36f20 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65  x; /* The OP_Ope
36f30 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74  nEphemeral for t
36f40 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
36f50 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
36f60 64 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  drReset;      /*
36f70 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   Subroutine for 
36f80 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 61 63  resetting the ac
36f90 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20  cumulator */.   
36fa0 20 20 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b     int regReset;
36fb0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
36fc0 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
36fd0 72 20 66 6f 72 20 72 65 73 65 74 20 73 75 62 72  r for reset subr
36fe0 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20  outine */..     
36ff0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
37000 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
37010 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20  e we might need 
37020 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  a sorting index 
37030 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c  to.      ** impl
37040 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63  ement it.  Alloc
37050 61 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67  ate that sorting
37060 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20   index now.  If 
37070 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20  it turns out.   
37080 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
37090 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74   not need it aft
370a0 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53  er all, the OP_S
370b0 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 72 75  orterOpen instru
370c0 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77  ction.      ** w
370d0 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
370e0 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a   into a Noop.  .
370f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
37100 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
37110 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
37120 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  b++;.      pKeyI
37130 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
37140 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
37150 28 70 50 61 72 73 65 2c 70 47 72 6f 75 70 42 79  (pParse,pGroupBy
37160 2c 30 2c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c  ,0,sAggInfo.nCol
37170 75 6d 6e 29 3b 0a 20 20 20 20 20 20 61 64 64 72  umn);.      addr
37180 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c  SortingIdx = sql
37190 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
371a0 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c  , OP_SorterOpen,
371b0 20 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67   .          sAgg
371c0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
371d0 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69   sAggInfo.nSorti
371e0 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20  ngColumn, .     
371f0 20 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70       0, (char*)p
37200 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
37210 4e 46 4f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  NFO);..      /* 
37220 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72  Initialize memor
37230 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64  y locations used
37240 20 62 79 20 47 52 4f 55 50 20 42 59 20 61 67 67   by GROUP BY agg
37250 72 65 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e  regate processin
37260 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  g.      */.     
37270 20 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50   iUseFlag = ++pP
37280 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
37290 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b    iAbortFlag = +
372a0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
372b0 20 20 20 20 20 72 65 67 4f 75 74 70 75 74 52 6f       regOutputRo
372c0 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  w = ++pParse->nM
372d0 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75  em;.      addrOu
372e0 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  tputRow = sqlite
372f0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
37300 29 3b 0a 20 20 20 20 20 20 72 65 67 52 65 73 65  );.      regRese
37310 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
37320 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 52 65  em;.      addrRe
37330 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  set = sqlite3Vdb
37340 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
37350 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61       iAMem = pPa
37360 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
37370 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
37380 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  m += pGroupBy->n
37390 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65  Expr;.      iBMe
373a0 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
373b0 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72   + 1;.      pPar
373c0 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f  se->nMem += pGro
373d0 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
373e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
373f0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
37400 65 72 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c 61  er, 0, iAbortFla
37410 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
37420 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65 61 72  mment((v, "clear
37430 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
37440 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
37450 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75  eAddOp3(v, OP_Nu
37460 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20 69 41  ll, 0, iAMem, iA
37470 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e 6e 45  Mem+pGroupBy->nE
37480 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20 2f  xpr-1);..      /
37490 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74  * Begin a loop t
374a0 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74  hat will extract
374b0 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73   all source rows
374c0 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64   in GROUP BY ord
374d0 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  er..      ** Thi
374e0 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20  s might involve 
374f0 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f  two separate loo
37500 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f  ps with an OP_So
37510 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f  rt in between, o
37520 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69  r.      ** it mi
37530 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20  ght be a single 
37540 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20 61  loop that uses a
37550 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61  n index to extra
37560 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20  ct information. 
37570 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72       ** in the r
37580 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65  ight order to be
37590 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20  gin with..      
375a0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
375b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
375c0 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74  _Gosub, regReset
375d0 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
375e0 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
375f0 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 57 68 65  1,pParse,p,("Whe
37600 72 65 42 65 67 69 6e 5c 6e 22 29 29 3b 0a 20 20  reBegin\n"));.  
37610 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
37620 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
37630 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
37640 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70 42   pWhere, pGroupB
37650 79 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  y, 0,.          
37660 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 7c 20  WHERE_GROUPBY | 
37670 28 6f 72 64 65 72 42 79 47 72 70 20 3f 20 57 48  (orderByGrp ? WH
37680 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20  ERE_SORTBYGROUP 
37690 3a 20 30 29 2c 20 30 0a 20 20 20 20 20 20 29 3b  : 0), 0.      );
376a0 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
376b0 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
376c0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66  ct_end;.      if
376d0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  ( sqlite3WhereIs
376e0 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3d  Ordered(pWInfo)=
376f0 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  =pGroupBy->nExpr
37700 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
37710 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20  he optimizer is 
37720 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20  able to deliver 
37730 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79  rows in group by
37740 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20   order so.      
37750 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68    ** we do not h
37760 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68  ave to sort.  Th
37770 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
37780 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65  al table will be
37790 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63  .        ** canc
377a0 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61  elled later beca
377b0 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65  use we still nee
377c0 64 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65  d to use the pKe
377d0 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f  yInfo.        */
377e0 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79  .        groupBy
377f0 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Sort = 0;.      
37800 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
37810 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e  * Rows are comin
37820 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72  g out in undeter
37830 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65  mined order.  We
37840 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20   have to push.  
37850 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f        ** each ro
37860 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67  w into a sorting
37870 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74   index, terminat
37880 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70  e the first loop
37890 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
378a0 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20  n loop over the 
378b0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e  sorting index in
378c0 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68   order to get th
378d0 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20  e output.       
378e0 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72   ** in sorted or
378f0 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  der.        */. 
37900 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 42 61         int regBa
37910 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se;.        int 
37920 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20  regRecord;.     
37930 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20     int nCol;.   
37940 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42       int nGroupB
37950 79 3b 0a 0a 20 20 20 20 20 20 20 20 65 78 70 6c  y;..        expl
37960 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61  ainTempTable(pPa
37970 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
37980 20 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54    (sDistinct.isT
37990 6e 63 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c  nct && (p->selFl
379a0 61 67 73 26 53 46 5f 44 69 73 74 69 6e 63 74 29  ags&SF_Distinct)
379b0 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20  ==0) ?.         
379c0 20 20 20 20 20 20 20 20 20 20 20 22 44 49 53 54             "DIST
379d0 49 4e 43 54 22 20 3a 20 22 47 52 4f 55 50 20 42  INCT" : "GROUP B
379e0 59 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 67 72  Y");..        gr
379f0 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20  oupBySort = 1;. 
37a00 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42 79 20         nGroupBy 
37a10 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
37a20 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20  r;.        nCol 
37a30 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  = nGroupBy;.    
37a40 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79      j = nGroupBy
37a50 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
37a60 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  0; i<sAggInfo.nC
37a70 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
37a80 20 20 20 20 20 20 20 69 66 28 20 73 41 67 67 49         if( sAggI
37a90 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72  nfo.aCol[i].iSor
37aa0 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a  terColumn>=j ){.
37ab0 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c              nCol
37ac0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
37ad0 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  j++;.          }
37ae0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37af0 20 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c     regBase = sql
37b00 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
37b10 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a  (pParse, nCol);.
37b20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
37b30 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
37b40 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
37b50 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
37b60 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
37b70 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73 65  GroupBy, regBase
37b80 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
37b90 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20   j = nGroupBy;. 
37ba0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
37bb0 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  i<sAggInfo.nColu
37bc0 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
37bd0 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
37be0 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26  fo_col *pCol = &
37bf0 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d  sAggInfo.aCol[i]
37c00 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
37c10 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
37c20 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20  umn>=j ){.      
37c30 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 6a        int r1 = j
37c40 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20   + regBase;.    
37c50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
37c60 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
37c70 54 6f 52 65 67 28 70 50 61 72 73 65 2c 20 0a 20  ToReg(pParse, . 
37c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
37ca0 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e  ol->pTab, pCol->
37cb0 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69  iColumn, pCol->i
37cc0 54 61 62 6c 65 2c 20 72 31 29 3b 0a 20 20 20 20  Table, r1);.    
37cd0 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
37ce0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
37cf0 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52 65   }.        regRe
37d00 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
37d10 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
37d20 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
37d30 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
37d40 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
37d50 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67  gBase, nCol, reg
37d60 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  Record);.       
37d70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
37d80 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49  p2(v, OP_SorterI
37d90 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e  nsert, sAggInfo.
37da0 73 6f 72 74 69 6e 67 49 64 78 2c 20 72 65 67 52  sortingIdx, regR
37db0 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  ecord);.        
37dc0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
37dd0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
37de0 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
37df0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
37e00 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
37e10 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29  , regBase, nCol)
37e20 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
37e30 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
37e40 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49  );.        sAggI
37e50 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 50 54  nfo.sortingIdxPT
37e60 61 62 20 3d 20 73 6f 72 74 50 54 61 62 20 3d 20  ab = sortPTab = 
37e70 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
37e80 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74 20          sortOut 
37e90 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
37ea0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
37eb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
37ec0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
37ed0 6e 50 73 65 75 64 6f 2c 20 73 6f 72 74 50 54 61  nPseudo, sortPTa
37ee0 62 2c 20 73 6f 72 74 4f 75 74 2c 20 6e 43 6f 6c  b, sortOut, nCol
37ef0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
37f00 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
37f10 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 73  OP_SorterSort, s
37f20 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
37f30 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  dx, addrEnd);.  
37f40 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
37f50 74 28 28 76 2c 20 22 47 52 4f 55 50 20 42 59 20  t((v, "GROUP BY 
37f60 73 6f 72 74 22 29 29 3b 20 56 64 62 65 43 6f 76  sort")); VdbeCov
37f70 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
37f80 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f    sAggInfo.useSo
37f90 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20  rtingIdx = 1;.  
37fa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
37fb0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
37fc0 73 65 29 3b 0a 0a 20 20 20 20 20 20 7d 0a 0a 20  se);..      }.. 
37fd0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69       /* If the i
37fe0 6e 64 65 78 20 6f 72 20 74 65 6d 70 6f 72 61 72  ndex or temporar
37ff0 79 20 74 61 62 6c 65 20 75 73 65 64 20 62 79 20  y table used by 
38000 74 68 65 20 47 52 4f 55 50 20 42 59 20 73 6f 72  the GROUP BY sor
38010 74 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20  t.      ** will 
38020 6e 61 74 75 72 61 6c 6c 79 20 64 65 6c 69 76 65  naturally delive
38030 72 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6f 72  r rows in the or
38040 64 65 72 20 72 65 71 75 69 72 65 64 20 62 79 20  der required by 
38050 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20  the ORDER BY.   
38060 20 20 20 2a 2a 20 63 6c 61 75 73 65 2c 20 63 61     ** clause, ca
38070 6e 63 65 6c 20 74 68 65 20 65 70 68 65 6d 65 72  ncel the ephemer
38080 61 6c 20 74 61 62 6c 65 20 6f 70 65 6e 20 63 6f  al table open co
38090 64 65 64 20 65 61 72 6c 69 65 72 2e 0a 20 20 20  ded earlier..   
380a0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
380b0 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  his is an optimi
380c0 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f 72  zation - the cor
380d0 72 65 63 74 20 61 6e 73 77 65 72 20 73 68 6f 75  rect answer shou
380e0 6c 64 20 72 65 73 75 6c 74 20 72 65 67 61 72 64  ld result regard
380f0 6c 65 73 73 2e 0a 20 20 20 20 20 20 2a 2a 20 55  less..      ** U
38100 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f 47 72  se the SQLITE_Gr
38110 6f 75 70 42 79 4f 72 64 65 72 20 66 6c 61 67 20  oupByOrder flag 
38120 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54  with SQLITE_TEST
38130 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 45 52 20 74  CTRL_OPTIMIZER t
38140 6f 20 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 61  o .      ** disa
38150 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  ble this optimiz
38160 61 74 69 6f 6e 20 66 6f 72 20 74 65 73 74 69 6e  ation for testin
38170 67 20 70 75 72 70 6f 73 65 73 2e 20 20 2a 2f 0a  g purposes.  */.
38180 20 20 20 20 20 20 69 66 28 20 6f 72 64 65 72 42        if( orderB
38190 79 47 72 70 20 26 26 20 4f 70 74 69 6d 69 7a 61  yGrp && Optimiza
381a0 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
381b0 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72  SQLITE_GroupByOr
381c0 64 65 72 29 20 0a 20 20 20 20 20 20 20 26 26 20  der) .       && 
381d0 28 67 72 6f 75 70 42 79 53 6f 72 74 20 7c 7c 20  (groupBySort || 
381e0 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 53 6f  sqlite3WhereIsSo
381f0 72 74 65 64 28 70 57 49 6e 66 6f 29 29 0a 20 20  rted(pWInfo)).  
38200 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
38210 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
38220 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
38230 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
38240 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72  op(v, sSort.addr
38250 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20  SortIndex);.    
38260 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76    }..      /* Ev
38270 61 6c 75 61 74 65 20 74 68 65 20 63 75 72 72 65  aluate the curre
38280 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  nt GROUP BY term
38290 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62  s and store in b
382a0 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20  0, b1, b2....   
382b0 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d     ** (b0 is mem
382c0 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d  ory location iBM
382d0 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65  em+0, b1 is iBMe
382e0 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  m+1, and so fort
382f0 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e  h).      ** Then
38300 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72   compare the cur
38310 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65  rent GROUP BY te
38320 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  rms against the 
38330 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20  GROUP BY terms. 
38340 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65       ** from the
38350 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75   previous row cu
38360 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69  rrently stored i
38370 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a  n a0, a1, a2....
38380 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
38390 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73  ddrTopOf