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

Artifact 164270b9b1ce06dbada9225e5dfaed08d61f96da0d98dfd2a93460f62414d620:


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: 69 6e 74 20 6c 61 62 65 6c 4f 42 4c 6f 70 74 3b  int labelOBLopt;
0a60: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
0a70: 72 65 20 77 68 65 6e 20 73 6f 72 74 65 72 20 69  re when sorter i
0a80: 73 20 66 75 6c 6c 20 2a 2f 0a 20 20 75 38 20 73  s full */.  u8 s
0a90: 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20 20 20  ortFlags;       
0aa0: 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72    /* Zero or mor
0ab0: 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62 69 74  e SORTFLAG_* bit
0ac0: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
0ad0: 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
0ae0: 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 75 38  _REFERENCES.  u8
0af0: 20 6e 44 65 66 65 72 3b 20 20 20 20 20 20 20 20   nDefer;        
0b00: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0b10: 20 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69   valid entries i
0b20: 6e 20 61 44 65 66 65 72 5b 5d 20 2a 2f 0a 20 20  n aDefer[] */.  
0b30: 73 74 72 75 63 74 20 44 65 66 65 72 72 65 64 43  struct DeferredC
0b40: 73 72 20 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  sr {.    Table *
0b50: 70 54 61 62 3b 20 20 20 20 20 20 20 20 2f 2a 20  pTab;        /* 
0b60: 54 61 62 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e  Table definition
0b70: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 73 72   */.    int iCsr
0b80: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
0b90: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
0ba0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e   table */.    in
0bb0: 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20 20  t nKey;         
0bc0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50    /* Number of P
0bd0: 4b 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 74 61  K columns for ta
0be0: 62 6c 65 20 70 54 61 62 20 28 3e 3d 31 29 20 2a  ble pTab (>=1) *
0bf0: 2f 0a 20 20 7d 20 61 44 65 66 65 72 5b 34 5d 3b  /.  } aDefer[4];
0c00: 0a 23 65 6e 64 69 66 0a 20 20 73 74 72 75 63 74  .#endif.  struct
0c10: 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20 2a 70 44   RowLoadInfo *pD
0c20: 65 66 65 72 72 65 64 52 6f 77 4c 6f 61 64 3b 20  eferredRowLoad; 
0c30: 20 2f 2a 20 44 65 66 65 72 72 65 64 20 72 6f 77   /* Deferred row
0c40: 20 6c 6f 61 64 69 6e 67 20 69 6e 66 6f 20 6f 72   loading info or
0c50: 20 4e 55 4c 4c 20 2a 2f 0a 7d 3b 0a 23 64 65 66   NULL */.};.#def
0c60: 69 6e 65 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  ine SORTFLAG_Use
0c70: 53 6f 72 74 65 72 20 20 30 78 30 31 20 20 20 2f  Sorter  0x01   /
0c80: 2a 20 55 73 65 20 53 6f 72 74 65 72 4f 70 65 6e  * Use SorterOpen
0c90: 20 69 6e 73 74 65 61 64 20 6f 66 20 4f 70 65 6e   instead of Open
0ca0: 45 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a  Ephemeral */../*
0cb0: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 74  .** Delete all t
0cc0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
0cd0: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0ce0: 2e 20 20 44 65 61 6c 6c 6f 63 61 74 65 20 74 68  .  Deallocate th
0cf0: 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69  e structure.** i
0d00: 74 73 65 6c 66 20 6f 6e 6c 79 20 69 66 20 62 46  tself only if bF
0d10: 72 65 65 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a  ree is true..*/.
0d20: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61  static void clea
0d30: 72 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 20  rSelect(sqlite3 
0d40: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  *db, Select *p, 
0d50: 69 6e 74 20 62 46 72 65 65 29 7b 0a 20 20 77 68  int bFree){.  wh
0d60: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 53 65  ile( p ){.    Se
0d70: 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70  lect *pPrior = p
0d80: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 73 71  ->pPrior;.    sq
0d90: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
0da0: 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  ete(db, p->pELis
0db0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  t);.    sqlite3S
0dc0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
0dd0: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 73   p->pSrc);.    s
0de0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
0df0: 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b  (db, p->pWhere);
0e00: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0e10: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
0e20: 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
0e30: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
0e40: 74 65 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  te(db, p->pHavin
0e50: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  g);.    sqlite3E
0e60: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
0e70: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
0e80: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
0e90: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
0ea0: 6d 69 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  mit);.#ifndef SQ
0eb0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
0ec0: 46 55 4e 43 0a 20 20 20 20 69 66 28 20 4f 4b 5f  FUNC.    if( OK_
0ed0: 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70  IF_ALWAYS_TRUE(p
0ee0: 2d 3e 70 57 69 6e 44 65 66 6e 29 20 29 7b 0a 20  ->pWinDefn) ){. 
0ef0: 20 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64       sqlite3Wind
0f00: 6f 77 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  owListDelete(db,
0f10: 20 70 2d 3e 70 57 69 6e 44 65 66 6e 29 3b 0a 20   p->pWinDefn);. 
0f20: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
0f30: 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53  if( OK_IF_ALWAYS
0f40: 5f 54 52 55 45 28 70 2d 3e 70 57 69 74 68 29 20  _TRUE(p->pWith) 
0f50: 29 20 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c  ) sqlite3WithDel
0f60: 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69 74 68  ete(db, p->pWith
0f70: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
0f80: 2d 3e 70 57 69 6e 3d 3d 30 20 29 3b 0a 20 20 20  ->pWin==0 );.   
0f90: 20 69 66 28 20 62 46 72 65 65 20 29 20 73 71 6c   if( bFree ) sql
0fa0: 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
0fb0: 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70 50 72   p);.    p = pPr
0fc0: 69 6f 72 3b 0a 20 20 20 20 62 46 72 65 65 20 3d  ior;.    bFree =
0fd0: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
0fe0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 53 65   Initialize a Se
0ff0: 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75  lectDest structu
1000: 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  re..*/.void sqli
1010: 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
1020: 74 28 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44  t(SelectDest *pD
1030: 65 73 74 2c 20 69 6e 74 20 65 44 65 73 74 2c 20  est, int eDest, 
1040: 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 70 44  int iParm){.  pD
1050: 65 73 74 2d 3e 65 44 65 73 74 20 3d 20 28 75 38  est->eDest = (u8
1060: 29 65 44 65 73 74 3b 0a 20 20 70 44 65 73 74 2d  )eDest;.  pDest-
1070: 3e 69 53 44 50 61 72 6d 20 3d 20 69 50 61 72 6d  >iSDParm = iParm
1080: 3b 0a 20 20 70 44 65 73 74 2d 3e 7a 41 66 66 53  ;.  pDest->zAffS
1090: 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73 74  dst = 0;.  pDest
10a0: 2d 3e 69 53 64 73 74 20 3d 20 30 3b 0a 20 20 70  ->iSdst = 0;.  p
10b0: 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 30 3b  Dest->nSdst = 0;
10c0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  .}.../*.** Alloc
10d0: 61 74 65 20 61 20 6e 65 77 20 53 65 6c 65 63 74  ate a new Select
10e0: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 72   structure and r
10f0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1100: 74 6f 20 74 68 61 74 0a 2a 2a 20 73 74 72 75 63  to that.** struc
1110: 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20  ture..*/.Select 
1120: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65  *sqlite3SelectNe
1130: 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  w(.  Parse *pPar
1140: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
1150: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1160: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
1170: 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69 63  ist,     /* whic
1180: 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63  h columns to inc
1190: 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65 73 75  lude in the resu
11a0: 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  lt */.  SrcList 
11b0: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f 2a  *pSrc,        /*
11c0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
11d0: 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65 73   -- which tables
11e0: 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78   to scan */.  Ex
11f0: 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
1200: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45      /* the WHERE
1210: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
1220: 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 2c  rList *pGroupBy,
1230: 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50 20     /* the GROUP 
1240: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  BY clause */.  E
1250: 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20 20  xpr *pHaving,   
1260: 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56 49       /* the HAVI
1270: 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  NG clause */.  E
1280: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
1290: 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44 45  y,   /* the ORDE
12a0: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
12b0: 20 75 33 32 20 73 65 6c 46 6c 61 67 73 2c 20 20   u32 selFlags,  
12c0: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 70         /* Flag p
12d0: 61 72 61 6d 65 74 65 72 73 2c 20 73 75 63 68 20  arameters, such 
12e0: 61 73 20 53 46 5f 44 69 73 74 69 6e 63 74 20 2a  as SF_Distinct *
12f0: 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74  /.  Expr *pLimit
1300: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d            /* LIM
1310: 49 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20  IT value.  NULL 
1320: 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a  means not used *
1330: 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
1340: 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 73 74  New;.  Select st
1350: 61 6e 64 69 6e 3b 0a 20 20 70 4e 65 77 20 3d 20  andin;.  pNew = 
1360: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
1370: 61 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c  awNN(pParse->db,
1380: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
1390: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
13a0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
13b0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
13c0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70  cFailed );.    p
13d0: 4e 65 77 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a  New = &standin;.
13e0: 20 20 7d 0a 20 20 69 66 28 20 70 45 4c 69 73 74    }.  if( pEList
13f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 45 4c 69 73  ==0 ){.    pELis
1400: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
1410: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
1420: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1440: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1450: 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 54  xpr(pParse->db,T
1460: 4b 5f 41 53 54 45 52 49 53 4b 2c 30 29 29 3b 0a  K_ASTERISK,0));.
1470: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69    }.  pNew->pELi
1480: 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 70  st = pEList;.  p
1490: 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c  New->op = TK_SEL
14a0: 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c  ECT;.  pNew->sel
14b0: 46 6c 61 67 73 20 3d 20 73 65 6c 46 6c 61 67 73  Flags = selFlags
14c0: 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74  ;.  pNew->iLimit
14d0: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f   = 0;.  pNew->iO
14e0: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4e 65  ffset = 0;.  pNe
14f0: 77 2d 3e 73 65 6c 49 64 20 3d 20 2b 2b 70 50 61  w->selId = ++pPa
1500: 72 73 65 2d 3e 6e 53 65 6c 65 63 74 3b 0a 20 20  rse->nSelect;.  
1510: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
1520: 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[0] = -1;.  pN
1530: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
1540: 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [1] = -1;.  pNew
1550: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30  ->nSelectRow = 0
1560: 3b 0a 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20  ;.  if( pSrc==0 
1570: 29 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ) pSrc = sqlite3
1580: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61  DbMallocZero(pPa
1590: 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28  rse->db, sizeof(
15a0: 2a 70 53 72 63 29 29 3b 0a 20 20 70 4e 65 77 2d  *pSrc));.  pNew-
15b0: 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20  >pSrc = pSrc;.  
15c0: 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70  pNew->pWhere = p
15d0: 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 70  Where;.  pNew->p
15e0: 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70  GroupBy = pGroup
15f0: 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76  By;.  pNew->pHav
1600: 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20  ing = pHaving;. 
1610: 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
1620: 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 4e  = pOrderBy;.  pN
1630: 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a  ew->pPrior = 0;.
1640: 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20    pNew->pNext = 
1650: 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69  0;.  pNew->pLimi
1660: 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e  t = pLimit;.  pN
1670: 65 77 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 23  ew->pWith = 0;.#
1680: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1690: 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20  IT_WINDOWFUNC.  
16a0: 70 4e 65 77 2d 3e 70 57 69 6e 20 3d 20 30 3b 0a  pNew->pWin = 0;.
16b0: 20 20 70 4e 65 77 2d 3e 70 57 69 6e 44 65 66 6e    pNew->pWinDefn
16c0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69   = 0;.#endif.  i
16d0: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
16e0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a  allocFailed ) {.
16f0: 20 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28      clearSelect(
1700: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 65 77  pParse->db, pNew
1710: 2c 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e  , pNew!=&standin
1720: 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b  );.    pNew = 0;
1730: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
1740: 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 53 72 63  sert( pNew->pSrc
1750: 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  !=0 || pParse->n
1760: 45 72 72 3e 30 20 29 3b 0a 20 20 7d 0a 20 20 61  Err>0 );.  }.  a
1770: 73 73 65 72 74 28 20 70 4e 65 77 21 3d 26 73 74  ssert( pNew!=&st
1780: 61 6e 64 69 6e 20 29 3b 0a 20 20 72 65 74 75 72  andin );.  retur
1790: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  n pNew;.}.../*.*
17a0: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67 69 76  * Delete the giv
17b0: 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  en Select struct
17c0: 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69  ure and all of i
17d0: 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65 73  ts substructures
17e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
17f0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 73 71  3SelectDelete(sq
1800: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
1810: 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 4f 4b 5f  t *p){.  if( OK_
1820: 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70  IF_ALWAYS_TRUE(p
1830: 29 20 29 20 63 6c 65 61 72 53 65 6c 65 63 74 28  ) ) clearSelect(
1840: 64 62 2c 20 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a  db, p, 1);.}../*
1850: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
1860: 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69 67 68  nter to the righ
1870: 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
1880: 61 74 65 6d 65 6e 74 20 69 6e 20 61 20 63 6f 6d  atement in a com
1890: 70 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  pound..*/.static
18a0: 20 53 65 6c 65 63 74 20 2a 66 69 6e 64 52 69 67   Select *findRig
18b0: 68 74 6d 6f 73 74 28 53 65 6c 65 63 74 20 2a 70  htmost(Select *p
18c0: 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70  ){.  while( p->p
18d0: 4e 65 78 74 20 29 20 70 20 3d 20 70 2d 3e 70 4e  Next ) p = p->pN
18e0: 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  ext;.  return p;
18f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
1900: 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69 65  1 to 3 identifie
1910: 72 73 20 70 72 65 63 65 64 69 6e 67 20 74 68 65  rs preceding the
1920: 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64   JOIN keyword, d
1930: 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20  etermine the.** 
1940: 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52  type of join.  R
1950: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
1960: 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 65   constant that e
1970: 78 70 72 65 73 73 65 73 20 74 68 61 74 20 74 79  xpresses that ty
1980: 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f  pe.** in terms o
1990: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
19a0: 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a  bit values:.**.*
19b0: 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a  *     JT_INNER.*
19c0: 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a  *     JT_CROSS.*
19d0: 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a  *     JT_OUTER.*
19e0: 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c  *     JT_NATURAL
19f0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a  .**     JT_LEFT.
1a00: 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54 0a  **     JT_RIGHT.
1a10: 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74  **.** A full out
1a20: 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20 63  er join is the c
1a30: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54  ombination of JT
1a40: 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49 47  _LEFT and JT_RIG
1a50: 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  HT..**.** If an 
1a60: 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75 70  illegal or unsup
1a70: 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65  ported join type
1a80: 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 73   is seen, then s
1a90: 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61  till return.** a
1aa0: 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74 20   join type, but 
1ab0: 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  put an error in 
1ac0: 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
1ad0: 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ture..*/.int sql
1ae0: 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61 72  ite3JoinType(Par
1af0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
1b00: 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42  n *pA, Token *pB
1b10: 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20  , Token *pC){.  
1b20: 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30  int jointype = 0
1b30: 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c  ;.  Token *apAll
1b40: 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b  [3];.  Token *p;
1b50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b70: 20 20 20 30 31 32 33 34 35 36 37 38 39 20 31 32     0123456789 12
1b80: 33 34 35 36 37 38 39 20 31 32 33 34 35 36 37 38  3456789 12345678
1b90: 39 20 31 32 33 20 2a 2f 0a 20 20 73 74 61 74 69  9 123 */.  stati
1ba0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65  c const char zKe
1bb0: 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61 74 75 72  yText[] = "natur
1bc0: 61 6c 65 66 74 6f 75 74 65 72 69 67 68 74 66 75  aleftouterightfu
1bd0: 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22 3b 0a 20  llinnercross";. 
1be0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
1bf0: 72 75 63 74 20 7b 0a 20 20 20 20 75 38 20 69 3b  ruct {.    u8 i;
1c00: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
1c10: 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f 72 64 20  ning of keyword 
1c20: 74 65 78 74 20 69 6e 20 7a 4b 65 79 54 65 78 74  text in zKeyText
1c30: 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 6e 43 68  [] */.    u8 nCh
1c40: 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68  ar;    /* Length
1c50: 20 6f 66 20 74 68 65 20 6b 65 79 77 6f 72 64 20   of the keyword 
1c60: 69 6e 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f  in characters */
1c70: 0a 20 20 20 20 75 38 20 63 6f 64 65 3b 20 20 20  .    u8 code;   
1c80: 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70 65 20 6d    /* Join type m
1c90: 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77  ask */.  } aKeyw
1ca0: 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a  ord[] = {.    /*
1cb0: 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b 20 30 2c   natural */ { 0,
1cc0: 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20    7, JT_NATURAL 
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1ce0: 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74 20 20 20  ,.    /* left   
1cf0: 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20 4a 54 5f   */ { 6,  4, JT_
1d00: 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20  LEFT|JT_OUTER   
1d10: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1d20: 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b 20 31 30   outer   */ { 10
1d30: 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 20 20  , 5, JT_OUTER   
1d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1d50: 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68 74 20 20  ,.    /* right  
1d60: 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20 4a 54 5f   */ { 14, 5, JT_
1d70: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 20  RIGHT|JT_OUTER  
1d80: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1d90: 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b 20 31 39   full    */ { 19
1da0: 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f  , 4, JT_LEFT|JT_
1db0: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d  RIGHT|JT_OUTER }
1dc0: 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65 72 20 20  ,.    /* inner  
1dd0: 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20 4a 54 5f   */ { 23, 5, JT_
1de0: 49 4e 4e 45 52 20 20 20 20 20 20 20 20 20 20 20  INNER           
1df0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1e00: 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b 20 32 38   cross   */ { 28
1e10: 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54  , 5, JT_INNER|JT
1e20: 5f 43 52 4f 53 53 20 20 20 20 20 20 20 20 20 7d  _CROSS         }
1e30: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20  ,.  };.  int i, 
1e40: 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20  j;.  apAll[0] = 
1e50: 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d  pA;.  apAll[1] =
1e60: 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20   pB;.  apAll[2] 
1e70: 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  = pC;.  for(i=0;
1e80: 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d   i<3 && apAll[i]
1e90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
1ea0: 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f  apAll[i];.    fo
1eb0: 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69  r(j=0; j<ArraySi
1ec0: 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b 20 6a 2b  ze(aKeyword); j+
1ed0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
1ee0: 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e  >n==aKeyword[j].
1ef0: 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20  nChar .         
1f00: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
1f10: 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c  Cmp((char*)p->z,
1f20: 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b 65 79 77   &zKeyText[aKeyw
1f30: 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29  ord[j].i], p->n)
1f40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a  ==0 ){.        j
1f50: 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b 65 79 77  ointype |= aKeyw
1f60: 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20  ord[j].code;.   
1f70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f80: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65    }.    }.    te
1f90: 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 7c 7c 20  stcase( j==0 || 
1fa0: 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20  j==1 || j==2 || 
1fb0: 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20  j==3 || j==4 || 
1fc0: 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a  j==5 || j==6 );.
1fd0: 20 20 20 20 69 66 28 20 6a 3e 3d 41 72 72 61 79      if( j>=Array
1fe0: 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 20 29  Size(aKeyword) )
1ff0: 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65  {.      jointype
2000: 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20   |= JT_ERROR;.  
2010: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2020: 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20  .  }.  if(.     
2030: 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f  (jointype & (JT_
2040: 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29  INNER|JT_OUTER))
2050: 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f  ==(JT_INNER|JT_O
2060: 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a  UTER) ||.     (j
2070: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52  ointype & JT_ERR
2080: 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  OR)!=0.  ){.    
2090: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 20  const char *zSp 
20a0: 3d 20 22 20 22 3b 0a 20 20 20 20 61 73 73 65 72  = " ";.    asser
20b0: 74 28 20 70 42 21 3d 30 20 29 3b 0a 20 20 20 20  t( pB!=0 );.    
20c0: 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70  if( pC==0 ){ zSp
20d0: 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74 65  ++; }.    sqlite
20e0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
20f0: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e  , "unknown or un
2100: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
2110: 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20 22 25  ype: ".       "%
2120: 54 20 25 54 25 73 25 54 22 2c 20 70 41 2c 20 70  T %T%s%T", pA, p
2130: 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20  B, zSp, pC);.   
2140: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49   jointype = JT_I
2150: 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NNER;.  }else if
2160: 28 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  ( (jointype & JT
2170: 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20 20  _OUTER)!=0 .    
2180: 20 20 20 20 20 26 26 20 28 6a 6f 69 6e 74 79 70       && (jointyp
2190: 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  e & (JT_LEFT|JT_
21a0: 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c 45 46 54  RIGHT))!=JT_LEFT
21b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
21c0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
21d0: 0a 20 20 20 20 20 20 22 52 49 47 48 54 20 61 6e  .      "RIGHT an
21e0: 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49  d FULL OUTER JOI
21f0: 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65  Ns are not curre
2200: 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29  ntly supported")
2210: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
2220: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20   JT_INNER;.  }. 
2230: 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65   return jointype
2240: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2250: 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  n the index of a
2260: 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62   column in a tab
2270: 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69  le.  Return -1 i
2280: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  f the column.** 
2290: 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
22a0: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
22b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c  /.static int col
22c0: 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a  umnIndex(Table *
22d0: 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72  pTab, const char
22e0: 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69   *zCol){.  int i
22f0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
2300: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
2310: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2320: 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43  StrICmp(pTab->aC
2330: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f  ol[i].zName, zCo
2340: 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  l)==0 ) return i
2350: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
2360: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  1;.}../*.** Sear
2370: 63 68 20 74 68 65 20 66 69 72 73 74 20 4e 20 74  ch the first N t
2380: 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2c 20 66  ables in pSrc, f
2390: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
23a0: 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  t, looking for a
23b0: 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61 74 20 68  .** table that h
23c0: 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  as a column name
23d0: 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20  d zCol.  .**.** 
23e0: 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73 65 74 20  When found, set 
23f0: 2a 70 69 54 61 62 20 61 6e 64 20 2a 70 69 43 6f  *piTab and *piCo
2400: 6c 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 69  l to the table i
2410: 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  ndex and column 
2420: 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74 68 65 20  index.** of the 
2430: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
2440: 61 6e 64 20 72 65 74 75 72 6e 20 54 52 55 45 2e  and return TRUE.
2450: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20 66 6f  .**.** If not fo
2460: 75 6e 64 2c 20 72 65 74 75 72 6e 20 46 41 4c 53  und, return FALS
2470: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
2480: 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49   tableAndColumnI
2490: 6e 64 65 78 28 0a 20 20 53 72 63 4c 69 73 74 20  ndex(.  SrcList 
24a0: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 2f 2a 20  *pSrc,       /* 
24b0: 41 72 72 61 79 20 6f 66 20 74 61 62 6c 65 73 20  Array of tables 
24c0: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69  to search */.  i
24d0: 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20  nt N,           
24e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
24f0: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2d   tables in pSrc-
2500: 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63 68 20 2a  >a[] to search *
2510: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2520: 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65  zCol,    /* Name
2530: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77   of the column w
2540: 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f  e are looking fo
2550: 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61  r */.  int *piTa
2560: 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  b,          /* W
2570: 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53  rite index of pS
2580: 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20 2a 2f 0a  rc->a[] here */.
2590: 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20 20 20 20    int *piCol    
25a0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
25b0: 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d 3e 61  index of pSrc->a
25c0: 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62 2d 3e 61  [*piTab].pTab->a
25d0: 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a 29 7b  Col[] here */.){
25e0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
25f0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
2600: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c  ooping over tabl
2610: 65 73 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20  es in pSrc */.  
2620: 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  int iCol;       
2630: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2640: 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68 69 6e 67   column matching
2650: 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73 65   zCol */..  asse
2660: 72 74 28 20 28 70 69 54 61 62 3d 3d 30 29 3d 3d  rt( (piTab==0)==
2670: 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f  (piCol==0) );  /
2680: 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69 74 68 65  * Both or neithe
2690: 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  r are NULL */.  
26a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b  for(i=0; i<N; i+
26b0: 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 63  +){.    iCol = c
26c0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2d  olumnIndex(pSrc-
26d0: 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c  >a[i].pTab, zCol
26e0: 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e  );.    if( iCol>
26f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
2700: 70 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  piTab ){.       
2710: 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a 20 20 20   *piTab = i;.   
2720: 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 43       *piCol = iC
2730: 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ol;.      }.    
2740: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2750: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2770: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
2780: 20 74 6f 20 61 64 64 20 74 65 72 6d 73 20 69 6d   to add terms im
2790: 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e 20 73 79  plied by JOIN sy
27a0: 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a 2a 20 57  ntax to the.** W
27b0: 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72  HERE clause expr
27c0: 65 73 73 69 6f 6e 20 6f 66 20 61 20 53 45 4c 45  ession of a SELE
27d0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  CT statement. Th
27e0: 65 20 6e 65 77 20 74 65 72 6d 2c 20 77 68 69 63  e new term, whic
27f0: 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64 20 77 69  h.** is ANDed wi
2800: 74 68 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  th the existing 
2810: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 73  WHERE clause, is
2820: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
2830: 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e 63 6f 6c  .**    (tab1.col
2840: 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32 29 0a 2a  1 = tab2.col2).*
2850: 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 31 20  *.** where tab1 
2860: 69 73 20 74 68 65 20 69 53 72 63 27 74 68 20 74  is the iSrc'th t
2870: 61 62 6c 65 20 69 6e 20 53 72 63 4c 69 73 74 20  able in SrcList 
2880: 70 53 72 63 20 61 6e 64 20 74 61 62 32 20 69 73  pSrc and tab2 is
2890: 20 74 68 65 20 0a 2a 2a 20 28 69 53 72 63 2b 31   the .** (iSrc+1
28a0: 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c  )'th. Column col
28b0: 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c  1 is column iCol
28c0: 4c 65 66 74 20 6f 66 20 74 61 62 31 2c 20 61 6e  Left of tab1, an
28d0: 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c  d col2 is.** col
28e0: 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74 20 6f 66  umn iColRight of
28f0: 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63   tab2..*/.static
2900: 20 76 6f 69 64 20 61 64 64 57 68 65 72 65 54 65   void addWhereTe
2910: 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rm(.  Parse *pPa
2920: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
2930: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
2940: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
2950: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
2960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2970: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
2980: 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  in FROM clause *
2990: 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74 2c 20 20  /.  int iLeft,  
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
29c0: 66 69 72 73 74 20 74 61 62 6c 65 20 74 6f 20 6a  first table to j
29d0: 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20  oin in pSrc */. 
29e0: 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74 2c 20 20   int iColLeft,  
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a00: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
2a10: 75 6d 6e 20 69 6e 20 66 69 72 73 74 20 74 61 62  umn in first tab
2a20: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67  le */.  int iRig
2a30: 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ht,             
2a40: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2a50: 20 6f 66 20 73 65 63 6f 6e 64 20 74 61 62 6c 65   of second table
2a60: 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e   in pSrc */.  in
2a70: 74 20 69 43 6f 6c 52 69 67 68 74 2c 20 20 20 20  t iColRight,    
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a90: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
2aa0: 20 69 6e 20 73 65 63 6f 6e 64 20 74 61 62 6c 65   in second table
2ab0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74 65   */.  int isOute
2ac0: 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20 20 20 20  rJoin,          
2ad0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2ae0: 20 74 68 69 73 20 69 73 20 61 6e 20 4f 55 54 45   this is an OUTE
2af0: 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72  R join */.  Expr
2b00: 20 2a 2a 70 70 57 68 65 72 65 20 20 20 20 20 20   **ppWhere      
2b10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2b20: 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48 45 52 45  N/OUT: The WHERE
2b30: 20 63 6c 61 75 73 65 20 74 6f 20 61 64 64 20 74   clause to add t
2b40: 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  o */.){.  sqlite
2b50: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
2b60: 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 31 3b  db;.  Expr *pE1;
2b70: 0a 20 20 45 78 70 72 20 2a 70 45 32 3b 0a 20 20  .  Expr *pE2;.  
2b80: 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73  Expr *pEq;..  as
2b90: 73 65 72 74 28 20 69 4c 65 66 74 3c 69 52 69 67  sert( iLeft<iRig
2ba0: 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ht );.  assert( 
2bb0: 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52 69 67 68  pSrc->nSrc>iRigh
2bc0: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
2bd0: 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70 54  Src->a[iLeft].pT
2be0: 61 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ab );.  assert( 
2bf0: 70 53 72 63 2d 3e 61 5b 69 52 69 67 68 74 5d 2e  pSrc->a[iRight].
2c00: 70 54 61 62 20 29 3b 0a 0a 20 20 70 45 31 20 3d  pTab );..  pE1 =
2c10: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f   sqlite3CreateCo
2c20: 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72  lumnExpr(db, pSr
2c30: 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f 6c 4c 65  c, iLeft, iColLe
2c40: 66 74 29 3b 0a 20 20 70 45 32 20 3d 20 73 71 6c  ft);.  pE2 = sql
2c50: 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e  ite3CreateColumn
2c60: 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20 69  Expr(db, pSrc, i
2c70: 52 69 67 68 74 2c 20 69 43 6f 6c 52 69 67 68 74  Right, iColRight
2c80: 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73 71 6c 69  );..  pEq = sqli
2c90: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
2ca0: 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20 70 45 32   TK_EQ, pE1, pE2
2cb0: 29 3b 0a 20 20 69 66 28 20 70 45 71 20 26 26 20  );.  if( pEq && 
2cc0: 69 73 4f 75 74 65 72 4a 6f 69 6e 20 29 7b 0a 20  isOuterJoin ){. 
2cd0: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
2ce0: 74 79 28 70 45 71 2c 20 45 50 5f 46 72 6f 6d 4a  ty(pEq, EP_FromJ
2cf0: 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72 74  oin);.    assert
2d00: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2d10: 74 79 28 70 45 71 2c 20 45 50 5f 54 6f 6b 65 6e  ty(pEq, EP_Token
2d20: 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
2d30: 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74 56   );.    ExprSetV
2d40: 56 41 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20  VAProperty(pEq, 
2d50: 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
2d60: 20 20 70 45 71 2d 3e 69 52 69 67 68 74 4a 6f 69    pEq->iRightJoi
2d70: 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 70 45  nTable = (i16)pE
2d80: 32 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 7d 0a 20  2->iTable;.  }. 
2d90: 20 2a 70 70 57 68 65 72 65 20 3d 20 73 71 6c 69   *ppWhere = sqli
2da0: 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
2db0: 65 2c 20 2a 70 70 57 68 65 72 65 2c 20 70 45 71  e, *ppWhere, pEq
2dc0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  );.}../*.** Set 
2dd0: 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20  the EP_FromJoin 
2de0: 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20  property on all 
2df0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76  terms of the giv
2e00: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  en expression..*
2e10: 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20 45 78  * And set the Ex
2e20: 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  pr.iRightJoinTab
2e30: 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f 72  le to iTable for
2e40: 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74   every term in t
2e50: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
2e60: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46  ..**.** The EP_F
2e70: 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79  romJoin property
2e80: 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d   is used on term
2e90: 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  s of an expressi
2ea0: 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68  on to tell.** th
2eb0: 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  e LEFT OUTER JOI
2ec0: 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67  N processing log
2ed0: 69 63 20 74 68 61 74 20 74 68 69 73 20 74 65 72  ic that this ter
2ee0: 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  m is part of the
2ef0: 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63  .** join restric
2f00: 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69  tion specified i
2f10: 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  n the ON or USIN
2f20: 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74  G clause and not
2f30: 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68   a part.** of th
2f40: 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57  e more general W
2f50: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68  HERE clause.  Th
2f60: 65 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f  ese terms are mo
2f70: 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a  ved over to the.
2f80: 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
2f90: 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63  during join proc
2fa0: 65 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65  essing but we ne
2fb0: 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
2fc0: 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67  hat they.** orig
2fd0: 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e  inated in the ON
2fe0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
2ff0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72  ..**.** The Expr
3000: 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  .iRightJoinTable
3010: 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52 45   tells the WHERE
3020: 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
3030: 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 65  ng that the.** e
3040: 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e 64  xpression depend
3050: 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67 68  s on table iRigh
3060: 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e 20  tJoinTable even 
3070: 69 66 20 74 68 61 74 20 74 61 62 6c 65 20 69 73  if that table is
3080: 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74   not.** explicit
3090: 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20  ly mentioned in 
30a0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  the expression. 
30b0: 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f   That informatio
30c0: 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66  n is needed.** f
30d0: 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68  or cases like th
30e0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  is:.**.**    SEL
30f0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45  ECT * FROM t1 LE
3100: 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31  FT JOIN t2 ON t1
3110: 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e 78  .a=t2.b AND t1.x
3120: 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65  =5.**.** The whe
3130: 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20  re clause needs 
3140: 74 6f 20 64 65 66 65 72 20 74 68 65 20 68 61 6e  to defer the han
3150: 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31 2e  dling of the t1.
3160: 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69  x=5.** term unti
3170: 6c 20 61 66 74 65 72 20 74 68 65 20 74 32 20 6c  l after the t2 l
3180: 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  oop of the join.
3190: 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20 61    In that way, a
31a0: 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20  .** NULL t2 row 
31b0: 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64  will be inserted
31c0: 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21 3d   whenever t1.x!=
31d0: 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74  5.  If we do not
31e0: 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68 61  .** defer the ha
31f0: 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35  ndling of t1.x=5
3200: 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72 6f  , it will be pro
3210: 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74 65  cessed immediate
3220: 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65 20  ly.** after the 
3230: 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73  t1 loop and rows
3240: 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77 69   with t1.x!=5 wi
3250: 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72 20  ll never appear 
3260: 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74  in.** the output
3270: 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f 72  , which is incor
3280: 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rect..*/.static 
3290: 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72  void setJoinExpr
32a0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54  (Expr *p, int iT
32b0: 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20  able){.  while( 
32c0: 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  p ){.    ExprSet
32d0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46  Property(p, EP_F
32e0: 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73  romJoin);.    as
32f0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
3300: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
3310: 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
3320: 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65  d) );.    ExprSe
3330: 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 2c 20  tVVAProperty(p, 
3340: 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
3350: 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54    p->iRightJoinT
3360: 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54 61 62  able = (i16)iTab
3370: 6c 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f  le;.    if( p->o
3380: 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 26  p==TK_FUNCTION &
3390: 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a  & p->x.pList ){.
33a0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
33b0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
33c0: 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  >x.pList->nExpr;
33d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
33e0: 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 78 2e  etJoinExpr(p->x.
33f0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
3400: 72 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  r, iTable);.    
3410: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 65    }.    }.    se
3420: 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65  tJoinExpr(p->pLe
3430: 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20  ft, iTable);.   
3440: 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a   p = p->pRight;.
3450: 20 20 7d 20 0a 7d 0a 0a 2f 2a 20 55 6e 64 6f 20    } .}../* Undo 
3460: 74 68 65 20 77 6f 72 6b 20 6f 66 20 73 65 74 4a  the work of setJ
3470: 6f 69 6e 45 78 70 72 28 29 2e 20 20 49 6e 20 74  oinExpr().  In t
3480: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  he expression tr
3490: 65 65 20 70 2c 20 63 6f 6e 76 65 72 74 20 65 76  ee p, convert ev
34a0: 65 72 79 0a 2a 2a 20 74 65 72 6d 20 74 68 61 74  ery.** term that
34b0: 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
34c0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 61 6e 64 20  EP_FromJoin and 
34d0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d  iRightJoinTable=
34e0: 3d 69 54 61 62 6c 65 20 69 6e 74 6f 0a 2a 2a 20  =iTable into.** 
34f0: 61 6e 20 6f 72 64 69 6e 61 72 79 20 74 65 72 6d  an ordinary term
3500: 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68 65 20   that omits the 
3510: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 6d 61 72 6b  EP_FromJoin mark
3520: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 68 61 70  ..**.** This hap
3530: 70 65 6e 73 20 77 68 65 6e 20 61 20 4c 45 46 54  pens when a LEFT
3540: 20 4a 4f 49 4e 20 69 73 20 73 69 6d 70 6c 69 66   JOIN is simplif
3550: 69 65 64 20 69 6e 74 6f 20 61 6e 20 6f 72 64 69  ied into an ordi
3560: 6e 61 72 79 20 4a 4f 49 4e 2e 0a 2a 2f 0a 73 74  nary JOIN..*/.st
3570: 61 74 69 63 20 76 6f 69 64 20 75 6e 73 65 74 4a  atic void unsetJ
3580: 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c  oinExpr(Expr *p,
3590: 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20   int iTable){.  
35a0: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
35b0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
35c0: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
35d0: 69 6e 29 0a 20 20 20 20 20 26 26 20 28 69 54 61  in).     && (iTa
35e0: 62 6c 65 3c 30 20 7c 7c 20 70 2d 3e 69 52 69 67  ble<0 || p->iRig
35f0: 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69 54 61  htJoinTable==iTa
3600: 62 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 45 78  ble) ){.      Ex
3610: 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  prClearProperty(
3620: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  p, EP_FromJoin);
3630: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
3640: 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op==TK_FUNCTIO
3650: 4e 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20  N && p->x.pList 
3660: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
3670: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
3680: 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  <p->x.pList->nEx
3690: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
36a0: 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28    unsetJoinExpr(
36b0: 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d  p->x.pList->a[i]
36c0: 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 29 3b  .pExpr, iTable);
36d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
36e0: 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72     unsetJoinExpr
36f0: 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c  (p->pLeft, iTabl
3700: 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  e);.    p = p->p
3710: 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f  Right;.  } .}../
3720: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3730: 65 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20  e processes the 
3740: 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  join information
3750: 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74   for a SELECT st
3760: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61  atement..** ON a
3770: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
3780: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69   are converted i
3790: 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20  nto extra terms 
37a0: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
37b0: 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20  use..** NATURAL 
37c0: 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74  joins also creat
37d0: 65 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c  e extra WHERE cl
37e0: 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a  ause terms..**.*
37f0: 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61  * The terms of a
3800: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65   FROM clause are
3810: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
3820: 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74  e Select.pSrc st
3830: 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20  ructure..** The 
3840: 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20  left most table 
3850: 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  is the first ent
3860: 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72  ry in Select.pSr
3870: 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  c.  The right-mo
3880: 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74  st.** table is t
3890: 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20  he last entry.  
38a0: 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  The join operato
38b0: 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65  r is held in the
38c0: 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65   entry to.** the
38d0: 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74   left.  Thus ent
38e0: 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68  ry 0 contains th
38f0: 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
3900: 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74  for the join bet
3910: 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20  ween.** entries 
3920: 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e  0 and 1.  Any ON
3930: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
3940: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
3950: 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a  h the join are.*
3960: 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20  * also attached 
3970: 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72  to the left entr
3980: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
3990: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
39a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
39b0: 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  rs encountered..
39c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
39d0: 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28  liteProcessJoin(
39e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
39f0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63  elect *p){.  Src
3a00: 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3a20: 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  All tables in th
3a30: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
3a40: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
3a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a60: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
3a70: 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ers */.  struct 
3a80: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  SrcList_item *pL
3a90: 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74  eft;     /* Left
3aa0: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69   table being joi
3ab0: 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ned */.  struct 
3ac0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52  SrcList_item *pR
3ad0: 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68  ight;    /* Righ
3ae0: 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f  t table being jo
3af0: 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20  ined */..  pSrc 
3b00: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65  = p->pSrc;.  pLe
3b10: 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d  ft = &pSrc->a[0]
3b20: 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c  ;.  pRight = &pL
3b30: 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d  eft[1];.  for(i=
3b40: 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d  0; i<pSrc->nSrc-
3b50: 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b  1; i++, pRight++
3b60: 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20  , pLeft++){.    
3b70: 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54 61 62  Table *pRightTab
3b80: 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61 62 3b   = pRight->pTab;
3b90: 0a 20 20 20 20 69 6e 74 20 69 73 4f 75 74 65 72  .    int isOuter
3ba0: 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  ;..    if( NEVER
3bb0: 28 70 4c 65 66 74 2d 3e 70 54 61 62 3d 3d 30 20  (pLeft->pTab==0 
3bc0: 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30 29  || pRightTab==0)
3bd0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
3be0: 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69 67   isOuter = (pRig
3bf0: 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  ht->fg.jointype 
3c00: 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a  & JT_OUTER)!=0;.
3c10: 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  .    /* When the
3c20: 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
3c30: 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64   is present, add
3c40: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
3c50: 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65  rms for.    ** e
3c60: 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74  very column that
3c70: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20   the two tables 
3c80: 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a  have in common..
3c90: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
3ca0: 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79  Right->fg.jointy
3cb0: 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20  pe & JT_NATURAL 
3cc0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69  ){.      if( pRi
3cd0: 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69 67  ght->pOn || pRig
3ce0: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
3cf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
3d00: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
3d10: 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61   NATURAL join ma
3d20: 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20  y not have ".   
3d30: 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f          "an ON o
3d40: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c  r USING clause",
3d50: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74   0);.        ret
3d60: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
3d70: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
3d80: 70 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b  pRightTab->nCol;
3d90: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
3da0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a  har *zName;   /*
3db0: 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e 20   Name of column 
3dc0: 69 6e 20 74 68 65 20 72 69 67 68 74 20 74 61 62  in the right tab
3dd0: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  le */.        in
3de0: 74 20 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20  t iLeft;     /* 
3df0: 4d 61 74 63 68 69 6e 67 20 6c 65 66 74 20 74 61  Matching left ta
3e00: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ble */.        i
3e10: 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a  nt iLeftCol;  /*
3e20: 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   Matching column
3e30: 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61 62   in the left tab
3e40: 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a  le */..        z
3e50: 4e 61 6d 65 20 3d 20 70 52 69 67 68 74 54 61 62  Name = pRightTab
3e60: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ->aCol[j].zName;
3e70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 61 62  .        if( tab
3e80: 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78  leAndColumnIndex
3e90: 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d  (pSrc, i+1, zNam
3ea0: 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66  e, &iLeft, &iLef
3eb0: 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  tCol) ){.       
3ec0: 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28     addWhereTerm(
3ed0: 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c  pParse, pSrc, iL
3ee0: 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69  eft, iLeftCol, i
3ef0: 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20 20  +1, j,.         
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
3f10: 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72  Outer, &p->pWher
3f20: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
3f30: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
3f40: 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74   /* Disallow bot
3f50: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  h ON and USING c
3f60: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
3f70: 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20  me join.    */. 
3f80: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
3f90: 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70 55  On && pRight->pU
3fa0: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71  sing ){.      sq
3fb0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
3fc0: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61  arse, "cannot ha
3fd0: 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55  ve both ON and U
3fe0: 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22  SING ".        "
3ff0: 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73  clauses in the s
4000: 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20  ame join");.    
4010: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
4020: 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  }..    /* Add th
4030: 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74  e ON clause to t
4040: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
4050: 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e  ERE clause, conn
4060: 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20  ected by.    ** 
4070: 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e  an AND operator.
4080: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
4090: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20  pRight->pOn ){. 
40a0: 20 20 20 20 20 69 66 28 20 69 73 4f 75 74 65 72       if( isOuter
40b0: 20 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70   ) setJoinExpr(p
40c0: 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67  Right->pOn, pRig
40d0: 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  ht->iCursor);.  
40e0: 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
40f0: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
4100: 50 61 72 73 65 2c 20 70 2d 3e 70 57 68 65 72 65  Parse, p->pWhere
4110: 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a  , pRight->pOn);.
4120: 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f        pRight->pO
4130: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  n = 0;.    }..  
4140: 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72    /* Create extr
4150: 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57  a terms on the W
4160: 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20  HERE clause for 
4170: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  each column name
4180: 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  d.    ** in the 
4190: 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45  USING clause.  E
41a0: 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74  xample: If the t
41b0: 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  wo tables to be 
41c0: 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20  joined are .    
41d0: 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74  ** A and B and t
41e0: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
41f0: 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20  names X, Y, and 
4200: 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68 69 73  Z, then add this
4210: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57  .    ** to the W
4220: 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20  HERE clause:    
4230: 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d  A.X=B.X AND A.Y=
4240: 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a  B.Y AND A.Z=B.Z.
4250: 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e      ** Report an
4260: 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f   error if any co
4270: 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69  lumn mentioned i
4280: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
4290: 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74  se is.    ** not
42a0: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f   contained in bo
42b0: 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  th tables to be 
42c0: 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  joined..    */. 
42d0: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
42e0: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49  Using ){.      I
42f0: 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  dList *pList = p
4300: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20  Right->pUsing;. 
4310: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
4320: 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29  pList->nId; j++)
4330: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
4340: 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61  zName;     /* Na
4350: 6d 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20 69  me of the term i
4360: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
4370: 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  se */.        in
4380: 74 20 69 4c 65 66 74 3b 20 20 20 20 20 20 20 2f  t iLeft;       /
4390: 2a 20 54 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c  * Table on the l
43a0: 65 66 74 20 77 69 74 68 20 6d 61 74 63 68 69 6e  eft with matchin
43b0: 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  g column name */
43c0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65  .        int iLe
43d0: 66 74 43 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c  ftCol;    /* Col
43e0: 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61  umn number of ma
43f0: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e  tching column on
4400: 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20   the left */.   
4410: 20 20 20 20 20 69 6e 74 20 69 52 69 67 68 74 43       int iRightC
4420: 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20  ol;   /* Column 
4430: 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69  number of matchi
4440: 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65  ng column on the
4450: 20 72 69 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20   right */..     
4460: 20 20 20 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74     zName = pList
4470: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[j].zName;.  
4480: 20 20 20 20 20 20 69 52 69 67 68 74 43 6f 6c 20        iRightCol 
4490: 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52  = columnIndex(pR
44a0: 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b  ightTab, zName);
44b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 52 69  .        if( iRi
44c0: 67 68 74 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20  ghtCol<0.       
44d0: 20 20 7c 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f    || !tableAndCo
44e0: 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20  lumnIndex(pSrc, 
44f0: 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65  i+1, zName, &iLe
4500: 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20  ft, &iLeftCol). 
4510: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
4520: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4530: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
4540: 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63  not join using c
4550: 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d  olumn %s - colum
4560: 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  n ".            
4570: 22 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20  "not present in 
4580: 62 6f 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e  both tables", zN
4590: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
45a0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
45b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57    }.        addW
45c0: 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c  hereTerm(pParse,
45d0: 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c   pSrc, iLeft, iL
45e0: 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69  eftCol, i+1, iRi
45f0: 67 68 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20  ghtCol,.        
4600: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
4610: 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65  uter, &p->pWhere
4620: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
4630: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
4640: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  .}../*.** An ins
4650: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
4660: 6a 65 63 74 20 68 6f 6c 64 73 20 69 6e 66 6f 72  ject holds infor
4670: 6d 61 74 69 6f 6e 20 28 62 65 79 6f 6e 64 20 70  mation (beyond p
4680: 50 61 72 73 65 20 61 6e 64 20 70 53 65 6c 65 63  Parse and pSelec
4690: 74 29 0a 2a 2a 20 6e 65 65 64 65 64 20 74 6f 20  t).** needed to 
46a0: 6c 6f 61 64 20 74 68 65 20 6e 65 78 74 20 72 65  load the next re
46b0: 73 75 6c 74 20 72 6f 77 20 74 68 61 74 20 69 73  sult row that is
46c0: 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
46d0: 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 74  the sorter..*/.t
46e0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 52 6f  ypedef struct Ro
46f0: 77 4c 6f 61 64 49 6e 66 6f 20 52 6f 77 4c 6f 61  wLoadInfo RowLoa
4700: 64 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20 52 6f  dInfo;.struct Ro
4710: 77 4c 6f 61 64 49 6e 66 6f 20 7b 0a 20 20 69 6e  wLoadInfo {.  in
4720: 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20  t regResult;    
4730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
4740: 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61  ore results in a
4750: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
4760: 73 20 68 65 72 65 20 2a 2f 0a 20 20 75 38 20 65  s here */.  u8 e
4770: 63 65 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20  celFlags;       
4780: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
4790: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 45 78 70   argument to Exp
47a0: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 29 20  rCodeExprList() 
47b0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
47c0: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
47d0: 45 46 45 52 45 4e 43 45 53 0a 20 20 45 78 70 72  EFERENCES.  Expr
47e0: 4c 69 73 74 20 2a 70 45 78 74 72 61 3b 20 20 20  List *pExtra;   
47f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
4800: 61 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64  a columns needed
4810: 20 62 79 20 73 6f 72 74 65 72 20 72 65 66 73 20   by sorter refs 
4820: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45 78 74 72  */.  int regExtr
4830: 61 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  aResult;        
4840: 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6c 6f    /* Where to lo
4850: 61 64 20 74 68 65 20 65 78 74 72 61 20 63 6f 6c  ad the extra col
4860: 75 6d 6e 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  umns */.#endif.}
4870: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ;../*.** This ro
4880: 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77  utine does the w
4890: 6f 72 6b 20 6f 66 20 6c 6f 61 64 69 6e 67 20 71  ork of loading q
48a0: 75 65 72 79 20 64 61 74 61 20 69 6e 74 6f 20 61  uery data into a
48b0: 6e 20 61 72 72 61 79 20 6f 66 0a 2a 2a 20 72 65  n array of.** re
48c0: 67 69 73 74 65 72 73 20 73 6f 20 74 68 61 74 20  gisters so that 
48d0: 69 74 20 63 61 6e 20 62 65 20 61 64 64 65 64 20  it can be added 
48e0: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a  to the sorter..*
48f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
4900: 6e 65 72 4c 6f 6f 70 4c 6f 61 64 52 6f 77 28 0a  nerLoopLoadRow(.
4910: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
4920: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4930: 53 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  Statement under 
4940: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
4950: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
4960: 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
4970: 54 68 65 20 71 75 65 72 79 20 62 65 69 6e 67 20  The query being 
4980: 63 6f 64 65 64 20 2a 2f 0a 20 20 52 6f 77 4c 6f  coded */.  RowLo
4990: 61 64 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  adInfo *pInfo   
49a0: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6e 65        /* Info ne
49b0: 65 64 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65  eded to complete
49c0: 20 74 68 65 20 72 6f 77 20 6c 6f 61 64 20 2a 2f   the row load */
49d0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  .){.  sqlite3Exp
49e0: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
49f0: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70  arse, pSelect->p
4a00: 45 4c 69 73 74 2c 20 70 49 6e 66 6f 2d 3e 72 65  EList, pInfo->re
4a10: 67 52 65 73 75 6c 74 2c 0a 20 20 20 20 20 20 20  gResult,.       
4a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a30: 20 20 20 30 2c 20 70 49 6e 66 6f 2d 3e 65 63 65     0, pInfo->ece
4a40: 6c 46 6c 61 67 73 29 3b 0a 23 69 66 64 65 66 20  lFlags);.#ifdef 
4a50: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
4a60: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
4a70: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 70 45 78    if( pInfo->pEx
4a80: 74 72 61 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  tra ){.    sqlit
4a90: 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
4aa0: 73 74 28 70 50 61 72 73 65 2c 20 70 49 6e 66 6f  st(pParse, pInfo
4ab0: 2d 3e 70 45 78 74 72 61 2c 20 70 49 6e 66 6f 2d  ->pExtra, pInfo-
4ac0: 3e 72 65 67 45 78 74 72 61 52 65 73 75 6c 74 2c  >regExtraResult,
4ad0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
4ae0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
4af0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49  e(pParse->db, pI
4b00: 6e 66 6f 2d 3e 70 45 78 74 72 61 29 3b 0a 20 20  nfo->pExtra);.  
4b10: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
4b20: 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 4d 61  * Code the OP_Ma
4b30: 6b 65 52 65 63 6f 72 64 20 69 6e 73 74 72 75 63  keRecord instruc
4b40: 74 69 6f 6e 20 74 68 61 74 20 67 65 6e 65 72 61  tion that genera
4b50: 74 65 73 20 74 68 65 20 65 6e 74 72 79 20 74 6f  tes the entry to
4b60: 20 62 65 0a 2a 2a 20 61 64 64 65 64 20 69 6e 74   be.** added int
4b70: 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2a  o the sorter..**
4b80: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72  .** Return the r
4b90: 65 67 69 73 74 65 72 20 69 6e 20 77 68 69 63 68  egister in which
4ba0: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73   the result is s
4bb0: 74 6f 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  tored..*/.static
4bc0: 20 69 6e 74 20 6d 61 6b 65 53 6f 72 74 65 72 52   int makeSorterR
4bd0: 65 63 6f 72 64 28 0a 20 20 50 61 72 73 65 20 2a  ecord(.  Parse *
4be0: 70 50 61 72 73 65 2c 0a 20 20 53 6f 72 74 43 74  pParse,.  SortCt
4bf0: 78 20 2a 70 53 6f 72 74 2c 0a 20 20 53 65 6c 65  x *pSort,.  Sele
4c00: 63 74 20 2a 70 53 65 6c 65 63 74 2c 0a 20 20 69  ct *pSelect,.  i
4c10: 6e 74 20 72 65 67 42 61 73 65 2c 0a 20 20 69 6e  nt regBase,.  in
4c20: 74 20 6e 42 61 73 65 0a 29 7b 0a 20 20 69 6e 74  t nBase.){.  int
4c30: 20 6e 4f 42 53 61 74 20 3d 20 70 53 6f 72 74 2d   nOBSat = pSort-
4c40: 3e 6e 4f 42 53 61 74 3b 0a 20 20 56 64 62 65 20  >nOBSat;.  Vdbe 
4c50: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
4c60: 62 65 3b 0a 20 20 69 6e 74 20 72 65 67 4f 75 74  be;.  int regOut
4c70: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
4c80: 6d 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e  m;.  if( pSort->
4c90: 70 44 65 66 65 72 72 65 64 52 6f 77 4c 6f 61 64  pDeferredRowLoad
4ca0: 20 29 7b 0a 20 20 20 20 69 6e 6e 65 72 4c 6f 6f   ){.    innerLoo
4cb0: 70 4c 6f 61 64 52 6f 77 28 70 50 61 72 73 65 2c  pLoadRow(pParse,
4cc0: 20 70 53 65 6c 65 63 74 2c 20 70 53 6f 72 74 2d   pSelect, pSort-
4cd0: 3e 70 44 65 66 65 72 72 65 64 52 6f 77 4c 6f 61  >pDeferredRowLoa
4ce0: 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
4cf0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4d00: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
4d10: 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42  gBase+nOBSat, nB
4d20: 61 73 65 2d 6e 4f 42 53 61 74 2c 20 72 65 67 4f  ase-nOBSat, regO
4d30: 75 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  ut);.  return re
4d40: 67 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  gOut;.}../*.** G
4d50: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
4d60: 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20  t will push the 
4d70: 72 65 63 6f 72 64 20 69 6e 20 72 65 67 69 73 74  record in regist
4d80: 65 72 73 20 72 65 67 44 61 74 61 0a 2a 2a 20 74  ers regData.** t
4d90: 68 72 6f 75 67 68 20 72 65 67 44 61 74 61 2b 6e  hrough regData+n
4da0: 44 61 74 61 2d 31 20 6f 6e 74 6f 20 74 68 65 20  Data-1 onto the 
4db0: 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  sorter..*/.stati
4dc0: 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53  c void pushOntoS
4dd0: 6f 72 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a  orter(.  Parse *
4de0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
4df0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
4e00: 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a  t */.  SortCtx *
4e10: 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20 2f 2a  pSort,        /*
4e20: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
4e30: 75 74 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ut the ORDER BY 
4e40: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65  clause */.  Sele
4e50: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20  ct *pSelect,    
4e60: 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20     /* The whole 
4e70: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
4e80: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74   */.  int regDat
4e90: 61 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a,           /* 
4ea0: 46 69 72 73 74 20 72 65 67 69 73 74 65 72 20 68  First register h
4eb0: 6f 6c 64 69 6e 67 20 64 61 74 61 20 74 6f 20 62  olding data to b
4ec0: 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e  e sorted */.  in
4ed0: 74 20 72 65 67 4f 72 69 67 44 61 74 61 2c 20 20  t regOrigData,  
4ee0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65       /* First re
4ef0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64  gister holding d
4f00: 61 74 61 20 62 65 66 6f 72 65 20 70 61 63 6b 69  ata before packi
4f10: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74  ng */.  int nDat
4f20: 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  a,             /
4f30: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
4f40: 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65 67 44  ents in the regD
4f50: 61 74 61 20 64 61 74 61 20 61 72 72 61 79 20 2a  ata data array *
4f60: 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52  /.  int nPrefixR
4f70: 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  eg         /* No
4f80: 2e 20 6f 66 20 72 65 67 20 70 72 69 6f 72 20 74  . of reg prior t
4f90: 6f 20 72 65 67 44 61 74 61 20 61 76 61 69 6c 61  o regData availa
4fa0: 62 6c 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29  ble for use */.)
4fb0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
4fc0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
4fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fe0: 20 20 20 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64       /* Stmt und
4ff0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
5000: 2a 2f 0a 20 20 69 6e 74 20 62 53 65 71 20 3d 20  */.  int bSeq = 
5010: 28 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ((pSort->sortFla
5020: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
5030: 65 53 6f 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20  eSorter)==0);.  
5040: 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 53 6f 72  int nExpr = pSor
5050: 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  t->pOrderBy->nEx
5060: 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
5070: 20 2f 2a 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52   /* No. of ORDER
5080: 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69   BY terms */.  i
5090: 6e 74 20 6e 42 61 73 65 20 3d 20 6e 45 78 70 72  nt nBase = nExpr
50a0: 20 2b 20 62 53 65 71 20 2b 20 6e 44 61 74 61 3b   + bSeq + nData;
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 2f 2a 20 46 69 65 6c 64 73 20 69 6e 20 73 6f 72  /* Fields in sor
50d0: 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ter record */.  
50e0: 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20  int regBase;    
50f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5110: 20 2f 2a 20 52 65 67 73 20 66 6f 72 20 73 6f 72   /* Regs for sor
5120: 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ter record */.  
5130: 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20  int regRecord = 
5140: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5160: 20 2f 2a 20 41 73 73 65 6d 62 6c 65 64 20 73 6f   /* Assembled so
5170: 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20  rter record */. 
5180: 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d 20 70 53   int nOBSat = pS
5190: 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20  ort->nOBSat;    
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51b0: 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65    /* ORDER BY te
51c0: 72 6d 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20  rms to skip */. 
51d0: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
51e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51f0: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f      /* Opcode to
5200: 20 61 64 64 20 73 6f 72 74 65 72 20 72 65 63 6f   add sorter reco
5210: 72 64 20 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a  rd to sorter */.
5220: 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 20 20 20    int iLimit;   
5230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5240: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 63 6f       /* LIMIT co
5250: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  unter */.  int i
5260: 53 6b 69 70 20 3d 20 30 3b 20 20 20 20 20 20 20  Skip = 0;       
5270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5280: 20 45 6e 64 20 6f 66 20 74 68 65 20 73 6f 72 74   End of the sort
5290: 65 72 20 69 6e 73 65 72 74 20 6c 6f 6f 70 20 2a  er insert loop *
52a0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 62 53 65  /..  assert( bSe
52b0: 71 3d 3d 30 20 7c 7c 20 62 53 65 71 3d 3d 31 20  q==0 || bSeq==1 
52c0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 72 65 65 20 63  );..  /* Three c
52d0: 61 73 65 73 3a 0a 20 20 2a 2a 20 20 20 28 31 29  ases:.  **   (1)
52e0: 20 54 68 65 20 64 61 74 61 20 74 6f 20 62 65 20   The data to be 
52f0: 73 6f 72 74 65 64 20 68 61 73 20 61 6c 72 65 61  sorted has alrea
5300: 64 79 20 62 65 65 6e 20 70 61 63 6b 65 64 20 69  dy been packed i
5310: 6e 74 6f 20 61 20 52 65 63 6f 72 64 0a 20 20 2a  nto a Record.  *
5320: 2a 20 20 20 20 20 20 20 62 79 20 61 20 70 72 69  *       by a pri
5330: 6f 72 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  or OP_MakeRecord
5340: 2e 20 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  .  In this case 
5350: 6e 44 61 74 61 3d 3d 31 20 61 6e 64 20 72 65 67  nData==1 and reg
5360: 44 61 74 61 0a 20 20 2a 2a 20 20 20 20 20 20 20  Data.  **       
5370: 77 69 6c 6c 20 62 65 20 63 6f 6d 70 6c 65 74 65  will be complete
5380: 6c 79 20 75 6e 72 65 6c 61 74 65 64 20 74 6f 20  ly unrelated to 
5390: 72 65 67 4f 72 69 67 44 61 74 61 2e 0a 20 20 2a  regOrigData..  *
53a0: 2a 20 20 20 28 32 29 20 41 6c 6c 20 6f 75 74 70  *   (2) All outp
53b0: 75 74 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 69  ut columns are i
53c0: 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73  ncluded in the s
53d0: 6f 72 74 20 72 65 63 6f 72 64 2e 20 20 49 6e 20  ort record.  In 
53e0: 74 68 61 74 0a 20 20 2a 2a 20 20 20 20 20 20 20  that.  **       
53f0: 63 61 73 65 20 72 65 67 44 61 74 61 3d 3d 72 65  case regData==re
5400: 67 4f 72 69 67 44 61 74 61 2e 0a 20 20 2a 2a 20  gOrigData..  ** 
5410: 20 20 28 33 29 20 53 6f 6d 65 20 6f 75 74 70 75    (3) Some outpu
5420: 74 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6f 6d  t columns are om
5430: 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73  itted from the s
5440: 6f 72 74 20 72 65 63 6f 72 64 20 64 75 65 20 74  ort record due t
5450: 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 74 68 65  o.  **       the
5460: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
5470: 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 20  ORTER_REFERENCE 
5480: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 6f 72  optimization, or
5490: 20 64 75 65 20 74 6f 20 74 68 65 0a 20 20 2a 2a   due to the.  **
54a0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43         SQLITE_EC
54b0: 45 4c 5f 4f 4d 49 54 52 45 46 20 6f 70 74 69 6d  EL_OMITREF optim
54c0: 69 7a 61 74 69 6f 6e 2c 20 6f 72 20 64 75 65 20  ization, or due 
54d0: 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20 20 20 20  to the .  **    
54e0: 20 20 20 53 6f 72 74 43 74 78 2e 70 44 65 66 65     SortCtx.pDefe
54f0: 72 72 65 64 52 6f 77 4c 6f 61 64 20 6f 70 74 69  rredRowLoad opti
5500: 6d 69 61 74 69 6f 6e 2e 20 20 49 6e 20 61 6e 79  miation.  In any
5510: 20 6f 66 20 74 68 65 73 65 20 63 61 73 65 73 0a   of these cases.
5520: 20 20 2a 2a 20 20 20 20 20 20 20 72 65 67 4f 72    **       regOr
5530: 69 67 44 61 74 61 20 69 73 20 30 20 74 6f 20 70  igData is 0 to p
5540: 72 65 76 65 6e 74 20 74 68 69 73 20 72 6f 75 74  revent this rout
5550: 69 6e 65 20 66 72 6f 6d 20 74 72 79 69 6e 67 20  ine from trying 
5560: 74 6f 20 63 6f 70 79 0a 20 20 2a 2a 20 20 20 20  to copy.  **    
5570: 20 20 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d     values that m
5580: 69 67 68 74 20 6e 6f 74 20 79 65 74 20 65 78 69  ight not yet exi
5590: 73 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  st..  */.  asser
55a0: 74 28 20 6e 44 61 74 61 3d 3d 31 20 7c 7c 20 72  t( nData==1 || r
55b0: 65 67 44 61 74 61 3d 3d 72 65 67 4f 72 69 67 44  egData==regOrigD
55c0: 61 74 61 20 7c 7c 20 72 65 67 4f 72 69 67 44 61  ata || regOrigDa
55d0: 74 61 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  ta==0 );..  if( 
55e0: 6e 50 72 65 66 69 78 52 65 67 20 29 7b 0a 20 20  nPrefixReg ){.  
55f0: 20 20 61 73 73 65 72 74 28 20 6e 50 72 65 66 69    assert( nPrefi
5600: 78 52 65 67 3d 3d 6e 45 78 70 72 2b 62 53 65 71  xReg==nExpr+bSeq
5610: 20 29 3b 0a 20 20 20 20 72 65 67 42 61 73 65 20   );.    regBase 
5620: 3d 20 72 65 67 44 61 74 61 20 2d 20 6e 50 72 65  = regData - nPre
5630: 66 69 78 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b  fixReg;.  }else{
5640: 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 70  .    regBase = p
5650: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
5660: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
5670: 6d 20 2b 3d 20 6e 42 61 73 65 3b 0a 20 20 7d 0a  m += nBase;.  }.
5680: 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65 63    assert( pSelec
5690: 74 2d 3e 69 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  t->iOffset==0 ||
56a0: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
56b0: 21 3d 30 20 29 3b 0a 20 20 69 4c 69 6d 69 74 20  !=0 );.  iLimit 
56c0: 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73  = pSelect->iOffs
56d0: 65 74 20 3f 20 70 53 65 6c 65 63 74 2d 3e 69 4f  et ? pSelect->iO
56e0: 66 66 73 65 74 2b 31 20 3a 20 70 53 65 6c 65 63  ffset+1 : pSelec
56f0: 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 70 53 6f  t->iLimit;.  pSo
5700: 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 20 3d 20  rt->labelDone = 
5710: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
5720: 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  abel(pParse);.  
5730: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
5740: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
5750: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c  pSort->pOrderBy,
5760: 20 72 65 67 42 61 73 65 2c 20 72 65 67 4f 72 69   regBase, regOri
5770: 67 44 61 74 61 2c 0a 20 20 20 20 20 20 20 20 20  gData,.         
5780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5790: 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
57a0: 20 7c 20 28 72 65 67 4f 72 69 67 44 61 74 61 3f   | (regOrigData?
57b0: 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46   SQLITE_ECEL_REF
57c0: 20 3a 20 30 29 29 3b 0a 20 20 69 66 28 20 62 53   : 0));.  if( bS
57d0: 65 71 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  eq ){.    sqlite
57e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
57f0: 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 53 6f 72  P_Sequence, pSor
5800: 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67  t->iECursor, reg
5810: 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20 20 7d  Base+nExpr);.  }
5820: 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78 52 65  .  if( nPrefixRe
5830: 67 3d 3d 30 20 26 26 20 6e 44 61 74 61 3e 30 20  g==0 && nData>0 
5840: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
5850: 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
5860: 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65 67 42  e, regData, regB
5870: 61 73 65 2b 6e 45 78 70 72 2b 62 53 65 71 2c 20  ase+nExpr+bSeq, 
5880: 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 69 66  nData);.  }.  if
5890: 28 20 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20  ( nOBSat>0 ){.  
58a0: 20 20 69 6e 74 20 72 65 67 50 72 65 76 4b 65 79    int regPrevKey
58b0: 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74  ;   /* The first
58c0: 20 6e 4f 42 53 61 74 20 63 6f 6c 75 6d 6e 73 20   nOBSat columns 
58d0: 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  of the previous 
58e0: 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  row */.    int a
58f0: 64 64 72 46 69 72 73 74 3b 20 20 20 20 2f 2a 20  ddrFirst;    /* 
5900: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f  Address of the O
5910: 50 5f 49 66 4e 6f 74 20 6f 70 63 6f 64 65 20 2a  P_IfNot opcode *
5920: 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4a 6d  /.    int addrJm
5930: 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  p;      /* Addre
5940: 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4a 75 6d  ss of the OP_Jum
5950: 70 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  p opcode */.    
5960: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20  VdbeOp *pOp;    
5970: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 68 61 74    /* Opcode that
5980: 20 6f 70 65 6e 73 20 74 68 65 20 73 6f 72 74 65   opens the sorte
5990: 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65  r */.    int nKe
59a0: 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  y;         /* Nu
59b0: 6d 62 65 72 20 6f 66 20 73 6f 72 74 69 6e 67 20  mber of sorting 
59c0: 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69 6e 63  key columns, inc
59d0: 6c 75 64 69 6e 67 20 4f 50 5f 53 65 71 75 65 6e  luding OP_Sequen
59e0: 63 65 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66  ce */.    KeyInf
59f0: 6f 20 2a 70 4b 49 3b 20 20 20 20 20 2f 2a 20 4f  o *pKI;     /* O
5a00: 72 69 67 69 6e 61 6c 20 4b 65 79 49 6e 66 6f 20  riginal KeyInfo 
5a10: 6f 6e 20 74 68 65 20 73 6f 72 74 65 72 20 74 61  on the sorter ta
5a20: 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 65 67 52  ble */..    regR
5a30: 65 63 6f 72 64 20 3d 20 6d 61 6b 65 53 6f 72 74  ecord = makeSort
5a40: 65 72 52 65 63 6f 72 64 28 70 50 61 72 73 65 2c  erRecord(pParse,
5a50: 20 70 53 6f 72 74 2c 20 70 53 65 6c 65 63 74 2c   pSort, pSelect,
5a60: 20 72 65 67 42 61 73 65 2c 20 6e 42 61 73 65 29   regBase, nBase)
5a70: 3b 0a 20 20 20 20 72 65 67 50 72 65 76 4b 65 79  ;.    regPrevKey
5a80: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
5a90: 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
5aa0: 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e 6e 4f  Mem += pSort->nO
5ab0: 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65 79 20 3d  BSat;.    nKey =
5ac0: 20 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e   nExpr - pSort->
5ad0: 6e 4f 42 53 61 74 20 2b 20 62 53 65 71 3b 0a 20  nOBSat + bSeq;. 
5ae0: 20 20 20 69 66 28 20 62 53 65 71 20 29 7b 0a 20     if( bSeq ){. 
5af0: 20 20 20 20 20 61 64 64 72 46 69 72 73 74 20 3d       addrFirst =
5b00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5b10: 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p1(v, OP_IfNot, 
5b20: 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 20  regBase+nExpr); 
5b30: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5b40: 20 20 61 64 64 72 46 69 72 73 74 20 3d 20 73 71    addrFirst = sq
5b50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
5b60: 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 54 65  v, OP_SequenceTe
5b70: 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  st, pSort->iECur
5b80: 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  sor);.    }.    
5b90: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
5ba0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5bb0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp3(v, OP_Com
5bc0: 70 61 72 65 2c 20 72 65 67 50 72 65 76 4b 65 79  pare, regPrevKey
5bd0: 2c 20 72 65 67 42 61 73 65 2c 20 70 53 6f 72 74  , regBase, pSort
5be0: 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20 70  ->nOBSat);.    p
5bf0: 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
5c00: 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74 2d 3e  GetOp(v, pSort->
5c10: 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a  addrSortIndex);.
5c20: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
5c30: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
5c40: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
5c50: 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79 20 2b 20  Op->p2 = nKey + 
5c60: 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b 49 20 3d  nData;.    pKI =
5c70: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
5c80: 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4b  o;.    memset(pK
5c90: 49 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 30  I->aSortOrder, 0
5ca0: 2c 20 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c 64  , pKI->nKeyField
5cb0: 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50 5f 4a  ); /* Makes OP_J
5cc0: 75 6d 70 20 74 65 73 74 61 62 6c 65 20 2a 2f 0a  ump testable */.
5cd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
5ce0: 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28  hangeP4(v, -1, (
5cf0: 63 68 61 72 2a 29 70 4b 49 2c 20 50 34 5f 4b 45  char*)pKI, P4_KE
5d00: 59 49 4e 46 4f 29 3b 0a 20 20 20 20 74 65 73 74  YINFO);.    test
5d10: 63 61 73 65 28 20 70 4b 49 2d 3e 6e 41 6c 6c 46  case( pKI->nAllF
5d20: 69 65 6c 64 20 3e 20 70 4b 49 2d 3e 6e 4b 65 79  ield > pKI->nKey
5d30: 46 69 65 6c 64 2b 32 20 29 3b 0a 20 20 20 20 70  Field+2 );.    p
5d40: 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20  Op->p4.pKeyInfo 
5d50: 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
5d60: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
5d70: 72 73 65 2c 70 53 6f 72 74 2d 3e 70 4f 72 64 65  rse,pSort->pOrde
5d80: 72 42 79 2c 6e 4f 42 53 61 74 2c 0a 20 20 20 20  rBy,nOBSat,.    
5d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5db0: 20 20 20 20 20 20 20 70 4b 49 2d 3e 6e 41 6c 6c         pKI->nAll
5dc0: 46 69 65 6c 64 2d 70 4b 49 2d 3e 6e 4b 65 79 46  Field-pKI->nKeyF
5dd0: 69 65 6c 64 2d 31 29 3b 0a 20 20 20 20 61 64 64  ield-1);.    add
5de0: 72 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rJmp = sqlite3Vd
5df0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
5e00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5e10: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
5e20: 6d 70 2c 20 61 64 64 72 4a 6d 70 2b 31 2c 20 30  mp, addrJmp+1, 0
5e30: 2c 20 61 64 64 72 4a 6d 70 2b 31 29 3b 20 56 64  , addrJmp+1); Vd
5e40: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
5e50: 20 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42     pSort->labelB
5e60: 6b 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 56 64  kOut = sqlite3Vd
5e70: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
5e80: 73 65 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e  se);.    pSort->
5e90: 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50  regReturn = ++pP
5ea0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
5eb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5ec0: 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70  2(v, OP_Gosub, p
5ed0: 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c  Sort->regReturn,
5ee0: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f   pSort->labelBkO
5ef0: 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ut);.    sqlite3
5f00: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
5f10: 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70 53  _ResetSorter, pS
5f20: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a  ort->iECursor);.
5f30: 20 20 20 20 69 66 28 20 69 4c 69 6d 69 74 20 29      if( iLimit )
5f40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
5f50: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5f60: 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 70  IfNot, iLimit, p
5f70: 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 29  Sort->labelDone)
5f80: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
5f90: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20  rage(v);.    }. 
5fa0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
5fb0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 46 69  mpHere(v, addrFi
5fc0: 72 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rst);.    sqlite
5fd0: 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
5fe0: 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 72  arse, regBase, r
5ff0: 65 67 50 72 65 76 4b 65 79 2c 20 70 53 6f 72 74  egPrevKey, pSort
6000: 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20 73  ->nOBSat);.    s
6010: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
6020: 72 65 28 76 2c 20 61 64 64 72 4a 6d 70 29 3b 0a  re(v, addrJmp);.
6030: 20 20 7d 0a 20 20 69 66 28 20 69 4c 69 6d 69 74    }.  if( iLimit
6040: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   ){.    /* At th
6050: 69 73 20 70 6f 69 6e 74 20 74 68 65 20 76 61 6c  is point the val
6060: 75 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ues for the new 
6070: 73 6f 72 74 65 72 20 65 6e 74 72 79 20 61 72 65  sorter entry are
6080: 20 73 74 6f 72 65 64 0a 20 20 20 20 2a 2a 20 69   stored.    ** i
6090: 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  n an array of re
60a0: 67 69 73 74 65 72 73 2e 20 54 68 65 79 20 6e 65  gisters. They ne
60b0: 65 64 20 74 6f 20 62 65 20 63 6f 6d 70 6f 73 65  ed to be compose
60c0: 64 20 69 6e 74 6f 20 61 20 72 65 63 6f 72 64 0a  d into a record.
60d0: 20 20 20 20 2a 2a 20 61 6e 64 20 69 6e 73 65 72      ** and inser
60e0: 74 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6f 72  ted into the sor
60f0: 74 65 72 20 69 66 20 65 69 74 68 65 72 20 28 61  ter if either (a
6100: 29 20 74 68 65 72 65 20 61 72 65 20 63 75 72 72  ) there are curr
6110: 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 6c 65 73  ently.    ** les
6120: 73 20 74 68 61 6e 20 4c 49 4d 49 54 2b 4f 46 46  s than LIMIT+OFF
6130: 53 45 54 20 69 74 65 6d 73 20 6f 72 20 28 62 29  SET items or (b)
6140: 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20   the new record 
6150: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
6160: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 72 67  .    ** the larg
6170: 65 73 74 20 72 65 63 6f 72 64 20 63 75 72 72 65  est record curre
6180: 6e 74 6c 79 20 69 6e 20 74 68 65 20 73 6f 72 74  ntly in the sort
6190: 65 72 2e 20 49 66 20 28 62 29 20 69 73 20 74 72  er. If (b) is tr
61a0: 75 65 20 61 6e 64 20 74 68 65 72 65 0a 20 20 20  ue and there.   
61b0: 20 2a 2a 20 61 72 65 20 61 6c 72 65 61 64 79 20   ** are already 
61c0: 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 69 74 65  LIMIT+OFFSET ite
61d0: 6d 73 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72  ms in the sorter
61e0: 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 61 72  , delete the lar
61f0: 67 65 73 74 0a 20 20 20 20 2a 2a 20 65 6e 74 72  gest.    ** entr
6200: 79 20 62 65 66 6f 72 65 20 69 6e 73 65 72 74 69  y before inserti
6210: 6e 67 20 74 68 65 20 6e 65 77 20 6f 6e 65 2e 20  ng the new one. 
6220: 54 68 69 73 20 77 61 79 20 74 68 65 72 65 20 61  This way there a
6230: 72 65 20 6e 65 76 65 72 20 6d 6f 72 65 20 0a 20  re never more . 
6240: 20 20 20 2a 2a 20 74 68 61 6e 20 4c 49 4d 49 54     ** than LIMIT
6250: 2b 4f 46 46 53 45 54 20 69 74 65 6d 73 20 69 6e  +OFFSET items in
6260: 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 20 20 20   the sorter..   
6270: 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
6280: 65 20 6e 65 77 20 72 65 63 6f 72 64 20 64 6f 65  e new record doe
6290: 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
62a0: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74   inserted into t
62b0: 68 65 20 73 6f 72 74 65 72 2c 0a 20 20 20 20 2a  he sorter,.    *
62c0: 2a 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65  * jump to the ne
62d0: 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  xt iteration of 
62e0: 74 68 65 20 6c 6f 6f 70 2e 20 49 66 20 74 68 65  the loop. If the
62f0: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 4f 42 4c   pSort->labelOBL
6300: 6f 70 74 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  opt.    ** value
6310: 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
6320: 65 6e 20 69 74 20 69 73 20 61 20 6c 61 62 65 6c  en it is a label
6330: 20 6f 66 20 77 68 65 72 65 20 74 6f 20 6a 75 6d   of where to jum
6340: 70 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  p.  Otherwise,. 
6350: 20 20 20 2a 2a 20 6a 75 73 74 20 62 79 70 61 73     ** just bypas
6360: 73 20 74 68 65 20 72 6f 77 20 69 6e 73 65 72 74  s the row insert
6370: 20 6c 6f 67 69 63 2e 20 20 53 65 65 20 74 68 65   logic.  See the
6380: 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20   header comment 
6390: 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 71  on the.    ** sq
63a0: 6c 69 74 65 33 57 68 65 72 65 4f 72 64 65 72 42  lite3WhereOrderB
63b0: 79 4c 69 6d 69 74 4f 70 74 4c 61 62 65 6c 28 29  yLimitOptLabel()
63c0: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64   function for ad
63d0: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 2e 0a 20  ditional info.. 
63e0: 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43     */.    int iC
63f0: 73 72 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75  sr = pSort->iECu
6400: 72 73 6f 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  rsor;.    sqlite
6410: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6420: 50 5f 49 66 4e 6f 74 5a 65 72 6f 2c 20 69 4c 69  P_IfNotZero, iLi
6430: 6d 69 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65  mit, sqlite3Vdbe
6440: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 34  CurrentAddr(v)+4
6450: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
6460: 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
6470: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6480: 20 4f 50 5f 4c 61 73 74 2c 20 69 43 73 72 2c 20   OP_Last, iCsr, 
6490: 30 29 3b 0a 20 20 20 20 69 53 6b 69 70 20 3d 20  0);.    iSkip = 
64a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
64b0: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 4c 45  4Int(v, OP_IdxLE
64c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
64d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64e0: 20 20 20 69 43 73 72 2c 20 30 2c 20 72 65 67 42     iCsr, 0, regB
64f0: 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 45 78 70  ase+nOBSat, nExp
6500: 72 2d 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20 56  r-nOBSat);.    V
6510: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
6520: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6530: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65  ddOp1(v, OP_Dele
6540: 74 65 2c 20 69 43 73 72 29 3b 0a 20 20 7d 0a 20  te, iCsr);.  }. 
6550: 20 69 66 28 20 72 65 67 52 65 63 6f 72 64 3d 3d   if( regRecord==
6560: 30 20 29 7b 0a 20 20 20 20 72 65 67 52 65 63 6f  0 ){.    regReco
6570: 72 64 20 3d 20 6d 61 6b 65 53 6f 72 74 65 72 52  rd = makeSorterR
6580: 65 63 6f 72 64 28 70 50 61 72 73 65 2c 20 70 53  ecord(pParse, pS
6590: 6f 72 74 2c 20 70 53 65 6c 65 63 74 2c 20 72 65  ort, pSelect, re
65a0: 67 42 61 73 65 2c 20 6e 42 61 73 65 29 3b 0a 20  gBase, nBase);. 
65b0: 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e   }.  if( pSort->
65c0: 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54  sortFlags & SORT
65d0: 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29  FLAG_UseSorter )
65e0: 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 53 6f  {.    op = OP_So
65f0: 72 74 65 72 49 6e 73 65 72 74 3b 0a 20 20 7d 65  rterInsert;.  }e
6600: 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50  lse{.    op = OP
6610: 5f 49 64 78 49 6e 73 65 72 74 3b 0a 20 20 7d 0a  _IdxInsert;.  }.
6620: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6630: 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 70 53  Op4Int(v, op, pS
6640: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72  ort->iECursor, r
6650: 65 67 52 65 63 6f 72 64 2c 0a 20 20 20 20 20 20  egRecord,.      
6660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6670: 20 72 65 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c   regBase+nOBSat,
6680: 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74 29 3b 0a   nBase-nOBSat);.
6690: 20 20 69 66 28 20 69 53 6b 69 70 20 29 7b 0a 20    if( iSkip ){. 
66a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
66b0: 61 6e 67 65 50 32 28 76 2c 20 69 53 6b 69 70 2c  angeP2(v, iSkip,
66c0: 0a 20 20 20 20 20 20 20 20 20 70 53 6f 72 74 2d  .         pSort-
66d0: 3e 6c 61 62 65 6c 4f 42 4c 6f 70 74 20 3f 20 70  >labelOBLopt ? p
66e0: 53 6f 72 74 2d 3e 6c 61 62 65 6c 4f 42 4c 6f 70  Sort->labelOBLop
66f0: 74 20 3a 20 73 71 6c 69 74 65 33 56 64 62 65 43  t : sqlite3VdbeC
6700: 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a  urrentAddr(v));.
6710: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
6720: 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65   code to impleme
6730: 6e 74 20 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f  nt the OFFSET.*/
6740: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
6750: 65 4f 66 66 73 65 74 28 0a 20 20 56 64 62 65 20  eOffset(.  Vdbe 
6760: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  *v,          /* 
6770: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
6780: 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20  to this VM */.  
6790: 69 6e 74 20 69 4f 66 66 73 65 74 2c 20 20 20 20  int iOffset,    
67a0: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
67b0: 6c 64 69 6e 67 20 74 68 65 20 6f 66 66 73 65 74  lding the offset
67c0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
67d0: 74 20 69 43 6f 6e 74 69 6e 75 65 20 20 20 20 20  t iContinue     
67e0: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
67f0: 73 6b 69 70 20 74 68 65 20 63 75 72 72 65 6e 74  skip the current
6800: 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20   record */.){.  
6810: 69 66 28 20 69 4f 66 66 73 65 74 3e 30 20 29 7b  if( iOffset>0 ){
6820: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6830: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50  AddOp3(v, OP_IfP
6840: 6f 73 2c 20 69 4f 66 66 73 65 74 2c 20 69 43 6f  os, iOffset, iCo
6850: 6e 74 69 6e 75 65 2c 20 31 29 3b 20 56 64 62 65  ntinue, 1); Vdbe
6860: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
6870: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
6880: 20 22 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 7d   "OFFSET"));.  }
6890: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f  .}../*.** Add co
68a0: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63 68 65  de that will che
68b0: 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
68c0: 74 68 65 20 4e 20 72 65 67 69 73 74 65 72 73 20  the N registers 
68d0: 73 74 61 72 74 69 6e 67 20 61 74 20 69 4d 65 6d  starting at iMem
68e0: 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69 73 74 69  .** form a disti
68f0: 6e 63 74 20 65 6e 74 72 79 2e 20 20 69 54 61 62  nct entry.  iTab
6900: 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20 69 6e   is a sorting in
6910: 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20 70  dex that holds p
6920: 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65  reviously.** see
6930: 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f  n combinations o
6940: 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73 2e 20  f the N values. 
6950: 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20   A new entry is 
6960: 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20  made in iTab.** 
6970: 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 4e  if the current N
6980: 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65 77 2e   values are new.
6990: 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f  .**.** A jump to
69a0: 20 61 64 64 72 52 65 70 65 61 74 20 69 73 20 6d   addrRepeat is m
69b0: 61 64 65 20 61 6e 64 20 74 68 65 20 4e 2b 31 20  ade and the N+1 
69c0: 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70 70 65  values are poppe
69d0: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74  d from the.** st
69e0: 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70 20 4e  ack if the top N
69f0: 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f   elements are no
6a00: 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73  t distinct..*/.s
6a10: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 44  tatic void codeD
6a20: 69 73 74 69 6e 63 74 28 0a 20 20 50 61 72 73 65  istinct(.  Parse
6a30: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
6a40: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
6a50: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
6a60: 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54  text */.  int iT
6a70: 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ab,          /* 
6a80: 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  A sorting index 
6a90: 75 73 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72  used to test for
6aa0: 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20 2a 2f   distinctness */
6ab0: 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70 65 61  .  int addrRepea
6ac0: 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f  t,    /* Jump to
6ad0: 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64 69 73   here if not dis
6ae0: 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4e  tinct */.  int N
6af0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
6b00: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
6b10: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65  nts */.  int iMe
6b20: 6d 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m           /* F
6b30: 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  irst element */.
6b40: 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  ){.  Vdbe *v;.  
6b50: 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20 3d 20 70  int r1;..  v = p
6b60: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
6b70: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
6b80: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
6b90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6ba0: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
6bb0: 6e 64 2c 20 69 54 61 62 2c 20 61 64 64 72 52 65  nd, iTab, addrRe
6bc0: 70 65 61 74 2c 20 69 4d 65 6d 2c 20 4e 29 3b 20  peat, iMem, N); 
6bd0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
6be0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
6bf0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
6c00: 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20  ecord, iMem, N, 
6c10: 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  r1);.  sqlite3Vd
6c20: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
6c30: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61  P_IdxInsert, iTa
6c40: 62 2c 20 72 31 2c 20 69 4d 65 6d 2c 20 4e 29 3b  b, r1, iMem, N);
6c50: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
6c60: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
6c70: 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b  _USESEEKRESULT);
6c80: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
6c90: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
6ca0: 20 72 31 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20   r1);.}..#ifdef 
6cb0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
6cc0: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
6cd0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
6ce0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73  ion is called as
6cf0: 20 70 61 72 74 20 6f 66 20 69 6e 6e 65 72 2d 6c   part of inner-l
6d00: 6f 6f 70 20 67 65 6e 65 72 61 74 69 6f 6e 20 66  oop generation f
6d10: 6f 72 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73  or a SELECT.** s
6d20: 74 61 74 65 6d 65 6e 74 20 77 69 74 68 20 61 6e  tatement with an
6d30: 20 4f 52 44 45 52 20 42 59 20 74 68 61 74 20 69   ORDER BY that i
6d40: 73 20 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 64 20  s not optimized 
6d50: 62 79 20 61 6e 20 69 6e 64 65 78 2e 20 49 74 20  by an index. It 
6d60: 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 73 20 74  .** determines t
6d70: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  he expressions, 
6d80: 69 66 20 61 6e 79 2c 20 74 68 61 74 20 74 68 65  if any, that the
6d90: 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e 63   sorter-referenc
6da0: 65 20 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69  e .** optimizati
6db0: 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  on should be use
6dc0: 64 20 66 6f 72 2e 20 54 68 65 20 73 6f 72 74 65  d for. The sorte
6dd0: 72 2d 72 65 66 65 72 65 6e 63 65 20 6f 70 74 69  r-reference opti
6de0: 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 69 73 20 75  mization.** is u
6df0: 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 71  sed for SELECT q
6e00: 75 65 72 69 65 73 20 6c 69 6b 65 3a 0a 2a 2a 0a  ueries like:.**.
6e10: 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62  **   SELECT a, b
6e20: 69 67 62 6c 6f 62 20 46 52 4f 4d 20 74 31 20 4f  igblob FROM t1 O
6e30: 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20  RDER BY a LIMIT 
6e40: 31 30 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  10.**.** If the 
6e50: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
6e60: 75 73 65 64 20 66 6f 72 20 65 78 70 72 65 73 73  used for express
6e70: 69 6f 6e 20 22 62 69 67 62 6c 6f 62 22 2c 20 74  ion "bigblob", t
6e80: 68 65 6e 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  hen instead of.*
6e90: 2a 20 73 74 6f 72 69 6e 67 20 76 61 6c 75 65 73  * storing values
6ea0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 61 74 20   read from that 
6eb0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73 6f  column in the so
6ec0: 72 74 65 72 20 72 65 63 6f 72 64 73 2c 20 74 68  rter records, th
6ed0: 65 20 50 4b 20 6f 66 0a 2a 2a 20 74 68 65 20 72  e PK of.** the r
6ee0: 6f 77 20 66 72 6f 6d 20 74 61 62 6c 65 20 74 31  ow from table t1
6ef0: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 73 74 65   is stored inste
6f00: 61 64 2e 20 54 68 65 6e 2c 20 61 73 20 72 65 63  ad. Then, as rec
6f10: 6f 72 64 73 20 61 72 65 20 65 78 74 72 61 63 74  ords are extract
6f20: 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 73  ed from.** the s
6f30: 6f 72 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20  orter to return 
6f40: 74 6f 20 74 68 65 20 75 73 65 72 2c 20 74 68 65  to the user, the
6f50: 20 72 65 71 75 69 72 65 64 20 76 61 6c 75 65 20   required value 
6f60: 6f 66 20 62 69 67 62 6c 6f 62 20 69 73 0a 2a 2a  of bigblob is.**
6f70: 20 72 65 74 72 69 65 76 65 64 20 64 69 72 65 63   retrieved direc
6f80: 74 6c 79 20 66 72 6f 6d 20 74 61 62 6c 65 20 74  tly from table t
6f90: 31 2e 20 49 66 20 74 68 65 20 76 61 6c 75 65 73  1. If the values
6fa0: 20 61 72 65 20 76 65 72 79 20 6c 61 72 67 65 2c   are very large,
6fb0: 20 74 68 69 73 20 0a 2a 2a 20 63 61 6e 20 62 65   this .** can be
6fc0: 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 20   more efficient 
6fd0: 74 68 61 6e 20 73 74 6f 72 69 6e 67 20 74 68 65  than storing the
6fe0: 6d 20 64 69 72 65 63 74 6c 79 20 69 6e 20 74 68  m directly in th
6ff0: 65 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 73  e sorter records
7000: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72  ..**.** The Expr
7010: 4c 69 73 74 5f 69 74 65 6d 2e 62 53 6f 72 74 65  List_item.bSorte
7020: 72 52 65 66 20 66 6c 61 67 20 69 73 20 73 65 74  rRef flag is set
7030: 20 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 73   for each expres
7040: 73 69 6f 6e 20 69 6e 20 70 45 4c 69 73 74 20 0a  sion in pEList .
7050: 2a 2a 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  ** for which the
7060: 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e 63   sorter-referenc
7070: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 73  e optimization s
7080: 68 6f 75 6c 64 20 62 65 20 65 6e 61 62 6c 65 64  hould be enabled
7090: 2e 20 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c  . .** Additional
70a0: 6c 79 2c 20 74 68 65 20 70 53 6f 72 74 2d 3e 61  ly, the pSort->a
70b0: 44 65 66 65 72 5b 5d 20 61 72 72 61 79 20 69 73  Defer[] array is
70c0: 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
70d0: 65 6e 74 72 69 65 73 0a 2a 2a 20 66 6f 72 20 61  entries.** for a
70e0: 6c 6c 20 63 75 72 73 6f 72 73 20 72 65 71 75 69  ll cursors requi
70f0: 72 65 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20  red to evaluate 
7100: 61 6c 6c 20 73 65 6c 65 63 74 65 64 20 65 78 70  all selected exp
7110: 72 65 73 73 69 6f 6e 73 2e 20 46 69 6e 61 6c 6c  ressions. Finall
7120: 79 2e 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 72  y..** output var
7130: 69 61 62 6c 65 20 28 2a 70 70 45 78 74 72 61 29  iable (*ppExtra)
7140: 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 65 78   is set to an ex
7150: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f  pression list co
7160: 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 65 78 70 72  ntaining.** expr
7170: 65 73 73 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20  essions for all 
7180: 65 78 74 72 61 20 50 4b 20 76 61 6c 75 65 73 20  extra PK values 
7190: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 73  that should be s
71a0: 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  tored in the.** 
71b0: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 73 2e 0a  sorter records..
71c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
71d0: 65 6c 65 63 74 45 78 70 72 44 65 66 65 72 28 0a  electExprDefer(.
71e0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
71f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7200: 20 20 2f 2a 20 4c 65 61 76 65 20 61 6e 79 20 65    /* Leave any e
7210: 72 72 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 53  rror here */.  S
7220: 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20  ortCtx *pSort,  
7230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7240: 2a 20 53 6f 72 74 65 72 20 63 6f 6e 74 65 78 74  * Sorter context
7250: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
7260: 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  pEList,         
7270: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
7280: 69 6f 6e 73 20 64 65 73 74 69 6e 65 64 20 66 6f  ions destined fo
7290: 72 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 45 78  r sorter */.  Ex
72a0: 70 72 4c 69 73 74 20 2a 2a 70 70 45 78 74 72 61  prList **ppExtra
72b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
72c0: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 20   Expressions to 
72d0: 61 70 70 65 6e 64 20 74 6f 20 73 6f 72 74 65 72  append to sorter
72e0: 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20   record */.){.  
72f0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 44 65  int i;.  int nDe
7300: 66 65 72 20 3d 20 30 3b 0a 20 20 45 78 70 72 4c  fer = 0;.  ExprL
7310: 69 73 74 20 2a 70 45 78 74 72 61 20 3d 20 30 3b  ist *pExtra = 0;
7320: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
7330: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
7340: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
7350: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
7360: 65 6d 20 3d 20 26 70 45 4c 69 73 74 2d 3e 61 5b  em = &pEList->a[
7370: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  i];.    if( pIte
7380: 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
7390: 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  ol==0 ){.      E
73a0: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 49 74  xpr *pExpr = pIt
73b0: 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  em->pExpr;.     
73c0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
73d0: 45 78 70 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20  Expr->y.pTab;.  
73e0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
73f0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
7400: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
7410: 30 20 26 26 20 70 54 61 62 20 26 26 20 21 49 73  0 && pTab && !Is
7420: 56 69 72 74 75 61 6c 28 70 54 61 62 29 0a 20 20  Virtual(pTab).  
7430: 20 20 20 20 20 26 26 20 28 70 54 61 62 2d 3e 61       && (pTab->a
7440: 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  Col[pExpr->iColu
7450: 6d 6e 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43  mn].colFlags & C
7460: 4f 4c 46 4c 41 47 5f 53 4f 52 54 45 52 52 45 46  OLFLAG_SORTERREF
7470: 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
7480: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
7490: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 44 65    for(j=0; j<nDe
74a0: 66 65 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  fer; j++){.     
74b0: 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e       if( pSort->
74c0: 61 44 65 66 65 72 5b 6a 5d 2e 69 43 73 72 3d 3d  aDefer[j].iCsr==
74d0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 20  pExpr->iTable ) 
74e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
74f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d  .        if( j==
7500: 6e 44 65 66 65 72 20 29 7b 0a 20 20 20 20 20 20  nDefer ){.      
7510: 20 20 20 20 69 66 28 20 6e 44 65 66 65 72 3d 3d      if( nDefer==
7520: 41 72 72 61 79 53 69 7a 65 28 70 53 6f 72 74 2d  ArraySize(pSort-
7530: 3e 61 44 65 66 65 72 29 20 29 7b 0a 20 20 20 20  >aDefer) ){.    
7540: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
7550: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
7560: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e{.            i
7570: 6e 74 20 6e 4b 65 79 20 3d 20 31 3b 0a 20 20 20  nt nKey = 1;.   
7580: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a           int k;.
7590: 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 64 65              Inde
75a0: 78 20 2a 70 50 6b 20 3d 20 30 3b 0a 20 20 20 20  x *pPk = 0;.    
75b0: 20 20 20 20 20 20 20 20 69 66 28 20 21 48 61 73          if( !Has
75c0: 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
75d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 6b               pPk
75e0: 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
75f0: 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
7600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  .              n
7610: 4b 65 79 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43  Key = pPk->nKeyC
7620: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol;.            
7630: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  }.            fo
7640: 72 28 6b 3d 30 3b 20 6b 3c 6e 4b 65 79 3b 20 6b  r(k=0; k<nKey; k
7650: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
7660: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20     Expr *pNew = 
7670: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
7680: 72 73 65 2c 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 20  rse, TK_COLUMN, 
7690: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 0);.         
76a0: 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
76b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
76c0: 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65 20 3d 20   pNew->iTable = 
76d0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
76e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
76f0: 4e 65 77 2d 3e 79 2e 70 54 61 62 20 3d 20 70 45  New->y.pTab = pE
7700: 78 70 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20  xpr->y.pTab;.   
7710: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
7720: 77 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 50 6b  w->iColumn = pPk
7730: 20 3f 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e   ? pPk->aiColumn
7740: 5b 6b 5d 20 3a 20 2d 31 3b 0a 20 20 20 20 20 20  [k] : -1;.      
7750: 20 20 20 20 20 20 20 20 20 20 70 45 78 74 72 61            pExtra
7760: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
7770: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
7780: 20 70 45 78 74 72 61 2c 20 70 4e 65 77 29 3b 0a   pExtra, pNew);.
7790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
77a0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
77b0: 20 20 20 20 20 20 20 20 20 20 70 53 6f 72 74 2d            pSort-
77c0: 3e 61 44 65 66 65 72 5b 6e 44 65 66 65 72 5d 2e  >aDefer[nDefer].
77d0: 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 79 2e  pTab = pExpr->y.
77e0: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
77f0: 20 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b    pSort->aDefer[
7800: 6e 44 65 66 65 72 5d 2e 69 43 73 72 20 3d 20 70  nDefer].iCsr = p
7810: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
7820: 20 20 20 20 20 20 20 20 20 20 70 53 6f 72 74 2d            pSort-
7830: 3e 61 44 65 66 65 72 5b 6e 44 65 66 65 72 5d 2e  >aDefer[nDefer].
7840: 6e 4b 65 79 20 3d 20 6e 4b 65 79 3b 0a 20 20 20  nKey = nKey;.   
7850: 20 20 20 20 20 20 20 20 20 6e 44 65 66 65 72 2b           nDefer+
7860: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
7870: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7880: 20 70 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52   pItem->bSorterR
7890: 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ef = 1;.      }.
78a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 53 6f 72      }.  }.  pSor
78b0: 74 2d 3e 6e 44 65 66 65 72 20 3d 20 28 75 38 29  t->nDefer = (u8)
78c0: 6e 44 65 66 65 72 3b 0a 20 20 2a 70 70 45 78 74  nDefer;.  *ppExt
78d0: 72 61 20 3d 20 70 45 78 74 72 61 3b 0a 7d 0a 23  ra = pExtra;.}.#
78e0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
78f0: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
7900: 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72  tes the code for
7910: 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74   the inside of t
7920: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a  he inner loop.**
7930: 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a   of a SELECT..**
7940: 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20 69 73  .** If srcTab is
7950: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20   negative, then 
7960: 74 68 65 20 70 2d 3e 70 45 4c 69 73 74 20 65 78  the p->pEList ex
7970: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65  pressions.** are
7980: 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72   evaluated in or
7990: 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 64  der to get the d
79a0: 61 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77  ata for this row
79b0: 2e 20 20 49 66 20 73 72 63 54 61 62 20 69 73 0a  .  If srcTab is.
79c0: 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 2c  ** zero or more,
79d0: 20 74 68 65 6e 20 64 61 74 61 20 69 73 20 70 75   then data is pu
79e0: 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62  lled from srcTab
79f0: 20 61 6e 64 20 70 2d 3e 70 45 4c 69 73 74 20 69   and p->pEList i
7a00: 73 20 75 73 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20  s used only .** 
7a10: 74 6f 20 67 65 74 20 74 68 65 20 6e 75 6d 62 65  to get the numbe
7a20: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 61 6e 64  r of columns and
7a30: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
7a40: 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68  equence for each
7a50: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74   column..*/.stat
7a60: 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e  ic void selectIn
7a70: 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65  nerLoop(.  Parse
7a80: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
7a90: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
7aa0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
7ab0: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
7ac0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
7ad0: 70 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74 61  plete select sta
7ae0: 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
7af0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54  ed */.  int srcT
7b00: 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ab,             
7b10: 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f  /* Pull data fro
7b20: 6d 20 74 68 69 73 20 74 61 62 6c 65 20 69 66 20  m this table if 
7b30: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 2a 2f 0a  non-negative */.
7b40: 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74    SortCtx *pSort
7b50: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ,         /* If 
7b60: 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f  not NULL, info o
7b70: 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73  n how to process
7b80: 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 44   ORDER BY */.  D
7b90: 69 73 74 69 6e 63 74 43 74 78 20 2a 70 44 69 73  istinctCtx *pDis
7ba0: 74 69 6e 63 74 2c 20 2f 2a 20 49 66 20 6e 6f 74  tinct, /* If not
7bb0: 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68   NULL, info on h
7bc0: 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20 44 49  ow to process DI
7bd0: 53 54 49 4e 43 54 20 2a 2f 0a 20 20 53 65 6c 65  STINCT */.  Sele
7be0: 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
7bf0: 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69      /* How to di
7c00: 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73  spose of the res
7c10: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ults */.  int iC
7c20: 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20  ontinue,        
7c30: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
7c40: 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
7c50: 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e  next row */.  in
7c60: 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20  t iBreak        
7c70: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
7c80: 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  re to break out 
7c90: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
7ca0: 70 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  p */.){.  Vdbe *
7cb0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
7cc0: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
7cd0: 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20  t hasDistinct;  
7ce0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7cf0: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
7d00: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
7d10: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44  sent */.  int eD
7d20: 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65  est = pDest->eDe
7d30: 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20  st;   /* How to 
7d40: 64 69 73 70 6f 73 65 20 6f 66 20 72 65 73 75 6c  dispose of resul
7d50: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ts */.  int iPar
7d60: 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61  m = pDest->iSDPa
7d70: 72 6d 3b 20 2f 2a 20 46 69 72 73 74 20 61 72 67  rm; /* First arg
7d80: 75 6d 65 6e 74 20 74 6f 20 64 69 73 70 6f 73 61  ument to disposa
7d90: 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e  l method */.  in
7da0: 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20 20  t nResultCol;   
7db0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7dc0: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
7dd0: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  lumns */.  int n
7de0: 50 72 65 66 69 78 52 65 67 20 3d 20 30 3b 20 20  PrefixReg = 0;  
7df0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7e00: 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73 74   of extra regist
7e10: 65 72 73 20 62 65 66 6f 72 65 20 72 65 67 52 65  ers before regRe
7e20: 73 75 6c 74 20 2a 2f 0a 20 20 52 6f 77 4c 6f 61  sult */.  RowLoa
7e30: 64 49 6e 66 6f 20 73 52 6f 77 4c 6f 61 64 49 6e  dInfo sRowLoadIn
7e40: 66 6f 3b 20 20 20 2f 2a 20 49 6e 66 6f 20 66 6f  fo;   /* Info fo
7e50: 72 20 64 65 66 65 72 72 65 64 20 72 6f 77 20 6c  r deferred row l
7e60: 6f 61 64 69 6e 67 20 2a 2f 0a 0a 20 20 2f 2a 20  oading */..  /* 
7e70: 55 73 75 61 6c 6c 79 2c 20 72 65 67 52 65 73 75  Usually, regResu
7e80: 6c 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20  lt is the first 
7e90: 63 65 6c 6c 20 69 6e 20 61 6e 20 61 72 72 61 79  cell in an array
7ea0: 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73   of memory cells
7eb0: 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  .  ** containing
7ec0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 73   the current res
7ed0: 75 6c 74 20 72 6f 77 2e 20 49 6e 20 74 68 69 73  ult row. In this
7ee0: 20 63 61 73 65 20 72 65 67 4f 72 69 67 20 69 73   case regOrig is
7ef0: 20 73 65 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a   set to the.  **
7f00: 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 48 6f 77   same value. How
7f10: 65 76 65 72 2c 20 69 66 20 74 68 65 20 72 65 73  ever, if the res
7f20: 75 6c 74 73 20 61 72 65 20 62 65 69 6e 67 20 73  ults are being s
7f30: 65 6e 74 20 74 6f 20 74 68 65 20 73 6f 72 74 65  ent to the sorte
7f40: 72 2c 20 74 68 65 0a 20 20 2a 2a 20 76 61 6c 75  r, the.  ** valu
7f50: 65 73 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65  es for any expre
7f60: 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ssions that are 
7f70: 61 6c 73 6f 20 70 61 72 74 20 6f 66 20 74 68 65  also part of the
7f80: 20 73 6f 72 74 2d 6b 65 79 20 61 72 65 20 6f 6d   sort-key are om
7f90: 69 74 74 65 64 0a 20 20 2a 2a 20 66 72 6f 6d 20  itted.  ** from 
7fa0: 74 68 69 73 20 61 72 72 61 79 2e 20 49 6e 20 74  this array. In t
7fb0: 68 69 73 20 63 61 73 65 20 72 65 67 4f 72 69 67  his case regOrig
7fc0: 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
7fd0: 20 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65    */.  int regRe
7fe0: 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20  sult;           
7ff0: 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d     /* Start of m
8000: 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 63 75  emory holding cu
8010: 72 72 65 6e 74 20 72 65 73 75 6c 74 73 20 2a 2f  rrent results */
8020: 0a 20 20 69 6e 74 20 72 65 67 4f 72 69 67 3b 20  .  int regOrig; 
8030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8040: 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72  * Start of memor
8050: 79 20 68 6f 6c 64 69 6e 67 20 66 75 6c 6c 20 72  y holding full r
8060: 65 73 75 6c 74 20 28 6f 72 20 30 29 20 2a 2f 0a  esult (or 0) */.
8070: 0a 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a  .  assert( v );.
8080: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
8090: 69 73 74 21 3d 30 20 29 3b 0a 20 20 68 61 73 44  ist!=0 );.  hasD
80a0: 69 73 74 69 6e 63 74 20 3d 20 70 44 69 73 74 69  istinct = pDisti
80b0: 6e 63 74 20 3f 20 70 44 69 73 74 69 6e 63 74 2d  nct ? pDistinct-
80c0: 3e 65 54 6e 63 74 54 79 70 65 20 3a 20 57 48 45  >eTnctType : WHE
80d0: 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50  RE_DISTINCT_NOOP
80e0: 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 20 26 26  ;.  if( pSort &&
80f0: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
8100: 3d 3d 30 20 29 20 70 53 6f 72 74 20 3d 20 30 3b  ==0 ) pSort = 0;
8110: 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20  .  if( pSort==0 
8120: 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20  && !hasDistinct 
8130: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
8140: 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20  Continue!=0 );. 
8150: 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c     codeOffset(v,
8160: 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f   p->iOffset, iCo
8170: 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20 20  ntinue);.  }..  
8180: 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75  /* Pull the requ
8190: 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20  ested columns.. 
81a0: 20 2a 2f 0a 20 20 6e 52 65 73 75 6c 74 43 6f 6c   */.  nResultCol
81b0: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45   = p->pEList->nE
81c0: 78 70 72 3b 0a 0a 20 20 69 66 28 20 70 44 65 73  xpr;..  if( pDes
81d0: 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20  t->iSdst==0 ){. 
81e0: 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a     if( pSort ){.
81f0: 20 20 20 20 20 20 6e 50 72 65 66 69 78 52 65 67        nPrefixReg
8200: 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72   = pSort->pOrder
8210: 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
8220: 20 69 66 28 20 21 28 70 53 6f 72 74 2d 3e 73 6f   if( !(pSort->so
8230: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
8240: 41 47 5f 55 73 65 53 6f 72 74 65 72 29 20 29 20  AG_UseSorter) ) 
8250: 6e 50 72 65 66 69 78 52 65 67 2b 2b 3b 0a 20 20  nPrefixReg++;.  
8260: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
8270: 20 2b 3d 20 6e 50 72 65 66 69 78 52 65 67 3b 0a   += nPrefixReg;.
8280: 20 20 20 20 7d 0a 20 20 20 20 70 44 65 73 74 2d      }.    pDest-
8290: 3e 69 53 64 73 74 20 3d 20 70 50 61 72 73 65 2d  >iSdst = pParse-
82a0: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
82b0: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
82c0: 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65  sultCol;.  }else
82d0: 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73   if( pDest->iSds
82e0: 74 2b 6e 52 65 73 75 6c 74 43 6f 6c 20 3e 20 70  t+nResultCol > p
82f0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20  Parse->nMem ){. 
8300: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e     /* This is an
8310: 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e   error condition
8320: 20 74 68 61 74 20 63 61 6e 20 72 65 73 75 6c 74   that can result
8330: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77  , for example, w
8340: 68 65 6e 20 61 20 53 45 4c 45 43 54 0a 20 20 20  hen a SELECT.   
8350: 20 2a 2a 20 6f 6e 20 74 68 65 20 72 69 67 68 74   ** on the right
8360: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 6e  -hand side of an
8370: 20 49 4e 53 45 52 54 20 63 6f 6e 74 61 69 6e 73   INSERT contains
8380: 20 6d 6f 72 65 20 72 65 73 75 6c 74 20 63 6f 6c   more result col
8390: 75 6d 6e 73 20 74 68 61 6e 0a 20 20 20 20 2a 2a  umns than.    **
83a0: 20 74 68 65 72 65 20 61 72 65 20 63 6f 6c 75 6d   there are colum
83b0: 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ns in the table 
83c0: 6f 6e 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68  on the left.  Th
83d0: 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20  e error will be 
83e0: 63 61 75 67 68 74 0a 20 20 20 20 2a 2a 20 61 6e  caught.    ** an
83f0: 64 20 72 65 70 6f 72 74 65 64 20 6c 61 74 65 72  d reported later
8400: 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 20 74  .  But we need t
8410: 6f 20 6d 61 6b 65 20 73 75 72 65 20 65 6e 6f 75  o make sure enou
8420: 67 68 20 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c  gh memory is all
8430: 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 74 6f  ocated.    ** to
8440: 20 61 76 6f 69 64 20 6f 74 68 65 72 20 73 70 75   avoid other spu
8450: 72 69 6f 75 73 20 65 72 72 6f 72 73 20 69 6e 20  rious errors in 
8460: 74 68 65 20 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f  the meantime. */
8470: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
8480: 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  m += nResultCol;
8490: 0a 20 20 7d 0a 20 20 70 44 65 73 74 2d 3e 6e 53  .  }.  pDest->nS
84a0: 64 73 74 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  dst = nResultCol
84b0: 3b 0a 20 20 72 65 67 4f 72 69 67 20 3d 20 72 65  ;.  regOrig = re
84c0: 67 52 65 73 75 6c 74 20 3d 20 70 44 65 73 74 2d  gResult = pDest-
84d0: 3e 69 53 64 73 74 3b 0a 20 20 69 66 28 20 73 72  >iSdst;.  if( sr
84e0: 63 54 61 62 3e 3d 30 20 29 7b 0a 20 20 20 20 66  cTab>=0 ){.    f
84f0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c  or(i=0; i<nResul
8500: 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tCol; i++){.    
8510: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8520: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
8530: 2c 20 73 72 63 54 61 62 2c 20 69 2c 20 72 65 67  , srcTab, i, reg
8540: 52 65 73 75 6c 74 2b 69 29 3b 0a 20 20 20 20 20  Result+i);.     
8550: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
8560: 20 22 25 73 22 2c 20 70 2d 3e 70 45 4c 69 73 74   "%s", p->pEList
8570: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 29 3b 0a  ->a[i].zName));.
8580: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
8590: 28 20 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69  ( eDest!=SRT_Exi
85a0: 73 74 73 20 29 7b 0a 23 69 66 64 65 66 20 53 51  sts ){.#ifdef SQ
85b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
85c0: 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20  ER_REFERENCES.  
85d0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 78 74    ExprList *pExt
85e0: 72 61 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  ra = 0;.#endif. 
85f0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73     /* If the des
8600: 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 45  tination is an E
8610: 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70 72 65  XISTS(...) expre
8620: 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74 75 61  ssion, the actua
8630: 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  l.    ** values 
8640: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
8650: 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74 20 72  SELECT are not r
8660: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
8670: 20 20 20 20 75 38 20 65 63 65 6c 46 6c 61 67 73      u8 ecelFlags
8680: 3b 20 20 20 20 2f 2a 20 22 65 63 65 6c 22 20 69  ;    /* "ecel" i
8690: 73 20 61 6e 20 61 62 62 72 65 76 69 61 74 69 6f  s an abbreviatio
86a0: 6e 20 6f 66 20 22 45 78 70 72 43 6f 64 65 45 78  n of "ExprCodeEx
86b0: 70 72 4c 69 73 74 22 20 2a 2f 0a 20 20 20 20 45  prList" */.    E
86c0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
86d0: 0a 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d  .    if( eDest==
86e0: 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74  SRT_Mem || eDest
86f0: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20  ==SRT_Output || 
8700: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
8710: 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 65 63  tine ){.      ec
8720: 65 6c 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  elFlags = SQLITE
8730: 5f 45 43 45 4c 5f 44 55 50 3b 0a 20 20 20 20 7d  _ECEL_DUP;.    }
8740: 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 63 65 6c  else{.      ecel
8750: 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 7d  Flags = 0;.    }
8760: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 26  .    if( pSort &
8770: 26 20 68 61 73 44 69 73 74 69 6e 63 74 3d 3d 30  & hasDistinct==0
8780: 20 26 26 20 65 44 65 73 74 21 3d 53 52 54 5f 45   && eDest!=SRT_E
8790: 70 68 65 6d 54 61 62 20 26 26 20 65 44 65 73 74  phemTab && eDest
87a0: 21 3d 53 52 54 5f 54 61 62 6c 65 20 29 7b 0a 20  !=SRT_Table ){. 
87b0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 65 61 63 68       /* For each
87c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 70   expression in p
87d0: 2d 3e 70 45 4c 69 73 74 20 74 68 61 74 20 69 73  ->pEList that is
87e0: 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65 78   a copy of an ex
87f0: 70 72 65 73 73 69 6f 6e 20 69 6e 0a 20 20 20 20  pression in.    
8800: 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42    ** the ORDER B
8810: 59 20 63 6c 61 75 73 65 20 28 70 53 6f 72 74 2d  Y clause (pSort-
8820: 3e 70 4f 72 64 65 72 42 79 29 2c 20 73 65 74 20  >pOrderBy), set 
8830: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 0a  the associated .
8840: 20 20 20 20 20 20 2a 2a 20 69 4f 72 64 65 72 42        ** iOrderB
8850: 79 43 6f 6c 20 76 61 6c 75 65 20 74 6f 20 6f 6e  yCol value to on
8860: 65 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20  e more than the 
8870: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 4f 52 44  index of the ORD
8880: 45 52 20 42 59 20 0a 20 20 20 20 20 20 2a 2a 20  ER BY .      ** 
8890: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 69  expression withi
88a0: 6e 20 74 68 65 20 73 6f 72 74 2d 6b 65 79 20 74  n the sort-key t
88b0: 68 61 74 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74  hat pushOntoSort
88c0: 65 72 28 29 20 77 69 6c 6c 20 67 65 6e 65 72 61  er() will genera
88d0: 74 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  te..      ** Thi
88e0: 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 70 2d 3e  s allows the p->
88f0: 70 45 4c 69 73 74 20 66 69 65 6c 64 20 74 6f 20  pEList field to 
8900: 62 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20  be omitted from 
8910: 74 68 65 20 73 6f 72 74 65 64 20 72 65 63 6f 72  the sorted recor
8920: 64 2c 0a 20 20 20 20 20 20 2a 2a 20 73 61 76 69  d,.      ** savi
8930: 6e 67 20 73 70 61 63 65 20 61 6e 64 20 43 50 55  ng space and CPU
8940: 20 63 79 63 6c 65 73 2e 20 20 2a 2f 0a 20 20 20   cycles.  */.   
8950: 20 20 20 65 63 65 6c 46 6c 61 67 73 20 7c 3d 20     ecelFlags |= 
8960: 28 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49  (SQLITE_ECEL_OMI
8970: 54 52 45 46 7c 53 51 4c 49 54 45 5f 45 43 45 4c  TREF|SQLITE_ECEL
8980: 5f 52 45 46 29 3b 0a 0a 20 20 20 20 20 20 66 6f  _REF);..      fo
8990: 72 28 69 3d 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  r(i=pSort->nOBSa
89a0: 74 3b 20 69 3c 70 53 6f 72 74 2d 3e 70 4f 72 64  t; i<pSort->pOrd
89b0: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
89c0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  ){.        int j
89d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6a  ;.        if( (j
89e0: 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72   = pSort->pOrder
89f0: 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72  By->a[i].u.x.iOr
8a00: 64 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a 20  derByCol)>0 ){. 
8a10: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45 4c 69           p->pELi
8a20: 73 74 2d 3e 61 5b 6a 2d 31 5d 2e 75 2e 78 2e 69  st->a[j-1].u.x.i
8a30: 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 69 2b 31  OrderByCol = i+1
8a40: 2d 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a  -pSort->nOBSat;.
8a50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8a60: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
8a70: 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45  ENABLE_SORTER_RE
8a80: 46 45 52 45 4e 43 45 53 0a 20 20 20 20 20 20 73  FERENCES.      s
8a90: 65 6c 65 63 74 45 78 70 72 44 65 66 65 72 28 70  electExprDefer(p
8aa0: 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2d  Parse, pSort, p-
8ab0: 3e 70 45 4c 69 73 74 2c 20 26 70 45 78 74 72 61  >pEList, &pExtra
8ac0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
8ad0: 74 72 61 20 26 26 20 70 50 61 72 73 65 2d 3e 64  tra && pParse->d
8ae0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
8af0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
8b00: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   If there are an
8b10: 79 20 65 78 74 72 61 20 50 4b 20 63 6f 6c 75 6d  y extra PK colum
8b20: 6e 73 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65  ns to add to the
8b30: 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 73 2c   sorter records,
8b40: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  .        ** allo
8b50: 63 61 74 65 20 65 78 74 72 61 20 6d 65 6d 6f 72  cate extra memor
8b60: 79 20 63 65 6c 6c 73 20 61 6e 64 20 61 64 6a 75  y cells and adju
8b70: 73 74 20 74 68 65 20 4f 70 65 6e 45 70 68 65 6d  st the OpenEphem
8b80: 65 72 61 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a  eral .        **
8b90: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
8ba0: 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20  account for the 
8bb0: 6c 61 72 67 65 72 20 72 65 63 6f 72 64 73 2e 20  larger records. 
8bc0: 54 68 69 73 20 69 73 20 6f 6e 6c 79 0a 20 20 20  This is only.   
8bd0: 20 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64       ** required
8be0: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e   if there are on
8bf0: 65 20 6f 72 20 6d 6f 72 65 20 57 49 54 48 4f 55  e or more WITHOU
8c00: 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20 77  T ROWID tables w
8c10: 69 74 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  ith.        ** c
8c20: 6f 6d 70 6f 73 69 74 65 20 70 72 69 6d 61 72 79  omposite primary
8c30: 20 6b 65 79 73 20 69 6e 20 74 68 65 20 53 6f 72   keys in the Sor
8c40: 74 43 74 78 2e 61 44 65 66 65 72 5b 5d 20 61 72  tCtx.aDefer[] ar
8c50: 72 61 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ray.  */.       
8c60: 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 73   VdbeOp *pOp = s
8c70: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
8c80: 76 2c 20 70 53 6f 72 74 2d 3e 61 64 64 72 53 6f  v, pSort->addrSo
8c90: 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  rtIndex);.      
8ca0: 20 20 70 4f 70 2d 3e 70 32 20 2b 3d 20 28 70 45    pOp->p2 += (pE
8cb0: 78 74 72 61 2d 3e 6e 45 78 70 72 20 2d 20 70 53  xtra->nExpr - pS
8cc0: 6f 72 74 2d 3e 6e 44 65 66 65 72 29 3b 0a 20 20  ort->nDefer);.  
8cd0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b        pOp->p4.pK
8ce0: 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c  eyInfo->nAllFiel
8cf0: 64 20 2b 3d 20 28 70 45 78 74 72 61 2d 3e 6e 45  d += (pExtra->nE
8d00: 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 44 65  xpr - pSort->nDe
8d10: 66 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50  fer);.        pP
8d20: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 45  arse->nMem += pE
8d30: 78 74 72 61 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  xtra->nExpr;.   
8d40: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
8d50: 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e 52 65     /* Adjust nRe
8d60: 73 75 6c 74 43 6f 6c 20 74 6f 20 61 63 63 6f 75  sultCol to accou
8d70: 6e 74 20 66 6f 72 20 63 6f 6c 75 6d 6e 73 20 74  nt for columns t
8d80: 68 61 74 20 61 72 65 20 6f 6d 69 74 74 65 64 0a  hat are omitted.
8d90: 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
8da0: 65 20 73 6f 72 74 65 72 20 62 79 20 74 68 65 20  e sorter by the 
8db0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e  optimizations in
8dc0: 20 74 68 69 73 20 62 72 61 6e 63 68 20 2a 2f 0a   this branch */.
8dd0: 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70        pEList = p
8de0: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  ->pEList;.      
8df0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
8e00: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
8e10: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 4c 69          if( pELi
8e20: 73 74 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72  st->a[i].u.x.iOr
8e30: 64 65 72 42 79 43 6f 6c 3e 30 0a 23 69 66 64 65  derByCol>0.#ifde
8e40: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8e50: 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45  SORTER_REFERENCE
8e60: 53 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45  S.         || pE
8e70: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 62 53 6f 72 74  List->a[i].bSort
8e80: 65 72 52 65 66 0a 23 65 6e 64 69 66 0a 20 20 20  erRef.#endif.   
8e90: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
8ea0: 20 20 6e 52 65 73 75 6c 74 43 6f 6c 2d 2d 3b 0a    nResultCol--;.
8eb0: 20 20 20 20 20 20 20 20 20 20 72 65 67 4f 72 69            regOri
8ec0: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  g = 0;.        }
8ed0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
8ee0: 74 65 73 74 63 61 73 65 28 20 72 65 67 4f 72 69  testcase( regOri
8ef0: 67 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  g );.      testc
8f00: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
8f10: 53 65 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Set );.      tes
8f20: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
8f30: 54 5f 4d 65 6d 20 29 3b 0a 20 20 20 20 20 20 74  T_Mem );.      t
8f40: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
8f50: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b  SRT_Coroutine );
8f60: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
8f70: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
8f80: 75 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ut );.      asse
8f90: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53  rt( eDest==SRT_S
8fa0: 65 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  et || eDest==SRT
8fb0: 5f 4d 65 6d 20 0a 20 20 20 20 20 20 20 20 20 20  _Mem .          
8fc0: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
8fd0: 6f 72 6f 75 74 69 6e 65 20 7c 7c 20 65 44 65 73  oroutine || eDes
8fe0: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
8ff0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 52 6f 77 4c  .    }.    sRowL
9000: 6f 61 64 49 6e 66 6f 2e 72 65 67 52 65 73 75 6c  oadInfo.regResul
9010: 74 20 3d 20 72 65 67 52 65 73 75 6c 74 3b 0a 20  t = regResult;. 
9020: 20 20 20 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 2e     sRowLoadInfo.
9030: 65 63 65 6c 46 6c 61 67 73 20 3d 20 65 63 65 6c  ecelFlags = ecel
9040: 46 6c 61 67 73 3b 0a 23 69 66 64 65 66 20 53 51  Flags;.#ifdef SQ
9050: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
9060: 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20  ER_REFERENCES.  
9070: 20 20 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 2e 70    sRowLoadInfo.p
9080: 45 78 74 72 61 20 3d 20 70 45 78 74 72 61 3b 0a  Extra = pExtra;.
9090: 20 20 20 20 73 52 6f 77 4c 6f 61 64 49 6e 66 6f      sRowLoadInfo
90a0: 2e 72 65 67 45 78 74 72 61 52 65 73 75 6c 74 20  .regExtraResult 
90b0: 3d 20 72 65 67 52 65 73 75 6c 74 20 2b 20 6e 52  = regResult + nR
90c0: 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 69 66  esultCol;.    if
90d0: 28 20 70 45 78 74 72 61 20 29 20 6e 52 65 73 75  ( pExtra ) nResu
90e0: 6c 74 43 6f 6c 20 2b 3d 20 70 45 78 74 72 61 2d  ltCol += pExtra-
90f0: 3e 6e 45 78 70 72 3b 0a 23 65 6e 64 69 66 0a 20  >nExpr;.#endif. 
9100: 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74     if( p->iLimit
9110: 0a 20 20 20 20 20 26 26 20 28 65 63 65 6c 46 6c  .     && (ecelFl
9120: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45  ags & SQLITE_ECE
9130: 4c 5f 4f 4d 49 54 52 45 46 29 21 3d 30 20 0a 20  L_OMITREF)!=0 . 
9140: 20 20 20 20 26 26 20 6e 50 72 65 66 69 78 52 65      && nPrefixRe
9150: 67 3e 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  g>0.    ){.     
9160: 20 61 73 73 65 72 74 28 20 70 53 6f 72 74 21 3d   assert( pSort!=
9170: 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
9180: 74 28 20 68 61 73 44 69 73 74 69 6e 63 74 3d 3d  t( hasDistinct==
9190: 30 20 29 3b 0a 20 20 20 20 20 20 70 53 6f 72 74  0 );.      pSort
91a0: 2d 3e 70 44 65 66 65 72 72 65 64 52 6f 77 4c 6f  ->pDeferredRowLo
91b0: 61 64 20 3d 20 26 73 52 6f 77 4c 6f 61 64 49 6e  ad = &sRowLoadIn
91c0: 66 6f 3b 0a 20 20 20 20 20 20 72 65 67 4f 72 69  fo;.      regOri
91d0: 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  g = 0;.    }else
91e0: 7b 0a 20 20 20 20 20 20 69 6e 6e 65 72 4c 6f 6f  {.      innerLoo
91f0: 70 4c 6f 61 64 52 6f 77 28 70 50 61 72 73 65 2c  pLoadRow(pParse,
9200: 20 70 2c 20 26 73 52 6f 77 4c 6f 61 64 49 6e 66   p, &sRowLoadInf
9210: 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  o);.    }.  }.. 
9220: 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54 49   /* If the DISTI
9230: 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73 20  NCT keyword was 
9240: 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20 53  present on the S
9250: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
9260: 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72 6f    ** and this ro
9270: 77 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20  w has been seen 
9280: 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20  before, then do 
9290: 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72 6f  not make this ro
92a0: 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74  w.  ** part of t
92b0: 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a  he result..  */.
92c0: 20 20 69 66 28 20 68 61 73 44 69 73 74 69 6e 63    if( hasDistinc
92d0: 74 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  t ){.    switch(
92e0: 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63   pDistinct->eTnc
92f0: 74 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  tType ){.      c
9300: 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  ase WHERE_DISTIN
9310: 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20  CT_ORDERED: {.  
9320: 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f        VdbeOp *pO
9330: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
9340: 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69   No longer requi
9350: 72 65 64 20 4f 70 65 6e 45 70 68 65 6d 65 72 61  red OpenEphemera
9360: 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20 20 20 20  l instr. */.    
9370: 20 20 20 20 69 6e 74 20 69 4a 75 6d 70 3b 20 20      int iJump;  
9380: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
9390: 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ump destination 
93a0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  */.        int r
93b0: 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20 20  egPrev;         
93c0: 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72     /* Previous r
93d0: 6f 77 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  ow content */.. 
93e0: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
93f0: 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
9400: 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f   previous row */
9410: 0a 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76  .        regPrev
9420: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
9430: 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  1;.        pPars
9440: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75  e->nMem += nResu
9450: 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20  ltCol;..        
9460: 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20 4f 50  /* Change the OP
9470: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 63  _OpenEphemeral c
9480: 6f 64 65 64 20 65 61 72 6c 69 65 72 20 74 6f 20  oded earlier to 
9490: 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20 20 20 20  an OP_Null.     
94a0: 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 4d     ** sets the M
94b0: 45 4d 5f 43 6c 65 61 72 65 64 20 62 69 74 20 6f  EM_Cleared bit o
94c0: 6e 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  n the first regi
94d0: 73 74 65 72 20 6f 66 20 74 68 65 0a 20 20 20 20  ster of the.    
94e0: 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20      ** previous 
94f0: 76 61 6c 75 65 2e 20 20 54 68 69 73 20 77 69 6c  value.  This wil
9500: 6c 20 63 61 75 73 65 20 74 68 65 20 4f 50 5f 4e  l cause the OP_N
9510: 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c 77 61 79  e below to alway
9520: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 61 69  s.        ** fai
9530: 6c 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69  l on the first i
9540: 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
9550: 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20 74 68 65  loop even if the
9560: 20 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a   first.        *
9570: 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20 4e 55 4c  * row is all NUL
9580: 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  Ls..        */. 
9590: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
95a0: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
95b0: 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64  , pDistinct->add
95c0: 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20  rTnct);.        
95d0: 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
95e0: 65 47 65 74 4f 70 28 76 2c 20 70 44 69 73 74 69  eGetOp(v, pDisti
95f0: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
9600: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63          pOp->opc
9610: 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20  ode = OP_Null;. 
9620: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
9630: 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d   1;.        pOp-
9640: 3e 70 32 20 3d 20 72 65 67 50 72 65 76 3b 0a 0a  >p2 = regPrev;..
9650: 20 20 20 20 20 20 20 20 69 4a 75 6d 70 20 3d 20          iJump = 
9660: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
9670: 6e 74 41 64 64 72 28 76 29 20 2b 20 6e 52 65 73  ntAddr(v) + nRes
9680: 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ultCol;.        
9690: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75  for(i=0; i<nResu
96a0: 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ltCol; i++){.   
96b0: 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
96c0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
96d0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
96e0: 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  e, p->pEList->a[
96f0: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
9700: 20 20 20 20 20 69 66 28 20 69 3c 6e 52 65 73 75       if( i<nResu
9710: 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20  ltCol-1 ){.     
9720: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
9730: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
9740: 65 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20  e, regResult+i, 
9750: 69 4a 75 6d 70 2c 20 72 65 67 50 72 65 76 2b 69  iJump, regPrev+i
9760: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  );.            V
9770: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
9780: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
9790: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
97a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
97b0: 2c 20 4f 50 5f 45 71 2c 20 72 65 67 52 65 73 75  , OP_Eq, regResu
97c0: 6c 74 2b 69 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  lt+i, iContinue,
97d0: 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20   regPrev+i);.   
97e0: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
97f0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
9800: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
9810: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
9820: 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e  geP4(v, -1, (con
9830: 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  st char *)pColl,
9840: 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
9850: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9860: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
9870: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
9880: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9890: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
98a0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
98b0: 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c 20 70 50 61  v)==iJump || pPa
98c0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
98d0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
98e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
98f0: 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
9900: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50 72 65  egResult, regPre
9910: 76 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 29  v, nResultCol-1)
9920: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9930: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
9940: 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
9950: 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20  NCT_UNIQUE: {.  
9960: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9970: 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
9980: 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72   pDistinct->addr
9990: 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 62  Tnct);.        b
99a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
99b0: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
99c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
99d0: 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74  pDistinct->eTnct
99e0: 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54  Type==WHERE_DIST
99f0: 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29  INCT_UNORDERED )
9a00: 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 44 69  ;.        codeDi
9a10: 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70  stinct(pParse, p
9a20: 44 69 73 74 69 6e 63 74 2d 3e 74 61 62 54 6e 63  Distinct->tabTnc
9a30: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 52  t, iContinue, nR
9a40: 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20  esultCol,.      
9a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
9a60: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
9a70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9a80: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
9a90: 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pSort==0 ){.    
9aa0: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
9ab0: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e  p->iOffset, iCon
9ac0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20  tinue);.    }.  
9ad0: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  }..  switch( eDe
9ae0: 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  st ){.    /* In 
9af0: 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65  this mode, write
9b00: 20 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75   each query resu
9b10: 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66  lt to the key of
9b20: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
9b30: 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72     ** table iPar
9b40: 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  m..    */.#ifnde
9b50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
9b60: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
9b70: 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e    case SRT_Union
9b80: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
9b90: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
9ba0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
9bb0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
9bc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
9bd0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
9be0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
9bf0: 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a 20 20  sultCol, r1);.  
9c00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9c10: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
9c20: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
9c30: 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74 2c 20   r1, regResult, 
9c40: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
9c50: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
9c60: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
9c70: 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
9c80: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
9c90: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63   Construct a rec
9ca0: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65  ord from the que
9cb0: 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69  ry result, but i
9cc0: 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a  nstead of.    **
9cd0: 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63   saving that rec
9ce0: 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61  ord, use it as a
9cf0: 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65   key to delete e
9d00: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20  lements from.   
9d10: 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72   ** the temporar
9d20: 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  y table iParm.. 
9d30: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
9d40: 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20  RT_Except: {.   
9d50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9d60: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65  dOp3(v, OP_IdxDe
9d70: 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67  lete, iParm, reg
9d80: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
9d90: 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ol);.      break
9da0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
9db0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
9dc0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
9dd0: 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74  ..    /* Store t
9de0: 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74  he result as dat
9df0: 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65  a using a unique
9e00: 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   key..    */.   
9e10: 20 63 61 73 65 20 53 52 54 5f 46 69 66 6f 3a 0a   case SRT_Fifo:.
9e20: 20 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73      case SRT_Dis
9e30: 74 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20  tFifo:.    case 
9e40: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
9e50: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
9e60: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
9e70: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
9e80: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
9e90: 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20  PrefixReg+1);.  
9ea0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
9eb0: 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29  est==SRT_Table )
9ec0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
9ed0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ( eDest==SRT_Eph
9ee0: 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 74  emTab );.      t
9ef0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
9f00: 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 20 20  SRT_Fifo );.    
9f10: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
9f20: 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
9f30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9f40: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
9f50: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
9f60: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
9f70: 6f 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65  ol, r1+nPrefixRe
9f80: 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  g);.#ifndef SQLI
9f90: 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
9fa0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
9fb0: 5f 44 69 73 74 46 69 66 6f 20 29 7b 0a 20 20 20  _DistFifo ){.   
9fc0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
9fd0: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69  estination is Di
9fe0: 73 74 46 69 66 6f 2c 20 74 68 65 6e 20 63 75 72  stFifo, then cur
9ff0: 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73  sor (iParm+1) is
a000: 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
a010: 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c   on an ephemeral
a020: 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 20 63   index. If the c
a030: 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 61 6c  urrent row is al
a040: 72 65 61 64 79 20 70 72 65 73 65 6e 74 0a 20 20  ready present.  
a050: 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
a060: 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77 72  index, do not wr
a070: 69 74 65 20 69 74 20 74 6f 20 74 68 65 20 6f 75  ite it to the ou
a080: 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61 64  tput. If not, ad
a090: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
a0a0: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 74 6f 20   current row to 
a0b0: 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 70 72  the index and pr
a0c0: 6f 63 65 65 64 20 77 69 74 68 20 77 72 69 74 69  oceed with writi
a0d0: 6e 67 20 69 74 20 74 6f 20 74 68 65 0a 20 20 20  ng it to the.   
a0e0: 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 74       ** output t
a0f0: 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20 2a  able as well.  *
a100: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  /.        int ad
a110: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
a120: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
a130: 20 34 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   4;.        sqli
a140: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
a150: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50  (v, OP_Found, iP
a160: 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c  arm+1, addr, r1,
a170: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62   0);.        Vdb
a180: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
a190: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a1a0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
a1b0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
a1c0: 6d 2b 31 2c 20 72 31 2c 72 65 67 52 65 73 75 6c  m+1, r1,regResul
a1d0: 74 2c 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  t,nResultCol);. 
a1e0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
a1f0: 53 6f 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Sort==0 );.     
a200: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
a210: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
a220: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 65 67       assert( reg
a230: 52 65 73 75 6c 74 3d 3d 72 65 67 4f 72 69 67 20  Result==regOrig 
a240: 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  );.        pushO
a250: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
a260: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 31 2b 6e  , pSort, p, r1+n
a270: 50 72 65 66 69 78 52 65 67 2c 20 72 65 67 4f 72  PrefixReg, regOr
a280: 69 67 2c 20 31 2c 20 6e 50 72 65 66 69 78 52 65  ig, 1, nPrefixRe
a290: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
a2a0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 20  .        int r2 
a2b0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
a2c0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
a2d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a2e0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
a2f0: 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 32  Rowid, iParm, r2
a300: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
a310: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
a320: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
a330: 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20  , r1, r2);.     
a340: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
a350: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
a360: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20  _APPEND);.      
a370: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
a380: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
a390: 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r2);.      }.   
a3a0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
a3b0: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
a3c0: 65 2c 20 72 31 2c 20 6e 50 72 65 66 69 78 52 65  e, r1, nPrefixRe
a3d0: 67 2b 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61  g+1);.      brea
a3e0: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
a3f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
a400: 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66  BQUERY.    /* If
a410: 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67   we are creating
a420: 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65   a set for an "e
a430: 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
a440: 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a  ..)" construct,.
a450: 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72      ** then ther
a460: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69  e should be a si
a470: 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65  ngle item on the
a480: 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74   stack.  Write t
a490: 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20  his.    ** item 
a4a0: 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62  into the set tab
a4b0: 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61  le with bogus da
a4c0: 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ta..    */.    c
a4d0: 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
a4e0: 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29       if( pSort )
a4f0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20  {.        /* At 
a500: 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f 75  first glance you
a510: 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65 20   would think we 
a520: 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f  could optimize o
a530: 75 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ut the.        *
a540: 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74 68  * ORDER BY in th
a550: 69 73 20 63 61 73 65 20 73 69 6e 63 65 20 74 68  is case since th
a560: 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72 69  e order of entri
a570: 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20 20  es in the set.  
a580: 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f        ** does no
a590: 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20 74  t matter.  But t
a5a0: 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 61 20  here might be a 
a5b0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69 6e  LIMIT clause, in
a5c0: 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a   which.        *
a5d0: 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64 65 72  * case the order
a5e0: 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a   does matter */.
a5f0: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
a600: 53 6f 72 74 65 72 28 0a 20 20 20 20 20 20 20 20  Sorter(.        
a610: 20 20 20 20 70 50 61 72 73 65 2c 20 70 53 6f 72      pParse, pSor
a620: 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 2c  t, p, regResult,
a630: 20 72 65 67 4f 72 69 67 2c 20 6e 52 65 73 75 6c   regOrig, nResul
a640: 74 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52 65 67  tCol, nPrefixReg
a650: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
a660: 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
a670: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
a680: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
a690: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
a6a0: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44 65 73  te3Strlen30(pDes
a6b0: 74 2d 3e 7a 41 66 66 53 64 73 74 29 3d 3d 6e 52  t->zAffSdst)==nR
a6c0: 65 73 75 6c 74 43 6f 6c 20 29 3b 0a 20 20 20 20  esultCol );.    
a6d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a6e0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
a6f0: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
a700: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 0a  t, nResultCol, .
a710: 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
a720: 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c  pDest->zAffSdst,
a730: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
a740: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a750: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
a760: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
a770: 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74  m, r1, regResult
a780: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
a790: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
a7a0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
a7b0: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
a7c0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
a7d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
a7e0: 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e  any row exist in
a7f0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
a800: 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63   record that fac
a810: 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20  t and abort..   
a820: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
a830: 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20  _Exists: {.     
a840: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a850: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
a860: 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  , 1, iParm);.   
a870: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
a880: 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d  clause will term
a890: 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66  inate the loop f
a8a0: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
a8b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
a8c0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
a8d0: 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74   scalar select t
a8e0: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
a8f0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  n expression, th
a900: 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  en.    ** store 
a910: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
a920: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
a930: 65 6d 6f 72 79 20 63 65 6c 6c 20 6f 72 20 61 72  emory cell or ar
a940: 72 61 79 20 6f 66 20 0a 20 20 20 20 2a 2a 20 6d  ray of .    ** m
a950: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e 64 20  emory cells and 
a960: 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
a970: 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
a980: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
a990: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  Mem: {.      if(
a9a0: 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20   pSort ){.      
a9b0: 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c    assert( nResul
a9c0: 74 43 6f 6c 3c 3d 70 44 65 73 74 2d 3e 6e 53 64  tCol<=pDest->nSd
a9d0: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 75  st );.        pu
a9e0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
a9f0: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
aa00: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
aa10: 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20  esult, regOrig, 
aa20: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72 65  nResultCol, nPre
aa30: 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  fixReg);.      }
aa40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
aa50: 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c  sert( nResultCol
aa60: 3d 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 29  ==pDest->nSdst )
aa70: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
aa80: 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 69 50 61  ( regResult==iPa
aa90: 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  rm );.        /*
aaa0: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
aab0: 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
aac0: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
aad0: 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  us */.      }.  
aae0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
aaf0: 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
ab00: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
ab10: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
ab20: 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69  case SRT_Corouti
ab30: 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20 53 65 6e  ne:       /* Sen
ab40: 64 20 64 61 74 61 20 74 6f 20 61 20 63 6f 2d 72  d data to a co-r
ab50: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 63 61  outine */.    ca
ab60: 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b  se SRT_Output: {
ab70: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
ab80: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f  n the results */
ab90: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
aba0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
abb0: 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74  utine );.      t
abc0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
abd0: 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20  SRT_Output );.  
abe0: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b      if( pSort ){
abf0: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
ac00: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
ac10: 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73  pSort, p, regRes
ac20: 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52  ult, regOrig, nR
ac30: 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20  esultCol,.      
ac40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac50: 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20   nPrefixReg);.  
ac60: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44      }else if( eD
ac70: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
ac80: 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ne ){.        sq
ac90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
aca0: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
acb0: 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
acc0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
acd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ace0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
acf0: 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c  tRow, regResult,
ad00: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
ad10: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
ad20: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
ad30: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
ad40: 45 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  E.    /* Write t
ad50: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20  he results into 
ad60: 61 20 70 72 69 6f 72 69 74 79 20 71 75 65 75 65  a priority queue
ad70: 20 74 68 61 74 20 69 73 20 6f 72 64 65 72 20 61   that is order a
ad80: 63 63 6f 72 64 69 6e 67 20 74 6f 0a 20 20 20 20  ccording to.    
ad90: 2a 2a 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72  ** pDest->pOrder
ada0: 42 79 20 28 69 6e 20 70 53 4f 29 2e 20 20 70 44  By (in pSO).  pD
adb0: 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 28 69 6e  est->iSDParm (in
adc0: 20 69 50 61 72 6d 29 20 69 73 20 74 68 65 20 63   iParm) is the c
add0: 75 72 73 6f 72 20 66 6f 72 20 61 6e 0a 20 20 20  ursor for an.   
ade0: 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 70   ** index with p
adf0: 53 4f 2d 3e 6e 45 78 70 72 2b 32 20 63 6f 6c 75  SO->nExpr+2 colu
ae00: 6d 6e 73 2e 20 20 42 75 69 6c 64 20 61 20 6b 65  mns.  Build a ke
ae10: 79 20 75 73 69 6e 67 20 70 53 4f 20 66 6f 72 20  y using pSO for 
ae20: 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 2a 2a  the first.    **
ae30: 20 70 53 4f 2d 3e 6e 45 78 70 72 20 63 6f 6c 75   pSO->nExpr colu
ae40: 6d 6e 73 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  mns, then make s
ae50: 75 72 65 20 61 6c 6c 20 6b 65 79 73 20 61 72 65  ure all keys are
ae60: 20 75 6e 69 71 75 65 20 62 79 20 61 64 64 69 6e   unique by addin
ae70: 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6e 61 6c  g a.    ** final
ae80: 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 63 6f 6c   OP_Sequence col
ae90: 75 6d 6e 2e 20 20 54 68 65 20 6c 61 73 74 20 63  umn.  The last c
aea0: 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 72 65 63  olumn is the rec
aeb0: 6f 72 64 20 61 73 20 61 20 62 6c 6f 62 2e 0a 20  ord as a blob.. 
aec0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
aed0: 52 54 5f 44 69 73 74 51 75 65 75 65 3a 0a 20 20  RT_DistQueue:.  
aee0: 20 20 63 61 73 65 20 53 52 54 5f 51 75 65 75 65    case SRT_Queue
aef0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b  : {.      int nK
af00: 65 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  ey;.      int r1
af10: 2c 20 72 32 2c 20 72 33 3b 0a 20 20 20 20 20 20  , r2, r3;.      
af20: 69 6e 74 20 61 64 64 72 54 65 73 74 20 3d 20 30  int addrTest = 0
af30: 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  ;.      ExprList
af40: 20 2a 70 53 4f 3b 0a 20 20 20 20 20 20 70 53 4f   *pSO;.      pSO
af50: 20 3d 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72   = pDest->pOrder
af60: 42 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  By;.      assert
af70: 28 20 70 53 4f 20 29 3b 0a 20 20 20 20 20 20 6e  ( pSO );.      n
af80: 4b 65 79 20 3d 20 70 53 4f 2d 3e 6e 45 78 70 72  Key = pSO->nExpr
af90: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
afa0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
afb0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 32  Parse);.      r2
afc0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
afd0: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
afe0: 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 72 33  Key+2);.      r3
aff0: 20 3d 20 72 32 2b 6e 4b 65 79 2b 31 3b 0a 20 20   = r2+nKey+1;.  
b000: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
b010: 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a  RT_DistQueue ){.
b020: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
b030: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73  e destination is
b040: 20 44 69 73 74 51 75 65 75 65 2c 20 74 68 65 6e   DistQueue, then
b050: 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31   cursor (iParm+1
b060: 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20  ) is open.      
b070: 20 20 2a 2a 20 6f 6e 20 61 20 73 65 63 6f 6e 64    ** on a second
b080: 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
b090: 20 74 68 61 74 20 68 6f 6c 64 73 20 61 6c 6c 20   that holds all 
b0a0: 76 61 6c 75 65 73 20 65 76 65 72 79 20 70 72 65  values every pre
b0b0: 76 69 6f 75 73 6c 79 0a 20 20 20 20 20 20 20 20  viously.        
b0c0: 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ** added to the 
b0d0: 71 75 65 75 65 2e 20 2a 2f 0a 20 20 20 20 20 20  queue. */.      
b0e0: 20 20 61 64 64 72 54 65 73 74 20 3d 20 73 71 6c    addrTest = sql
b0f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
b100: 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69  t(v, OP_Found, i
b110: 50 61 72 6d 2b 31 2c 20 30 2c 20 0a 20 20 20 20  Parm+1, 0, .    
b120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b140: 20 20 20 20 72 65 67 52 65 73 75 6c 74 2c 20 6e      regResult, n
b150: 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20  ResultCol);.    
b160: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
b170: 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (v);.      }.   
b180: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b190: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
b1a0: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
b1b0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 33  , nResultCol, r3
b1c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  );.      if( eDe
b1d0: 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75  st==SRT_DistQueu
b1e0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
b1f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b200: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
b210: 69 50 61 72 6d 2b 31 2c 20 72 33 29 3b 0a 20 20  iParm+1, r3);.  
b220: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b230: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
b240: 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c  LAG_USESEEKRESUL
b250: 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T);.      }.    
b260: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4b 65    for(i=0; i<nKe
b270: 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; i++){.       
b280: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b290: 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 0a  p2(v, OP_SCopy,.
b2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2b0: 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73            regRes
b2c0: 75 6c 74 20 2b 20 70 53 4f 2d 3e 61 5b 69 5d 2e  ult + pSO->a[i].
b2d0: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
b2e0: 2d 20 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  - 1,.           
b2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
b300: 32 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  2+i);.      }.  
b310: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b320: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75  ddOp2(v, OP_Sequ
b330: 65 6e 63 65 2c 20 69 50 61 72 6d 2c 20 72 32 2b  ence, iParm, r2+
b340: 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 73 71 6c  nKey);.      sql
b350: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
b360: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
b370: 20 72 32 2c 20 6e 4b 65 79 2b 32 2c 20 72 31 29   r2, nKey+2, r1)
b380: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b390: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
b3a0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
b3b0: 61 72 6d 2c 20 72 31 2c 20 72 32 2c 20 6e 4b 65  arm, r1, r2, nKe
b3c0: 79 2b 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  y+2);.      if( 
b3d0: 61 64 64 72 54 65 73 74 20 29 20 73 71 6c 69 74  addrTest ) sqlit
b3e0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
b3f0: 2c 20 61 64 64 72 54 65 73 74 29 3b 0a 20 20 20  , addrTest);.   
b400: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
b410: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
b420: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
b430: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
b440: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 32 2c 20  nge(pParse, r2, 
b450: 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 62  nKey+2);.      b
b460: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
b470: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
b480: 54 5f 43 54 45 20 2a 2f 0a 0a 0a 0a 23 69 66 20  T_CTE */....#if 
b490: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
b4a0: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20  OMIT_TRIGGER).  
b4b0: 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65    /* Discard the
b4c0: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20   results.  This 
b4d0: 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45  is used for SELE
b4e0: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  CT statements in
b4f0: 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  side.    ** the 
b500: 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47 45  body of a TRIGGE
b510: 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20  R.  The purpose 
b520: 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73 20  of such selects 
b530: 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a  is to call.    *
b540: 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  * user-defined f
b550: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  unctions that ha
b560: 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73 2e  ve side effects.
b570: 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65    We do not care
b580: 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68  .    ** about th
b590: 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73  e actual results
b5a0: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a   of the select..
b5b0: 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
b5c0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
b5d0: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  rt( eDest==SRT_D
b5e0: 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20  iscard );.      
b5f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
b600: 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75  dif.  }..  /* Ju
b610: 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
b620: 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65   the loop if the
b630: 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65   LIMIT is reache
b640: 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66 0a 20  d.  Except, if. 
b650: 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 73   ** there is a s
b660: 6f 72 74 65 72 2c 20 69 6e 20 77 68 69 63 68 20  orter, in which 
b670: 63 61 73 65 20 74 68 65 20 73 6f 72 74 65 72 20  case the sorter 
b680: 68 61 73 20 61 6c 72 65 61 64 79 20 6c 69 6d 69  has already limi
b690: 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 6f 75 74  ted.  ** the out
b6a0: 70 75 74 20 66 6f 72 20 75 73 2e 0a 20 20 2a 2f  put for us..  */
b6b0: 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20  .  if( pSort==0 
b6c0: 26 26 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  && p->iLimit ){.
b6d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b6e0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72  ddOp2(v, OP_Decr
b6f0: 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  JumpZero, p->iLi
b700: 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  mit, iBreak); Vd
b710: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
b720: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
b730: 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f  cate a KeyInfo o
b740: 62 6a 65 63 74 20 73 75 66 66 69 63 69 65 6e 74  bject sufficient
b750: 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 66   for an index of
b760: 20 4e 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61   N key columns a
b770: 6e 64 0a 2a 2a 20 58 20 65 78 74 72 61 20 63 6f  nd.** X extra co
b780: 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79 49 6e 66  lumns..*/.KeyInf
b790: 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
b7a0: 6f 41 6c 6c 6f 63 28 73 71 6c 69 74 65 33 20 2a  oAlloc(sqlite3 *
b7b0: 64 62 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20 58  db, int N, int X
b7c0: 29 7b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  ){.  int nExtra 
b7d0: 3d 20 28 4e 2b 58 29 2a 28 73 69 7a 65 6f 66 28  = (N+X)*(sizeof(
b7e0: 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 2d 20 73  CollSeq*)+1) - s
b7f0: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 3b  izeof(CollSeq*);
b800: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 20 3d 20  .  KeyInfo *p = 
b810: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
b820: 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
b830: 4b 65 79 49 6e 66 6f 29 20 2b 20 6e 45 78 74 72  KeyInfo) + nExtr
b840: 61 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  a);.  if( p ){. 
b850: 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72     p->aSortOrder
b860: 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 43 6f 6c   = (u8*)&p->aCol
b870: 6c 5b 4e 2b 58 5d 3b 0a 20 20 20 20 70 2d 3e 6e  l[N+X];.    p->n
b880: 4b 65 79 46 69 65 6c 64 20 3d 20 28 75 31 36 29  KeyField = (u16)
b890: 4e 3b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 46 69  N;.    p->nAllFi
b8a0: 65 6c 64 20 3d 20 28 75 31 36 29 28 4e 2b 58 29  eld = (u16)(N+X)
b8b0: 3b 0a 20 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45  ;.    p->enc = E
b8c0: 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64  NC(db);.    p->d
b8d0: 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e  b = db;.    p->n
b8e0: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d  Ref = 1;.    mem
b8f0: 73 65 74 28 26 70 5b 31 5d 2c 20 30 2c 20 6e 45  set(&p[1], 0, nE
b900: 78 74 72 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  xtra);.  }else{.
b910: 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
b920: 75 6c 74 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ult(db);.  }.  r
b930: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
b940: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b  * Deallocate a K
b950: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f  eyInfo object.*/
b960: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4b 65 79  .void sqlite3Key
b970: 49 6e 66 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66  InfoUnref(KeyInf
b980: 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  o *p){.  if( p )
b990: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
b9a0: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70  >nRef>0 );.    p
b9b0: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
b9c0: 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73  ( p->nRef==0 ) s
b9d0: 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 70  qlite3DbFreeNN(p
b9e0: 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a  ->db, p);.  }.}.
b9f0: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 6e 65  ./*.** Make a ne
ba00: 77 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b  w pointer to a K
ba10: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f  eyInfo object.*/
ba20: 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
ba30: 33 4b 65 79 49 6e 66 6f 52 65 66 28 4b 65 79 49  3KeyInfoRef(KeyI
ba40: 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  nfo *p){.  if( p
ba50: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
ba60: 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  p->nRef>0 );.   
ba70: 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a   p->nRef++;.  }.
ba80: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23    return p;.}..#
ba90: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
baa0: 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  UG./*.** Return 
bab0: 54 52 55 45 20 69 66 20 61 20 4b 65 79 49 6e 66  TRUE if a KeyInf
bac0: 6f 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 20  o object can be 
bad0: 63 68 61 6e 67 65 2e 20 20 54 68 65 20 4b 65 79  change.  The Key
bae0: 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 63  Info object.** c
baf0: 61 6e 20 6f 6e 6c 79 20 62 65 20 63 68 61 6e 67  an only be chang
bb00: 65 64 20 69 66 20 74 68 69 73 20 69 73 20 6a 75  ed if this is ju
bb10: 73 74 20 61 20 73 69 6e 67 6c 65 20 72 65 66 65  st a single refe
bb20: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6f 62 6a  rence to the obj
bb30: 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ect..**.** This 
bb40: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
bb50: 6f 6e 6c 79 20 69 6e 73 69 64 65 20 6f 66 20 61  only inside of a
bb60: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
bb70: 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ts..*/.int sqlit
bb80: 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
bb90: 61 62 6c 65 28 4b 65 79 49 6e 66 6f 20 2a 70 29  able(KeyInfo *p)
bba0: 7b 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 66  { return p->nRef
bbb0: 3d 3d 31 3b 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  ==1; }.#endif /*
bbc0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
bbd0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e  ../*.** Given an
bbe0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
bbf0: 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79  , generate a Key
bc00: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
bc10: 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74  hat records.** t
bc20: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
bc30: 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65  uence for each e
bc40: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61  xpression in tha
bc50: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  t expression lis
bc60: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
bc70: 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f  ExprList is an O
bc80: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
bc90: 20 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20   BY clause then 
bca0: 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a  the resulting.**
bcb0: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
bcc0: 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  re is appropriat
bcd0: 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69  e for initializi
bce0: 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64  ng a virtual ind
bcf0: 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65  ex to.** impleme
bd00: 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20  nt that clause. 
bd10: 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74   If the ExprList
bd20: 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 73   is the result s
bd30: 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a  et of a SELECT.*
bd40: 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e  * then the KeyIn
bd50: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
bd60: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
bd70: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76  initializing a v
bd80: 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20  irtual.** index 
bd90: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44  to implement a D
bda0: 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a  ISTINCT test..**
bdb0: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
bdc0: 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  d the KeyInfo st
bdd0: 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69  ructure is obtai
bde0: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e  ned from malloc.
bdf0: 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a    The calling.**
be00: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73   function is res
be10: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65  ponsible for see
be20: 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74  ing that this st
be30: 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74  ructure is event
be40: 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a  ually.** freed..
be50: 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69  */.KeyInfo *sqli
be60: 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  te3KeyInfoFromEx
be70: 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
be80: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
be90: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
bea0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
beb0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46  *pList,     /* F
bec0: 6f 72 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  orm the KeyInfo 
bed0: 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73  object from this
bee0: 20 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69   ExprList */.  i
bef0: 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20  nt iStart,      
bf00: 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74      /* Begin wit
bf10: 68 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66  h this column of
bf20: 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20   pList */.  int 
bf30: 6e 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20  nExtra          
bf40: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
bf50: 79 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20  y extra columns 
bf60: 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 7b  to the end */.){
bf70: 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20  .  int nExpr;.  
bf80: 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a  KeyInfo *pInfo;.
bf90: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
bfa0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
bfb0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
bfc0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
bfd0: 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70   i;..  nExpr = p
bfe0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70  List->nExpr;.  p
bff0: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
c000: 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
c010: 45 78 70 72 2d 69 53 74 61 72 74 2c 20 6e 45 78  Expr-iStart, nEx
c020: 74 72 61 2b 31 29 3b 0a 20 20 69 66 28 20 70 49  tra+1);.  if( pI
c030: 6e 66 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nfo ){.    asser
c040: 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
c050: 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 49 6e  oIsWriteable(pIn
c060: 66 6f 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  fo) );.    for(i
c070: 3d 69 53 74 61 72 74 2c 20 70 49 74 65 6d 3d 70  =iStart, pItem=p
c080: 4c 69 73 74 2d 3e 61 2b 69 53 74 61 72 74 3b 20  List->a+iStart; 
c090: 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  i<nExpr; i++, pI
c0a0: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49  tem++){.      pI
c0b0: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74  nfo->aColl[i-iSt
c0c0: 61 72 74 5d 20 3d 20 73 71 6c 69 74 65 33 45 78  art] = sqlite3Ex
c0d0: 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72  prNNCollSeq(pPar
c0e0: 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
c0f0: 29 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  );.      pInfo->
c100: 61 53 6f 72 74 4f 72 64 65 72 5b 69 2d 69 53 74  aSortOrder[i-iSt
c110: 61 72 74 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f  art] = pItem->so
c120: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20  rtOrder;.    }. 
c130: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66   }.  return pInf
c140: 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65  o;.}../*.** Name
c150: 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
c160: 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65  on operator, use
c170: 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  d for error mess
c180: 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ages..*/.static 
c190: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65  const char *sele
c1a0: 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29  ctOpName(int id)
c1b0: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73  {.  char *z;.  s
c1c0: 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20  witch( id ){.   
c1d0: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20   case TK_ALL:   
c1e0: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41      z = "UNION A
c1f0: 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  LL";   break;.  
c200: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53    case TK_INTERS
c210: 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53  ECT: z = "INTERS
c220: 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ECT";   break;. 
c230: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
c240: 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50  T:    z = "EXCEP
c250: 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T";      break;.
c260: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
c270: 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f         z = "UNIO
c280: 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  N";       break;
c290: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b  .  }.  return z;
c2a0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
c2b0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
c2c0: 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20  /*.** Unless an 
c2d0: 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  "EXPLAIN QUERY P
c2e0: 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20  LAN" command is 
c2f0: 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c  being processed,
c300: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
c310: 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74  * is a no-op. Ot
c320: 68 65 72 77 69 73 65 2c 20 69 74 20 61 64 64 73  herwise, it adds
c330: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
c340: 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 45   output to the E
c350: 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68  QP result,.** wh
c360: 65 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20  ere the caption 
c370: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
c380: 2a 2a 0a 2a 2a 20 20 20 22 55 53 45 20 54 45 4d  **.**   "USE TEM
c390: 50 20 42 2d 54 52 45 45 20 46 4f 52 20 78 78 78  P B-TREE FOR xxx
c3a0: 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 78 78  ".**.** where xx
c3b0: 78 20 69 73 20 6f 6e 65 20 6f 66 20 22 44 49 53  x is one of "DIS
c3c0: 54 49 4e 43 54 22 2c 20 22 4f 52 44 45 52 20 42  TINCT", "ORDER B
c3d0: 59 22 20 6f 72 20 22 47 52 4f 55 50 20 42 59 22  Y" or "GROUP BY"
c3e0: 2e 20 45 78 61 63 74 6c 79 20 77 68 69 63 68 0a  . Exactly which.
c3f0: 2a 2a 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  ** is determined
c400: 20 62 79 20 74 68 65 20 7a 55 73 61 67 65 20 61   by the zUsage a
c410: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
c420: 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 54  ic void explainT
c430: 65 6d 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a  empTable(Parse *
c440: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
c450: 61 72 20 2a 7a 55 73 61 67 65 29 7b 0a 20 20 45  ar *zUsage){.  E
c460: 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
c470: 28 70 50 61 72 73 65 2c 20 30 2c 20 22 55 53 45  (pParse, 0, "USE
c480: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52   TEMP B-TREE FOR
c490: 20 25 73 22 2c 20 7a 55 73 61 67 65 29 29 3b 0a   %s", zUsage));.
c4a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
c4b0: 65 78 70 72 65 73 73 69 6f 6e 20 62 20 74 6f 20  expression b to 
c4c0: 6c 76 61 6c 75 65 20 61 2e 20 41 20 73 65 63 6f  lvalue a. A seco
c4d0: 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72 73 69  nd, no-op, versi
c4e0: 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f  on of this macro
c4f0: 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64 65 64 20  .** is provided 
c500: 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4d 49 54  when SQLITE_OMIT
c510: 5f 45 58 50 4c 41 49 4e 20 69 73 20 64 65 66 69  _EXPLAIN is defi
c520: 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73  ned. This allows
c530: 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 69 6e 20   the code.** in 
c540: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20  sqlite3Select() 
c550: 74 6f 20 61 73 73 69 67 6e 20 76 61 6c 75 65 73  to assign values
c560: 20 74 6f 20 73 74 72 75 63 74 75 72 65 20 6d 65   to structure me
c570: 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73 20 74  mber variables t
c580: 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69 73  hat.** only exis
c590: 74 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  t if SQLITE_OMIT
c5a0: 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e 6f 74 20  _EXPLAIN is not 
c5b0: 64 65 66 69 6e 65 64 20 77 69 74 68 6f 75 74 20  defined without 
c5c0: 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65 0a 2a 2a  polluting the.**
c5d0: 20 63 6f 64 65 20 77 69 74 68 20 23 69 66 6e 64   code with #ifnd
c5e0: 65 66 20 64 69 72 65 63 74 69 76 65 73 2e 0a 2a  ef directives..*
c5f0: 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  /.# define expla
c600: 69 6e 53 65 74 49 6e 74 65 67 65 72 28 61 2c 20  inSetInteger(a, 
c610: 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c 73 65 0a  b) a = b..#else.
c620: 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e  /* No-op version
c630: 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e  s of the explain
c640: 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  XXX() functions 
c650: 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23  and macros. */.#
c660: 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 54   define explainT
c670: 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29 0a 23 20  empTable(y,z).# 
c680: 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65  define explainSe
c690: 74 49 6e 74 65 67 65 72 28 79 2c 7a 29 0a 23 65  tInteger(y,z).#e
c6a0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ndif.../*.** If 
c6b0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77  the inner loop w
c6c0: 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69  as generated usi
c6d0: 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f  ng a non-null pO
c6e0: 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c  rderBy argument,
c6f0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73  .** then the res
c700: 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64  ults were placed
c710: 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41   in a sorter.  A
c720: 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73  fter the loop is
c730: 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77   terminated.** w
c740: 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68  e need to run th
c750: 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74  e sorter and out
c760: 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e  put the results.
c770: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a    The following.
c780: 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  ** routine gener
c790: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65  ates the code ne
c7a0: 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e  eded to do that.
c7b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c7c0: 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
c7d0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
c7e0: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
c7f0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
c800: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
c810: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
c820: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 6f 72  atement */.  Sor
c830: 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 2f  tCtx *pSort,   /
c840: 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  * Information on
c850: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
c860: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  ause */.  int nC
c870: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e  olumn,      /* N
c880: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
c890: 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 53 65   of data */.  Se
c8a0: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
c8b0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f 72  /* Write the sor
c8c0: 74 65 64 20 72 65 73 75 6c 74 73 20 68 65 72 65  ted results here
c8d0: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
c8e0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
c8f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c900: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65        /* The pre
c910: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
c920: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72 65  */.  int addrBre
c930: 61 6b 20 3d 20 70 53 6f 72 74 2d 3e 6c 61 62 65  ak = pSort->labe
c940: 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 20  lDone;          
c950: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
c960: 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20  o exit loop */. 
c970: 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e 75   int addrContinu
c980: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
c990: 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
c9a0: 3b 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 66 6f  ;/* Jump here fo
c9b0: 72 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a  r next cycle */.
c9c0: 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20    int addr;     
c9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9e0: 20 20 2f 2a 20 54 6f 70 20 6f 66 20 6f 75 74 70    /* Top of outp
c9f0: 75 74 20 6c 6f 6f 70 2e 20 4a 75 6d 70 20 66 6f  ut loop. Jump fo
ca00: 72 20 4e 65 78 74 2e 20 2a 2f 0a 20 20 69 6e 74  r Next. */.  int
ca10: 20 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b 0a 20   addrOnce = 0;. 
ca20: 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 45 78 70   int iTab;.  Exp
ca30: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
ca40: 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42  = pSort->pOrderB
ca50: 79 3b 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  y;.  int eDest =
ca60: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20   pDest->eDest;. 
ca70: 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65   int iParm = pDe
ca80: 73 74 2d 3e 69 53 44 50 61 72 6d 3b 0a 20 20 69  st->iSDParm;.  i
ca90: 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74  nt regRow;.  int
caa0: 20 72 65 67 52 6f 77 69 64 3b 0a 20 20 69 6e 74   regRowid;.  int
cab0: 20 69 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e 4b 65   iCol;.  int nKe
cac0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
cad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
cae0: 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e  er of key column
caf0: 73 20 69 6e 20 73 6f 72 74 65 72 20 72 65 63 6f  s in sorter reco
cb00: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72  rd */.  int iSor
cb10: 74 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  tTab;           
cb20: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65          /* Sorte
cb30: 72 20 63 75 72 73 6f 72 20 74 6f 20 72 65 61 64  r cursor to read
cb40: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
cb50: 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b 20 20 20  ;.  int bSeq;   
cb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb70: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73      /* True if s
cb80: 6f 72 74 65 72 20 72 65 63 6f 72 64 20 69 6e 63  orter record inc
cb90: 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f 2e 20 2a  ludes seq. no. *
cba0: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 4b 65 79 20  /.  int nRefKey 
cbb0: 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 45 78  = 0;.  struct Ex
cbc0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4f 75  prList_item *aOu
cbd0: 74 45 78 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  tEx = p->pEList-
cbe0: 3e 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61  >a;..  assert( a
cbf0: 64 64 72 42 72 65 61 6b 3c 30 20 29 3b 0a 20 20  ddrBreak<0 );.  
cc00: 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  if( pSort->label
cc10: 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c  BkOut ){.    sql
cc20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
cc30: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72  , OP_Gosub, pSor
cc40: 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53  t->regReturn, pS
cc50: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29  ort->labelBkOut)
cc60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
cc70: 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 42 72 65  eGoto(v, addrBre
cc80: 61 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ak);.    sqlite3
cc90: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
cca0: 28 76 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  (v, pSort->label
ccb0: 42 6b 4f 75 74 29 3b 0a 20 20 7d 0a 0a 23 69 66  BkOut);.  }..#if
ccc0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
ccd0: 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e  E_SORTER_REFEREN
cce0: 43 45 53 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e  CES.  /* Open an
ccf0: 79 20 63 75 72 73 6f 72 73 20 6e 65 65 64 65 64  y cursors needed
cd00: 20 66 6f 72 20 73 6f 72 74 65 72 2d 72 65 66 65   for sorter-refe
cd10: 72 65 6e 63 65 20 65 78 70 72 65 73 73 69 6f 6e  rence expression
cd20: 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  s */.  for(i=0; 
cd30: 69 3c 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 3b  i<pSort->nDefer;
cd40: 20 69 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65   i++){.    Table
cd50: 20 2a 70 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e   *pTab = pSort->
cd60: 61 44 65 66 65 72 5b 69 5d 2e 70 54 61 62 3b 0a  aDefer[i].pTab;.
cd70: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
cd80: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
cd90: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
cda0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
cdb0: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
cdc0: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ble(pParse, pSor
cdd0: 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 69 43 73  t->aDefer[i].iCs
cde0: 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50  r, iDb, pTab, OP
cdf0: 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20  _OpenRead);.    
ce00: 6e 52 65 66 4b 65 79 20 3d 20 4d 41 58 28 6e 52  nRefKey = MAX(nR
ce10: 65 66 4b 65 79 2c 20 70 53 6f 72 74 2d 3e 61 44  efKey, pSort->aD
ce20: 65 66 65 72 5b 69 5d 2e 6e 4b 65 79 29 3b 0a 20  efer[i].nKey);. 
ce30: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 54 61   }.#endif..  iTa
ce40: 62 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  b = pSort->iECur
ce50: 73 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74  sor;.  if( eDest
ce60: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20  ==SRT_Output || 
ce70: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
ce80: 74 69 6e 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tine || eDest==S
ce90: 52 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65  RT_Mem ){.    re
cea0: 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20  gRowid = 0;.    
ceb0: 72 65 67 52 6f 77 20 3d 20 70 44 65 73 74 2d 3e  regRow = pDest->
cec0: 69 53 64 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iSdst;.  }else{.
ced0: 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 73      regRowid = s
cee0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
cef0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
cf00: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ( eDest==SRT_Eph
cf10: 65 6d 54 61 62 20 7c 7c 20 65 44 65 73 74 3d 3d  emTab || eDest==
cf20: 53 52 54 5f 54 61 62 6c 65 20 29 7b 0a 20 20 20  SRT_Table ){.   
cf30: 20 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69     regRow = sqli
cf40: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
cf50: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 6e 43 6f  arse);.      nCo
cf60: 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 65  lumn = 0;.    }e
cf70: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 67 52 6f  lse{.      regRo
cf80: 77 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  w = sqlite3GetTe
cf90: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
cfa0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 0a  nColumn);.    }.
cfb0: 20 20 7d 0a 20 20 6e 4b 65 79 20 3d 20 70 4f 72    }.  nKey = pOr
cfc0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2d 20 70  derBy->nExpr - p
cfd0: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20  Sort->nOBSat;.  
cfe0: 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46  if( pSort->sortF
cff0: 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f  lags & SORTFLAG_
d000: 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20  UseSorter ){.   
d010: 20 69 6e 74 20 72 65 67 53 6f 72 74 4f 75 74 20   int regSortOut 
d020: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
d030: 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d  ;.    iSortTab =
d040: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
d050: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e  .    if( pSort->
d060: 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20  labelBkOut ){.  
d070: 20 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73      addrOnce = s
d080: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
d090: 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64  (v, OP_Once); Vd
d0a0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
d0b0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
d0c0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
d0d0: 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 53 6f  _OpenPseudo, iSo
d0e0: 72 74 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75  rtTab, regSortOu
d0f0: 74 2c 20 0a 20 20 20 20 20 20 20 20 6e 4b 65 79  t, .        nKey
d100: 2b 31 2b 6e 43 6f 6c 75 6d 6e 2b 6e 52 65 66 4b  +1+nColumn+nRefK
d110: 65 79 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64  ey);.    if( add
d120: 72 4f 6e 63 65 20 29 20 73 71 6c 69 74 65 33 56  rOnce ) sqlite3V
d130: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
d140: 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 61 64  ddrOnce);.    ad
d150: 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33  dr = 1 + sqlite3
d160: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
d170: 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 54 61  _SorterSort, iTa
d180: 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  b, addrBreak);. 
d190: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
d1a0: 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73  v);.    codeOffs
d1b0: 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et(v, p->iOffset
d1c0: 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b  , addrContinue);
d1d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d1e0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72  AddOp3(v, OP_Sor
d1f0: 74 65 72 44 61 74 61 2c 20 69 54 61 62 2c 20 72  terData, iTab, r
d200: 65 67 53 6f 72 74 4f 75 74 2c 20 69 53 6f 72 74  egSortOut, iSort
d210: 54 61 62 29 3b 0a 20 20 20 20 62 53 65 71 20 3d  Tab);.    bSeq =
d220: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
d230: 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69   addr = 1 + sqli
d240: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d250: 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20   OP_Sort, iTab, 
d260: 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65  addrBreak); Vdbe
d270: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
d280: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
d290: 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43  ->iOffset, addrC
d2a0: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 69 53  ontinue);.    iS
d2b0: 6f 72 74 54 61 62 20 3d 20 69 54 61 62 3b 0a 20  ortTab = iTab;. 
d2c0: 20 20 20 62 53 65 71 20 3d 20 31 3b 0a 20 20 7d     bSeq = 1;.  }
d2d0: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 69 43 6f 6c  .  for(i=0, iCol
d2e0: 3d 6e 4b 65 79 2b 62 53 65 71 2d 31 3b 20 69 3c  =nKey+bSeq-1; i<
d2f0: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 23  nColumn; i++){.#
d300: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
d310: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
d320: 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20 61 4f  ENCES.    if( aO
d330: 75 74 45 78 5b 69 5d 2e 62 53 6f 72 74 65 72 52  utEx[i].bSorterR
d340: 65 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23  ef ) continue;.#
d350: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 61 4f  endif.    if( aO
d360: 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64  utEx[i].u.x.iOrd
d370: 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20 69 43 6f  erByCol==0 ) iCo
d380: 6c 2b 2b 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  l++;.  }.#ifdef 
d390: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
d3a0: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
d3b0: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6e 44 65    if( pSort->nDe
d3c0: 66 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  fer ){.    int i
d3d0: 4b 65 79 20 3d 20 69 43 6f 6c 2b 31 3b 0a 20 20  Key = iCol+1;.  
d3e0: 20 20 69 6e 74 20 72 65 67 4b 65 79 20 3d 20 73    int regKey = s
d3f0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
d400: 67 65 28 70 50 61 72 73 65 2c 20 6e 52 65 66 4b  ge(pParse, nRefK
d410: 65 79 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  ey);..    for(i=
d420: 30 3b 20 69 3c 70 53 6f 72 74 2d 3e 6e 44 65 66  0; i<pSort->nDef
d430: 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  er; i++){.      
d440: 69 6e 74 20 69 43 73 72 20 3d 20 70 53 6f 72 74  int iCsr = pSort
d450: 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 69 43 73 72  ->aDefer[i].iCsr
d460: 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  ;.      Table *p
d470: 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e 61 44 65  Tab = pSort->aDe
d480: 66 65 72 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20  fer[i].pTab;.   
d490: 20 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 53     int nKey = pS
d4a0: 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 6e  ort->aDefer[i].n
d4b0: 4b 65 79 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  Key;..      sqli
d4c0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
d4d0: 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 73   OP_NullRow, iCs
d4e0: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 48 61  r);.      if( Ha
d4f0: 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a  sRowid(pTab) ){.
d500: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d510: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d520: 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62  Column, iSortTab
d530: 2c 20 69 4b 65 79 2b 2b 2c 20 72 65 67 4b 65 79  , iKey++, regKey
d540: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d550: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
d560: 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 69 43  OP_SeekRowid, iC
d570: 73 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  sr, .           
d580: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
d590: 65 6e 74 41 64 64 72 28 76 29 2b 31 2c 20 72 65  entAddr(v)+1, re
d5a0: 67 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  gKey);.      }el
d5b0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
d5c0: 6b 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  k;.        int i
d5d0: 4a 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Jmp;.        ass
d5e0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 72 69 6d  ert( sqlite3Prim
d5f0: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
d600: 29 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 6e 4b 65 79  )->nKeyCol==nKey
d610: 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   );.        for(
d620: 6b 3d 30 3b 20 6b 3c 6e 4b 65 79 3b 20 6b 2b 2b  k=0; k<nKey; k++
d630: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
d640: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
d650: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f  , OP_Column, iSo
d660: 72 74 54 61 62 2c 20 69 4b 65 79 2b 2b 2c 20 72  rtTab, iKey++, r
d670: 65 67 4b 65 79 2b 6b 29 3b 0a 20 20 20 20 20 20  egKey+k);.      
d680: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 4a 6d 70    }.        iJmp
d690: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
d6a0: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
d6b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d6c0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
d6d0: 5f 53 65 65 6b 47 45 2c 20 69 43 73 72 2c 20 69  _SeekGE, iCsr, i
d6e0: 4a 6d 70 2b 32 2c 20 72 65 67 4b 65 79 2c 20 6e  Jmp+2, regKey, n
d6f0: 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Key);.        sq
d700: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
d710: 6e 74 28 76 2c 20 4f 50 5f 49 64 78 4c 45 2c 20  nt(v, OP_IdxLE, 
d720: 69 43 73 72 2c 20 69 4a 6d 70 2b 33 2c 20 72 65  iCsr, iJmp+3, re
d730: 67 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20  gKey, nKey);.   
d740: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d750: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp1(v, OP_Nul
d760: 6c 52 6f 77 2c 20 69 43 73 72 29 3b 0a 20 20 20  lRow, iCsr);.   
d770: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
d780: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
d790: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
d7a0: 65 67 4b 65 79 2c 20 6e 52 65 66 4b 65 79 29 3b  egKey, nRefKey);
d7b0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f  .  }.#endif.  fo
d7c0: 72 28 69 3d 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 69  r(i=nColumn-1; i
d7d0: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 23 69 66 64 65  >=0; i--){.#ifde
d7e0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d7f0: 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45  SORTER_REFERENCE
d800: 53 0a 20 20 20 20 69 66 28 20 61 4f 75 74 45 78  S.    if( aOutEx
d810: 5b 69 5d 2e 62 53 6f 72 74 65 72 52 65 66 20 29  [i].bSorterRef )
d820: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
d830: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
d840: 61 4f 75 74 45 78 5b 69 5d 2e 70 45 78 70 72 2c  aOutEx[i].pExpr,
d850: 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20   regRow+i);.    
d860: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
d870: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 52 65   {.      int iRe
d880: 61 64 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4f  ad;.      if( aO
d890: 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64  utEx[i].u.x.iOrd
d8a0: 65 72 42 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20  erByCol ){.     
d8b0: 20 20 20 69 52 65 61 64 20 3d 20 61 4f 75 74 45     iRead = aOutE
d8c0: 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  x[i].u.x.iOrderB
d8d0: 79 43 6f 6c 2d 31 3b 0a 20 20 20 20 20 20 7d 65  yCol-1;.      }e
d8e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 52 65  lse{.        iRe
d8f0: 61 64 20 3d 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20  ad = iCol--;.   
d900: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
d910: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
d920: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74  OP_Column, iSort
d930: 54 61 62 2c 20 69 52 65 61 64 2c 20 72 65 67 52  Tab, iRead, regR
d940: 6f 77 2b 69 29 3b 0a 20 20 20 20 20 20 56 64 62  ow+i);.      Vdb
d950: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
d960: 22 2c 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61  ", aOutEx[i].zNa
d970: 6d 65 3f 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61  me?aOutEx[i].zNa
d980: 6d 65 20 3a 20 61 4f 75 74 45 78 5b 69 5d 2e 7a  me : aOutEx[i].z
d990: 53 70 61 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Span));.    }.  
d9a0: 7d 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  }.  switch( eDes
d9b0: 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52  t ){.    case SR
d9c0: 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73  T_Table:.    cas
d9d0: 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20  e SRT_EphemTab: 
d9e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
d9f0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
da00: 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62  Column, iSortTab
da10: 2c 20 6e 4b 65 79 2b 62 53 65 71 2c 20 72 65 67  , nKey+bSeq, reg
da20: 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Row);.      sqli
da30: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
da40: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50   OP_NewRowid, iP
da50: 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  arm, regRowid);.
da60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
da70: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
da80: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67  sert, iParm, reg
da90: 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  Row, regRowid);.
daa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dab0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
dac0: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
dad0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
dae0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
daf0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
db00: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
db10: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
db20: 43 6f 6c 75 6d 6e 3d 3d 73 71 6c 69 74 65 33 53  Column==sqlite3S
db30: 74 72 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a  trlen30(pDest->z
db40: 41 66 66 53 64 73 74 29 20 29 3b 0a 20 20 20 20  AffSdst) );.    
db50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
db60: 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
db70: 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43  cord, regRow, nC
db80: 6f 6c 75 6d 6e 2c 20 72 65 67 52 6f 77 69 64 2c  olumn, regRowid,
db90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
dba0: 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e           pDest->
dbb0: 7a 41 66 66 53 64 73 74 2c 20 6e 43 6f 6c 75 6d  zAffSdst, nColum
dbc0: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
dbd0: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
dbe0: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
dbf0: 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 2c  iParm, regRowid,
dc00: 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e   regRow, nColumn
dc10: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
dc20: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
dc30: 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
dc40: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
dc50: 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61  use will termina
dc60: 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  te the loop for 
dc70: 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
dc80: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
dc90: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
dca0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
dcb0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c  st==SRT_Output |
dcc0: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  | eDest==SRT_Cor
dcd0: 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20 20 20 20  outine ); .     
dce0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
dcf0: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a  ==SRT_Output );.
dd00: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
dd10: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
dd20: 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 69 66  tine );.      if
dd30: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
dd40: 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  put ){.        s
dd50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
dd60: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
dd70: 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20  , pDest->iSdst, 
dd80: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
dd90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
dda0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
ddb0: 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44  (v, OP_Yield, pD
ddc0: 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20  est->iSDParm);. 
ddd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
dde0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
ddf0: 69 66 28 20 72 65 67 52 6f 77 69 64 20 29 7b 0a  if( regRowid ){.
de00: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
de10: 52 54 5f 53 65 74 20 29 7b 0a 20 20 20 20 20 20  RT_Set ){.      
de20: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
de30: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
de40: 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29  regRow, nColumn)
de50: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
de60: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
de70: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
de80: 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20 7d 0a   regRow);.    }.
de90: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
dea0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
deb0: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 7d  , regRowid);.  }
dec0: 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d  .  /* The bottom
ded0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a   of the loop.  *
dee0: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
def0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
df00: 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  ddrContinue);.  
df10: 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46  if( pSort->sortF
df20: 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f  lags & SORTFLAG_
df30: 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20  UseSorter ){.   
df40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
df50: 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e  p2(v, OP_SorterN
df60: 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29  ext, iTab, addr)
df70: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
df80: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
df90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dfa0: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54  2(v, OP_Next, iT
dfb0: 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62 65 43  ab, addr); VdbeC
dfc0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
dfd0: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 72 65 67    if( pSort->reg
dfe0: 52 65 74 75 72 6e 20 29 20 73 71 6c 69 74 65 33  Return ) sqlite3
dff0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
e000: 5f 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e  _Return, pSort->
e010: 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 73 71  regReturn);.  sq
e020: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
e030: 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65  Label(v, addrBre
e040: 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ak);.}../*.** Re
e050: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
e060: 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  o a string conta
e070: 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c 61  ining the 'decla
e080: 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66 20  ration type' of 
e090: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
e0a0: 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73 74 72  n pExpr. The str
e0b0: 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61 74  ing may be treat
e0c0: 65 64 20 61 73 20 73 74 61 74 69 63 20 62 79 20  ed as static by 
e0d0: 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  the caller..**.*
e0e0: 2a 20 41 6c 73 6f 20 74 72 79 20 74 6f 20 65 73  * Also try to es
e0f0: 74 69 6d 61 74 65 20 74 68 65 20 73 69 7a 65 20  timate the size 
e100: 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  of the returned 
e110: 76 61 6c 75 65 20 61 6e 64 20 72 65 74 75 72 6e  value and return
e120: 20 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20   that.** result 
e130: 69 6e 20 2a 70 45 73 74 57 69 64 74 68 2e 0a 2a  in *pEstWidth..*
e140: 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61  *.** The declara
e150: 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65  tion type is the
e160: 20 65 78 61 63 74 20 64 61 74 61 74 79 70 65 20   exact datatype 
e170: 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61  definition extra
e180: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  cted from the.**
e190: 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45   original CREATE
e1a0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
e1b0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
e1c0: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20  on is a column. 
e1d0: 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69  The.** declarati
e1e0: 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f  on type for a RO
e1f0: 57 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54  WID field is INT
e200: 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68  EGER. Exactly wh
e210: 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  en an expression
e220: 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
e230: 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62  d a column can b
e240: 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65  e complex in the
e250: 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62   presence of sub
e260: 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20  queries. The.** 
e270: 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65  result-set expre
e280: 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20  ssion in all of 
e290: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45  the following SE
e2a0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
e2b0: 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65  is .** considere
e2c0: 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68  d a column by th
e2d0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
e2e0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20  **   SELECT col 
e2f0: 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53  FROM tbl;.**   S
e300: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f  ELECT (SELECT co
e310: 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20  l FROM tbl;.**  
e320: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
e330: 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a  col FROM tbl);.*
e340: 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63 20 46  *   SELECT abc F
e350: 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20  ROM (SELECT col 
e360: 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29  AS abc FROM tbl)
e370: 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63  ;.** .** The dec
e380: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f  laration type fo
e390: 72 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  r any expression
e3a0: 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f   other than a co
e3b0: 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  lumn is NULL..**
e3c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
e3d0: 20 68 61 73 20 65 69 74 68 65 72 20 33 20 6f 72   has either 3 or
e3e0: 20 36 20 70 61 72 61 6d 65 74 65 72 73 20 64 65   6 parameters de
e3f0: 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
e400: 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65  er or not.** the
e410: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
e420: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 63  OLUMN_METADATA c
e430: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
e440: 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 23  on is used..*/.#
e450: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
e460: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
e470: 41 54 41 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c  ATA.# define col
e480: 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c  umnType(A,B,C,D,
e490: 45 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70  E) columnTypeImp
e4a0: 6c 28 41 2c 42 2c 43 2c 44 2c 45 29 0a 23 65 6c  l(A,B,C,D,E).#el
e4b0: 73 65 20 2f 2a 20 69 66 20 21 64 65 66 69 6e 65  se /* if !define
e4c0: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
e4d0: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 29  COLUMN_METADATA)
e4e0: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c   */.# define col
e4f0: 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c  umnType(A,B,C,D,
e500: 45 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70  E) columnTypeImp
e510: 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 0a 73 74  l(A,B).#endif.st
e520: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
e530: 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28  *columnTypeImpl(
e540: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
e550: 70 4e 43 2c 20 0a 23 69 66 6e 64 65 66 20 53 51  pNC, .#ifndef SQ
e560: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
e570: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 45 78  MN_METADATA.  Ex
e580: 70 72 20 2a 70 45 78 70 72 0a 23 65 6c 73 65 0a  pr *pExpr.#else.
e590: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20    Expr *pExpr,. 
e5a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
e5b0: 4f 72 69 67 44 62 2c 0a 20 20 63 6f 6e 73 74 20  OrigDb,.  const 
e5c0: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 54 61 62  char **pzOrigTab
e5d0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
e5e0: 2a 70 7a 4f 72 69 67 43 6f 6c 0a 23 65 6e 64 69  *pzOrigCol.#endi
e5f0: 66 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73  f.){.  char cons
e600: 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20  t *zType = 0;.  
e610: 69 6e 74 20 6a 3b 0a 23 69 66 64 65 66 20 53 51  int j;.#ifdef SQ
e620: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
e630: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 63 68  MN_METADATA.  ch
e640: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 44  ar const *zOrigD
e650: 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  b = 0;.  char co
e660: 6e 73 74 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20  nst *zOrigTab = 
e670: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
e680: 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 23  *zOrigCol = 0;.#
e690: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
e6a0: 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 61   pExpr!=0 );.  a
e6b0: 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63  ssert( pNC->pSrc
e6c0: 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  List!=0 );.  ass
e6d0: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
e6e0: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b  TK_AGG_COLUMN );
e6f0: 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
e700: 65 20 72 75 6e 65 73 20 62 65 66 6f 72 65 20 61  e runes before a
e710: 67 67 72 65 67 61 74 65 73 0a 20 20 20 20 20 20  ggregates.      
e720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e740: 20 2a 2a 20 61 72 65 20 70 72 6f 63 65 73 73 65   ** are processe
e750: 64 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70  d */.  switch( p
e760: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
e770: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
e780: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
e790: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
e7a0: 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68  olumn. Locate th
e7b0: 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f 6c 75  e table the colu
e7c0: 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20  mn is being.    
e7d0: 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66    ** extracted f
e7e0: 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65  rom in NameConte
e7f0: 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54 68 69  xt.pSrcList. Thi
e800: 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65 20 72  s table may be r
e810: 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  eal.      ** dat
e820: 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61  abase table or a
e830: 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 20   subquery..     
e840: 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
e850: 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20  *pTab = 0;      
e860: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 73        /* Table s
e870: 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20  tructure column 
e880: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
e890: 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63  m */.      Selec
e8a0: 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20 20 20  t *pS = 0;      
e8b0: 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74         /* Select
e8c0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65   the column is e
e8d0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f  xtracted from */
e8e0: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
e8f0: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
e900: 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63  ;  /* Index of c
e910: 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f  olumn in pTab */
e920: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e  .      while( pN
e930: 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20  C && !pTab ){.  
e940: 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70        SrcList *p
e950: 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  TabList = pNC->p
e960: 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  SrcList;.       
e970: 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c   for(j=0;j<pTabL
e980: 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61  ist->nSrc && pTa
e990: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72  bList->a[j].iCur
e9a0: 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62  sor!=pExpr->iTab
e9b0: 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20  le;j++);.       
e9c0: 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d   if( j<pTabList-
e9d0: 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20  >nSrc ){.       
e9e0: 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69     pTab = pTabLi
e9f0: 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20  st->a[j].pTab;. 
ea00: 20 20 20 20 20 20 20 20 20 70 53 20 3d 20 70 54           pS = pT
ea10: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65  abList->a[j].pSe
ea20: 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65  lect;.        }e
ea30: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
ea40: 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b  NC = pNC->pNext;
ea50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ea60: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54   }..      if( pT
ea70: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
ea80: 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c   /* At one time,
ea90: 20 63 6f 64 65 20 73 75 63 68 20 61 73 20 22 53   code such as "S
eaa0: 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77 69 74  ELECT new.x" wit
eab0: 68 69 6e 20 61 20 74 72 69 67 67 65 72 20 77 6f  hin a trigger wo
eac0: 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  uld.        ** c
ead0: 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64 69 74  ause this condit
eae0: 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e  ion to run.  Sin
eaf0: 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61 76 65  ce then, we have
eb00: 20 72 65 73 74 72 75 63 74 75 72 65 64 20 68 6f   restructured ho
eb10: 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 69  w.        ** tri
eb20: 67 67 65 72 20 63 6f 64 65 20 69 73 20 67 65 6e  gger code is gen
eb30: 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20 74 68  erated and so th
eb40: 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  is condition is 
eb50: 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20  no longer .     
eb60: 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20     ** possible. 
eb70: 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20  However, it can 
eb80: 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20 66 6f  still be true fo
eb90: 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b  r statements lik
eba0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  e.        ** the
ebb0: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20   following:.    
ebc0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
ebd0: 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
ebe0: 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45 52 29   t1(col INTEGER)
ebf0: 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  ;.        **   S
ec00: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 74 31  ELECT (SELECT t1
ec10: 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20  .col) FROM FROM 
ec20: 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  t1;.        **. 
ec30: 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 63         ** when c
ec40: 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63  olumnType() is c
ec50: 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70  alled on the exp
ec60: 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22  ression "t1.col"
ec70: 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20   in the .       
ec80: 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e 20   ** sub-select. 
ec90: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73 65  In this case, se
eca0: 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70  t the column typ
ecb0: 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a  e to NULL, even.
ecc0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 75 67          ** thoug
ecd0: 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65 61 6c  h it should real
ece0: 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52 22 2e  ly be "INTEGER".
ecf0: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
ed00: 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
ed10: 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73  ot a problem, as
ed20: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65   the column type
ed30: 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69 73 20   of "t1.col" is 
ed40: 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  never.        **
ed50: 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75   used. When colu
ed60: 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c  mnType() is call
ed70: 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ed on the expres
ed80: 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a  sion .        **
ed90: 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c   "(SELECT t1.col
eda0: 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20  )", the correct 
edb0: 74 79 70 65 20 69 73 20 72 65 74 75 72 6e 65 64  type is returned
edc0: 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53 45 4c   (see the TK_SEL
edd0: 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  ECT.        ** b
ede0: 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f  ranch below.  */
edf0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
ee00: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
ee10: 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20 70  ssert( pTab && p
ee20: 45 78 70 72 2d 3e 79 2e 70 54 61 62 3d 3d 70 54  Expr->y.pTab==pT
ee30: 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ab );.      if( 
ee40: 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  pS ){.        /*
ee50: 20 54 68 65 20 22 74 61 62 6c 65 22 20 69 73 20   The "table" is 
ee60: 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73  actually a sub-s
ee70: 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77 20  elect or a view 
ee80: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
ee90: 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  se.        ** of
eea0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
eeb0: 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68  ement. Return th
eec0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
eed0: 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20  pe and origin.  
eee0: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f        ** data fo
eef0: 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74  r the result-set
ef00: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73   column of the s
ef10: 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20  ub-select..     
ef20: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
ef30: 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f  ( iCol>=0 && iCo
ef40: 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  l<pS->pEList->nE
ef50: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  xpr ){.         
ef60: 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c   /* If iCol is l
ef70: 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
ef80: 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69  hen the expressi
ef90: 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68 65 0a  on requests the.
efa0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77            ** row
efb0: 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65  id of the sub-se
efc0: 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68  lect or view. Th
efd0: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
efe0: 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20   legal (see .   
eff0: 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63         ** test c
f000: 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d  ase misc2.2.2) -
f010: 20 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75   it always evalu
f020: 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20  ates to NULL..  
f030: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
f040: 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74       NameContext
f050: 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20   sNC;.          
f060: 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45  Expr *p = pS->pE
f070: 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45  List->a[iCol].pE
f080: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73  xpr;.          s
f090: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53  NC.pSrcList = pS
f0a0: 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20  ->pSrc;.        
f0b0: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e    sNC.pNext = pN
f0c0: 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  C;.          sNC
f0d0: 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  .pParse = pNC->p
f0e0: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20  Parse;.         
f0f0: 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
f100: 79 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f 72  ype(&sNC, p,&zOr
f110: 69 67 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c 26  igDb,&zOrigTab,&
f120: 7a 4f 72 69 67 43 6f 6c 29 3b 20 0a 20 20 20 20  zOrigCol); .    
f130: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
f140: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  e{.        /* A 
f150: 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 61 20  real table or a 
f160: 43 54 45 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  CTE table */.   
f170: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53       assert( !pS
f180: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
f190: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
f1a0: 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20 20 20  METADATA.       
f1b0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
f1c0: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
f1d0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
f1e0: 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44  ( iCol==XN_ROWID
f1f0: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
f200: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
f210: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
f220: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
f230: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54      zType = "INT
f240: 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20  EGER";.         
f250: 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 22 72 6f 77   zOrigCol = "row
f260: 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  id";.        }el
f270: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  se{.          zO
f280: 72 69 67 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61  rigCol = pTab->a
f290: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b  Col[iCol].zName;
f2a0: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
f2b0: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e   = sqlite3Column
f2c0: 54 79 70 65 28 26 70 54 61 62 2d 3e 61 43 6f 6c  Type(&pTab->aCol
f2d0: 5b 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20 20  [iCol],0);.     
f2e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72     }.        zOr
f2f0: 69 67 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e  igTab = pTab->zN
f300: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
f310: 20 70 4e 43 2d 3e 70 50 61 72 73 65 20 26 26 20   pNC->pParse && 
f320: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b  pTab->pSchema ){
f330: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
f340: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
f350: 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70  maToIndex(pNC->p
f360: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
f370: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
f380: 20 20 20 20 20 7a 4f 72 69 67 44 62 20 3d 20 70       zOrigDb = p
f390: 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e  NC->pParse->db->
f3a0: 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
f3b0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6c  e;.        }.#el
f3c0: 73 65 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  se.        asser
f3d0: 74 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49  t( iCol==XN_ROWI
f3e0: 44 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26  D || (iCol>=0 &&
f3f0: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
f400: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ) );.        if(
f410: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
f420: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e       zType = "IN
f430: 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20  TEGER";.        
f440: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
f450: 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   zType = sqlite3
f460: 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62  ColumnType(&pTab
f470: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b  ->aCol[iCol],0);
f480: 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
f490: 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  f.      }.      
f4a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
f4b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f4c0: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
f4d0: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a  se TK_SELECT: {.
f4e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
f4f0: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62  ression is a sub
f500: 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20  -select. Return 
f510: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
f520: 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a  type and.      *
f530: 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f  * origin info fo
f540: 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c  r the single col
f550: 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  umn in the resul
f560: 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
f570: 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ECT.      ** sta
f580: 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  tement..      */
f590: 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  .      NameConte
f5a0: 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65  xt sNC;.      Se
f5b0: 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72  lect *pS = pExpr
f5c0: 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  ->x.pSelect;.   
f5d0: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d     Expr *p = pS-
f5e0: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
f5f0: 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
f600: 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
f610: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
f620: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
f630: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
f640: 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20  pS->pSrc;.      
f650: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b  sNC.pNext = pNC;
f660: 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73  .      sNC.pPars
f670: 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
f680: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63  .      zType = c
f690: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
f6a0: 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f  p, &zOrigDb, &zO
f6b0: 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f  rigTab, &zOrigCo
f6c0: 6c 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  l); .      break
f6d0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
f6e0: 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
f6f0: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
f700: 4d 45 54 41 44 41 54 41 20 20 0a 20 20 69 66 28  METADATA  .  if(
f710: 20 70 7a 4f 72 69 67 44 62 20 29 7b 0a 20 20 20   pzOrigDb ){.   
f720: 20 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67 54   assert( pzOrigT
f730: 61 62 20 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20  ab && pzOrigCol 
f740: 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 44 62  );.    *pzOrigDb
f750: 20 3d 20 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20   = zOrigDb;.    
f760: 2a 70 7a 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72  *pzOrigTab = zOr
f770: 69 67 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72  igTab;.    *pzOr
f780: 69 67 43 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c  igCol = zOrigCol
f790: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
f7a0: 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a  eturn zType;.}..
f7b0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
f7c0: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65  ode that will te
f7d0: 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20  ll the VDBE the 
f7e0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
f7f0: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
f800: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
f810: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
f820: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
f830: 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Types(.  Parse *
f840: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
f850: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
f860: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
f870: 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  bList,  /* List 
f880: 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45  of tables */.  E
f890: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
f8a0: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
f8b0: 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72  s defining the r
f8c0: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a  esult set */.){.
f8d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f8e0: 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 56  MIT_DECLTYPE.  V
f8f0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
f900: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
f910: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73  .  NameContext s
f920: 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  NC;.  sNC.pSrcLi
f930: 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
f940: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
f950: 61 72 73 65 3b 0a 20 20 73 4e 43 2e 70 4e 65 78  arse;.  sNC.pNex
f960: 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  t = 0;.  for(i=0
f970: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
f980: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
f990: 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *p = pEList->a
f9a0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63  [i].pExpr;.    c
f9b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
f9c0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
f9d0: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
f9e0: 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74  TADATA.    const
f9f0: 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d   char *zOrigDb =
fa00: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
fa10: 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30  ar *zOrigTab = 0
fa20: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
fa30: 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a   *zOrigCol = 0;.
fa40: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
fa50: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
fa60: 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67  &zOrigDb, &zOrig
fa70: 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b  Tab, &zOrigCol);
fa80: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62  ..    /* The vdb
fa90: 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73 20  e must make its 
faa0: 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20  own copy of the 
fab0: 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20  column-type and 
fac0: 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f  other .    ** co
fad0: 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73 74  lumn specific st
fae0: 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20 74  rings, in case t
faf0: 68 65 20 73 63 68 65 6d 61 20 69 73 20 72 65 73  he schema is res
fb00: 65 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a 20  et before this. 
fb10: 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61     ** virtual ma
fb20: 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64  chine is deleted
fb30: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
fb40: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
fb50: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
fb60: 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69 67  _DATABASE, zOrig
fb70: 44 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  Db, SQLITE_TRANS
fb80: 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
fb90: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
fba0: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54  (v, i, COLNAME_T
fbb0: 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c 20  ABLE, zOrigTab, 
fbc0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
fbd0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
fbe0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
fbf0: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d  i, COLNAME_COLUM
fc00: 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53 51 4c  N, zOrigCol, SQL
fc10: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
fc20: 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70 65 20  #else.    zType 
fc30: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
fc40: 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  C, p, 0, 0, 0);.
fc50: 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
fc60: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
fc70: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44  (v, i, COLNAME_D
fc80: 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c 20  ECLTYPE, zType, 
fc90: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
fca0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
fcb0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
fcc0: 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 29 20  _OMIT_DECLTYPE) 
fcd0: 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  */.}.../*.** Com
fce0: 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  pute the column 
fcf0: 6e 61 6d 65 73 20 66 6f 72 20 61 20 53 45 4c 45  names for a SELE
fd00: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
fd10: 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 67 75 61  .** The only gua
fd20: 72 61 6e 74 65 65 20 74 68 61 74 20 53 51 4c 69  rantee that SQLi
fd30: 74 65 20 6d 61 6b 65 73 20 61 62 6f 75 74 20 63  te makes about c
fd40: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 73 20 74  olumn names is t
fd50: 68 61 74 20 69 66 20 74 68 65 0a 2a 2a 20 63 6f  hat if the.** co
fd60: 6c 75 6d 6e 20 68 61 73 20 61 6e 20 41 53 20 63  lumn has an AS c
fd70: 6c 61 75 73 65 20 61 73 73 69 67 6e 69 6e 67 20  lause assigning 
fd80: 69 74 20 61 20 6e 61 6d 65 2c 20 74 68 61 74 20  it a name, that 
fd90: 77 69 6c 6c 20 62 65 20 74 68 65 20 6e 61 6d 65  will be the name
fda0: 20 75 73 65 64 2e 0a 2a 2a 20 54 68 61 74 20 69   used..** That i
fdb0: 73 20 74 68 65 20 6f 6e 6c 79 20 64 6f 63 75 6d  s the only docum
fdc0: 65 6e 74 65 64 20 67 75 61 72 61 6e 74 65 65 2e  ented guarantee.
fdd0: 20 20 48 6f 77 65 76 65 72 2c 20 63 6f 75 6e 74    However, count
fde0: 6c 65 73 73 20 61 70 70 6c 69 63 61 74 69 6f 6e  less application
fdf0: 73 0a 2a 2a 20 64 65 76 65 6c 6f 70 65 64 20 6f  s.** developed o
fe00: 76 65 72 20 74 68 65 20 79 65 61 72 73 20 68 61  ver the years ha
fe10: 76 65 20 6d 61 64 65 20 62 61 73 65 6c 65 73 73  ve made baseless
fe20: 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 61 62 6f   assumptions abo
fe30: 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a  ut column names.
fe40: 2a 2a 20 61 6e 64 20 77 69 6c 6c 20 62 72 65 61  ** and will brea
fe50: 6b 20 69 66 20 74 68 6f 73 65 20 61 73 73 75 6d  k if those assum
fe60: 70 74 69 6f 6e 73 20 63 68 61 6e 67 65 73 2e 20  ptions changes. 
fe70: 20 48 65 6e 63 65 2c 20 75 73 65 20 65 78 74 72   Hence, use extr
fe80: 65 6d 65 20 63 61 75 74 69 6f 6e 0a 2a 2a 20 77  eme caution.** w
fe90: 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  hen modifying th
fea0: 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 61 76  is routine to av
feb0: 6f 69 64 20 62 72 65 61 6b 69 6e 67 20 6c 65 67  oid breaking leg
fec0: 61 63 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 41  acy..**.** See A
fed0: 6c 73 6f 3a 20 73 71 6c 69 74 65 33 43 6f 6c 75  lso: sqlite3Colu
fee0: 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
fef0: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 52 41 47  ).**.** The PRAG
ff00: 4d 41 20 73 68 6f 72 74 5f 63 6f 6c 75 6d 6e 5f  MA short_column_
ff10: 6e 61 6d 65 73 20 61 6e 64 20 50 52 41 47 4d 41  names and PRAGMA
ff20: 20 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d   full_column_nam
ff30: 65 73 20 73 65 74 74 69 6e 67 73 20 61 72 65 0a  es settings are.
ff40: 2a 2a 20 64 65 70 72 65 63 61 74 65 64 2e 20 20  ** deprecated.  
ff50: 54 68 65 20 64 65 66 61 75 6c 74 20 73 65 74 74  The default sett
ff60: 69 6e 67 20 69 73 20 73 68 6f 72 74 3d 4f 4e 2c  ing is short=ON,
ff70: 20 66 75 6c 6c 3d 4f 46 46 2e 20 20 39 39 2e 39   full=OFF.  99.9
ff80: 25 20 6f 66 20 61 6c 6c 0a 2a 2a 20 61 70 70 6c  % of all.** appl
ff90: 69 63 61 74 69 6f 6e 73 20 73 68 6f 75 6c 64 20  ications should 
ffa0: 6f 70 65 72 61 74 65 20 74 68 69 73 20 77 61 79  operate this way
ffb0: 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  .  Nevertheless,
ffc0: 20 77 65 20 6e 65 65 64 20 74 6f 20 73 75 70 70   we need to supp
ffd0: 6f 72 74 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72  ort the.** other
ffe0: 20 6d 6f 64 65 73 20 66 6f 72 20 6c 65 67 61 63   modes for legac
fff0: 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 68 6f 72  y:.**.**    shor
10000 74 3d 4f 46 46 2c 20 66 75 6c 6c 3d 4f 46 46 3a  t=OFF, full=OFF:
10010 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 6e 61 6d        Column nam
10020 65 20 69 73 20 74 68 65 20 74 65 78 74 20 6f 66  e is the text of
10030 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
10040 68 61 73 20 69 74 0a 2a 2a 20 20 20 20 20 20 20  has it.**       
10050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10060 20 20 20 20 20 20 20 6f 72 69 67 69 6e 61 6c 6c         originall
10070 79 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  y appears in the
10080 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
10090 74 2e 20 20 49 6e 0a 2a 2a 20 20 20 20 20 20 20  t.  In.**       
100a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100b0 20 20 20 20 20 20 20 6f 74 68 65 72 20 77 6f 72         other wor
100c0 64 73 2c 20 74 68 65 20 7a 53 70 61 6e 20 6f 66  ds, the zSpan of
100d0 20 74 68 65 20 72 65 73 75 6c 74 20 65 78 70 72   the result expr
100e0 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ession..**.**   
100f0 20 73 68 6f 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d   short=ON, full=
10100 4f 46 46 3a 20 20 20 20 20 20 20 28 54 68 69 73  OFF:       (This
10110 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   is the default 
10120 73 65 74 74 69 6e 67 29 2e 20 20 49 66 20 74 68  setting).  If th
10130 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20  e result.**     
10140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10150 20 20 20 20 20 20 20 20 20 72 65 66 65 72 73 20           refers 
10160 64 69 72 65 63 74 6c 79 20 74 6f 20 61 20 74 61  directly to a ta
10170 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  ble column, then
10180 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
10190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101a0 20 20 20 20 20 72 65 73 75 6c 74 20 63 6f 6c 75       result colu
101b0 6d 6e 20 6e 61 6d 65 20 69 73 20 6a 75 73 74 20  mn name is just 
101c0 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  the table column
101d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
101e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101f0 20 6e 61 6d 65 3a 20 43 4f 4c 55 4d 4e 2e 20 20   name: COLUMN.  
10200 4f 74 68 65 72 77 69 73 65 20 75 73 65 20 7a 53  Otherwise use zS
10210 70 61 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 66 75  pan..**.**    fu
10220 6c 6c 3d 4f 4e 2c 20 73 68 6f 72 74 3d 41 4e 59  ll=ON, short=ANY
10230 3a 20 20 20 20 20 20 20 49 66 20 74 68 65 20 72  :       If the r
10240 65 73 75 6c 74 20 72 65 66 65 72 73 20 64 69 72  esult refers dir
10250 65 63 74 6c 79 20 74 6f 20 61 20 74 61 62 6c 65  ectly to a table
10260 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 20 20 20 20   column,.**     
10270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10280 20 20 20 20 20 20 20 20 20 74 68 65 6e 20 74 68           then th
10290 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  e result column 
102a0 6e 61 6d 65 20 77 69 74 68 20 74 68 65 20 74 61  name with the ta
102b0 62 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 20 20  ble name.**     
102c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102d0 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78 2c           prefix,
102e0 20 65 78 3a 20 54 41 42 4c 45 2e 43 4f 4c 55 4d   ex: TABLE.COLUM
102f0 4e 2e 20 20 4f 74 68 65 72 77 69 73 65 20 75 73  N.  Otherwise us
10300 65 20 7a 53 70 61 6e 2e 0a 2a 2f 0a 73 74 61 74  e zSpan..*/.stat
10310 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
10320 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50  ColumnNames(.  P
10330 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
10340 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
10350 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
10360 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 2f 2a   *pSelect     /*
10370 20 47 65 6e 65 72 61 74 65 20 63 6f 6c 75 6d 6e   Generate column
10380 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20   names for this 
10390 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
103a0 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
103b0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
103c0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 54 61 62  ;.  int i;.  Tab
103d0 6c 65 20 2a 70 54 61 62 3b 0a 20 20 53 72 63 4c  le *pTab;.  SrcL
103e0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
103f0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
10400 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
10410 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
10420 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 3b 20 20   int fullName;  
10430 20 20 2f 2a 20 54 41 42 4c 45 2e 43 4f 4c 55 4d    /* TABLE.COLUM
10440 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c 61 75 73  N if no AS claus
10450 65 20 61 6e 64 20 69 73 20 61 20 64 69 72 65 63  e and is a direc
10460 74 20 74 61 62 6c 65 20 72 65 66 20 2a 2f 0a 20  t table ref */. 
10470 20 69 6e 74 20 73 72 63 4e 61 6d 65 3b 20 20 20   int srcName;   
10480 20 20 2f 2a 20 43 4f 4c 55 4d 4e 20 6f 72 20 54    /* COLUMN or T
10490 41 42 4c 45 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e  ABLE.COLUMN if n
104a0 6f 20 41 53 20 63 6c 61 75 73 65 20 61 6e 64 20  o AS clause and 
104b0 69 73 20 64 69 72 65 63 74 20 2a 2f 0a 0a 23 69  is direct */..#i
104c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
104d0 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49  T_EXPLAIN.  /* I
104e0 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50  f this is an EXP
104f0 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20  LAIN, skip this 
10500 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50  step */.  if( pP
10510 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
10520 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
10530 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
10540 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53  Parse->colNamesS
10550 65 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 2f  et ) return;.  /
10560 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  * Column names a
10570 72 65 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  re determined by
10580 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74   the left-most t
10590 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  erm of a compoun
105a0 64 20 73 65 6c 65 63 74 20 2a 2f 0a 20 20 77 68  d select */.  wh
105b0 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50  ile( pSelect->pP
105c0 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d  rior ) pSelect =
105d0 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
105e0 3b 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28  ;.  SELECTTRACE(
105f0 31 2c 70 50 61 72 73 65 2c 70 53 65 6c 65 63 74  1,pParse,pSelect
10600 2c 28 22 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  ,("generating co
10610 6c 75 6d 6e 20 6e 61 6d 65 73 5c 6e 22 29 29 3b  lumn names\n"));
10620 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 53  .  pTabList = pS
10630 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 70  elect->pSrc;.  p
10640 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
10650 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65 72  >pEList;.  asser
10660 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( v!=0 );.  ass
10670 65 72 74 28 20 70 54 61 62 4c 69 73 74 21 3d 30  ert( pTabList!=0
10680 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f   );.  pParse->co
10690 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20  lNamesSet = 1;. 
106a0 20 66 75 6c 6c 4e 61 6d 65 20 3d 20 28 64 62 2d   fullName = (db-
106b0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
106c0 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  FullColNames)!=0
106d0 3b 0a 20 20 73 72 63 4e 61 6d 65 20 3d 20 28 64  ;.  srcName = (d
106e0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
106f0 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
10700 21 3d 30 20 7c 7c 20 66 75 6c 6c 4e 61 6d 65 3b  !=0 || fullName;
10710 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  .  sqlite3VdbeSe
10720 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69  tNumCols(v, pELi
10730 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f  st->nExpr);.  fo
10740 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
10750 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
10760 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69    Expr *p = pELi
10770 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
10780 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 21 3d  .    assert( p!=
10790 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
107a0 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43   p->op!=TK_AGG_C
107b0 4f 4c 55 4d 4e 20 29 3b 20 20 2f 2a 20 41 67 67  OLUMN );  /* Agg
107c0 20 70 72 6f 63 65 73 73 69 6e 67 20 68 61 73 20   processing has 
107d0 6e 6f 74 20 72 75 6e 20 79 65 74 20 2a 2f 0a 20  not run yet */. 
107e0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
107f0 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  !=TK_COLUMN || p
10800 2d 3e 79 2e 70 54 61 62 21 3d 30 20 29 3b 20 2f  ->y.pTab!=0 ); /
10810 2a 20 43 6f 76 65 72 69 6e 67 20 69 64 78 20 6e  * Covering idx n
10820 6f 74 20 79 65 74 20 63 6f 64 65 64 20 2a 2f 0a  ot yet coded */.
10830 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e      if( pEList->
10840 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20  a[i].zName ){.  
10850 20 20 20 20 2f 2a 20 41 6e 20 41 53 20 63 6c 61      /* An AS cla
10860 75 73 65 20 61 6c 77 61 79 73 20 74 61 6b 65 73  use always takes
10870 20 66 69 72 73 74 20 70 72 69 6f 72 69 74 79 20   first priority 
10880 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  */.      char *z
10890 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
108a0 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [i].zName;.     
108b0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
108c0 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
108d0 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65  NAME_NAME, zName
108e0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
108f0 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  NT);.    }else i
10900 66 28 20 73 72 63 4e 61 6d 65 20 26 26 20 70 2d  f( srcName && p-
10910 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
10920 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43  {.      char *zC
10930 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  ol;.      int iC
10940 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b  ol = p->iColumn;
10950 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 2d  .      pTab = p-
10960 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 61  >y.pTab;.      a
10970 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
10980 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
10990 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
109a0 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61  ->iPKey;.      a
109b0 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20  ssert( iCol==-1 
109c0 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69  || (iCol>=0 && i
109d0 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Col<pTab->nCol) 
109e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  );.      if( iCo
109f0 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  l<0 ){.        z
10a00 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20  Col = "rowid";. 
10a10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10a20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d      zCol = pTab-
10a30 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
10a40 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
10a50 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 20 29 7b   if( fullName ){
10a60 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
10a70 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
10a80 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
10a90 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
10aa0 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  .%s", pTab->zNam
10ab0 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, zCol);.      
10ac0 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
10ad0 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
10ae0 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d  LNAME_NAME, zNam
10af0 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  e, SQLITE_DYNAMI
10b00 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  C);.      }else{
10b10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10b20 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
10b30 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
10b40 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f  E, zCol, SQLITE_
10b50 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
10b60 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
10b70 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
10b80 2a 7a 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  *z = pEList->a[i
10b90 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7a  ].zSpan;.      z
10ba0 20 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c 69 74 65   = z==0 ? sqlite
10bb0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 63 6f  3MPrintf(db, "co
10bc0 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 20 3a 20  lumn%d", i+1) : 
10bd0 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
10be0 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71  db, z);.      sq
10bf0 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
10c00 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
10c10 45 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c 49 54  E_NAME, z, SQLIT
10c20 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  E_DYNAMIC);.    
10c30 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65  }.  }.  generate
10c40 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72  ColumnTypes(pPar
10c50 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
10c60 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
10c70 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73  Given an express
10c80 69 6f 6e 20 6c 69 73 74 20 28 77 68 69 63 68 20  ion list (which 
10c90 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20 6c 69  is really the li
10ca0 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  st of expression
10cb0 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20 74  s.** that form t
10cc0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
10cd0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
10ce0 65 6e 74 29 20 63 6f 6d 70 75 74 65 20 61 70 70  ent) compute app
10cf0 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75  ropriate.** colu
10d00 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 74  mn names for a t
10d10 61 62 6c 65 20 74 68 61 74 20 77 6f 75 6c 64 20  able that would 
10d20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73  hold the express
10d30 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
10d40 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  All column names
10d50 20 77 69 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e   will be unique.
10d60 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20  .**.** Only the 
10d70 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65  column names are
10d80 20 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75   computed.  Colu
10d90 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e  mn.zType, Column
10da0 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f  .zColl,.** and o
10db0 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 43  ther fields of C
10dc0 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64  olumn are zeroed
10dd0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
10de0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
10df0 65 73 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ess.  If a memor
10e00 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
10e10 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74  or occurs,.** st
10e20 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43  ore NULL in *paC
10e30 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43  ol and 0 in *pnC
10e40 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ol and return SQ
10e50 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2a 0a 2a  LITE_NOMEM..**.*
10e60 2a 20 54 68 65 20 6f 6e 6c 79 20 67 75 61 72 61  * The only guara
10e70 6e 74 65 65 20 74 68 61 74 20 53 51 4c 69 74 65  ntee that SQLite
10e80 20 6d 61 6b 65 73 20 61 62 6f 75 74 20 63 6f 6c   makes about col
10e90 75 6d 6e 20 6e 61 6d 65 73 20 69 73 20 74 68 61  umn names is tha
10ea0 74 20 69 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75  t if the.** colu
10eb0 6d 6e 20 68 61 73 20 61 6e 20 41 53 20 63 6c 61  mn has an AS cla
10ec0 75 73 65 20 61 73 73 69 67 6e 69 6e 67 20 69 74  use assigning it
10ed0 20 61 20 6e 61 6d 65 2c 20 74 68 61 74 20 77 69   a name, that wi
10ee0 6c 6c 20 62 65 20 74 68 65 20 6e 61 6d 65 20 75  ll be the name u
10ef0 73 65 64 2e 0a 2a 2a 20 54 68 61 74 20 69 73 20  sed..** That is 
10f00 74 68 65 20 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e  the only documen
10f10 74 65 64 20 67 75 61 72 61 6e 74 65 65 2e 20 20  ted guarantee.  
10f20 48 6f 77 65 76 65 72 2c 20 63 6f 75 6e 74 6c 65  However, countle
10f30 73 73 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 0a  ss applications.
10f40 2a 2a 20 64 65 76 65 6c 6f 70 65 64 20 6f 76 65  ** developed ove
10f50 72 20 74 68 65 20 79 65 61 72 73 20 68 61 76 65  r the years have
10f60 20 6d 61 64 65 20 62 61 73 65 6c 65 73 73 20 61   made baseless a
10f70 73 73 75 6d 70 74 69 6f 6e 73 20 61 62 6f 75 74  ssumptions about
10f80 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 2a 2a   column names.**
10f90 20 61 6e 64 20 77 69 6c 6c 20 62 72 65 61 6b 20   and will break 
10fa0 69 66 20 74 68 6f 73 65 20 61 73 73 75 6d 70 74  if those assumpt
10fb0 69 6f 6e 73 20 63 68 61 6e 67 65 73 2e 20 20 48  ions changes.  H
10fc0 65 6e 63 65 2c 20 75 73 65 20 65 78 74 72 65 6d  ence, use extrem
10fd0 65 20 63 61 75 74 69 6f 6e 0a 2a 2a 20 77 68 65  e caution.** whe
10fe0 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 69 73  n modifying this
10ff0 20 72 6f 75 74 69 6e 65 20 74 6f 20 61 76 6f 69   routine to avoi
11000 64 20 62 72 65 61 6b 69 6e 67 20 6c 65 67 61 63  d breaking legac
11010 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 41 6c 73  y..**.** See Als
11020 6f 3a 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  o: generateColum
11030 6e 4e 61 6d 65 73 28 29 0a 2a 2f 0a 69 6e 74 20  nNames().*/.int 
11040 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72  sqlite3ColumnsFr
11050 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  omExprList(.  Pa
11060 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
11070 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
11080 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
11090 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
110a0 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 6c 69        /* Expr li
110b0 73 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f  st from which to
110c0 20 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e   derive column n
110d0 61 6d 65 73 20 2a 2f 0a 20 20 69 31 36 20 2a 70  ames */.  i16 *p
110e0 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  nCol,           
110f0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
11100 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
11110 20 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d   here */.  Colum
11120 6e 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20 20  n **paCol       
11130 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
11140 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  new column list 
11150 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  here */.){.  sql
11160 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
11170 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61 74 61  e->db;   /* Data
11180 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
11190 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
111a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111b0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
111c0 73 20 2a 2f 0a 20 20 75 33 32 20 63 6e 74 3b 20  s */.  u32 cnt; 
111d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111e0 20 20 20 2f 2a 20 49 6e 64 65 78 20 61 64 64 65     /* Index adde
111f0 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61  d to make the na
11200 6d 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43  me unique */.  C
11210 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43  olumn *aCol, *pC
11220 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ol;        /* Fo
11230 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72  r looping over r
11240 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  esult columns */
11250 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20  .  int nCol;    
11260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11270 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
11280 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
11290 74 20 73 65 74 20 2a 2f 0a 20 20 63 68 61 72 20  t set */.  char 
112a0 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  *zName;         
112b0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
112c0 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   name */.  int n
112d0 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
112e0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
112f0 66 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b  f name in zName[
11300 5d 20 2a 2f 0a 20 20 48 61 73 68 20 68 74 3b 20  ] */.  Hash ht; 
11310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11320 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65     /* Hash table
11330 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   of column names
11340 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 48 61   */..  sqlite3Ha
11350 73 68 49 6e 69 74 28 26 68 74 29 3b 0a 20 20 69  shInit(&ht);.  i
11360 66 28 20 70 45 4c 69 73 74 20 29 7b 0a 20 20 20  f( pEList ){.   
11370 20 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e   nCol = pEList->
11380 6e 45 78 70 72 3b 0a 20 20 20 20 61 43 6f 6c 20  nExpr;.    aCol 
11390 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
113a0 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
113b0 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b  (aCol[0])*nCol);
113c0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61  .    testcase( a
113d0 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  Col==0 );.    if
113e0 28 20 6e 43 6f 6c 3e 33 32 37 36 37 20 29 20 6e  ( nCol>32767 ) n
113f0 43 6f 6c 20 3d 20 33 32 37 36 37 3b 0a 20 20 7d  Col = 32767;.  }
11400 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d  else{.    nCol =
11410 20 30 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 30   0;.    aCol = 0
11420 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
11430 6e 43 6f 6c 3d 3d 28 69 31 36 29 6e 43 6f 6c 20  nCol==(i16)nCol 
11440 29 3b 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43  );.  *pnCol = nC
11450 6f 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d 20 61  ol;.  *paCol = a
11460 43 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c  Col;..  for(i=0,
11470 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43   pCol=aCol; i<nC
11480 6f 6c 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f  ol && !db->mallo
11490 63 46 61 69 6c 65 64 3b 20 69 2b 2b 2c 20 70 43  cFailed; i++, pC
114a0 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65  ol++){.    /* Ge
114b0 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  t an appropriate
114c0 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f   name for the co
114d0 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lumn.    */.    
114e0 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c  if( (zName = pEL
114f0 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
11500 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
11510 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f  If the column co
11520 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e  ntains an "AS <n
11530 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20 75 73  ame>" phrase, us
11540 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65 20  e <name> as the 
11550 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  name */.    }els
11560 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  e{.      Expr *p
11570 43 6f 6c 45 78 70 72 20 3d 20 73 71 6c 69 74 65  ColExpr = sqlite
11580 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
11590 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  (pEList->a[i].pE
115a0 78 70 72 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  xpr);.      whil
115b0 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d  e( pColExpr->op=
115c0 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20  =TK_DOT ){.     
115d0 20 20 20 70 43 6f 6c 45 78 70 72 20 3d 20 70 43     pColExpr = pC
115e0 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  olExpr->pRight;.
115f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
11600 70 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a 20  pColExpr!=0 );. 
11610 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
11620 65 72 74 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f  ert( pColExpr->o
11630 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p!=TK_AGG_COLUMN
11640 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43   );.      if( pC
11650 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43  olExpr->op==TK_C
11660 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20  OLUMN ){.       
11670 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20   /* For columns 
11680 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  use the column n
11690 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ame name */.    
116a0 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
116b0 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ColExpr->iColumn
116c0 3b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20  ;.        Table 
116d0 2a 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70 72  *pTab = pColExpr
116e0 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  ->y.pTab;.      
116f0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
11700 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
11710 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
11720 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
11730 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 69 43        zName = iC
11740 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43  ol>=0 ? pTab->aC
11750 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a  ol[iCol].zName :
11760 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20   "rowid";.      
11770 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c 45 78  }else if( pColEx
11780 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b  pr->op==TK_ID ){
11790 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
117a0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
117b0 79 28 70 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49  y(pColExpr, EP_I
117c0 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
117d0 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c      zName = pCol
117e0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
117f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11800 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20       /* Use the 
11810 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66  original text of
11820 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72   the column expr
11830 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61  ession as its na
11840 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 4e  me */.        zN
11850 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
11860 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20  i].zSpan;.      
11870 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
11880 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 7a  zName ){.      z
11890 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
118a0 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d 65  StrDup(db, zName
118b0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
118c0 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
118d0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 22 63  te3MPrintf(db,"c
118e0 6f 6c 75 6d 6e 25 64 22 2c 69 2b 31 29 3b 0a 20  olumn%d",i+1);. 
118f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b     }..    /* Mak
11900 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d  e sure the colum
11910 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65  n name is unique
11920 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69  .  If the name i
11930 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20  s not unique,.  
11940 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 6e 20 69    ** append an i
11950 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61  nteger to the na
11960 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20 62 65  me so that it be
11970 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20  comes unique..  
11980 20 20 2a 2f 0a 20 20 20 20 63 6e 74 20 3d 20 30    */.    cnt = 0
11990 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4e 61  ;.    while( zNa
119a0 6d 65 20 26 26 20 73 71 6c 69 74 65 33 48 61 73  me && sqlite3Has
119b0 68 46 69 6e 64 28 26 68 74 2c 20 7a 4e 61 6d 65  hFind(&ht, zName
119c0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 4e  )!=0 ){.      nN
119d0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
119e0 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20  len30(zName);.  
119f0 20 20 20 20 69 66 28 20 6e 4e 61 6d 65 3e 30 20      if( nName>0 
11a00 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  ){.        for(j
11a10 3d 6e 4e 61 6d 65 2d 31 3b 20 6a 3e 30 20 26 26  =nName-1; j>0 &&
11a20 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28   sqlite3Isdigit(
11a30 7a 4e 61 6d 65 5b 6a 5d 29 3b 20 6a 2d 2d 29 7b  zName[j]); j--){
11a40 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e  }.        if( zN
11a50 61 6d 65 5b 6a 5d 3d 3d 27 3a 27 20 29 20 6e 4e  ame[j]==':' ) nN
11a60 61 6d 65 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d  ame = j;.      }
11a70 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
11a80 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
11a90 2c 20 22 25 2e 2a 7a 3a 25 75 22 2c 20 6e 4e 61  , "%.*z:%u", nNa
11aa0 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74  me, zName, ++cnt
11ab0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74  );.      if( cnt
11ac0 3e 33 20 29 20 73 71 6c 69 74 65 33 5f 72 61 6e  >3 ) sqlite3_ran
11ad0 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 63  domness(sizeof(c
11ae0 6e 74 29 2c 20 26 63 6e 74 29 3b 0a 20 20 20 20  nt), &cnt);.    
11af0 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  }.    pCol->zNam
11b00 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 73  e = zName;.    s
11b10 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70  qlite3ColumnProp
11b20 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28 30  ertiesFromName(0
11b30 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28  , pCol);.    if(
11b40 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65   zName && sqlite
11b50 33 48 61 73 68 49 6e 73 65 72 74 28 26 68 74 2c  3HashInsert(&ht,
11b60 20 7a 4e 61 6d 65 2c 20 70 43 6f 6c 29 3d 3d 70   zName, pCol)==p
11b70 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Col ){.      sql
11b80 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
11b90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
11ba0 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26  lite3HashClear(&
11bb0 68 74 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ht);.  if( db->m
11bc0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
11bd0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b     for(j=0; j<i;
11be0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   j++){.      sql
11bf0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61  ite3DbFree(db, a
11c00 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  Col[j].zName);. 
11c10 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
11c20 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 29  DbFree(db, aCol)
11c30 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30  ;.    *paCol = 0
11c40 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30  ;.    *pnCol = 0
11c50 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
11c60 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
11c70 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
11c80 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
11c90 20 41 64 64 20 74 79 70 65 20 61 6e 64 20 63 6f   Add type and co
11ca0 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74  llation informat
11cb0 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20  ion to a column 
11cc0 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  list based on.**
11cd0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
11ce0 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  ent..** .** The 
11cf0 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72 65 73  column list pres
11d00 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d  umably came from
11d10 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d   selectColumnNam
11d20 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 29  esFromExprList()
11d30 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20  ..** The column 
11d40 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61  list has only na
11d50 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f  mes, not types o
11d60 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54  r collations.  T
11d70 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67  his.** routine g
11d80 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e 64 20  oes through and 
11d90 61 64 64 73 20 74 68 65 20 74 79 70 65 73 20 61  adds the types a
11da0 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a  nd collations..*
11db0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
11dc0 65 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20  e requires that 
11dd0 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72 73 20  all identifiers 
11de0 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a  in the SELECT.**
11df0 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20 72 65   statement be re
11e00 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  solved..*/.void 
11e10 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
11e20 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c  ColumnTypeAndCol
11e30 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20  lation(.  Parse 
11e40 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
11e50 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
11e60 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  xts */.  Table *
11e70 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  pTab,          /
11e80 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20 74 79 70  * Add column typ
11e90 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  e information to
11ea0 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
11eb0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
11ec0 2c 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54  ,      /* SELECT
11ed0 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
11ee0 6e 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c  ne types and col
11ef0 6c 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61  lations */.  cha
11f00 72 20 61 66 66 20 20 20 20 20 20 20 20 20 20 20  r aff           
11f10 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 61 66     /* Default af
11f20 66 69 6e 69 74 79 20 66 6f 72 20 63 6f 6c 75 6d  finity for colum
11f30 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ns */.){.  sqlit
11f40 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
11f50 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  >db;.  NameConte
11f60 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e  xt sNC;.  Column
11f70 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65   *pCol;.  CollSe
11f80 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20  q *pColl;.  int 
11f90 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20  i;.  Expr *p;.  
11fa0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
11fb0 69 74 65 6d 20 2a 61 3b 0a 0a 20 20 61 73 73 65  item *a;..  asse
11fc0 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29  rt( pSelect!=0 )
11fd0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 53 65  ;.  assert( (pSe
11fe0 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26  lect->selFlags &
11ff0 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30   SF_Resolved)!=0
12000 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
12010 61 62 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63  ab->nCol==pSelec
12020 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
12030 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
12040 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62  iled );.  if( db
12050 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
12060 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65   return;.  memse
12070 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
12080 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70  f(sNC));.  sNC.p
12090 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  SrcList = pSelec
120a0 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70  t->pSrc;.  a = p
120b0 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
120c0 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  a;.  for(i=0, pC
120d0 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69  ol=pTab->aCol; i
120e0 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
120f0 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 63  , pCol++){.    c
12100 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
12110 3b 0a 20 20 20 20 69 6e 74 20 6e 2c 20 6d 3b 0a  ;.    int n, m;.
12120 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70 45 78      p = a[i].pEx
12130 70 72 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20  pr;.    zType = 
12140 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
12150 20 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   p, 0, 0, 0);.  
12160 20 20 2f 2a 20 70 43 6f 6c 2d 3e 73 7a 45 73 74    /* pCol->szEst
12170 20 3d 20 2e 2e 2e 20 2f 2f 20 43 6f 6c 75 6d 6e   = ... // Column
12180 20 73 69 7a 65 20 65 73 74 20 66 6f 72 20 53 45   size est for SE
12190 4c 45 43 54 20 74 61 62 6c 65 73 20 6e 65 76 65  LECT tables neve
121a0 72 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 70 43  r used */.    pC
121b0 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
121c0 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
121d0 74 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20 7a  ty(p);.    if( z
121e0 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 6d 20  Type ){.      m 
121f0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
12200 30 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20  0(zType);.      
12210 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
12220 6e 33 30 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  n30(pCol->zName)
12230 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e  ;.      pCol->zN
12240 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 52  ame = sqlite3DbR
12250 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 64 62 2c  eallocOrFree(db,
12260 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 6e 2b   pCol->zName, n+
12270 6d 2b 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  m+2);.      if( 
12280 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20  pCol->zName ){. 
12290 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
122a0 43 6f 6c 2d 3e 7a 4e 61 6d 65 5b 6e 2b 31 5d 2c  Col->zName[n+1],
122b0 20 7a 54 79 70 65 2c 20 6d 2b 31 29 3b 0a 20 20   zType, m+1);.  
122c0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46        pCol->colF
122d0 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f  lags |= COLFLAG_
122e0 48 41 53 54 59 50 45 3b 0a 20 20 20 20 20 20 7d  HASTYPE;.      }
122f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
12300 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3c 3d 53  Col->affinity<=S
12310 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
12320 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
12330 3d 20 61 66 66 3b 0a 20 20 20 20 70 43 6f 6c 6c  = aff;.    pColl
12340 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
12350 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29  llSeq(pParse, p)
12360 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
12370 26 26 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d  && pCol->zColl==
12380 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  0 ){.      pCol-
12390 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  >zColl = sqlite3
123a0 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 6f  DbStrDup(db, pCo
123b0 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
123c0 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 73 7a  }.  }.  pTab->sz
123d0 54 61 62 52 6f 77 20 3d 20 31 3b 20 2f 2a 20 41  TabRow = 1; /* A
123e0 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ny non-zero valu
123f0 65 20 77 6f 72 6b 73 20 2a 2f 0a 7d 0a 0a 2f 2a  e works */.}../*
12400 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45  .** Given a SELE
12410 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65  CT statement, ge
12420 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65 20 73  nerate a Table s
12430 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
12440 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72  scribes.** the r
12450 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61  esult set of tha
12460 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62  t SELECT..*/.Tab
12470 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c  le *sqlite3Resul
12480 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72  tSetOfSelect(Par
12490 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
124a0 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 63 68 61  ct *pSelect, cha
124b0 72 20 61 66 66 29 7b 0a 20 20 54 61 62 6c 65 20  r aff){.  Table 
124c0 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  *pTab;.  sqlite3
124d0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
124e0 62 3b 0a 20 20 75 36 34 20 73 61 76 65 64 46 6c  b;.  u64 savedFl
124f0 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61  ags;..  savedFla
12500 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a  gs = db->flags;.
12510 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
12520 28 75 36 34 29 53 51 4c 49 54 45 5f 46 75 6c 6c  (u64)SQLITE_Full
12530 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e  ColNames;.  db->
12540 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
12550 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20  ShortColNames;. 
12560 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72   sqlite3SelectPr
12570 65 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ep(pParse, pSele
12580 63 74 2c 20 30 29 3b 0a 20 20 64 62 2d 3e 66 6c  ct, 0);.  db->fl
12590 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73  ags = savedFlags
125a0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
125b0 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b  nErr ) return 0;
125c0 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63  .  while( pSelec
125d0 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c  t->pPrior ) pSel
125e0 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ect = pSelect->p
125f0 50 72 69 6f 72 3b 0a 20 20 70 54 61 62 20 3d 20  Prior;.  pTab = 
12600 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
12610 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
12620 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70  able) );.  if( p
12630 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Tab==0 ){.    re
12640 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54  turn 0;.  }.  pT
12650 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b  ab->nTabRef = 1;
12660 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d  .  pTab->zName =
12670 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77   0;.  pTab->nRow
12680 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73  LogEst = 200; as
12690 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74  sert( 200==sqlit
126a0 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36  e3LogEst(1048576
126b0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f  ) );.  sqlite3Co
126c0 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
126d0 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
126e0 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62  t->pEList, &pTab
126f0 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61  ->nCol, &pTab->a
12700 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  Col);.  sqlite3S
12710 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
12720 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70  peAndCollation(p
12730 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65  Parse, pTab, pSe
12740 6c 65 63 74 2c 20 61 66 66 29 3b 0a 20 20 70 54  lect, aff);.  pT
12750 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
12760 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
12770 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
12780 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
12790 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
127a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
127b0 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
127c0 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45  /*.** Get a VDBE
127d0 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
127e0 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20  arser context.  
127f0 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  Create a new one
12800 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
12810 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
12820 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c  curs, return NUL
12830 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65  L and leave a me
12840 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e  ssage in pParse.
12850 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65  .*/.Vdbe *sqlite
12860 33 47 65 74 56 64 62 65 28 50 61 72 73 65 20 2a  3GetVdbe(Parse *
12870 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70  pParse){.  if( p
12880 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a  Parse->pVdbe ){.
12890 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 72 73      return pPars
128a0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 7d 0a 20 20  e->pVdbe;.  }.  
128b0 69 66 28 20 70 50 61 72 73 65 2d 3e 70 54 6f 70  if( pParse->pTop
128c0 6c 65 76 65 6c 3d 3d 30 0a 20 20 20 26 26 20 4f  level==0.   && O
128d0 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
128e0 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 53 51  ed(pParse->db,SQ
128f0 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f  LITE_FactorOutCo
12900 6e 73 74 29 0a 20 20 29 7b 0a 20 20 20 20 70 50  nst).  ){.    pP
12910 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63  arse->okConstFac
12920 74 6f 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  tor = 1;.  }.  r
12930 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
12940 65 43 72 65 61 74 65 28 70 50 61 72 73 65 29 3b  eCreate(pParse);
12950 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  .}.../*.** Compu
12960 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e  te the iLimit an
12970 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73  d iOffset fields
12980 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62   of the SELECT b
12990 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70  ased on the.** p
129a0 4c 69 6d 69 74 20 65 78 70 72 65 73 73 69 6f 6e  Limit expression
129b0 73 2e 20 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66  s.  pLimit->pLef
129c0 74 20 61 6e 64 20 70 4c 69 6d 69 74 2d 3e 70 52  t and pLimit->pR
129d0 69 67 68 74 20 68 6f 6c 64 20 74 68 65 20 65 78  ight hold the ex
129e0 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61  pressions.** tha
129f0 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
12a00 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
12a10 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65  tement after the
12a20 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
12a30 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20  T.** keywords.  
12a40 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65  Or NULL if those
12a50 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d   keywords are om
12a60 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e  itted. iLimit an
12a70 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72  d iOffset .** ar
12a80 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65  e the integer me
12a90 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e 75  mory register nu
12aa0 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65  mbers for counte
12ab0 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75  rs used to compu
12ac0 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74  te .** the limit
12ad0 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66   and offset.  If
12ae0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d   there is no lim
12af0 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74  it and/or offset
12b00 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69  , then .** iLimi
12b10 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72  t and iOffset ar
12b20 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a  e negative..**.*
12b30 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
12b40 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65  hanges the value
12b50 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20  s of iLimit and 
12b60 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a  iOffset only if.
12b70 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66  ** a limit or of
12b80 66 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20  fset is defined 
12b90 62 79 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74  by pLimit->pLeft
12ba0 20 61 6e 64 20 70 4c 69 6d 69 74 2d 3e 70 52 69   and pLimit->pRi
12bb0 67 68 74 2e 20 20 69 4c 69 6d 69 74 0a 2a 2a 20  ght.  iLimit.** 
12bc0 61 6e 64 20 69 4f 66 66 73 65 74 20 73 68 6f 75  and iOffset shou
12bd0 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65  ld have been pre
12be0 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61  set to appropria
12bf0 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  te default value
12c00 73 20 28 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f  s (zero).** prio
12c10 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
12c20 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
12c30 20 54 68 65 20 69 4f 66 66 73 65 74 20 72 65 67   The iOffset reg
12c40 69 73 74 65 72 20 28 69 66 20 69 74 20 65 78 69  ister (if it exi
12c50 73 74 73 29 20 69 73 20 69 6e 69 74 69 61 6c 69  sts) is initiali
12c60 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65  zed to the value
12c70 0a 2a 2a 20 6f 66 20 74 68 65 20 4f 46 46 53 45  .** of the OFFSE
12c80 54 2e 20 20 54 68 65 20 69 4c 69 6d 69 74 20 72  T.  The iLimit r
12c90 65 67 69 73 74 65 72 20 69 73 20 69 6e 69 74 69  egister is initi
12ca0 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e  alized to LIMIT.
12cb0 20 20 52 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f    Register.** iO
12cc0 66 66 73 65 74 2b 31 20 69 73 20 69 6e 69 74 69  ffset+1 is initi
12cd0 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b  alized to LIMIT+
12ce0 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  OFFSET..**.** On
12cf0 6c 79 20 69 66 20 70 4c 69 6d 69 74 2d 3e 70 4c  ly if pLimit->pL
12d00 65 66 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69  eft!=0 do the li
12d10 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67 65  mit registers ge
12d20 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20  t.** redefined. 
12d30 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   The UNION ALL o
12d40 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68 69  perator uses thi
12d50 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f  s property to fo
12d60 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65  rce.** the reuse
12d70 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d   of the same lim
12d80 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65  it and offset re
12d90 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d  gisters across m
12da0 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43  ultiple.** SELEC
12db0 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  T statements..*/
12dc0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d  .static void com
12dd0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
12de0 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  rs(Parse *pParse
12df0 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
12e00 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65   iBreak){.  Vdbe
12e10 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *v = 0;.  int i
12e20 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74  Limit = 0;.  int
12e30 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20   iOffset;.  int 
12e40 6e 3b 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  n;.  Expr *pLimi
12e50 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 0a  t = p->pLimit;..
12e60 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
12e70 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
12e80 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22  .  ** "LIMIT -1"
12e90 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c   always shows al
12ea0 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69  l rows.  There i
12eb0 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74  s some.  ** cont
12ec0 72 6f 76 65 72 73 79 20 61 62 6f 75 74 20 77 68  roversy about wh
12ed0 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62  at the correct b
12ee0 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62  ehavior should b
12ef0 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72  e..  ** The curr
12f00 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
12f10 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c  on interprets "L
12f20 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a  IMIT 0" to mean.
12f30 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20    ** no rows..  
12f40 2a 2f 0a 20 20 69 66 28 20 70 4c 69 6d 69 74 20  */.  if( pLimit 
12f50 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
12f60 4c 69 6d 69 74 2d 3e 6f 70 3d 3d 54 4b 5f 4c 49  Limit->op==TK_LI
12f70 4d 49 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72  MIT );.    asser
12f80 74 28 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74  t( pLimit->pLeft
12f90 21 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 69 4c  !=0 );.    p->iL
12fa0 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20  imit = iLimit = 
12fb0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
12fc0 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
12fd0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
12fe0 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d 30      assert( v!=0
12ff0 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   );.    if( sqli
13000 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
13010 28 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20  (pLimit->pLeft, 
13020 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  &n) ){.      sql
13030 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13040 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c  , OP_Integer, n,
13050 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
13060 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
13070 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29  "LIMIT counter")
13080 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  );.      if( n==
13090 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
130a0 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
130b0 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d  iBreak);.      }
130c0 65 6c 73 65 20 69 66 28 20 6e 3e 3d 30 20 26 26  else if( n>=0 &&
130d0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 73   p->nSelectRow>s
130e0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36  qlite3LogEst((u6
130f0 34 29 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  4)n) ){.        
13100 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
13110 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75  sqlite3LogEst((u
13120 36 34 29 6e 29 3b 0a 20 20 20 20 20 20 20 20 70  64)n);.        p
13130 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
13140 5f 46 69 78 65 64 4c 69 6d 69 74 3b 0a 20 20 20  _FixedLimit;.   
13150 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
13160 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
13170 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c  rCode(pParse, pL
13180 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 69 4c 69  imit->pLeft, iLi
13190 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  mit);.      sqli
131a0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
131b0 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69   OP_MustBeInt, i
131c0 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65  Limit); VdbeCove
131d0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56  rage(v);.      V
131e0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
131f0 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29  LIMIT counter"))
13200 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
13210 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13220 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 69  IfNot, iLimit, i
13230 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
13240 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20  rage(v);.    }. 
13250 20 20 20 69 66 28 20 70 4c 69 6d 69 74 2d 3e 70     if( pLimit->p
13260 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70  Right ){.      p
13270 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  ->iOffset = iOff
13280 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  set = ++pParse->
13290 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72  nMem;.      pPar
132a0 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a  se->nMem++;   /*
132b0 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74   Allocate an ext
132c0 72 61 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ra register for 
132d0 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a  limit+offset */.
132e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
132f0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c  rCode(pParse, pL
13300 69 6d 69 74 2d 3e 70 52 69 67 68 74 2c 20 69 4f  imit->pRight, iO
13310 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71  ffset);.      sq
13320 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
13330 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
13340 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43   iOffset); VdbeC
13350 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
13360 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
13370 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65  , "OFFSET counte
13380 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r"));.      sqli
13390 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
133a0 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c   OP_OffsetLimit,
133b0 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74   iLimit, iOffset
133c0 2b 31 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20  +1, iOffset);.  
133d0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
133e0 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45  (v, "LIMIT+OFFSE
133f0 54 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  T"));.    }.  }.
13400 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
13410 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
13420 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74  SELECT./*.** Ret
13430 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69  urn the appropri
13440 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ate collating se
13450 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69  quence for the i
13460 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
13470 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
13480 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  et for the compo
13490 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65  und-select state
134a0 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72  ment "p".  Retur
134b0 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65  n NULL if.** the
134c0 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64   column has no d
134d0 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67  efault collating
134e0 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a   sequence..**.**
134f0 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   The collating s
13500 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
13510 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
13520 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  is taken from th
13530 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74  e.** left-most t
13540 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63  erm of the selec
13550 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c  t that has a col
13560 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
13570 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53  .*/.static CollS
13580 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43  eq *multiSelectC
13590 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
135a0 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
135b0 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f   int iCol){.  Co
135c0 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69  llSeq *pRet;.  i
135d0 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
135e0 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69      pRet = multi
135f0 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
13600 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  arse, p->pPrior,
13610 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b   iCol);.  }else{
13620 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20  .    pRet = 0;. 
13630 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f   }.  assert( iCo
13640 6c 3e 3d 30 20 29 3b 0a 20 20 2f 2a 20 69 43 6f  l>=0 );.  /* iCo
13650 6c 20 6d 75 73 74 20 62 65 20 6c 65 73 73 20 74  l must be less t
13660 68 61 6e 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  han p->pEList->n
13670 45 78 70 72 2e 20 20 4f 74 68 65 72 77 69 73 65  Expr.  Otherwise
13680 20 61 6e 20 65 72 72 6f 72 20 77 6f 75 6c 64 0a   an error would.
13690 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74    ** have been t
136a0 68 72 6f 77 6e 20 64 75 72 69 6e 67 20 6e 61 6d  hrown during nam
136b0 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6e 64  e resolution and
136c0 20 77 65 20 77 6f 75 6c 64 20 6e 6f 74 20 68 61   we would not ha
136d0 76 65 20 67 6f 74 74 65 6e 0a 20 20 2a 2a 20 74  ve gotten.  ** t
136e0 68 69 73 20 66 61 72 20 2a 2f 0a 20 20 69 66 28  his far */.  if(
136f0 20 70 52 65 74 3d 3d 30 20 26 26 20 41 4c 57 41   pRet==0 && ALWA
13700 59 53 28 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73  YS(iCol<p->pELis
13710 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20  t->nExpr) ){.   
13720 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45   pRet = sqlite3E
13730 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
13740 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  e, p->pEList->a[
13750 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20  iCol].pExpr);.  
13760 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  }.  return pRet;
13770 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65  .}../*.** The se
13780 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70  lect statement p
13790 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
137a0 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
137b0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
137c0 43 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52  CT.** with an OR
137d0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 54  DER BY clause. T
137e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  his function all
137f0 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75 72  ocates and retur
13800 6e 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20  ns a KeyInfo.** 
13810 73 74 72 75 63 74 75 72 65 20 73 75 69 74 61 62  structure suitab
13820 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74  le for implement
13830 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59  ing the ORDER BY
13840 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
13850 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66   hold the KeyInf
13860 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  o structure is o
13870 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
13880 6c 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67  loc. The calling
13890 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
138a0 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
138b0 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68  ensuring that th
138c0 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20  is structure is 
138d0 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72  eventually.** fr
138e0 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b  eed..*/.static K
138f0 65 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c  eyInfo *multiSel
13900 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66  ectOrderByKeyInf
13910 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  o(Parse *pParse,
13920 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
13930 6e 45 78 74 72 61 29 7b 0a 20 20 45 78 70 72 4c  nExtra){.  ExprL
13940 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
13950 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69  p->pOrderBy;.  i
13960 6e 74 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d  nt nOrderBy = p-
13970 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
13980 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
13990 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
139a0 4b 65 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20  KeyInfo *pRet = 
139b0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
139c0 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42 79  loc(db, nOrderBy
139d0 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20 20 69  +nExtra, 1);.  i
139e0 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 69  f( pRet ){.    i
139f0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
13a00 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
13a10 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
13a20 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
13a30 2a 70 49 74 65 6d 20 3d 20 26 70 4f 72 64 65 72  *pItem = &pOrder
13a40 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  By->a[i];.      
13a50 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 49  Expr *pTerm = pI
13a60 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
13a70 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
13a80 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ;..      if( pTe
13a90 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43  rm->flags & EP_C
13aa0 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
13ab0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
13ac0 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
13ad0 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  rse, pTerm);.   
13ae0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13af0 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53    pColl = multiS
13b00 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
13b10 72 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75  rse, p, pItem->u
13b20 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31  .x.iOrderByCol-1
13b30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
13b40 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20  Coll==0 ) pColl 
13b50 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
13b60 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42  .        pOrderB
13b70 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a  y->a[i].pExpr =.
13b80 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13b90 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53  3ExprAddCollateS
13ba0 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70 54  tring(pParse, pT
13bb0 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  erm, pColl->zNam
13bc0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
13bd0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
13be0 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
13bf0 62 6c 65 28 70 52 65 74 29 20 29 3b 0a 20 20 20  ble(pRet) );.   
13c00 20 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69     pRet->aColl[i
13c10 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  ] = pColl;.     
13c20 20 70 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65   pRet->aSortOrde
13c30 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d  r[i] = pOrderBy-
13c40 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
13c50 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
13c60 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69  turn pRet;.}..#i
13c70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13c80 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73  T_CTE./*.** This
13c90 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
13ca0 65 73 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20  es VDBE code to 
13cb0 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e 74  compute the cont
13cc0 65 6e 74 20 6f 66 20 61 20 57 49 54 48 20 52 45  ent of a WITH RE
13cd0 43 55 52 53 49 56 45 0a 2a 2a 20 71 75 65 72 79  CURSIVE.** query
13ce0 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
13cf0 0a 2a 2a 20 20 20 3c 72 65 63 75 72 73 69 76 65  .**   <recursive
13d00 2d 74 61 62 6c 65 3e 20 41 53 20 28 3c 73 65 74  -table> AS (<set
13d10 75 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20  up-query> UNION 
13d20 5b 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76 65  [ALL] <recursive
13d30 2d 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20  -query>).**     
13d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d50 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
13d60 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f  /             \_
13d70 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
13d80 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
13d90 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
13da0 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20  pPrior          
13db0 20 20 20 20 20 20 20 20 20 20 20 20 70 0a 2a 2a              p.**
13dc0 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
13dd0 65 78 61 63 74 6c 79 20 6f 6e 65 20 72 65 66 65  exactly one refe
13de0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 72 65 63  rence to the rec
13df0 75 72 73 69 76 65 2d 74 61 62 6c 65 20 69 6e 20  ursive-table in 
13e00 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
13e10 2a 2a 20 6f 66 20 72 65 63 75 72 73 69 76 65 2d  ** of recursive-
13e20 71 75 65 72 79 2c 20 6d 61 72 6b 65 64 20 77 69  query, marked wi
13e30 74 68 20 74 68 65 20 53 72 63 4c 69 73 74 2d 3e  th the SrcList->
13e40 61 5b 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69  a[].fg.isRecursi
13e50 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54  ve flag..**.** T
13e60 68 65 20 73 65 74 75 70 2d 71 75 65 72 79 20 72  he setup-query r
13e70 75 6e 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65  uns once to gene
13e80 72 61 74 65 20 61 6e 20 69 6e 69 74 69 61 6c 20  rate an initial 
13e90 73 65 74 20 6f 66 20 72 6f 77 73 20 74 68 61 74  set of rows that
13ea0 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75   go.** into a Qu
13eb0 65 75 65 20 74 61 62 6c 65 2e 20 20 52 6f 77 73  eue table.  Rows
13ec0 20 61 72 65 20 65 78 74 72 61 63 74 65 64 20 66   are extracted f
13ed0 72 6f 6d 20 74 68 65 20 51 75 65 75 65 20 74 61  rom the Queue ta
13ee0 62 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e  ble one by.** on
13ef0 65 2e 20 20 45 61 63 68 20 72 6f 77 20 65 78 74  e.  Each row ext
13f00 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75  racted from Queu
13f10 65 20 69 73 20 6f 75 74 70 75 74 20 74 6f 20 70  e is output to p
13f20 44 65 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20  Dest.  Then the 
13f30 73 69 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63  single.** extrac
13f40 74 65 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20  ted row (now in 
13f50 74 68 65 20 69 43 75 72 72 65 6e 74 20 74 61 62  the iCurrent tab
13f60 6c 65 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20  le) becomes the 
13f70 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a  content of the.*
13f80 2a 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c  * recursive-tabl
13f90 65 20 66 6f 72 20 61 20 72 65 63 75 72 73 69 76  e for a recursiv
13fa0 65 2d 71 75 65 72 79 20 72 75 6e 2e 20 20 54 68  e-query run.  Th
13fb0 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20  e output of the 
13fc0 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 0a  recursive-query.
13fd0 2a 2a 20 69 73 20 61 64 64 65 64 20 62 61 63 6b  ** is added back
13fe0 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20   into the Queue 
13ff0 74 61 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f  table.  Then ano
14000 74 68 65 72 20 72 6f 77 20 69 73 20 65 78 74 72  ther row is extr
14010 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65  acted from Queue
14020 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 74 65 72  .** and the iter
14030 61 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20  ation continues 
14040 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65 20  until the Queue 
14050 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
14060 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d  **.** If the com
14070 70 6f 75 6e 64 20 71 75 65 72 79 20 6f 70 65 72  pound query oper
14080 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74 68  ator is UNION th
14090 65 6e 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 20  en no duplicate 
140a0 72 6f 77 73 20 61 72 65 20 65 76 65 72 0a 2a 2a  rows are ever.**
140b0 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74   inserted into t
140c0 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20  he Queue table. 
140d0 20 54 68 65 20 69 44 69 73 74 69 6e 63 74 20 74   The iDistinct t
140e0 61 62 6c 65 20 6b 65 65 70 73 20 61 20 63 6f 70  able keeps a cop
140f0 79 20 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a  y of all rows.**
14100 20 74 68 61 74 20 68 61 76 65 20 65 76 65 72 20   that have ever 
14110 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e  been inserted in
14120 74 6f 20 51 75 65 75 65 20 61 6e 64 20 63 61 75  to Queue and cau
14130 73 65 73 20 64 75 70 6c 69 63 61 74 65 73 20 74  ses duplicates t
14140 6f 20 62 65 0a 2a 2a 20 64 69 73 63 61 72 64 65  o be.** discarde
14150 64 2e 20 20 49 66 20 74 68 65 20 6f 70 65 72 61  d.  If the opera
14160 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c  tor is UNION ALL
14170 2c 20 74 68 65 6e 20 64 75 70 6c 69 63 61 74 65  , then duplicate
14180 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a  s are allowed..*
14190 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65  * .** If the que
141a0 72 79 20 68 61 73 20 61 6e 20 4f 52 44 45 52 20  ry has an ORDER 
141b0 42 59 2c 20 74 68 65 6e 20 65 6e 74 72 69 65 73  BY, then entries
141c0 20 69 6e 20 74 68 65 20 51 75 65 75 65 20 74 61   in the Queue ta
141d0 62 6c 65 20 61 72 65 20 6b 65 70 74 20 69 6e 0a  ble are kept in.
141e0 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65  ** ORDER BY orde
141f0 72 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  r and the first 
14200 65 6e 74 72 79 20 69 73 20 65 78 74 72 61 63 74  entry is extract
14210 65 64 20 66 6f 72 20 65 61 63 68 20 63 79 63 6c  ed for each cycl
14220 65 2e 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61  e.  Without.** a
14230 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20  n ORDER BY, the 
14240 51 75 65 75 65 20 74 61 62 6c 65 20 69 73 20 6a  Queue table is j
14250 75 73 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a  ust a FIFO..**.*
14260 2a 20 49 66 20 61 20 4c 49 4d 49 54 20 63 6c 61  * If a LIMIT cla
14270 75 73 65 20 69 73 20 70 72 6f 76 69 64 65 64 2c  use is provided,
14280 20 74 68 65 6e 20 74 68 65 20 69 74 65 72 61 74   then the iterat
14290 69 6f 6e 20 73 74 6f 70 73 20 61 66 74 65 72 20  ion stops after 
142a0 4c 49 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61  LIMIT rows.** ha
142b0 76 65 20 62 65 65 6e 20 6f 75 74 70 75 74 20 74  ve been output t
142c0 6f 20 70 44 65 73 74 2e 20 20 41 20 4c 49 4d 49  o pDest.  A LIMI
142d0 54 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20  T of zero means 
142e0 74 6f 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77  to output no row
142f0 73 20 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74  s and a.** negat
14300 69 76 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20  ive LIMIT means 
14310 74 6f 20 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f  to output all ro
14320 77 73 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  ws.  If there is
14330 20 61 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54 20   also an OFFSET 
14340 63 6c 61 75 73 65 0a 2a 2a 20 77 69 74 68 20 61  clause.** with a
14350 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2c   positive value,
14360 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
14370 4f 46 46 53 45 54 20 6f 75 74 70 75 74 73 20 61  OFFSET outputs a
14380 72 65 20 64 69 73 63 61 72 64 65 64 20 72 61 74  re discarded rat
14390 68 65 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e  her.** than bein
143a0 67 20 73 65 6e 74 20 74 6f 20 70 44 65 73 74 2e  g sent to pDest.
143b0 20 20 54 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e    The LIMIT coun
143c0 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e  t does not begin
143d0 20 75 6e 74 69 6c 20 61 66 74 65 72 20 4f 46 46   until after OFF
143e0 53 45 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65  SET.** rows have
143f0 20 62 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a   been skipped..*
14400 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
14410 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73  nerateWithRecurs
14420 69 76 65 51 75 65 72 79 28 0a 20 20 50 61 72 73  iveQuery(.  Pars
14430 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
14440 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
14450 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
14460 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
14470 2f 2a 20 54 68 65 20 72 65 63 75 72 73 69 76 65  /* The recursive
14480 20 53 45 4c 45 43 54 20 74 6f 20 62 65 20 63 6f   SELECT to be co
14490 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
144a0 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
144b0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
144c0 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
144d0 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20  */.){.  SrcList 
144e0 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b  *pSrc = p->pSrc;
144f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
14500 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
14510 72 65 63 75 72 73 69 76 65 20 71 75 65 72 79 20  recursive query 
14520 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20  */.  int nCol = 
14530 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
14540 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
14550 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
14560 65 63 75 72 73 69 76 65 20 74 61 62 6c 65 20 2a  ecursive table *
14570 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  /.  Vdbe *v = pP
14580 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
14590 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
145a0 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65  d statement unde
145b0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
145c0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 74  /.  Select *pSet
145d0 75 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20  up = p->pPrior; 
145e0 20 20 2f 2a 20 54 68 65 20 73 65 74 75 70 20 71    /* The setup q
145f0 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64  uery */.  int ad
14600 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20  drTop;          
14610 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
14620 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  f the loop */.  
14630 69 6e 74 20 61 64 64 72 43 6f 6e 74 2c 20 61 64  int addrCont, ad
14640 64 72 42 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a  drBreak;      /*
14650 20 43 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42 52   CONTINUE and BR
14660 45 41 4b 20 61 64 64 72 65 73 73 65 73 20 2a 2f  EAK addresses */
14670 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20  .  int iCurrent 
14680 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
14690 20 2f 2a 20 54 68 65 20 43 75 72 72 65 6e 74 20   /* The Current 
146a0 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72  table */.  int r
146b0 65 67 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20  egCurrent;      
146c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
146d0 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 43 75 72  ster holding Cur
146e0 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  rent table */.  
146f0 69 6e 74 20 69 51 75 65 75 65 3b 20 20 20 20 20  int iQueue;     
14700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14710 20 54 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   The Queue table
14720 20 2a 2f 0a 20 20 69 6e 74 20 69 44 69 73 74 69   */.  int iDisti
14730 6e 63 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nct = 0;        
14740 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65      /* To ensure
14750 20 75 6e 69 71 75 65 20 72 65 73 75 6c 74 73 20   unique results 
14760 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e  if UNION */.  in
14770 74 20 65 44 65 73 74 20 3d 20 53 52 54 5f 46 69  t eDest = SRT_Fi
14780 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48  fo;         /* H
14790 6f 77 20 74 6f 20 77 72 69 74 65 20 74 6f 20 51  ow to write to Q
147a0 75 65 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ueue */.  Select
147b0 44 65 73 74 20 64 65 73 74 51 75 65 75 65 3b 20  Dest destQueue; 
147c0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63          /* Selec
147d0 74 44 65 73 74 20 74 61 72 67 65 74 74 69 6e 67  tDest targetting
147e0 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
147f0 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
14800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14810 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
14820 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ter */.  int rc;
14830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14840 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
14850 20 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c   code */.  ExprL
14860 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
14870 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
14880 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
14890 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  */.  Expr *pLimi
148a0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
148b0 20 20 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49     /* Saved LIMI
148c0 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a  T and OFFSET */.
148d0 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20    int regLimit, 
148e0 72 65 67 4f 66 66 73 65 74 3b 20 20 20 20 20 20  regOffset;      
148f0 2f 2a 20 52 65 67 69 73 74 65 72 73 20 75 73 65  /* Registers use
14900 64 20 62 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f  d by LIMIT and O
14910 46 46 53 45 54 20 2a 2f 0a 0a 23 69 66 6e 64 65  FFSET */..#ifnde
14920 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
14930 4e 44 4f 57 46 55 4e 43 0a 20 20 69 66 28 20 70  NDOWFUNC.  if( p
14940 2d 3e 70 57 69 6e 20 29 7b 0a 20 20 20 20 73 71  ->pWin ){.    sq
14950 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
14960 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 75 73  arse, "cannot us
14970 65 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  e window functio
14980 6e 73 20 69 6e 20 72 65 63 75 72 73 69 76 65 20  ns in recursive 
14990 71 75 65 72 69 65 73 22 29 3b 0a 20 20 20 20 72  queries");.    r
149a0 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
149b0 66 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61  f..  /* Obtain a
149c0 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20  uthorization to 
149d0 64 6f 20 61 20 72 65 63 75 72 73 69 76 65 20 71  do a recursive q
149e0 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 73 71  uery */.  if( sq
149f0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
14a00 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45  Parse, SQLITE_RE
14a10 43 55 52 53 49 56 45 2c 20 30 2c 20 30 2c 20 30  CURSIVE, 0, 0, 0
14a20 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  ) ) return;..  /
14a30 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20 4c 49  * Process the LI
14a40 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63  MIT and OFFSET c
14a50 6c 61 75 73 65 73 2c 20 69 66 20 74 68 65 79 20  lauses, if they 
14a60 65 78 69 73 74 20 2a 2f 0a 20 20 61 64 64 72 42  exist */.  addrB
14a70 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
14a80 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
14a90 73 65 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63  se);.  p->nSelec
14aa0 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20  tRow = 320;  /* 
14ab0 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a  4 billion rows *
14ac0 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  /.  computeLimit
14ad0 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
14ae0 2c 20 70 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  , p, addrBreak);
14af0 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  .  pLimit = p->p
14b00 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4c 69 6d 69  Limit;.  regLimi
14b10 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20  t = p->iLimit;. 
14b20 20 72 65 67 4f 66 66 73 65 74 20 3d 20 70 2d 3e   regOffset = p->
14b30 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70 4c  iOffset;.  p->pL
14b40 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69  imit = 0;.  p->i
14b50 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73  Limit = p->iOffs
14b60 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65 72  et = 0;.  pOrder
14b70 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
14b80 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  ;..  /* Locate t
14b90 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
14ba0 20 6f 66 20 74 68 65 20 43 75 72 72 65 6e 74 20   of the Current 
14bb0 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69  table */.  for(i
14bc0 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 53 72  =0; ALWAYS(i<pSr
14bd0 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b 0a  c->nSrc); i++){.
14be0 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b      if( pSrc->a[
14bf0 69 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76  i].fg.isRecursiv
14c00 65 20 29 7b 0a 20 20 20 20 20 20 69 43 75 72 72  e ){.      iCurr
14c10 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d  ent = pSrc->a[i]
14c20 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  .iCursor;.      
14c30 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
14c40 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
14c50 63 75 72 73 6f 72 73 20 6e 75 6d 62 65 72 73 20  cursors numbers 
14c60 66 6f 72 20 51 75 65 75 65 20 61 6e 64 20 44 69  for Queue and Di
14c70 73 74 69 6e 63 74 2e 20 20 54 68 65 20 63 75 72  stinct.  The cur
14c80 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20  sor number for. 
14c90 20 2a 2a 20 74 68 65 20 44 69 73 74 69 6e 63 74   ** the Distinct
14ca0 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 65   table must be e
14cb0 78 61 63 74 6c 79 20 6f 6e 65 20 67 72 65 61 74  xactly one great
14cc0 65 72 20 74 68 61 6e 20 51 75 65 75 65 20 69 6e  er than Queue in
14cd0 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20   order.  ** for 
14ce0 74 68 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f  the SRT_DistFifo
14cf0 20 61 6e 64 20 53 52 54 5f 44 69 73 74 51 75 65   and SRT_DistQue
14d00 75 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 20  ue destinations 
14d10 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51  to work. */.  iQ
14d20 75 65 75 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  ueue = pParse->n
14d30 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e  Tab++;.  if( p->
14d40 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
14d50 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64      eDest = pOrd
14d60 65 72 42 79 20 3f 20 53 52 54 5f 44 69 73 74 51  erBy ? SRT_DistQ
14d70 75 65 75 65 20 3a 20 53 52 54 5f 44 69 73 74 46  ueue : SRT_DistF
14d80 69 66 6f 3b 0a 20 20 20 20 69 44 69 73 74 69 6e  ifo;.    iDistin
14d90 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
14da0 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  b++;.  }else{.  
14db0 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72    eDest = pOrder
14dc0 42 79 20 3f 20 53 52 54 5f 51 75 65 75 65 20 3a  By ? SRT_Queue :
14dd0 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20   SRT_Fifo;.  }. 
14de0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
14df0 73 74 49 6e 69 74 28 26 64 65 73 74 51 75 65 75  stInit(&destQueu
14e00 65 2c 20 65 44 65 73 74 2c 20 69 51 75 65 75 65  e, eDest, iQueue
14e10 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
14e20 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20 43 75  e cursors for Cu
14e30 72 72 65 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e  rrent, Queue, an
14e40 64 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20  d Distinct. */. 
14e50 20 72 65 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b   regCurrent = ++
14e60 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
14e70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14e80 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75  3(v, OP_OpenPseu
14e90 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20 72 65  do, iCurrent, re
14ea0 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b  gCurrent, nCol);
14eb0 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
14ec0 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  ){.    KeyInfo *
14ed0 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74 69  pKeyInfo = multi
14ee0 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79  SelectOrderByKey
14ef0 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20  Info(pParse, p, 
14f00 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
14f10 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
14f20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
14f30 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d  Queue, pOrderBy-
14f40 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20  >nExpr+2, 0,.   
14f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f60 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
14f70 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
14f80 0a 20 20 20 20 64 65 73 74 51 75 65 75 65 2e 70  .    destQueue.p
14f90 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
14fa0 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  By;.  }else{.   
14fb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14fc0 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
14fd0 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20  emeral, iQueue, 
14fe0 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62  nCol);.  }.  Vdb
14ff0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75  eComment((v, "Qu
15000 65 75 65 20 74 61 62 6c 65 22 29 29 3b 0a 20 20  eue table"));.  
15010 69 66 28 20 69 44 69 73 74 69 6e 63 74 20 29 7b  if( iDistinct ){
15020 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e  .    p->addrOpen
15030 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65  Ephm[0] = sqlite
15040 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15050 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
15060 20 69 44 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a   iDistinct, 0);.
15070 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
15080 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65  |= SF_UsesEpheme
15090 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ral;.  }..  /* D
150a0 65 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20  etach the ORDER 
150b0 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74  BY clause from t
150c0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  he compound SELE
150d0 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65  CT */.  p->pOrde
150e0 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53  rBy = 0;..  /* S
150f0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
15100 20 6f 66 20 74 68 65 20 73 65 74 75 70 2d 71 75   of the setup-qu
15110 65 72 79 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f  ery in Queue. */
15120 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74  .  pSetup->pNext
15130 20 3d 20 30 3b 0a 20 20 45 78 70 6c 61 69 6e 51   = 0;.  ExplainQ
15140 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
15150 2c 20 31 2c 20 22 53 45 54 55 50 22 29 29 3b 0a  , 1, "SETUP"));.
15160 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
15170 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
15180 74 75 70 2c 20 26 64 65 73 74 51 75 65 75 65 29  tup, &destQueue)
15190 3b 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78  ;.  pSetup->pNex
151a0 74 20 3d 20 70 3b 0a 20 20 69 66 28 20 72 63 20  t = p;.  if( rc 
151b0 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72 65  ) goto end_of_re
151c0 63 75 72 73 69 76 65 5f 71 75 65 72 79 3b 0a 0a  cursive_query;..
151d0 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 65    /* Find the ne
151e0 78 74 20 72 6f 77 20 69 6e 20 74 68 65 20 51 75  xt row in the Qu
151f0 65 75 65 20 61 6e 64 20 6f 75 74 70 75 74 20 74  eue and output t
15200 68 61 74 20 72 6f 77 20 2a 2f 0a 20 20 61 64 64  hat row */.  add
15210 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
15220 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
15230 65 77 69 6e 64 2c 20 69 51 75 65 75 65 2c 20 61  ewind, iQueue, a
15240 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43  ddrBreak); VdbeC
15250 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f  overage(v);..  /
15260 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 6e  * Transfer the n
15270 65 78 74 20 72 6f 77 20 69 6e 20 51 75 65 75 65  ext row in Queue
15280 20 6f 76 65 72 20 74 6f 20 43 75 72 72 65 6e 74   over to Current
15290 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
152a0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75  eAddOp1(v, OP_Nu
152b0 6c 6c 52 6f 77 2c 20 69 43 75 72 72 65 6e 74 29  llRow, iCurrent)
152c0 3b 20 2f 2a 20 54 6f 20 72 65 73 65 74 20 63 6f  ; /* To reset co
152d0 6c 75 6d 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20  lumn cache */.  
152e0 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
152f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15300 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
15310 6d 6e 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64  mn, iQueue, pOrd
15320 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72  erBy->nExpr+1, r
15330 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 65  egCurrent);.  }e
15340 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
15350 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15360 5f 52 6f 77 44 61 74 61 2c 20 69 51 75 65 75 65  _RowData, iQueue
15370 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20  , regCurrent);. 
15380 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
15390 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c  AddOp1(v, OP_Del
153a0 65 74 65 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20  ete, iQueue);.. 
153b0 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 73   /* Output the s
153c0 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72  ingle row in Cur
153d0 72 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 43 6f  rent */.  addrCo
153e0 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
153f0 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
15400 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28  );.  codeOffset(
15410 76 2c 20 72 65 67 4f 66 66 73 65 74 2c 20 61 64  v, regOffset, ad
15420 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c 65 63  drCont);.  selec
15430 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
15440 65 2c 20 70 2c 20 69 43 75 72 72 65 6e 74 2c 0a  e, p, iCurrent,.
15450 20 20 20 20 20 20 30 2c 20 30 2c 20 70 44 65 73        0, 0, pDes
15460 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64  t, addrCont, add
15470 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 72  rBreak);.  if( r
15480 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  egLimit ){.    s
15490 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
154a0 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a  (v, OP_DecrJumpZ
154b0 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c 20 61  ero, regLimit, a
154c0 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56  ddrBreak);.    V
154d0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
154e0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
154f0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
15500 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f   addrCont);..  /
15510 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 72 65  * Execute the re
15520 63 75 72 73 69 76 65 20 53 45 4c 45 43 54 20 74  cursive SELECT t
15530 61 6b 69 6e 67 20 74 68 65 20 73 69 6e 67 6c 65  aking the single
15540 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20   row in Current 
15550 61 73 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  as.  ** the valu
15560 65 20 66 6f 72 20 74 68 65 20 72 65 63 75 72 73  e for the recurs
15570 69 76 65 2d 74 61 62 6c 65 2e 20 53 74 6f 72 65  ive-table. Store
15580 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
15590 74 68 65 20 51 75 65 75 65 2e 0a 20 20 2a 2f 0a  the Queue..  */.
155a0 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
155b0 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
155c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
155d0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
155e0 22 72 65 63 75 72 73 69 76 65 20 61 67 67 72 65  "recursive aggre
155f0 67 61 74 65 20 71 75 65 72 69 65 73 20 6e 6f 74  gate queries not
15600 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20   supported");.  
15610 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 70 50  }else{.    p->pP
15620 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 45 78  rior = 0;.    Ex
15630 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28  plainQueryPlan((
15640 70 50 61 72 73 65 2c 20 31 2c 20 22 52 45 43 55  pParse, 1, "RECU
15650 52 53 49 56 45 20 53 54 45 50 22 29 29 3b 0a 20  RSIVE STEP"));. 
15660 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
15670 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
15680 74 51 75 65 75 65 29 3b 0a 20 20 20 20 61 73 73  tQueue);.    ass
15690 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  ert( p->pPrior==
156a0 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69  0 );.    p->pPri
156b0 6f 72 20 3d 20 70 53 65 74 75 70 3b 0a 20 20 7d  or = pSetup;.  }
156c0 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 72 75 6e 6e  ..  /* Keep runn
156d0 69 6e 67 20 74 68 65 20 6c 6f 6f 70 20 75 6e 74  ing the loop unt
156e0 69 6c 20 74 68 65 20 51 75 65 75 65 20 69 73 20  il the Queue is 
156f0 65 6d 70 74 79 20 2a 2f 0a 20 20 73 71 6c 69 74  empty */.  sqlit
15700 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64  e3VdbeGoto(v, ad
15710 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65  drTop);.  sqlite
15720 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
15730 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  l(v, addrBreak);
15740 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69  ..end_of_recursi
15750 76 65 5f 71 75 65 72 79 3a 0a 20 20 73 71 6c 69  ve_query:.  sqli
15760 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
15770 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d  e(pParse->db, p-
15780 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 2d  >pOrderBy);.  p-
15790 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
157a0 65 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69  erBy;.  p->pLimi
157b0 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 72 65  t = pLimit;.  re
157c0 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  turn;.}.#endif /
157d0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  * SQLITE_OMIT_CT
157e0 45 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  E */../* Forward
157f0 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 73   references */.s
15800 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
15810 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20  electOrderBy(.  
15820 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
15830 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
15840 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
15850 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
15860 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
15870 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
15880 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
15890 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
158a0 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
158b0 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
158c0 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a   results */.);..
158d0 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 20 74 68 65  /*.** Handle the
158e0 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66   special case of
158f0 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65   a compound-sele
15900 63 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74  ct that originat
15910 65 73 20 66 72 6f 6d 20 61 0a 2a 2a 20 56 41 4c  es from a.** VAL
15920 55 45 53 20 63 6c 61 75 73 65 2e 20 20 42 79 20  UES clause.  By 
15930 68 61 6e 64 6c 69 6e 67 20 74 68 69 73 20 61 73  handling this as
15940 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 2c   a special case,
15950 20 77 65 20 61 76 6f 69 64 20 64 65 65 70 0a 2a   we avoid deep.*
15960 2a 20 72 65 63 75 72 73 69 6f 6e 2c 20 61 6e 64  * recursion, and
15970 20 74 68 75 73 20 64 6f 20 6e 6f 74 20 6e 65 65   thus do not nee
15980 64 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 65  d to enforce the
15990 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f   SQLITE_LIMIT_CO
159a0 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2a 2a  MPOUND_SELECT.**
159b0 20 6f 6e 20 61 20 56 41 4c 55 45 53 20 63 6c 61   on a VALUES cla
159c0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 63 61 75  use..**.** Becau
159d0 73 65 20 74 68 65 20 53 65 6c 65 63 74 20 6f 62  se the Select ob
159e0 6a 65 63 74 20 6f 72 69 67 69 6e 61 74 65 73 20  ject originates 
159f0 66 72 6f 6d 20 61 20 56 41 4c 55 45 53 20 63 6c  from a VALUES cl
15a00 61 75 73 65 3a 0a 2a 2a 20 20 20 28 31 29 20 54  ause:.**   (1) T
15a10 68 65 72 65 20 69 73 20 6e 6f 20 4c 49 4d 49 54  here is no LIMIT
15a20 20 6f 72 20 4f 46 46 53 45 54 20 6f 72 20 65 6c   or OFFSET or el
15a30 73 65 20 74 68 65 72 65 20 69 73 20 61 20 4c 49  se there is a LI
15a40 4d 49 54 20 6f 66 20 65 78 61 63 74 6c 79 20 31  MIT of exactly 1
15a50 0a 2a 2a 20 20 20 28 32 29 20 41 6c 6c 20 74 65  .**   (2) All te
15a60 72 6d 73 20 61 72 65 20 55 4e 49 4f 4e 20 41 4c  rms are UNION AL
15a70 4c 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 72 65  L.**   (3) There
15a80 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
15a90 63 6c 61 75 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65  clause.**.** The
15aa0 20 22 4c 49 4d 49 54 20 6f 66 20 65 78 61 63 74   "LIMIT of exact
15ab0 6c 79 20 31 22 20 63 61 73 65 20 6f 66 20 63 6f  ly 1" case of co
15ac0 6e 64 69 74 69 6f 6e 20 28 31 29 20 63 6f 6d 65  ndition (1) come
15ad0 73 20 61 62 6f 75 74 20 77 68 65 6e 20 61 20 56  s about when a V
15ae0 41 4c 55 45 53 0a 2a 2a 20 63 6c 61 75 73 65 20  ALUES.** clause 
15af0 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 73 63  occurs within sc
15b00 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20  alar expression 
15b10 28 65 78 3a 20 22 53 45 4c 45 43 54 20 28 56 41  (ex: "SELECT (VA
15b20 4c 55 45 53 28 31 29 2c 28 32 29 2c 28 33 29 29  LUES(1),(2),(3))
15b30 22 29 2e 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  ")..** The sqlit
15b40 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 20  e3CodeSubselect 
15b50 77 69 6c 6c 20 68 61 76 65 20 61 64 64 65 64 20  will have added 
15b60 74 68 65 20 4c 49 4d 49 54 20 31 20 63 6c 61 75  the LIMIT 1 clau
15b70 73 65 20 69 6e 20 74 68 74 20 63 61 73 65 2e 0a  se in tht case..
15b80 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 6c 69 6d  ** Since the lim
15b90 69 74 20 69 73 20 65 78 61 63 74 6c 79 20 31 2c  it is exactly 1,
15ba0 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f   we only need to
15bb0 20 65 76 61 6c 75 74 65 73 20 74 68 65 20 6c 65   evalutes the le
15bc0 66 74 2d 6d 6f 73 74 20 56 41 4c 55 45 53 2e 0a  ft-most VALUES..
15bd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
15be0 6c 74 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28  ltiSelectValues(
15bf0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
15c00 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
15c10 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
15c20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
15c30 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
15c40 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
15c50 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
15c60 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
15c70 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
15c80 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
15c90 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
15ca0 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 20 3d 20 31  {.  int nRow = 1
15cb0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
15cc0 20 20 69 6e 74 20 62 53 68 6f 77 41 6c 6c 20 3d    int bShowAll =
15cd0 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 3b 0a 20   p->pLimit==0;. 
15ce0 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46   assert( p->selF
15cf0 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56  lags & SF_MultiV
15d00 61 6c 75 65 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  alue );.  do{.  
15d10 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c    assert( p->sel
15d20 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65  Flags & SF_Value
15d30 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  s );.    assert(
15d40 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c   p->op==TK_ALL |
15d50 7c 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  | (p->op==TK_SEL
15d60 45 43 54 20 26 26 20 70 2d 3e 70 50 72 69 6f 72  ECT && p->pPrior
15d70 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ==0) );.    asse
15d80 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20  rt( p->pNext==0 
15d90 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  || p->pEList->nE
15da0 78 70 72 3d 3d 70 2d 3e 70 4e 65 78 74 2d 3e 70  xpr==p->pNext->p
15db0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
15dc0 20 20 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f      if( p->pPrio
15dd0 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  r==0 ) break;.  
15de0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72    assert( p->pPr
15df0 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70 20 29 3b  ior->pNext==p );
15e00 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72 69  .    p = p->pPri
15e10 6f 72 3b 0a 20 20 20 20 6e 52 6f 77 20 2b 3d 20  or;.    nRow += 
15e20 62 53 68 6f 77 41 6c 6c 3b 0a 20 20 7d 77 68 69  bShowAll;.  }whi
15e30 6c 65 28 31 29 3b 0a 20 20 45 78 70 6c 61 69 6e  le(1);.  Explain
15e40 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
15e50 65 2c 20 30 2c 20 22 53 43 41 4e 20 25 64 20 43  e, 0, "SCAN %d C
15e60 4f 4e 53 54 41 4e 54 20 52 4f 57 25 73 22 2c 20  ONSTANT ROW%s", 
15e70 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  nRow,.          
15e80 20 20 20 20 20 20 20 20 20 20 6e 52 6f 77 3d 3d            nRow==
15e90 31 20 3f 20 22 22 20 3a 20 22 53 22 29 29 3b 0a  1 ? "" : "S"));.
15ea0 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
15eb0 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
15ec0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c  p(pParse, p, -1,
15ed0 20 30 2c 20 30 2c 20 70 44 65 73 74 2c 20 31 2c   0, 0, pDest, 1,
15ee0 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21 62 53   1);.    if( !bS
15ef0 68 6f 77 41 6c 6c 20 29 20 62 72 65 61 6b 3b 0a  howAll ) break;.
15f00 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
15f10 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 70 20  w = nRow;.    p 
15f20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
15f30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15f40 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
15f50 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
15f60 70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75  process a compou
15f70 6e 64 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72  nd query form fr
15f80 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72  om.** two or mor
15f90 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72 69  e separate queri
15fa0 65 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20  es using UNION, 
15fb0 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50  UNION ALL, EXCEP
15fc0 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45  T, or.** INTERSE
15fd0 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69  CT.**.** "p" poi
15fe0 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67 68 74  nts to the right
15ff0 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f  -most of the two
16000 20 71 75 65 72 69 65 73 2e 20 20 74 68 65 20 71   queries.  the q
16010 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c  uery on the.** l
16020 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72  eft is p->pPrior
16030 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75 65 72  .  The left quer
16040 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20  y could also be 
16050 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
16060 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73  .** in which cas
16070 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
16080 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65  ill be called re
16090 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a  cursively. .**.*
160a0 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66  * The results of
160b0 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79   the total query
160c0 20 61 72 65 20 74 6f 20 62 65 20 77 72 69 74 74   are to be writt
160d0 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e  en into a destin
160e0 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65  ation.** of type
160f0 20 65 44 65 73 74 20 77 69 74 68 20 70 61 72 61   eDest with para
16100 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a  meter iParm..**.
16110 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43  ** Example 1:  C
16120 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65 65 2d  onsider a three-
16130 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c  way compound SQL
16140 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
16150 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  *     SELECT a F
16160 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c  ROM t1 UNION SEL
16170 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e  ECT b FROM t2 UN
16180 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f  ION SELECT c FRO
16190 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  M t3.**.** This 
161a0 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72  statement is par
161b0 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77  sed up as follow
161c0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
161d0 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a  ECT c FROM t3.**
161e0 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
161f0 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20  `----->  SELECT 
16200 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20  b FROM t2.**    
16210 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
16220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16230 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54  `------>  SELECT
16240 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a   a FROM t1.**.**
16250 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74   The arrows in t
16260 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65  he diagram above
16270 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 53   represent the S
16280 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69  elect.pPrior poi
16290 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74  nter..** So if t
162a0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
162b0 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71 75  alled with p equ
162c0 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75 65  al to the t3 que
162d0 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69  ry, then.** pPri
162e0 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74  or will be the t
162f0 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20  2 query.  p->op 
16300 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e  will be TK_UNION
16310 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
16320 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74  *.** Notice that
16330 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
16340 77 61 79 20 53 51 4c 69 74 65 20 70 61 72 73 65  way SQLite parse
16350 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  s compound SELEC
16360 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  Ts, the.** indiv
16370 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c  idual selects al
16380 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20  ways group from 
16390 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a  left to right..*
163a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
163b0 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  tiSelect(.  Pars
163c0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
163d0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
163e0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
163f0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
16400 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
16410 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
16420 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
16430 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
16440 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
16450 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
16460 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ults */.){.  int
16470 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
16480 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f     /* Success co
16490 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75  de from a subrou
164a0 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tine */.  Select
164b0 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20   *pPrior;       
164c0 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
164d0 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  T immediately to
164e0 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56   our left */.  V
164f0 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
16500 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
16510 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44   code to this VD
16520 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  BE */.  SelectDe
16530 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a  st dest;      /*
16540 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74   Alternative dat
16550 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f  a destination */
16560 0a 20 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65  .  Select *pDele
16570 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69  te = 0;  /* Chai
16580 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65  n of simple sele
16590 63 74 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f  cts to delete */
165a0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
165b0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
165c0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
165d0 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  */..  /* Make su
165e0 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f  re there is no O
165f0 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54  RDER BY or LIMIT
16600 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72   clause on prior
16610 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a   SELECTs.  Only.
16620 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72    ** the last (r
16630 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43  ight-most) SELEC
16640 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20  T in the series 
16650 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45  may have an ORDE
16660 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20  R BY or LIMIT.. 
16670 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20   */.  assert( p 
16680 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20  && p->pPrior ); 
16690 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63   /* Calling func
166a0 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20  tion guarantees 
166b0 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61  this much */.  a
166c0 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c  ssert( (p->selFl
166d0 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
166e0 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d  ve)==0 || p->op=
166f0 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70  =TK_ALL || p->op
16700 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
16710 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c  assert( p->selFl
16720 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e  ags & SF_Compoun
16730 64 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  d );.  db = pPar
16740 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72 69 6f 72  se->db;.  pPrior
16750 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
16760 64 65 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20  dest = *pDest;. 
16770 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72   if( pPrior->pOr
16780 64 65 72 42 79 20 7c 7c 20 70 50 72 69 6f 72 2d  derBy || pPrior-
16790 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  >pLimit ){.    s
167a0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
167b0 50 61 72 73 65 2c 22 25 73 20 63 6c 61 75 73 65  Parse,"%s clause
167c0 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
167d0 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65  er %s not before
167e0 22 2c 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  ",.      pPrior-
167f0 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 3f 20 22  >pOrderBy!=0 ? "
16800 4f 52 44 45 52 20 42 59 22 20 3a 20 22 4c 49 4d  ORDER BY" : "LIM
16810 49 54 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d  IT", selectOpNam
16820 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
16830 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
16840 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
16850 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c  ;.  }..  v = sql
16860 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
16870 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  se);.  assert( v
16880 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56  !=0 );  /* The V
16890 44 42 45 20 61 6c 72 65 61 64 79 20 63 72 65 61  DBE already crea
168a0 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66  ted by calling f
168b0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  unction */..  /*
168c0 20 43 72 65 61 74 65 20 74 68 65 20 64 65 73 74   Create the dest
168d0 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72  ination temporar
168e0 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73  y table if neces
168f0 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20  sary.  */.  if( 
16900 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f  dest.eDest==SRT_
16910 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20  EphemTab ){.    
16920 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
16930 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t );.    sqlite3
16940 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16950 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
16960 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 70 2d  dest.iSDParm, p-
16970 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b  >pEList->nExpr);
16980 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20  .    dest.eDest 
16990 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d  = SRT_Table;.  }
169a0 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 68  ..  /* Special h
169b0 61 6e 64 6c 69 6e 67 20 66 6f 72 20 61 20 63 6f  andling for a co
169c0 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68  mpound-select th
169d0 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 61 73  at originates as
169e0 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65   a VALUES clause
169f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
16a00 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 75  selFlags & SF_Mu
16a10 6c 74 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  ltiValue ){.    
16a20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  rc = multiSelect
16a30 56 61 6c 75 65 73 28 70 50 61 72 73 65 2c 20 70  Values(pParse, p
16a40 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 67 6f  , &dest);.    go
16a50 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
16a60 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  end;.  }..  /* M
16a70 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c  ake sure all SEL
16a80 45 43 54 73 20 69 6e 20 74 68 65 20 73 74 61 74  ECTs in the stat
16a90 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20 73  ement have the s
16aa0 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  ame number of el
16ab0 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74  ements.  ** in t
16ac0 68 65 69 72 20 72 65 73 75 6c 74 20 73 65 74 73  heir result sets
16ad0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
16ae0 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50   p->pEList && pP
16af0 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  rior->pEList );.
16b00 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
16b10 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 50 72 69  ist->nExpr==pPri
16b20 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  or->pEList->nExp
16b30 72 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  r );..#ifndef SQ
16b40 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
16b50 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
16b60 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29  & SF_Recursive )
16b70 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 57 69  {.    generateWi
16b80 74 68 52 65 63 75 72 73 69 76 65 51 75 65 72 79  thRecursiveQuery
16b90 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
16ba0 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  t);.  }else.#end
16bb0 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e  if..  /* Compoun
16bc0 64 20 53 45 4c 45 43 54 73 20 74 68 61 74 20 68  d SELECTs that h
16bd0 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ave an ORDER BY 
16be0 63 6c 61 75 73 65 20 61 72 65 20 68 61 6e 64 6c  clause are handl
16bf0 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 20  ed separately.. 
16c00 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72   */.  if( p->pOr
16c10 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74  derBy ){.    ret
16c20 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  urn multiSelectO
16c30 72 64 65 72 42 79 28 70 50 61 72 73 65 2c 20 70  rderBy(pParse, p
16c40 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73  , pDest);.  }els
16c50 65 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e{..#ifndef SQLI
16c60 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
16c70 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e      if( pPrior->
16c80 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20  pPrior==0 ){.   
16c90 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50     ExplainQueryP
16ca0 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20  lan((pParse, 1, 
16cb0 22 43 4f 4d 50 4f 55 4e 44 20 51 55 45 52 59 22  "COMPOUND QUERY"
16cc0 29 29 3b 0a 20 20 20 20 20 20 45 78 70 6c 61 69  ));.      Explai
16cd0 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72  nQueryPlan((pPar
16ce0 73 65 2c 20 31 2c 20 22 4c 45 46 54 2d 4d 4f 53  se, 1, "LEFT-MOS
16cf0 54 20 53 55 42 51 55 45 52 59 22 29 29 3b 0a 20  T SUBQUERY"));. 
16d00 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
16d10 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
16d20 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61  e for the left a
16d30 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54 20  nd right SELECT 
16d40 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20  statements..    
16d50 2a 2f 0a 20 20 20 20 73 77 69 74 63 68 28 20 70  */.    switch( p
16d60 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 63 61  ->op ){.      ca
16d70 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20  se TK_ALL: {.   
16d80 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
16d90 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  0;.        int n
16da0 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 61  Limit;.        a
16db0 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e  ssert( !pPrior->
16dc0 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20  pLimit );.      
16dd0 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74    pPrior->iLimit
16de0 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20   = p->iLimit;.  
16df0 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4f        pPrior->iO
16e00 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73  ffset = p->iOffs
16e10 65 74 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69  et;.        pPri
16e20 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e  or->pLimit = p->
16e30 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  pLimit;.        
16e40 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
16e50 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
16e60 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  r, &dest);.     
16e70 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
16e80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
16e90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
16ea0 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
16eb0 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
16ec0 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
16ed0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 0;.        p-
16ee0 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72  >iLimit = pPrior
16ef0 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->iLimit;.      
16f00 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70    p->iOffset = p
16f10 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a  Prior->iOffset;.
16f20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69          if( p->i
16f30 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  Limit ){.       
16f40 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
16f50 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
16f60 50 5f 49 66 4e 6f 74 2c 20 70 2d 3e 69 4c 69 6d  P_IfNot, p->iLim
16f70 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  it); VdbeCoverag
16f80 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
16f90 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
16fa0 22 4a 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c  "Jump ahead if L
16fb0 49 4d 49 54 20 72 65 61 63 68 65 64 22 29 29 3b  IMIT reached"));
16fc0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
16fd0 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->iOffset ){.   
16fe0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16ff0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
17000 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c 0a 20 20  _OffsetLimit,.  
17010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17020 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69              p->i
17030 4c 69 6d 69 74 2c 20 70 2d 3e 69 4f 66 66 73 65  Limit, p->iOffse
17040 74 2b 31 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29  t+1, p->iOffset)
17050 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
17060 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17070 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
17080 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 55 4e  ((pParse, 1, "UN
17090 49 4f 4e 20 41 4c 4c 22 29 29 3b 0a 20 20 20 20  ION ALL"));.    
170a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
170b0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
170c0 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
170d0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
170e0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
170f0 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
17100 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
17110 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
17120 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 2d  rior;.        p-
17130 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71  >nSelectRow = sq
17140 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70  lite3LogEstAdd(p
17150 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70 50  ->nSelectRow, pP
17160 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
17170 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
17180 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a 20 20  Prior->pLimit.  
17190 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
171a0 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
171b0 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2d 3e 70  Prior->pLimit->p
171c0 4c 65 66 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20  Left, &nLimit). 
171d0 20 20 20 20 20 20 20 20 26 26 20 6e 4c 69 6d 69          && nLimi
171e0 74 3e 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63  t>0 && p->nSelec
171f0 74 52 6f 77 20 3e 20 73 71 6c 69 74 65 33 4c 6f  tRow > sqlite3Lo
17200 67 45 73 74 28 28 75 36 34 29 6e 4c 69 6d 69 74  gEst((u64)nLimit
17210 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  ) .        ){.  
17220 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65          p->nSele
17230 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c  ctRow = sqlite3L
17240 6f 67 45 73 74 28 28 75 36 34 29 6e 4c 69 6d 69  ogEst((u64)nLimi
17250 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
17260 20 20 20 20 20 20 69 66 28 20 61 64 64 72 20 29        if( addr )
17270 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
17280 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
17290 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20  v, addr);.      
172a0 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
172b0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
172c0 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
172d0 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 55  .      case TK_U
172e0 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 20 20  NION: {.        
172f0 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20  int unionTab;   
17300 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
17310 72 20 6f 66 20 74 68 65 20 74 65 6d 70 20 74 61  r of the temp ta
17320 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75  ble holding resu
17330 6c 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 38  lt */.        u8
17340 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f   op = 0;       /
17350 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54  * One of the SRT
17360 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  _ operations to 
17370 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f  apply to self */
17380 0a 20 20 20 20 20 20 20 20 69 6e 74 20 70 72 69  .        int pri
17390 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  orOp;     /* The
173a0 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20   SRT_ operation 
173b0 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f  to apply to prio
173c0 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20  r selects */.   
173d0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
173e0 74 3b 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76  t;    /* Saved v
173f0 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d  alues of p->nLim
17400 69 74 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  it  */.        i
17410 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20  nt addr;.       
17420 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69 6f   SelectDest unio
17430 6e 64 65 73 74 3b 0a 20 20 0a 20 20 20 20 20 20  ndest;.  .      
17440 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f    testcase( p->o
17450 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 3b 0a  p==TK_EXCEPT );.
17460 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
17470 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
17480 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 72 69  N );.        pri
17490 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e  orOp = SRT_Union
174a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 65  ;.        if( de
174b0 73 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f  st.eDest==priorO
174c0 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  p ){.          /
174d0 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61  * We can reuse a
174e0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
174f0 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20   generated by a 
17500 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20  SELECT to our.  
17510 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74          ** right
17520 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
17530 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
17540 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b   p->pLimit==0 );
17550 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c        /* Not all
17560 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64  owed on leftward
17570 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20   elements */.   
17580 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
17590 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a  = dest.iSDParm;.
175a0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
175b0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77           /* We w
175c0 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61  ill need to crea
175d0 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f  te our own tempo
175e0 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f  rary table to ho
175f0 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  ld the.         
17600 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65   ** intermediate
17610 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20   results..      
17620 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
17630 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72   unionTab = pPar
17640 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
17650 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
17660 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
17670 20 20 20 20 20 20 20 20 20 20 61 64 64 72 20 3d            addr =
17680 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17690 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
176a0 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62  emeral, unionTab
176b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
176c0 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
176d0 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31  penEphm[0] == -1
176e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   );.          p-
176f0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
17700 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20   = addr;.       
17710 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74     findRightmost
17720 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  (p)->selFlags |=
17730 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
17740 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  l;.          ass
17750 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
17760 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20  ;.        }.  . 
17770 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74         /* Code t
17780 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
17790 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ents to our left
177a0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
177b0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72      assert( !pPr
177c0 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b  ior->pOrderBy );
177d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
177e0 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
177f0 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72  uniondest, prior
17800 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20  Op, unionTab);. 
17810 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
17820 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
17830 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e  , pPrior, &union
17840 64 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 69  dest);.        i
17850 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
17860 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
17870 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
17880 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f    }.  .        /
17890 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
178a0 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nt SELECT statem
178b0 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ent.        */. 
178c0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70         if( p->op
178d0 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20  ==TK_EXCEPT ){. 
178e0 20 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52           op = SR
178f0 54 5f 45 78 63 65 70 74 3b 0a 20 20 20 20 20 20  T_Except;.      
17900 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17910 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
17920 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
17930 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54          op = SRT
17940 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  _Union;.        
17950 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72  }.        p->pPr
17960 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ior = 0;.       
17970 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69   pLimit = p->pLi
17980 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  mit;.        p->
17990 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
179a0 20 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44      uniondest.eD
179b0 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20  est = op;.      
179c0 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
179d0 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22  an((pParse, 1, "
179e0 25 73 20 55 53 49 4e 47 20 54 45 4d 50 20 42 2d  %s USING TEMP B-
179f0 54 52 45 45 22 2c 0a 20 20 20 20 20 20 20 20 20  TREE",.         
17a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a10 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
17a20 3e 6f 70 29 29 29 3b 0a 20 20 20 20 20 20 20 20  >op)));.        
17a30 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
17a40 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75  ct(pParse, p, &u
17a50 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20  niondest);.     
17a60 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
17a70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
17a80 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66        /* Query f
17a90 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c  lattening in sql
17aa0 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67  ite3Select() mig
17ab0 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72  ht refill p->pOr
17ac0 64 65 72 42 79 2e 0a 20 20 20 20 20 20 20 20 2a  derBy..        *
17ad0 2a 20 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c  * Be sure to del
17ae0 65 74 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ete p->pOrderBy,
17af0 20 74 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61   therefore, to a
17b00 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65  void a memory le
17b10 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  ak. */.        s
17b20 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
17b30 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64  lete(db, p->pOrd
17b40 65 72 42 79 29 3b 0a 20 20 20 20 20 20 20 20 70  erBy);.        p
17b50 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69  Delete = p->pPri
17b60 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  or;.        p->p
17b70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
17b80 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65          p->pOrde
17b90 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rBy = 0;.       
17ba0 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55   if( p->op==TK_U
17bb0 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  NION ){.        
17bc0 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
17bd0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
17be0 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  dd(p->nSelectRow
17bf0 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  , pPrior->nSelec
17c00 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 7d  tRow);.        }
17c10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17c20 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
17c30 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->pLimit);.     
17c40 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
17c50 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70  Limit;.        p
17c60 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
17c70 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
17c80 20 3d 20 30 3b 0a 20 20 0a 20 20 20 20 20 20 20   = 0;.  .       
17c90 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
17ca0 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70  data in the temp
17cb0 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f  orary table into
17cc0 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20   whatever form. 
17cd0 20 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20         ** it is 
17ce0 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c  that we currentl
17cf0 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 20 20  y need..        
17d00 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
17d10 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65 73  t( unionTab==des
17d20 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64 65 73  t.iSDParm || des
17d30 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70  t.eDest!=priorOp
17d40 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
17d50 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f  dest.eDest!=prio
17d60 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rOp ){.         
17d70 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65   int iCont, iBre
17d80 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20  ak, iStart;.    
17d90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
17da0 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
17db0 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
17dc0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
17dd0 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
17de0 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71        iCont = sq
17df0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
17e00 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
17e10 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
17e20 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
17e30 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
17e40 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17e50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17e60 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54  P_Rewind, unionT
17e70 61 62 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  ab, iBreak); Vdb
17e80 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
17e90 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
17ea0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
17eb0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
17ec0 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
17ed0 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
17ee0 20 75 6e 69 6f 6e 54 61 62 2c 0a 20 20 20 20 20   unionTab,.     
17ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f00 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74       0, 0, &dest
17f10 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29  , iCont, iBreak)
17f20 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
17f30 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
17f40 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
17f50 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17f60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17f70 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c  _Next, unionTab,
17f80 20 69 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f   iStart); VdbeCo
17f90 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
17fa0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17fb0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
17fc0 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
17fd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17fe0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
17ff0 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
18000 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18010 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
18020 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
18030 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54  assert( p->op==T
18040 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b 20 7b  K_INTERSECT ); {
18050 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62  .        int tab
18060 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 20  1, tab2;.       
18070 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65   int iCont, iBre
18080 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20  ak, iStart;.    
18090 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
180a0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  ;.        int ad
180b0 64 72 3b 0a 20 20 20 20 20 20 20 20 53 65 6c 65  dr;.        Sele
180c0 63 74 44 65 73 74 20 69 6e 74 65 72 73 65 63 74  ctDest intersect
180d0 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20 69 6e  dest;.        in
180e0 74 20 72 31 3b 0a 20 20 0a 20 20 20 20 20 20 20  t r1;.  .       
180f0 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73   /* INTERSECT is
18100 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
18110 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65  the others since
18120 20 69 74 20 72 65 71 75 69 72 65 73 0a 20 20 20   it requires.   
18130 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70       ** two temp
18140 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48  orary tables.  H
18150 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73 20  ence it has its 
18160 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e  own case.  Begin
18170 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20 61  .        ** by a
18180 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61  llocating the ta
18190 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65  bles we will nee
181a0 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
181b0 20 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61        tab1 = pPa
181c0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
181d0 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61 72       tab2 = pPar
181e0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
181f0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
18200 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
18210 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
18220 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18230 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
18240 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b  meral, tab1, 0);
18250 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
18260 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
18270 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [0] == -1 );.   
18280 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
18290 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
182a0 20 20 20 20 20 20 20 20 66 69 6e 64 52 69 67 68          findRigh
182b0 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61  tmost(p)->selFla
182c0 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68  gs |= SF_UsesEph
182d0 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20  emeral;.        
182e0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
182f0 74 20 29 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  t );.  .        
18300 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45  /* Code the SELE
18310 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  CTs to our left 
18320 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
18330 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20  able "tab1"..   
18340 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
18350 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
18360 74 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63 74  tInit(&intersect
18370 64 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c  dest, SRT_Union,
18380 20 74 61 62 31 29 3b 0a 20 20 20 20 20 20 20 20   tab1);.        
18390 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
183a0 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
183b0 72 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73  r, &intersectdes
183c0 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
183d0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
183e0 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
183f0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
18400 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  .  .        /* C
18410 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ode the current 
18420 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70  SELECT into temp
18430 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62  orary table "tab
18440 32 22 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  2".        */.  
18450 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
18460 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18470 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
18480 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  al, tab2, 0);.  
18490 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
184a0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
184b0 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
184c0 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
184d0 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[1] = addr;.   
184e0 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
184f0 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 6d   0;.        pLim
18500 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
18510 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69          p->pLimi
18520 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  t = 0;.        i
18530 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69 53 44  ntersectdest.iSD
18540 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20  Parm = tab2;.   
18550 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72       ExplainQuer
18560 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31  yPlan((pParse, 1
18570 2c 20 22 25 73 20 55 53 49 4e 47 20 54 45 4d 50  , "%s USING TEMP
18580 20 42 2d 54 52 45 45 22 2c 0a 20 20 20 20 20 20   B-TREE",.      
18590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185a0 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
185b0 28 70 2d 3e 6f 70 29 29 29 3b 0a 20 20 20 20 20  (p->op)));.     
185c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
185d0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
185e0 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29   &intersectdest)
185f0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
18600 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
18610 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65  K );.        pDe
18620 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72  lete = p->pPrior
18630 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72  ;.        p->pPr
18640 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
18650 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65        if( p->nSe
18660 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d 3e  lectRow>pPrior->
18670 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20  nSelectRow ){.  
18680 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65          p->nSele
18690 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e  ctRow = pPrior->
186a0 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
186b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
186c0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
186d0 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
186e0 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69          p->pLimi
186f0 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 0a 20  t = pLimit;.  . 
18700 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
18710 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20  te code to take 
18720 74 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e  the intersection
18730 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70   of the two temp
18740 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a  orary.        **
18750 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 20   tables..       
18760 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
18770 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
18780 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20  .        iBreak 
18790 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
187a0 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
187b0 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20          iCont = 
187c0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
187d0 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  abel(pParse);.  
187e0 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
187f0 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
18800 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
18810 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18820 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18830 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42  Rewind, tab1, iB
18840 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
18850 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
18860 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
18870 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
18880 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
18890 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
188a0 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61  p2(v, OP_RowData
188b0 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20  , tab1, r1);.   
188c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
188d0 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
188e0 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20  NotFound, tab2, 
188f0 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b 0a 20  iCont, r1, 0);. 
18900 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
18910 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
18920 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
18930 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
18940 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63  );.        selec
18950 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
18960 65 2c 20 70 2c 20 74 61 62 31 2c 0a 20 20 20 20  e, p, tab1,.    
18970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18980 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c      0, 0, &dest,
18990 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b   iCont, iBreak);
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 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
189d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
189e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
189f0 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b  , tab1, iStart);
18a00 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
18a10 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18a20 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
18a30 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
18a40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18a50 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
18a60 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ose, tab2, 0);. 
18a70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
18a80 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
18a90 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a  lose, tab1, 0);.
18aa0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
18ab0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
18ac0 20 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45    #ifndef SQLITE
18ad0 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
18ae0 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 3d 3d    if( p->pNext==
18af0 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 6c 61  0 ){.      Expla
18b00 69 6e 51 75 65 72 79 50 6c 61 6e 50 6f 70 28 70  inQueryPlanPop(p
18b10 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Parse);.    }.  
18b20 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20  #endif.  }.  .  
18b30 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61  /* Compute colla
18b40 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75  ting sequences u
18b50 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d  sed by .  ** tem
18b60 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65  porary tables ne
18b70 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  eded to implemen
18b80 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  t the compound s
18b90 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61  elect..  ** Atta
18ba0 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ch the KeyInfo s
18bb0 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20  tructure to all 
18bc0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
18bd0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
18be0 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20   section is run 
18bf0 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  by the right-mos
18c00 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
18c10 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45  nt only..  ** SE
18c20 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
18c30 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61  to the left alwa
18c40 79 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  ys skip this par
18c50 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  t.  The right-mo
18c60 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d  st.  ** SELECT m
18c70 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74  ight also skip t
18c80 68 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68  his part if it h
18c90 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  as no ORDER BY c
18ca0 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e  lause and.  ** n
18cb0 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72  o temp tables ar
18cc0 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f  e required..  */
18cd0 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
18ce0 67 73 20 26 20 53 46 5f 55 73 65 73 45 70 68 65  gs & SF_UsesEphe
18cf0 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  meral ){.    int
18d00 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
18d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
18d20 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
18d30 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
18d40 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  nfo;            
18d50 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
18d60 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65  uence for the re
18d70 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20  sult set */.    
18d80 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20  Select *pLoop;  
18d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18da0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
18db0 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74  ough SELECT stat
18dc0 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f  ements */.    Co
18dd0 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20  llSeq **apColl; 
18de0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
18df0 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
18e00 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  gh pKeyInfo->aCo
18e10 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ll[] */.    int 
18e20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
18e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
18e40 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
18e50 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  n result set */.
18e60 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
18e70 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pNext==0 );.    
18e80 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74  nCol = p->pEList
18e90 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65  ->nExpr;.    pKe
18ea0 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
18eb0 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20  eyInfoAlloc(db, 
18ec0 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66  nCol, 1);.    if
18ed0 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  ( !pKeyInfo ){. 
18ee0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
18ef0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
18f00 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
18f10 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
18f20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43      for(i=0, apC
18f30 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  oll=pKeyInfo->aC
18f40 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  oll; i<nCol; i++
18f50 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20  , apColl++){.   
18f60 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c     *apColl = mul
18f70 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
18f80 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
18f90 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43       if( 0==*apC
18fa0 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  oll ){.        *
18fb0 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66  apColl = db->pDf
18fc0 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
18fd0 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70      }..    for(p
18fe0 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
18ff0 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
19000 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  or){.      for(i
19010 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
19020 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
19030 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  = pLoop->addrOpe
19040 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20  nEphm[i];.      
19050 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
19060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
19070 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68  [0] is unused th
19080 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75  en [1] is also u
19090 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61  nused.  So we ca
190a0 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  n.          ** a
190b0 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f  lways safely abo
190c0 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  rt as soon as th
190d0 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73  e first unused s
190e0 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a  lot is found */.
190f0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
19100 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  ( pLoop->addrOpe
19110 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20  nEphm[1]<0 );.  
19120 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
19130 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
19140 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
19150 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43  geP2(v, addr, nC
19160 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
19170 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
19180 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a  (v, addr, (char*
19190 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  )sqlite3KeyInfoR
191a0 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 0a 20 20  ef(pKeyInfo),.  
191b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191c0 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59            P4_KEY
191d0 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70  INFO);.        p
191e0 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
191f0 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20  hm[i] = -1;.    
19200 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
19210 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
19220 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d  f(pKeyInfo);.  }
19230 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  ..multi_select_e
19240 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53 64  nd:.  pDest->iSd
19250 73 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b  st = dest.iSdst;
19260 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20  .  pDest->nSdst 
19270 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20  = dest.nSdst;.  
19280 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
19290 65 74 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29  ete(db, pDelete)
192a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
192b0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
192c0 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
192d0 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SELECT */../*.**
192e0 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   Error message f
192f0 6f 72 20 77 68 65 6e 20 74 77 6f 20 6f 72 20 6d  or when two or m
19300 6f 72 65 20 74 65 72 6d 73 20 6f 66 20 61 20 63  ore terms of a c
19310 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 68  ompound select h
19320 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  ave different.**
19330 20 73 69 7a 65 20 72 65 73 75 6c 74 20 73 65 74   size result set
19340 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
19350 65 33 53 65 6c 65 63 74 57 72 6f 6e 67 4e 75 6d  e3SelectWrongNum
19360 54 65 72 6d 73 45 72 72 6f 72 28 50 61 72 73 65  TermsError(Parse
19370 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
19380 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73   *p){.  if( p->s
19390 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c  elFlags & SF_Val
193a0 75 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ues ){.    sqlit
193b0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
193c0 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d  e, "all VALUES m
193d0 75 73 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  ust have the sam
193e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  e number of term
193f0 73 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  s");.  }else{.  
19400 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
19410 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43  g(pParse, "SELEC
19420 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61  Ts to the left a
19430 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a  nd right of %s".
19440 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68        " do not h
19450 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
19460 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
19470 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70  lumns", selectOp
19480 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
19490 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  }.}../*.** Code 
194a0 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  an output subrou
194b0 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75  tine for a corou
194c0 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tine implementat
194d0 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45  ion of a.** SELE
194e0 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a  CT statment..**.
194f0 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20 62  ** The data to b
19500 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74  e output is cont
19510 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53  ained in pIn->iS
19520 64 73 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a  dst.  There are.
19530 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f  ** pIn->nSdst co
19540 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70  lumns to be outp
19550 75 74 2e 20 20 70 44 65 73 74 20 69 73 20 77 68  ut.  pDest is wh
19560 65 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 73  ere the output s
19570 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74  hould.** be sent
19580 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72  ..**.** regRetur
19590 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
195a0 6f 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20  of the register 
195b0 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72  holding the subr
195c0 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
195d0 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
195e0 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65  If regPrev>0 the
195f0 6e 20 69 74 20 69 73 20 74 68 65 20 66 69 72 73  n it is the firs
19600 74 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20  t register in a 
19610 76 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72  vector that.** r
19620 65 63 6f 72 64 73 20 74 68 65 20 70 72 65 76 69  ecords the previ
19630 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d  ous output.  mem
19640 5b 72 65 67 50 72 65 76 5d 20 69 73 20 61 20 66  [regPrev] is a f
19650 6c 61 67 20 74 68 61 74 20 69 73 20 66 61 6c 73  lag that is fals
19660 65 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61  e.** if there ha
19670 73 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f  s been no previo
19680 75 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72  us output.  If r
19690 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f  egPrev>0 then co
196a0 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74  de is.** generat
196b0 65 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 64  ed to suppress d
196c0 75 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79  uplicates.  pKey
196d0 49 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72  Info is used for
196e0 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65   comparing.** ke
196f0 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ys..**.** If the
19700 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20   LIMIT found in 
19710 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61  p->iLimit is rea
19720 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64  ched, jump immed
19730 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72  iately to.** iBr
19740 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  eak..*/.static i
19750 6e 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75  nt generateOutpu
19760 74 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50  tSubroutine(.  P
19770 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
19780 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
19790 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
197a0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
197b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
197c0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
197d0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
197e0 70 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  pIn,        /* C
197f0 6f 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69  oroutine supplyi
19800 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c  ng data */.  Sel
19810 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
19820 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
19830 20 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a   send the data *
19840 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72  /.  int regRetur
19850 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  n,          /* T
19860 68 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  he return addres
19870 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  s register */.  
19880 69 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20 20  int regPrev,    
19890 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69          /* Previ
198a0 6f 75 73 20 72 65 73 75 6c 74 20 72 65 67 69 73  ous result regis
198b0 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e  ter.  No uniquen
198c0 65 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65  ess if 0 */.  Ke
198d0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
198e0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d        /* For com
198f0 70 61 72 69 6e 67 20 77 69 74 68 20 70 72 65 76  paring with prev
19900 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ious entry */.  
19910 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20  int iBreak      
19920 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
19930 68 65 72 65 20 69 66 20 77 65 20 68 69 74 20 74  here if we hit t
19940 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20  he LIMIT */.){. 
19950 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
19960 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
19970 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74  iContinue;.  int
19980 20 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d   addr;..  addr =
19990 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
199a0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43  entAddr(v);.  iC
199b0 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
199c0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
199d0 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 53 75  Parse);..  /* Su
199e0 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65  ppress duplicate
199f0 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58 43  s for UNION, EXC
19a00 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45  EPT, and INTERSE
19a10 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  CT .  */.  if( r
19a20 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20 69 6e  egPrev ){.    in
19a30 74 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a  t addr1, addr2;.
19a40 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
19a50 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
19a60 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72   OP_IfNot, regPr
19a70 65 76 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ev); VdbeCoverag
19a80 65 28 76 29 3b 0a 20 20 20 20 61 64 64 72 32 20  e(v);.    addr2 
19a90 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
19aa0 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72  Op4(v, OP_Compar
19ab0 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72  e, pIn->iSdst, r
19ac0 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e  egPrev+1, pIn->n
19ad0 53 64 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Sdst,.          
19ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19af0 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74      (char*)sqlit
19b00 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65  e3KeyInfoRef(pKe
19b10 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e  yInfo), P4_KEYIN
19b20 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  FO);.    sqlite3
19b30 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
19b40 5f 4a 75 6d 70 2c 20 61 64 64 72 32 2b 32 2c 20  _Jump, addr2+2, 
19b50 69 43 6f 6e 74 69 6e 75 65 2c 20 61 64 64 72 32  iContinue, addr2
19b60 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +2); VdbeCoverag
19b70 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
19b80 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
19b90 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c   addr1);.    sql
19ba0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
19bb0 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49 6e 2d 3e  , OP_Copy, pIn->
19bc0 69 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31  iSdst, regPrev+1
19bd0 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d 31 29 3b  , pIn->nSdst-1);
19be0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19bf0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
19c00 65 67 65 72 2c 20 31 2c 20 72 65 67 50 72 65 76  eger, 1, regPrev
19c10 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
19c20 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
19c30 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30  ailed ) return 0
19c40 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73  ;..  /* Suppress
19c50 20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45   the first OFFSE
19c60 54 20 65 6e 74 72 69 65 73 20 69 66 20 74 68 65  T entries if the
19c70 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54 20  re is an OFFSET 
19c80 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f  clause.  */.  co
19c90 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69  deOffset(v, p->i
19ca0 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75  Offset, iContinu
19cb0 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  e);..  assert( p
19cc0 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54  Dest->eDest!=SRT
19cd0 5f 45 78 69 73 74 73 20 29 3b 0a 20 20 61 73 73  _Exists );.  ass
19ce0 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73  ert( pDest->eDes
19cf0 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a  t!=SRT_Table );.
19d00 20 20 73 77 69 74 63 68 28 20 70 44 65 73 74 2d    switch( pDest-
19d10 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a  >eDest ){.    /*
19d20 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
19d30 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20  t as data using 
19d40 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20  a unique key..  
19d50 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
19d60 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20  T_EphemTab: {.  
19d70 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
19d80 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
19d90 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e  Parse);.      in
19da0 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65  t r2 = sqlite3Ge
19db0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
19dc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
19dd0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
19de0 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d  MakeRecord, pIn-
19df0 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
19e00 73 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  st, r1);.      s
19e10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19e20 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
19e30 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c   pDest->iSDParm,
19e40 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r2);.      sqli
19e50 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
19e60 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44 65 73   OP_Insert, pDes
19e70 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c 20  t->iSDParm, r1, 
19e80 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r2);.      sqlit
19e90 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
19ea0 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
19eb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
19ec0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
19ed0 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  arse, r2);.     
19ee0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
19ef0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
19f00 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
19f10 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  .    }..#ifndef 
19f20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
19f30 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77  UERY.    /* If w
19f40 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61  e are creating a
19f50 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70   set for an "exp
19f60 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
19f70 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  )"..    */.    c
19f80 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
19f90 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20       int r1;.   
19fa0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 49 6e     testcase( pIn
19fb0 2d 3e 6e 53 64 73 74 3e 31 20 29 3b 0a 20 20 20  ->nSdst>1 );.   
19fc0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
19fd0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
19fe0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19ff0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1a000 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e  _MakeRecord, pIn
1a010 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
1a020 64 73 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  dst, .          
1a030 72 31 2c 20 70 44 65 73 74 2d 3e 7a 41 66 66 53  r1, pDest->zAffS
1a040 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
1a050 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1a060 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
1a070 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44  OP_IdxInsert, pD
1a080 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31  est->iSDParm, r1
1a090 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
1a0b0 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
1a0c0 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dst);.      sqli
1a0d0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1a0e0 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
1a0f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a100 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
1a110 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65  s is a scalar se
1a120 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72  lect that is par
1a130 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
1a140 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
1a150 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
1a160 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72  s in the appropr
1a170 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iate memory cell
1a180 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20   and break out. 
1a190 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61     ** of the sca
1a1a0 6e 20 6c 6f 6f 70 2e 20 20 4e 6f 74 65 20 74 68  n loop.  Note th
1a1b0 61 74 20 74 68 65 20 73 65 6c 65 63 74 20 6d 69  at the select mi
1a1c0 67 68 74 20 72 65 74 75 72 6e 20 6d 75 6c 74 69  ght return multi
1a1d0 70 6c 65 20 63 6f 6c 75 6d 6e 73 0a 20 20 20 20  ple columns.    
1a1e0 2a 2a 20 69 66 20 69 74 20 69 73 20 74 68 65 20  ** if it is the 
1a1f0 52 48 53 20 6f 66 20 61 20 72 6f 77 2d 76 61 6c  RHS of a row-val
1a200 75 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a  ue IN operator..
1a210 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1a220 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
1a230 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
1a240 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r==0 ){.        
1a250 74 65 73 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e  testcase( pIn->n
1a260 53 64 73 74 3e 31 20 29 3b 0a 20 20 20 20 20 20  Sdst>1 );.      
1a270 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1a280 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49  eMove(pParse, pI
1a290 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d  n->iSdst, pDest-
1a2a0 3e 69 53 44 50 61 72 6d 2c 20 70 49 6e 2d 3e 6e  >iSDParm, pIn->n
1a2b0 53 64 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Sdst);.      }. 
1a2c0 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
1a2d0 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75  T clause will ju
1a2e0 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f  mp out of the lo
1a2f0 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
1a300 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1a310 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
1a320 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
1a330 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f  BQUERY */..    /
1a340 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72  * The results ar
1a350 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65  e stored in a se
1a360 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
1a370 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  ers.    ** start
1a380 69 6e 67 20 61 74 20 70 44 65 73 74 2d 3e 69 53  ing at pDest->iS
1a390 64 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 63  dst.  Then the c
1a3a0 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73  o-routine yields
1a3b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1a3c0 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a  e SRT_Coroutine:
1a3d0 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65   {.      if( pDe
1a3e0 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a  st->iSdst==0 ){.
1a3f0 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69          pDest->i
1a400 53 64 73 74 20 3d 20 73 71 6c 69 74 65 33 47 65  Sdst = sqlite3Ge
1a410 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
1a420 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  e, pIn->nSdst);.
1a430 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e          pDest->n
1a440 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73  Sdst = pIn->nSds
1a450 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
1a460 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1a470 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
1a480 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e  ->iSdst, pDest->
1a490 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
1a4a0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1a4b0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
1a4c0 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
1a4d0 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
1a4e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1a4f0 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20    /* If none of 
1a500 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  the above, then 
1a510 74 68 65 20 72 65 73 75 6c 74 20 64 65 73 74 69  the result desti
1a520 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20  nation must be. 
1a530 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74     ** SRT_Output
1a540 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
1a550 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
1a560 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20  with any other. 
1a570 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f     ** destinatio
1a580 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  n other than the
1a590 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62   ones handled ab
1a5a0 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75  ove or SRT_Outpu
1a5b0 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
1a5c0 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c   For SRT_Output,
1a5d0 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
1a5e0 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63  red in a sequenc
1a5f0 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20  e of registers. 
1a600 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68   .    ** Then th
1a610 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f  e OP_ResultRow o
1a620 70 63 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f  pcode is used to
1a630 20 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73   cause sqlite3_s
1a640 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20  tep() to.    ** 
1a650 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20  return the next 
1a660 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20  row of result.. 
1a670 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
1a680 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
1a690 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  t( pDest->eDest=
1a6a0 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
1a6b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1a6c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
1a6d0 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64  ultRow, pIn->iSd
1a6e0 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
1a6f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1a700 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75    }.  }..  /* Ju
1a710 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
1a720 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65   the loop if the
1a730 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65   LIMIT is reache
1a740 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
1a750 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  >iLimit ){.    s
1a760 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a770 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a  (v, OP_DecrJumpZ
1a780 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
1a790 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  iBreak); VdbeCov
1a7a0 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20  erage(v);.  }.. 
1a7b0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
1a7c0 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75   subroutine retu
1a7d0 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rn.  */.  sqlite
1a7e0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1a7f0 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  l(v, iContinue);
1a800 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1a810 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
1a820 6e 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a  n, regReturn);..
1a830 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
1a840 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74  ../*.** Alternat
1a850 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  ive compound sel
1a860 65 63 74 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ect code generat
1a870 6f 72 20 66 6f 72 20 63 61 73 65 73 20 77 68 65  or for cases whe
1a880 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e  n there.** is an
1a890 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1a8a0 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d  ..**.** We assum
1a8b0 65 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65  e a query of the
1a8c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a   following form:
1a8d0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c  .**.**      <sel
1a8e0 65 63 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72  ectA>  <operator
1a8f0 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52  >  <selectB>  OR
1a900 44 45 52 20 42 59 20 3c 6f 72 64 65 72 62 79 6c  DER BY <orderbyl
1a910 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72  ist>.**.** <oper
1a920 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20  ator> is one of 
1a930 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e  UNION ALL, UNION
1a940 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54  , EXCEPT, or INT
1a950 45 52 53 45 43 54 2e 20 20 54 68 65 20 69 64 65  ERSECT.  The ide
1a960 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65 20  a.** is to code 
1a970 62 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e 20 61  both <selectA> a
1a980 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20 77 69 74  nd <selectB> wit
1a990 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  h the ORDER BY c
1a9a0 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72  lause as.** co-r
1a9b0 6f 75 74 69 6e 65 73 2e 20 20 54 68 65 6e 20 72  outines.  Then r
1a9c0 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  un the co-routin
1a9d0 65 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61  es in parallel a
1a9e0 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72 65 73  nd merge the res
1a9f0 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65  ults.** into the
1aa00 20 6f 75 74 70 75 74 2e 20 20 49 6e 20 61 64 64   output.  In add
1aa10 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f  ition to the two
1aa20 20 63 6f 72 6f 75 74 69 6e 65 73 20 28 63 61 6c   coroutines (cal
1aa30 6c 65 64 20 73 65 6c 65 63 74 41 20 61 6e 64 0a  led selectA and.
1aa40 2a 2a 20 73 65 6c 65 63 74 42 29 20 74 68 65 72  ** selectB) ther
1aa50 65 20 61 72 65 20 37 20 73 75 62 72 6f 75 74 69  e are 7 subrouti
1aa60 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75  nes:.**.**    ou
1aa70 74 41 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20  tA:    Move the 
1aa80 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65  output of the se
1aa90 6c 65 63 74 41 20 63 6f 72 6f 75 74 69 6e 65 20  lectA coroutine 
1aaa0 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a  into the output.
1aab0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  **             o
1aac0 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71  f the compound q
1aad0 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f  uery..**.**    o
1aae0 75 74 42 3a 20 20 20 20 4d 6f 76 65 20 74 68 65  utB:    Move the
1aaf0 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73   output of the s
1ab00 65 6c 65 63 74 42 20 63 6f 72 6f 75 74 69 6e 65  electB coroutine
1ab10 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
1ab20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1ab30 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
1ab40 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65  query.  (Only ge
1ab50 6e 65 72 61 74 65 64 20 66 6f 72 20 55 4e 49 4f  nerated for UNIO
1ab60 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  N and.**        
1ab70 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20       UNION ALL. 
1ab80 20 45 58 43 45 50 54 20 61 6e 64 20 49 4e 53 45   EXCEPT and INSE
1ab90 52 54 53 45 43 54 20 6e 65 76 65 72 20 6f 75 74  RTSECT never out
1aba0 70 75 74 20 61 20 72 6f 77 20 74 68 61 74 0a 2a  put a row that.*
1abb0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70  *             ap
1abc0 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e  pears only in B.
1abd0 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a  ).**.**    AltB:
1abe0 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
1abf0 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72  there is data fr
1ac00 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e  om both coroutin
1ac10 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a  es and A<B..**.*
1ac20 2a 20 20 20 20 41 65 71 42 3a 20 20 20 20 43 61  *    AeqB:    Ca
1ac30 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
1ac40 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
1ac50 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
1ac60 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   A==B..**.**    
1ac70 41 67 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  AgtB:    Called 
1ac80 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61  when there is da
1ac90 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72  ta from both cor
1aca0 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e  outines and A>B.
1acb0 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20  .**.**    EofA: 
1acc0 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64     Called when d
1acd0 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64  ata is exhausted
1ace0 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a   from selectA..*
1acf0 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20 20  *.**    EofB:   
1ad00 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74   Called when dat
1ad10 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66  a is exhausted f
1ad20 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a  rom selectB..**.
1ad30 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
1ad40 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74  ation of the lat
1ad50 74 65 72 20 66 69 76 65 20 73 75 62 72 6f 75 74  ter five subrout
1ad60 69 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e 20 77  ines depend on w
1ad70 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74  hich .** <operat
1ad80 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a  or> is used:.**.
1ad90 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1ada0 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20    UNION ALL     
1adb0 20 20 20 20 55 4e 49 4f 4e 20 20 20 20 20 20 20      UNION       
1adc0 20 20 20 20 20 45 58 43 45 50 54 20 20 20 20 20       EXCEPT     
1add0 20 20 20 20 20 49 4e 54 45 52 53 45 43 54 0a 2a       INTERSECT.*
1ade0 2a 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d  *          -----
1adf0 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
1ae00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d  -----------  ---
1ae10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d  -----------  ---
1ae20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
1ae30 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f 75 74 41  *   AltB:   outA
1ae40 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74  , nextA      out
1ae50 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f  A, nextA       o
1ae60 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
1ae70 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20     nextA.**.**  
1ae80 20 41 65 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e   AeqB:   outA, n
1ae90 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78  extA         nex
1aea0 74 41 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  tA             n
1aeb0 65 78 74 41 20 20 20 20 20 20 20 20 20 6f 75 74  extA         out
1aec0 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20  A, nextA.**.**  
1aed0 20 41 67 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e   AgtB:   outB, n
1aee0 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20  extB      outB, 
1aef0 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20 6e  nextB          n
1af00 65 78 74 42 20 20 20 20 20 20 20 20 20 20 20 20  extB            
1af10 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f  nextB.**.**   Eo
1af20 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74  fA:   outB, next
1af30 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78  B      outB, nex
1af40 74 42 20 20 20 20 20 20 20 20 20 20 68 61 6c 74  tB          halt
1af50 20 20 20 20 20 20 20 20 20 20 20 20 20 68 61 6c               hal
1af60 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20  t.**.**   EofB: 
1af70 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
1af80 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
1af90 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
1afa0 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a           halt.**
1afb0 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74 42 2c  .** In the AltB,
1afc0 20 41 65 71 42 2c 20 61 6e 64 20 41 67 74 42 20   AeqB, and AgtB 
1afd0 73 75 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20  subroutines, an 
1afe0 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69  EOF on A followi
1aff0 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73  ng nextA.** caus
1b000 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  es an immediate 
1b010 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e 64  jump to EofA and
1b020 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c   an EOF on B fol
1b030 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20 63 61 75  lowing nextB cau
1b040 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69  ses.** an immedi
1b050 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42  ate jump to EofB
1b060 2e 20 20 57 69 74 68 69 6e 20 45 6f 66 41 20 61  .  Within EofA a
1b070 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46  nd EofB, and EOF
1b080 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20   on entry or.** 
1b090 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20  following nextX 
1b0a0 63 61 75 73 65 73 20 61 20 6a 75 6d 70 20 74 6f  causes a jump to
1b0b0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1b0c0 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e  select processin
1b0d0 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61  g..**.** Duplica
1b0e0 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68  te removal in th
1b0f0 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  e UNION, EXCEPT,
1b100 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 63   and INTERSECT c
1b110 61 73 65 73 20 69 73 20 68 61 6e 64 6c 65 64 0a  ases is handled.
1b120 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 6f 75  ** within the ou
1b130 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 2e  tput subroutine.
1b140 20 20 54 68 65 20 72 65 67 50 72 65 76 20 72 65    The regPrev re
1b150 67 69 73 74 65 72 20 73 65 74 20 68 6f 6c 64 73  gister set holds
1b160 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 0a   the previously.
1b170 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c 75 65 2e  ** output value.
1b180 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69    A comparison i
1b190 73 20 6d 61 64 65 20 61 67 61 69 6e 73 74 20 74  s made against t
1b1a0 68 69 73 20 76 61 6c 75 65 20 61 6e 64 20 74 68  his value and th
1b1b0 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20 73  e output.** is s
1b1c0 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6e 65  kipped if the ne
1b1d0 78 74 20 72 65 73 75 6c 74 73 20 77 6f 75 6c 64  xt results would
1b1e0 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
1b1f0 74 68 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a  the previous..**
1b200 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
1b210 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74  tation plan is t
1b220 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
1b230 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  two coroutines a
1b240 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72  nd seven.** subr
1b250 6f 75 74 69 6e 65 73 20 66 69 72 73 74 2c 20 74  outines first, t
1b260 68 65 6e 20 70 75 74 20 74 68 65 20 63 6f 6e 74  hen put the cont
1b270 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74 68 65  rol logic at the
1b280 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74   bottom.  Like t
1b290 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
1b2a0 20 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a      goto Init.**
1b2b0 20 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74       coA: corout
1b2c0 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 71 75 65  ine for left que
1b2d0 72 79 20 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f  ry (A).**     co
1b2e0 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  B: coroutine for
1b2f0 20 72 69 67 68 74 20 71 75 65 72 79 20 28 42 29   right query (B)
1b300 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75 74  .**    outA: out
1b310 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41  put one row of A
1b320 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75 74  .**    outB: out
1b330 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42  put one row of B
1b340 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f   (UNION and UNIO
1b350 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20  N ALL only).**  
1b360 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20    EofA: ....**  
1b370 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    EofB: ....**  
1b380 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    AltB: ....**  
1b390 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    AeqB: ....**  
1b3a0 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    AgtB: ....**  
1b3b0 20 20 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69    Init: initiali
1b3c0 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20 72 65 67  ze coroutine reg
1b3d0 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20 20 20  isters.**       
1b3e0 20 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20     yield coA.** 
1b3f0 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28           if eof(
1b400 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20  A) goto EofA.** 
1b410 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63           yield c
1b420 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  oB.**          i
1b430 66 20 65 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f  f eof(B) goto Eo
1b440 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43  fB.**    Cmpr: C
1b450 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20  ompare A, B.**  
1b460 20 20 20 20 20 20 20 20 4a 75 6d 70 20 41 6c 74          Jump Alt
1b470 42 2c 20 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a  B, AeqB, AgtB.**
1b480 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a       End: ....**
1b490 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74 42  .** We call AltB
1b4a0 2c 20 41 65 71 42 2c 20 41 67 74 42 2c 20 45 6f  , AeqB, AgtB, Eo
1b4b0 66 41 2c 20 61 6e 64 20 45 6f 66 42 20 22 73 75  fA, and EofB "su
1b4c0 62 72 6f 75 74 69 6e 65 73 22 20 62 75 74 20 74  broutines" but t
1b4d0 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61  hey are not.** a
1b4e0 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75  ctually called u
1b4f0 73 69 6e 67 20 47 6f 73 75 62 20 61 6e 64 20 74  sing Gosub and t
1b500 68 65 79 20 64 6f 20 6e 6f 74 20 52 65 74 75 72  hey do not Retur
1b510 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20 45 6f 66  n.  EofA and Eof
1b520 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20  B loop.** until 
1b530 61 6c 6c 20 64 61 74 61 20 69 73 20 65 78 68 61  all data is exha
1b540 75 73 74 65 64 20 74 68 65 6e 20 6a 75 6d 70 20  usted then jump 
1b550 74 6f 20 74 68 65 20 22 65 6e 64 22 20 6c 61 62  to the "end" lab
1b560 65 2e 20 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a  e.  AltB, AeqB,.
1b570 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a 75 6d 70  ** and AgtB jump
1b580 20 74 6f 20 65 69 74 68 65 72 20 4c 32 20 6f 72   to either L2 or
1b590 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20   to one of EofA 
1b5a0 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e  or EofB..*/.#ifn
1b5b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b5c0 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
1b5d0 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
1b5e0 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20  SelectOrderBy(. 
1b5f0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1b600 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
1b610 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
1b620 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
1b630 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
1b640 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
1b650 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  s to be coded */
1b660 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
1b670 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
1b680 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
1b690 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
1b6a0 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
1b6b0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1b6c0 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65  counters */.  Se
1b6d0 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20  lect *pPrior;   
1b6e0 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
1b6f0 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c  ELECT immediatel
1b700 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f  y to our left */
1b710 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
1b720 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
1b730 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69  rate code to thi
1b740 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65  s VDBE */.  Sele
1b750 63 74 44 65 73 74 20 64 65 73 74 41 3b 20 20 20  ctDest destA;   
1b760 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e    /* Destination
1b770 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 41   for coroutine A
1b780 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
1b790 20 64 65 73 74 42 3b 20 20 20 20 20 2f 2a 20 44   destB;     /* D
1b7a0 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63  estination for c
1b7b0 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20  oroutine B */.  
1b7c0 69 6e 74 20 72 65 67 41 64 64 72 41 3b 20 20 20  int regAddrA;   
1b7d0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1b7e0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
1b7f0 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65  lect-A coroutine
1b800 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64   */.  int regAdd
1b810 72 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  rB;         /* A
1b820 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
1b830 66 6f 72 20 73 65 6c 65 63 74 2d 42 20 63 6f 72  for select-B cor
1b840 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1b850 61 64 64 72 53 65 6c 65 63 74 41 3b 20 20 20 20  addrSelectA;    
1b860 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1b870 74 68 65 20 73 65 6c 65 63 74 2d 41 20 63 6f 72  the select-A cor
1b880 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1b890 61 64 64 72 53 65 6c 65 63 74 42 3b 20 20 20 20  addrSelectB;    
1b8a0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1b8b0 74 68 65 20 73 65 6c 65 63 74 2d 42 20 63 6f 72  the select-B cor
1b8c0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1b8d0 72 65 67 4f 75 74 41 3b 20 20 20 20 20 20 20 20  regOutA;        
1b8e0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
1b8f0 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75  ister for the ou
1b900 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e  tput-A subroutin
1b910 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75  e */.  int regOu
1b920 74 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tB;          /* 
1b930 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
1b940 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d   for the output-
1b950 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
1b960 20 20 69 6e 74 20 61 64 64 72 4f 75 74 41 3b 20    int addrOutA; 
1b970 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
1b980 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74  ss of the output
1b990 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -A subroutine */
1b9a0 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 42 20  .  int addrOutB 
1b9b0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41 64 64 72  = 0;     /* Addr
1b9c0 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ess of the outpu
1b9d0 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-B subroutine *
1b9e0 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41  /.  int addrEofA
1b9f0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
1ba00 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
1ba10 63 74 2d 41 2d 65 78 68 61 75 73 74 65 64 20 73  ct-A-exhausted s
1ba20 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
1ba30 6e 74 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 3b  nt addrEofA_noB;
1ba40 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74       /* Alternat
1ba50 65 20 61 64 64 72 45 6f 66 41 20 69 66 20 42 20  e addrEofA if B 
1ba60 69 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  is uninitialized
1ba70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f   */.  int addrEo
1ba80 66 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  fB;         /* A
1ba90 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
1baa0 6c 65 63 74 2d 42 2d 65 78 68 61 75 73 74 65 64  lect-B-exhausted
1bab0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
1bac0 20 69 6e 74 20 61 64 64 72 41 6c 74 42 3b 20 20   int addrAltB;  
1bad0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
1bae0 73 20 6f 66 20 74 68 65 20 41 3c 42 20 73 75 62  s of the A<B sub
1baf0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1bb00 20 61 64 64 72 41 65 71 42 3b 20 20 20 20 20 20   addrAeqB;      
1bb10 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
1bb20 20 74 68 65 20 41 3d 3d 42 20 73 75 62 72 6f 75   the A==B subrou
1bb30 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
1bb40 64 72 41 67 74 42 3b 20 20 20 20 20 20 20 20 20  drAgtB;         
1bb50 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
1bb60 65 20 41 3e 42 20 73 75 62 72 6f 75 74 69 6e 65  e A>B subroutine
1bb70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d   */.  int regLim
1bb80 69 74 41 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  itA;        /* L
1bb90 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f  imit register fo
1bba0 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20  r select-A */.  
1bbb0 69 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b 20 20  int regLimitB;  
1bbc0 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72        /* Limit r
1bbd0 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
1bbe0 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ct-A */.  int re
1bbf0 67 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20  gPrev;          
1bc00 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66 20 72 65  /* A range of re
1bc10 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20  gisters to hold 
1bc20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 20  previous output 
1bc30 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4c 69  */.  int savedLi
1bc40 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61  mit;       /* Sa
1bc50 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e  ved value of p->
1bc60 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20  iLimit */.  int 
1bc70 73 61 76 65 64 4f 66 66 73 65 74 3b 20 20 20 20  savedOffset;    
1bc80 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65    /* Saved value
1bc90 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a   of p->iOffset *
1bca0 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70  /.  int labelCmp
1bcb0 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62  r;        /* Lab
1bcc0 65 6c 20 66 6f 72 20 74 68 65 20 73 74 61 72 74  el for the start
1bcd0 20 6f 66 20 74 68 65 20 6d 65 72 67 65 20 61 6c   of the merge al
1bce0 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74  gorithm */.  int
1bcf0 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20 20 20   labelEnd;      
1bd00 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20     /* Label for 
1bd10 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f  the end of the o
1bd20 76 65 72 61 6c 6c 20 53 45 4c 45 43 54 20 73 74  verall SELECT st
1bd30 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  mt */.  int addr
1bd40 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
1bd50 20 4a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f   Jump instructio
1bd60 6e 73 20 74 68 61 74 20 67 65 74 20 72 65 74 61  ns that get reta
1bd70 72 67 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74  rgetted */.  int
1bd80 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
1bd90 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f     /* One of TK_
1bda0 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54  ALL, TK_UNION, T
1bdb0 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54  K_EXCEPT, TK_INT
1bdc0 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49  ERSECT */.  KeyI
1bdd0 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20 30  nfo *pKeyDup = 0
1bde0 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20  ; /* Comparison 
1bdf0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
1be00 64 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61  duplicate remova
1be10 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  l */.  KeyInfo *
1be20 70 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20  pKeyMerge;   /* 
1be30 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72  Comparison infor
1be40 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69  mation for mergi
1be50 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c  ng rows */.  sql
1be60 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
1be70 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
1be80 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45  onnection */.  E
1be90 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
1bea0 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  y;   /* The ORDE
1beb0 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
1bec0 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20   int nOrderBy;  
1bed0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1bee0 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65   of terms in the
1bef0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1bf00 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d   */.  int *aPerm
1bf10 75 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d  ute;        /* M
1bf20 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45  apping from ORDE
1bf30 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 72 65  R BY terms to re
1bf40 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73  sult set columns
1bf50 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1bf60 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b  ->pOrderBy!=0 );
1bf70 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 44  .  assert( pKeyD
1bf80 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e  up==0 ); /* "Man
1bf90 61 67 65 64 22 20 63 6f 64 65 20 6e 65 65 64 73  aged" code needs
1bfa0 20 74 68 69 73 2e 20 20 54 69 63 6b 65 74 20 23   this.  Ticket #
1bfb0 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20  3382. */.  db = 
1bfc0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20  pParse->db;.  v 
1bfd0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1bfe0 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
1bff0 29 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 72 65  );       /* Alre
1c000 61 64 79 20 74 68 72 6f 77 6e 20 74 68 65 20 65  ady thrown the e
1c010 72 72 6f 72 20 69 66 20 56 44 42 45 20 61 6c 6c  rror if VDBE all
1c020 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c  oc failed */.  l
1c030 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65  abelEnd = sqlite
1c040 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
1c050 50 61 72 73 65 29 3b 0a 20 20 6c 61 62 65 6c 43  Parse);.  labelC
1c060 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  mpr = sqlite3Vdb
1c070 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
1c080 65 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68  e);...  /* Patch
1c090 20 75 70 20 74 68 65 20 4f 52 44 45 52 20 42 59   up the ORDER BY
1c0a0 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f   clause.  */.  o
1c0b0 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70  p = p->op;  .  p
1c0c0 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
1c0d0 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72  r;.  assert( pPr
1c0e0 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ior->pOrderBy==0
1c0f0 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d   );.  pOrderBy =
1c100 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
1c110 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
1c120 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d   );.  nOrderBy =
1c130 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
1c140 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72  ;..  /* For oper
1c150 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e  ators other than
1c160 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61   UNION ALL we ha
1c170 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ve to make sure 
1c180 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52  that.  ** the OR
1c190 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f  DER BY clause co
1c1a0 76 65 72 73 20 65 76 65 72 79 20 74 65 72 6d 20  vers every term 
1c1b0 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  of the result se
1c1c0 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72  t.  Add.  ** ter
1c1d0 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20  ms to the ORDER 
1c1e0 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63  BY clause as nec
1c1f0 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69  essary..  */.  i
1c200 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b  f( op!=TK_ALL ){
1c210 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62  .    for(i=1; db
1c220 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
1c230 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73  0 && i<=p->pELis
1c240 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
1c250 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
1c260 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
1c270 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  m;.      for(j=0
1c280 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79  , pItem=pOrderBy
1c290 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b  ->a; j<nOrderBy;
1c2a0 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   j++, pItem++){.
1c2b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1c2c0 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
1c2d0 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20  rByCol>0 );.    
1c2e0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75      if( pItem->u
1c2f0 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d  .x.iOrderByCol==
1c300 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  i ) break;.     
1c310 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d   }.      if( j==
1c320 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
1c330 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
1c340 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
1c350 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b   TK_INTEGER, 0);
1c360 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
1c370 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  w==0 ) return SQ
1c380 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
1c390 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  .        pNew->f
1c3a0 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61  lags |= EP_IntVa
1c3b0 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  lue;.        pNe
1c3c0 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b  w->u.iValue = i;
1c3d0 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64  .        p->pOrd
1c3e0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 20  erBy = pOrderBy 
1c3f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
1c400 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
1c410 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29 3b  pOrderBy, pNew);
1c420 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72  .        if( pOr
1c430 64 65 72 42 79 20 29 20 70 4f 72 64 65 72 42 79  derBy ) pOrderBy
1c440 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e  ->a[nOrderBy++].
1c450 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
1c460 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20  = (u16)i;.      
1c470 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
1c480 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  * Compute the co
1c490 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61  mparison permuta
1c4a0 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f  tion and keyinfo
1c4b0 20 74 68 61 74 20 69 73 20 75 73 65 64 20 77 69   that is used wi
1c4c0 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d  th.  ** the perm
1c4d0 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20  utation used to 
1c4e0 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
1c4f0 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f   next.  ** row o
1c500 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20  f results comes 
1c510 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20  from selectA or 
1c520 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61  selectB.  Also a
1c530 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a  dd explicit.  **
1c540 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74   collations to t
1c550 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1c560 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74  se terms so that
1c570 20 77 68 65 6e 20 74 68 65 20 73 75 62 71 75 65   when the subque
1c580 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  ries.  ** to the
1c590 20 72 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c   right and the l
1c5a0 65 66 74 20 61 72 65 20 65 76 61 6c 75 61 74 65  eft are evaluate
1c5b0 64 2c 20 74 68 65 79 20 75 73 65 20 74 68 65 20  d, they use the 
1c5c0 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c  correct.  ** col
1c5d0 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61  lation..  */.  a
1c5e0 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65  Permute = sqlite
1c5f0 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
1c600 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28  b, sizeof(int)*(
1c610 6e 4f 72 64 65 72 42 79 20 2b 20 31 29 29 3b 0a  nOrderBy + 1));.
1c620 20 20 69 66 28 20 61 50 65 72 6d 75 74 65 20 29    if( aPermute )
1c630 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
1c640 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
1c650 6d 3b 0a 20 20 20 20 61 50 65 72 6d 75 74 65 5b  m;.    aPermute[
1c660 30 5d 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20  0] = nOrderBy;. 
1c670 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 74 65     for(i=1, pIte
1c680 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69  m=pOrderBy->a; i
1c690 3c 3d 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c  <=nOrderBy; i++,
1c6a0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
1c6b0 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
1c6c0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e  u.x.iOrderByCol>
1c6d0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
1c6e0 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  t( pItem->u.x.iO
1c6f0 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45  rderByCol<=p->pE
1c700 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
1c710 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b 69 5d       aPermute[i]
1c720 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f   = pItem->u.x.iO
1c730 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b 0a 20  rderByCol - 1;. 
1c740 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72     }.    pKeyMer
1c750 67 65 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ge = multiSelect
1c760 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 70  OrderByKeyInfo(p
1c770 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20  Parse, p, 1);.  
1c780 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d  }else{.    pKeyM
1c790 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  erge = 0;.  }.. 
1c7a0 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68 65   /* Reattach the
1c7b0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1c7c0 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a 20   to the query.. 
1c7d0 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42   */.  p->pOrderB
1c7e0 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
1c7f0 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
1c800 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
1c810 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  stDup(pParse->db
1c820 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a  , pOrderBy, 0);.
1c830 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
1c840 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72   range of tempor
1c850 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61 6e  ary registers an
1c860 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65  d the KeyInfo ne
1c870 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68  eded.  ** for th
1c880 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65 6d  e logic that rem
1c890 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65 20 72  oves duplicate r
1c8a0 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e 20  esult rows when 
1c8b0 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f  the.  ** operato
1c8c0 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45  r is UNION, EXCE
1c8d0 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
1c8e0 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20   (but not UNION 
1c8f0 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ALL)..  */.  if(
1c900 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
1c910 20 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b 0a     regPrev = 0;.
1c920 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1c930 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   nExpr = p->pELi
1c940 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61  st->nExpr;.    a
1c950 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e  ssert( nOrderBy>
1c960 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61  =nExpr || db->ma
1c970 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1c980 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72    regPrev = pPar
1c990 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
1c9a0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
1c9b0 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 73 71 6c  nExpr+1;.    sql
1c9c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1c9d0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
1c9e0 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20 70   regPrev);.    p
1c9f0 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65 33  KeyDup = sqlite3
1ca00 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c  KeyInfoAlloc(db,
1ca10 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20 20   nExpr, 1);.    
1ca20 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a 20  if( pKeyDup ){. 
1ca30 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
1ca40 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
1ca50 74 65 61 62 6c 65 28 70 4b 65 79 44 75 70 29 20  teable(pKeyDup) 
1ca60 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
1ca70 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ; i<nExpr; i++){
1ca80 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70  .        pKeyDup
1ca90 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c  ->aColl[i] = mul
1caa0 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
1cab0 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
1cac0 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e         pKeyDup->
1cad0 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
1cae0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
1caf0 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61  .  }. .  /* Sepa
1cb00 72 61 74 65 20 74 68 65 20 6c 65 66 74 20 61 6e  rate the left an
1cb10 64 20 74 68 65 20 72 69 67 68 74 20 71 75 65 72  d the right quer
1cb20 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68  y from one anoth
1cb30 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72  er.  */.  p->pPr
1cb40 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f  ior = 0;.  pPrio
1cb50 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  r->pNext = 0;.  
1cb60 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
1cb70 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
1cb80 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e, p, p->pOrderB
1cb90 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 69  y, "ORDER");.  i
1cba0 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f  f( pPrior->pPrio
1cbb0 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
1cbc0 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47  te3ResolveOrderG
1cbd0 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
1cbe0 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70  Prior, pPrior->p
1cbf0 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22  OrderBy, "ORDER"
1cc00 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d  );.  }..  /* Com
1cc10 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20 72  pute the limit r
1cc20 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f  egisters */.  co
1cc30 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
1cc40 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 6c  ers(pParse, p, l
1cc50 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20  abelEnd);.  if( 
1cc60 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d  p->iLimit && op=
1cc70 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72  =TK_ALL ){.    r
1cc80 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61  egLimitA = ++pPa
1cc90 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
1cca0 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61  egLimitB = ++pPa
1ccb0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
1ccc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1ccd0 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e  (v, OP_Copy, p->
1cce0 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66  iOffset ? p->iOf
1ccf0 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d  fset+1 : p->iLim
1cd00 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  it,.            
1cd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd20 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74 41 29        regLimitA)
1cd30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1cd40 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
1cd50 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20 72  py, regLimitA, r
1cd60 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c  egLimitB);.  }el
1cd70 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74  se{.    regLimit
1cd80 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d 20  A = regLimitB = 
1cd90 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
1cda0 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
1cdb0 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e  ->pLimit);.  p->
1cdc0 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 72  pLimit = 0;..  r
1cdd0 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72  egAddrA = ++pPar
1cde0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41  se->nMem;.  regA
1cdf0 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ddrB = ++pParse-
1ce00 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41  >nMem;.  regOutA
1ce10 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1ce20 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20 2b  m;.  regOutB = +
1ce30 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1ce40 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1ce50 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20 53  stInit(&destA, S
1ce60 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  RT_Coroutine, re
1ce70 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74  gAddrA);.  sqlit
1ce80 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
1ce90 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f 72  (&destB, SRT_Cor
1cea0 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42  outine, regAddrB
1ceb0 29 3b 0a 0a 20 20 45 78 70 6c 61 69 6e 51 75 65  );..  ExplainQue
1cec0 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
1ced0 31 2c 20 22 4d 45 52 47 45 20 28 25 73 29 22 2c  1, "MERGE (%s)",
1cee0 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
1cef0 3e 6f 70 29 29 29 3b 0a 0a 20 20 2f 2a 20 47 65  >op)));..  /* Ge
1cf00 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69  nerate a corouti
1cf10 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  ne to evaluate t
1cf20 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
1cf30 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ent to the.  ** 
1cf40 6c 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70  left of the comp
1cf50 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20  ound operator - 
1cf60 74 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a  the "A" select..
1cf70 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63    */.  addrSelec
1cf80 74 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tA = sqlite3Vdbe
1cf90 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
1cfa0 20 31 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71   1;.  addr1 = sq
1cfb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1cfc0 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74  v, OP_InitCorout
1cfd0 69 6e 65 2c 20 72 65 67 41 64 64 72 41 2c 20 30  ine, regAddrA, 0
1cfe0 2c 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a  , addrSelectA);.
1cff0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1d000 2c 20 22 6c 65 66 74 20 53 45 4c 45 43 54 22 29  , "left SELECT")
1d010 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69  );.  pPrior->iLi
1d020 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b  mit = regLimitA;
1d030 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50  .  ExplainQueryP
1d040 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20  lan((pParse, 1, 
1d050 22 4c 45 46 54 22 29 29 3b 0a 20 20 73 71 6c 69  "LEFT"));.  sqli
1d060 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
1d070 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 41  , pPrior, &destA
1d080 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1d090 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20  EndCoroutine(v, 
1d0a0 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c  regAddrA);.  sql
1d0b0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
1d0c0 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 2f  (v, addr1);..  /
1d0d0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72  * Generate a cor
1d0e0 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61  outine to evalua
1d0f0 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  te the SELECT st
1d100 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a  atement on .  **
1d110 20 74 68 65 20 72 69 67 68 74 20 2d 20 74 68 65   the right - the
1d120 20 22 42 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f   "B" select.  */
1d130 0a 20 20 61 64 64 72 53 65 6c 65 63 74 42 20 3d  .  addrSelectB =
1d140 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1d150 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a  entAddr(v) + 1;.
1d160 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
1d170 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1d180 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c  P_InitCoroutine,
1d190 20 72 65 67 41 64 64 72 42 2c 20 30 2c 20 61 64   regAddrB, 0, ad
1d1a0 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20 56 64  drSelectB);.  Vd
1d1b0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
1d1c0 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  ight SELECT"));.
1d1d0 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20 70    savedLimit = p
1d1e0 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65  ->iLimit;.  save
1d1f0 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66  dOffset = p->iOf
1d200 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69  fset;.  p->iLimi
1d210 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20  t = regLimitB;. 
1d220 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
1d230 20 20 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72    .  ExplainQuer
1d240 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31  yPlan((pParse, 1
1d250 2c 20 22 52 49 47 48 54 22 29 29 3b 0a 20 20 73  , "RIGHT"));.  s
1d260 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
1d270 72 73 65 2c 20 70 2c 20 26 64 65 73 74 42 29 3b  rse, p, &destB);
1d280 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73  .  p->iLimit = s
1d290 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e  avedLimit;.  p->
1d2a0 69 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64 4f  iOffset = savedO
1d2b0 66 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65 33  ffset;.  sqlite3
1d2c0 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65  VdbeEndCoroutine
1d2d0 28 76 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a  (v, regAddrB);..
1d2e0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1d2f0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
1d300 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72  outputs the curr
1d310 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 41  ent row of the A
1d320 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20  .  ** select as 
1d330 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20  the next output 
1d340 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  row of the compo
1d350 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f  und select..  */
1d360 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
1d370 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72  nt((v, "Output r
1d380 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29 3b  outine for A"));
1d390 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67 65  .  addrOutA = ge
1d3a0 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72  nerateOutputSubr
1d3b0 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20  outine(pParse,. 
1d3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3d0 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73 74  p, &destA, pDest
1d3e0 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20 20  , regOutA,.     
1d3f0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50              regP
1d400 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61  rev, pKeyDup, la
1d410 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a  belEnd);.  .  /*
1d420 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
1d430 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
1d440 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  uts the current 
1d450 72 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20 2a  row of the B.  *
1d460 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20  * select as the 
1d470 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20  next output row 
1d480 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
1d490 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69  select..  */.  i
1d4a0 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  f( op==TK_ALL ||
1d4b0 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b   op==TK_UNION ){
1d4c0 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
1d4d0 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74  ment((v, "Output
1d4e0 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22 29   routine for B")
1d4f0 29 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42 20  );.    addrOutB 
1d500 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  = generateOutput
1d510 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73  Subroutine(pPars
1d520 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1d530 20 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20 70      p, &destB, p
1d540 44 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20  Dest, regOutB,. 
1d550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d560 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70  regPrev, pKeyDup
1d570 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d  , labelEnd);.  }
1d580 0a 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  .  sqlite3KeyInf
1d590 6f 55 6e 72 65 66 28 70 4b 65 79 44 75 70 29 3b  oUnref(pKeyDup);
1d5a0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1d5b0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  a subroutine to 
1d5c0 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73  run when the res
1d5d0 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74  ults from select
1d5e0 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61   A.  ** are exha
1d5f0 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64  usted and only d
1d600 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42 20  ata in select B 
1d610 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  remains..  */.  
1d620 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50  if( op==TK_EXCEP
1d630 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45  T || op==TK_INTE
1d640 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64  RSECT ){.    add
1d650 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 61 64 64 72  rEofA_noB = addr
1d660 45 6f 66 41 20 3d 20 6c 61 62 65 6c 45 6e 64 3b  EofA = labelEnd;
1d670 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20  .  }else{  .    
1d680 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1d690 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72 6f  (v, "eof-A subro
1d6a0 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64  utine"));.    ad
1d6b0 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33  drEofA = sqlite3
1d6c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d6d0 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c  _Gosub, regOutB,
1d6e0 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20   addrOutB);.    
1d6f0 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 73  addrEofA_noB = s
1d700 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1d710 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1d720 67 41 64 64 72 42 2c 20 6c 61 62 65 6c 45 6e 64  gAddrB, labelEnd
1d730 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1d740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d750 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
1d760 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
1d770 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1d780 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 70  addrEofA);.    p
1d790 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
1d7a0 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
1d7b0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70  p->nSelectRow, p
1d7c0 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
1d7d0 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  w);.  }..  /* Ge
1d7e0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
1d7f0 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20  ine to run when 
1d800 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  the results from
1d810 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61   select B.  ** a
1d820 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64  re exhausted and
1d830 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65   only data in se
1d840 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a  lect A remains..
1d850 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
1d860 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
1d870 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 61 64     addrEofB = ad
1d880 64 72 45 6f 66 41 3b 0a 20 20 20 20 69 66 28 20  drEofA;.    if( 
1d890 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20  p->nSelectRow > 
1d8a0 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
1d8b0 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ow ) p->nSelectR
1d8c0 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  ow = pPrior->nSe
1d8d0 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65  lectRow;.  }else
1d8e0 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70  {  .    VdbeNoop
1d8f0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66  Comment((v, "eof
1d900 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
1d910 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d  ;.    addrEofB =
1d920 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d930 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
1d940 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74  regOutA, addrOut
1d950 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
1d960 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1d970 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c  Yield, regAddrA,
1d980 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56 64 62 65   labelEnd); Vdbe
1d990 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1d9a0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
1d9b0 28 76 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20  (v, addrEofB);. 
1d9c0 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
1d9d0 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
1d9e0 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c 42   the case of A<B
1d9f0 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
1da00 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c  Comment((v, "A-l
1da10 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  t-B subroutine")
1da20 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d 20  );.  addrAltB = 
1da30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1da40 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
1da50 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41  egOutA, addrOutA
1da60 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1da70 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1da80 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64  ld, regAddrA, ad
1da90 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76  drEofA); VdbeCov
1daa0 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
1dab0 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c  te3VdbeGoto(v, l
1dac0 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a  abelCmpr);..  /*
1dad0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1dae0 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
1daf0 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20  e of A==B.  */. 
1db00 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
1db10 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20  ){.    addrAeqB 
1db20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65  = addrAltB;.  }e
1db30 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  lse if( op==TK_I
1db40 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
1db50 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41  addrAeqB = addrA
1db60 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74  ltB;.    addrAlt
1db70 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  B++;.  }else{.  
1db80 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1db90 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75  t((v, "A-eq-B su
1dba0 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
1dbb0 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20   addrAeqB =.    
1dbc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1dbd0 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1dbe0 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66  egAddrA, addrEof
1dbf0 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  A); VdbeCoverage
1dc00 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
1dc10 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65  VdbeGoto(v, labe
1dc20 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  lCmpr);.  }..  /
1dc30 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1dc40 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
1dc50 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20  se of A>B.  */. 
1dc60 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1dc70 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62  ((v, "A-gt-B sub
1dc80 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64  routine"));.  ad
1dc90 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33  drAgtB = sqlite3
1dca0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1dcb0 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  v);.  if( op==TK
1dcc0 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55  _ALL || op==TK_U
1dcd0 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69  NION ){.    sqli
1dce0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1dcf0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
1dd00 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20  tB, addrOutB);. 
1dd10 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
1dd20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1dd30 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64  ld, regAddrB, ad
1dd40 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76  drEofB); VdbeCov
1dd50 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
1dd60 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c  te3VdbeGoto(v, l
1dd70 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a  abelCmpr);..  /*
1dd80 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e 73 20   This code runs 
1dd90 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69  once to initiali
1dda0 7a 65 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20  ze everything.. 
1ddb0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1ddc0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
1ddd0 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  r1);.  sqlite3Vd
1dde0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1ddf0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
1de00 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b 20 56  addrEofA_noB); V
1de10 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1de20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1de30 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1de40 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45   regAddrB, addrE
1de50 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ofB); VdbeCovera
1de60 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70  ge(v);..  /* Imp
1de70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20  lement the main 
1de80 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a  merge loop.  */.
1de90 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1dea0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62  olveLabel(v, lab
1deb0 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74  elCmpr);.  sqlit
1dec0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1ded0 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20  OP_Permutation, 
1dee0 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29  0, 0, 0, (char*)
1def0 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54  aPermute, P4_INT
1df00 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65  ARRAY);.  sqlite
1df10 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1df20 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41  P_Compare, destA
1df30 2e 69 53 64 73 74 2c 20 64 65 73 74 42 2e 69 53  .iSdst, destB.iS
1df40 64 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20  dst, nOrderBy,. 
1df50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df60 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
1df70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59  KeyMerge, P4_KEY
1df80 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33  INFO);.  sqlite3
1df90 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
1dfa0 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29 3b  OPFLAG_PERMUTE);
1dfb0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1dfc0 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
1dfd0 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41   addrAltB, addrA
1dfe0 65 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b 20  eqB, addrAgtB); 
1dff0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1e000 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
1e010 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  he this point in
1e020 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e   order to termin
1e030 61 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20  ate the query.. 
1e040 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1e050 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1e060 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f   labelEnd);..  /
1e070 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65  * Reassembly the
1e080 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
1e090 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20  so that it will 
1e0a0 62 65 20 66 72 65 65 64 20 63 6f 72 72 65 63 74  be freed correct
1e0b0 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63  ly.  ** by the c
1e0c0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
1e0d0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
1e0e0 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
1e0f0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
1e100 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
1e110 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  }.  p->pPrior = 
1e120 70 50 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f 72  pPrior;.  pPrior
1e130 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20 20  ->pNext = p;..  
1e140 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72  /*** TBD:  Inser
1e150 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c  t subroutine cal
1e160 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73  ls to close curs
1e170 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74  ors on incomplet
1e180 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72  e.  **** subquer
1e190 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 45 78 70 6c  ies ****/.  Expl
1e1a0 61 69 6e 51 75 65 72 79 50 6c 61 6e 50 6f 70 28  ainQueryPlanPop(
1e1b0 70 50 61 72 73 65 29 3b 0a 20 20 72 65 74 75 72  pParse);.  retur
1e1c0 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 21 3d  n pParse->nErr!=
1e1d0 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0;.}.#endif..#if
1e1e0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1e1f0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
1e200 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
1e210 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 0a 2f  TE_OMIT_VIEW)../
1e220 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
1e230 20 74 68 65 20 53 75 62 73 74 43 6f 6e 74 65 78   the SubstContex
1e240 74 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69 62  t object describ
1e250 65 73 20 61 6e 20 73 75 62 73 74 69 74 75 74 69  es an substituti
1e260 6f 6e 20 65 64 69 74 0a 2a 2a 20 74 6f 20 62 65  on edit.** to be
1e270 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 61 20   performed on a 
1e280 70 61 72 73 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a  parse tree..**.*
1e290 2a 20 41 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  * All references
1e2a0 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   to columns in t
1e2b0 61 62 6c 65 20 69 54 61 62 6c 65 20 61 72 65 20  able iTable are 
1e2c0 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20 62  to be replaced b
1e2d0 79 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  y corresponding.
1e2e0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  ** expressions i
1e2f0 6e 20 70 45 4c 69 73 74 2e 0a 2a 2f 0a 74 79 70  n pEList..*/.typ
1e300 65 64 65 66 20 73 74 72 75 63 74 20 53 75 62 73  edef struct Subs
1e310 74 43 6f 6e 74 65 78 74 20 7b 0a 20 20 50 61 72  tContext {.  Par
1e320 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
1e330 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1e340 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1e350 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 3b 20 20  .  int iTable;  
1e360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e370 52 65 70 6c 61 63 65 20 72 65 66 65 72 65 6e 63  Replace referenc
1e380 65 73 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  es to this table
1e390 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77 54 61   */.  int iNewTa
1e3a0 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ble;            
1e3b0 2f 2a 20 4e 65 77 20 74 61 62 6c 65 20 6e 75 6d  /* New table num
1e3c0 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c  ber */.  int isL
1e3d0 65 66 74 4a 6f 69 6e 3b 20 20 20 20 20 20 20 20  eftJoin;        
1e3e0 20 20 20 2f 2a 20 41 64 64 20 54 4b 5f 49 46 5f     /* Add TK_IF_
1e3f0 4e 55 4c 4c 5f 52 4f 57 20 6f 70 63 6f 64 65 73  NULL_ROW opcodes
1e400 20 6f 6e 20 65 61 63 68 20 72 65 70 6c 61 63 65   on each replace
1e410 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ment */.  ExprLi
1e420 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20  st *pEList;     
1e430 20 20 20 20 2f 2a 20 52 65 70 6c 61 63 65 6d 65      /* Replaceme
1e440 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a  nt expressions *
1e450 2f 0a 7d 20 53 75 62 73 74 43 6f 6e 74 65 78 74  /.} SubstContext
1e460 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65  ;../* Forward De
1e470 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74  clarations */.st
1e480 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
1e490 78 70 72 4c 69 73 74 28 53 75 62 73 74 43 6f 6e  xprList(SubstCon
1e4a0 74 65 78 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a  text*, ExprList*
1e4b0 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  );.static void s
1e4c0 75 62 73 74 53 65 6c 65 63 74 28 53 75 62 73 74  ubstSelect(Subst
1e4d0 43 6f 6e 74 65 78 74 2a 2c 20 53 65 6c 65 63 74  Context*, Select
1e4e0 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
1e4f0 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65  Scan through the
1e500 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
1e510 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72  r.  Replace ever
1e520 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a  y reference to.*
1e530 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61  * a column in ta
1e540 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c  ble number iTabl
1e550 65 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  e with a copy of
1e560 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a   the iColumn-th.
1e570 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69  ** entry in pELi
1e580 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20  st.  (But leave 
1e590 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
1e5a0 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a  e ROWID column .
1e5b0 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a  ** unchanged.).*
1e5c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1e5d0 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  e is part of the
1e5e0 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63   flattening proc
1e5f0 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65  edure.  A subque
1e600 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75  ry.** whose resu
1e610 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65  lt set is define
1e620 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65  d by pEList appe
1e630 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20  ars as entry in 
1e640 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75  the.** FROM clau
1e650 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  se of a SELECT s
1e660 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42  uch that the VDB
1e670 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65  E cursor assigne
1e680 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52  d to that.** FOR
1e690 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69  M clause entry i
1e6a0 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20  s iTable.  This 
1e6b0 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 74 68  routine makes th
1e6c0 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20  e necessary .** 
1e6d0 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72  changes to pExpr
1e6e0 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66 65   so that it refe
1e6f0 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74  rs directly to t
1e700 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a  he source table.
1e710 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ** of the subque
1e720 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72 65  ry rather the re
1e730 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
1e740 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61  subquery..*/.sta
1e750 74 69 63 20 45 78 70 72 20 2a 73 75 62 73 74 45  tic Expr *substE
1e760 78 70 72 28 0a 20 20 53 75 62 73 74 43 6f 6e 74  xpr(.  SubstCont
1e770 65 78 74 20 2a 70 53 75 62 73 74 2c 20 20 2f 2a  ext *pSubst,  /*
1e780 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
1e790 74 68 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e  the substitution
1e7a0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
1e7b0 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r            /* 
1e7c0 45 78 70 72 20 69 6e 20 77 68 69 63 68 20 73 75  Expr in which su
1e7d0 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72  bstitution occur
1e7e0 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45  s */.){.  if( pE
1e7f0 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  xpr==0 ) return 
1e800 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  0;.  if( ExprHas
1e810 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1e820 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20  EP_FromJoin).   
1e830 26 26 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74  && pExpr->iRight
1e840 4a 6f 69 6e 54 61 62 6c 65 3d 3d 70 53 75 62 73  JoinTable==pSubs
1e850 74 2d 3e 69 54 61 62 6c 65 0a 20 20 29 7b 0a 20  t->iTable.  ){. 
1e860 20 20 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74     pExpr->iRight
1e870 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 53 75 62  JoinTable = pSub
1e880 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20  st->iNewTable;. 
1e890 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e   }.  if( pExpr->
1e8a0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
1e8b0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
1e8c0 70 53 75 62 73 74 2d 3e 69 54 61 62 6c 65 20 29  pSubst->iTable )
1e8d0 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  {.    if( pExpr-
1e8e0 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  >iColumn<0 ){.  
1e8f0 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
1e900 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c  TK_NULL;.    }el
1e910 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
1e920 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72  pNew;.      Expr
1e930 20 2a 70 43 6f 70 79 20 3d 20 70 53 75 62 73 74   *pCopy = pSubst
1e940 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70  ->pEList->a[pExp
1e950 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70  r->iColumn].pExp
1e960 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20 69 66  r;.      Expr if
1e970 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20 20 20 61  NullRow;.      a
1e980 73 73 65 72 74 28 20 70 53 75 62 73 74 2d 3e 70  ssert( pSubst->p
1e990 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70  EList!=0 && pExp
1e9a0 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 53 75 62 73  r->iColumn<pSubs
1e9b0 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
1e9c0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1e9d0 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d  ( pExpr->pRight=
1e9e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
1e9f0 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63  sqlite3ExprIsVec
1ea00 74 6f 72 28 70 43 6f 70 79 29 20 29 7b 0a 20 20  tor(pCopy) ){.  
1ea10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 65 63        sqlite3Vec
1ea20 74 6f 72 45 72 72 6f 72 4d 73 67 28 70 53 75 62  torErrorMsg(pSub
1ea30 73 74 2d 3e 70 50 61 72 73 65 2c 20 70 43 6f 70  st->pParse, pCop
1ea40 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  y);.      }else{
1ea50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ea60 20 2a 64 62 20 3d 20 70 53 75 62 73 74 2d 3e 70   *db = pSubst->p
1ea70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20  Parse->db;.     
1ea80 20 20 20 69 66 28 20 70 53 75 62 73 74 2d 3e 69     if( pSubst->i
1ea90 73 4c 65 66 74 4a 6f 69 6e 20 26 26 20 70 43 6f  sLeftJoin && pCo
1eaa0 70 79 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  py->op!=TK_COLUM
1eab0 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  N ){.          m
1eac0 65 6d 73 65 74 28 26 69 66 4e 75 6c 6c 52 6f 77  emset(&ifNullRow
1ead0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 66 4e 75  , 0, sizeof(ifNu
1eae0 6c 6c 52 6f 77 29 29 3b 0a 20 20 20 20 20 20 20  llRow));.       
1eaf0 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 6f 70 20     ifNullRow.op 
1eb00 3d 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57  = TK_IF_NULL_ROW
1eb10 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 4e 75  ;.          ifNu
1eb20 6c 6c 52 6f 77 2e 70 4c 65 66 74 20 3d 20 70 43  llRow.pLeft = pC
1eb30 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69  opy;.          i
1eb40 66 4e 75 6c 6c 52 6f 77 2e 69 54 61 62 6c 65 20  fNullRow.iTable 
1eb50 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65 77 54 61  = pSubst->iNewTa
1eb60 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ble;.          p
1eb70 43 6f 70 79 20 3d 20 26 69 66 4e 75 6c 6c 52 6f  Copy = &ifNullRo
1eb80 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  w;.        }.   
1eb90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 45       testcase( E
1eba0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1ebb0 43 6f 70 79 2c 20 45 50 5f 53 75 62 71 75 65 72  Copy, EP_Subquer
1ebc0 79 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  y) );.        pN
1ebd0 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
1ebe0 44 75 70 28 64 62 2c 20 70 43 6f 70 79 2c 20 30  Dup(db, pCopy, 0
1ebf0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1ec00 4e 65 77 20 26 26 20 70 53 75 62 73 74 2d 3e 69  New && pSubst->i
1ec10 73 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  sLeftJoin ){.   
1ec20 20 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72         ExprSetPr
1ec30 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
1ec40 43 61 6e 42 65 4e 75 6c 6c 29 3b 0a 20 20 20 20  CanBeNull);.    
1ec50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1ec60 28 20 70 4e 65 77 20 26 26 20 45 78 70 72 48 61  ( pNew && ExprHa
1ec70 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1ec80 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
1ec90 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
1eca0 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
1ecb0 3d 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a  = pExpr->iRightJ
1ecc0 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  oinTable;.      
1ecd0 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
1ece0 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 46 72 6f  rty(pNew, EP_Fro
1ecf0 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  mJoin);.        
1ed00 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  }.        if( pN
1ed10 65 77 20 26 26 20 45 78 70 72 48 61 73 50 72 6f  ew && ExprHasPro
1ed20 70 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f 47  perty(pExpr,EP_G
1ed30 65 6e 65 72 69 63 29 20 29 7b 0a 20 20 20 20 20  eneric) ){.     
1ed40 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70       ExprSetProp
1ed50 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 47 65  erty(pNew, EP_Ge
1ed60 6e 65 72 69 63 29 3b 0a 20 20 20 20 20 20 20 20  neric);.        
1ed70 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
1ed80 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
1ed90 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
1eda0 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20  pExpr = pNew;.  
1edb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
1edc0 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 45 78  lse{.    if( pEx
1edd0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e 55  pr->op==TK_IF_NU
1ede0 4c 4c 5f 52 4f 57 20 26 26 20 70 45 78 70 72 2d  LL_ROW && pExpr-
1edf0 3e 69 54 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d  >iTable==pSubst-
1ee00 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  >iTable ){.     
1ee10 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
1ee20 20 70 53 75 62 73 74 2d 3e 69 4e 65 77 54 61 62   pSubst->iNewTab
1ee30 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45  le;.    }.    pE
1ee40 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62  xpr->pLeft = sub
1ee50 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70  stExpr(pSubst, p
1ee60 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
1ee70 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20    pExpr->pRight 
1ee80 3d 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62  = substExpr(pSub
1ee90 73 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  st, pExpr->pRigh
1eea0 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72  t);.    if( Expr
1eeb0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1eec0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1eed0 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53   ){.      substS
1eee0 65 6c 65 63 74 28 70 53 75 62 73 74 2c 20 70 45  elect(pSubst, pE
1eef0 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20  xpr->x.pSelect, 
1ef00 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1);.    }else{. 
1ef10 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69       substExprLi
1ef20 73 74 28 70 53 75 62 73 74 2c 20 70 45 78 70 72  st(pSubst, pExpr
1ef30 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
1ef40 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
1ef50 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Expr;.}.static v
1ef60 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73  oid substExprLis
1ef70 74 28 0a 20 20 53 75 62 73 74 43 6f 6e 74 65 78  t(.  SubstContex
1ef80 74 20 2a 70 53 75 62 73 74 2c 20 2f 2a 20 44 65  t *pSubst, /* De
1ef90 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
1efa0 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f   substitution */
1efb0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
1efc0 73 74 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  st       /* List
1efd0 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20   to scan and in 
1efe0 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75  which to make su
1eff0 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 29 7b 0a  bstitutes */.){.
1f000 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1f010 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1f020 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1f030 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1f040 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  ){.    pList->a[
1f050 69 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74  i].pExpr = subst
1f060 45 78 70 72 28 70 53 75 62 73 74 2c 20 70 4c 69  Expr(pSubst, pLi
1f070 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
1f080 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
1f090 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a  id substSelect(.
1f0a0 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a    SubstContext *
1f0b0 70 53 75 62 73 74 2c 20 2f 2a 20 44 65 73 63 72  pSubst, /* Descr
1f0c0 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  iption of the su
1f0d0 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20  bstitution */.  
1f0e0 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
1f0f0 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20        /* SELECT 
1f100 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69  statement in whi
1f110 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74  ch to make subst
1f120 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  itutions */.  in
1f130 74 20 64 6f 50 72 69 6f 72 20 20 20 20 20 20 20  t doPrior       
1f140 20 20 20 20 2f 2a 20 44 6f 20 73 75 62 73 74 69      /* Do substi
1f150 74 75 74 65 73 20 6f 6e 20 70 2d 3e 70 50 72 69  tutes on p->pPri
1f160 6f 72 20 74 6f 6f 20 2a 2f 0a 29 7b 0a 20 20 53  or too */.){.  S
1f170 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20  rcList *pSrc;.  
1f180 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1f190 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
1f1a0 74 20 69 3b 0a 20 20 69 66 28 20 21 70 20 29 20  t i;.  if( !p ) 
1f1b0 72 65 74 75 72 6e 3b 0a 20 20 64 6f 7b 0a 20 20  return;.  do{.  
1f1c0 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1f1d0 70 53 75 62 73 74 2c 20 70 2d 3e 70 45 4c 69 73  pSubst, p->pELis
1f1e0 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  t);.    substExp
1f1f0 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 2d  rList(pSubst, p-
1f200 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
1f210 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53  substExprList(pS
1f220 75 62 73 74 2c 20 70 2d 3e 70 4f 72 64 65 72 42  ubst, p->pOrderB
1f230 79 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69  y);.    p->pHavi
1f240 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 70  ng = substExpr(p
1f250 53 75 62 73 74 2c 20 70 2d 3e 70 48 61 76 69 6e  Subst, p->pHavin
1f260 67 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72  g);.    p->pWher
1f270 65 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53  e = substExpr(pS
1f280 75 62 73 74 2c 20 70 2d 3e 70 57 68 65 72 65 29  ubst, p->pWhere)
1f290 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 2d 3e  ;.    pSrc = p->
1f2a0 70 53 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74  pSrc;.    assert
1f2b0 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20  ( pSrc!=0 );.   
1f2c0 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72   for(i=pSrc->nSr
1f2d0 63 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61  c, pItem=pSrc->a
1f2e0 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65  ; i>0; i--, pIte
1f2f0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62 73  m++){.      subs
1f300 74 53 65 6c 65 63 74 28 70 53 75 62 73 74 2c 20  tSelect(pSubst, 
1f310 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pItem->pSelect, 
1f320 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  1);.      if( pI
1f330 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  tem->fg.isTabFun
1f340 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 75 62  c ){.        sub
1f350 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73  stExprList(pSubs
1f360 74 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75  t, pItem->u1.pFu
1f370 6e 63 41 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a  ncArg);.      }.
1f380 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
1f390 64 6f 50 72 69 6f 72 20 26 26 20 28 70 20 3d 20  doPrior && (p = 
1f3a0 70 2d 3e 70 50 72 69 6f 72 29 21 3d 30 20 29 3b  p->pPrior)!=0 );
1f3b0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
1f3c0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1f3d0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
1f3e0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1f3f0 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69  MIT_VIEW) */..#i
1f400 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
1f410 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
1f420 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
1f430 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f  ITE_OMIT_VIEW)./
1f440 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1f450 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c  e attempts to fl
1f460 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73  atten subqueries
1f470 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63   as a performanc
1f480 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a  e optimization..
1f490 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1f4a0 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20  returns 1 if it 
1f4b0 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e  makes changes an
1f4c0 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65  d 0 if no flatte
1f4d0 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  ning occurs..**.
1f4e0 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64  ** To understand
1f4f0 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20   the concept of 
1f500 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73  flattening, cons
1f510 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ider the followi
1f520 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a  ng.** query:.**.
1f530 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  **     SELECT a 
1f540 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79  FROM (SELECT x+y
1f550 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
1f560 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45  ERE z<100) WHERE
1f570 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64   a>5.**.** The d
1f580 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d  efault way of im
1f590 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20  plementing this 
1f5a0 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63  query is to exec
1f5b0 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75  ute the.** subqu
1f5c0 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74  ery first and st
1f5d0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
1f5e0 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  in a temporary t
1f5f0 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75  able, then.** ru
1f600 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1f610 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72  y on that tempor
1f620 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73  ary table.  This
1f630 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a   requires two.**
1f640 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65   passes over the
1f650 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d   data.  Furtherm
1f660 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65  ore, because the
1f670 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1f680 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63  .** has no indic
1f690 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c  es, the WHERE cl
1f6a0 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65  ause on the oute
1f6b0 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62  r query cannot b
1f6c0 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a  e.** optimized..
1f6d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1f6e0 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  ne attempts to r
1f6f0 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73  ewrite queries s
1f700 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65  uch as the above
1f710 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
1f720 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c  e flat select, l
1f730 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
1f740 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41      SELECT x+y A
1f750 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S a FROM t1 WHER
1f760 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a  E z<100 AND a>5.
1f770 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67  **.** The code g
1f780 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69  enerated for thi
1f790 73 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e  s simplification
1f7a0 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20   gives the same 
1f7b0 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e  result.** but on
1f7c0 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74  ly has to scan t
1f7d0 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41  he data once.  A
1f7e0 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63  nd because indic
1f7f0 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69  es might .** exi
1f800 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  st on the table 
1f810 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73  t1, a complete s
1f820 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20  can of the data 
1f830 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69  might be.** avoi
1f840 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74  ded..**.** Flatt
1f850 65 6e 69 6e 67 20 69 73 20 73 75 62 6a 65 63 74  ening is subject
1f860 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
1f870 67 20 63 6f 6e 73 74 72 61 69 6e 74 73 3a 0a 2a  g constraints:.*
1f880 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e  *.**  (**)  We n
1f890 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74  o longer attempt
1f8a0 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72   to flatten aggr
1f8b0 65 67 61 74 65 20 73 75 62 71 75 65 72 69 65 73  egate subqueries
1f8c0 2e 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20  . Was:.**       
1f8d0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
1f8e0 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
1f8f0 79 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65  y cannot both be
1f900 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
1f910 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20  **  (**)  We no 
1f920 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20 74  longer attempt t
1f930 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65 67  o flatten aggreg
1f940 61 74 65 20 73 75 62 71 75 65 72 69 65 73 2e 20  ate subqueries. 
1f950 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 28  Was:.**        (
1f960 32 29 20 49 66 20 74 68 65 20 73 75 62 71 75 65  2) If the subque
1f970 72 79 20 69 73 20 61 6e 20 61 67 67 72 65 67 61  ry is an aggrega
1f980 74 65 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20  te then.**      
1f990 20 20 28 32 61 29 20 74 68 65 20 6f 75 74 65 72    (2a) the outer
1f9a0 20 71 75 65 72 79 20 6d 75 73 74 20 6e 6f 74 20   query must not 
1f9b0 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a 2a  be a join and.**
1f9c0 20 20 20 20 20 20 20 20 28 32 62 29 20 74 68 65          (2b) the
1f9d0 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 75 73   outer query mus
1f9e0 74 20 6e 6f 74 20 75 73 65 20 73 75 62 71 75 65  t not use subque
1f9f0 72 69 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ries.**         
1fa00 20 20 20 20 6f 74 68 65 72 20 74 68 61 6e 20 74      other than t
1fa10 68 65 20 6f 6e 65 20 46 52 4f 4d 2d 63 6c 61 75  he one FROM-clau
1fa20 73 65 20 73 75 62 71 75 65 72 79 20 74 68 61 74  se subquery that
1fa30 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 0a   is a candidate.
1fa40 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 66  **             f
1fa50 6f 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20  or flattening.  
1fa60 28 54 68 69 73 20 69 73 20 64 75 65 20 74 6f 20  (This is due to 
1fa70 74 69 63 6b 65 74 20 5b 32 66 37 31 37 30 64 37  ticket [2f7170d7
1fa80 33 62 66 39 61 62 66 38 30 5d 0a 2a 2a 20 20 20  3bf9abf80].**   
1fa90 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20 32            from 2
1faa0 30 31 35 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a 2a  015-02-09.).**.*
1fab0 2a 20 20 20 28 33 29 20 20 49 66 20 74 68 65 20  *   (3)  If the 
1fac0 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20  subquery is the 
1fad0 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
1fae0 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 74 68 65   a LEFT JOIN the
1faf0 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 61 29  n.**        (3a)
1fb00 20 74 68 65 20 73 75 62 71 75 65 72 79 20 6d 61   the subquery ma
1fb10 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20  y not be a join 
1fb20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 33  and.**        (3
1fb30 62 29 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  b) the FROM clau
1fb40 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  se of the subque
1fb50 72 79 20 6d 61 79 20 6e 6f 74 20 63 6f 6e 74 61  ry may not conta
1fb60 69 6e 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20  in a virtual.** 
1fb70 20 20 20 20 20 20 20 20 20 20 20 20 74 61 62 6c              tabl
1fb80 65 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  e and.**        
1fb90 28 33 63 29 20 74 68 65 20 6f 75 74 65 72 20 71  (3c) the outer q
1fba0 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20  uery may not be 
1fbb0 61 6e 20 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a  an aggregate..**
1fbc0 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73  .**   (4)  The s
1fbd0 75 62 71 75 65 72 79 20 63 61 6e 20 6e 6f 74 20  ubquery can not 
1fbe0 62 65 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a  be DISTINCT..**.
1fbf0 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65  **  (**)  At one
1fc00 20 70 6f 69 6e 74 20 72 65 73 74 72 69 63 74 69   point restricti
1fc10 6f 6e 73 20 28 34 29 20 61 6e 64 20 28 35 29 20  ons (4) and (5) 
1fc20 64 65 66 69 6e 65 64 20 61 20 73 75 62 73 65 74  defined a subset
1fc30 20 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20   of DISTINCT.** 
1fc40 20 20 20 20 20 20 20 73 75 62 2d 71 75 65 72 69         sub-queri
1fc50 65 73 20 74 68 61 74 20 77 65 72 65 20 65 78 63  es that were exc
1fc60 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 69 73 20  luded from this 
1fc70 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65  optimization. Re
1fc80 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  striction .**   
1fc90 20 20 20 20 20 28 34 29 20 68 61 73 20 73 69 6e       (4) has sin
1fca0 63 65 20 62 65 65 6e 20 65 78 70 61 6e 64 65 64  ce been expanded
1fcb0 20 74 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c 20   to exclude all 
1fcc0 44 49 53 54 49 4e 43 54 20 73 75 62 71 75 65 72  DISTINCT subquer
1fcd0 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  ies..**.**  (**)
1fce0 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61    We no longer a
1fcf0 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74 65  ttempt to flatte
1fd00 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62 71  n aggregate subq
1fd10 75 65 72 69 65 73 2e 20 20 57 61 73 3a 0a 2a 2a  ueries.  Was:.**
1fd20 20 20 20 20 20 20 20 20 49 66 20 74 68 65 20 73          If the s
1fd30 75 62 71 75 65 72 79 20 69 73 20 61 67 67 72 65  ubquery is aggre
1fd40 67 61 74 65 2c 20 74 68 65 20 6f 75 74 65 72 20  gate, the outer 
1fd50 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
1fd60 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a   DISTINCT..**.**
1fd70 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71     (7)  The subq
1fd80 75 65 72 79 20 6d 75 73 74 20 68 61 76 65 20 61  uery must have a
1fd90 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
1fda0 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62 71 75 65  ODO:  For subque
1fdb0 72 69 65 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20  ries without.** 
1fdc0 20 20 20 20 20 20 20 41 20 46 52 4f 4d 20 63 6c         A FROM cl
1fdd0 61 75 73 65 2c 20 63 6f 6e 73 69 64 65 72 20 61  ause, consider a
1fde0 64 64 69 6e 67 20 61 20 46 52 4f 4d 20 63 6c 61  dding a FROM cla
1fdf0 75 73 65 20 77 69 74 68 20 74 68 65 20 73 70 65  use with the spe
1fe00 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74  cial.**        t
1fe10 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65  able sqlite_once
1fe20 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f   that consists o
1fe30 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 63  f a single row c
1fe40 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20  ontaining a.**  
1fe50 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c        single NUL
1fe60 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20  L..**.**   (8)  
1fe70 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1fe80 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65 6e 20  uses LIMIT then 
1fe90 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1fea0 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69  may not be a joi
1feb0 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20  n..**.**   (9)  
1fec0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1fed0 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65 6e 20  uses LIMIT then 
1fee0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1fef0 6d 61 79 20 6e 6f 74 20 62 65 20 61 67 67 72 65  may not be aggre
1ff00 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  gate..**.**  (**
1ff10 29 20 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  )  Restriction (
1ff20 31 30 29 20 77 61 73 20 72 65 6d 6f 76 65 64 20  10) was removed 
1ff30 66 72 6f 6d 20 74 68 65 20 63 6f 64 65 20 6f 6e  from the code on
1ff40 20 32 30 30 35 2d 30 32 2d 30 35 20 62 75 74 20   2005-02-05 but 
1ff50 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 63 63  we.**        acc
1ff60 69 64 65 6e 74 6c 79 20 63 61 72 72 69 65 64 20  idently carried 
1ff70 74 68 65 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 77  the comment forw
1ff80 61 72 64 20 75 6e 74 69 6c 20 32 30 31 34 2d 30  ard until 2014-0
1ff90 39 2d 31 35 2e 20 20 4f 72 69 67 69 6e 61 6c 0a  9-15.  Original.
1ffa0 2a 2a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72  **        constr
1ffb0 61 69 6e 74 3a 20 22 49 66 20 74 68 65 20 73 75  aint: "If the su
1ffc0 62 71 75 65 72 79 20 69 73 20 61 67 67 72 65 67  bquery is aggreg
1ffd0 61 74 65 20 74 68 65 6e 20 74 68 65 20 6f 75 74  ate then the out
1ffe0 65 72 20 71 75 65 72 79 20 0a 2a 2a 20 20 20 20  er query .**    
1fff0 20 20 20 20 6d 61 79 20 6e 6f 74 20 75 73 65 20      may not use 
20000 4c 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20 28  LIMIT.".**.**  (
20010 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72  11)  The subquer
20020 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  y and the outer 
20030 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 6f  query may not bo
20040 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59  th have ORDER BY
20050 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
20060 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65   (**)  Not imple
20070 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65  mented.  Subsume
20080 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69  d into restricti
20090 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72 65  on (3).  Was pre
200a0 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20  viously.**      
200b0 20 20 61 20 73 65 70 61 72 61 74 65 20 72 65 73    a separate res
200c0 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e  triction derivin
200d0 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33  g from ticket #3
200e0 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20  50..**.**  (13) 
200f0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
20100 64 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61  d outer query ma
20110 79 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c  y not both use L
20120 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34  IMIT..**.**  (14
20130 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
20140 6d 61 79 20 6e 6f 74 20 75 73 65 20 4f 46 46 53  may not use OFFS
20150 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20  ET..**.**  (15) 
20160 20 49 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   If the outer qu
20170 65 72 79 20 69 73 20 70 61 72 74 20 6f 66 20 61  ery is part of a
20180 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
20190 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20  , then the.**   
201a0 20 20 20 20 20 73 75 62 71 75 65 72 79 20 6d 61       subquery ma
201b0 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 2e  y not use LIMIT.
201c0 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65 20  .**        (See 
201d0 74 69 63 6b 65 74 20 23 32 33 33 39 20 61 6e 64  ticket #2339 and
201e0 20 74 69 63 6b 65 74 20 5b 30 32 61 38 65 38 31   ticket [02a8e81
201f0 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  d44])..**.**  (1
20200 36 29 20 20 49 66 20 74 68 65 20 6f 75 74 65 72  6)  If the outer
20210 20 71 75 65 72 79 20 69 73 20 61 67 67 72 65 67   query is aggreg
20220 61 74 65 2c 20 74 68 65 6e 20 74 68 65 20 73 75  ate, then the su
20230 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 0a 2a  bquery may not.*
20240 2a 20 20 20 20 20 20 20 20 75 73 65 20 4f 52 44  *        use ORD
20250 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20  ER BY.  (Ticket 
20260 23 32 39 34 32 29 20 20 54 68 69 73 20 75 73 65  #2942)  This use
20270 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a  d to not matter.
20280 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20  **        until 
20290 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68  we introduced th
202a0 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29  e group_concat()
202b0 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a   function.  .**.
202c0 2a 2a 20 20 28 31 37 29 20 20 49 66 20 74 68 65  **  (17)  If the
202d0 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20 63   subquery is a c
202e0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
202f0 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28  then.**        (
20300 31 37 61 29 20 61 6c 6c 20 63 6f 6d 70 6f 75 6e  17a) all compoun
20310 64 20 6f 70 65 72 61 74 6f 72 73 20 6d 75 73 74  d operators must
20320 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 2c   be a UNION ALL,
20330 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28   and.**        (
20340 31 37 62 29 20 6e 6f 20 74 65 72 6d 73 20 77 69  17b) no terms wi
20350 74 68 69 6e 20 74 68 65 20 73 75 62 71 75 65 72  thin the subquer
20360 79 20 63 6f 6d 70 6f 75 6e 64 20 6d 61 79 20 62  y compound may b
20370 65 20 61 67 67 72 65 67 61 74 65 0a 2a 2a 20 20  e aggregate.**  
20380 20 20 20 20 20 20 20 20 20 20 20 20 6f 72 20 44              or D
20390 49 53 54 49 4e 43 54 2c 20 61 6e 64 0a 2a 2a 20  ISTINCT, and.** 
203a0 20 20 20 20 20 20 20 28 31 37 63 29 20 65 76 65         (17c) eve
203b0 72 79 20 74 65 72 6d 20 77 69 74 68 69 6e 20 74  ry term within t
203c0 68 65 20 73 75 62 71 75 65 72 79 20 63 6f 6d 70  he subquery comp
203d0 6f 75 6e 64 20 6d 75 73 74 20 68 61 76 65 20 61  ound must have a
203e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20   FROM clause.** 
203f0 20 20 20 20 20 20 20 28 31 37 64 29 20 74 68 65         (17d) the
20400 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79   outer query may
20410 20 6e 6f 74 20 62 65 0a 2a 2a 20 20 20 20 20 20   not be.**      
20420 20 20 20 20 20 20 20 20 28 31 37 64 31 29 20 61          (17d1) a
20430 67 67 72 65 67 61 74 65 2c 20 6f 72 0a 2a 2a 20  ggregate, or.** 
20440 20 20 20 20 20 20 20 20 20 20 20 20 20 28 31 37               (17
20450 64 32 29 20 44 49 53 54 49 4e 43 54 2c 20 6f 72  d2) DISTINCT, or
20460 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
20470 20 28 31 37 64 33 29 20 61 20 6a 6f 69 6e 2e 0a   (17d3) a join..
20480 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65  **.**        The
20490 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62 2d   parent and sub-
204a0 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61 69  query may contai
204b0 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e  n WHERE clauses.
204c0 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20   Subject to.**  
204d0 20 20 20 20 20 20 72 75 6c 65 73 20 28 31 31 29        rules (11)
204e0 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34 29 2c  , (13) and (14),
204f0 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20 63   they may also c
20500 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2c  ontain ORDER BY,
20510 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49 54  .**        LIMIT
20520 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75   and OFFSET clau
20530 73 65 73 2e 20 20 54 68 65 20 73 75 62 71 75 65  ses.  The subque
20540 72 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e  ry cannot use an
20550 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20  y compound.**   
20560 20 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f 74       operator ot
20570 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41  her than UNION A
20580 4c 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20 74  LL because all t
20590 68 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e  he other compoun
205a0 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72  d.**        oper
205b0 61 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69 6d  ators have an im
205c0 70 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20 77  plied DISTINCT w
205d0 68 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f 77  hich is disallow
205e0 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20 20  ed by.**        
205f0 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29 2e  restriction (4).
20600 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c  .**.**        Al
20610 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65  so, each compone
20620 6e 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75  nt of the sub-qu
20630 65 72 79 20 6d 75 73 74 20 72 65 74 75 72 6e 20  ery must return 
20640 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a  the same number.
20650 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 72 65 73  **        of res
20660 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69  ult columns. Thi
20670 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  s is actually a 
20680 72 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72 20  requirement for 
20690 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20  any compound.** 
206a0 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 73 74         SELECT st
206b0 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c  atement, but all
206c0 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20 64   the code here d
206d0 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 75 72 65  oes is make sure
206e0 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20   that no.**     
206f0 20 20 20 73 75 63 68 20 28 69 6c 6c 65 67 61 6c     such (illegal
20700 29 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 66  ) sub-query is f
20710 6c 61 74 74 65 6e 65 64 2e 20 54 68 65 20 63 61  lattened. The ca
20720 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74 65 63 74  ller will detect
20730 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73   the.**        s
20740 79 6e 74 61 78 20 65 72 72 6f 72 20 61 6e 64 20  yntax error and 
20750 72 65 74 75 72 6e 20 61 20 64 65 74 61 69 6c 65  return a detaile
20760 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a  d message..**.**
20770 20 20 28 31 38 29 20 20 49 66 20 74 68 65 20 73    (18)  If the s
20780 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
20790 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74  mpound select, t
207a0 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66  hen all terms of
207b0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f   the.**        O
207c0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
207d0 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73  f the parent mus
207e0 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65  t be simple refe
207f0 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20  rences to .**   
20800 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20       columns of 
20810 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a  the sub-query..*
20820 2a 0a 2a 2a 20 20 28 31 39 29 20 20 49 66 20 74  *.**  (19)  If t
20830 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
20840 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20   LIMIT then the 
20850 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20  outer query may 
20860 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61  not.**        ha
20870 76 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  ve a WHERE claus
20880 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20  e..**.**  (20)  
20890 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
208a0 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   is a compound s
208b0 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d  elect, then it m
208c0 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20  ust not use.**  
208d0 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42        an ORDER B
208e0 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65  Y clause.  Ticke
208f0 74 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75  t #3773.  We cou
20900 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f  ld relax this co
20910 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20  nstraint.**     
20920 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73     somewhat by s
20930 61 79 69 6e 67 20 74 68 61 74 20 74 68 65 20 74  aying that the t
20940 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
20950 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74  R BY clause must
20960 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65 61  .**        appea
20970 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20  r as unmodified 
20980 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69  result columns i
20990 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
209a0 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20 20 20  y.  But we.**   
209b0 20 20 20 20 20 68 61 76 65 20 6f 74 68 65 72 20       have other 
209c0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e  optimizations in
209d0 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69   mind to deal wi
209e0 74 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a  th that case..**
209f0 0a 2a 2a 20 20 28 32 31 29 20 20 49 66 20 74 68  .**  (21)  If th
20a00 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
20a10 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f  LIMIT then the o
20a20 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
20a30 6f 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20  ot be.**        
20a40 44 49 53 54 49 4e 43 54 2e 20 20 28 53 65 65 20  DISTINCT.  (See 
20a50 74 69 63 6b 65 74 20 5b 37 35 32 65 31 36 34 36  ticket [752e1646
20a60 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32  fc])..**.**  (22
20a70 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
20a80 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 72 65 63  may not be a rec
20a90 75 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a  ursive CTE..**.*
20aa0 2a 20 20 28 2a 2a 29 20 20 53 75 62 73 75 6d 65  *  (**)  Subsume
20ab0 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69  d into restricti
20ac0 6f 6e 20 28 31 37 64 33 29 2e 20 20 57 61 73 3a  on (17d3).  Was:
20ad0 20 49 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   If the outer qu
20ae0 65 72 79 20 69 73 0a 2a 2a 20 20 20 20 20 20 20  ery is.**       
20af0 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45   a recursive CTE
20b00 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 2d 71  , then the sub-q
20b10 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20  uery may not be 
20b20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
20b30 2e 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 69 73  ..**        This
20b40 20 72 65 73 74 72 69 63 74 69 6f 6e 20 69 73 20   restriction is 
20b50 62 65 63 61 75 73 65 20 74 72 61 6e 73 66 6f 72  because transfor
20b60 6d 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20  ming the.**     
20b70 20 20 20 70 61 72 65 6e 74 20 74 6f 20 61 20 63     parent to a c
20b80 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 63 6f  ompound query co
20b90 6e 66 75 73 65 73 20 74 68 65 20 63 6f 64 65 20  nfuses the code 
20ba0 74 68 61 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20  that handles.** 
20bb0 20 20 20 20 20 20 20 72 65 63 75 72 73 69 76 65         recursive
20bc0 20 71 75 65 72 69 65 73 20 69 6e 20 6d 75 6c 74   queries in mult
20bd0 69 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a  iSelect()..**.**
20be0 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f    (**)  We no lo
20bf0 6e 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20  nger attempt to 
20c00 66 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61 74  flatten aggregat
20c10 65 20 73 75 62 71 75 65 72 69 65 73 2e 20 20 57  e subqueries.  W
20c20 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68  as:.**        Th
20c30 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e  e subquery may n
20c40 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65 67 61  ot be an aggrega
20c50 74 65 20 74 68 61 74 20 75 73 65 73 20 74 68 65  te that uses the
20c60 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 20   built-in min() 
20c70 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72  or .**        or
20c80 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 73   max() functions
20c90 2e 20 20 28 57 69 74 68 6f 75 74 20 74 68 69 73  .  (Without this
20ca0 20 72 65 73 74 72 69 63 74 69 6f 6e 2c 20 61 20   restriction, a 
20cb0 71 75 65 72 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20  query like:.**  
20cc0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 78 20        "SELECT x 
20cd0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 6d 61 78  FROM (SELECT max
20ce0 28 79 29 2c 20 78 20 46 52 4f 4d 20 74 31 29 22  (y), x FROM t1)"
20cf0 20 77 6f 75 6c 64 20 6e 6f 74 20 6e 65 63 65 73   would not neces
20d00 73 61 72 69 6c 79 0a 2a 2a 20 20 20 20 20 20 20  sarily.**       
20d10 20 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   return the valu
20d20 65 20 58 20 66 6f 72 20 77 68 69 63 68 20 59 20  e X for which Y 
20d30 77 61 73 20 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a  was maximal.).**
20d40 0a 2a 2a 20 20 28 32 35 29 20 20 49 66 20 65 69  .**  (25)  If ei
20d50 74 68 65 72 20 74 68 65 20 73 75 62 71 75 65 72  ther the subquer
20d60 79 20 6f 72 20 74 68 65 20 70 61 72 65 6e 74 20  y or the parent 
20d70 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 61  query contains a
20d80 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 20 20 20   window.**      
20d90 20 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68    function in th
20da0 65 20 73 65 6c 65 63 74 20 6c 69 73 74 20 6f 72  e select list or
20db0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
20dc0 2c 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20  , flattening.** 
20dd0 20 20 20 20 20 20 20 69 73 20 6e 6f 74 20 61 74         is not at
20de0 74 65 6d 70 74 65 64 2e 0a 2a 2a 0a 2a 2a 0a 2a  tempted..**.**.*
20df0 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  * In this routin
20e00 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d  e, the "p" param
20e10 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65  eter is a pointe
20e20 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71  r to the outer q
20e30 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62  uery..** The sub
20e40 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63  query is p->pSrc
20e50 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41  ->a[iFrom].  isA
20e60 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  gg is true if th
20e70 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a  e outer query.**
20e80 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73   uses aggregates
20e90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74  ..**.** If flatt
20ea0 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74  ening is not att
20eb0 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75  empted, this rou
20ec0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
20ed0 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a  and returns 0..*
20ee0 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
20ef0 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69  is attempted thi
20f00 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
20f10 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f  s 1..**.** All o
20f20 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
20f30 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f   analysis must o
20f40 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65  ccur on both the
20f50 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
20f60 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79  .** the subquery
20f70 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
20f80 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74  tine runs..*/.st
20f90 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e  atic int flatten
20fa0 53 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73  Subquery(.  Pars
20fb0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
20fc0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
20fd0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
20fe0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
20ff0 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f   The parent or o
21000 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74  uter SELECT stat
21010 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ement */.  int i
21020 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  From,           
21030 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70  /* Index in p->p
21040 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20  Src->a[] of the 
21050 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a  inner subquery *
21060 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 20 20 20  /.  int isAgg   
21070 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
21080 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54   if outer SELECT
21090 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
210a0 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  functions */.){.
210b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
210c0 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20  avedAuthContext 
210d0 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43  = pParse->zAuthC
210e0 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74  ontext;.  Select
210f0 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 2f 2a   *pParent;    /*
21100 20 43 75 72 72 65 6e 74 20 55 4e 49 4f 4e 20 41   Current UNION A
21110 4c 4c 20 74 65 72 6d 20 6f 66 20 74 68 65 20 6f  LL term of the o
21120 74 68 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  ther query */.  
21130 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20  Select *pSub;   
21140 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72      /* The inner
21150 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75   query or "subqu
21160 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ery" */.  Select
21170 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a   *pSub1;      /*
21180 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
21190 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74  rightmost select
211a0 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f   in sub-query */
211b0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
211c0 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ;      /* The FR
211d0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
211e0 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
211f0 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53    SrcList *pSubS
21200 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f  rc;   /* The FRO
21210 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
21220 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  subquery */.  in
21230 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20  t iParent;      
21240 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72    /* VDBE cursor
21250 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
21260 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20 74  Sub result set t
21270 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  emp table */.  i
21280 6e 74 20 69 4e 65 77 50 61 72 65 6e 74 20 3d 20  nt iNewParent = 
21290 2d 31 3b 2f 2a 20 52 65 70 6c 61 63 65 6d 65 6e  -1;/* Replacemen
212a0 74 20 74 61 62 6c 65 20 66 6f 72 20 69 50 61 72  t table for iPar
212b0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c  ent */.  int isL
212c0 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 20 2f 2a 20  eftJoin = 0; /* 
212d0 54 72 75 65 20 69 66 20 70 53 75 62 20 69 73 20  True if pSub is 
212e0 74 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f  the right side o
212f0 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f  f a LEFT JOIN */
21300 20 20 20 20 0a 20 20 69 6e 74 20 69 3b 20 20 20      .  int i;   
21310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
21320 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
21330 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
21340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21350 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
21360 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
21370 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
21380 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68  Subitem;   /* Th
21390 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
213a0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
213b0 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  arse->db;..  /* 
213c0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
213d0 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
213e0 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e  rmitted.  Return
213f0 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a   0 if not..  */.
21400 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
21410 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
21420 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 69 66  Prior==0 );.  if
21430 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69  ( OptimizationDi
21440 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  sabled(db, SQLIT
21450 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72  E_QueryFlattener
21460 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
21470 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
21480 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26    assert( pSrc &
21490 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46  & iFrom>=0 && iF
214a0 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29  rom<pSrc->nSrc )
214b0 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26  ;.  pSubitem = &
214c0 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a  pSrc->a[iFrom];.
214d0 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62    iParent = pSub
214e0 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  item->iCursor;. 
214f0 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d   pSub = pSubitem
21500 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73  ->pSelect;.  ass
21510 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a  ert( pSub!=0 );.
21520 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21530 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a  OMIT_WINDOWFUNC.
21540 20 20 69 66 28 20 70 2d 3e 70 57 69 6e 20 7c 7c    if( p->pWin ||
21550 20 70 53 75 62 2d 3e 70 57 69 6e 20 29 20 72 65   pSub->pWin ) re
21560 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
21570 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
21580 72 69 63 74 69 6f 6e 20 28 32 35 29 20 2a 2f 0a  riction (25) */.
21590 23 65 6e 64 69 66 0a 0a 20 20 70 53 75 62 53 72  #endif..  pSubSr
215a0 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a  c = pSub->pSrc;.
215b0 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72    assert( pSubSr
215c0 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20  c );.  /* Prior 
215d0 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32  to version 3.1.2
215e0 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64  , when LIMIT and
215f0 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20 62   OFFSET had to b
21600 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e  e simple constan
21610 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62  ts,.  ** not arb
21620 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f  itrary expressio
21630 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73  ns, we allowed s
21640 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66  ome combining of
21650 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
21660 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74  T.  ** because t
21670 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d  hey could be com
21680 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  puted at compile
21690 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e  -time.  But when
216a0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
216b0 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72  T.  ** became ar
216c0 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69  bitrary expressi
216d0 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72  ons, we were for
216e0 63 65 64 20 74 6f 20 61 64 64 20 72 65 73 74 72  ced to add restr
216f0 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a  ictions (13).  *
21700 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20  * and (14). */. 
21710 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
21720 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29  t && p->pLimit )
21730 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
21740 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
21750 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20  iction (13) */. 
21760 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
21770 74 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69  t && pSub->pLimi
21780 74 2d 3e 70 52 69 67 68 74 20 29 20 72 65 74 75  t->pRight ) retu
21790 72 6e 20 30 3b 20 20 20 2f 2a 20 52 65 73 74 72  rn 0;   /* Restr
217a0 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20  iction (14) */. 
217b0 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
217c0 73 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e 64 29  s & SF_Compound)
217d0 21 3d 30 20 26 26 20 70 53 75 62 2d 3e 70 4c 69  !=0 && pSub->pLi
217e0 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  mit ){.    retur
217f0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
21800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21820 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
21830 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  15) */.  }.  if(
21840 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d   pSubSrc->nSrc==
21850 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  0 ) return 0;   
21860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21870 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
21880 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28  on (7)  */.  if(
21890 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
218a0 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 20  & SF_Distinct ) 
218b0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
218c0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
218d0 6f 6e 20 28 34 29 20 20 2a 2f 0a 20 20 69 66 28  on (4)  */.  if(
218e0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
218f0 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c   (pSrc->nSrc>1 |
21900 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20  | isAgg) ){.    
21910 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
21920 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
21930 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d  ns (8)(9) */.  }
21940 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
21950 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  By && pSub->pOrd
21960 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74  erBy ){.     ret
21970 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
21980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219a0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
219b0 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (11) */.  }.  if
219c0 28 20 69 73 41 67 67 20 26 26 20 70 53 75 62 2d  ( isAgg && pSub-
219d0 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75  >pOrderBy ) retu
219e0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
219f0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
21a00 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66  ion (16) */.  if
21a10 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
21a20 26 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65  & p->pWhere ) re
21a30 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
21a40 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
21a50 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69 66  ion (19) */.  if
21a60 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
21a70 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
21a80 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
21a90 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
21aa0 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;         /* Re
21ab0 73 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20 2a  striction (21) *
21ac0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  /.  }.  if( pSub
21ad0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
21ae0 5f 52 65 63 75 72 73 69 76 65 29 20 29 7b 0a 20  _Recursive) ){. 
21af0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
21b00 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 32 32  Restrictions (22
21b10 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  ) */.  }..  /*. 
21b20 20 2a 2a 20 49 66 20 74 68 65 20 73 75 62 71 75   ** If the subqu
21b30 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
21b40 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45   operand of a LE
21b50 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 74 68  FT JOIN, then th
21b60 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20  e.  ** subquery 
21b70 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69  may not be a joi
21b80 6e 20 69 74 73 65 6c 66 20 28 33 61 29 2e 20 45  n itself (3a). E
21b90 78 61 6d 70 6c 65 20 6f 66 20 77 68 79 20 74 68  xample of why th
21ba0 69 73 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61  is is not.  ** a
21bb0 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
21bc0 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
21bd0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32  T OUTER JOIN (t2
21be0 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20   JOIN t3).  **. 
21bf0 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
21c00 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
21c10 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
21c20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
21c30 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
21c40 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a  t2) JOIN t3.  **
21c50 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e  .  ** which is n
21c60 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61  ot at all the sa
21c70 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20  me thing..  **. 
21c80 20 2a 2a 20 49 66 20 74 68 65 20 73 75 62 71 75   ** If the subqu
21c90 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
21ca0 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45   operand of a LE
21cb0 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 74 68  FT JOIN, then th
21cc0 65 20 6f 75 74 65 72 0a 20 20 2a 2a 20 71 75 65  e outer.  ** que
21cd0 72 79 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20  ry cannot be an 
21ce0 61 67 67 72 65 67 61 74 65 2e 20 28 33 63 29 20  aggregate. (3c) 
21cf0 20 54 68 69 73 20 69 73 20 61 6e 20 61 72 74 69   This is an arti
21d00 66 61 63 74 20 6f 66 20 74 68 65 20 77 61 79 0a  fact of the way.
21d10 20 20 2a 2a 20 61 67 67 72 65 67 61 74 65 73 20    ** aggregates 
21d20 61 72 65 20 70 72 6f 63 65 73 73 65 64 20 2d 20  are processed - 
21d30 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 65 63 68  there is no mech
21d40 61 6e 69 73 6d 20 74 6f 20 64 65 74 65 72 6d 69  anism to determi
21d50 6e 65 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 4c  ne if.  ** the L
21d60 45 46 54 20 4a 4f 49 4e 20 74 61 62 6c 65 20 73  EFT JOIN table s
21d70 68 6f 75 6c 64 20 62 65 20 61 6c 6c 2d 4e 55 4c  hould be all-NUL
21d80 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65  L..  **.  ** See
21d90 20 61 6c 73 6f 20 74 69 63 6b 65 74 73 20 23 33   also tickets #3
21da0 30 36 2c 20 23 33 35 30 2c 20 61 6e 64 20 23 33  06, #350, and #3
21db0 33 30 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  300..  */.  if( 
21dc0 28 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f  (pSubitem->fg.jo
21dd0 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
21de0 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 73 4c  R)!=0 ){.    isL
21df0 65 66 74 4a 6f 69 6e 20 3d 20 31 3b 0a 20 20 20  eftJoin = 1;.   
21e00 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53   if( pSubSrc->nS
21e10 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 20 7c 7c  rc>1 || isAgg ||
21e20 20 49 73 56 69 72 74 75 61 6c 28 70 53 75 62 53   IsVirtual(pSubS
21e30 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 29 20 29  rc->a[0].pTab) )
21e40 7b 0a 20 20 20 20 20 20 2f 2a 20 20 28 33 61 29  {.      /*  (3a)
21e50 20 20 20 20 20 20 20 20 20 20 20 20 20 28 33 63               (3c
21e60 29 20 20 20 20 20 28 33 62 29 20 2a 2f 0a 20 20  )     (3b) */.  
21e70 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
21e80 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53    }.  }.#ifdef S
21e90 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 46 4e 55  QLITE_EXTRA_IFNU
21ea0 4c 4c 52 4f 57 0a 20 20 65 6c 73 65 20 69 66 28  LLROW.  else if(
21eb0 20 69 46 72 6f 6d 3e 30 20 26 26 20 21 69 73 41   iFrom>0 && !isA
21ec0 67 67 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 74  gg ){.    /* Set
21ed0 74 69 6e 67 20 69 73 4c 65 66 74 4a 6f 69 6e 20  ting isLeftJoin 
21ee0 74 6f 20 2d 31 20 63 61 75 73 65 73 20 4f 50 5f  to -1 causes OP_
21ef0 49 66 4e 75 6c 6c 52 6f 77 20 6f 70 63 6f 64 65  IfNullRow opcode
21f00 73 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65  s to be generate
21f10 64 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65  d for.    ** eve
21f20 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ry reference to 
21f30 61 6e 79 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  any result colum
21f40 6e 20 66 72 6f 6d 20 73 75 62 71 75 65 72 79 20  n from subquery 
21f50 69 6e 20 61 20 6a 6f 69 6e 2c 20 65 76 65 6e 0a  in a join, even.
21f60 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 74 68      ** though th
21f70 65 79 20 61 72 65 20 6e 6f 74 20 6e 65 63 65 73  ey are not neces
21f80 73 61 72 79 2e 20 20 54 68 69 73 20 77 69 6c 6c  sary.  This will
21f90 20 73 74 72 65 73 73 2d 74 65 73 74 20 74 68 65   stress-test the
21fa0 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 20 0a 20   OP_IfNullRow . 
21fb0 20 20 20 2a 2a 20 6f 70 63 6f 64 65 2e 20 2a 2f     ** opcode. */
21fc0 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f 69 6e 20  .    isLeftJoin 
21fd0 3d 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  = -1;.  }.#endif
21fe0 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  ..  /* Restricti
21ff0 6f 6e 20 28 31 37 29 3a 20 49 66 20 74 68 65 20  on (17): If the 
22000 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
22010 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20  ompound SELECT, 
22020 74 68 65 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a  then it must.  *
22030 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 55  * use only the U
22040 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
22050 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74  r. And none of t
22060 68 65 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74  he simple select
22070 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 68   queries.  ** th
22080 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63  at make up the c
22090 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61  ompound SELECT a
220a0 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  re allowed to be
220b0 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 64 69   aggregate or di
220c0 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72  stinct.  ** quer
220d0 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ies..  */.  if( 
220e0 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  pSub->pPrior ){.
220f0 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f      if( pSub->pO
22100 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
22110 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65  return 0;  /* Re
22120 73 74 72 69 63 74 69 6f 6e 20 28 32 30 29 20 2a  striction (20) *
22130 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  /.    }.    if( 
22140 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c  isAgg || (p->sel
22150 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
22160 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d  nct)!=0 || pSrc-
22170 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20 20 20  >nSrc!=1 ){.    
22180 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 28    return 0; /* (
22190 31 37 64 31 29 2c 20 28 31 37 64 32 29 2c 20 6f  17d1), (17d2), o
221a0 72 20 28 31 37 64 33 29 20 2a 2f 0a 20 20 20 20  r (17d3) */.    
221b0 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62 31 3d  }.    for(pSub1=
221c0 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70 53 75  pSub; pSub1; pSu
221d0 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f 72  b1=pSub1->pPrior
221e0 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
221f0 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c  e( (pSub1->selFl
22200 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
22210 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
22220 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29  )==SF_Distinct )
22230 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
22240 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61  ( (pSub1->selFla
22250 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
22260 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
22270 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29  ==SF_Aggregate )
22280 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
22290 70 53 75 62 2d 3e 70 53 72 63 21 3d 30 20 29 3b  pSub->pSrc!=0 );
222a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
222b0 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  Sub->pEList->nEx
222c0 70 72 3d 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73  pr==pSub1->pELis
222d0 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
222e0 20 20 69 66 28 20 28 70 53 75 62 31 2d 3e 73 65    if( (pSub1->se
222f0 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
22300 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
22310 74 65 29 29 21 3d 30 20 20 20 20 2f 2a 20 28 31  te))!=0    /* (1
22320 37 62 29 20 2a 2f 0a 20 20 20 20 20 20 20 7c 7c  7b) */.       ||
22330 20 28 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 20   (pSub1->pPrior 
22340 26 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b  && pSub1->op!=TK
22350 5f 41 4c 4c 29 20 20 20 20 20 20 20 20 20 20 20  _ALL)           
22360 20 20 20 20 20 20 2f 2a 20 28 31 37 61 29 20 2a        /* (17a) *
22370 2f 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62  /.       || pSub
22380 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31 20  1->pSrc->nSrc<1 
22390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223b0 20 2f 2a 20 28 31 37 63 29 20 2a 2f 0a 20 20 20   /* (17c) */.   
223c0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65     ){.        re
223d0 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
223e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
223f0 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72  pSub1->pSrc->nSr
22400 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  c>1 );.    }..  
22410 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
22420 20 28 31 38 29 2e 20 2a 2f 0a 20 20 20 20 69 66   (18). */.    if
22430 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
22440 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  .      int ii;. 
22450 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
22460 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  i<p->pOrderBy->n
22470 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
22480 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
22490 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e  erBy->a[ii].u.x.
224a0 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29  iOrderByCol==0 )
224b0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
224c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
224d0 2f 2a 20 45 78 2d 72 65 73 74 72 69 63 74 69 6f  /* Ex-restrictio
224e0 6e 20 28 32 33 29 3a 0a 20 20 2a 2a 20 54 68 65  n (23):.  ** The
224f0 20 6f 6e 6c 79 20 77 61 79 20 74 68 61 74 20 74   only way that t
22500 68 65 20 72 65 63 75 72 73 69 76 65 20 70 61 72  he recursive par
22510 74 20 6f 66 20 61 20 43 54 45 20 63 61 6e 20 63  t of a CTE can c
22520 6f 6e 74 61 69 6e 20 61 20 63 6f 6d 70 6f 75 6e  ontain a compoun
22530 64 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20  d.  ** subquery 
22540 69 73 20 66 6f 72 20 74 68 65 20 73 75 62 71 75  is for the subqu
22550 65 72 79 20 74 6f 20 62 65 20 6f 6e 65 20 74 65  ery to be one te
22560 72 6d 20 6f 66 20 61 20 6a 6f 69 6e 2e 20 20 42  rm of a join.  B
22570 75 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 73  ut if the.  ** s
22580 75 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69  ubquery is a joi
22590 6e 2c 20 74 68 65 6e 20 74 68 65 20 66 6c 61 74  n, then the flat
225a0 74 65 6e 69 6e 67 20 68 61 73 20 61 6c 72 65 61  tening has alrea
225b0 64 79 20 62 65 65 6e 20 73 74 6f 70 70 65 64 20  dy been stopped 
225c0 62 79 0a 20 20 2a 2a 20 72 65 73 74 72 69 63 74  by.  ** restrict
225d0 69 6f 6e 20 28 31 37 64 33 29 0a 20 20 2a 2f 0a  ion (17d3).  */.
225e0 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65    assert( (p->se
225f0 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
22600 72 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70 53 75  rsive)==0 || pSu
22610 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a  b->pPrior==0 );.
22620 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20  .  /***** If we 
22630 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
22640 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  , flattening is 
22650 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a  permitted. *****
22660 2f 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28  /.  SELECTTRACE(
22670 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 66 6c 61  1,pParse,p,("fla
22680 74 74 65 6e 20 25 75 2e 25 70 20 66 72 6f 6d 20  tten %u.%p from 
22690 74 65 72 6d 20 25 64 5c 6e 22 2c 0a 20 20 20 20  term %d\n",.    
226a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
226b0 53 75 62 2d 3e 73 65 6c 49 64 2c 20 70 53 75 62  Sub->selId, pSub
226c0 2c 20 69 46 72 6f 6d 29 29 3b 0a 0a 20 20 2f 2a  , iFrom));..  /*
226d0 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65 20 73   Authorize the s
226e0 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 50 61  ubquery */.  pPa
226f0 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
22700 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  t = pSubitem->zN
22710 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28  ame;.  TESTONLY(
22720 69 20 3d 29 20 73 71 6c 69 74 65 33 41 75 74 68  i =) sqlite3Auth
22730 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
22740 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20  LITE_SELECT, 0, 
22750 30 2c 20 30 29 3b 0a 20 20 74 65 73 74 63 61 73  0, 0);.  testcas
22760 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45 4e  e( i==SQLITE_DEN
22770 59 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a  Y );.  pParse->z
22780 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53  AuthContext = zS
22790 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b  avedAuthContext;
227a0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75  ..  /* If the su
227b0 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
227c0 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61  pound SELECT sta
227d0 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79  tement, then (by
227e0 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20   restrictions.  
227f0 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f  ** 17 and 18 abo
22800 76 65 29 20 69 74 20 6d 75 73 74 20 62 65 20 61  ve) it must be a
22810 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74   UNION ALL and t
22820 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
22830 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66  must .  ** be of
22840 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a   the form:.  **.
22850 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
22860 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d  <expr-list> FROM
22870 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c   (<sub-query>) <
22880 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20  where-clause> . 
22890 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65   **.  ** followe
228a0 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42  d by any ORDER B
228b0 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20  Y, LIMIT and/or 
228c0 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20  OFFSET clauses. 
228d0 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20  This block.  ** 
228e0 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69  creates N-1 copi
228f0 65 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  es of the parent
22900 20 71 75 65 72 79 20 77 69 74 68 6f 75 74 20 61   query without a
22910 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d  ny ORDER BY, LIM
22920 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53  IT or .  ** OFFS
22930 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a  ET clauses and j
22940 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65  oins them to the
22950 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20   left-hand-side 
22960 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  of the original.
22970 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e    ** using UNION
22980 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20   ALL operators. 
22990 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20 69  In this case N i
229a0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
229b0 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65  simple.  ** sele
229c0 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ct statements in
229d0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75   the compound su
229e0 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20  b-query..  **.  
229f0 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  ** Example:.  **
22a00 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
22a10 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a   a+1 FROM (.  **
22a20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 78          SELECT x
22a30 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20   FROM tab.  **  
22a40 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a        UNION ALL.
22a50 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45    **        SELE
22a60 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20  CT y FROM tab.  
22a70 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  **        UNION 
22a80 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ALL.  **        
22a90 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20  SELECT abs(z*2) 
22aa0 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20  FROM tab2.  **  
22ab0 20 20 20 29 20 57 48 45 52 45 20 61 21 3d 35 20     ) WHERE a!=5 
22ac0 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a  ORDER BY 1.  **.
22ad0 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64    ** Transformed
22ae0 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   into:.  **.  **
22af0 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20       SELECT x+1 
22b00 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78  FROM tab WHERE x
22b10 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55  +1!=5.  **     U
22b20 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
22b30 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f    SELECT y+1 FRO
22b40 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b 31 21  M tab WHERE y+1!
22b50 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f  =5.  **     UNIO
22b60 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  N ALL.  **     S
22b70 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31  ELECT abs(z*2)+1
22b80 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45   FROM tab2 WHERE
22b90 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20   abs(z*2)+1!=5. 
22ba0 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59   **     ORDER BY
22bb0 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20   1.  **.  ** We 
22bc0 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63  call this the "c
22bd0 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
22be0 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20   flattening"..  
22bf0 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53  */.  for(pSub=pS
22c00 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62  ub->pPrior; pSub
22c10 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  ; pSub=pSub->pPr
22c20 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  ior){.    Select
22c30 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72   *pNew;.    Expr
22c40 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
22c50 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
22c60 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d    Expr *pLimit =
22c70 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
22c80 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d  Select *pPrior =
22c90 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
22ca0 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
22cb0 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30  .    p->pSrc = 0
22cc0 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  ;.    p->pPrior 
22cd0 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d  = 0;.    p->pLim
22ce0 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  it = 0;.    pNew
22cf0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
22d00 44 75 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20  Dup(db, p, 0);. 
22d10 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
22d20 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f  Limit;.    p->pO
22d30 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
22d40 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d  y;.    p->pSrc =
22d50 20 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70   pSrc;.    p->op
22d60 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69   = TK_ALL;.    i
22d70 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
22d80 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
22d90 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73  pPrior;.    }els
22da0 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  e{.      pNew->p
22db0 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
22dc0 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72        if( pPrior
22dd0 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74   ) pPrior->pNext
22de0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70   = pNew;.      p
22df0 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a  New->pNext = p;.
22e00 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
22e10 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 53 45  = pNew;.      SE
22e20 4c 45 43 54 54 52 41 43 45 28 32 2c 70 50 61 72  LECTTRACE(2,pPar
22e30 73 65 2c 70 2c 28 22 63 6f 6d 70 6f 75 6e 64 2d  se,p,("compound-
22e40 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e  subquery flatten
22e50 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  er".            
22e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e70 20 20 22 20 63 72 65 61 74 65 73 20 25 75 20 61    " creates %u a
22e80 73 20 70 65 65 72 5c 6e 22 2c 70 4e 65 77 2d 3e  s peer\n",pNew->
22e90 73 65 6c 49 64 29 29 3b 0a 20 20 20 20 7d 0a 20  selId));.    }. 
22ea0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
22eb0 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
22ec0 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65   1;.  }..  /* Be
22ed0 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20 74  gin flattening t
22ee0 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72  he iFrom-th entr
22ef0 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
22f00 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68  ause .  ** in th
22f10 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
22f20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53 75   */.  pSub = pSu
22f30 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70  b1 = pSubitem->p
22f40 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65  Select;..  /* De
22f50 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73 69 65  lete the transie
22f60 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
22f70 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  re associated wi
22f80 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  th the.  ** subq
22f90 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  uery.  */.  sqli
22fa0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
22fb0 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
22fc0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
22fd0 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
22fe0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ->zName);.  sqli
22ff0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
23000 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ubitem->zAlias);
23010 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61  .  pSubitem->zDa
23020 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70 53  tabase = 0;.  pS
23030 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ubitem->zName = 
23040 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a  0;.  pSubitem->z
23050 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53 75  Alias = 0;.  pSu
23060 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  bitem->pSelect =
23070 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20   0;..  /* Defer 
23080 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61 62  deleting the Tab
23090 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69  le object associ
230a0 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  ated with the.  
230b0 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74 69  ** subquery unti
230c0 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f  l code generatio
230d0 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65  n is.  ** comple
230e0 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20  te, since there 
230f0 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74 20  may still exist 
23100 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69 65  Expr.pTab entrie
23110 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66 65  s that.  ** refe
23120 72 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  r to the subquer
23130 79 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c 61  y even after fla
23140 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74  ttening.  Ticket
23150 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a   #3346..  **.  *
23160 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  * pSubitem->pTab
23170 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e   is always non-N
23180 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65 73 74  ULL by test rest
23190 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74 65 73  rictions and tes
231a0 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20  ts above..  */. 
231b0 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 75 62   if( ALWAYS(pSub
231c0 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29  item->pTab!=0) )
231d0 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
231e0 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74 65  bToDel = pSubite
231f0 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  m->pTab;.    if(
23200 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 54 61 62   pTabToDel->nTab
23210 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Ref==1 ){.      
23220 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
23230 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
23240 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
23250 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c  .      pTabToDel
23260 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20  ->pNextZombie = 
23270 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62  pToplevel->pZomb
23280 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70 54 6f  ieTab;.      pTo
23290 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54  plevel->pZombieT
232a0 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a  ab = pTabToDel;.
232b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
232c0 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 54 61 62   pTabToDel->nTab
232d0 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  Ref--;.    }.   
232e0 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20   pSubitem->pTab 
232f0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  = 0;.  }..  /* T
23300 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f  he following loo
23310 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20  p runs once for 
23320 65 61 63 68 20 74 65 72 6d 20 69 6e 20 61 20 63  each term in a c
23330 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
23340 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67  .  ** flattening
23350 20 28 61 73 20 64 65 73 63 72 69 62 65 64 20 61   (as described a
23360 62 6f 76 65 29 2e 20 20 49 66 20 77 65 20 61 72  bove).  If we ar
23370 65 20 64 6f 69 6e 67 20 61 20 64 69 66 66 65 72  e doing a differ
23380 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66  ent kind.  ** of
23390 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61 20   flattening - a 
233a0 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68 65 72  flattening other
233b0 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64   than a compound
233c0 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65  -subquery flatte
233d0 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e  ning -.  ** then
233e0 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20   this loop only 
233f0 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a  runs once..  **.
23400 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d    ** This loop m
23410 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74 68 65 20  oves all of the 
23420 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66  FROM elements of
23430 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e   the subquery in
23440 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  to the.  ** the 
23450 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
23460 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20  he outer query. 
23470 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68   Before doing th
23480 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a  is, remember.  *
23490 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  * the cursor num
234a0 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67  ber for the orig
234b0 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79  inal outer query
234c0 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e   FROM element in
234d0 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20  .  ** iParent.  
234e0 54 68 65 20 69 50 61 72 65 6e 74 20 63 75 72 73  The iParent curs
234f0 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  or will never be
23500 20 75 73 65 64 2e 20 20 53 75 62 73 65 71 75 65   used.  Subseque
23510 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c  nt code.  ** wil
23520 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f  l scan expressio
23530 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69  ns looking for i
23540 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65  Parent reference
23550 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20  s and replace.  
23560 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e  ** those referen
23570 63 65 73 20 77 69 74 68 20 65 78 70 72 65 73 73  ces with express
23580 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76  ions that resolv
23590 65 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  e to the subquer
235a0 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d  y FROM.  ** elem
235b0 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20  ents we are now 
235c0 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f  copying in..  */
235d0 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74 3d 70  .  for(pParent=p
235e0 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61 72 65  ; pParent; pPare
235f0 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72 69  nt=pParent->pPri
23600 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e 70  or, pSub=pSub->p
23610 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20  Prior){.    int 
23620 6e 53 75 62 53 72 63 3b 0a 20 20 20 20 75 38 20  nSubSrc;.    u8 
23630 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20  jointype = 0;.  
23640 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21 3d    assert( pSub!=
23650 30 20 29 3b 0a 20 20 20 20 70 53 75 62 53 72 63  0 );.    pSubSrc
23660 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 20 20   = pSub->pSrc;  
23670 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
23680 65 20 6f 66 20 73 75 62 71 75 65 72 79 20 2a 2f  e of subquery */
23690 0a 20 20 20 20 6e 53 75 62 53 72 63 20 3d 20 70  .    nSubSrc = p
236a0 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f  SubSrc->nSrc;  /
236b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
236c0 73 20 69 6e 20 73 75 62 71 75 65 72 79 20 46 52  s in subquery FR
236d0 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
236e0 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d   pSrc = pParent-
236f0 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52  >pSrc;     /* FR
23700 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
23710 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
23720 0a 20 20 20 20 69 66 28 20 70 53 72 63 20 29 7b  .    if( pSrc ){
23730 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
23740 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a  Parent==p );  /*
23750 20 46 69 72 73 74 20 74 69 6d 65 20 74 68 72 6f   First time thro
23760 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a  ugh the loop */.
23770 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d        jointype =
23780 20 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f   pSubitem->fg.jo
23790 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73  intype;.    }els
237a0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
237b0 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20 20   pParent!=p );  
237c0 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65  /* 2nd and subse
237d0 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72 6f  quent times thro
237e0 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a  ugh the loop */.
237f0 20 20 20 20 20 20 70 53 72 63 20 3d 20 73 71 6c        pSrc = sql
23800 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
23810 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20  d(pParse, 0, 0, 
23820 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  0);.      if( pS
23830 72 63 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rc==0 ) break;. 
23840 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53       pParent->pS
23850 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 7d  rc = pSrc;.    }
23860 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62  ..    /* The sub
23870 71 75 65 72 79 20 75 73 65 73 20 61 20 73 69 6e  query uses a sin
23880 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 20  gle slot of the 
23890 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
238a0 68 65 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20  he outer.    ** 
238b0 71 75 65 72 79 2e 20 20 49 66 20 74 68 65 20 73  query.  If the s
238c0 75 62 71 75 65 72 79 20 68 61 73 20 6d 6f 72 65  ubquery has more
238d0 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e   than one elemen
238e0 74 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c  t in its FROM cl
238f0 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ause,.    ** the
23900 6e 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74  n expand the out
23910 65 72 20 71 75 65 72 79 20 74 6f 20 6d 61 6b 65  er query to make
23920 20 73 70 61 63 65 20 66 6f 72 20 69 74 20 74 6f   space for it to
23930 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e   hold all elemen
23940 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ts.    ** of the
23950 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a   subquery..    *
23960 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65  *.    ** Example
23970 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
23980 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
23990 20 74 61 62 41 2c 20 28 53 45 4c 45 43 54 20 2a   tabA, (SELECT *
239a0 20 46 52 4f 4d 20 73 75 62 31 2c 20 73 75 62 32   FROM sub1, sub2
239b0 29 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a  ), tabB;.    **.
239c0 20 20 20 20 2a 2a 20 54 68 65 20 6f 75 74 65 72      ** The outer
239d0 20 71 75 65 72 79 20 68 61 73 20 33 20 73 6c 6f   query has 3 slo
239e0 74 73 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63  ts in its FROM c
239f0 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74  lause.  One slot
23a00 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f   of the.    ** o
23a10 75 74 65 72 20 71 75 65 72 79 20 28 74 68 65 20  uter query (the 
23a20 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20 69 73 20  middle slot) is 
23a30 75 73 65 64 20 62 79 20 74 68 65 20 73 75 62 71  used by the subq
23a40 75 65 72 79 2e 20 20 54 68 65 20 6e 65 78 74 0a  uery.  The next.
23a50 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20      ** block of 
23a60 63 6f 64 65 20 77 69 6c 6c 20 65 78 70 61 6e 64  code will expand
23a70 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
23a80 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 6f 20   FROM clause to 
23a90 34 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20  4 slots..    ** 
23aa0 54 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 20  The middle slot 
23ab0 69 73 20 65 78 70 61 6e 64 65 64 20 74 6f 20 74  is expanded to t
23ac0 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65  wo slots in orde
23ad0 72 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 0a  r to make space.
23ae0 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74      ** for the t
23af0 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  wo elements in t
23b00 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
23b10 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
23b20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
23b30 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20  SubSrc>1 ){.    
23b40 20 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33    pSrc = sqlite3
23b50 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 70  SrcListEnlarge(p
23b60 50 61 72 73 65 2c 20 70 53 72 63 2c 20 6e 53 75  Parse, pSrc, nSu
23b70 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b  bSrc-1,iFrom+1);
23b80 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63 3d  .      if( pSrc=
23b90 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
23ba0 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20    pParent->pSrc 
23bb0 3d 20 70 53 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  = pSrc;.    }.. 
23bc0 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74     /* Transfer t
23bd0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
23be0 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 73 75  erms from the su
23bf0 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a  bquery into the.
23c00 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
23c10 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ry..    */.    f
23c20 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72  or(i=0; i<nSubSr
23c30 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  c; i++){.      s
23c40 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
23c50 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69  te(db, pSrc->a[i
23c60 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b  +iFrom].pUsing);
23c70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
23c80 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e  Src->a[i+iFrom].
23c90 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20  fg.isTabFunc==0 
23ca0 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61  );.      pSrc->a
23cb0 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62  [i+iFrom] = pSub
23cc0 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
23cd0 20 69 4e 65 77 50 61 72 65 6e 74 20 3d 20 70 53   iNewParent = pS
23ce0 75 62 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72  ubSrc->a[i].iCur
23cf0 73 6f 72 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  sor;.      memse
23d00 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d  t(&pSubSrc->a[i]
23d10 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62  , 0, sizeof(pSub
23d20 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20  Src->a[i]));.   
23d30 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69   }.    pSrc->a[i
23d40 46 72 6f 6d 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70  From].fg.jointyp
23d50 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  e = jointype;.  
23d60 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69  .    /* Now begi
23d70 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67 20 73  n substituting s
23d80 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 20 73  ubquery result s
23d90 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66  et expressions f
23da0 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65 66 65 72  or .    ** refer
23db0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50 61  ences to the iPa
23dc0 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65  rent in the oute
23dd0 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20  r query..    ** 
23de0 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  .    ** Example:
23df0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
23e00 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31   SELECT a+5, b*1
23e10 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  0 FROM (SELECT x
23e20 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53  *3 AS a, y+10 AS
23e30 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52   b FROM t1) WHER
23e40 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20  E a>b;.    **   
23e50 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \               
23e60 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f        \_________
23e70 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f  ____ subquery __
23e80 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20  ________/       
23e90 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c     /.    **    \
23ea0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23eb0 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72  _____ outer quer
23ec0 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  y ______________
23ed0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23ee0 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  /.    **.    ** 
23ef0 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79  We look at every
23f00 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
23f10 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
23f20 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77  nd every place w
23f30 65 20 73 65 65 0a 20 20 20 20 2a 2a 20 22 61 22  e see.    ** "a"
23f40 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22   we substitute "
23f50 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20 70  x*3" and every p
23f60 6c 61 63 65 20 77 65 20 73 65 65 20 22 62 22 20  lace we see "b" 
23f70 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22 79  we substitute "y
23f80 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  +10"..    */.   
23f90 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
23fa0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  rBy ){.      /* 
23fb0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61  At this point, a
23fc0 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f 72 64  ny non-zero iOrd
23fd0 65 72 42 79 43 6f 6c 20 76 61 6c 75 65 73 20 69  erByCol values i
23fe0 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
23ff0 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20  .      ** ORDER 
24000 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73  BY column expres
24010 73 69 6f 6e 20 69 73 20 69 64 65 6e 74 69 63 61  sion is identica
24020 6c 20 74 6f 20 74 68 65 20 69 4f 72 64 65 72 42  l to the iOrderB
24030 79 43 6f 6c 27 74 68 0a 20 20 20 20 20 20 2a 2a  yCol'th.      **
24040 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 74 75   expression retu
24050 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 73  rned by SELECT s
24060 74 61 74 65 6d 65 6e 74 20 70 53 75 62 2e 20 53  tatement pSub. S
24070 69 6e 63 65 20 74 68 65 73 65 20 76 61 6c 75 65  ince these value
24080 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20 6e 6f  s.      ** do no
24090 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 63 6f  t necessarily co
240a0 72 72 65 73 70 6f 6e 64 20 74 6f 20 63 6f 6c 75  rrespond to colu
240b0 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54 20 73 74  mns in SELECT st
240c0 61 74 65 6d 65 6e 74 20 70 50 61 72 65 6e 74 2c  atement pParent,
240d0 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74  .      ** zero t
240e0 68 65 6d 20 62 65 66 6f 72 65 20 74 72 61 6e 73  hem before trans
240f0 66 65 72 69 6e 67 20 74 68 65 20 4f 52 44 45 52  fering the ORDER
24100 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20   BY clause..    
24110 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f    **.      ** No
24120 74 20 64 6f 69 6e 67 20 74 68 69 73 20 6d 61 79  t doing this may
24130 20 63 61 75 73 65 20 61 6e 20 65 72 72 6f 72 20   cause an error 
24140 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  if a subsequent 
24150 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20  call to this.   
24160 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61     ** function a
24170 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74  ttempts to flatt
24180 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 75  en a compound su
24190 62 2d 71 75 65 72 79 20 69 6e 74 6f 20 70 50 61  b-query into pPa
241a0 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 28 74  rent.      ** (t
241b0 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68 69 73  he only way this
241c0 20 63 61 6e 20 68 61 70 70 65 6e 20 69 73 20 69   can happen is i
241d0 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
241e0 75 62 2d 71 75 65 72 79 20 69 73 0a 20 20 20 20  ub-query is.    
241f0 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70    ** currently p
24200 61 72 74 20 6f 66 20 70 53 75 62 2d 3e 70 53 72  art of pSub->pSr
24210 63 29 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b  c). See ticket [
24220 64 31 31 61 36 65 39 30 38 66 5d 2e 20 20 2a 2f  d11a6e908f].  */
24230 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
24240 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62  *pOrderBy = pSub
24250 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
24260 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
24270 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
24280 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 72 64  +){.        pOrd
24290 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69  erBy->a[i].u.x.i
242a0 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a  OrderByCol = 0;.
242b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
242c0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
242d0 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
242e0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72      pParent->pOr
242f0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
24300 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4f  ;.      pSub->pO
24310 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
24320 7d 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 70  }.    pWhere = p
24330 53 75 62 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20  Sub->pWhere;.   
24340 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 3d 20   pSub->pWhere = 
24350 30 3b 0a 20 20 20 20 69 66 28 20 69 73 4c 65 66  0;.    if( isLef
24360 74 4a 6f 69 6e 3e 30 20 29 7b 0a 20 20 20 20 20  tJoin>0 ){.     
24370 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 57 68   setJoinExpr(pWh
24380 65 72 65 2c 20 69 4e 65 77 50 61 72 65 6e 74 29  ere, iNewParent)
24390 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
243a0 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 71  ent->pWhere = sq
243b0 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61  lite3ExprAnd(pPa
243c0 72 73 65 2c 20 70 57 68 65 72 65 2c 20 70 50 61  rse, pWhere, pPa
243d0 72 65 6e 74 2d 3e 70 57 68 65 72 65 29 3b 0a 20  rent->pWhere);. 
243e0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
243f0 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20  cFailed==0 ){.  
24400 20 20 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74      SubstContext
24410 20 78 3b 0a 20 20 20 20 20 20 78 2e 70 50 61 72   x;.      x.pPar
24420 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20  se = pParse;.   
24430 20 20 20 78 2e 69 54 61 62 6c 65 20 3d 20 69 50     x.iTable = iP
24440 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e 69  arent;.      x.i
24450 4e 65 77 54 61 62 6c 65 20 3d 20 69 4e 65 77 50  NewTable = iNewP
24460 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e 69  arent;.      x.i
24470 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 69 73 4c 65  sLeftJoin = isLe
24480 66 74 4a 6f 69 6e 3b 0a 20 20 20 20 20 20 78 2e  ftJoin;.      x.
24490 70 45 4c 69 73 74 20 3d 20 70 53 75 62 2d 3e 70  pEList = pSub->p
244a0 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 75 62  EList;.      sub
244b0 73 74 53 65 6c 65 63 74 28 26 78 2c 20 70 50 61  stSelect(&x, pPa
244c0 72 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  rent, 0);.    }.
244d0 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6c    .    /* The fl
244e0 61 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73  attened query is
244f0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 69 66 20 65   a compound if e
24500 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20  ither the inner 
24510 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75  or the.    ** ou
24520 74 65 72 20 71 75 65 72 79 20 69 73 20 61 20 63  ter query is a c
24530 6f 6d 70 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20  ompound. */.    
24540 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67  pParent->selFlag
24550 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c  s |= pSub->selFl
24560 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e  ags & SF_Compoun
24570 64 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  d;.    assert( (
24580 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
24590 20 53 46 5f 44 69 73 74 69 6e 63 74 29 3d 3d 30   SF_Distinct)==0
245a0 20 29 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69   ); /* restricti
245b0 6f 6e 20 28 31 37 62 29 20 2a 2f 0a 20 20 0a 20  on (17b) */.  . 
245c0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c     /*.    ** SEL
245d0 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45  ECT ... FROM (SE
245e0 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61  LECT ... LIMIT a
245f0 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54   OFFSET b) LIMIT
24600 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20   x OFFSET y;.   
24610 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69   **.    ** One i
24620 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79  s tempted to try
24630 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20   to add a and b 
24640 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c  to combine the l
24650 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69 73  imits.  But this
24660 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  .    ** does not
24670 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20   work if either 
24680 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76  limit is negativ
24690 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
246a0 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29  ( pSub->pLimit )
246b0 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  {.      pParent-
246c0 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e  >pLimit = pSub->
246d0 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53  pLimit;.      pS
246e0 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a  ub->pLimit = 0;.
246f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
24700 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65  Finially, delete
24710 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66   what is left of
24720 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   the subquery an
24730 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75  d return.  ** su
24740 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  ccess..  */.  sq
24750 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
24760 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a 23  e(db, pSub1);..#
24770 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
24780 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
24790 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
247a0 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 53  & 0x100 ){.    S
247b0 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30  ELECTTRACE(0x100
247c0 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65  ,pParse,p,("Afte
247d0 72 20 66 6c 61 74 74 65 6e 69 6e 67 3a 5c 6e 22  r flattening:\n"
247e0 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  ));.    sqlite3T
247f0 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
24800 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
24810 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  if..  return 1;.
24820 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
24830 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
24840 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
24850 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
24860 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a  IT_VIEW) */../*.
24870 2a 2a 20 41 20 73 74 72 75 63 74 75 72 65 20 74  ** A structure t
24880 6f 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20  o keep track of 
24890 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  all of the colum
248a0 6e 20 76 61 6c 75 65 73 20 74 68 61 74 20 61 72  n values that ar
248b0 65 20 66 69 78 65 64 20 74 6f 0a 2a 2a 20 61 20  e fixed to.** a 
248c0 6b 6e 6f 77 6e 20 76 61 6c 75 65 20 64 75 65 20  known value due 
248d0 74 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  to WHERE clause 
248e0 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74  constraints of t
248f0 68 65 20 66 6f 72 6d 20 43 4f 4c 55 4d 4e 3d 56  he form COLUMN=V
24900 41 4c 55 45 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ALUE..*/.typedef
24910 20 73 74 72 75 63 74 20 57 68 65 72 65 43 6f 6e   struct WhereCon
24920 73 74 20 57 68 65 72 65 43 6f 6e 73 74 3b 0a 73  st WhereConst;.s
24930 74 72 75 63 74 20 57 68 65 72 65 43 6f 6e 73 74  truct WhereConst
24940 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72   {.  Parse *pPar
24950 73 65 3b 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  se;   /* Parsing
24960 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
24970 74 20 6e 43 6f 6e 73 74 3b 20 20 20 20 20 20 2f  t nConst;      /
24980 2a 20 4e 75 6d 62 65 72 20 66 6f 72 20 43 4f 4c  * Number for COL
24990 55 4d 4e 3d 43 4f 4e 53 54 41 4e 54 20 74 65 72  UMN=CONSTANT ter
249a0 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 68 6e  ms */.  int nChn
249b0 67 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  g;       /* Numb
249c0 65 72 20 6f 66 20 74 69 6d 65 73 20 61 20 63 6f  er of times a co
249d0 6e 73 74 61 6e 74 20 69 73 20 70 72 6f 70 61 67  nstant is propag
249e0 61 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ated */.  Expr *
249f0 2a 61 70 45 78 70 72 3b 20 20 20 2f 2a 20 5b 69  *apExpr;   /* [i
24a00 2a 32 5d 20 69 73 20 43 4f 4c 55 4d 4e 20 61 6e  *2] is COLUMN an
24a10 64 20 5b 69 2a 32 2b 31 5d 20 69 73 20 56 41 4c  d [i*2+1] is VAL
24a20 55 45 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  UE */.};../*.** 
24a30 41 64 64 20 61 20 6e 65 77 20 65 6e 74 72 79 20  Add a new entry 
24a40 74 6f 20 74 68 65 20 70 43 6f 6e 73 74 20 6f 62  to the pConst ob
24a50 6a 65 63 74 2e 20 20 45 78 63 65 70 74 2c 20 64  ject.  Except, d
24a60 6f 20 6e 6f 74 20 61 64 64 20 64 75 70 6c 69 63  o not add duplic
24a70 61 74 65 0a 2a 2a 20 70 43 6f 6c 75 6d 6e 20 65  ate.** pColumn e
24a80 6e 74 69 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ntires..*/.stati
24a90 63 20 76 6f 69 64 20 63 6f 6e 73 74 49 6e 73 65  c void constInse
24aa0 72 74 28 0a 20 20 57 68 65 72 65 43 6f 6e 73 74  rt(.  WhereConst
24ab0 20 2a 70 43 6f 6e 73 74 2c 20 20 20 20 20 20 2f   *pConst,      /
24ac0 2a 20 54 68 65 20 57 68 65 72 65 43 6f 6e 73 74  * The WhereConst
24ad0 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61   into which we a
24ae0 72 65 20 69 6e 73 65 72 74 69 6e 67 20 2a 2f 0a  re inserting */.
24af0 20 20 45 78 70 72 20 2a 70 43 6f 6c 75 6d 6e 2c    Expr *pColumn,
24b00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
24b10 65 20 43 4f 4c 55 4d 4e 20 70 61 72 74 20 6f 66  e COLUMN part of
24b20 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
24b30 2a 2f 0a 20 20 45 78 70 72 20 2a 70 56 61 6c 75  */.  Expr *pValu
24b40 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
24b50 20 54 68 65 20 56 41 4c 55 45 20 70 61 72 74 20   The VALUE part 
24b60 6f 66 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  of the constrain
24b70 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  t */.){.  int i;
24b80 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 75  .  assert( pColu
24b90 6d 6e 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  mn->op==TK_COLUM
24ba0 4e 20 29 3b 0a 0a 20 20 2f 2a 20 32 30 31 38 2d  N );..  /* 2018-
24bb0 31 30 2d 32 35 20 74 69 63 6b 65 74 20 5b 63 66  10-25 ticket [cf
24bc0 35 65 64 32 30 66 5d 0a 20 20 2a 2a 20 4d 61 6b  5ed20f].  ** Mak
24bd0 65 20 73 75 72 65 20 74 68 65 20 73 61 6d 65 20  e sure the same 
24be0 70 43 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 69  pColumn is not i
24bf0 6e 73 65 72 74 65 64 20 6d 6f 72 65 20 74 68 61  nserted more tha
24c00 6e 20 6f 6e 63 65 20 2a 2f 0a 20 20 66 6f 72 28  n once */.  for(
24c10 69 3d 30 3b 20 69 3c 70 43 6f 6e 73 74 2d 3e 6e  i=0; i<pConst->n
24c20 43 6f 6e 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  Const; i++){.   
24c30 20 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 45 78   const Expr *pEx
24c40 70 72 20 3d 20 70 43 6f 6e 73 74 2d 3e 61 70 45  pr = pConst->apE
24c50 78 70 72 5b 69 2a 32 5d 3b 0a 20 20 20 20 61 73  xpr[i*2];.    as
24c60 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
24c70 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
24c80 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
24c90 62 6c 65 3d 3d 70 43 6f 6c 75 6d 6e 2d 3e 69 54  ble==pColumn->iT
24ca0 61 62 6c 65 0a 20 20 20 20 20 26 26 20 70 45 78  able.     && pEx
24cb0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 43 6f  pr->iColumn==pCo
24cc0 6c 75 6d 6e 2d 3e 69 43 6f 6c 75 6d 6e 0a 20 20  lumn->iColumn.  
24cd0 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
24ce0 6e 3b 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 70  n;  /* Already p
24cf0 72 65 73 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  resent.  Return 
24d00 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
24d10 79 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 7d  ything. */.    }
24d20 0a 20 20 7d 0a 0a 20 20 70 43 6f 6e 73 74 2d 3e  .  }..  pConst->
24d30 6e 43 6f 6e 73 74 2b 2b 3b 0a 20 20 70 43 6f 6e  nConst++;.  pCon
24d40 73 74 2d 3e 61 70 45 78 70 72 20 3d 20 73 71 6c  st->apExpr = sql
24d50 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
24d60 72 65 65 28 70 43 6f 6e 73 74 2d 3e 70 50 61 72  ree(pConst->pPar
24d70 73 65 2d 3e 64 62 2c 20 70 43 6f 6e 73 74 2d 3e  se->db, pConst->
24d80 61 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  apExpr,.        
24d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24da0 20 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2a   pConst->nConst*
24db0 32 2a 73 69 7a 65 6f 66 28 45 78 70 72 2a 29 29  2*sizeof(Expr*))
24dc0 3b 0a 20 20 69 66 28 20 70 43 6f 6e 73 74 2d 3e  ;.  if( pConst->
24dd0 61 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20  apExpr==0 ){.   
24de0 20 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 20   pConst->nConst 
24df0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
24e00 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
24e10 70 65 72 74 79 28 70 56 61 6c 75 65 2c 20 45 50  perty(pValue, EP
24e20 5f 46 69 78 65 64 43 6f 6c 29 20 29 20 70 56 61  _FixedCol) ) pVa
24e30 6c 75 65 20 3d 20 70 56 61 6c 75 65 2d 3e 70 4c  lue = pValue->pL
24e40 65 66 74 3b 0a 20 20 20 20 70 43 6f 6e 73 74 2d  eft;.    pConst-
24e50 3e 61 70 45 78 70 72 5b 70 43 6f 6e 73 74 2d 3e  >apExpr[pConst->
24e60 6e 43 6f 6e 73 74 2a 32 2d 32 5d 20 3d 20 70 43  nConst*2-2] = pC
24e70 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 43 6f 6e 73  olumn;.    pCons
24e80 74 2d 3e 61 70 45 78 70 72 5b 70 43 6f 6e 73 74  t->apExpr[pConst
24e90 2d 3e 6e 43 6f 6e 73 74 2a 32 2d 31 5d 20 3d 20  ->nConst*2-1] = 
24ea0 70 56 61 6c 75 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pValue;.  }.}../
24eb0 2a 0a 2a 2a 20 46 69 6e 64 20 61 6c 6c 20 74 65  *.** Find all te
24ec0 72 6d 73 20 6f 66 20 43 4f 4c 55 4d 4e 3d 56 41  rms of COLUMN=VA
24ed0 4c 55 45 20 6f 72 20 56 41 4c 55 45 3d 43 4f 4c  LUE or VALUE=COL
24ee0 55 4d 4e 20 69 6e 20 70 45 78 70 72 20 77 68 65  UMN in pExpr whe
24ef0 72 65 20 56 41 4c 55 45 0a 2a 2a 20 69 73 20 61  re VALUE.** is a
24f00 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73   constant expres
24f10 73 69 6f 6e 20 61 6e 64 20 77 68 65 72 65 20 74  sion and where t
24f20 68 65 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20  he term must be 
24f30 74 72 75 65 20 62 65 63 61 75 73 65 20 69 74 0a  true because it.
24f40 2a 2a 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ** is part of th
24f50 65 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20  e AND-connected 
24f60 74 65 72 6d 73 20 6f 66 20 74 68 65 20 65 78 70  terms of the exp
24f70 72 65 73 73 69 6f 6e 2e 20 20 46 6f 72 20 65 61  ression.  For ea
24f80 63 68 20 74 65 72 6d 0a 2a 2a 20 66 6f 75 6e 64  ch term.** found
24f90 2c 20 61 64 64 20 69 74 20 74 6f 20 74 68 65 20  , add it to the 
24fa0 70 43 6f 6e 73 74 20 73 74 72 75 63 74 75 72 65  pConst structure
24fb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
24fc0 20 66 69 6e 64 43 6f 6e 73 74 49 6e 57 68 65 72   findConstInWher
24fd0 65 28 57 68 65 72 65 43 6f 6e 73 74 20 2a 70 43  e(WhereConst *pC
24fe0 6f 6e 73 74 2c 20 45 78 70 72 20 2a 70 45 78 70  onst, Expr *pExp
24ff0 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 52 69 67  r){.  Expr *pRig
25000 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 69 66  ht, *pLeft;.  if
25010 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
25020 75 72 6e 3b 0a 20 20 69 66 28 20 45 78 70 72 48  urn;.  if( ExprH
25030 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
25040 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
25050 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
25060 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44  Expr->op==TK_AND
25070 20 29 7b 0a 20 20 20 20 66 69 6e 64 43 6f 6e 73   ){.    findCons
25080 74 49 6e 57 68 65 72 65 28 70 43 6f 6e 73 74 2c  tInWhere(pConst,
25090 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
250a0 0a 20 20 20 20 66 69 6e 64 43 6f 6e 73 74 49 6e  .    findConstIn
250b0 57 68 65 72 65 28 70 43 6f 6e 73 74 2c 20 70 45  Where(pConst, pE
250c0 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
250d0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
250e0 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
250f0 5f 45 51 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  _EQ ) return;.  
25100 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
25110 70 52 69 67 68 74 3b 0a 20 20 70 4c 65 66 74 20  pRight;.  pLeft 
25120 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
25130 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74    assert( pRight
25140 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
25150 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 69   pLeft!=0 );.  i
25160 66 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  f( pRight->op==T
25170 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 21  K_COLUMN.   && !
25180 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
25190 70 52 69 67 68 74 2c 20 45 50 5f 46 69 78 65 64  pRight, EP_Fixed
251a0 43 6f 6c 29 0a 20 20 20 26 26 20 73 71 6c 69 74  Col).   && sqlit
251b0 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
251c0 28 70 4c 65 66 74 29 0a 20 20 20 26 26 20 73 71  (pLeft).   && sq
251d0 6c 69 74 65 33 49 73 42 69 6e 61 72 79 28 73 71  lite3IsBinary(sq
251e0 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
251f0 72 65 43 6f 6c 6c 53 65 71 28 70 43 6f 6e 73 74  reCollSeq(pConst
25200 2d 3e 70 50 61 72 73 65 2c 70 4c 65 66 74 2c 70  ->pParse,pLeft,p
25210 52 69 67 68 74 29 29 0a 20 20 29 7b 0a 20 20 20  Right)).  ){.   
25220 20 63 6f 6e 73 74 49 6e 73 65 72 74 28 70 43 6f   constInsert(pCo
25230 6e 73 74 2c 20 70 52 69 67 68 74 2c 20 70 4c 65  nst, pRight, pLe
25240 66 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 20 20 69  ft);.  }else.  i
25250 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
25260 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 21 45  _COLUMN.   && !E
25270 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
25280 4c 65 66 74 2c 20 45 50 5f 46 69 78 65 64 43 6f  Left, EP_FixedCo
25290 6c 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  l).   && sqlite3
252a0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
252b0 52 69 67 68 74 29 0a 20 20 20 26 26 20 73 71 6c  Right).   && sql
252c0 69 74 65 33 49 73 42 69 6e 61 72 79 28 73 71 6c  ite3IsBinary(sql
252d0 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
252e0 65 43 6f 6c 6c 53 65 71 28 70 43 6f 6e 73 74 2d  eCollSeq(pConst-
252f0 3e 70 50 61 72 73 65 2c 70 4c 65 66 74 2c 70 52  >pParse,pLeft,pR
25300 69 67 68 74 29 29 0a 20 20 29 7b 0a 20 20 20 20  ight)).  ){.    
25310 63 6f 6e 73 74 49 6e 73 65 72 74 28 70 43 6f 6e  constInsert(pCon
25320 73 74 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  st, pLeft, pRigh
25330 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
25340 20 54 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65   This is a Walke
25350 72 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6c  r expression cal
25360 6c 62 61 63 6b 2e 20 20 70 45 78 70 72 20 69 73  lback.  pExpr is
25370 20 61 20 63 61 6e 64 69 64 61 74 65 20 65 78 70   a candidate exp
25380 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65  ression.** to be
25390 20 72 65 70 6c 61 63 65 64 20 62 79 20 61 20 76   replaced by a v
253a0 61 6c 75 65 2e 20 20 49 66 20 70 45 78 70 72 20  alue.  If pExpr 
253b0 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
253c0 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63   one of the.** c
253d0 6f 6c 75 6d 6e 73 20 6e 61 6d 65 64 20 69 6e 20  olumns named in 
253e0 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 43 6f 6e 73  pWalker->u.pCons
253f0 74 2c 20 74 68 65 6e 20 6f 76 65 72 77 72 69 74  t, then overwrit
25400 65 20 69 74 20 77 69 74 68 20 69 74 73 0a 2a 2a  e it with its.**
25410 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 76   corresponding v
25420 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
25430 69 6e 74 20 70 72 6f 70 61 67 61 74 65 43 6f 6e  int propagateCon
25440 73 74 61 6e 74 45 78 70 72 52 65 77 72 69 74 65  stantExprRewrite
25450 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
25460 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
25470 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65    int i;.  Where
25480 43 6f 6e 73 74 20 2a 70 43 6f 6e 73 74 3b 0a 20  Const *pConst;. 
25490 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
254a0 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75  TK_COLUMN ) retu
254b0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
254c0 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
254d0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
254e0 5f 46 69 78 65 64 43 6f 6c 29 20 29 20 72 65 74  _FixedCol) ) ret
254f0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
25500 3b 0a 20 20 70 43 6f 6e 73 74 20 3d 20 70 57 61  ;.  pConst = pWa
25510 6c 6b 65 72 2d 3e 75 2e 70 43 6f 6e 73 74 3b 0a  lker->u.pConst;.
25520 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f    for(i=0; i<pCo
25530 6e 73 74 2d 3e 6e 43 6f 6e 73 74 3b 20 69 2b 2b  nst->nConst; i++
25540 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 43 6f  ){.    Expr *pCo
25550 6c 75 6d 6e 20 3d 20 70 43 6f 6e 73 74 2d 3e 61  lumn = pConst->a
25560 70 45 78 70 72 5b 69 2a 32 5d 3b 0a 20 20 20 20  pExpr[i*2];.    
25570 69 66 28 20 70 43 6f 6c 75 6d 6e 3d 3d 70 45 78  if( pColumn==pEx
25580 70 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  pr ) continue;. 
25590 20 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e 2d 3e     if( pColumn->
255a0 69 54 61 62 6c 65 21 3d 70 45 78 70 72 2d 3e 69  iTable!=pExpr->i
255b0 54 61 62 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65  Table ) continue
255c0 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 75 6d  ;.    if( pColum
255d0 6e 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 45 78 70  n->iColumn!=pExp
255e0 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e  r->iColumn ) con
255f0 74 69 6e 75 65 3b 0a 20 20 20 20 2f 2a 20 41 20  tinue;.    /* A 
25600 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2e 20  match is found. 
25610 20 41 64 64 20 74 68 65 20 45 50 5f 46 69 78 65   Add the EP_Fixe
25620 64 43 6f 6c 20 70 72 6f 70 65 72 74 79 20 2a 2f  dCol property */
25630 0a 20 20 20 20 70 43 6f 6e 73 74 2d 3e 6e 43 68  .    pConst->nCh
25640 6e 67 2b 2b 3b 0a 20 20 20 20 45 78 70 72 43 6c  ng++;.    ExprCl
25650 65 61 72 50 72 6f 70 65 72 74 79 28 70 45 78 70  earProperty(pExp
25660 72 2c 20 45 50 5f 4c 65 61 66 29 3b 0a 20 20 20  r, EP_Leaf);.   
25670 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
25680 28 70 45 78 70 72 2c 20 45 50 5f 46 69 78 65 64  (pExpr, EP_Fixed
25690 43 6f 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Col);.    assert
256a0 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  ( pExpr->pLeft==
256b0 30 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  0 );.    pExpr->
256c0 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
256d0 78 70 72 44 75 70 28 70 43 6f 6e 73 74 2d 3e 70  xprDup(pConst->p
256e0 50 61 72 73 65 2d 3e 64 62 2c 20 70 43 6f 6e 73  Parse->db, pCons
256f0 74 2d 3e 61 70 45 78 70 72 5b 69 2a 32 2b 31 5d  t->apExpr[i*2+1]
25700 2c 20 30 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  , 0);.    break;
25710 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
25720 43 5f 50 72 75 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  C_Prune;.}../*.*
25730 2a 20 54 68 65 20 57 48 45 52 45 2d 63 6c 61 75  * The WHERE-clau
25740 73 65 20 63 6f 6e 73 74 61 6e 74 20 70 72 6f 70  se constant prop
25750 61 67 61 74 69 6f 6e 20 6f 70 74 69 6d 69 7a 61  agation optimiza
25760 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion..**.** If t
25770 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
25780 63 6f 6e 74 61 69 6e 73 20 74 65 72 6d 73 20 6f  contains terms o
25790 66 20 74 68 65 20 66 6f 72 6d 20 43 4f 4c 55 4d  f the form COLUM
257a0 4e 3d 43 4f 4e 53 54 41 4e 54 20 6f 72 0a 2a 2a  N=CONSTANT or.**
257b0 20 43 4f 4e 53 54 41 4e 54 3d 43 4f 4c 55 4d 4e   CONSTANT=COLUMN
257c0 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 74 72   that must be tr
257d0 65 65 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72  ee (in other wor
257e0 64 73 2c 20 69 66 20 74 68 65 20 74 65 72 6d 73  ds, if the terms
257f0 20 74 6f 70 2d 6c 65 76 65 6c 0a 2a 2a 20 41 4e   top-level.** AN
25800 44 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d  D-connected term
25810 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 70  s that are not p
25820 61 72 74 20 6f 66 20 61 20 4f 4e 20 63 6c 61 75  art of a ON clau
25830 73 65 20 66 72 6f 6d 20 61 20 4c 45 46 54 20 4a  se from a LEFT J
25840 4f 49 4e 29 0a 2a 2a 20 74 68 65 6e 20 74 68 72  OIN).** then thr
25850 6f 75 67 68 6f 75 74 20 74 68 65 20 71 75 65 72  oughout the quer
25860 79 20 72 65 70 6c 61 63 65 20 61 6c 6c 20 6f 74  y replace all ot
25870 68 65 72 20 6f 63 63 75 72 72 65 6e 63 65 73 20  her occurrences 
25880 6f 66 20 43 4f 4c 55 4d 4e 0a 2a 2a 20 77 69 74  of COLUMN.** wit
25890 68 20 43 4f 4e 53 54 41 4e 54 20 77 69 74 68 69  h CONSTANT withi
258a0 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
258b0 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  se..**.** For ex
258c0 61 6d 70 6c 65 2c 20 74 68 65 20 71 75 65 72 79  ample, the query
258d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 53 45 4c  :.**.**      SEL
258e0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74  ECT * FROM t1, t
258f0 32 2c 20 74 33 20 57 48 45 52 45 20 74 31 2e 61  2, t3 WHERE t1.a
25900 3d 33 39 20 41 4e 44 20 74 32 2e 62 3d 74 31 2e  =39 AND t2.b=t1.
25910 61 20 41 4e 44 20 74 33 2e 63 3d 74 32 2e 62 0a  a AND t3.c=t2.b.
25920 2a 2a 0a 2a 2a 20 49 73 20 74 72 61 6e 73 66 6f  **.** Is transfo
25930 72 6d 65 64 20 69 6e 74 6f 0a 2a 2a 0a 2a 2a 20  rmed into.**.** 
25940 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
25950 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48  OM t1, t2, t3 WH
25960 45 52 45 20 74 31 2e 61 3d 33 39 20 41 4e 44 20  ERE t1.a=39 AND 
25970 74 32 2e 62 3d 33 39 20 41 4e 44 20 74 33 2e 63  t2.b=39 AND t3.c
25980 3d 33 39 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  =39.**.** Return
25990 20 74 72 75 65 20 69 66 20 61 6e 79 20 74 72 61   true if any tra
259a0 6e 73 66 6f 72 6d 61 74 69 6f 6e 73 20 77 68 65  nsformations whe
259b0 72 65 20 6d 61 64 65 20 61 6e 64 20 66 61 6c 73  re made and fals
259c0 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20  e if not..**.** 
259d0 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6e  Implementation n
259e0 6f 74 65 3a 20 20 43 6f 6e 73 74 61 6e 74 20 70  ote:  Constant p
259f0 72 6f 70 61 67 61 74 69 6f 6e 20 69 73 20 74 72  ropagation is tr
25a00 69 63 6b 79 20 64 75 65 20 74 6f 20 61 66 66 69  icky due to affi
25a10 6e 69 74 79 0a 2a 2a 20 61 6e 64 20 63 6f 6c 6c  nity.** and coll
25a20 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  ating sequence i
25a30 6e 74 65 72 61 63 74 69 6f 6e 73 2e 20 20 43 6f  nteractions.  Co
25a40 6e 73 69 64 65 72 20 74 68 69 73 20 65 78 61 6d  nsider this exam
25a50 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52  ple:.**.**    CR
25a60 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
25a70 49 4e 54 2c 62 20 54 45 58 54 29 3b 0a 2a 2a 20  INT,b TEXT);.** 
25a80 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
25a90 31 20 56 41 4c 55 45 53 28 31 32 33 2c 27 30 31  1 VALUES(123,'01
25aa0 32 33 27 29 3b 0a 2a 2a 20 20 20 20 53 45 4c 45  23');.**    SELE
25ab0 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
25ac0 52 45 20 61 3d 31 32 33 20 41 4e 44 20 62 3d 61  RE a=123 AND b=a
25ad0 3b 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.**    SELECT *
25ae0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
25af0 3d 31 32 33 20 41 4e 44 20 62 3d 31 32 33 3b 0a  =123 AND b=123;.
25b00 2a 2a 0a 2a 2a 20 54 68 65 20 74 77 6f 20 53 45  **.** The two SE
25b10 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
25b20 61 62 6f 76 65 20 73 68 6f 75 6c 64 20 72 65 74  above should ret
25b30 75 72 6e 20 64 69 66 66 65 72 65 6e 74 20 61 6e  urn different an
25b40 73 77 65 72 73 2e 20 20 62 3d 61 0a 2a 2a 20 69  swers.  b=a.** i
25b50 73 20 61 6c 77 61 79 20 74 72 75 65 20 62 65 63  s alway true bec
25b60 61 75 73 65 20 74 68 65 20 63 6f 6d 70 61 72 69  ause the compari
25b70 73 6f 6e 20 75 73 65 73 20 6e 75 6d 65 72 69 63  son uses numeric
25b80 20 61 66 66 69 6e 69 74 79 2c 20 62 75 74 20 62   affinity, but b
25b90 3d 31 32 33 0a 2a 2a 20 69 73 20 66 61 6c 73 65  =123.** is false
25ba0 20 62 65 63 61 75 73 65 20 69 74 20 75 73 65 73   because it uses
25bb0 20 74 65 78 74 20 61 66 66 69 6e 69 74 79 20 61   text affinity a
25bc0 6e 64 20 27 30 31 32 33 27 20 69 73 20 6e 6f 74  nd '0123' is not
25bd0 20 74 68 65 20 73 61 6d 65 20 61 73 20 27 31 32   the same as '12
25be0 33 27 2e 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61  3'..** To work a
25bf0 72 6f 75 6e 64 20 74 68 69 73 2c 20 74 68 65 20  round this, the 
25c00 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
25c10 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  is not actually 
25c20 63 68 61 6e 67 65 64 20 66 72 6f 6d 0a 2a 2a 20  changed from.** 
25c30 22 62 3d 61 22 20 74 6f 20 22 62 3d 31 32 33 22  "b=a" to "b=123"
25c40 20 62 75 74 20 72 61 74 68 65 72 20 74 68 65 20   but rather the 
25c50 22 61 22 20 69 6e 20 22 62 3d 61 22 20 69 73 20  "a" in "b=a" is 
25c60 74 61 67 67 65 64 20 77 69 74 68 20 45 50 5f 46  tagged with EP_F
25c70 69 78 65 64 43 6f 6c 0a 2a 2a 20 61 6e 64 20 74  ixedCol.** and t
25c80 68 65 20 22 31 32 33 22 20 76 61 6c 75 65 20 69  he "123" value i
25c90 73 20 68 75 6e 67 20 6f 66 66 20 6f 66 20 74 68  s hung off of th
25ca0 65 20 70 4c 65 66 74 20 70 6f 69 6e 74 65 72 2e  e pLeft pointer.
25cb0 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 6f 72    Code generator
25cc0 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 6b 6e 6f  .** routines kno
25cd0 77 20 74 6f 20 67 65 6e 65 72 61 74 65 20 74 68  w to generate th
25ce0 65 20 63 6f 6e 73 74 61 6e 74 20 22 31 32 33 22  e constant "123"
25cf0 20 69 6e 73 74 65 61 64 20 6f 66 20 6c 6f 6f 6b   instead of look
25d00 69 6e 67 20 75 70 20 74 68 65 0a 2a 2a 20 63 6f  ing up the.** co
25d10 6c 75 6d 6e 20 76 61 6c 75 65 2e 20 20 41 6c 73  lumn value.  Als
25d20 6f 2c 20 74 6f 20 61 76 6f 69 64 20 63 6f 6c 6c  o, to avoid coll
25d30 61 74 69 6f 6e 20 70 72 6f 62 6c 65 6d 73 2c 20  ation problems, 
25d40 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
25d50 6e 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 61 74 74  n is.** only att
25d60 65 6d 70 74 65 64 20 69 66 20 74 68 65 20 22 61  empted if the "a
25d70 3d 31 32 33 22 20 74 65 72 6d 20 75 73 65 73 20  =123" term uses 
25d80 74 68 65 20 64 65 66 61 75 6c 74 20 42 49 4e 41  the default BINA
25d90 52 59 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f  RY collation..*/
25da0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 70  .static int prop
25db0 61 67 61 74 65 43 6f 6e 73 74 61 6e 74 73 28 0a  agateConstants(.
25dc0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
25dd0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
25de0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
25df0 65 6c 65 63 74 20 2a 70 20 20 20 20 20 20 20 20  elect *p        
25e00 2f 2a 20 54 68 65 20 71 75 65 72 79 20 69 6e 20  /* The query in 
25e10 77 68 69 63 68 20 74 6f 20 70 72 6f 70 61 67 61  which to propaga
25e20 74 65 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a  te constants */.
25e30 29 7b 0a 20 20 57 68 65 72 65 43 6f 6e 73 74 20  ){.  WhereConst 
25e40 78 3b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  x;.  Walker w;. 
25e50 20 69 6e 74 20 6e 43 68 6e 67 20 3d 20 30 3b 0a   int nChng = 0;.
25e60 20 20 78 2e 70 50 61 72 73 65 20 3d 20 70 50 61    x.pParse = pPa
25e70 72 73 65 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 78  rse;.  do{.    x
25e80 2e 6e 43 6f 6e 73 74 20 3d 20 30 3b 0a 20 20 20  .nConst = 0;.   
25e90 20 78 2e 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20   x.nChng = 0;.  
25ea0 20 20 78 2e 61 70 45 78 70 72 20 3d 20 30 3b 0a    x.apExpr = 0;.
25eb0 20 20 20 20 66 69 6e 64 43 6f 6e 73 74 49 6e 57      findConstInW
25ec0 68 65 72 65 28 26 78 2c 20 70 2d 3e 70 57 68 65  here(&x, p->pWhe
25ed0 72 65 29 3b 0a 20 20 20 20 69 66 28 20 78 2e 6e  re);.    if( x.n
25ee0 43 6f 6e 73 74 20 29 7b 0a 20 20 20 20 20 20 6d  Const ){.      m
25ef0 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
25f00 65 6f 66 28 77 29 29 3b 0a 20 20 20 20 20 20 77  eof(w));.      w
25f10 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
25f20 3b 0a 20 20 20 20 20 20 77 2e 78 45 78 70 72 43  ;.      w.xExprC
25f30 61 6c 6c 62 61 63 6b 20 3d 20 70 72 6f 70 61 67  allback = propag
25f40 61 74 65 43 6f 6e 73 74 61 6e 74 45 78 70 72 52  ateConstantExprR
25f50 65 77 72 69 74 65 3b 0a 20 20 20 20 20 20 77 2e  ewrite;.      w.
25f60 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
25f70 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  = sqlite3SelectW
25f80 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 77  alkNoop;.      w
25f90 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
25fa0 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 2e 77  2 = 0;.      w.w
25fb0 61 6c 6b 65 72 44 65 70 74 68 20 3d 20 30 3b 0a  alkerDepth = 0;.
25fc0 20 20 20 20 20 20 77 2e 75 2e 70 43 6f 6e 73 74        w.u.pConst
25fd0 20 3d 20 26 78 3b 0a 20 20 20 20 20 20 73 71 6c   = &x;.      sql
25fe0 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
25ff0 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20   p->pWhere);.   
26000 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
26010 28 78 2e 70 50 61 72 73 65 2d 3e 64 62 2c 20 78  (x.pParse->db, x
26020 2e 61 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  .apExpr);.      
26030 6e 43 68 6e 67 20 2b 3d 20 78 2e 6e 43 68 6e 67  nChng += x.nChng
26040 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
26050 28 20 78 2e 6e 43 68 6e 67 20 29 3b 20 20 0a 20  ( x.nChng );  . 
26060 20 72 65 74 75 72 6e 20 6e 43 68 6e 67 3b 0a 7d   return nChng;.}
26070 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
26080 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
26090 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
260a0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
260b0 57 29 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 63 6f  W)./*.** Make co
260c0 70 69 65 73 20 6f 66 20 72 65 6c 65 76 61 6e 74  pies of relevant
260d0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
260e0 72 6d 73 20 6f 66 20 74 68 65 20 6f 75 74 65 72  rms of the outer
260f0 20 71 75 65 72 79 20 69 6e 74 6f 0a 2a 2a 20 74   query into.** t
26100 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
26110 6f 66 20 73 75 62 71 75 65 72 79 2e 20 20 45 78  of subquery.  Ex
26120 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
26130 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53  SELECT * FROM (S
26140 45 4c 45 43 54 20 61 20 41 53 20 78 2c 20 63 2d  ELECT a AS x, c-
26150 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31 29 20  d AS y FROM t1) 
26160 57 48 45 52 45 20 78 3d 35 20 41 4e 44 20 79 3d  WHERE x=5 AND y=
26170 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66  10;.**.** Transf
26180 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 2a 2a 0a 2a  ormed into:.**.*
26190 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
261a0 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53 20  OM (SELECT a AS 
261b0 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f 4d  x, c-d AS y FROM
261c0 20 74 31 20 57 48 45 52 45 20 61 3d 35 20 41 4e   t1 WHERE a=5 AN
261d0 44 20 63 2d 64 3d 31 30 29 0a 2a 2a 20 20 20 20  D c-d=10).**    
261e0 20 57 48 45 52 45 20 78 3d 35 20 41 4e 44 20 79   WHERE x=5 AND y
261f0 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68  =10;.**.** The h
26200 6f 70 65 20 69 73 20 74 68 61 74 20 74 68 65 20  ope is that the 
26210 74 65 72 6d 73 20 61 64 64 65 64 20 74 6f 20 74  terms added to t
26220 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 77  he inner query w
26230 69 6c 6c 20 6d 61 6b 65 20 69 74 20 6d 6f 72 65  ill make it more
26240 0a 2a 2a 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a  .** efficient..*
26250 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65  *.** Do not atte
26260 6d 70 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  mpt this optimiz
26270 61 74 69 6f 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20  ation if:.**.** 
26280 20 20 28 31 29 20 28 2a 2a 20 54 68 69 73 20 72    (1) (** This r
26290 65 73 74 72 69 63 74 69 6f 6e 20 77 61 73 20 72  estriction was r
262a0 65 6d 6f 76 65 64 20 6f 6e 20 32 30 31 37 2d 30  emoved on 2017-0
262b0 39 2d 32 39 2e 20 20 57 65 20 75 73 65 64 20 74  9-29.  We used t
262c0 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 64  o.**           d
262d0 69 73 61 6c 6c 6f 77 20 74 68 69 73 20 6f 70 74  isallow this opt
262e0 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 61 67  imization for ag
262f0 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72 69  gregate subqueri
26300 65 73 2c 20 62 75 74 20 6e 6f 77 0a 2a 2a 20 20  es, but now.**  
26310 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20 61           it is a
26320 6c 6c 6f 77 65 64 20 62 79 20 70 75 74 74 69 6e  llowed by puttin
26330 67 20 74 68 65 20 65 78 74 72 61 20 74 65 72 6d  g the extra term
26340 73 20 6f 6e 20 74 68 65 20 48 41 56 49 4e 47 20  s on the HAVING 
26350 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20  clause..**      
26360 20 20 20 20 20 54 68 65 20 61 64 64 65 64 20 48       The added H
26370 41 56 49 4e 47 20 63 6c 61 75 73 65 20 69 73 20  AVING clause is 
26380 70 6f 69 6e 74 6c 65 73 73 20 69 66 20 74 68 65  pointless if the
26390 20 73 75 62 71 75 65 72 79 20 6c 61 63 6b 73 0a   subquery lacks.
263a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 20 47  **           a G
263b0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
263c0 20 42 75 74 20 73 75 63 68 20 61 20 48 41 56 49   But such a HAVI
263d0 4e 47 20 63 6c 61 75 73 65 20 69 73 20 61 6c 73  NG clause is als
263e0 6f 20 68 61 72 6d 6c 65 73 73 0a 2a 2a 20 20 20  o harmless.**   
263f0 20 20 20 20 20 20 20 20 73 6f 20 74 68 65 72 65          so there
26400 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72   does not appear
26410 20 74 6f 20 62 65 20 61 6e 79 20 72 65 61 73 6f   to be any reaso
26420 6e 20 74 6f 20 61 64 64 20 65 78 74 72 61 20 6c  n to add extra l
26430 6f 67 69 63 0a 2a 2a 20 20 20 20 20 20 20 20 20  ogic.**         
26440 20 20 74 6f 20 73 75 70 70 72 65 73 73 20 69 74    to suppress it
26450 2e 20 2a 2a 29 0a 2a 2a 0a 2a 2a 20 20 20 28 32  . **).**.**   (2
26460 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72  ) The inner quer
26470 79 20 69 73 20 74 68 65 20 72 65 63 75 72 73 69  y is the recursi
26480 76 65 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d  ve part of a com
26490 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70 72 65 73  mon table expres
264a0 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33  sion..**.**   (3
264b0 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72  ) The inner quer
264c0 79 20 68 61 73 20 61 20 4c 49 4d 49 54 20 63 6c  y has a LIMIT cl
264d0 61 75 73 65 20 28 73 69 6e 63 65 20 74 68 65 20  ause (since the 
264e0 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 57  changes to the W
264f0 48 45 52 45 0a 2a 2a 20 20 20 20 20 20 20 63 6c  HERE.**       cl
26500 61 75 73 65 20 77 6f 75 6c 64 20 63 68 61 6e 67  ause would chang
26510 65 20 74 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66  e the meaning of
26520 20 74 68 65 20 4c 49 4d 49 54 29 2e 0a 2a 2a 0a   the LIMIT)..**.
26530 2a 2a 20 20 20 28 34 29 20 54 68 65 20 69 6e 6e  **   (4) The inn
26540 65 72 20 71 75 65 72 79 20 69 73 20 74 68 65 20  er query is the 
26550 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
26560 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 61 6e 64   a LEFT JOIN and
26570 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 65 78   the.**       ex
26580 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 70  pression to be p
26590 75 73 68 65 64 20 64 6f 77 6e 20 64 6f 65 73 20  ushed down does 
265a0 6e 6f 74 20 63 6f 6d 65 20 66 72 6f 6d 20 74 68  not come from th
265b0 65 20 4f 4e 20 63 6c 61 75 73 65 0a 2a 2a 20 20  e ON clause.**  
265c0 20 20 20 20 20 6f 6e 20 74 68 61 74 20 4c 45 46       on that LEF
265d0 54 20 4a 4f 49 4e 2e 0a 2a 2a 0a 2a 2a 20 20 20  T JOIN..**.**   
265e0 28 35 29 20 54 68 65 20 57 48 45 52 45 20 63 6c  (5) The WHERE cl
265f0 61 75 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20  ause expression 
26600 6f 72 69 67 69 6e 61 74 65 73 20 69 6e 20 74 68  originates in th
26610 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
26620 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66  ause.**       of
26630 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 77 68 65   a LEFT JOIN whe
26640 72 65 20 69 43 75 72 73 6f 72 20 69 73 20 6e 6f  re iCursor is no
26650 74 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  t the right-hand
26660 20 74 61 62 6c 65 20 6f 66 20 74 68 61 74 0a 2a   table of that.*
26670 2a 20 20 20 20 20 20 20 6c 65 66 74 20 6a 6f 69  *       left joi
26680 6e 2e 20 20 41 6e 20 65 78 61 6d 70 6c 65 3a 0a  n.  An example:.
26690 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
266a0 53 45 4c 45 43 54 20 2a 0a 2a 2a 20 20 20 20 20  SELECT *.**     
266b0 20 20 20 20 20 20 46 52 4f 4d 20 28 53 45 4c 45        FROM (SELE
266c0 43 54 20 31 20 41 53 20 61 31 20 55 4e 49 4f 4e  CT 1 AS a1 UNION
266d0 20 41 4c 4c 20 53 45 4c 45 43 54 20 32 29 20 41   ALL SELECT 2) A
266e0 53 20 61 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  S aa.**         
266f0 20 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 31    JOIN (SELECT 1
26700 20 41 53 20 62 32 20 55 4e 49 4f 4e 20 41 4c 4c   AS b2 UNION ALL
26710 20 53 45 4c 45 43 54 20 32 29 20 41 53 20 62 62   SELECT 2) AS bb
26720 20 4f 4e 20 28 61 31 3d 62 32 29 0a 2a 2a 20 20   ON (a1=b2).**  
26730 20 20 20 20 20 20 20 20 20 4c 45 46 54 20 4a 4f           LEFT JO
26740 49 4e 20 28 53 45 4c 45 43 54 20 38 20 41 53 20  IN (SELECT 8 AS 
26750 63 33 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  c3 UNION ALL SEL
26760 45 43 54 20 39 29 20 41 53 20 63 63 20 4f 4e 20  ECT 9) AS cc ON 
26770 28 62 32 3d 32 29 3b 0a 2a 2a 0a 2a 2a 20 20 20  (b2=2);.**.**   
26780 20 20 20 20 54 68 65 20 63 6f 72 72 65 63 74 20      The correct 
26790 61 6e 73 77 65 72 20 69 73 20 74 68 72 65 65 20  answer is three 
267a0 72 6f 77 73 3a 20 20 28 31 2c 31 2c 4e 55 4c 4c  rows:  (1,1,NULL
267b0 29 2c 28 32 2c 32 2c 38 29 2c 28 32 2c 32 2c 39  ),(2,2,8),(2,2,9
267c0 29 2e 0a 2a 2a 20 20 20 20 20 20 20 42 75 74 20  )..**       But 
267d0 69 66 20 74 68 65 20 28 62 32 3d 32 29 20 74 65  if the (b2=2) te
267e0 72 6d 20 77 65 72 65 20 74 6f 20 62 65 20 70 75  rm were to be pu
267f0 73 68 65 64 20 64 6f 77 6e 20 69 6e 74 6f 20 74  shed down into t
26800 68 65 20 62 62 20 73 75 62 71 75 65 72 79 2c 0a  he bb subquery,.
26810 2a 2a 20 20 20 20 20 20 20 74 68 65 6e 20 74 68  **       then th
26820 65 20 28 31 2c 31 2c 4e 55 4c 4c 29 20 72 6f 77  e (1,1,NULL) row
26830 20 77 6f 75 6c 64 20 62 65 20 73 75 70 70 72 65   would be suppre
26840 73 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36  ssed..**.**   (6
26850 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72  ) The inner quer
26860 79 20 66 65 61 74 75 72 65 73 20 6f 6e 65 20 6f  y features one o
26870 72 20 6d 6f 72 65 20 77 69 6e 64 6f 77 2d 66 75  r more window-fu
26880 6e 63 74 69 6f 6e 73 20 28 73 69 6e 63 65 20 0a  nctions (since .
26890 2a 2a 20 20 20 20 20 20 20 63 68 61 6e 67 65 73  **       changes
268a0 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
268b0 61 75 73 65 20 6f 66 20 74 68 65 20 69 6e 6e 65  ause of the inne
268c0 72 20 71 75 65 72 79 20 63 6f 75 6c 64 20 63 68  r query could ch
268d0 61 6e 67 65 20 74 68 65 20 0a 2a 2a 20 20 20 20  ange the .**    
268e0 20 20 20 77 69 6e 64 6f 77 20 6f 76 65 72 20 77     window over w
268f0 68 69 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63  hich window func
26900 74 69 6f 6e 73 20 61 72 65 20 63 61 6c 63 75 6c  tions are calcul
26910 61 74 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ated)..**.** Ret
26920 75 72 6e 20 30 20 69 66 20 6e 6f 20 63 68 61 6e  urn 0 if no chan
26930 67 65 73 20 61 72 65 20 6d 61 64 65 20 61 6e 64  ges are made and
26940 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f 6e 65   non-zero if one
26950 20 6f 72 20 6d 6f 72 65 20 57 48 45 52 45 20 63   or more WHERE c
26960 6c 61 75 73 65 0a 2a 2a 20 74 65 72 6d 73 20 61  lause.** terms a
26970 72 65 20 64 75 70 6c 69 63 61 74 65 64 20 69 6e  re duplicated in
26980 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  to the subquery.
26990 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
269a0 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d  ushDownWhereTerm
269b0 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
269c0 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
269d0 72 73 65 20 63 6f 6e 74 65 78 74 20 28 66 6f 72  rse context (for
269e0 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 65 72   malloc() and er
269f0 72 6f 72 20 72 65 70 6f 72 74 69 6e 67 29 20 2a  ror reporting) *
26a00 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
26a10 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  q,        /* The
26a20 20 73 75 62 71 75 65 72 79 20 77 68 6f 73 65 20   subquery whose 
26a30 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
26a40 74 6f 20 62 65 20 61 75 67 6d 65 6e 74 65 64 20  to be augmented 
26a50 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
26a60 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
26a70 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
26a80 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
26a90 79 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 73  y */.  int iCurs
26aa0 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or,          /* 
26ab0 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  Cursor number of
26ac0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   the subquery */
26ad0 0a 20 20 69 6e 74 20 69 73 4c 65 66 74 4a 6f 69  .  int isLeftJoi
26ae0 6e 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  n        /* True
26af0 20 69 66 20 70 53 75 62 71 20 69 73 20 74 68 65   if pSubq is the
26b00 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61   right term of a
26b10 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 29 7b   LEFT JOIN */.){
26b20 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
26b30 20 69 6e 74 20 6e 43 68 6e 67 20 3d 20 30 3b 0a   int nChng = 0;.
26b40 20 20 69 66 28 20 70 57 68 65 72 65 3d 3d 30 20    if( pWhere==0 
26b50 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
26b60 28 20 70 53 75 62 71 2d 3e 73 65 6c 46 6c 61 67  ( pSubq->selFlag
26b70 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
26b80 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
26b90 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 32 29   restriction (2)
26ba0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
26bb0 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
26bc0 55 4e 43 0a 20 20 69 66 28 20 70 53 75 62 71 2d  UNC.  if( pSubq-
26bd0 3e 70 57 69 6e 20 29 20 72 65 74 75 72 6e 20 30  >pWin ) return 0
26be0 3b 20 20 20 20 2f 2a 20 72 65 73 74 72 69 63 74  ;    /* restrict
26bf0 69 6f 6e 20 28 36 29 20 2a 2f 0a 23 65 6e 64 69  ion (6) */.#endi
26c00 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
26c10 5f 44 45 42 55 47 0a 20 20 2f 2a 20 4f 6e 6c 79  _DEBUG.  /* Only
26c20 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20   the first term 
26c30 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 63 61  of a compound ca
26c40 6e 20 68 61 76 65 20 61 20 57 49 54 48 20 63 6c  n have a WITH cl
26c50 61 75 73 65 2e 20 20 42 75 74 20 6d 61 6b 65 0a  ause.  But make.
26c60 20 20 2a 2a 20 73 75 72 65 20 6e 6f 20 6f 74 68    ** sure no oth
26c70 65 72 20 74 65 72 6d 73 20 61 72 65 20 6d 61 72  er terms are mar
26c80 6b 65 64 20 53 46 5f 52 65 63 75 72 73 69 76 65  ked SF_Recursive
26c90 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 74 68 69   in case somethi
26ca0 6e 67 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20  ng changes.  ** 
26cb0 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 0a 20  in the future.. 
26cc0 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 53 65 6c 65   */.  {.    Sele
26cd0 63 74 20 2a 70 58 3b 20 20 0a 20 20 20 20 66 6f  ct *pX;  .    fo
26ce0 72 28 70 58 3d 70 53 75 62 71 3b 20 70 58 3b 20  r(pX=pSubq; pX; 
26cf0 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 0a  pX=pX->pPrior){.
26d00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
26d10 58 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  X->selFlags & (S
26d20 46 5f 52 65 63 75 72 73 69 76 65 29 29 3d 3d 30  F_Recursive))==0
26d30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   );.    }.  }.#e
26d40 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 53 75 62  ndif..  if( pSub
26d50 71 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29 7b 0a  q->pLimit!=0 ){.
26d60 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
26d70 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29   restriction (3)
26d80 20 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28   */.  }.  while(
26d90 20 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f   pWhere->op==TK_
26da0 41 4e 44 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67  AND ){.    nChng
26db0 20 2b 3d 20 70 75 73 68 44 6f 77 6e 57 68 65 72   += pushDownWher
26dc0 65 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20 70  eTerms(pParse, p
26dd0 53 75 62 71 2c 20 70 57 68 65 72 65 2d 3e 70 52  Subq, pWhere->pR
26de0 69 67 68 74 2c 0a 20 20 20 20 20 20 20 20 20 20  ight,.          
26df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e00 20 20 20 20 20 20 69 43 75 72 73 6f 72 2c 20 69        iCursor, i
26e10 73 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20  sLeftJoin);.    
26e20 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 2d  pWhere = pWhere-
26e30 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66  >pLeft;.  }.  if
26e40 28 20 69 73 4c 65 66 74 4a 6f 69 6e 0a 20 20 20  ( isLeftJoin.   
26e50 26 26 20 28 45 78 70 72 48 61 73 50 72 6f 70 65  && (ExprHasPrope
26e60 72 74 79 28 70 57 68 65 72 65 2c 45 50 5f 46 72  rty(pWhere,EP_Fr
26e70 6f 6d 4a 6f 69 6e 29 3d 3d 30 0a 20 20 20 20 20  omJoin)==0.     
26e80 20 20 20 20 7c 7c 20 70 57 68 65 72 65 2d 3e 69      || pWhere->i
26e90 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d  RightJoinTable!=
26ea0 69 43 75 72 73 6f 72 29 0a 20 20 29 7b 0a 20 20  iCursor).  ){.  
26eb0 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72    return 0; /* r
26ec0 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29 20 2a  estriction (4) *
26ed0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 45 78 70 72  /.  }.  if( Expr
26ee0 48 61 73 50 72 6f 70 65 72 74 79 28 70 57 68 65  HasProperty(pWhe
26ef0 72 65 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  re,EP_FromJoin) 
26f00 26 26 20 70 57 68 65 72 65 2d 3e 69 52 69 67 68  && pWhere->iRigh
26f10 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 69 43 75 72  tJoinTable!=iCur
26f20 73 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  sor ){.    retur
26f30 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74  n 0; /* restrict
26f40 69 6f 6e 20 28 35 29 20 2a 2f 0a 20 20 7d 0a 20  ion (5) */.  }. 
26f50 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
26f60 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28  IsTableConstant(
26f70 70 57 68 65 72 65 2c 20 69 43 75 72 73 6f 72 29  pWhere, iCursor)
26f80 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 2b 2b 3b   ){.    nChng++;
26f90 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53 75 62  .    while( pSub
26fa0 71 20 29 7b 0a 20 20 20 20 20 20 53 75 62 73 74  q ){.      Subst
26fb0 43 6f 6e 74 65 78 74 20 78 3b 0a 20 20 20 20 20  Context x;.     
26fc0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
26fd0 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  xprDup(pParse->d
26fe0 62 2c 20 70 57 68 65 72 65 2c 20 30 29 3b 0a 20  b, pWhere, 0);. 
26ff0 20 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78       unsetJoinEx
27000 70 72 28 70 4e 65 77 2c 20 2d 31 29 3b 0a 20 20  pr(pNew, -1);.  
27010 20 20 20 20 78 2e 70 50 61 72 73 65 20 3d 20 70      x.pParse = p
27020 50 61 72 73 65 3b 0a 20 20 20 20 20 20 78 2e 69  Parse;.      x.i
27030 54 61 62 6c 65 20 3d 20 69 43 75 72 73 6f 72 3b  Table = iCursor;
27040 0a 20 20 20 20 20 20 78 2e 69 4e 65 77 54 61 62  .      x.iNewTab
27050 6c 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20  le = iCursor;.  
27060 20 20 20 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e      x.isLeftJoin
27070 20 3d 20 30 3b 0a 20 20 20 20 20 20 78 2e 70 45   = 0;.      x.pE
27080 4c 69 73 74 20 3d 20 70 53 75 62 71 2d 3e 70 45  List = pSubq->pE
27090 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 4e 65 77  List;.      pNew
270a0 20 3d 20 73 75 62 73 74 45 78 70 72 28 26 78 2c   = substExpr(&x,
270b0 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66   pNew);.      if
270c0 28 20 70 53 75 62 71 2d 3e 73 65 6c 46 6c 61 67  ( pSubq->selFlag
270d0 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
270e0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 75 62   ){.        pSub
270f0 71 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c  q->pHaving = sql
27100 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72  ite3ExprAnd(pPar
27110 73 65 2c 20 70 53 75 62 71 2d 3e 70 48 61 76 69  se, pSubq->pHavi
27120 6e 67 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  ng, pNew);.     
27130 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27140 70 53 75 62 71 2d 3e 70 57 68 65 72 65 20 3d 20  pSubq->pWhere = 
27150 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
27160 50 61 72 73 65 2c 20 70 53 75 62 71 2d 3e 70 57  Parse, pSubq->pW
27170 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20  here, pNew);.   
27180 20 20 20 7d 0a 20 20 20 20 20 20 70 53 75 62 71     }.      pSubq
27190 20 3d 20 70 53 75 62 71 2d 3e 70 50 72 69 6f 72   = pSubq->pPrior
271a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
271b0 74 75 72 6e 20 6e 43 68 6e 67 3b 0a 7d 0a 23 65  turn nChng;.}.#e
271c0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
271d0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
271e0 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
271f0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
27200 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  IEW) */../*.** T
27210 68 65 20 70 46 75 6e 63 20 69 73 20 74 68 65 20  he pFunc is the 
27220 6f 6e 6c 79 20 61 67 67 72 65 67 61 74 65 20 66  only aggregate f
27230 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 71  unction in the q
27240 75 65 72 79 2e 20 20 43 68 65 63 6b 20 74 6f 20  uery.  Check to 
27250 73 65 65 0a 2a 2a 20 69 66 20 74 68 65 20 71 75  see.** if the qu
27260 65 72 79 20 69 73 20 61 20 63 61 6e 64 69 64 61  ery is a candida
27270 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d  te for the min/m
27280 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  ax optimization.
27290 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 71   .**.** If the q
272a0 75 65 72 79 20 69 73 20 61 20 63 61 6e 64 69 64  uery is a candid
272b0 61 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f  ate for the min/
272c0 6d 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  max optimization
272d0 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20 2a 70  , then set.** *p
272e0 70 4d 69 6e 4d 61 78 20 74 6f 20 62 65 20 61 6e  pMinMax to be an
272f0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
27300 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20   to be used for 
27310 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
27320 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 65  .** and return e
27330 69 74 68 65 72 20 57 48 45 52 45 5f 4f 52 44 45  ither WHERE_ORDE
27340 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45  RBY_MIN or WHERE
27350 5f 4f 52 44 45 52 42 59 5f 4d 41 58 20 64 65 70  _ORDERBY_MAX dep
27360 65 6e 64 69 6e 67 20 6f 6e 0a 2a 2a 20 77 68 65  ending on.** whe
27370 74 68 65 72 20 70 46 75 6e 63 20 69 73 20 61 20  ther pFunc is a 
27380 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66  min() or max() f
27390 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
273a0 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 6e  f the query is n
273b0 6f 74 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  ot a candidate f
273c0 6f 72 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f  or the min/max o
273d0 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 72 65 74  ptimization, ret
273e0 75 72 6e 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44  urn.** WHERE_ORD
273f0 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 28 77 68 69  ERBY_NORMAL (whi
27400 63 68 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 29  ch must be zero)
27410 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
27420 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c  tine must be cal
27430 6c 65 64 20 61 66 74 65 72 20 61 67 67 72 65 67  led after aggreg
27440 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 68 61  ate functions ha
27450 76 65 20 62 65 65 6e 0a 2a 2a 20 6c 6f 63 61 74  ve been.** locat
27460 65 64 20 62 75 74 20 62 65 66 6f 72 65 20 74 68  ed but before th
27470 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20 68 61  eir arguments ha
27480 76 65 20 62 65 65 6e 20 73 75 62 6a 65 63 74 65  ve been subjecte
27490 64 20 74 6f 20 61 67 67 72 65 67 61 74 65 0a 2a  d to aggregate.*
274a0 2a 20 61 6e 61 6c 79 73 69 73 2e 0a 2a 2f 0a 73  * analysis..*/.s
274b0 74 61 74 69 63 20 75 38 20 6d 69 6e 4d 61 78 51  tatic u8 minMaxQ
274c0 75 65 72 79 28 73 71 6c 69 74 65 33 20 2a 64 62  uery(sqlite3 *db
274d0 2c 20 45 78 70 72 20 2a 70 46 75 6e 63 2c 20 45  , Expr *pFunc, E
274e0 78 70 72 4c 69 73 74 20 2a 2a 70 70 4d 69 6e 4d  xprList **ppMinM
274f0 61 78 29 7b 0a 20 20 69 6e 74 20 65 52 65 74 20  ax){.  int eRet 
27500 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
27510 4e 4f 52 4d 41 4c 3b 20 20 20 20 20 20 2f 2a 20  NORMAL;      /* 
27520 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
27530 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
27540 73 74 20 3d 20 70 46 75 6e 63 2d 3e 78 2e 70 4c  st = pFunc->x.pL
27550 69 73 74 3b 20 20 20 20 2f 2a 20 41 72 67 75 6d  ist;    /* Argum
27560 65 6e 74 73 20 74 6f 20 61 67 67 20 66 75 6e 63  ents to agg func
27570 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tion */.  const 
27580 63 68 61 72 20 2a 7a 46 75 6e 63 3b 20 20 20 20  char *zFunc;    
27590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275a0 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 67 67 72 65  /* Name of aggre
275b0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 70 46  gate function pF
275c0 75 6e 63 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  unc */.  ExprLis
275d0 74 20 2a 70 4f 72 64 65 72 42 79 3b 0a 20 20 75  t *pOrderBy;.  u
275e0 38 20 73 6f 72 74 4f 72 64 65 72 3b 0a 0a 20 20  8 sortOrder;..  
275f0 61 73 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61  assert( *ppMinMa
27600 78 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  x==0 );.  assert
27610 28 20 70 46 75 6e 63 2d 3e 6f 70 3d 3d 54 4b 5f  ( pFunc->op==TK_
27620 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
27630 20 20 61 73 73 65 72 74 28 20 21 49 73 57 69 6e    assert( !IsWin
27640 64 6f 77 46 75 6e 63 28 70 46 75 6e 63 29 20 29  dowFunc(pFunc) )
27650 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d  ;.  if( pEList==
27660 30 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  0 || pEList->nEx
27670 70 72 21 3d 31 20 7c 7c 20 45 78 70 72 48 61 73  pr!=1 || ExprHas
27680 50 72 6f 70 65 72 74 79 28 70 46 75 6e 63 2c 20  Property(pFunc, 
27690 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20  EP_WinFunc) ){. 
276a0 20 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a     return eRet;.
276b0 20 20 7d 0a 20 20 7a 46 75 6e 63 20 3d 20 70 46    }.  zFunc = pF
276c0 75 6e 63 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  unc->u.zToken;. 
276d0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
276e0 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22  Cmp(zFunc, "min"
276f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65 52 65 74  )==0 ){.    eRet
27700 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   = WHERE_ORDERBY
27710 5f 4d 49 4e 3b 0a 20 20 20 20 73 6f 72 74 4f 72  _MIN;.    sortOr
27720 64 65 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f  der = SQLITE_SO_
27730 41 53 43 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ASC;.  }else if(
27740 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
27750 7a 46 75 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30  zFunc, "max")==0
27760 20 29 7b 0a 20 20 20 20 65 52 65 74 20 3d 20 57   ){.    eRet = W
27770 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58  HERE_ORDERBY_MAX
27780 3b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20  ;.    sortOrder 
27790 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43  = SQLITE_SO_DESC
277a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
277b0 65 74 75 72 6e 20 65 52 65 74 3b 0a 20 20 7d 0a  eturn eRet;.  }.
277c0 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 4f    *ppMinMax = pO
277d0 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
277e0 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
277f0 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 61 73  pEList, 0);.  as
27800 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d  sert( pOrderBy!=
27810 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
27820 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
27830 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64 65 72  OrderBy ) pOrder
27840 42 79 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64  By->a[0].sortOrd
27850 65 72 20 3d 20 73 6f 72 74 4f 72 64 65 72 3b 0a  er = sortOrder;.
27860 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d    return eRet;.}
27870 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65  ../*.** The sele
27880 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
27890 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
278a0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
278b0 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
278c0 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
278d0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 61  rgument is the a
278e0 73 73 6f 63 69 61 74 65 64 20 61 67 67 72 65 67  ssociated aggreg
278f0 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e  ate-info object.
27900 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   This .** functi
27910 6f 6e 20 74 65 73 74 73 20 69 66 20 74 68 65 20  on tests if the 
27920 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65  SELECT is of the
27930 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53   form:.**.**   S
27940 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
27950 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20  ROM <tbl>.**.** 
27960 77 68 65 72 65 20 74 61 62 6c 65 20 69 73 20 61  where table is a
27970 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c   database table,
27980 20 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63   not a sub-selec
27990 74 20 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68  t or view. If th
279a0 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20  e query.** does 
279b0 6d 61 74 63 68 20 74 68 69 73 20 70 61 74 74 65  match this patte
279c0 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74  rn, then a point
279d0 65 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20  er to the Table 
279e0 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74  object represent
279f0 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20  ing.** <tbl> is 
27a00 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
27a10 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e  ise, 0 is return
27a20 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61  ed..*/.static Ta
27a30 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75  ble *isSimpleCou
27a40 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67  nt(Select *p, Ag
27a50 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
27a60 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
27a70 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a  .  Expr *pExpr;.
27a80 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70  .  assert( !p->p
27a90 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66  GroupBy );..  if
27aa0 28 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70  ( p->pWhere || p
27ab0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
27ac0 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72  =1 .   || p->pSr
27ad0 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d  c->nSrc!=1 || p-
27ae0 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  >pSrc->a[0].pSel
27af0 65 63 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ect.  ){.    ret
27b00 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61  urn 0;.  }.  pTa
27b10 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
27b20 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20  ].pTab;.  pExpr 
27b30 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  = p->pEList->a[0
27b40 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72  ].pExpr;.  asser
27b50 74 28 20 70 54 61 62 20 26 26 20 21 70 54 61 62  t( pTab && !pTab
27b60 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 70 45 78  ->pSelect && pEx
27b70 70 72 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56  pr );..  if( IsV
27b80 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72  irtual(pTab) ) r
27b90 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
27ba0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
27bb0 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75  _FUNCTION ) retu
27bc0 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45  rn 0;.  if( NEVE
27bd0 52 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  R(pAggInfo->nFun
27be0 63 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30  c==0) ) return 0
27bf0 3b 0a 20 20 69 66 28 20 28 70 41 67 67 49 6e 66  ;.  if( (pAggInf
27c00 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e  o->aFunc[0].pFun
27c10 63 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53 51 4c  c->funcFlags&SQL
27c20 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d  ITE_FUNC_COUNT)=
27c30 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
27c40 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
27c50 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 44  erty(pExpr, EP_D
27c60 69 73 74 69 6e 63 74 7c 45 50 5f 57 69 6e 46 75  istinct|EP_WinFu
27c70 6e 63 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  nc) ) return 0;.
27c80 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
27c90 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
27ca0 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d  source-list item
27cb0 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
27cc0 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65  gument was augme
27cd0 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20  nted with an.** 
27ce0 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
27cf0 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c  e, then try to l
27d00 6f 63 61 74 65 20 74 68 65 20 73 70 65 63 69 66  ocate the specif
27d10 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68  ied index. If th
27d20 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20  ere.** was such 
27d30 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  a clause and the
27d40 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e   named index can
27d50 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  not be found, re
27d60 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
27d70 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20  ERROR and leave 
27d80 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72  an error in pPar
27d90 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70  se. Otherwise, p
27da0 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f  opulate .** pFro
27db0 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65  m->pIndex and re
27dc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
27dd0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
27de0 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61  dexedByLookup(Pa
27df0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72  rse *pParse, str
27e00 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
27e10 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20   *pFrom){.  if( 
27e20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70  pFrom->pTab && p
27e30 46 72 6f 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  From->fg.isIndex
27e40 65 64 42 79 20 29 7b 0a 20 20 20 20 54 61 62 6c  edBy ){.    Tabl
27e50 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
27e60 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72 20  >pTab;.    char 
27e70 2a 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 70 46  *zIndexedBy = pF
27e80 72 6f 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64  rom->u1.zIndexed
27e90 42 79 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  By;.    Index *p
27ea0 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
27eb0 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
27ec0 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 26 26  .        pIdx &&
27ed0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
27ee0 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e  pIdx->zName, zIn
27ef0 64 65 78 65 64 42 79 29 3b 20 0a 20 20 20 20 20  dexedBy); .     
27f00 20 20 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e     pIdx=pIdx->pN
27f10 65 78 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ext.    );.    i
27f20 66 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20  f( !pIdx ){.    
27f30 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
27f40 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
27f50 63 68 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a  ch index: %s", z
27f60 49 6e 64 65 78 65 64 42 79 2c 20 30 29 3b 0a 20  IndexedBy, 0);. 
27f70 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65       pParse->che
27f80 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
27f90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27fa0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
27fb0 20 20 20 70 46 72 6f 6d 2d 3e 70 49 42 49 6e 64     pFrom->pIBInd
27fc0 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20  ex = pIdx;.  }. 
27fd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27fe0 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63  K;.}./*.** Detec
27ff0 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  t compound SELEC
28000 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  T statements tha
28010 74 20 75 73 65 20 61 6e 20 4f 52 44 45 52 20 42  t use an ORDER B
28020 59 20 63 6c 61 75 73 65 20 77 69 74 68 20 0a 2a  Y clause with .*
28030 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65  * an alternative
28040 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
28050 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  nce..**.**    SE
28060 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  LECT ... FROM t1
28070 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e   EXCEPT SELECT .
28080 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52  .. FROM t2 ORDER
28090 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e   BY .. COLLATE .
280a0 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61  ...**.** These a
280b0 72 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20  re rewritten as 
280c0 61 20 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a  a subquery:.**.*
280d0 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
280e0 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46  OM (SELECT ... F
280f0 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53 45  ROM t1 EXCEPT SE
28100 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32  LECT ... FROM t2
28110 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42  ).**     ORDER B
28120 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e  Y ... COLLATE ..
28130 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61  ..**.** This tra
28140 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e  nsformation is n
28150 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65  ecessary because
28160 20 74 68 65 20 6d 75 6c 74 69 53 65 6c 65 63 74   the multiSelect
28170 4f 72 64 65 72 42 79 28 29 20 72 6f 75 74 69 6e  OrderBy() routin
28180 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68 61 74 20  e.** above that 
28190 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
281a0 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e  de for a compoun
281b0 64 20 53 45 4c 45 43 54 20 77 69 74 68 20 61 6e  d SELECT with an
281c0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
281d0 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65 72 67 65  .** uses a merge
281e0 20 61 6c 67 6f 72 69 74 68 6d 20 74 68 61 74 20   algorithm that 
281f0 72 65 71 75 69 72 65 73 20 74 68 65 20 73 61 6d  requires the sam
28200 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
28210 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72  ence on the.** r
28220 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73  esult columns as
28230 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   on the ORDER BY
28240 20 63 6c 61 75 73 65 2e 20 20 53 65 65 20 74 69   clause.  See ti
28250 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77  cket.** http://w
28260 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72  ww.sqlite.org/sr
28270 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37 34 64 32  c/info/6709574d2
28280 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61  a.**.** This tra
28290 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f  nsformation is o
282a0 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f 72 20 45  nly needed for E
282b0 58 43 45 50 54 2c 20 49 4e 54 45 52 53 45 43 54  XCEPT, INTERSECT
282c0 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20  , and UNION..** 
282d0 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  The UNION ALL op
282e0 65 72 61 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e  erator works fin
282f0 65 20 77 69 74 68 20 6d 75 6c 74 69 53 65 6c 65  e with multiSele
28300 63 74 4f 72 64 65 72 42 79 28 29 20 65 76 65 6e  ctOrderBy() even
28310 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61   when.** there a
28320 72 65 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73  re COLLATE terms
28330 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
28340 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
28350 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53  convertCompoundS
28360 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 28  electToSubquery(
28370 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
28380 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
28390 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a  nt i;.  Select *
283a0 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a  pNew;.  Select *
283b0 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pX;.  sqlite3 *d
283c0 62 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  b;.  struct Expr
283d0 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20  List_item *a;.  
283e0 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 53 72 63  SrcList *pNewSrc
283f0 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
28400 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79  e;.  Token dummy
28410 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  ;..  if( p->pPri
28420 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  or==0 ) return W
28430 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69  RC_Continue;.  i
28440 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  f( p->pOrderBy==
28450 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
28460 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70  ontinue;.  for(p
28470 58 3d 70 3b 20 70 58 20 26 26 20 28 70 58 2d 3e  X=p; pX && (pX->
28480 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58  op==TK_ALL || pX
28490 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29  ->op==TK_SELECT)
284a0 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29  ; pX=pX->pPrior)
284b0 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d 30 20 29  {}.  if( pX==0 )
284c0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
284d0 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70  inue;.  a = p->p
284e0 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f  OrderBy->a;.  fo
284f0 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d  r(i=p->pOrderBy-
28500 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20  >nExpr-1; i>=0; 
28510 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 5b  i--){.    if( a[
28520 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  i].pExpr->flags 
28530 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62  & EP_Collate ) b
28540 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
28550 69 3c 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  i<0 ) return WRC
28560 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a  _Continue;..  /*
28570 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
28580 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65  s point, that me
28590 61 6e 73 20 74 68 65 20 74 72 61 6e 73 66 6f 72  ans the transfor
285a0 6d 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72  mation is requir
285b0 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65  ed. */..  pParse
285c0 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
285d0 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  se;.  db = pPars
285e0 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20  e->db;.  pNew = 
285f0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
28600 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
28610 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
28620 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
28630 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d  WRC_Abort;.  mem
28640 73 65 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73  set(&dummy, 0, s
28650 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20  izeof(dummy));. 
28660 20 70 4e 65 77 53 72 63 20 3d 20 73 71 6c 69 74   pNewSrc = sqlit
28670 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46  e3SrcListAppendF
28680 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 30  romTerm(pParse,0
28690 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77  ,0,0,&dummy,pNew
286a0 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20 70 4e 65  ,0,0);.  if( pNe
286b0 77 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  wSrc==0 ) return
286c0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 2a 70   WRC_Abort;.  *p
286d0 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70  New = *p;.  p->p
286e0 53 72 63 20 3d 20 70 4e 65 77 53 72 63 3b 0a 20  Src = pNewSrc;. 
286f0 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c   p->pEList = sql
28700 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
28710 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73 71  nd(pParse, 0, sq
28720 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
28730 5f 41 53 54 45 52 49 53 4b 2c 20 30 29 29 3b 0a  _ASTERISK, 0));.
28740 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c    p->op = TK_SEL
28750 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65  ECT;.  p->pWhere
28760 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47   = 0;.  pNew->pG
28770 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e  roupBy = 0;.  pN
28780 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b  ew->pHaving = 0;
28790 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
287a0 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69  y = 0;.  p->pPri
287b0 6f 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e 65  or = 0;.  p->pNe
287c0 78 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 57 69  xt = 0;.  p->pWi
287d0 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 73 65 6c  th = 0;.  p->sel
287e0 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d  Flags &= ~SF_Com
287f0 70 6f 75 6e 64 3b 0a 20 20 61 73 73 65 72 74 28  pound;.  assert(
28800 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
28810 53 46 5f 43 6f 6e 76 65 72 74 65 64 29 3d 3d 30  SF_Converted)==0
28820 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67   );.  p->selFlag
28830 73 20 7c 3d 20 53 46 5f 43 6f 6e 76 65 72 74 65  s |= SF_Converte
28840 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  d;.  assert( pNe
28850 77 2d 3e 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a  w->pPrior!=0 );.
28860 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 2d 3e    pNew->pPrior->
28870 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pNext = pNew;.  
28880 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  pNew->pLimit = 0
28890 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ;.  return WRC_C
288a0 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
288b0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
288c0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
288d0 65 20 74 65 72 6d 20 70 46 72 6f 6d 20 68 61 73  e term pFrom has
288e0 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75   table-valued fu
288f0 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72 67 75 6d 65  nction.** argume
28900 6e 74 73 2e 20 20 49 66 20 69 74 20 64 6f 65 73  nts.  If it does
28910 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
28920 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
28930 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  se and return.**
28940 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 73 69 6e 63 65   non-zero, since
28950 20 70 46 72 6f 6d 20 69 73 20 6e 6f 74 20 61 6c   pFrom is not al
28960 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 20 74 61  lowed to be a ta
28970 62 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e 63 74  ble-valued funct
28980 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
28990 6e 74 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74  nt cannotBeFunct
289a0 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
289b0 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  e, struct SrcLis
289c0 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a  t_item *pFrom){.
289d0 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e    if( pFrom->fg.
289e0 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20  isTabFunc ){.   
289f0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
28a00 28 70 50 61 72 73 65 2c 20 22 27 25 73 27 20 69  (pParse, "'%s' i
28a10 73 20 6e 6f 74 20 61 20 66 75 6e 63 74 69 6f 6e  s not a function
28a20 22 2c 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 29  ", pFrom->zName)
28a30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
28a40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
28a50 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
28a60 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a  E_OMIT_CTE./*.**
28a70 20 41 72 67 75 6d 65 6e 74 20 70 57 69 74 68 20   Argument pWith 
28a80 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 4e 55  (which may be NU
28a90 4c 4c 29 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  LL) points to a 
28aa0 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e  linked list of n
28ab0 65 73 74 65 64 20 0a 2a 2a 20 57 49 54 48 20 63  ested .** WITH c
28ac0 6f 6e 74 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e  ontexts, from in
28ad0 6e 65 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74  ner to outermost
28ae0 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69  . If the table i
28af0 64 65 6e 74 69 66 69 65 64 20 62 79 20 0a 2a 2a  dentified by .**
28b00 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65   FROM clause ele
28b10 6d 65 6e 74 20 70 49 74 65 6d 20 69 73 20 72 65  ment pItem is re
28b20 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61  ally a common-ta
28b30 62 6c 65 2d 65 78 70 72 65 73 73 69 6f 6e 20 28  ble-expression (
28b40 43 54 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65  CTE) .** then re
28b50 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
28b60 6f 20 74 68 65 20 43 54 45 20 64 65 66 69 6e 69  o the CTE defini
28b70 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 74 61  tion for that ta
28b80 62 6c 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a  ble. Otherwise.*
28b90 2a 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  * return NULL..*
28ba0 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e 55  *.** If a non-NU
28bb0 4c 4c 20 76 61 6c 75 65 20 69 73 20 72 65 74 75  LL value is retu
28bc0 72 6e 65 64 2c 20 73 65 74 20 2a 70 70 43 6f 6e  rned, set *ppCon
28bd0 74 65 78 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f  text to point to
28be0 20 74 68 65 20 57 69 74 68 0a 2a 2a 20 6f 62 6a   the With.** obj
28bf0 65 63 74 20 74 68 61 74 20 74 68 65 20 72 65 74  ect that the ret
28c00 75 72 6e 65 64 20 43 54 45 20 62 65 6c 6f 6e 67  urned CTE belong
28c10 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  s to..*/.static 
28c20 73 74 72 75 63 74 20 43 74 65 20 2a 73 65 61 72  struct Cte *sear
28c30 63 68 57 69 74 68 28 0a 20 20 57 69 74 68 20 2a  chWith(.  With *
28c40 70 57 69 74 68 2c 20 20 20 20 20 20 20 20 20 20  pWith,          
28c50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
28c60 72 65 6e 74 20 69 6e 6e 65 72 6d 6f 73 74 20 57  rent innermost W
28c70 49 54 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ITH clause */.  
28c80 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
28c90 74 65 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20 20  tem *pItem,     
28ca0 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  /* FROM clause e
28cb0 6c 65 6d 65 6e 74 20 74 6f 20 72 65 73 6f 6c 76  lement to resolv
28cc0 65 20 2a 2f 0a 20 20 57 69 74 68 20 2a 2a 70 70  e */.  With **pp
28cd0 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20 20  Context         
28ce0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57         /* OUT: W
28cf0 49 54 48 20 63 6c 61 75 73 65 20 72 65 74 75 72  ITH clause retur
28d00 6e 20 76 61 6c 75 65 20 62 65 6c 6f 6e 67 73 20  n value belongs 
28d10 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  to */.){.  const
28d20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
28d30 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  if( pItem->zData
28d40 62 61 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61 6d  base==0 && (zNam
28d50 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  e = pItem->zName
28d60 29 21 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68  )!=0 ){.    With
28d70 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70   *p;.    for(p=p
28d80 57 69 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f  With; p; p=p->pO
28d90 75 74 65 72 29 7b 0a 20 20 20 20 20 20 69 6e 74  uter){.      int
28da0 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
28db0 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b  0; i<p->nCte; i+
28dc0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
28dd0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
28de0 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e  Name, p->a[i].zN
28df0 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
28e00 20 20 20 20 20 2a 70 70 43 6f 6e 74 65 78 74 20       *ppContext 
28e10 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = p;.          r
28e20 65 74 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a  eturn &p->a[i];.
28e30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28e40 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
28e50 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68  turn 0;.}../* Th
28e60 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
28e70 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 73 74 61   maintains a sta
28e80 63 6b 20 6f 66 20 61 63 74 69 76 65 20 57 49 54  ck of active WIT
28e90 48 20 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74  H clauses.** wit
28ea0 68 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74  h the inner-most
28eb0 20 57 49 54 48 20 63 6c 61 75 73 65 20 62 65 69   WITH clause bei
28ec0 6e 67 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66  ng at the top of
28ed0 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a   the stack..**.*
28ee0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70  * This routine p
28ef0 75 73 68 65 73 20 74 68 65 20 57 49 54 48 20 63  ushes the WITH c
28f00 6c 61 75 73 65 20 70 61 73 73 65 64 20 61 73 20  lause passed as 
28f10 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
28f20 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20  ent.** onto the 
28f30 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
28f40 2e 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 46  . If argument bF
28f50 72 65 65 20 69 73 20 74 72 75 65 2c 20 74 68 65  ree is true, the
28f60 6e 20 74 68 69 73 0a 2a 2a 20 57 49 54 48 20 63  n this.** WITH c
28f70 6c 61 75 73 65 20 77 69 6c 6c 20 6e 65 76 65 72  lause will never
28f80 20 62 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20   be popped from 
28f90 74 68 65 20 73 74 61 63 6b 2e 20 49 6e 20 74 68  the stack. In th
28fa0 69 73 20 63 61 73 65 20 69 74 0a 2a 2a 20 73 68  is case it.** sh
28fb0 6f 75 6c 64 20 62 65 20 66 72 65 65 64 20 61 6c  ould be freed al
28fc0 6f 6e 67 20 77 69 74 68 20 74 68 65 20 50 61 72  ong with the Par
28fd0 73 65 20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f 74  se object. In ot
28fe0 68 65 72 20 63 61 73 65 73 2c 20 77 68 65 6e 0a  her cases, when.
28ff0 2a 2a 20 62 46 72 65 65 3d 3d 30 2c 20 74 68 65  ** bFree==0, the
29000 20 57 69 74 68 20 6f 62 6a 65 63 74 20 77 69 6c   With object wil
29010 6c 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67  l be freed along
29020 20 77 69 74 68 20 74 68 65 20 53 45 4c 45 43 54   with the SELECT
29030 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77   .** statement w
29040 69 74 68 20 77 68 69 63 68 20 69 74 20 69 73 20  ith which it is 
29050 61 73 73 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a 76  associated..*/.v
29060 6f 69 64 20 73 71 6c 69 74 65 33 57 69 74 68 50  oid sqlite3WithP
29070 75 73 68 28 50 61 72 73 65 20 2a 70 50 61 72 73  ush(Parse *pPars
29080 65 2c 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20  e, With *pWith, 
29090 75 38 20 62 46 72 65 65 29 7b 0a 20 20 61 73 73  u8 bFree){.  ass
290a0 65 72 74 28 20 62 46 72 65 65 3d 3d 30 20 7c 7c  ert( bFree==0 ||
290b0 20 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d   (pParse->pWith=
290c0 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 70 57  =0 && pParse->pW
290d0 69 74 68 54 6f 46 72 65 65 3d 3d 30 29 20 29 3b  ithToFree==0) );
290e0 0a 20 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a  .  if( pWith ){.
290f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
29100 73 65 2d 3e 70 57 69 74 68 21 3d 70 57 69 74 68  se->pWith!=pWith
29110 20 29 3b 0a 20 20 20 20 70 57 69 74 68 2d 3e 70   );.    pWith->p
29120 4f 75 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e  Outer = pParse->
29130 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73  pWith;.    pPars
29140 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68  e->pWith = pWith
29150 3b 0a 20 20 20 20 69 66 28 20 62 46 72 65 65 20  ;.    if( bFree 
29160 29 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 54  ) pParse->pWithT
29170 6f 46 72 65 65 20 3d 20 70 57 69 74 68 3b 0a 20  oFree = pWith;. 
29180 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
29190 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73   function checks
291a0 20 69 66 20 61 72 67 75 6d 65 6e 74 20 70 46 72   if argument pFr
291b0 6f 6d 20 72 65 66 65 72 73 20 74 6f 20 61 20 43  om refers to a C
291c0 54 45 20 64 65 63 6c 61 72 65 64 20 62 79 20 0a  TE declared by .
291d0 2a 2a 20 61 20 57 49 54 48 20 63 6c 61 75 73 65  ** a WITH clause
291e0 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 63 75   on the stack cu
291f0 72 72 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e  rrently maintain
29200 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
29210 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72  . And,.** if cur
29220 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e  rently processin
29230 67 20 61 20 43 54 45 20 65 78 70 72 65 73 73 69  g a CTE expressi
29240 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 61 20 72  on, if it is a r
29250 65 63 75 72 73 69 76 65 0a 2a 2a 20 72 65 66 65  ecursive.** refe
29260 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 75 72  rence to the cur
29270 72 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20  rent CTE..**.** 
29280 49 66 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69  If pFrom falls i
29290 6e 74 6f 20 65 69 74 68 65 72 20 6f 66 20 74 68  nto either of th
292a0 65 20 74 77 6f 20 63 61 74 65 67 6f 72 69 65 73  e two categories
292b0 20 61 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70   above, pFrom->p
292c0 54 61 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72  Tab.** and other
292d0 20 66 69 65 6c 64 73 20 61 72 65 20 70 6f 70 75   fields are popu
292e0 6c 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c  lated accordingl
292f0 79 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68  y. The caller sh
29300 6f 75 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70  ould check.** (p
29310 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74  From->pTab!=0) t
29320 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  o determine whet
29330 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 75 63  her or not a suc
29340 63 65 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a  cessful match.**
29350 20 77 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   was found..**.*
29360 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * Whether or not
29370 20 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e   a match is foun
29380 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  d, SQLITE_OK is 
29390 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65  returned if no e
293a0 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20  rror.** occurs. 
293b0 49 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73  If an error does
293c0 20 6f 63 63 75 72 2c 20 61 6e 20 65 72 72 6f 72   occur, an error
293d0 20 6d 65 73 73 61 67 65 20 69 73 20 73 74 6f 72   message is stor
293e0 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72  ed in the.** par
293f0 73 65 72 20 61 6e 64 20 73 6f 6d 65 20 65 72 72  ser and some err
29400 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 20 74 68  or code other th
29410 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  an SQLITE_OK ret
29420 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
29430 20 69 6e 74 20 77 69 74 68 45 78 70 61 6e 64 28   int withExpand(
29440 0a 20 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  .  Walker *pWalk
29450 65 72 2c 20 0a 20 20 73 74 72 75 63 74 20 53 72  er, .  struct Sr
29460 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
29470 6d 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  m.){.  Parse *pP
29480 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
29490 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65  pParse;.  sqlite
294a0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
294b0 64 62 3b 0a 20 20 73 74 72 75 63 74 20 43 74 65  db;.  struct Cte
294c0 20 2a 70 43 74 65 3b 20 20 20 20 20 20 20 20 20   *pCte;         
294d0 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 65 64        /* Matched
294e0 20 43 54 45 20 28 6f 72 20 4e 55 4c 4c 20 69 66   CTE (or NULL if
294f0 20 6e 6f 20 6d 61 74 63 68 29 20 2a 2f 0a 20 20   no match) */.  
29500 57 69 74 68 20 2a 70 57 69 74 68 3b 20 20 20 20  With *pWith;    
29510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29520 2f 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 74  /* WITH clause t
29530 68 61 74 20 70 43 74 65 20 62 65 6c 6f 6e 67 73  hat pCte belongs
29540 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74   to */..  assert
29550 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
29560 20 29 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73 65   );..  pCte = se
29570 61 72 63 68 57 69 74 68 28 70 50 61 72 73 65 2d  archWith(pParse-
29580 3e 70 57 69 74 68 2c 20 70 46 72 6f 6d 2c 20 26  >pWith, pFrom, &
29590 70 57 69 74 68 29 3b 0a 20 20 69 66 28 20 70 43  pWith);.  if( pC
295a0 74 65 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  te ){.    Table 
295b0 2a 70 54 61 62 3b 0a 20 20 20 20 45 78 70 72 4c  *pTab;.    ExprL
295c0 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20  ist *pEList;.   
295d0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20   Select *pSel;. 
295e0 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 65 66 74     Select *pLeft
295f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29600 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45   /* Left-most SE
29610 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
29620 2f 0a 20 20 20 20 69 6e 74 20 62 4d 61 79 52 65  /.    int bMayRe
29630 63 75 72 73 69 76 65 3b 20 20 20 20 20 20 20 20  cursive;        
29640 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63      /* True if c
29650 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65 64 20 62  ompound joined b
29660 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f  y UNION [ALL] */
29670 0a 20 20 20 20 57 69 74 68 20 2a 70 53 61 76 65  .    With *pSave
29680 64 57 69 74 68 3b 20 20 20 20 20 20 20 20 20 20  dWith;          
29690 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61     /* Initial va
296a0 6c 75 65 20 6f 66 20 70 50 61 72 73 65 2d 3e 70  lue of pParse->p
296b0 57 69 74 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  With */..    /* 
296c0 49 66 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72  If pCte->zCteErr
296d0 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20   is non-NULL at 
296e0 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
296f0 20 74 68 69 73 20 69 73 20 61 6e 20 69 6c 6c 65   this is an ille
29700 67 61 6c 0a 20 20 20 20 2a 2a 20 72 65 63 75 72  gal.    ** recur
29710 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 74  sive reference t
29720 6f 20 43 54 45 20 70 43 74 65 2e 20 4c 65 61 76  o CTE pCte. Leav
29730 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50  e an error in pP
29740 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a  arse and return.
29750 20 20 20 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66      ** early. If
29760 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69   pCte->zCteErr i
29770 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69  s NULL, then thi
29780 73 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72  s is not a recur
29790 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 2e 0a  sive reference..
297a0 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
297b0 61 73 65 2c 20 70 72 6f 63 65 65 64 2e 20 20 2a  ase, proceed.  *
297c0 2f 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e  /.    if( pCte->
297d0 7a 43 74 65 45 72 72 20 29 7b 0a 20 20 20 20 20  zCteErr ){.     
297e0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
297f0 28 70 50 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a  (pParse, pCte->z
29800 43 74 65 45 72 72 2c 20 70 43 74 65 2d 3e 7a 4e  CteErr, pCte->zN
29810 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
29820 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
29830 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
29840 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28  annotBeFunction(
29850 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29  pParse, pFrom) )
29860 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
29870 52 52 4f 52 3b 0a 0a 20 20 20 20 61 73 73 65 72  RROR;..    asser
29880 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
29890 30 20 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  0 );.    pFrom->
298a0 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71  pTab = pTab = sq
298b0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
298c0 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
298d0 6c 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70 54  le));.    if( pT
298e0 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  ab==0 ) return W
298f0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 70 54  RC_Abort;.    pT
29900 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b  ab->nTabRef = 1;
29910 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  .    pTab->zName
29920 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
29930 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61  up(db, pCte->zNa
29940 6d 65 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69  me);.    pTab->i
29950 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 70  PKey = -1;.    p
29960 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
29970 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32  = 200; assert( 2
29980 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  00==sqlite3LogEs
29990 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20  t(1048576) );.  
299a0 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73    pTab->tabFlags
299b0 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c   |= TF_Ephemeral
299c0 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52   | TF_NoVisibleR
299d0 6f 77 69 64 3b 0a 20 20 20 20 70 46 72 6f 6d 2d  owid;.    pFrom-
299e0 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
299f0 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
29a00 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30  pCte->pSelect, 0
29a10 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
29a20 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
29a30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
29a40 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65  M_BKPT;.    asse
29a50 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  rt( pFrom->pSele
29a60 63 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  ct );..    /* Ch
29a70 65 63 6b 20 69 66 20 74 68 69 73 20 69 73 20 61  eck if this is a
29a80 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2e 20   recursive CTE. 
29a90 2a 2f 0a 20 20 20 20 70 53 65 6c 20 3d 20 70 46  */.    pSel = pF
29aa0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  rom->pSelect;.  
29ab0 20 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20    bMayRecursive 
29ac0 3d 20 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b  = ( pSel->op==TK
29ad0 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70  _ALL || pSel->op
29ae0 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
29af0 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73    if( bMayRecurs
29b00 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ive ){.      int
29b10 20 69 3b 0a 20 20 20 20 20 20 53 72 63 4c 69 73   i;.      SrcLis
29b20 74 20 2a 70 53 72 63 20 3d 20 70 46 72 6f 6d 2d  t *pSrc = pFrom-
29b30 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a  >pSelect->pSrc;.
29b40 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
29b50 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  <pSrc->nSrc; i++
29b60 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
29b70 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
29b80 70 49 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61  pItem = &pSrc->a
29b90 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [i];.        if(
29ba0 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
29bb0 65 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26  e==0 .         &
29bc0 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d  & pItem->zName!=
29bd0 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 30  0 .         && 0
29be0 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
29bf0 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70  (pItem->zName, p
29c00 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20 20  Cte->zName).    
29c10 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
29c20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 3d     pItem->pTab =
29c30 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20   pTab;.         
29c40 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 52 65 63   pItem->fg.isRec
29c50 75 72 73 69 76 65 20 3d 20 31 3b 0a 20 20 20 20  ursive = 1;.    
29c60 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62        pTab->nTab
29c70 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Ref++;.         
29c80 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20   pSel->selFlags 
29c90 7c 3d 20 53 46 5f 52 65 63 75 72 73 69 76 65 3b  |= SF_Recursive;
29ca0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29cb0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
29cc0 20 4f 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72 73   Only one recurs
29cd0 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 69 73  ive reference is
29ce0 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a   permitted. */ .
29cf0 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 54      if( pTab->nT
29d00 61 62 52 65 66 3e 32 20 29 7b 0a 20 20 20 20 20  abRef>2 ){.     
29d10 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
29d20 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72  (.          pPar
29d30 73 65 2c 20 22 6d 75 6c 74 69 70 6c 65 20 72 65  se, "multiple re
29d40 66 65 72 65 6e 63 65 73 20 74 6f 20 72 65 63 75  ferences to recu
29d50 72 73 69 76 65 20 74 61 62 6c 65 3a 20 25 73 22  rsive table: %s"
29d60 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20  , pCte->zName.  
29d70 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 65 74      );.      ret
29d80 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
29d90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
29da0 72 74 28 20 70 54 61 62 2d 3e 6e 54 61 62 52 65  rt( pTab->nTabRe
29db0 66 3d 3d 31 20 7c 7c 20 0a 20 20 20 20 20 20 20  f==1 || .       
29dc0 20 20 20 20 20 28 28 70 53 65 6c 2d 3e 73 65 6c       ((pSel->sel
29dd0 46 6c 61 67 73 26 53 46 5f 52 65 63 75 72 73 69  Flags&SF_Recursi
29de0 76 65 29 20 26 26 20 70 54 61 62 2d 3e 6e 54 61  ve) && pTab->nTa
29df0 62 52 65 66 3d 3d 32 20 29 29 3b 0a 0a 20 20 20  bRef==2 ));..   
29e00 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d   pCte->zCteErr =
29e10 20 22 63 69 72 63 75 6c 61 72 20 72 65 66 65 72   "circular refer
29e20 65 6e 63 65 3a 20 25 73 22 3b 0a 20 20 20 20 70  ence: %s";.    p
29e30 53 61 76 65 64 57 69 74 68 20 3d 20 70 50 61 72  SavedWith = pPar
29e40 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70  se->pWith;.    p
29e50 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
29e60 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20 62 4d  With;.    if( bM
29e70 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  ayRecursive ){. 
29e80 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72       Select *pPr
29e90 69 6f 72 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69  ior = pSel->pPri
29ea0 6f 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  or;.      assert
29eb0 28 20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 3d  ( pPrior->pWith=
29ec0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69  =0 );.      pPri
29ed0 6f 72 2d 3e 70 57 69 74 68 20 3d 20 70 53 65 6c  or->pWith = pSel
29ee0 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 20 20 73  ->pWith;.      s
29ef0 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
29f00 28 70 57 61 6c 6b 65 72 2c 20 70 50 72 69 6f 72  (pWalker, pPrior
29f10 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  );.      pPrior-
29f20 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20 20 20 20  >pWith = 0;.    
29f30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
29f40 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
29f50 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20  Walker, pSel);. 
29f60 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
29f70 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a  >pWith = pWith;.
29f80 0a 20 20 20 20 66 6f 72 28 70 4c 65 66 74 3d 70  .    for(pLeft=p
29f90 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72 69  Sel; pLeft->pPri
29fa0 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74 2d  or; pLeft=pLeft-
29fb0 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 70 45  >pPrior);.    pE
29fc0 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70 45  List = pLeft->pE
29fd0 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70 43  List;.    if( pC
29fe0 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20 20 20  te->pCols ){.   
29ff0 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26     if( pEList &&
2a000 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d   pEList->nExpr!=
2a010 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78  pCte->pCols->nEx
2a020 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pr ){.        sq
2a030 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2a040 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
2a050 68 61 73 20 25 64 20 76 61 6c 75 65 73 20 66 6f  has %d values fo
2a060 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20  r %d columns",. 
2a070 20 20 20 20 20 20 20 20 20 20 20 70 43 74 65 2d             pCte-
2a080 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73 74 2d 3e  >zName, pEList->
2a090 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e 70 43 6f  nExpr, pCte->pCo
2a0a0 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20  ls->nExpr.      
2a0b0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61    );.        pPa
2a0c0 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61  rse->pWith = pSa
2a0d0 76 65 64 57 69 74 68 3b 0a 20 20 20 20 20 20 20  vedWith;.       
2a0e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
2a0f0 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
2a100 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 43 74      pEList = pCt
2a110 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a  e->pCols;.    }.
2a120 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  .    sqlite3Colu
2a130 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
2a140 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20  pParse, pEList, 
2a150 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54  &pTab->nCol, &pT
2a160 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 69  ab->aCol);.    i
2a170 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65  f( bMayRecursive
2a180 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53   ){.      if( pS
2a190 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  el->selFlags & S
2a1a0 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  F_Recursive ){. 
2a1b0 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 43 74         pCte->zCt
2a1c0 65 45 72 72 20 3d 20 22 6d 75 6c 74 69 70 6c 65  eErr = "multiple
2a1d0 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72   recursive refer
2a1e0 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20 20 20 20  ences: %s";.    
2a1f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2a200 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d   pCte->zCteErr =
2a210 20 22 72 65 63 75 72 73 69 76 65 20 72 65 66 65   "recursive refe
2a220 72 65 6e 63 65 20 69 6e 20 61 20 73 75 62 71 75  rence in a subqu
2a230 65 72 79 3a 20 25 73 22 3b 0a 20 20 20 20 20 20  ery: %s";.      
2a240 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  }.      sqlite3W
2a250 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
2a260 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a  r, pSel);.    }.
2a270 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72      pCte->zCteEr
2a280 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 72 73  r = 0;.    pPars
2a290 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65  e->pWith = pSave
2a2a0 64 57 69 74 68 3b 0a 20 20 7d 0a 0a 20 20 72 65  dWith;.  }..  re
2a2b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2a2c0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
2a2d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
2a2e0 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53  E./*.** If the S
2a2f0 45 4c 45 43 54 20 70 61 73 73 65 64 20 61 73 20  ELECT passed as 
2a300 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
2a310 65 6e 74 20 68 61 73 20 61 6e 20 61 73 73 6f 63  ent has an assoc
2a320 69 61 74 65 64 20 57 49 54 48 20 0a 2a 2a 20 63  iated WITH .** c
2a330 6c 61 75 73 65 2c 20 70 6f 70 20 69 74 20 66 72  lause, pop it fr
2a340 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 73 74 6f  om the stack sto
2a350 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  red as part of t
2a360 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e  he Parse object.
2a370 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
2a380 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20  tion is used as 
2a390 74 68 65 20 78 53 65 6c 65 63 74 43 61 6c 6c 62  the xSelectCallb
2a3a0 61 63 6b 32 28 29 20 63 61 6c 6c 62 61 63 6b 20  ack2() callback 
2a3b0 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c  by.** sqlite3Sel
2a3c0 65 63 74 45 78 70 61 6e 64 28 29 20 77 68 65 6e  ectExpand() when
2a3d0 20 77 61 6c 6b 69 6e 67 20 61 20 53 45 4c 45 43   walking a SELEC
2a3e0 54 20 74 72 65 65 20 74 6f 20 72 65 73 6f 6c 76  T tree to resolv
2a3f0 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73  e table.** names
2a400 20 61 6e 64 20 6f 74 68 65 72 20 46 52 4f 4d 20   and other FROM 
2a410 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 2e  clause elements.
2a420 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
2a430 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 28 57   selectPopWith(W
2a440 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
2a450 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
2a460 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
2a470 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
2a480 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59   if( OK_IF_ALWAY
2a490 53 5f 54 52 55 45 28 70 50 61 72 73 65 2d 3e 70  S_TRUE(pParse->p
2a4a0 57 69 74 68 29 20 26 26 20 70 2d 3e 70 50 72 69  With) && p->pPri
2a4b0 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 57 69 74  or==0 ){.    Wit
2a4c0 68 20 2a 70 57 69 74 68 20 3d 20 66 69 6e 64 52  h *pWith = findR
2a4d0 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69  ightmost(p)->pWi
2a4e0 74 68 3b 0a 20 20 20 20 69 66 28 20 70 57 69 74  th;.    if( pWit
2a4f0 68 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  h!=0 ){.      as
2a500 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57  sert( pParse->pW
2a510 69 74 68 3d 3d 70 57 69 74 68 20 29 3b 0a 20 20  ith==pWith );.  
2a520 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
2a530 68 20 3d 20 70 57 69 74 68 2d 3e 70 4f 75 74 65  h = pWith->pOute
2a540 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  r;.    }.  }.}.#
2a550 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 73 65 6c  else.#define sel
2a560 65 63 74 50 6f 70 57 69 74 68 20 30 0a 23 65 6e  ectPopWith 0.#en
2a570 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 53  dif../*.** The S
2a580 72 63 4c 69 73 74 5f 69 74 65 6d 20 73 74 72 75  rcList_item stru
2a590 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20  cture passed as 
2a5a0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
2a5b0 65 6e 74 20 72 65 70 72 65 73 65 6e 74 73 20 61  ent represents a
2a5c0 0a 2a 2a 20 73 75 62 2d 71 75 65 72 79 20 69 6e  .** sub-query in
2a5d0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2a5e0 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61   of a SELECT sta
2a5f0 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 66 75 6e  tement. This fun
2a600 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74  ction.** allocat
2a610 65 73 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 73  es and populates
2a620 20 74 68 65 20 53 72 63 4c 69 73 74 5f 69 74 65   the SrcList_ite
2a630 6d 2e 70 54 61 62 20 6f 62 6a 65 63 74 2e 20 49  m.pTab object. I
2a640 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a  f successful,.**
2a650 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
2a660 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
2a670 65 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72  e, if an OOM err
2a680 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
2a690 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  d,.** SQLITE_NOM
2a6a0 45 4d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  EM..*/.int sqlit
2a6b0 65 33 45 78 70 61 6e 64 53 75 62 71 75 65 72 79  e3ExpandSubquery
2a6c0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2a6d0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2a6e0 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 53  tem *pFrom){.  S
2a6f0 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46  elect *pSel = pF
2a700 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  rom->pSelect;.  
2a710 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 0a 20 20  Table *pTab;..  
2a720 61 73 73 65 72 74 28 20 70 53 65 6c 20 29 3b 0a  assert( pSel );.
2a730 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
2a740 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pTab = sqlite3Db
2a750 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73  MallocZero(pPars
2a760 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  e->db, sizeof(Ta
2a770 62 6c 65 29 29 3b 0a 20 20 69 66 28 20 70 54 61  ble));.  if( pTa
2a780 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  b==0 ) return SQ
2a790 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 54  LITE_NOMEM;.  pT
2a7a0 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b  ab->nTabRef = 1;
2a7b0 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 41  .  if( pFrom->zA
2a7c0 6c 69 61 73 20 29 7b 0a 20 20 20 20 70 54 61 62  lias ){.    pTab
2a7d0 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
2a7e0 33 44 62 53 74 72 44 75 70 28 70 50 61 72 73 65  3DbStrDup(pParse
2a7f0 2d 3e 64 62 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c  ->db, pFrom->zAl
2a800 69 61 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ias);.  }else{. 
2a810 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d     pTab->zName =
2a820 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
2a830 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 73 75 62  pParse->db, "sub
2a840 71 75 65 72 79 5f 25 75 22 2c 20 70 53 65 6c 2d  query_%u", pSel-
2a850 3e 73 65 6c 49 64 29 3b 0a 20 20 7d 0a 20 20 77  >selId);.  }.  w
2a860 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69  hile( pSel->pPri
2a870 6f 72 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65  or ){ pSel = pSe
2a880 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 73  l->pPrior; }.  s
2a890 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f  qlite3ColumnsFro
2a8a0 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
2a8b0 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 26  , pSel->pEList,&
2a8c0 70 54 61 62 2d 3e 6e 43 6f 6c 2c 26 70 54 61 62  pTab->nCol,&pTab
2a8d0 2d 3e 61 43 6f 6c 29 3b 0a 20 20 70 54 61 62 2d  ->aCol);.  pTab-
2a8e0 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70  >iPKey = -1;.  p
2a8f0 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
2a900 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32  = 200; assert( 2
2a910 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  00==sqlite3LogEs
2a920 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20  t(1048576) );.  
2a930 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
2a940 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a  = TF_Ephemeral;.
2a950 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65  .  return pParse
2a960 2d 3e 6e 45 72 72 20 3f 20 53 51 4c 49 54 45 5f  ->nErr ? SQLITE_
2a970 45 52 52 4f 52 20 3a 20 53 51 4c 49 54 45 5f 4f  ERROR : SQLITE_O
2a980 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
2a990 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61   routine is a Wa
2a9a0 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f  lker callback fo
2a9b0 72 20 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20  r "expanding" a 
2a9c0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2a9d0 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22  ..** "Expanding"
2a9e0 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65   means to do the
2a9f0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
2aa00 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73  *    (1)  Make s
2aa10 75 72 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  ure VDBE cursor 
2aa20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
2aa30 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76  n assigned to ev
2aa40 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65  ery.**         e
2aa50 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52  lement of the FR
2aa60 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  OM clause..**.**
2aa70 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e      (2)  Fill in
2aa80 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61   the pTabList->a
2aa90 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69  [].pTab fields i
2aaa0 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68  n the SrcList th
2aab0 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64  at .**         d
2aac0 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75  efines FROM clau
2aad0 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20  se.  When views 
2aae0 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52  appear in the FR
2aaf0 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20  OM clause,.**   
2ab00 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c        fill pTabL
2ab10 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74  ist->a[].pSelect
2ab20 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
2ab30 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
2ab40 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
2ab50 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
2ab60 74 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70  the view.  A cop
2ab70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65  y is made of the
2ab80 20 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a   view's SELECT.*
2ab90 2a 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d  *         statem
2aba0 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63  ent so that we c
2abb0 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79  an freely modify
2abc0 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20   or delete that 
2abd0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  statement.**    
2abe0 20 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72       without wor
2abf0 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73  rying about mess
2ac00 69 6e 67 20 75 70 20 74 68 65 20 70 65 72 73 69  ing up the persi
2ac10 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61  stent representa
2ac20 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  tion.**         
2ac30 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a  of the view..**.
2ac40 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64 20 74  **    (3)  Add t
2ac50 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52  erms to the WHER
2ac60 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f  E clause to acco
2ac70 6d 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55  mmodate the NATU
2ac80 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20  RAL keyword.**  
2ac90 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20         on joins 
2aca0 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55  and the ON and U
2acb0 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a  SING clause of j
2acc0 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  oins..**.**    (
2acd0 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73  4)  Scan the lis
2ace0 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  t of columns in 
2acf0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 28  the result set (
2ad00 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a  pEList) looking.
2ad10 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20 69  **         for i
2ad20 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
2ad30 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  "*" operator or 
2ad40 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72  the TABLE.* oper
2ad50 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ator..**        
2ad60 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e   If found, expan
2ad70 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65  d each "*" to be
2ad80 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
2ad90 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20   every table.** 
2ada0 20 20 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c          and TABL
2adb0 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20  E.* to be every 
2adc0 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e  column in TABLE.
2add0 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
2ade0 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  t selectExpander
2adf0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2ae00 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
2ae10 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
2ae20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
2ae30 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a  .  int i, j, k;.
2ae40 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
2ae50 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
2ae60 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  *pEList;.  struc
2ae70 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2ae80 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pFrom;.  sqlite3
2ae90 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
2aea0 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c 20 2a  b;.  Expr *pE, *
2aeb0 70 52 69 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a  pRight, *pExpr;.
2aec0 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 20 3d    u16 selFlags =
2aed0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 20 20   p->selFlags;.  
2aee0 75 33 32 20 65 6c 69 73 74 46 6c 61 67 73 20 3d  u32 elistFlags =
2aef0 20 30 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c 61   0;..  p->selFla
2af00 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65  gs |= SF_Expande
2af10 64 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  d;.  if( db->mal
2af20 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20  locFailed  ){.  
2af30 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
2af40 72 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rt;.  }.  assert
2af50 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 0a  ( p->pSrc!=0 );.
2af60 20 20 69 66 28 20 28 73 65 6c 46 6c 61 67 73 20    if( (selFlags 
2af70 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d  & SF_Expanded)!=
2af80 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
2af90 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20  WRC_Prune;.  }. 
2afa0 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43   if( pWalker->eC
2afb0 6f 64 65 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65  ode ){.    /* Re
2afc0 6e 75 6d 62 65 72 20 73 65 6c 49 64 20 62 65 63  number selId bec
2afd0 61 75 73 65 20 69 74 20 68 61 73 20 62 65 65 6e  ause it has been
2afe0 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 61 20 76   copied from a v
2aff0 69 65 77 20 2a 2f 0a 20 20 20 20 70 2d 3e 73 65  iew */.    p->se
2b000 6c 49 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lId = ++pParse->
2b010 6e 53 65 6c 65 63 74 3b 0a 20 20 7d 0a 20 20 70  nSelect;.  }.  p
2b020 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
2b030 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  c;.  pEList = p-
2b040 3e 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74  >pEList;.  sqlit
2b050 65 33 57 69 74 68 50 75 73 68 28 70 50 61 72 73  e3WithPush(pPars
2b060 65 2c 20 70 2d 3e 70 57 69 74 68 2c 20 30 29 3b  e, p->pWith, 0);
2b070 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
2b080 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
2b090 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e  have been assign
2b0a0 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65  ed to all entrie
2b0b0 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52  s in.  ** the FR
2b0c0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
2b0d0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2b0e0 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  t..  */.  sqlite
2b0f0 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
2b100 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54  rsors(pParse, pT
2b110 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c  abList);..  /* L
2b120 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62  ook up every tab
2b130 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20  le named in the 
2b140 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
2b150 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20  he select.  If. 
2b160 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20   ** an entry of 
2b170 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2b180 69 73 20 61 20 73 75 62 71 75 65 72 79 20 69 6e  is a subquery in
2b190 73 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65  stead of a table
2b1a0 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74   or view,.  ** t
2b1b0 68 65 6e 20 63 72 65 61 74 65 20 61 20 74 72 61  hen create a tra
2b1c0 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72  nsient table str
2b1d0 75 63 74 75 72 65 20 74 6f 20 64 65 73 63 72 69  ucture to descri
2b1e0 62 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  be the subquery.
2b1f0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  .  */.  for(i=0,
2b200 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
2b210 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
2b220 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
2b230 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
2b240 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74  pTab;.    assert
2b250 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65  ( pFrom->fg.isRe
2b260 63 75 72 73 69 76 65 3d 3d 30 20 7c 7c 20 70 46  cursive==0 || pF
2b270 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a  rom->pTab!=0 );.
2b280 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66      if( pFrom->f
2b290 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 29 20  g.isRecursive ) 
2b2a0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
2b2b0 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
2b2c0 62 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20  b==0 );.#ifndef 
2b2d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
2b2e0 20 20 20 20 69 66 28 20 77 69 74 68 45 78 70 61      if( withExpa
2b2f0 6e 64 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f  nd(pWalker, pFro
2b300 6d 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  m) ) return WRC_
2b310 41 62 6f 72 74 3b 0a 20 20 20 20 69 66 28 20 70  Abort;.    if( p
2b320 46 72 6f 6d 2d 3e 70 54 61 62 20 29 20 7b 7d 20  From->pTab ) {} 
2b330 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
2b340 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65  if( pFrom->zName
2b350 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ==0 ){.#ifndef S
2b360 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
2b370 45 52 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74  ERY.      Select
2b380 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e   *pSel = pFrom->
2b390 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f  pSelect;.      /
2b3a0 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e  * A sub-query in
2b3b0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2b3c0 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a   of a SELECT */.
2b3d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
2b3e0 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  el!=0 );.      a
2b3f0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
2b400 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ab==0 );.      i
2b410 66 28 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65  f( sqlite3WalkSe
2b420 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53  lect(pWalker, pS
2b430 65 6c 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  el) ) return WRC
2b440 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 69 66  _Abort;.      if
2b450 28 20 73 71 6c 69 74 65 33 45 78 70 61 6e 64 53  ( sqlite3ExpandS
2b460 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20  ubquery(pParse, 
2b470 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20  pFrom) ) return 
2b480 57 52 43 5f 41 62 6f 72 74 3b 0a 23 65 6e 64 69  WRC_Abort;.#endi
2b490 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
2b4a0 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72     /* An ordinar
2b4b0 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  y table or view 
2b4c0 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  name in the FROM
2b4d0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
2b4e0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
2b4f0 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  pTab==0 );.     
2b500 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
2b510 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
2b520 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61  ateTableItem(pPa
2b530 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a  rse, 0, pFrom);.
2b540 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
2b550 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
2b560 62 6f 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20  bort;.      if( 
2b570 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e 3d 30  pTab->nTabRef>=0
2b580 78 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20  xffff ){.       
2b590 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2b5a0 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
2b5b0 6e 79 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ny references to
2b5c0 20 5c 22 25 73 5c 22 3a 20 6d 61 78 20 36 35 35   \"%s\": max 655
2b5d0 33 35 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  35",.           
2b5e0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
2b5f0 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61        pFrom->pTa
2b600 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  b = 0;.        r
2b610 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
2b620 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2b630 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a  Tab->nTabRef++;.
2b640 20 20 20 20 20 20 69 66 28 20 21 49 73 56 69 72        if( !IsVir
2b650 74 75 61 6c 28 70 54 61 62 29 20 26 26 20 63 61  tual(pTab) && ca
2b660 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 70  nnotBeFunction(p
2b670 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b  Parse, pFrom) ){
2b680 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2b690 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
2b6a0 20 7d 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28   }.#if !defined(
2b6b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
2b6c0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53  ) || !defined (S
2b6d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2b6e0 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69  ALTABLE).      i
2b6f0 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
2b700 62 29 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c  b) || pTab->pSel
2b710 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ect ){.        i
2b720 31 36 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20  16 nCol;.       
2b730 20 75 38 20 65 43 6f 64 65 4f 72 69 67 20 3d 20   u8 eCodeOrig = 
2b740 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3b 0a  pWalker->eCode;.
2b750 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
2b760 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
2b770 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
2b780 61 62 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  ab) ) return WRC
2b790 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20  _Abort;.        
2b7a0 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
2b7b0 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20  Select==0 );.   
2b7c0 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c       pFrom->pSel
2b7d0 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
2b7e0 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62 2d  ectDup(db, pTab-
2b7f0 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  >pSelect, 0);.  
2b800 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70 54 61        nCol = pTa
2b810 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20  b->nCol;.       
2b820 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 2d 31   pTab->nCol = -1
2b830 3b 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65  ;.        pWalke
2b840 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 20 20 2f  r->eCode = 1;  /
2b850 2a 20 54 75 72 6e 20 6f 6e 20 53 65 6c 65 63 74  * Turn on Select
2b860 2e 73 65 6c 49 64 20 72 65 6e 75 6d 62 65 72 69  .selId renumberi
2b870 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  ng */.        sq
2b880 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
2b890 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e  pWalker, pFrom->
2b8a0 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
2b8b0 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
2b8c0 20 3d 20 65 43 6f 64 65 4f 72 69 67 3b 0a 20 20   = eCodeOrig;.  
2b8d0 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c        pTab->nCol
2b8e0 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 7d   = nCol;.      }
2b8f0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
2b900 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65     /* Locate the
2b910 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20   index named by 
2b920 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 63  the INDEXED BY c
2b930 6c 61 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a  lause, if any. *
2b940 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
2b950 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70  3IndexedByLookup
2b960 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20  (pParse, pFrom) 
2b970 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2b980 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d  WRC_Abort;.    }
2b990 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65  .  }..  /* Proce
2b9a0 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  ss NATURAL keywo
2b9b0 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20  rds, and ON and 
2b9c0 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
2b9d0 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69   joins..  */.  i
2b9e0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
2b9f0 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f  led || sqlitePro
2ba00 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c  cessJoin(pParse,
2ba10 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   p) ){.    retur
2ba20 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
2ba30 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79  ..  /* For every
2ba40 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73   "*" that occurs
2ba50 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
2ba60 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20  ist, insert the 
2ba70 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c  names of.  ** al
2ba80 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c  l columns in all
2ba90 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f   tables.  And fo
2baa0 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20  r every TABLE.* 
2bab0 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
2bac0 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c  .  ** of all col
2bad0 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20  umns in TABLE.  
2bae0 54 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72  The parser inser
2baf0 74 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78  ted a special ex
2bb00 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69  pression.  ** wi
2bb10 74 68 20 74 68 65 20 54 4b 5f 41 53 54 45 52 49  th the TK_ASTERI
2bb20 53 4b 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20  SK operator for 
2bb30 65 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74  each "*" that it
2bb40 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f   found in the co
2bb50 6c 75 6d 6e 0a 20 20 2a 2a 20 6c 69 73 74 2e 20  lumn.  ** list. 
2bb60 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
2bb70 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20  ode just has to 
2bb80 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41 53  locate the TK_AS
2bb90 54 45 52 49 53 4b 0a 20 20 2a 2a 20 65 78 70 72  TERISK.  ** expr
2bba0 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61  essions and expa
2bbb0 6e 64 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74  nd each one to t
2bbc0 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63  he list of all c
2bbd0 6f 6c 75 6d 6e 73 20 69 6e 0a 20 20 2a 2a 20 61  olumns in.  ** a
2bbe0 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  ll tables..  **.
2bbf0 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c    ** The first l
2bc00 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20  oop just checks 
2bc10 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
2bc20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72  are any "*" oper
2bc30 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20  ators.  ** that 
2bc40 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a  need expanding..
2bc50 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20    */.  for(k=0; 
2bc60 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
2bc70 20 6b 2b 2b 29 7b 0a 20 20 20 20 70 45 20 3d 20   k++){.    pE = 
2bc80 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78  pEList->a[k].pEx
2bc90 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e  pr;.    if( pE->
2bca0 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20  op==TK_ASTERISK 
2bcb0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73  ) break;.    ass
2bcc0 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f  ert( pE->op!=TK_
2bcd0 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68  DOT || pE->pRigh
2bce0 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t!=0 );.    asse
2bcf0 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  rt( pE->op!=TK_D
2bd00 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74  OT || (pE->pLeft
2bd10 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c 65 66 74  !=0 && pE->pLeft
2bd20 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a  ->op==TK_ID) );.
2bd30 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
2bd40 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52  TK_DOT && pE->pR
2bd50 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54  ight->op==TK_AST
2bd60 45 52 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20  ERISK ) break;. 
2bd70 20 20 20 65 6c 69 73 74 46 6c 61 67 73 20 7c 3d     elistFlags |=
2bd80 20 70 45 2d 3e 66 6c 61 67 73 3b 0a 20 20 7d 0a   pE->flags;.  }.
2bd90 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e    if( k<pEList->
2bda0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a  nExpr ){.    /*.
2bdb0 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74      ** If we get
2bdc0 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74   here it means t
2bdd0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f  he result set co
2bde0 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f  ntains one or mo
2bdf0 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70  re "*".    ** op
2be00 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65  erators that nee
2be10 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64  d to be expanded
2be20 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  .  Loop through 
2be30 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a  each expression.
2be40 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65      ** in the re
2be50 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70  sult set and exp
2be60 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20  and them one by 
2be70 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  one..    */.    
2be80 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
2be90 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74  item *a = pEList
2bea0 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  ->a;.    ExprLis
2beb0 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20  t *pNew = 0;.   
2bec0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 50 61   int flags = pPa
2bed0 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a  rse->db->flags;.
2bee0 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65      int longName
2bef0 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c  s = (flags & SQL
2bf00 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73  ITE_FullColNames
2bf10 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
2bf20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 66             && (f
2bf30 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68  lags & SQLITE_Sh
2bf40 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b  ortColNames)==0;
2bf50 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b  ..    for(k=0; k
2bf60 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
2bf70 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 70 45 20 3d  k++){.      pE =
2bf80 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20   a[k].pExpr;.   
2bf90 20 20 20 65 6c 69 73 74 46 6c 61 67 73 20 7c 3d     elistFlags |=
2bfa0 20 70 45 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20   pE->flags;.    
2bfb0 20 20 70 52 69 67 68 74 20 3d 20 70 45 2d 3e 70    pRight = pE->p
2bfc0 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73  Right;.      ass
2bfd0 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f  ert( pE->op!=TK_
2bfe0 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 21 3d 30  DOT || pRight!=0
2bff0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   );.      if( pE
2c000 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49 53  ->op!=TK_ASTERIS
2c010 4b 0a 20 20 20 20 20 20 20 26 26 20 28 70 45 2d  K.       && (pE-
2c020 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
2c030 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 53  Right->op!=TK_AS
2c040 54 45 52 49 53 4b 29 0a 20 20 20 20 20 20 29 7b  TERISK).      ){
2c050 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
2c060 20 70 61 72 74 69 63 75 6c 61 72 20 65 78 70 72   particular expr
2c070 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  ession does not 
2c080 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
2c090 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ded..        */.
2c0a0 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
2c0b0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
2c0c0 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65  pend(pParse, pNe
2c0d0 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a  w, a[k].pExpr);.
2c0e0 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
2c0f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
2c100 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
2c110 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b  r-1].zName = a[k
2c120 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
2c130 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
2c140 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20  >nExpr-1].zSpan 
2c150 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20  = a[k].zSpan;.  
2c160 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61          a[k].zNa
2c170 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
2c180 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30    a[k].zSpan = 0
2c190 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2c1a0 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d      a[k].pExpr =
2c1b0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
2c1c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
2c1d0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
2c1e0 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45   "*" or a "TABLE
2c1f0 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f  .*" and needs to
2c200 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65   be.        ** e
2c210 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20  xpanded. */.    
2c220 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65      int tableSee
2c230 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53  n = 0;      /* S
2c240 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42  et to 1 when TAB
2c250 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20  LE matches */.  
2c260 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61        char *zTNa
2c270 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  me = 0;       /*
2c280 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66   text of name of
2c290 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20   TABLE */.      
2c2a0 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
2c2b0 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20  _DOT ){.        
2c2c0 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 70 4c    assert( pE->pL
2c2d0 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  eft!=0 );.      
2c2e0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2c2f0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2d  rHasProperty(pE-
2c300 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74 56 61  >pLeft, EP_IntVa
2c310 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
2c320 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70    zTName = pE->p
2c330 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Left->u.zToken;.
2c340 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c350 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
2c360 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
2c370 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
2c380 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
2c390 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a           Table *
2c3a0 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
2c3b0 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 53 65  ab;.          Se
2c3c0 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 46 72  lect *pSub = pFr
2c3d0 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
2c3e0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
2c3f0 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a  bName = pFrom->z
2c400 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20  Alias;.         
2c410 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63   const char *zSc
2c420 68 65 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  hemaName = 0;.  
2c430 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b          int iDb;
2c440 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
2c450 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  TabName==0 ){.  
2c460 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61            zTabNa
2c470 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  me = pTab->zName
2c480 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2c490 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
2c4a0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62  mallocFailed ) b
2c4b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2c4c0 69 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20 28  if( pSub==0 || (
2c4d0 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
2c4e0 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d   SF_NestedFrom)=
2c4f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2c500 20 20 70 53 75 62 20 3d 20 30 3b 0a 20 20 20 20    pSub = 0;.    
2c510 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
2c520 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  me && sqlite3Str
2c530 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61  ICmp(zTName, zTa
2c540 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  bName)!=0 ){.   
2c550 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
2c560 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
2c570 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
2c580 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
2c590 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
2c5a0 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
2c5b0 20 20 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d            zSchem
2c5c0 61 4e 61 6d 65 20 3d 20 69 44 62 3e 3d 30 20 3f  aName = iDb>=0 ?
2c5d0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44   db->aDb[iDb].zD
2c5e0 62 53 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20  bSName : "*";.  
2c5f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c600 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
2c610 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
2c620 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
2c630 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d  r *zName = pTab-
2c640 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  >aCol[j].zName;.
2c650 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
2c660 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20   *zColname;  /* 
2c670 54 68 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c  The computed col
2c680 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  umn name */.    
2c690 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
2c6a0 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c  oFree;   /* Mall
2c6b0 6f 63 65 64 20 73 74 72 69 6e 67 20 74 68 61 74  oced string that
2c6c0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65   needs to be fre
2c6d0 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ed */.          
2c6e0 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65    Token sColname
2c6f0 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63  ;  /* Computed c
2c700 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20  olumn name as a 
2c710 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20  token */..      
2c720 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e        assert( zN
2c730 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ame );.         
2c740 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26     if( zTName &&
2c750 20 70 53 75 62 0a 20 20 20 20 20 20 20 20 20 20   pSub.          
2c760 20 20 20 26 26 20 73 71 6c 69 74 65 33 4d 61 74     && sqlite3Mat
2c770 63 68 53 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d  chSpanName(pSub-
2c780 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53  >pEList->a[j].zS
2c790 70 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20  pan, 0, zTName, 
2c7a0 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  0)==0.          
2c7b0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
2c7c0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2c7d0 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
2c7e0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20          /* If a 
2c7f0 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64  column is marked
2c800 20 61 73 20 27 68 69 64 64 65 6e 27 2c 20 6f 6d   as 'hidden', om
2c810 69 74 20 69 74 20 66 72 6f 6d 20 74 68 65 20 65  it it from the e
2c820 78 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20 20  xpanded.        
2c830 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65      ** result-se
2c840 74 20 6c 69 73 74 20 75 6e 6c 65 73 73 20 74 68  t list unless th
2c850 65 20 53 45 4c 45 43 54 20 68 61 73 20 74 68 65  e SELECT has the
2c860 20 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64 65   SF_IncludeHidde
2c870 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  n.            **
2c880 20 62 69 74 20 73 65 74 2e 0a 20 20 20 20 20 20   bit set..      
2c890 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2c8a0 20 20 20 20 20 69 66 28 20 28 70 2d 3e 73 65 6c       if( (p->sel
2c8b0 46 6c 61 67 73 20 26 20 53 46 5f 49 6e 63 6c 75  Flags & SF_Inclu
2c8c0 64 65 48 69 64 64 65 6e 29 3d 3d 30 0a 20 20 20  deHidden)==0.   
2c8d0 20 20 20 20 20 20 20 20 20 20 26 26 20 49 73 48            && IsH
2c8e0 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61  iddenColumn(&pTa
2c8f0 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 0a 20 20 20  b->aCol[j]) .   
2c900 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
2c910 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
2c920 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
2c930 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 61  }.            ta
2c940 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 0a 20 20  bleSeen = 1;..  
2c950 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
2c960 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29  0 && zTName==0 )
2c970 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2c980 69 66 28 20 28 70 46 72 6f 6d 2d 3e 66 67 2e 6a  if( (pFrom->fg.j
2c990 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54  ointype & JT_NAT
2c9a0 55 52 41 4c 29 21 3d 30 0a 20 20 20 20 20 20 20  URAL)!=0.       
2c9b0 20 20 20 20 20 20 20 20 20 26 26 20 74 61 62 6c           && tabl
2c9c0 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
2c9d0 70 54 61 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61  pTabList, i, zNa
2c9e0 6d 65 2c 20 30 2c 20 30 29 0a 20 20 20 20 20 20  me, 0, 0).      
2c9f0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2ca00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2ca10 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c   a NATURAL join,
2ca20 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63   omit the join c
2ca30 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20  olumns from the 
2ca40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ca50 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20 74 68 65   ** table to the
2ca60 20 72 69 67 68 74 20 6f 66 20 74 68 65 20 6a 6f   right of the jo
2ca70 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  in */.          
2ca80 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
2ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2caa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2cab0 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  ( sqlite3IdListI
2cac0 6e 64 65 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69  ndex(pFrom->pUsi
2cad0 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b  ng, zName)>=0 ){
2cae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2caf0 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69   /* In a join wi
2cb00 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73  th a USING claus
2cb10 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20  e, omit columns 
2cb20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
2cb30 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20         ** using 
2cb40 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20  clause from the 
2cb50 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67  table on the rig
2cb60 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ht. */.         
2cb70 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2cb80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2cb90 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2cba0 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68             pRigh
2cbb0 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
2cbc0 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65  db, TK_ID, zName
2cbd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  );.            z
2cbe0 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  Colname = zName;
2cbf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f  .            zTo
2cc00 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Free = 0;.      
2cc10 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61        if( longNa
2cc20 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d  mes || pTabList-
2cc30 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20  >nSrc>1 ){.     
2cc40 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
2cc50 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Left;.          
2cc60 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69      pLeft = sqli
2cc70 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
2cc80 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20  D, zTabName);.  
2cc90 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
2cca0 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
2ccb0 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
2ccc0 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b   pLeft, pRight);
2ccd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2cce0 66 28 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 29  f( zSchemaName )
2ccf0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2cd00 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65    pLeft = sqlite
2cd10 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c  3Expr(db, TK_ID,
2cd20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 29 3b 0a 20   zSchemaName);. 
2cd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2cd40 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
2cd50 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44  xpr(pParse, TK_D
2cd60 4f 54 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72  OT, pLeft, pExpr
2cd70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2cd80 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
2cd90 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29   if( longNames )
2cda0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2cdb0 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c    zColname = sql
2cdc0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
2cdd0 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d  "%s.%s", zTabNam
2cde0 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e, zName);.     
2cdf0 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72             zToFr
2ce00 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20  ee = zColname;. 
2ce10 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2ce20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
2ce30 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2ce40 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a  pExpr = pRight;.
2ce50 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2ce60 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d            pNew =
2ce70 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2ce80 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
2ce90 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  New, pExpr);.   
2cea0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2ceb0 54 6f 6b 65 6e 49 6e 69 74 28 26 73 43 6f 6c 6e  TokenInit(&sColn
2cec0 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a  ame, zColname);.
2ced0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2cee0 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61  te3ExprListSetNa
2cef0 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c  me(pParse, pNew,
2cf00 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a   &sColname, 0);.
2cf10 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2cf20 70 4e 65 77 20 26 26 20 28 70 2d 3e 73 65 6c 46  pNew && (p->selF
2cf30 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64  lags & SF_Nested
2cf40 46 72 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20  From)!=0 ){.    
2cf50 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
2cf60 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
2cf70 70 58 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e  pX = &pNew->a[pN
2cf80 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  ew->nExpr-1];.  
2cf90 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2cfa0 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pSub ){.        
2cfb0 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61          pX->zSpa
2cfc0 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  n = sqlite3DbStr
2cfd0 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 45  Dup(db, pSub->pE
2cfe0 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e  List->a[j].zSpan
2cff0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2d000 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d     testcase( pX-
2d010 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20  >zSpan==0 );.   
2d020 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
2d030 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2d040 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71    pX->zSpan = sq
2d050 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
2d060 20 22 25 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20   "%s.%s.%s",.   
2d070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d090 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e          zSchemaN
2d0a0 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a  ame, zTabName, z
2d0b0 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  Colname);.      
2d0c0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2d0d0 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30  se( pX->zSpan==0
2d0e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
2d0f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2d100 20 20 70 58 2d 3e 62 53 70 61 6e 49 73 54 61 62    pX->bSpanIsTab
2d110 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2d120 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2d130 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2d140 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20  , zToFree);.    
2d150 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d160 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 74  }.        if( !t
2d170 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20  ableSeen ){.    
2d180 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
2d190 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d1a0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2d1b0 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
2d1c0 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e   table: %s", zTN
2d1d0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
2d1e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2d1f0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2d200 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74  sg(pParse, "no t
2d210 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22  ables specified"
2d220 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2d230 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2d240 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2d250 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
2d260 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  (db, pEList);.  
2d270 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e    p->pEList = pN
2d280 65 77 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ew;.  }.  if( p-
2d290 3e 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 69  >pEList ){.    i
2d2a0 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  f( p->pEList->nE
2d2b0 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  xpr>db->aLimit[S
2d2c0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
2d2d0 4d 4e 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  MN] ){.      sql
2d2e0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2d2f0 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63  rse, "too many c
2d300 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74  olumns in result
2d310 20 73 65 74 22 29 3b 0a 20 20 20 20 20 20 72 65   set");.      re
2d320 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
2d330 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 65      }.    if( (e
2d340 6c 69 73 74 46 6c 61 67 73 20 26 20 28 45 50 5f  listFlags & (EP_
2d350 48 61 73 46 75 6e 63 7c 45 50 5f 53 75 62 71 75  HasFunc|EP_Subqu
2d360 65 72 79 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ery))!=0 ){.    
2d370 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
2d380 20 53 46 5f 43 6f 6d 70 6c 65 78 52 65 73 75 6c   SF_ComplexResul
2d390 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  t;.    }.  }.  r
2d3a0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
2d3b0 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d  ue;.}../*.** No-
2d3c0 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74  op routine for t
2d3d0 68 65 20 70 61 72 73 65 2d 74 72 65 65 20 77 61  he parse-tree wa
2d3e0 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  lker..**.** When
2d3f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
2d400 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45 78 70   the Walker.xExp
2d410 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65  rCallback then e
2d420 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 0a  xpression trees.
2d430 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20 77 69  ** are walked wi
2d440 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69 6f 6e  thout any action
2d450 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20 61 74  s being taken at
2d460 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50 72 65   each node.  Pre
2d470 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e  sumably,.** when
2d480 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
2d490 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b 65 72   used for Walker
2d4a0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74  .xExprCallback t
2d4b0 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78  hen .** Walker.x
2d4c0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 69  SelectCallback i
2d4d0 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65  s set to do some
2d4e0 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66 6f 72  thing useful for
2d4f0 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62 71 75   every .** subqu
2d500 65 72 79 20 69 6e 20 74 68 65 20 70 61 72 73 65  ery in the parse
2d510 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73  r tree..*/.int s
2d520 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f  qlite3ExprWalkNo
2d530 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73  op(Walker *NotUs
2d540 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73 65  ed, Expr *NotUse
2d550 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
2d560 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
2d570 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72  , NotUsed2);.  r
2d580 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
2d590 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d  ue;.}../*.** No-
2d5a0 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74  op routine for t
2d5b0 68 65 20 70 61 72 73 65 2d 74 72 65 65 20 77 61  he parse-tree wa
2d5c0 6c 6b 65 72 20 66 6f 72 20 53 45 4c 45 43 54 20  lker for SELECT 
2d5d0 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 20 73  statements..** s
2d5e0 75 62 71 75 65 72 79 20 69 6e 20 74 68 65 20 70  ubquery in the p
2d5f0 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69  arser tree..*/.i
2d600 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
2d610 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20  WalkNoop(Walker 
2d620 2a 4e 6f 74 55 73 65 64 2c 20 53 65 6c 65 63 74  *NotUsed, Select
2d630 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55   *NotUsed2){.  U
2d640 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
2d650 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
2d660 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52  d2);.  return WR
2d670 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 23  C_Continue;.}..#
2d680 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  if SQLITE_DEBUG.
2d690 2f 2a 0a 2a 2a 20 41 6c 77 61 79 73 20 61 73 73  /*.** Always ass
2d6a0 65 72 74 2e 20 20 54 68 69 73 20 78 53 65 6c 65  ert.  This xSele
2d6b0 63 74 43 61 6c 6c 62 61 63 6b 32 20 69 6d 70 6c  ctCallback2 impl
2d6c0 65 6d 65 6e 74 61 74 69 6f 6e 20 70 72 6f 76 65  ementation prove
2d6d0 73 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 78 53  s that the.** xS
2d6e0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 69  electCallback2 i
2d6f0 73 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 64 2e  s never invoked.
2d700 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2d710 53 65 6c 65 63 74 57 61 6c 6b 41 73 73 65 72 74  SelectWalkAssert
2d720 32 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65  2(Walker *NotUse
2d730 64 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73  d, Select *NotUs
2d740 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2){.  UNUSED_P
2d750 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
2d760 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  d, NotUsed2);.  
2d770 61 73 73 65 72 74 28 20 30 20 29 3b 0a 7d 0a 23  assert( 0 );.}.#
2d780 65 6e 64 69 66 0a 2f 2a 0a 2a 2a 20 54 68 69 73  endif./*.** This
2d790 20 72 6f 75 74 69 6e 65 20 22 65 78 70 61 6e 64   routine "expand
2d7a0 73 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  s" a SELECT stat
2d7b0 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66  ement and all of
2d7c0 20 69 74 73 20 73 75 62 71 75 65 72 69 65 73 2e   its subqueries.
2d7d0 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74 69 6f 6e  .** For addition
2d7e0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  al information o
2d7f0 6e 20 77 68 61 74 20 69 74 20 6d 65 61 6e 73 20  n what it means 
2d800 74 6f 20 22 65 78 70 61 6e 64 22 20 61 20 53 45  to "expand" a SE
2d810 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  LECT.** statemen
2d820 74 2c 20 73 65 65 20 74 68 65 20 63 6f 6d 6d 65  t, see the comme
2d830 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c 65 63 74  nt on the select
2d840 45 78 70 61 6e 64 20 77 6f 72 6b 65 72 20 63 61  Expand worker ca
2d850 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a  llback above..**
2d860 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20 61 20  .** Expanding a 
2d870 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2d880 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73 74   is the first st
2d890 65 70 20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67  ep in processing
2d8a0 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61   a.** SELECT sta
2d8b0 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 53 45 4c  tement.  The SEL
2d8c0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d 75  ECT statement mu
2d8d0 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20 62  st be expanded b
2d8e0 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65  efore.** name re
2d8f0 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65 72 66  solution is perf
2d900 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormed..**.** If 
2d910 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
2d920 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65  ong, an error me
2d930 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65 6e  ssage is written
2d940 20 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a   into pParse..**
2d950 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
2d960 63 74 69 6f 6e 20 63 61 6e 20 64 65 74 65 63 74  ction can detect
2d970 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 62 79 20   the problem by 
2d980 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61 72 73  looking at pPars
2d990 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f  e->nErr.** and/o
2d9a0 72 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  r pParse->db->ma
2d9b0 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73  llocFailed..*/.s
2d9c0 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
2d9d0 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 50  e3SelectExpand(P
2d9e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
2d9f0 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
2da00 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e    Walker w;.  w.
2da10 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
2da20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e  sqlite3ExprWalkN
2da30 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  oop;.  w.pParse 
2da40 3d 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20  = pParse;.  if( 
2da50 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f 54 52 55  OK_IF_ALWAYS_TRU
2da60 45 28 70 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d  E(pParse->hasCom
2da70 70 6f 75 6e 64 29 20 29 7b 0a 20 20 20 20 77 2e  pound) ){.    w.
2da80 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
2da90 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e  = convertCompoun
2daa0 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72  dSelectToSubquer
2dab0 79 3b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74  y;.    w.xSelect
2dac0 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20  Callback2 = 0;. 
2dad0 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
2dae0 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74  lect(&w, pSelect
2daf0 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53 65 6c 65  );.  }.  w.xSele
2db00 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c  ctCallback = sel
2db10 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20 20 77  ectExpander;.  w
2db20 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2db30 32 20 3d 20 73 65 6c 65 63 74 50 6f 70 57 69 74  2 = selectPopWit
2db40 68 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 30  h;.  w.eCode = 0
2db50 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53  ;.  sqlite3WalkS
2db60 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63  elect(&w, pSelec
2db70 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20  t);.}...#ifndef 
2db80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
2db90 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  UERY./*.** This 
2dba0 69 73 20 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c  is a Walker.xSel
2dbb0 65 63 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c  ectCallback call
2dbc0 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71 6c  back for the sql
2dbd0 69 74 65 33 53 65 6c 65 63 74 54 79 70 65 49 6e  ite3SelectTypeIn
2dbe0 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63  fo().** interfac
2dbf0 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63  e..**.** For eac
2dc00 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  h FROM-clause su
2dc10 62 71 75 65 72 79 2c 20 61 64 64 20 43 6f 6c 75  bquery, add Colu
2dc20 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c  mn.zType and Col
2dc30 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66  umn.zColl.** inf
2dc40 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65 20  ormation to the 
2dc50 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
2dc60 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20  that represents 
2dc70 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a 2a  the result set.*
2dc80 2a 20 6f 66 20 74 68 61 74 20 73 75 62 71 75 65  * of that subque
2dc90 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61  ry..**.** The Ta
2dca0 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
2dcb0 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68  at represents th
2dcc0 65 20 72 65 73 75 6c 74 20 73 65 74 20 77 61 73  e result set was
2dcd0 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20   constructed.** 
2dce0 62 79 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65  by selectExpande
2dcf0 72 28 29 20 62 75 74 20 74 68 65 20 74 79 70 65  r() but the type
2dd00 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69   and collation i
2dd10 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f  nformation was o
2dd20 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20 74 68 61  mitted.** at tha
2dd30 74 20 70 6f 69 6e 74 20 62 65 63 61 75 73 65 20  t point because 
2dd40 69 64 65 6e 74 69 66 69 65 72 73 20 68 61 64 20  identifiers had 
2dd50 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 72 65 73  not yet been res
2dd60 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20  olved.  This.** 
2dd70 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2dd80 64 20 61 66 74 65 72 20 69 64 65 6e 74 69 66 69  d after identifi
2dd90 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a  er resolution..*
2dda0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
2ddb0 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54  lectAddSubqueryT
2ddc0 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a  ypeInfo(Walker *
2ddd0 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
2dde0 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
2ddf0 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  arse;.  int i;. 
2de00 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
2de10 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  st;.  struct Src
2de20 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
2de30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
2de40 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
2de50 73 6f 6c 76 65 64 20 29 3b 0a 20 20 69 66 28 20  solved );.  if( 
2de60 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
2de70 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72  _HasTypeInfo ) r
2de80 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 73 65 6c 46  eturn;.  p->selF
2de90 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79  lags |= SF_HasTy
2dea0 70 65 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65  peInfo;.  pParse
2deb0 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
2dec0 73 65 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d  se;.  pTabList =
2ded0 20 70 2d 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28   p->pSrc;.  for(
2dee0 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
2def0 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
2df00 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
2df10 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62  From++){.    Tab
2df20 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
2df30 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65  ->pTab;.    asse
2df40 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
2df50 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61     if( (pTab->ta
2df60 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65  bFlags & TF_Ephe
2df70 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20  meral)!=0 ){.   
2df80 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
2df90 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
2dfa0 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
2dfb0 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74   */.      Select
2dfc0 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e   *pSel = pFrom->
2dfd0 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 69  pSelect;.      i
2dfe0 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 20  f( pSel ){.     
2dff0 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e     while( pSel->
2e000 70 50 72 69 6f 72 20 29 20 70 53 65 6c 20 3d 20  pPrior ) pSel = 
2e010 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  pSel->pPrior;.  
2e020 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
2e030 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
2e040 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61  AndCollation(pPa
2e050 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 2c  rse, pTab, pSel,
2e060 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e090 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29  SQLITE_AFF_NONE)
2e0a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2e0b0 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
2e0c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2e0d0 65 20 61 64 64 73 20 64 61 74 61 74 79 70 65 20  e adds datatype 
2e0e0 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  and collating se
2e0f0 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69  quence informati
2e100 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62  on to.** the Tab
2e110 6c 65 20 73 74 72 75 63 74 75 72 65 73 20 6f 66  le structures of
2e120 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65   all FROM-clause
2e130 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 61   subqueries in a
2e140 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
2e150 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20  ment..**.** Use 
2e160 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 66 74  this routine aft
2e170 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  er name resoluti
2e180 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
2e190 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
2e1a0 41 64 64 54 79 70 65 49 6e 66 6f 28 50 61 72 73  AddTypeInfo(Pars
2e1b0 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
2e1c0 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69 66  t *pSelect){.#if
2e1d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2e1e0 5f 53 55 42 51 55 45 52 59 0a 20 20 57 61 6c 6b  _SUBQUERY.  Walk
2e1f0 65 72 20 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63  er w;.  w.xSelec
2e200 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69  tCallback = sqli
2e210 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f  te3SelectWalkNoo
2e220 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  p;.  w.xSelectCa
2e230 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74  llback2 = select
2e240 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49  AddSubqueryTypeI
2e250 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  nfo;.  w.xExprCa
2e260 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  llback = sqlite3
2e270 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  ExprWalkNoop;.  
2e280 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  w.pParse = pPars
2e290 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  e;.  sqlite3Walk
2e2a0 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65  Select(&w, pSele
2e2b0 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a  ct);.#endif.}...
2e2c0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2e2d0 6e 65 20 73 65 74 73 20 75 70 20 61 20 53 45 4c  ne sets up a SEL
2e2e0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f  ECT statement fo
2e2f0 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54  r processing.  T
2e300 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  he.** following 
2e310 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a  is accomplished:
2e320 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44  .**.**     *  VD
2e330 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE Cursor number
2e340 73 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  s are assigned t
2e350 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  o all FROM-claus
2e360 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20  e terms..**     
2e370 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54 61 62  *  Ephemeral Tab
2e380 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63  le objects are c
2e390 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 46  reated for all F
2e3a0 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
2e3b0 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20  eries..**     * 
2e3c0 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
2e3d0 61 75 73 65 73 20 61 72 65 20 73 68 69 66 74 65  auses are shifte
2e3e0 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73 74 61  d into WHERE sta
2e3f0 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a  tements.**     *
2e400 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a 22 20    Wildcards "*" 
2e410 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e  and "TABLE.*" in
2e420 20 72 65 73 75 6c 74 20 73 65 74 73 20 61 72 65   result sets are
2e430 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20   expanded..**   
2e440 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65 72 73    *  Identifiers
2e450 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61   in expression a
2e460 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20 74 61  re matched to ta
2e470 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  bles..**.** This
2e480 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 72 65   routine acts re
2e490 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c  cursively on all
2e4a0 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68   subqueries with
2e4b0 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a  in the SELECT..*
2e4c0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
2e4d0 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61 72 73  lectPrep(.  Pars
2e4e0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
2e4f0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
2e500 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
2e510 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
2e520 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
2e530 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
2e540 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e  ng coded. */.  N
2e550 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74  ameContext *pOut
2e560 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  erNC  /* Name co
2e570 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74 61 69  ntext for contai
2e580 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  ner */.){.  asse
2e590 72 74 28 20 70 21 3d 30 20 7c 7c 20 70 50 61 72  rt( p!=0 || pPar
2e5a0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
2e5b0 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 50  iled );.  if( pP
2e5c0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
2e5d0 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
2e5e0 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
2e5f0 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49  gs & SF_HasTypeI
2e600 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  nfo ) return;.  
2e610 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
2e620 61 6e 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  and(pParse, p);.
2e630 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
2e640 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  rr || pParse->db
2e650 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2e660 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
2e670 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e  e3ResolveSelectN
2e680 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ames(pParse, p, 
2e690 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69 66 28  pOuterNC);.  if(
2e6a0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
2e6b0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
2e6c0 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
2e6d0 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  rn;.  sqlite3Sel
2e6e0 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 70  ectAddTypeInfo(p
2e6f0 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  Parse, p);.}../*
2e700 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61 67  .** Reset the ag
2e710 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
2e720 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  tor..**.** The a
2e730 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
2e740 61 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66  ator is a set of
2e750 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68   memory cells th
2e760 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72  at hold.** inter
2e770 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 20  mediate results 
2e780 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e  while calculatin
2e790 67 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20  g an aggregate. 
2e7a0 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
2e7b0 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
2e7c0 74 68 61 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c  that stores NULL
2e7d0 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73  s in all of thos
2e7e0 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c  e memory.** cell
2e7f0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
2e800 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74  d resetAccumulat
2e810 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
2e820 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
2e830 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
2e840 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
2e850 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
2e860 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
2e870 2a 70 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52  *pFunc;.  int nR
2e880 65 67 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e  eg = pAggInfo->n
2e890 46 75 6e 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d  Func + pAggInfo-
2e8a0 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20  >nColumn;.  if( 
2e8b0 6e 52 65 67 3d 3d 30 20 29 20 72 65 74 75 72 6e  nReg==0 ) return
2e8c0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
2e8d0 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66  DEBUG.  /* Verif
2e8e0 79 20 74 68 61 74 20 61 6c 6c 20 41 67 67 49 6e  y that all AggIn
2e8f0 66 6f 20 72 65 67 69 73 74 65 72 73 20 61 72 65  fo registers are
2e900 20 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67   within the rang
2e910 65 20 73 70 65 63 69 66 69 65 64 20 62 79 0a 20  e specified by. 
2e920 20 2a 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65   ** AggInfo.mnRe
2e930 67 2e 2e 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67  g..AggInfo.mxReg
2e940 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 52   */.  assert( nR
2e950 65 67 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78  eg==pAggInfo->mx
2e960 52 65 67 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e  Reg-pAggInfo->mn
2e970 52 65 67 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69  Reg+1 );.  for(i
2e980 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
2e990 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
2e9a0 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49     assert( pAggI
2e9b0 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65  nfo->aCol[i].iMe
2e9c0 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52  m>=pAggInfo->mnR
2e9d0 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  eg.         && p
2e9e0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d  AggInfo->aCol[i]
2e9f0 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d  .iMem<=pAggInfo-
2ea00 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20  >mxReg );.  }.  
2ea10 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
2ea20 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29  nfo->nFunc; i++)
2ea30 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 41  {.    assert( pA
2ea40 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d  ggInfo->aFunc[i]
2ea50 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d  .iMem>=pAggInfo-
2ea60 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20  >mnReg.         
2ea70 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  && pAggInfo->aFu
2ea80 6e 63 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67  nc[i].iMem<=pAgg
2ea90 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20  Info->mxReg );. 
2eaa0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
2eab0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2eac0 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67   OP_Null, 0, pAg
2ead0 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41  gInfo->mnReg, pA
2eae0 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a  ggInfo->mxReg);.
2eaf0 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67    for(pFunc=pAgg
2eb00 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30  Info->aFunc, i=0
2eb10 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
2eb20 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b  unc; i++, pFunc+
2eb30 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 75 6e  +){.    if( pFun
2eb40 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20  c->iDistinct>=0 
2eb50 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
2eb60 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72  E = pFunc->pExpr
2eb70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2eb80 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2eb90 28 70 45 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  (pE, EP_xIsSelec
2eba0 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t) );.      if( 
2ebb0 70 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c  pE->x.pList==0 |
2ebc0 7c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  | pE->x.pList->n
2ebd0 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20  Expr!=1 ){.     
2ebe0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2ebf0 73 67 28 70 50 61 72 73 65 2c 20 22 44 49 53 54  sg(pParse, "DIST
2ec00 49 4e 43 54 20 61 67 67 72 65 67 61 74 65 73 20  INCT aggregates 
2ec10 6d 75 73 74 20 68 61 76 65 20 65 78 61 63 74 6c  must have exactl
2ec20 79 20 6f 6e 65 20 22 0a 20 20 20 20 20 20 20 20  y one ".        
2ec30 20 20 20 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a     "argument");.
2ec40 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69          pFunc->i
2ec50 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20  Distinct = -1;. 
2ec60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2ec70 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
2ec80 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
2ec90 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
2eca0 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 78  st(pParse, pE->x
2ecb0 2e 70 4c 69 73 74 2c 30 2c 30 29 3b 0a 20 20 20  .pList,0,0);.   
2ecc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ecd0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
2ece0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e  nEphemeral, pFun
2ecf0 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c  c->iDistinct, 0,
2ed00 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
2ed10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
2ed20 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
2ed30 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
2ed40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
2ed50 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
2ed60 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65  e OP_AggFinalize
2ed70 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72   opcode for ever
2ed80 79 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  y aggregate func
2ed90 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41  tion.** in the A
2eda0 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ggInfo structure
2edb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2edc0 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
2edd0 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61  tions(Parse *pPa
2ede0 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
2edf0 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
2ee00 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
2ee10 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  be;.  int i;.  s
2ee20 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
2ee30 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d  nc *pF;.  for(i=
2ee40 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pF=pAggInfo->
2ee50 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66  aFunc; i<pAggInf
2ee60 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
2ee70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  F++){.    ExprLi
2ee80 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e  st *pList = pF->
2ee90 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
2eea0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2eeb0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d  rHasProperty(pF-
2eec0 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  >pExpr, EP_xIsSe
2eed0 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 73 71 6c  lect) );.    sql
2eee0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2eef0 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70  , OP_AggFinal, p
2ef00 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f  F->iMem, pList ?
2ef10 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
2ef20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
2ef30 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70  dbeAppendP4(v, p
2ef40 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e  F->pFunc, P4_FUN
2ef50 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  CDEF);.  }.}.../
2ef60 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20  *.** Update the 
2ef70 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f  accumulator memo
2ef80 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20  ry cells for an 
2ef90 61 67 67 72 65 67 61 74 65 20 62 61 73 65 64 20  aggregate based 
2efa0 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  on.** the curren
2efb0 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
2efc0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 41  n..**.** If regA
2efd0 63 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61  cc is non-zero a
2efe0 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  nd there are no 
2eff0 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 61  min() or max() a
2f000 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 69 6e 20  ggregates.** in 
2f010 70 41 67 67 49 6e 66 6f 2c 20 74 68 65 6e 20 6f  pAggInfo, then o
2f020 6e 6c 79 20 70 6f 70 75 6c 61 74 65 20 74 68 65  nly populate the
2f030 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75   pAggInfo->nAccu
2f040 6d 75 6c 61 74 6f 72 20 61 63 63 75 6d 75 6c 61  mulator accumula
2f050 74 6f 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 73  tor.** registers
2f060 20 69 66 20 72 65 67 69 73 74 65 72 20 72 65 67   if register reg
2f070 41 63 63 20 63 6f 6e 74 61 69 6e 73 20 30 2e 20  Acc contains 0. 
2f080 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
2f090 74 61 6b 65 20 63 61 72 65 0a 2a 2a 20 6f 66 20  take care.** of 
2f0a0 73 65 74 74 69 6e 67 20 61 6e 64 20 63 6c 65 61  setting and clea
2f0b0 72 69 6e 67 20 72 65 67 41 63 63 2e 0a 2a 2f 0a  ring regAcc..*/.
2f0c0 73 74 61 74 69 63 20 76 6f 69 64 20 75 70 64 61  static void upda
2f0d0 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61  teAccumulator(Pa
2f0e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
2f0f0 20 72 65 67 41 63 63 2c 20 41 67 67 49 6e 66 6f   regAcc, AggInfo
2f100 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
2f110 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
2f120 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
2f130 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20 3d 20  .  int regHit = 
2f140 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48 69 74  0;.  int addrHit
2f150 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74 72 75  Test = 0;.  stru
2f160 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
2f170 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67  *pF;.  struct Ag
2f180 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a  gInfo_col *pC;..
2f190 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65    pAggInfo->dire
2f1a0 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f  ctMode = 1;.  fo
2f1b0 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
2f1c0 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
2f1d0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
2f1e0 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e  +, pF++){.    in
2f1f0 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20  t nArg;.    int 
2f200 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20  addrNext = 0;.  
2f210 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20    int regAgg;.  
2f220 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
2f230 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78  t = pF->pExpr->x
2f240 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65  .pList;.    asse
2f250 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2f260 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20  erty(pF->pExpr, 
2f270 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
2f280 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 49 73  .    assert( !Is
2f290 57 69 6e 64 6f 77 46 75 6e 63 28 70 46 2d 3e 70  WindowFunc(pF->p
2f2a0 45 78 70 72 29 20 29 3b 0a 20 20 20 20 69 66 28  Expr) );.    if(
2f2b0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
2f2c0 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 57  (pF->pExpr, EP_W
2f2d0 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20  inFunc) ){.     
2f2e0 20 45 78 70 72 20 2a 70 46 69 6c 74 65 72 20 3d   Expr *pFilter =
2f2f0 20 70 46 2d 3e 70 45 78 70 72 2d 3e 79 2e 70 57   pF->pExpr->y.pW
2f300 69 6e 2d 3e 70 46 69 6c 74 65 72 3b 0a 20 20 20  in->pFilter;.   
2f310 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71     addrNext = sq
2f320 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
2f330 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
2f340 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
2f350 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 46 69  alse(pParse, pFi
2f360 6c 74 65 72 2c 20 61 64 64 72 4e 65 78 74 2c 20  lter, addrNext, 
2f370 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
2f380 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  L);.    }.    if
2f390 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
2f3a0 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e   nArg = pList->n
2f3b0 45 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41  Expr;.      regA
2f3c0 67 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  gg = sqlite3GetT
2f3d0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
2f3e0 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71   nArg);.      sq
2f3f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
2f400 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c  rList(pParse, pL
2f410 69 73 74 2c 20 72 65 67 41 67 67 2c 20 30 2c 20  ist, regAgg, 0, 
2f420 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29  SQLITE_ECEL_DUP)
2f430 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2f440 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20     nArg = 0;.   
2f450 20 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a 20     regAgg = 0;. 
2f460 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d     }.    if( pF-
2f470 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b  >iDistinct>=0 ){
2f480 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72 4e  .      if( addrN
2f490 65 78 74 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20  ext==0 ){ .     
2f4a0 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71     addrNext = sq
2f4b0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
2f4c0 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
2f4d0 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61    }.      testca
2f4e0 73 65 28 20 6e 41 72 67 3d 3d 30 20 29 3b 20 20  se( nArg==0 );  
2f4f0 2f 2a 20 45 72 72 6f 72 20 63 6f 6e 64 69 74 69  /* Error conditi
2f500 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  on */.      test
2f510 63 61 73 65 28 20 6e 41 72 67 3e 31 20 29 3b 20  case( nArg>1 ); 
2f520 20 20 2f 2a 20 41 6c 73 6f 20 61 6e 20 65 72 72    /* Also an err
2f530 6f 72 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65  or */.      code
2f540 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c  Distinct(pParse,
2f550 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20   pF->iDistinct, 
2f560 61 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67  addrNext, 1, reg
2f570 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Agg);.    }.    
2f580 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66  if( pF->pFunc->f
2f590 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
2f5a0 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20  E_FUNC_NEEDCOLL 
2f5b0 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
2f5c0 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20   *pColl = 0;.   
2f5d0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
2f5e0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
2f5f0 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
2f600 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
2f610 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74  !=0 );  /* pList
2f620 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63  !=0 if pF->pFunc
2f630 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f   has NEEDCOLL */
2f640 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
2f650 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  pItem=pList->a; 
2f660 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67  !pColl && j<nArg
2f670 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
2f680 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
2f690 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2f6a0 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65  Seq(pParse, pIte
2f6b0 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
2f6c0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43   }.      if( !pC
2f6d0 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  oll ){.        p
2f6e0 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
2f6f0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
2f700 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2f710 72 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41 67  regHit==0 && pAg
2f720 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61  gInfo->nAccumula
2f730 74 6f 72 20 29 20 72 65 67 48 69 74 20 3d 20 2b  tor ) regHit = +
2f740 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2f750 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2f760 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp4(v, OP_Col
2f770 6c 53 65 71 2c 20 72 65 67 48 69 74 2c 20 30 2c  lSeq, regHit, 0,
2f780 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c   0, (char *)pCol
2f790 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
2f7a0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2f7b0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2f7c0 50 5f 41 67 67 53 74 65 70 2c 20 30 2c 20 72 65  P_AggStep, 0, re
2f7d0 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 29 3b  gAgg, pF->iMem);
2f7e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2f7f0 41 70 70 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e  AppendP4(v, pF->
2f800 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
2f810 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  F);.    sqlite3V
2f820 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28  dbeChangeP5(v, (
2f830 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71  u8)nArg);.    sq
2f840 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
2f850 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
2f860 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20  gAgg, nArg);.   
2f870 20 69 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b   if( addrNext ){
2f880 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2f890 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
2f8a0 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20  , addrNext);.   
2f8b0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67   }.  }.  if( reg
2f8c0 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e  Hit==0 && pAggIn
2f8d0 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  fo->nAccumulator
2f8e0 20 29 7b 0a 20 20 20 20 72 65 67 48 69 74 20 3d   ){.    regHit =
2f8f0 20 72 65 67 41 63 63 3b 0a 20 20 7d 0a 20 20 69   regAcc;.  }.  i
2f900 66 28 20 72 65 67 48 69 74 20 29 7b 0a 20 20 20  f( regHit ){.   
2f910 20 61 64 64 72 48 69 74 54 65 73 74 20 3d 20 73   addrHitTest = s
2f920 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
2f930 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48 69  (v, OP_If, regHi
2f940 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
2f950 28 76 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  (v);.  }.  for(i
2f960 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d  =0, pC=pAggInfo-
2f970 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66  >aCol; i<pAggInf
2f980 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b  o->nAccumulator;
2f990 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20   i++, pC++){.   
2f9a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
2f9b0 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78  (pParse, pC->pEx
2f9c0 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20  pr, pC->iMem);. 
2f9d0 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64   }.  pAggInfo->d
2f9e0 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20  irectMode = 0;. 
2f9f0 20 69 66 28 20 61 64 64 72 48 69 74 54 65 73 74   if( addrHitTest
2fa00 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
2fa10 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
2fa20 64 64 72 48 69 74 54 65 73 74 29 3b 0a 20 20 7d  ddrHitTest);.  }
2fa30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
2fa40 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69  single OP_Explai
2fa50 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  n instruction to
2fa60 20 74 68 65 20 56 44 42 45 20 74 6f 20 65 78 70   the VDBE to exp
2fa70 6c 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a  lain a simple.**
2fa80 20 63 6f 75 6e 74 28 2a 29 20 71 75 65 72 79 20   count(*) query 
2fa90 28 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  ("SELECT count(*
2faa0 29 20 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a  ) FROM pTab")..*
2fab0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2fac0 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74  _OMIT_EXPLAIN.st
2fad0 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
2fae0 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20  nSimpleCount(.  
2faf0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2fb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb10 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
2fb20 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
2fb30 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
2fb40 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62        /* Table b
2fb50 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a  eing queried */.
2fb60 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
2fb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb80 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20    /* Index used 
2fb90 74 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e  to optimize scan
2fba0 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  , or NULL */.){.
2fbb0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
2fbc0 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
2fbd0 69 6e 74 20 62 43 6f 76 65 72 20 3d 20 28 70 49  int bCover = (pI
2fbe0 64 78 21 3d 30 20 26 26 20 28 48 61 73 52 6f 77  dx!=0 && (HasRow
2fbf0 69 64 28 70 54 61 62 29 20 7c 7c 20 21 49 73 50  id(pTab) || !IsP
2fc00 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
2fc10 49 64 78 29 29 29 3b 0a 20 20 20 20 73 71 6c 69  Idx)));.    sqli
2fc20 74 65 33 56 64 62 65 45 78 70 6c 61 69 6e 28 70  te3VdbeExplain(p
2fc30 50 61 72 73 65 2c 20 30 2c 20 22 53 43 41 4e 20  Parse, 0, "SCAN 
2fc40 54 41 42 4c 45 20 25 73 25 73 25 73 22 2c 0a 20  TABLE %s%s%s",. 
2fc50 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
2fc60 6d 65 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76  me,.        bCov
2fc70 65 72 20 3f 20 22 20 55 53 49 4e 47 20 43 4f 56  er ? " USING COV
2fc80 45 52 49 4e 47 20 49 4e 44 45 58 20 22 20 3a 20  ERING INDEX " : 
2fc90 22 22 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76  "",.        bCov
2fca0 65 72 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  er ? pIdx->zName
2fcb0 20 3a 20 22 22 0a 20 20 20 20 29 3b 0a 20 20 7d   : "".    );.  }
2fcc0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
2fcd0 65 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43  e explainSimpleC
2fce0 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64  ount(a,b,c).#end
2fcf0 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65  if../*.** sqlite
2fd00 33 57 61 6c 6b 45 78 70 72 28 29 20 63 61 6c 6c  3WalkExpr() call
2fd10 62 61 63 6b 20 75 73 65 64 20 62 79 20 68 61 76  back used by hav
2fd20 69 6e 67 54 6f 57 68 65 72 65 28 29 2e 0a 2a 2a  ingToWhere()..**
2fd30 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 64 65 20  .** If the node 
2fd40 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 63 61  passed to the ca
2fd50 6c 6c 62 61 63 6b 20 69 73 20 61 20 54 4b 5f 41  llback is a TK_A
2fd60 4e 44 20 6e 6f 64 65 2c 20 72 65 74 75 72 6e 20  ND node, return 
2fd70 0a 2a 2a 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  .** WRC_Continue
2fd80 20 74 6f 20 74 65 6c 6c 20 73 71 6c 69 74 65 33   to tell sqlite3
2fd90 57 61 6c 6b 45 78 70 72 28 29 20 74 6f 20 69 74  WalkExpr() to it
2fda0 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 63 68  erate through ch
2fdb0 69 6c 64 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a  ild nodes..**.**
2fdc0 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
2fdd0 72 6e 20 57 52 43 5f 50 72 75 6e 65 2e 20 49 6e  rn WRC_Prune. In
2fde0 20 74 68 69 73 20 63 61 73 65 2c 20 61 6c 73 6f   this case, also
2fdf0 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 0a 2a   check if the .*
2fe00 2a 20 73 75 62 2d 65 78 70 72 65 73 73 69 6f 6e  * sub-expression
2fe10 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 72 69   matches the cri
2fe20 74 65 72 69 61 20 66 6f 72 20 62 65 69 6e 67 20  teria for being 
2fe30 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 57 48 45  moved to the WHE
2fe40 52 45 0a 2a 2a 20 63 6c 61 75 73 65 2e 20 49 66  RE.** clause. If
2fe50 20 73 6f 2c 20 61 64 64 20 69 74 20 74 6f 20 74   so, add it to t
2fe60 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2fe70 61 6e 64 20 72 65 70 6c 61 63 65 20 74 68 65 20  and replace the 
2fe80 73 75 62 2d 65 78 70 72 65 73 73 69 6f 6e 0a 2a  sub-expression.*
2fe90 2a 20 77 69 74 68 69 6e 20 74 68 65 20 48 41 56  * within the HAV
2fea0 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20 77  ING expression w
2feb0 69 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20 22  ith a constant "
2fec0 31 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  1"..*/.static in
2fed0 74 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65 45  t havingToWhereE
2fee0 78 70 72 43 62 28 57 61 6c 6b 65 72 20 2a 70 57  xprCb(Walker *pW
2fef0 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
2ff00 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  pr){.  if( pExpr
2ff10 2d 3e 6f 70 21 3d 54 4b 5f 41 4e 44 20 29 7b 0a  ->op!=TK_AND ){.
2ff20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d      Select *pS =
2ff30 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 65 6c   pWalker->u.pSel
2ff40 65 63 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ect;.    if( sql
2ff50 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
2ff60 6e 74 4f 72 47 72 6f 75 70 42 79 28 70 57 61 6c  ntOrGroupBy(pWal
2ff70 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20 70 45 78  ker->pParse, pEx
2ff80 70 72 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42 79  pr, pS->pGroupBy
2ff90 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
2ffa0 65 33 20 2a 64 62 20 3d 20 70 57 61 6c 6b 65 72  e3 *db = pWalker
2ffb0 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  ->pParse->db;.  
2ffc0 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
2ffd0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
2ffe0 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52  c(db, TK_INTEGER
2fff0 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b  , &sqlite3IntTok
30000 65 6e 73 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20  ens[1], 0);.    
30010 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
30020 20 20 20 20 20 20 45 78 70 72 20 2a 70 57 68 65        Expr *pWhe
30030 72 65 20 3d 20 70 53 2d 3e 70 57 68 65 72 65 3b  re = pS->pWhere;
30040 0a 20 20 20 20 20 20 20 20 53 57 41 50 28 45 78  .        SWAP(Ex
30050 70 72 2c 20 2a 70 4e 65 77 2c 20 2a 70 45 78 70  pr, *pNew, *pExp
30060 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  r);.        pNew
30070 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
30080 64 28 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  d(pWalker->pPars
30090 65 2c 20 70 57 68 65 72 65 2c 20 70 4e 65 77 29  e, pWhere, pNew)
300a0 3b 0a 20 20 20 20 20 20 20 20 70 53 2d 3e 70 57  ;.        pS->pW
300b0 68 65 72 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  here = pNew;.   
300c0 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
300d0 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ode = 1;.      }
300e0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
300f0 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
30100 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
30110 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
30120 20 54 72 61 6e 73 66 65 72 20 65 6c 69 67 69 62   Transfer eligib
30130 6c 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68  le terms from th
30140 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  e HAVING clause 
30150 6f 66 20 61 20 71 75 65 72 79 2c 20 77 68 69 63  of a query, whic
30160 68 20 69 73 0a 2a 2a 20 70 72 6f 63 65 73 73 65  h is.** processe
30170 64 20 61 66 74 65 72 20 67 72 6f 75 70 69 6e 67  d after grouping
30180 2c 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  , to the WHERE c
30190 6c 61 75 73 65 2c 20 77 68 69 63 68 20 69 73 20  lause, which is 
301a0 70 72 6f 63 65 73 73 65 64 20 62 65 66 6f 72 65  processed before
301b0 0a 2a 2a 20 67 72 6f 75 70 69 6e 67 2e 20 46 6f  .** grouping. Fo
301c0 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 71  r example, the q
301d0 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45  uery:.**.**   SE
301e0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 3c 74 61 62  LECT * FROM <tab
301f0 6c 65 73 3e 20 57 48 45 52 45 20 61 3d 3f 20 47  les> WHERE a=? G
30200 52 4f 55 50 20 42 59 20 62 20 48 41 56 49 4e 47  ROUP BY b HAVING
30210 20 62 3d 3f 20 41 4e 44 20 63 3d 3f 0a 2a 2a 0a   b=? AND c=?.**.
30220 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69 74  ** can be rewrit
30230 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ten as:.**.**   
30240 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 3c 74  SELECT * FROM <t
30250 61 62 6c 65 73 3e 20 57 48 45 52 45 20 61 3d 3f  ables> WHERE a=?
30260 20 41 4e 44 20 62 3d 3f 20 47 52 4f 55 50 20 42   AND b=? GROUP B
30270 59 20 62 20 48 41 56 49 4e 47 20 63 3d 3f 0a 2a  Y b HAVING c=?.*
30280 2a 0a 2a 2a 20 41 20 74 65 72 6d 20 6f 66 20 74  *.** A term of t
30290 68 65 20 48 41 56 49 4e 47 20 65 78 70 72 65 73  he HAVING expres
302a0 73 69 6f 6e 20 69 73 20 65 6c 69 67 69 62 6c 65  sion is eligible
302b0 20 66 6f 72 20 74 72 61 6e 73 66 65 72 20 69 66   for transfer if
302c0 20 69 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20   it consists.** 
302d0 65 6e 74 69 72 65 6c 79 20 6f 66 20 63 6f 6e 73  entirely of cons
302e0 74 61 6e 74 73 20 61 6e 64 20 65 78 70 72 65 73  tants and expres
302f0 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 61  sions that are a
30300 6c 73 6f 20 47 52 4f 55 50 20 42 59 20 74 65 72  lso GROUP BY ter
30310 6d 73 20 74 68 61 74 0a 2a 2a 20 75 73 65 20 74  ms that.** use t
30320 68 65 20 22 42 49 4e 41 52 59 22 20 63 6f 6c 6c  he "BINARY" coll
30330 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a  ation sequence..
30340 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  */.static void h
30350 61 76 69 6e 67 54 6f 57 68 65 72 65 28 50 61 72  avingToWhere(Par
30360 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
30370 63 74 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72  ct *p){.  Walker
30380 20 73 57 61 6c 6b 65 72 3b 0a 20 20 6d 65 6d 73   sWalker;.  mems
30390 65 74 28 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20  et(&sWalker, 0, 
303a0 73 69 7a 65 6f 66 28 73 57 61 6c 6b 65 72 29 29  sizeof(sWalker))
303b0 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 70 50 61 72  ;.  sWalker.pPar
303c0 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73  se = pParse;.  s
303d0 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c  Walker.xExprCall
303e0 62 61 63 6b 20 3d 20 68 61 76 69 6e 67 54 6f 57  back = havingToW
303f0 68 65 72 65 45 78 70 72 43 62 3b 0a 20 20 73 57  hereExprCb;.  sW
30400 61 6c 6b 65 72 2e 75 2e 70 53 65 6c 65 63 74 20  alker.u.pSelect 
30410 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  = p;.  sqlite3Wa
30420 6c 6b 45 78 70 72 28 26 73 57 61 6c 6b 65 72 2c  lkExpr(&sWalker,
30430 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 23 69   p->pHaving);.#i
30440 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
30450 41 42 4c 45 44 0a 20 20 69 66 28 20 73 57 61 6c  ABLED.  if( sWal
30460 6b 65 72 2e 65 43 6f 64 65 20 26 26 20 28 73 71  ker.eCode && (sq
30470 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
30480 20 26 20 30 78 31 30 30 29 21 3d 30 20 29 7b 0a   & 0x100)!=0 ){.
30490 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
304a0 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28  0x100,pParse,p,(
304b0 22 4d 6f 76 65 20 48 41 56 49 4e 47 20 74 65 72  "Move HAVING ter
304c0 6d 73 20 69 6e 74 6f 20 57 48 45 52 45 3a 5c 6e  ms into WHERE:\n
304d0 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
304e0 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
304f0 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , p, 0);.  }.#en
30500 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  dif.}../*.** Che
30510 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
30520 20 70 54 68 69 73 20 65 6e 74 72 79 20 6f 66 20   pThis entry of 
30530 70 54 61 62 4c 69 73 74 20 69 73 20 61 20 73 65  pTabList is a se
30540 6c 66 2d 6a 6f 69 6e 20 6f 66 20 61 20 70 72 69  lf-join of a pri
30550 6f 72 20 76 69 65 77 2e 0a 2a 2a 20 49 66 20 69  or view..** If i
30560 74 20 69 73 2c 20 74 68 65 6e 20 72 65 74 75 72  t is, then retur
30570 6e 20 74 68 65 20 53 72 63 4c 69 73 74 5f 69 74  n the SrcList_it
30580 65 6d 20 66 6f 72 20 74 68 65 20 70 72 69 6f 72  em for the prior
30590 20 76 69 65 77 2e 20 20 49 66 20 69 74 20 69 73   view.  If it is
305a0 20 6e 6f 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 65   not,.** then re
305b0 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
305c0 63 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74  c struct SrcList
305d0 5f 69 74 65 6d 20 2a 69 73 53 65 6c 66 4a 6f 69  _item *isSelfJoi
305e0 6e 56 69 65 77 28 0a 20 20 53 72 63 4c 69 73 74  nView(.  SrcList
305f0 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20   *pTabList,     
30600 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20        /* Search 
30610 66 6f 72 20 73 65 6c 66 2d 6a 6f 69 6e 73 20 69  for self-joins i
30620 6e 20 74 68 69 73 20 46 52 4f 4d 20 63 6c 61 75  n this FROM clau
30630 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
30640 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 68  rcList_item *pTh
30650 69 73 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66  is   /* Search f
30660 6f 72 20 70 72 69 6f 72 20 72 65 66 65 72 65 6e  or prior referen
30670 63 65 20 74 6f 20 74 68 69 73 20 73 75 62 71 75  ce to this subqu
30680 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ery */.){.  stru
30690 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
306a0 2a 70 49 74 65 6d 3b 0a 20 20 66 6f 72 28 70 49  *pItem;.  for(pI
306b0 74 65 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  tem = pTabList->
306c0 61 3b 20 70 49 74 65 6d 3c 70 54 68 69 73 3b 20  a; pItem<pThis; 
306d0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 53 65  pItem++){.    Se
306e0 6c 65 63 74 20 2a 70 53 31 3b 0a 20 20 20 20 69  lect *pS1;.    i
306f0 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
30700 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  t==0 ) continue;
30710 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
30720 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  fg.viaCoroutine 
30730 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
30740 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  if( pItem->zName
30750 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
30760 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
30770 6d 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  m->pTab!=0 );.  
30780 20 20 61 73 73 65 72 74 28 20 70 54 68 69 73 2d    assert( pThis-
30790 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20  >pTab!=0 );.    
307a0 69 66 28 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  if( pItem->pTab-
307b0 3e 70 53 63 68 65 6d 61 21 3d 70 54 68 69 73 2d  >pSchema!=pThis-
307c0 3e 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  >pTab->pSchema )
307d0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
307e0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
307f0 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c  mp(pItem->zName,
30800 20 70 54 68 69 73 2d 3e 7a 4e 61 6d 65 29 21 3d   pThis->zName)!=
30810 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
30820 20 20 70 53 31 20 3d 20 70 49 74 65 6d 2d 3e 70    pS1 = pItem->p
30830 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 66 28 20  Select;.    if( 
30840 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 70 53 63  pItem->pTab->pSc
30850 68 65 6d 61 3d 3d 30 20 26 26 20 70 54 68 69 73  hema==0 && pThis
30860 2d 3e 70 53 65 6c 65 63 74 2d 3e 73 65 6c 49 64  ->pSelect->selId
30870 21 3d 70 53 31 2d 3e 73 65 6c 49 64 20 29 7b 0a  !=pS1->selId ){.
30880 20 20 20 20 20 20 2f 2a 20 54 68 65 20 71 75 65        /* The que
30890 72 79 20 66 6c 61 74 74 65 6e 65 72 20 6c 65 66  ry flattener lef
308a0 74 20 74 77 6f 20 64 69 66 66 65 72 65 6e 74 20  t two different 
308b0 43 54 45 20 74 61 62 6c 65 73 20 77 69 74 68 20  CTE tables with 
308c0 69 64 65 6e 74 69 63 61 6c 0a 20 20 20 20 20 20  identical.      
308d0 2a 2a 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20  ** names in the 
308e0 73 61 6d 65 20 46 52 4f 4d 20 63 6c 61 75 73 65  same FROM clause
308f0 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69  . */.      conti
30900 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
30910 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
30920 6d 70 61 72 65 28 30 2c 20 70 54 68 69 73 2d 3e  mpare(0, pThis->
30930 70 53 65 6c 65 63 74 2d 3e 70 57 68 65 72 65 2c  pSelect->pWhere,
30940 20 70 53 31 2d 3e 70 57 68 65 72 65 2c 20 2d 31   pS1->pWhere, -1
30950 29 0a 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65  ).     || sqlite
30960 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20  3ExprCompare(0, 
30970 70 54 68 69 73 2d 3e 70 53 65 6c 65 63 74 2d 3e  pThis->pSelect->
30980 70 48 61 76 69 6e 67 2c 20 70 53 31 2d 3e 70 48  pHaving, pS1->pH
30990 61 76 69 6e 67 2c 20 2d 31 29 20 0a 20 20 20 20  aving, -1) .    
309a0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
309b0 76 69 65 77 20 77 61 73 20 6d 6f 64 69 66 69 65  view was modifie
309c0 64 20 62 79 20 73 6f 6d 65 20 6f 74 68 65 72 20  d by some other 
309d0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 73 75 63  optimization suc
309e0 68 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 70 75  h as.      ** pu
309f0 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73  shDownWhereTerms
30a00 28 29 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74  () */.      cont
30a10 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
30a20 72 65 74 75 72 6e 20 70 49 74 65 6d 3b 0a 20 20  return pItem;.  
30a30 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
30a40 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
30a50 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d  OUNTOFVIEW_OPTIM
30a60 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 41 74  IZATION./*.** At
30a70 74 65 6d 70 74 20 74 6f 20 74 72 61 6e 73 66 6f  tempt to transfo
30a80 72 6d 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  rm a query of th
30a90 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20  e form.**.**    
30aa0 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
30ab0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 20 46  FROM (SELECT x F
30ac0 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 41 4c 4c  ROM t1 UNION ALL
30ad0 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74   SELECT y FROM t
30ae0 32 29 0a 2a 2a 0a 2a 2a 20 49 6e 74 6f 20 74 68  2).**.** Into th
30af0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  is:.**.**    SEL
30b00 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 75 6e  ECT (SELECT coun
30b10 74 28 2a 29 20 46 52 4f 4d 20 74 31 29 2b 28 53  t(*) FROM t1)+(S
30b20 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
30b30 52 4f 4d 20 74 32 29 0a 2a 2a 0a 2a 2a 20 54 68  ROM t2).**.** Th
30b40 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  e transformation
30b50 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 61   only works if a
30b60 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
30b70 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
30b80 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20 73 75 62  .**   *  The sub
30b90 71 75 65 72 79 20 69 73 20 61 20 55 4e 49 4f 4e  query is a UNION
30ba0 20 41 4c 4c 20 6f 66 20 74 77 6f 20 6f 72 20 6d   ALL of two or m
30bb0 6f 72 65 20 74 65 72 6d 73 0a 2a 2a 20 20 20 2a  ore terms.**   *
30bc0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
30bd0 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 4c  oes not have a L
30be0 49 4d 49 54 20 63 6c 61 75 73 65 0a 2a 2a 20 20  IMIT clause.**  
30bf0 20 2a 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20   *  There is no 
30c00 57 48 45 52 45 20 6f 72 20 47 52 4f 55 50 20 42  WHERE or GROUP B
30c10 59 20 6f 72 20 48 41 56 49 4e 47 20 63 6c 61 75  Y or HAVING clau
30c20 73 65 73 20 6f 6e 20 74 68 65 20 73 75 62 71 75  ses on the subqu
30c30 65 72 69 65 73 0a 2a 2a 20 20 20 2a 20 20 54 68  eries.**   *  Th
30c40 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
30c50 20 61 20 73 69 6d 70 6c 65 20 63 6f 75 6e 74 28   a simple count(
30c60 2a 29 20 77 69 74 68 20 6e 6f 20 57 48 45 52 45  *) with no WHERE
30c70 20 63 6c 61 75 73 65 20 6f 72 20 6f 74 68 65 72   clause or other
30c80 0a 2a 2a 20 20 20 20 20 20 65 78 74 72 61 6e 65  .**      extrane
30c90 6f 75 73 20 73 79 6e 74 61 78 2e 0a 2a 2a 0a 2a  ous syntax..**.*
30ca0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
30cb0 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
30cc0 6e 20 69 73 20 75 6e 64 65 72 74 61 6b 65 6e 2e  n is undertaken.
30cd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
30ce0 6f 75 6e 74 4f 66 56 69 65 77 4f 70 74 69 6d 69  ountOfViewOptimi
30cf0 7a 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  zation(Parse *pP
30d00 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
30d10 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  {.  Select *pSub
30d20 2c 20 2a 70 50 72 69 6f 72 3b 0a 20 20 45 78 70  , *pPrior;.  Exp
30d30 72 20 2a 70 45 78 70 72 3b 0a 20 20 45 78 70 72  r *pExpr;.  Expr
30d40 20 2a 70 43 6f 75 6e 74 3b 0a 20 20 73 71 6c 69   *pCount;.  sqli
30d50 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 28  te3 *db;.  if( (
30d60 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
30d70 5f 41 67 67 72 65 67 61 74 65 29 3d 3d 30 20 29  _Aggregate)==0 )
30d80 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20   return 0;   /* 
30d90 54 68 69 73 20 69 73 20 61 6e 20 61 67 67 72 65  This is an aggre
30da0 67 61 74 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d  gate */.  if( p-
30db0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
30dc0 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  1 ) return 0;   
30dd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
30de0 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c  ingle result col
30df0 75 6d 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  umn */.  if( p->
30e00 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20  pWhere ) return 
30e10 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f  0;.  if( p->pGro
30e20 75 70 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b  upBy ) return 0;
30e30 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45  .  pExpr = p->pE
30e40 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
30e50 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
30e60 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p!=TK_AGG_FUNCTI
30e70 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ON ) return 0;  
30e80 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
30e90 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  is an aggregate 
30ea0 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
30eb0 5f 73 74 72 69 63 6d 70 28 70 45 78 70 72 2d 3e  _stricmp(pExpr->
30ec0 75 2e 7a 54 6f 6b 65 6e 2c 22 63 6f 75 6e 74 22  u.zToken,"count"
30ed0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  ) ) return 0;  /
30ee0 2a 20 49 73 20 63 6f 75 6e 74 28 29 20 2a 2f 0a  * Is count() */.
30ef0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 78 2e 70    if( pExpr->x.p
30f00 4c 69 73 74 21 3d 30 20 29 20 72 65 74 75 72 6e  List!=0 ) return
30f10 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
30f20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63      /* Must be c
30f30 6f 75 6e 74 28 2a 29 20 2a 2f 0a 20 20 69 66 28  ount(*) */.  if(
30f40 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d   p->pSrc->nSrc!=
30f50 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  1 ) return 0;   
30f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30f70 2a 20 4f 6e 65 20 74 61 62 6c 65 20 69 6e 20 46  * One table in F
30f80 52 4f 4d 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d  ROM  */.  pSub =
30f90 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
30fa0 53 65 6c 65 63 74 3b 0a 20 20 69 66 28 20 70 53  Select;.  if( pS
30fb0 75 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ub==0 ) return 0
30fc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30fd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
30fe0 68 65 20 46 52 4f 4d 20 69 73 20 61 20 73 75 62  he FROM is a sub
30ff0 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 70  query */.  if( p
31000 53 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  Sub->pPrior==0 )
31010 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
31020 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31030 4d 75 73 74 20 62 65 20 61 20 63 6f 6d 70 6f 75  Must be a compou
31040 6e 64 20 72 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20  nd ry */.  do{. 
31050 20 20 20 69 66 28 20 70 53 75 62 2d 3e 6f 70 21     if( pSub->op!
31060 3d 54 4b 5f 41 4c 4c 20 26 26 20 70 53 75 62 2d  =TK_ALL && pSub-
31070 3e 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e  >pPrior ) return
31080 20 30 3b 20 20 2f 2a 20 4d 75 73 74 20 62 65 20   0;  /* Must be 
31090 55 4e 49 4f 4e 20 41 4c 4c 20 2a 2f 0a 20 20 20  UNION ALL */.   
310a0 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72   if( pSub->pWher
310b0 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
310c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
310d0 20 20 20 2f 2a 20 4e 6f 20 57 48 45 52 45 20 63     /* No WHERE c
310e0 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 69 66 28  lause */.    if(
310f0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 20   pSub->pLimit ) 
31100 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
31110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31120 2a 20 4e 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73  * No LIMIT claus
31130 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75  e */.    if( pSu
31140 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
31150 5f 41 67 67 72 65 67 61 74 65 20 29 20 72 65 74  _Aggregate ) ret
31160 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 4e 6f  urn 0;     /* No
31170 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a  t an aggregate *
31180 2f 0a 20 20 20 20 70 53 75 62 20 3d 20 70 53 75  /.    pSub = pSu
31190 62 2d 3e 70 50 72 69 6f 72 3b 20 20 20 20 20 20  b->pPrior;      
311a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
311b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 65 61          /* Repea
311c0 74 20 6f 76 65 72 20 63 6f 6d 70 6f 75 6e 64 20  t over compound 
311d0 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 70 53 75  */.  }while( pSu
311e0 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  b );..  /* If we
311f0 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
31200 74 20 74 68 65 6e 20 69 74 20 69 73 20 4f 4b 20  t then it is OK 
31210 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20 74  to perform the t
31220 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  ransformation */
31230 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ..  db = pParse-
31240 3e 64 62 3b 0a 20 20 70 43 6f 75 6e 74 20 3d 20  >db;.  pCount = 
31250 70 45 78 70 72 3b 0a 20 20 70 45 78 70 72 20 3d  pExpr;.  pExpr =
31260 20 30 3b 0a 20 20 70 53 75 62 20 3d 20 70 2d 3e   0;.  pSub = p->
31270 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
31280 63 74 3b 0a 20 20 70 2d 3e 70 53 72 63 2d 3e 61  ct;.  p->pSrc->a
31290 5b 30 5d 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b  [0].pSelect = 0;
312a0 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
312b0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
312c0 53 72 63 29 3b 0a 20 20 70 2d 3e 70 53 72 63 20  Src);.  p->pSrc 
312d0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
312e0 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62  cZero(pParse->db
312f0 2c 20 73 69 7a 65 6f 66 28 2a 70 2d 3e 70 53 72  , sizeof(*p->pSr
31300 63 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 53  c));.  while( pS
31310 75 62 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  ub ){.    Expr *
31320 70 54 65 72 6d 3b 0a 20 20 20 20 70 50 72 69 6f  pTerm;.    pPrio
31330 72 20 3d 20 70 53 75 62 2d 3e 70 50 72 69 6f 72  r = pSub->pPrior
31340 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 50 72 69  ;.    pSub->pPri
31350 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62  or = 0;.    pSub
31360 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  ->pNext = 0;.   
31370 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
31380 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b  |= SF_Aggregate;
31390 0a 20 20 20 20 70 53 75 62 2d 3e 73 65 6c 46 6c  .    pSub->selFl
313a0 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f  ags &= ~SF_Compo
313b0 75 6e 64 3b 0a 20 20 20 20 70 53 75 62 2d 3e 6e  und;.    pSub->n
313c0 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20  SelectRow = 0;. 
313d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
313e0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75  stDelete(db, pSu
313f0 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
31400 70 54 65 72 6d 20 3d 20 70 50 72 69 6f 72 20 3f  pTerm = pPrior ?
31410 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
31420 64 62 2c 20 70 43 6f 75 6e 74 2c 20 30 29 20 3a  db, pCount, 0) :
31430 20 70 43 6f 75 6e 74 3b 0a 20 20 20 20 70 53 75   pCount;.    pSu
31440 62 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  b->pEList = sqli
31450 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
31460 64 28 70 50 61 72 73 65 2c 20 30 2c 20 70 54 65  d(pParse, 0, pTe
31470 72 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  rm);.    pTerm =
31480 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
31490 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43 54 2c  arse, TK_SELECT,
314a0 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
314b0 74 65 33 50 45 78 70 72 41 64 64 53 65 6c 65 63  te3PExprAddSelec
314c0 74 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  t(pParse, pTerm,
314d0 20 70 53 75 62 29 3b 0a 20 20 20 20 69 66 28 20   pSub);.    if( 
314e0 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20  pExpr==0 ){.    
314f0 20 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 3b    pExpr = pTerm;
31500 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
31510 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
31520 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
31530 4b 5f 50 4c 55 53 2c 20 70 54 65 72 6d 2c 20 70  K_PLUS, pTerm, p
31540 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Expr);.    }.   
31550 20 70 53 75 62 20 3d 20 70 50 72 69 6f 72 3b 0a   pSub = pPrior;.
31560 20 20 7d 0a 20 20 70 2d 3e 70 45 4c 69 73 74 2d    }.  p->pEList-
31570 3e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70 45  >a[0].pExpr = pE
31580 78 70 72 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  xpr;.  p->selFla
31590 67 73 20 26 3d 20 7e 53 46 5f 41 67 67 72 65 67  gs &= ~SF_Aggreg
315a0 61 74 65 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54  ate;..#if SELECT
315b0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
315c0 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
315d0 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29  tTrace & 0x400 )
315e0 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  {.    SELECTTRAC
315f0 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70  E(0x400,pParse,p
31600 2c 28 22 41 66 74 65 72 20 63 6f 75 6e 74 2d 6f  ,("After count-o
31610 66 2d 76 69 65 77 20 6f 70 74 69 6d 69 7a 61 74  f-view optimizat
31620 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73  ion:\n"));.    s
31630 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
31640 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
31650 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
31660 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
31670 2a 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46  * SQLITE_COUNTOF
31680 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  VIEW_OPTIMIZATIO
31690 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  N */../*.** Gene
316a0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
316b0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
316c0 6e 74 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  nt given in the 
316d0 70 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a  p argument.  .**
316e0 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
316f0 61 72 65 20 72 65 74 75 72 6e 65 64 20 61 63 63  are returned acc
31700 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 53 65  ording to the Se
31710 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75  lectDest structu
31720 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65  re..** See comme
31730 6e 74 73 20 69 6e 20 73 71 6c 69 74 65 49 6e 74  nts in sqliteInt
31740 2e 68 20 66 6f 72 20 66 75 72 74 68 65 72 20 69  .h for further i
31750 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nformation..**.*
31760 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
31770 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
31780 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66  r of errors.  If
31790 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a   any errors are.
317a0 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  ** encountered, 
317b0 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69  then an appropri
317c0 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ate error messag
317d0 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20  e is left in.** 
317e0 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
317f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
31800 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65  ine does NOT fre
31810 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72  e the Select str
31820 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e  ucture passed in
31830 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  .  The.** callin
31840 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73  g function needs
31850 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a   to do that..*/.
31860 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
31870 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
31880 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
31890 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
318a0 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
318b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
318c0 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
318d0 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
318e0 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  d. */.  SelectDe
318f0 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 20 2f  st *pDest      /
31900 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
31910 68 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  h the query resu
31920 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
31930 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
31940 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
31950 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ers */.  WhereIn
31960 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
31970 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73  /* Return from s
31980 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
31990 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  () */.  Vdbe *v;
319a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
319b0 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61  * The virtual ma
319c0 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73  chine under cons
319d0 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
319e0 74 20 69 73 41 67 67 3b 20 20 20 20 20 20 20 20  t isAgg;        
319f0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
31a00 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69   select lists li
31a10 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f  ke "count(*)" */
31a20 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
31a30 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20 4c 69 73  ist = 0;  /* Lis
31a40 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
31a50 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72  extract. */.  Sr
31a60 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
31a70 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
31a80 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74  tables to select
31a90 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20   from */.  Expr 
31aa0 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20  *pWhere;        
31ab0 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
31ac0 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
31ad0 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
31ae0 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20  t *pGroupBy;    
31af0 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20  /* The GROUP BY 
31b00 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
31b10 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  NULL */.  Expr *
31b20 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20  pHaving;        
31b30 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63   /* The HAVING c
31b40 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
31b50 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ULL */.  int rc 
31b60 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
31b70 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
31b80 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  rn from this fun
31b90 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69  ction */.  Disti
31ba0 6e 63 74 43 74 78 20 73 44 69 73 74 69 6e 63 74  nctCtx sDistinct
31bb0 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77  ; /* Info on how
31bc0 20 74 6f 20 63 6f 64 65 20 74 68 65 20 44 49 53   to code the DIS
31bd0 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f  TINCT keyword */
31be0 0a 20 20 53 6f 72 74 43 74 78 20 73 53 6f 72 74  .  SortCtx sSort
31bf0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66  ;         /* Inf
31c00 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65  o on how to code
31c10 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
31c20 61 75 73 65 20 2a 2f 0a 20 20 41 67 67 49 6e 66  ause */.  AggInf
31c30 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20  o sAggInfo;     
31c40 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
31c50 75 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74  used by aggregat
31c60 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69  e queries */.  i
31c70 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20  nt iEnd;        
31c80 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
31c90 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74   of the end of t
31ca0 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71  he query */.  sq
31cb0 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
31cc0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
31cd0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
31ce0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
31cf0 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79 20 3d 20  MinMaxOrderBy = 
31d00 30 3b 20 20 2f 2a 20 41 64 64 65 64 20 4f 52 44  0;  /* Added ORD
31d10 45 52 20 42 59 20 66 6f 72 20 6d 69 6e 2f 6d 61  ER BY for min/ma
31d20 78 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 75  x queries */.  u
31d30 38 20 6d 69 6e 4d 61 78 46 6c 61 67 3b 20 20 20  8 minMaxFlag;   
31d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31d50 20 46 6c 61 67 20 66 6f 72 20 6d 69 6e 2f 6d 61   Flag for min/ma
31d60 78 20 71 75 65 72 69 65 73 20 2a 2f 0a 0a 20 20  x queries */..  
31d70 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
31d80 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
31d90 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
31da0 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d   if( p==0 || db-
31db0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
31dc0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b   pParse->nErr ){
31dd0 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
31de0 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
31df0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
31e00 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c  , SQLITE_SELECT,
31e10 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75   0, 0, 0) ) retu
31e20 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26  rn 1;.  memset(&
31e30 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a  sAggInfo, 0, siz
31e40 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a  eof(sAggInfo));.
31e50 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
31e60 45 4e 41 42 4c 45 44 0a 20 20 53 45 4c 45 43 54  ENABLED.  SELECT
31e70 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
31e80 2c 20 28 22 62 65 67 69 6e 20 70 72 6f 63 65 73  , ("begin proces
31e90 73 69 6e 67 3a 5c 6e 22 2c 20 70 50 61 72 73 65  sing:\n", pParse
31ea0 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 29 29 3b  ->addrExplain));
31eb0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
31ec0 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30  lectTrace & 0x10
31ed0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
31ee0 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
31ef0 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , p, 0);.  }.#en
31f00 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
31f10 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ->pOrderBy==0 ||
31f20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
31f30 52 54 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a 20  RT_DistFifo );. 
31f40 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
31f50 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74  erBy==0 || pDest
31f60 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 46 69 66  ->eDest!=SRT_Fif
31f70 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  o );.  assert( p
31f80 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ->pOrderBy==0 ||
31f90 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
31fa0 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 3b 0a  RT_DistQueue );.
31fb0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
31fc0 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73  derBy==0 || pDes
31fd0 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 51 75  t->eDest!=SRT_Qu
31fe0 65 75 65 20 29 3b 0a 20 20 69 66 28 20 49 67 6e  eue );.  if( Ign
31ff0 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44  orableOrderby(pD
32000 65 73 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65  est) ){.    asse
32010 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  rt(pDest->eDest=
32020 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70  =SRT_Exists || p
32030 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
32040 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20  _Union || .     
32050 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65        pDest->eDe
32060 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c  st==SRT_Except |
32070 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
32080 53 52 54 5f 44 69 73 63 61 72 64 20 7c 7c 0a 20  SRT_Discard ||. 
32090 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d            pDest-
320a0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 51 75 65 75  >eDest==SRT_Queu
320b0 65 20 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  e  || pDest->eDe
320c0 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f  st==SRT_DistFifo
320d0 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70   ||.           p
320e0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
320f0 5f 44 69 73 74 51 75 65 75 65 20 7c 7c 20 70 44  _DistQueue || pD
32100 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
32110 46 69 66 6f 29 3b 0a 20 20 20 20 2f 2a 20 49 66  Fifo);.    /* If
32120 20 4f 52 44 45 52 20 42 59 20 6d 61 6b 65 73 20   ORDER BY makes 
32130 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e  no difference in
32140 20 74 68 65 20 6f 75 74 70 75 74 20 74 68 65 6e   the output then
32150 20 6e 65 69 74 68 65 72 20 64 6f 65 73 0a 20 20   neither does.  
32160 20 20 2a 2a 20 44 49 53 54 49 4e 43 54 20 73 6f    ** DISTINCT so
32170 20 69 74 20 63 61 6e 20 62 65 20 72 65 6d 6f 76   it can be remov
32180 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73  ed too. */.    s
32190 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
321a0 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64  lete(db, p->pOrd
321b0 65 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f  erBy);.    p->pO
321c0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
321d0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  p->selFlags &= ~
321e0 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d  SF_Distinct;.  }
321f0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
32200 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Prep(pParse, p, 
32210 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  0);.  if( pParse
32220 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
32230 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
32240 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
32250 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  d;.  }.  assert(
32260 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b   p->pEList!=0 );
32270 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
32280 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
32290 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
322a0 65 20 26 20 30 78 31 30 34 20 29 7b 0a 20 20 20  e & 0x104 ){.   
322b0 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
322c0 30 34 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 61  04,pParse,p, ("a
322d0 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75  fter name resolu
322e0 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  tion:\n"));.    
322f0 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
32300 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
32310 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
32320 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
32330 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
32340 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
32350 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29  Names(pParse, p)
32360 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
32370 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
32380 57 46 55 4e 43 0a 20 20 69 66 28 20 73 71 6c 69  WFUNC.  if( sqli
32390 74 65 33 57 69 6e 64 6f 77 52 65 77 72 69 74 65  te3WindowRewrite
323a0 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20  (pParse, p) ){. 
323b0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
323c0 6e 64 3b 0a 20 20 7d 0a 23 69 66 20 53 45 4c 45  nd;.  }.#if SELE
323d0 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
323e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
323f0 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30 38  ectTrace & 0x108
32400 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52   ){.    SELECTTR
32410 41 43 45 28 30 78 31 30 34 2c 70 50 61 72 73 65  ACE(0x104,pParse
32420 2c 70 2c 20 28 22 61 66 74 65 72 20 77 69 6e 64  ,p, ("after wind
32430 6f 77 20 72 65 77 72 69 74 65 3a 5c 6e 22 29 29  ow rewrite:\n"))
32440 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
32450 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
32460 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
32470 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
32480 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
32490 43 20 2a 2f 0a 20 20 70 54 61 62 4c 69 73 74 20  C */.  pTabList 
324a0 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 73 41  = p->pSrc;.  isA
324b0 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67  gg = (p->selFlag
324c0 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
324d0 29 21 3d 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26  )!=0;.  memset(&
324e0 73 53 6f 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66  sSort, 0, sizeof
324f0 28 73 53 6f 72 74 29 29 3b 0a 20 20 73 53 6f 72  (sSort));.  sSor
32500 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e  t.pOrderBy = p->
32510 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20  pOrderBy;..  /* 
32520 54 72 79 20 74 6f 20 76 61 72 69 6f 75 73 20 6f  Try to various o
32530 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 28 66 6c  ptimizations (fl
32540 61 74 74 65 6e 69 6e 67 20 73 75 62 71 75 65 72  attening subquer
32550 69 65 73 2c 20 61 6e 64 20 73 74 72 65 6e 67 74  ies, and strengt
32560 68 0a 20 20 2a 2a 20 72 65 64 75 63 74 69 6f 6e  h.  ** reduction
32570 20 6f 66 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f   of join operato
32580 72 73 29 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  rs) in the FROM 
32590 63 6c 61 75 73 65 20 75 70 20 69 6e 74 6f 20 74  clause up into t
325a0 68 65 20 6d 61 69 6e 20 71 75 65 72 79 0a 20 20  he main query.  
325b0 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
325c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
325d0 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
325e0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
325f0 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21  EW).  for(i=0; !
32600 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70  p->pPrior && i<p
32610 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
32620 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
32630 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
32640 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
32650 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63  >a[i];.    Selec
32660 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d  t *pSub = pItem-
32670 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 54 61  >pSelect;.    Ta
32680 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74 65  ble *pTab = pIte
32690 6d 2d 3e 70 54 61 62 3b 0a 0a 20 20 20 20 2f 2a  m->pTab;..    /*
326a0 20 43 6f 6e 76 65 72 74 20 4c 45 46 54 20 4a 4f   Convert LEFT JO
326b0 49 4e 20 69 6e 74 6f 20 4a 4f 49 4e 20 69 66 20  IN into JOIN if 
326c0 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20  there are terms 
326d0 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
326e0 6c 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  le.    ** of the
326f0 20 4c 45 46 54 20 4a 4f 49 4e 20 75 73 65 64 20   LEFT JOIN used 
32700 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
32710 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  use..    */.    
32720 69 66 28 20 28 70 49 74 65 6d 2d 3e 66 67 2e 6a  if( (pItem->fg.j
32730 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
32740 54 29 21 3d 30 0a 20 20 20 20 20 26 26 20 73 71  T)!=0.     && sq
32750 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
32760 4e 6f 6e 4e 75 6c 6c 52 6f 77 28 70 2d 3e 70 57  NonNullRow(p->pW
32770 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75  here, pItem->iCu
32780 72 73 6f 72 29 0a 20 20 20 20 20 26 26 20 4f 70  rsor).     && Op
32790 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
327a0 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 69 6d  d(db, SQLITE_Sim
327b0 70 6c 69 66 79 4a 6f 69 6e 29 0a 20 20 20 20 29  plifyJoin).    )
327c0 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  {.      SELECTTR
327d0 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65  ACE(0x100,pParse
327e0 2c 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ,p,.            
327f0 20 20 20 20 28 22 4c 45 46 54 2d 4a 4f 49 4e 20      ("LEFT-JOIN 
32800 73 69 6d 70 6c 69 66 69 65 73 20 74 6f 20 4a 4f  simplifies to JO
32810 49 4e 20 6f 6e 20 74 65 72 6d 20 25 64 5c 6e 22  IN on term %d\n"
32820 2c 69 29 29 3b 0a 20 20 20 20 20 20 70 49 74 65  ,i));.      pIte
32830 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  m->fg.jointype &
32840 3d 20 7e 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f  = ~(JT_LEFT|JT_O
32850 55 54 45 52 29 3b 0a 20 20 20 20 20 20 75 6e 73  UTER);.      uns
32860 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 57  etJoinExpr(p->pW
32870 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75  here, pItem->iCu
32880 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  rsor);.    }..  
32890 20 20 2f 2a 20 4e 6f 20 66 75 74 68 65 72 20 61    /* No futher a
328a0 63 74 69 6f 6e 20 69 66 20 74 68 69 73 20 74 65  ction if this te
328b0 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  rm of the FROM c
328c0 6c 61 75 73 65 20 69 73 20 6e 6f 20 61 20 73 75  lause is no a su
328d0 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 69 66  bquery */.    if
328e0 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74  ( pSub==0 ) cont
328f0 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 43 61  inue;..    /* Ca
32900 74 63 68 20 6d 69 73 6d 61 74 63 68 20 69 6e 20  tch mismatch in 
32910 74 68 65 20 64 65 63 6c 61 72 65 64 20 63 6f 6c  the declared col
32920 75 6d 6e 73 20 6f 66 20 61 20 76 69 65 77 20 61  umns of a view a
32930 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
32940 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20  .    ** columns 
32950 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 6f 6e  in the SELECT on
32960 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 20 20   the RHS */.    
32970 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 21 3d  if( pTab->nCol!=
32980 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  pSub->pEList->nE
32990 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  xpr ){.      sql
329a0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
329b0 72 73 65 2c 20 22 65 78 70 65 63 74 65 64 20 25  rse, "expected %
329c0 64 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 27 25  d columns for '%
329d0 73 27 20 62 75 74 20 67 6f 74 20 25 64 22 2c 0a  s' but got %d",.
329e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
329f0 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c        pTab->nCol
32a00 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70  , pTab->zName, p
32a10 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  Sub->pEList->nEx
32a20 70 72 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  pr);.      goto 
32a30 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
32a40 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  }..    /* Do not
32a50 20 74 72 79 20 74 6f 20 66 6c 61 74 74 65 6e 20   try to flatten 
32a60 61 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62  an aggregate sub
32a70 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20  query..    **.  
32a80 20 20 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20    ** Flattening 
32a90 61 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62  an aggregate sub
32aa0 71 75 65 72 79 20 69 73 20 6f 6e 6c 79 20 70 6f  query is only po
32ab0 73 73 69 62 6c 65 20 69 66 20 74 68 65 20 6f 75  ssible if the ou
32ac0 74 65 72 20 71 75 65 72 79 0a 20 20 20 20 2a 2a  ter query.    **
32ad0 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 20   is not a join. 
32ae0 20 42 75 74 20 69 66 20 74 68 65 20 6f 75 74 65   But if the oute
32af0 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
32b00 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68 65 20   join, then the 
32b10 73 75 62 71 75 65 72 79 0a 20 20 20 20 2a 2a 20  subquery.    ** 
32b20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 65 6d 65 6e  will be implemen
32b30 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74  ted as a co-rout
32b40 69 6e 65 20 61 6e 64 20 74 68 65 72 65 20 69 73  ine and there is
32b50 20 6e 6f 20 61 64 76 61 6e 74 61 67 65 20 74 6f   no advantage to
32b60 0a 20 20 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69  .    ** flatteni
32b70 6e 67 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e  ng in that case.
32b80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
32b90 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20  (pSub->selFlags 
32ba0 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21  & SF_Aggregate)!
32bb0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
32bc0 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d     assert( pSub-
32bd0 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a  >pGroupBy==0 );.
32be0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
32bf0 75 74 65 72 20 71 75 65 72 79 20 63 6f 6e 74 61  uter query conta
32c00 69 6e 73 20 61 20 22 63 6f 6d 70 6c 65 78 22 20  ins a "complex" 
32c10 72 65 73 75 6c 74 20 73 65 74 20 28 74 68 61 74  result set (that
32c20 20 69 73 2c 0a 20 20 20 20 2a 2a 20 69 66 20 74   is,.    ** if t
32c30 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
32c40 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
32c50 20 75 73 65 73 20 66 75 6e 63 74 69 6f 6e 73 20   uses functions 
32c60 6f 72 20 73 75 62 71 75 65 72 69 65 73 29 0a 20  or subqueries). 
32c70 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65     ** and if the
32c80 20 73 75 62 71 75 65 72 79 20 63 6f 6e 74 61 69   subquery contai
32c90 6e 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  ns an ORDER BY c
32ca0 6c 61 75 73 65 20 61 6e 64 20 69 66 0a 20 20 20  lause and if.   
32cb0 20 2a 2a 20 69 74 20 77 69 6c 6c 20 62 65 20 69   ** it will be i
32cc0 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
32cd0 63 6f 2d 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e  co-routine, then
32ce0 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e 2e   do not flatten.
32cf0 20 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 72 65    This.    ** re
32d00 73 74 72 69 63 74 69 6f 6e 20 61 6c 6c 6f 77 73  striction allows
32d10 20 53 51 4c 20 63 6f 6e 73 74 72 75 63 74 73 20   SQL constructs 
32d20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a  like this:.    *
32d30 2a 0a 20 20 20 20 2a 2a 20 20 53 45 4c 45 43 54  *.    **  SELECT
32d40 20 65 78 70 65 6e 73 69 76 65 5f 66 75 6e 63 74   expensive_funct
32d50 69 6f 6e 28 78 29 0a 20 20 20 20 2a 2a 20 20 20  ion(x).    **   
32d60 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 20   FROM (SELECT x 
32d70 46 52 4f 4d 20 74 61 62 20 4f 52 44 45 52 20 42  FROM tab ORDER B
32d80 59 20 79 20 4c 49 4d 49 54 20 31 30 29 3b 0a 20  Y y LIMIT 10);. 
32d90 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
32da0 20 65 78 70 65 6e 73 69 76 65 5f 66 75 6e 63 74   expensive_funct
32db0 69 6f 6e 28 29 20 69 73 20 6f 6e 6c 79 20 63 6f  ion() is only co
32dc0 6d 70 75 74 65 64 20 6f 6e 20 74 68 65 20 31 30  mputed on the 10
32dd0 20 72 6f 77 73 20 74 68 61 74 0a 20 20 20 20 2a   rows that.    *
32de0 2a 20 61 72 65 20 6f 75 74 70 75 74 2c 20 72 61  * are output, ra
32df0 74 68 65 72 20 74 68 61 6e 20 65 76 65 72 79 20  ther than every 
32e00 72 6f 77 20 6f 66 20 74 68 65 20 74 61 62 6c 65  row of the table
32e10 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
32e20 54 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 20  The requirement 
32e30 74 68 61 74 20 74 68 65 20 6f 75 74 65 72 20 71  that the outer q
32e40 75 65 72 79 20 68 61 76 65 20 61 20 63 6f 6d 70  uery have a comp
32e50 6c 65 78 20 72 65 73 75 6c 74 20 73 65 74 0a 20  lex result set. 
32e60 20 20 20 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74     ** means that
32e70 20 66 6c 61 74 74 65 6e 69 6e 67 20 64 6f 65 73   flattening does
32e80 20 6f 63 63 75 72 20 6f 6e 20 73 69 6d 70 6c 65   occur on simple
32e90 72 20 53 51 4c 20 63 6f 6e 73 74 72 61 69 6e 74  r SQL constraint
32ea0 73 20 77 69 74 68 6f 75 74 0a 20 20 20 20 2a 2a  s without.    **
32eb0 20 74 68 65 20 65 78 70 65 6e 73 69 76 65 5f 66   the expensive_f
32ec0 75 6e 63 74 69 6f 6e 28 29 20 6c 69 6b 65 3a 0a  unction() like:.
32ed0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 53      **.    **  S
32ee0 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 28 53 45  ELECT x FROM (SE
32ef0 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 20  LECT x FROM tab 
32f00 4f 52 44 45 52 20 42 59 20 79 20 4c 49 4d 49 54  ORDER BY y LIMIT
32f10 20 31 30 29 3b 0a 20 20 20 20 2a 2f 0a 20 20 20   10);.    */.   
32f20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
32f30 72 42 79 21 3d 30 0a 20 20 20 20 20 26 26 20 69  rBy!=0.     && i
32f40 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 2d 3e  ==0.     && (p->
32f50 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f  selFlags & SF_Co
32f60 6d 70 6c 65 78 52 65 73 75 6c 74 29 21 3d 30 0a  mplexResult)!=0.
32f70 20 20 20 20 20 26 26 20 28 70 54 61 62 4c 69 73       && (pTabLis
32f80 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20  t->nSrc==1.     
32f90 20 20 20 20 7c 7c 20 28 70 54 61 62 4c 69 73 74      || (pTabList
32fa0 2d 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79  ->a[1].fg.jointy
32fb0 70 65 26 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43  pe&(JT_LEFT|JT_C
32fc0 52 4f 53 53 29 29 21 3d 30 29 0a 20 20 20 20 29  ROSS))!=0).    )
32fd0 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
32fe0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
32ff0 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
33000 28 70 50 61 72 73 65 2c 20 70 2c 20 69 2c 20 69  (pParse, p, i, i
33010 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20 69  sAgg) ){.      i
33020 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
33030 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
33040 64 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  d;.      /* This
33050 20 73 75 62 71 75 65 72 79 20 63 61 6e 20 62 65   subquery can be
33060 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 69   absorbed into i
33070 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20  ts parent. */.  
33080 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20      i = -1;.    
33090 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d  }.    pTabList =
330a0 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66   p->pSrc;.    if
330b0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
330c0 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  ed ) goto select
330d0 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 21 49  _end;.    if( !I
330e0 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
330f0 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pDest) ){.      
33100 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
33110 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
33120 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
33130 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
33140 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
33150 45 43 54 0a 20 20 2f 2a 20 48 61 6e 64 6c 65 20  ECT.  /* Handle 
33160 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
33170 73 74 61 74 65 6d 65 6e 74 73 20 75 73 69 6e 67  statements using
33180 20 74 68 65 20 73 65 70 61 72 61 74 65 20 6d 75   the separate mu
33190 6c 74 69 53 65 6c 65 63 74 28 29 0a 20 20 2a 2a  ltiSelect().  **
331a0 20 70 72 6f 63 65 64 75 72 65 2e 0a 20 20 2a 2f   procedure..  */
331b0 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
331c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c   ){.    rc = mul
331d0 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  tiSelect(pParse,
331e0 20 70 2c 20 70 44 65 73 74 29 3b 0a 23 69 66 20   p, pDest);.#if 
331f0 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
33200 4c 45 44 0a 20 20 20 20 53 45 4c 45 43 54 54 52  LED.    SELECTTR
33210 41 43 45 28 30 78 31 2c 70 50 61 72 73 65 2c 70  ACE(0x1,pParse,p
33220 2c 28 22 65 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d  ,("end compound-
33230 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e  select processin
33240 67 5c 6e 22 29 29 3b 0a 20 20 20 20 69 66 28 20  g\n"));.    if( 
33250 28 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72  (sqlite3SelectTr
33260 61 63 65 20 26 20 30 78 32 30 30 30 29 21 3d 30  ace & 0x2000)!=0
33270 20 26 26 20 45 78 70 6c 61 69 6e 51 75 65 72 79   && ExplainQuery
33280 50 6c 61 6e 50 61 72 65 6e 74 28 70 50 61 72 73  PlanParent(pPars
33290 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  e)==0 ){.      s
332a0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
332b0 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
332c0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
332d0 69 66 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20  if( p->pNext==0 
332e0 29 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c  ) ExplainQueryPl
332f0 61 6e 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  anPop(pParse);. 
33300 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
33310 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  }.#endif..  /* D
33320 6f 20 74 68 65 20 57 48 45 52 45 2d 63 6c 61 75  o the WHERE-clau
33330 73 65 20 63 6f 6e 73 74 61 6e 74 20 70 72 6f 70  se constant prop
33340 61 67 61 74 69 6f 6e 20 6f 70 74 69 6d 69 7a 61  agation optimiza
33350 74 69 6f 6e 20 69 66 20 74 68 69 73 20 69 73 0a  tion if this is.
33360 20 20 2a 2a 20 61 20 6a 6f 69 6e 2e 20 20 4e 6f    ** a join.  No
33370 20 6e 65 65 64 20 74 6f 20 73 70 65 65 64 20 74   need to speed t
33380 69 6d 65 20 6f 6e 20 74 68 69 73 20 6f 70 65 72  ime on this oper
33390 61 74 69 6f 6e 20 66 6f 72 20 6e 6f 6e 2d 6a 6f  ation for non-jo
333a0 69 6e 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20  in queries.  ** 
333b0 61 73 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  as the equivalen
333c0 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77  t optimization w
333d0 69 6c 6c 20 62 65 20 68 61 6e 64 6c 65 64 20 62  ill be handled b
333e0 79 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20  y query planner 
333f0 69 6e 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 57  in.  ** sqlite3W
33400 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 20 20 2a  hereBegin()..  *
33410 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74  /.  if( pTabList
33420 2d 3e 6e 53 72 63 3e 31 0a 20 20 20 26 26 20 4f  ->nSrc>1.   && O
33430 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
33440 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 50 72  ed(db, SQLITE_Pr
33450 6f 70 61 67 61 74 65 43 6f 6e 73 74 29 0a 20 20  opagateConst).  
33460 20 26 26 20 70 72 6f 70 61 67 61 74 65 43 6f 6e   && propagateCon
33470 73 74 61 6e 74 73 28 70 50 61 72 73 65 2c 20 70  stants(pParse, p
33480 29 0a 20 20 29 7b 0a 23 69 66 20 53 45 4c 45 43  ).  ){.#if SELEC
33490 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_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 53 45 4c 45 43  0 ){.      SELEC
334d0 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61  TTRACE(0x100,pPa
334e0 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 63 6f  rse,p,("After co
334f0 6e 73 74 61 6e 74 20 70 72 6f 70 61 67 61 74 69  nstant propagati
33500 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  on:\n"));.      
33510 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
33520 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
33530 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
33540 65 6c 73 65 7b 0a 20 20 20 20 53 45 4c 45 43 54  else{.    SELECT
33550 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72  TRACE(0x100,pPar
33560 73 65 2c 70 2c 28 22 43 6f 6e 73 74 61 6e 74 20  se,p,("Constant 
33570 70 72 6f 70 61 67 61 74 69 6f 6e 20 6e 6f 74 20  propagation not 
33580 68 65 6c 70 66 75 6c 5c 6e 22 29 29 3b 0a 20 20  helpful\n"));.  
33590 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
335a0 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54  _COUNTOFVIEW_OPT
335b0 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20  IMIZATION.  if( 
335c0 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
335d0 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51  led(db, SQLITE_Q
335e0 75 65 72 79 46 6c 61 74 74 65 6e 65 72 7c 53 51  ueryFlattener|SQ
335f0 4c 49 54 45 5f 43 6f 75 6e 74 4f 66 56 69 65 77  LITE_CountOfView
33600 29 0a 20 20 20 26 26 20 63 6f 75 6e 74 4f 66 56  ).   && countOfV
33610 69 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28  iewOptimization(
33620 70 50 61 72 73 65 2c 20 70 29 0a 20 20 29 7b 0a  pParse, p).  ){.
33630 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
33640 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
33650 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
33660 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
33670 73 74 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74  st;.    pTabList
33680 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 7d 0a   = p->pSrc;.  }.
33690 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 6f 72  #endif..  /* For
336a0 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 74 68   each term in th
336b0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20 64  e FROM clause, d
336c0 6f 20 74 77 6f 20 74 68 69 6e 67 73 3a 0a 20 20  o two things:.  
336d0 2a 2a 20 28 31 29 20 41 75 74 68 6f 72 69 7a 65  ** (1) Authorize
336e0 64 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 74  d unreferenced t
336f0 61 62 6c 65 73 0a 20 20 2a 2a 20 28 32 29 20 47  ables.  ** (2) G
33700 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
33710 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73   all sub-queries
33720 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
33730 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
33740 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  c; i++){.    str
33750 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
33760 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c   *pItem = &pTabL
33770 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53  ist->a[i];.    S
33780 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a  electDest dest;.
33790 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62      Select *pSub
337a0 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
337b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
337c0 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
337d0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
337e0 57 29 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  W).    const cha
337f0 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e  r *zSavedAuthCon
33800 74 65 78 74 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  text;.#endif..  
33810 20 20 2f 2a 20 49 73 73 75 65 20 53 51 4c 49 54    /* Issue SQLIT
33820 45 5f 52 45 41 44 20 61 75 74 68 6f 72 69 7a 61  E_READ authoriza
33830 74 69 6f 6e 73 20 77 69 74 68 20 61 20 66 61 6b  tions with a fak
33840 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 66 6f  e column name fo
33850 72 20 61 6e 79 0a 20 20 20 20 2a 2a 20 74 61 62  r any.    ** tab
33860 6c 65 73 20 74 68 61 74 20 61 72 65 20 72 65 66  les that are ref
33870 65 72 65 6e 63 65 64 20 62 75 74 20 66 72 6f 6d  erenced but from
33880 20 77 68 69 63 68 20 6e 6f 20 76 61 6c 75 65 73   which no values
33890 20 61 72 65 20 65 78 74 72 61 63 74 65 64 2e 0a   are extracted..
338a0 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 73 20      ** Examples 
338b0 6f 66 20 77 68 65 72 65 20 74 68 65 73 65 20 6b  of where these k
338c0 69 6e 64 73 20 6f 66 20 6e 75 6c 6c 20 53 51 4c  inds of null SQL
338d0 49 54 45 5f 52 45 41 44 20 61 75 74 68 6f 72 69  ITE_READ authori
338e0 7a 61 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 77  zations.    ** w
338f0 6f 75 6c 64 20 6f 63 63 75 72 3a 0a 20 20 20 20  ould occur:.    
33900 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 45  **.    **     SE
33910 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
33920 4f 4d 20 74 31 3b 20 20 20 2d 2d 20 53 51 4c 49  OM t1;   -- SQLI
33930 54 45 5f 52 45 41 44 20 74 31 2e 22 22 0a 20 20  TE_READ t1."".  
33940 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
33950 74 31 2e 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32  t1.* FROM t1, t2
33960 3b 20 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52 45  ;   -- SQLITE_RE
33970 41 44 20 74 32 2e 22 22 0a 20 20 20 20 2a 2a 0a  AD t2."".    **.
33980 20 20 20 20 2a 2a 20 54 68 65 20 66 61 6b 65 20      ** The fake 
33990 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 61  column name is a
339a0 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20  n empty string. 
339b0 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
339c0 66 6f 72 20 61 20 74 61 62 6c 65 20 74 6f 0a 20  for a table to. 
339d0 20 20 20 2a 2a 20 68 61 76 65 20 61 20 63 6f 6c     ** have a col
339e0 75 6d 6e 20 6e 61 6d 65 64 20 62 79 20 74 68 65  umn named by the
339f0 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 69   empty string, i
33a00 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65  n which case the
33a10 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 0a  re is no way to.
33a20 20 20 20 20 2a 2a 20 64 69 73 74 69 6e 67 75 69      ** distingui
33a30 73 68 20 62 65 74 77 65 65 6e 20 61 6e 20 75 6e  sh between an un
33a40 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
33a50 20 61 6e 64 20 61 6e 20 61 63 74 75 61 6c 20 72   and an actual r
33a60 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a  eference to the.
33a70 20 20 20 20 2a 2a 20 22 22 20 63 6f 6c 75 6d 6e      ** "" column
33a80 2e 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  . The original d
33a90 65 73 69 67 6e 20 77 61 73 20 66 6f 72 20 74 68  esign was for th
33aa0 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61  e fake column na
33ab0 6d 65 20 74 6f 20 62 65 20 61 20 4e 55 4c 4c 2c  me to be a NULL,
33ac0 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 77 6f  .    ** which wo
33ad0 75 6c 64 20 62 65 20 75 6e 61 6d 62 69 67 75 6f  uld be unambiguo
33ae0 75 73 2e 20 20 42 75 74 20 6c 65 67 61 63 79 20  us.  But legacy 
33af0 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61  authorization ca
33b00 6c 6c 62 61 63 6b 73 20 6d 69 67 68 74 0a 20 20  llbacks might.  
33b10 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 65 20    ** assume the 
33b20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 6e  column name is n
33b30 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20 73 65 67 66  on-NULL and segf
33b40 61 75 6c 74 2e 20 20 54 68 65 20 75 73 65 20 6f  ault.  The use o
33b50 66 20 61 6e 20 65 6d 70 74 79 0a 20 20 20 20 2a  f an empty.    *
33b60 2a 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65  * string for the
33b70 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d   fake column nam
33b80 65 20 73 65 65 6d 73 20 73 61 66 65 72 2e 0a 20  e seems safer.. 
33b90 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49     */.    if( pI
33ba0 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3d 3d 30 20  tem->colUsed==0 
33bb0 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21  && pItem->zName!
33bc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
33bd0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
33be0 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 41 44  rse, SQLITE_READ
33bf0 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20  , pItem->zName, 
33c00 22 22 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  "", pItem->zData
33c10 62 61 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69  base);.    }..#i
33c20 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
33c30 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
33c40 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
33c50 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20  ITE_OMIT_VIEW). 
33c60 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
33c70 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d  ode for all sub-
33c80 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46  queries in the F
33c90 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 2a  ROM clause.    *
33ca0 2f 0a 20 20 20 20 70 53 75 62 20 3d 20 70 49 74  /.    pSub = pIt
33cb0 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  em->pSelect;.   
33cc0 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63   if( pSub==0 ) c
33cd0 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
33ce0 20 54 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20   The code for a 
33cf0 73 75 62 71 75 65 72 79 20 73 68 6f 75 6c 64 20  subquery should 
33d00 6f 6e 6c 79 20 62 65 20 67 65 6e 65 72 61 74 65  only be generate
33d10 64 20 6f 6e 63 65 2c 20 74 68 6f 75 67 68 20 69  d once, though i
33d20 74 20 69 73 0a 20 20 20 20 2a 2a 20 74 65 63 68  t is.    ** tech
33d30 6e 69 63 61 6c 6c 79 20 68 61 72 6d 6c 65 73 73  nically harmless
33d40 20 66 6f 72 20 69 74 20 74 6f 20 62 65 20 67 65   for it to be ge
33d50 6e 65 72 61 74 65 64 20 6d 75 6c 74 69 70 6c 65  nerated multiple
33d60 20 74 69 6d 65 73 2e 20 54 68 65 0a 20 20 20 20   times. The.    
33d70 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  ** following ass
33d80 65 72 74 28 29 20 77 69 6c 6c 20 64 65 74 65 63  ert() will detec
33d90 74 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 63  t if something c
33da0 68 61 6e 67 65 73 20 74 6f 20 63 61 75 73 65 0a  hanges to cause.
33db0 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20      ** the same 
33dc0 73 75 62 71 75 65 72 79 20 74 6f 20 62 65 20 63  subquery to be c
33dd0 6f 64 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69  oded multiple ti
33de0 6d 65 73 2c 20 61 73 20 61 20 73 69 67 6e 61 6c  mes, as a signal
33df0 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   to the.    ** d
33e00 65 76 65 6c 6f 70 65 72 73 20 74 6f 20 74 72 79  evelopers to try
33e10 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 65   to optimize the
33e20 20 73 69 74 75 61 74 69 6f 6e 2e 0a 20 20 20 20   situation..    
33e30 2a 2a 0a 20 20 20 20 2a 2a 20 55 70 64 61 74 65  **.    ** Update
33e40 20 32 30 31 39 2d 30 37 2d 32 34 3a 0a 20 20 20   2019-07-24:.   
33e50 20 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 20 68   ** See ticket h
33e60 74 74 70 73 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72  ttps://sqlite.or
33e70 67 2f 73 72 63 2f 74 6b 74 76 69 65 77 2f 63 35  g/src/tktview/c5
33e80 32 62 30 39 63 37 66 33 38 39 30 33 62 31 33 31  2b09c7f38903b131
33e90 31 63 65 63 34 30 2e 0a 20 20 20 20 2a 2a 20 54  1cec40..    ** T
33ea0 68 65 20 64 62 73 71 6c 66 75 7a 7a 20 66 75 7a  he dbsqlfuzz fuz
33eb0 7a 65 72 20 66 6f 75 6e 64 20 61 20 63 61 73 65  zer found a case
33ec0 20 77 68 65 72 65 20 74 68 65 20 73 61 6d 65 20   where the same 
33ed0 73 75 62 71 75 65 72 79 20 67 65 74 73 0a 20 20  subquery gets.  
33ee0 20 20 2a 2a 20 63 6f 64 65 64 20 74 77 69 63 65    ** coded twice
33ef0 2e 20 20 53 6f 20 74 68 69 73 20 61 73 73 65 72  .  So this asser
33f00 74 28 29 20 6e 6f 77 20 62 65 63 6f 6d 65 73 20  t() now becomes 
33f10 61 20 74 65 73 74 63 61 73 65 28 29 2e 20 20 49  a testcase().  I
33f20 74 20 73 68 6f 75 6c 64 0a 20 20 20 20 2a 2a 20  t should.    ** 
33f30 62 65 20 76 65 72 79 20 72 61 72 65 2c 20 74 68  be very rare, th
33f40 6f 75 67 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ough..    */.   
33f50 20 74 65 73 74 63 61 73 65 28 20 70 49 74 65 6d   testcase( pItem
33f60 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 21 3d 30  ->addrFillSub!=0
33f70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72   );..    /* Incr
33f80 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69  ement Parse.nHei
33f90 67 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68  ght by the heigh
33fa0 74 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74  t of the largest
33fb0 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
33fc0 2a 2a 20 74 72 65 65 20 72 65 66 65 72 72 65 64  ** tree referred
33fd0 20 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65   to by this, the
33fe0 20 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20   parent select. 
33ff0 54 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74  The child select
34000 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74  .    ** may cont
34010 61 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ain expression t
34020 72 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a  rees of at most.
34030 20 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d      ** (SQLITE_M
34040 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61  AX_EXPR_DEPTH-Pa
34050 72 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69  rse.nHeight) hei
34060 67 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62  ght. This is a b
34070 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63  it.    ** more c
34080 6f 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e  onservative than
34090 20 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20   necessary, but 
340a0 6d 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e  much easier than
340b0 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a   enforcing.    *
340c0 2a 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74  * an exact limit
340d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
340e0 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20  rse->nHeight += 
340f0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
34100 72 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20  rHeight(p);..   
34110 20 2f 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20   /* Make copies 
34120 6f 66 20 63 6f 6e 73 74 61 6e 74 20 57 48 45 52  of constant WHER
34130 45 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 20 69  E-clause terms i
34140 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
34150 79 20 64 6f 77 6e 0a 20 20 20 20 2a 2a 20 69 6e  y down.    ** in
34160 73 69 64 65 20 74 68 65 20 73 75 62 71 75 65 72  side the subquer
34170 79 2e 20 20 54 68 69 73 20 63 61 6e 20 68 65 6c  y.  This can hel
34180 70 20 74 68 65 20 73 75 62 71 75 65 72 79 20 74  p the subquery t
34190 6f 20 72 75 6e 20 6d 6f 72 65 20 65 66 66 69 63  o run more effic
341a0 69 65 6e 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20  iently..    */. 
341b0 20 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74     if( Optimizat
341c0 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
341d0 51 4c 49 54 45 5f 50 75 73 68 44 6f 77 6e 29 0a  QLITE_PushDown).
341e0 20 20 20 20 20 26 26 20 70 75 73 68 44 6f 77 6e       && pushDown
341f0 57 68 65 72 65 54 65 72 6d 73 28 70 50 61 72 73  WhereTerms(pPars
34200 65 2c 20 70 53 75 62 2c 20 70 2d 3e 70 57 68 65  e, pSub, p->pWhe
34210 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  re, pItem->iCurs
34220 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  or,.            
34230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
34240 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  pItem->fg.jointy
34250 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
34260 30 29 0a 20 20 20 20 29 7b 0a 23 69 66 20 53 45  0).    ){.#if SE
34270 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
34280 44 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  D.      if( sqli
34290 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
342a0 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 20 20   0x100 ){.      
342b0 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
342c0 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20  100,pParse,p,.  
342d0 20 20 20 20 20 20 20 20 20 20 28 22 41 66 74 65            ("Afte
342e0 72 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 70  r WHERE-clause p
342f0 75 73 68 2d 64 6f 77 6e 20 69 6e 74 6f 20 73 75  ush-down into su
34300 62 71 75 65 72 79 20 25 64 3a 5c 6e 22 2c 20 70  bquery %d:\n", p
34310 53 75 62 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20  Sub->selId));.  
34320 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
34330 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
34340 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  , 0);.      }.#e
34350 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
34360 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43        SELECTTRAC
34370 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70  E(0x100,pParse,p
34380 2c 28 22 50 75 73 68 2d 64 6f 77 6e 20 6e 6f 74  ,("Push-down not
34390 20 70 6f 73 73 69 62 6c 65 5c 6e 22 29 29 3b 0a   possible\n"));.
343a0 20 20 20 20 7d 0a 0a 20 20 20 20 7a 53 61 76 65      }..    zSave
343b0 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  dAuthContext = p
343c0 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
343d0 65 78 74 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ext;.    pParse-
343e0 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
343f0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20  pItem->zName;.. 
34400 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
34410 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ode to implement
34420 20 74 68 65 20 73 75 62 71 75 65 72 79 0a 20 20   the subquery.  
34430 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
34440 73 75 62 71 75 65 72 79 20 69 73 20 69 6d 70 6c  subquery is impl
34450 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d  emented as a co-
34460 72 6f 75 74 69 6e 65 20 69 66 20 74 68 65 20 73  routine if the s
34470 75 62 71 75 65 72 79 20 69 73 0a 20 20 20 20 2a  ubquery is.    *
34480 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  * guaranteed to 
34490 62 65 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  be the outer loo
344a0 70 20 28 73 6f 20 74 68 61 74 20 69 74 20 64 6f  p (so that it do
344b0 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
344c0 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 75 74 65  e.    ** compute
344d0 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65  d more than once
344e0 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
344f0 54 4f 44 4f 3a 20 41 72 65 20 74 68 65 72 65 20  TODO: Are there 
34500 6f 74 68 65 72 20 72 65 61 73 6f 6e 73 20 62 65  other reasons be
34510 73 69 64 65 20 28 31 29 20 74 6f 20 75 73 65 20  side (1) to use 
34520 61 20 63 6f 2d 72 6f 75 74 69 6e 65 0a 20 20 20  a co-routine.   
34530 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   ** implementati
34540 6f 6e 3f 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on?.    */.    i
34550 66 28 20 69 3d 3d 30 0a 20 20 20 20 20 26 26 20  f( i==0.     && 
34560 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d  (pTabList->nSrc=
34570 3d 31 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  =1.            |
34580 7c 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31  | (pTabList->a[1
34590 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a  ].fg.jointype&(J
345a0 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29  T_LEFT|JT_CROSS)
345b0 29 21 3d 30 29 20 20 2f 2a 20 28 31 29 20 2a 2f  )!=0)  /* (1) */
345c0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
345d0 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d   Implement a co-
345e0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
345f0 6c 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c  l return a singl
34600 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73  e row of the res
34610 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74  ult.      ** set
34620 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74   on each invocat
34630 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
34640 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 20      int addrTop 
34650 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
34660 72 65 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a 20  rentAddr(v)+1;. 
34670 20 20 20 20 0a 20 20 20 20 20 20 70 49 74 65 6d      .      pItem
34680 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  ->regReturn = ++
34690 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
346a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
346b0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74  ddOp3(v, OP_Init
346c0 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d  Coroutine, pItem
346d0 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 30 2c 20  ->regReturn, 0, 
346e0 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20  addrTop);.      
346f0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
34700 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61  "%s", pItem->pTa
34710 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
34720 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c    pItem->addrFil
34730 6c 53 75 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a  lSub = addrTop;.
34740 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
34750 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
34760 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t, SRT_Coroutine
34770 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
34780 72 6e 29 3b 0a 20 20 20 20 20 20 45 78 70 6c 61  rn);.      Expla
34790 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
347a0 72 73 65 2c 20 31 2c 20 22 43 4f 2d 52 4f 55 54  rse, 1, "CO-ROUT
347b0 49 4e 45 20 25 75 22 2c 20 70 53 75 62 2d 3e 73  INE %u", pSub->s
347c0 65 6c 49 64 29 29 3b 0a 20 20 20 20 20 20 73 71  elId));.      sq
347d0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
347e0 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
347f0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70  ;.      pItem->p
34800 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
34810 3d 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52  = pSub->nSelectR
34820 6f 77 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  ow;.      pItem-
34830 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
34840 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65   = 1;.      pIte
34850 6d 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 64  m->regResult = d
34860 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 20 20 20  est.iSdst;.     
34870 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43   sqlite3VdbeEndC
34880 6f 72 6f 75 74 69 6e 65 28 76 2c 20 70 49 74 65  oroutine(v, pIte
34890 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  m->regReturn);. 
348a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
348b0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
348c0 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 73 71  Top-1);.      sq
348d0 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65  lite3ClearTempRe
348e0 67 43 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a  gCache(pParse);.
348f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34900 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
34910 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77  ubroutine that w
34920 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68 65  ill fill an ephe
34930 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 74 68  meral table with
34940 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  .      ** the co
34950 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 73 75  ntent of this su
34960 62 71 75 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e  bquery.  pItem->
34970 61 64 64 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c  addrFillSub will
34980 20 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20   point.      ** 
34990 74 6f 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  to the address o
349a0 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  f the generated 
349b0 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 70 49 74  subroutine.  pIt
349c0 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20 20  em->regReturn.  
349d0 20 20 20 20 2a 2a 20 69 73 20 61 20 72 65 67 69      ** is a regi
349e0 73 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 74  ster allocated t
349f0 6f 20 68 6f 6c 64 20 74 68 65 20 73 75 62 72 6f  o hold the subro
34a00 75 74 69 6e 65 20 72 65 74 75 72 6e 20 61 64 64  utine return add
34a10 72 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ress.      */.  
34a20 20 20 20 20 69 6e 74 20 74 6f 70 41 64 64 72 3b      int topAddr;
34a30 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 41  .      int onceA
34a40 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ddr = 0;.      i
34a50 6e 74 20 72 65 74 41 64 64 72 3b 0a 20 20 20 20  nt retAddr;.    
34a60 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
34a70 5f 69 74 65 6d 20 2a 70 50 72 69 6f 72 3b 0a 0a  _item *pPrior;..
34a80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
34a90 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
34aa0 75 62 3d 3d 30 20 29 3b 20 2f 2a 20 54 69 63 6b  ub==0 ); /* Tick
34ab0 65 74 20 63 35 32 62 30 39 63 37 66 33 38 39 30  et c52b09c7f3890
34ac0 33 62 31 33 31 31 20 2a 2f 0a 20 20 20 20 20 20  3b1311 */.      
34ad0 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
34ae0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
34af0 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41 64 64 72  m;.      topAddr
34b00 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
34b10 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
34b20 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65  er, 0, pItem->re
34b30 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
34b40 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
34b50 75 62 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a  ub = topAddr+1;.
34b60 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
34b70 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61 74 65 64  >fg.isCorrelated
34b80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
34b90 2a 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72  * If the subquer
34ba0 79 20 69 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61  y is not correla
34bb0 74 65 64 20 61 6e 64 20 69 66 20 77 65 20 61 72  ted and if we ar
34bc0 65 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a  e not inside of.
34bd0 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69          ** a tri
34be0 67 67 65 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e  gger, then we on
34bf0 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75  ly need to compu
34c00 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  te the value of 
34c10 74 68 65 20 73 75 62 71 75 65 72 79 0a 20 20 20  the subquery.   
34c20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f       ** once. */
34c30 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 41 64 64  .        onceAdd
34c40 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
34c50 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65  ddOp0(v, OP_Once
34c60 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
34c70 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  v);.        Vdbe
34c80 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74  Comment((v, "mat
34c90 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22  erialize \"%s\""
34ca0 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
34cb0 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 65  Name));.      }e
34cc0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 56 64 62  lse{.        Vdb
34cd0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
34ce0 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c 22   "materialize \"
34cf0 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54  %s\"", pItem->pT
34d00 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ab->zName));.   
34d10 20 20 20 7d 0a 20 20 20 20 20 20 70 50 72 69 6f     }.      pPrio
34d20 72 20 3d 20 69 73 53 65 6c 66 4a 6f 69 6e 56 69  r = isSelfJoinVi
34d30 65 77 28 70 54 61 62 4c 69 73 74 2c 20 70 49 74  ew(pTabList, pIt
34d40 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  em);.      if( p
34d50 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  Prior ){.       
34d60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
34d70 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70  p2(v, OP_OpenDup
34d80 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
34d90 2c 20 70 50 72 69 6f 72 2d 3e 69 43 75 72 73 6f  , pPrior->iCurso
34da0 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  r);.        asse
34db0 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 53 65 6c  rt( pPrior->pSel
34dc0 65 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ect!=0 );.      
34dd0 20 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52    pSub->nSelectR
34de0 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 70 53 65  ow = pPrior->pSe
34df0 6c 65 63 74 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  lect->nSelectRow
34e00 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
34e10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
34e20 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
34e30 73 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62  st, SRT_EphemTab
34e40 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
34e50 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 6c 61  );.        Expla
34e60 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
34e70 72 73 65 2c 20 31 2c 20 22 4d 41 54 45 52 49 41  rse, 1, "MATERIA
34e80 4c 49 5a 45 20 25 75 22 2c 20 70 53 75 62 2d 3e  LIZE %u", pSub->
34e90 73 65 6c 49 64 29 29 3b 0a 20 20 20 20 20 20 20  selId));.       
34ea0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
34eb0 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65  Parse, pSub, &de
34ec0 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
34ed0 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e     pItem->pTab->
34ee0 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53 75  nRowLogEst = pSu
34ef0 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  b->nSelectRow;. 
34f00 20 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64 64       if( onceAdd
34f10 72 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  r ) sqlite3VdbeJ
34f20 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65 41  umpHere(v, onceA
34f30 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74 41  ddr);.      retA
34f40 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
34f50 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
34f60 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67  turn, pItem->reg
34f70 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 56  Return);.      V
34f80 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
34f90 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e  end %s", pItem->
34fa0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
34fb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
34fc0 43 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70 41  ChangeP1(v, topA
34fd0 64 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a 20  ddr, retAddr);. 
34fe0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61       sqlite3Clea
34ff0 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50  rTempRegCache(pP
35000 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  arse);.    }.   
35010 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
35020 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c  ailed ) goto sel
35030 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70 50 61  ect_end;.    pPa
35040 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20  rse->nHeight -= 
35050 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
35060 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20 20 20  rHeight(p);.    
35070 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
35080 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74  text = zSavedAut
35090 68 43 6f 6e 74 65 78 74 3b 0a 23 65 6e 64 69 66  hContext;.#endif
350a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 56 61 72 69 6f  .  }..  /* Vario
350b0 75 73 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  us elements of t
350c0 68 65 20 53 45 4c 45 43 54 20 63 6f 70 69 65 64  he SELECT copied
350d0 20 69 6e 74 6f 20 6c 6f 63 61 6c 20 76 61 72 69   into local vari
350e0 61 62 6c 65 73 20 66 6f 72 0a 20 20 2a 2a 20 63  ables for.  ** c
350f0 6f 6e 76 65 6e 69 65 6e 63 65 20 2a 2f 0a 20 20  onvenience */.  
35100 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
35110 73 74 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70  st;.  pWhere = p
35120 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f  ->pWhere;.  pGro
35130 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
35140 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20  By;.  pHaving = 
35150 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44  p->pHaving;.  sD
35160 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d  istinct.isTnct =
35170 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
35180 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b  SF_Distinct)!=0;
35190 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ..#if SELECTTRAC
351a0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
351b0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
351c0 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20  ce & 0x400 ){.  
351d0 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
351e0 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41  400,pParse,p,("A
351f0 66 74 65 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c  fter all FROM-cl
35200 61 75 73 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e  ause analysis:\n
35210 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
35220 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
35230 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , p, 0);.  }.#en
35240 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
35250 20 71 75 65 72 79 20 69 73 20 44 49 53 54 49 4e   query is DISTIN
35260 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52  CT with an ORDER
35270 20 42 59 20 62 75 74 20 69 73 20 6e 6f 74 20 61   BY but is not a
35280 6e 20 61 67 67 72 65 67 61 74 65 2c 20 61 6e 64  n aggregate, and
35290 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 73 65   .  ** if the se
352a0 6c 65 63 74 2d 6c 69 73 74 20 69 73 20 74 68 65  lect-list is the
352b0 20 73 61 6d 65 20 61 73 20 74 68 65 20 4f 52 44   same as the ORD
352c0 45 52 20 42 59 20 6c 69 73 74 2c 20 74 68 65 6e  ER BY list, then
352d0 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2a   this query.  **
352e0 20 63 61 6e 20 62 65 20 72 65 77 72 69 74 74 65   can be rewritte
352f0 6e 20 61 73 20 61 20 47 52 4f 55 50 20 42 59 2e  n as a GROUP BY.
35300 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
35310 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   this:.  **.  **
35320 20 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54       SELECT DIST
35330 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e  INCT xyz FROM ..
35340 2e 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20  . ORDER BY xyz. 
35350 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e   **.  ** is tran
35360 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a  sformed to:.  **
35370 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
35380 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52   xyz FROM ... GR
35390 4f 55 50 20 42 59 20 78 79 7a 20 4f 52 44 45 52  OUP BY xyz ORDER
353a0 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a   BY xyz.  **.  *
353b0 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  * The second for
353c0 6d 20 69 73 20 70 72 65 66 65 72 72 65 64 20 61  m is preferred a
353d0 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65 78  s a single index
353e0 20 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c 65 29   (or temp-table)
353f0 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20 75 73   may be .  ** us
35400 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20  ed for both the 
35410 4f 52 44 45 52 20 42 59 20 61 6e 64 20 44 49 53  ORDER BY and DIS
35420 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69 6e 67  TINCT processing
35430 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20  . As originally 
35440 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 68  .  ** written th
35450 65 20 71 75 65 72 79 20 6d 75 73 74 20 75 73 65  e query must use
35460 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f   a temp-table fo
35470 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  r at least one o
35480 66 20 74 68 65 20 4f 52 44 45 52 20 0a 20 20 2a  f the ORDER .  *
35490 2a 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43  * BY and DISTINC
354a0 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65 78 20  T, and an index 
354b0 6f 72 20 73 65 70 61 72 61 74 65 20 74 65 6d 70  or separate temp
354c0 2d 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6f  -table for the o
354d0 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ther..  */.  if(
354e0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
354f0 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
35500 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
35510 44 69 73 74 69 6e 63 74 20 0a 20 20 20 26 26 20  Distinct .   && 
35520 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
35530 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e 70 4f 72  ompare(sSort.pOr
35540 64 65 72 42 79 2c 20 70 45 4c 69 73 74 2c 20 2d  derBy, pEList, -
35550 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70  1)==0.  ){.    p
35560 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
35570 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20  F_Distinct;.    
35580 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
35590 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
355a0 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
355b0 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20  pEList, 0);.    
355c0 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 65  /* Notice that e
355d0 76 65 6e 20 74 68 6f 75 67 68 74 20 53 46 5f 44  ven thought SF_D
355e0 69 73 74 69 6e 63 74 20 68 61 73 20 62 65 65 6e  istinct has been
355f0 20 63 6c 65 61 72 65 64 20 66 72 6f 6d 20 70 2d   cleared from p-
35600 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20 2a  >selFlags,.    *
35610 2a 20 74 68 65 20 73 44 69 73 74 69 6e 63 74 2e  * the sDistinct.
35620 69 73 54 6e 63 74 20 69 73 20 73 74 69 6c 6c 20  isTnct is still 
35630 73 65 74 2e 20 20 48 65 6e 63 65 2c 20 69 73 54  set.  Hence, isT
35640 6e 63 74 20 72 65 70 72 65 73 65 6e 74 73 20 74  nct represents t
35650 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e  he.    ** origin
35660 61 6c 20 73 65 74 74 69 6e 67 20 6f 66 20 74 68  al setting of th
35670 65 20 53 46 5f 44 69 73 74 69 6e 63 74 20 66 6c  e SF_Distinct fl
35680 61 67 2c 20 6e 6f 74 20 74 68 65 20 63 75 72 72  ag, not the curr
35690 65 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20  ent setting */. 
356a0 20 20 20 61 73 73 65 72 74 28 20 73 44 69 73 74     assert( sDist
356b0 69 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b 0a 0a  inct.isTnct );..
356c0 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
356d0 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20  ENABLED.    if( 
356e0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
356f0 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20  ce & 0x400 ){.  
35700 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
35710 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28  0x400,pParse,p,(
35720 22 54 72 61 6e 73 66 6f 72 6d 20 44 49 53 54 49  "Transform DISTI
35730 4e 43 54 20 69 6e 74 6f 20 47 52 4f 55 50 20 42  NCT into GROUP B
35740 59 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 73  Y:\n"));.      s
35750 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
35760 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
35770 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
35780 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
35790 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
357a0 61 75 73 65 2c 20 74 68 65 6e 20 63 72 65 61 74  ause, then creat
357b0 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69  e an ephemeral i
357c0 6e 64 65 78 20 74 6f 0a 20 20 2a 2a 20 64 6f 20  ndex to.  ** do 
357d0 74 68 65 20 73 6f 72 74 69 6e 67 2e 20 20 42 75  the sorting.  Bu
357e0 74 20 74 68 69 73 20 73 6f 72 74 69 6e 67 20 65  t this sorting e
357f0 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 6d  phemeral index m
35800 69 67 68 74 20 65 6e 64 20 75 70 0a 20 20 2a 2a  ight end up.  **
35810 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20 69 66   being unused if
35820 20 74 68 65 20 64 61 74 61 20 63 61 6e 20 62 65   the data can be
35830 20 65 78 74 72 61 63 74 65 64 20 69 6e 20 70 72   extracted in pr
35840 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 0a  e-sorted order..
35850 20 20 2a 2a 20 49 66 20 74 68 61 74 20 69 73 20    ** If that is 
35860 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74  the case, then t
35870 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
35880 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
35890 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 63 68 61  will be.  ** cha
358a0 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f  nged to an OP_No
358b0 6f 70 20 6f 6e 63 65 20 77 65 20 66 69 67 75 72  op once we figur
358c0 65 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 73  e out that the s
358d0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73 0a  orting index is.
358e0 20 20 2a 2a 20 6e 6f 74 20 6e 65 65 64 65 64 2e    ** not needed.
358f0 20 20 54 68 65 20 73 53 6f 72 74 2e 61 64 64 72    The sSort.addr
35900 53 6f 72 74 49 6e 64 65 78 20 76 61 72 69 61 62  SortIndex variab
35910 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 66 61  le is used to fa
35920 63 69 6c 69 74 61 74 65 0a 20 20 2a 2a 20 74 68  cilitate.  ** th
35930 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a  at change..  */.
35940 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64    if( sSort.pOrd
35950 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49  erBy ){.    KeyI
35960 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
35970 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
35980 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d  lite3KeyInfoFrom
35990 45 78 70 72 4c 69 73 74 28 0a 20 20 20 20 20 20  ExprList(.      
359a0 20 20 70 50 61 72 73 65 2c 20 73 53 6f 72 74 2e    pParse, sSort.
359b0 70 4f 72 64 65 72 42 79 2c 20 30 2c 20 70 45 4c  pOrderBy, 0, pEL
359c0 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
359d0 20 73 53 6f 72 74 2e 69 45 43 75 72 73 6f 72 20   sSort.iECursor 
359e0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
359f0 3b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72  ;.    sSort.addr
35a00 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20  SortIndex =.    
35a10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
35a20 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
35a30 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20  hemeral,.       
35a40 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73 6f     sSort.iECurso
35a50 72 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  r, sSort.pOrderB
35a60 79 2d 3e 6e 45 78 70 72 2b 31 2b 70 45 4c 69 73  y->nExpr+1+pELis
35a70 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a 20 20 20  t->nExpr, 0,.   
35a80 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
35a90 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
35aa0 46 4f 0a 20 20 20 20 20 20 29 3b 0a 20 20 7d 65  FO.      );.  }e
35ab0 6c 73 65 7b 0a 20 20 20 20 73 53 6f 72 74 2e 61  lse{.    sSort.a
35ac0 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d  ddrSortIndex = -
35ad0 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
35ae0 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64 65  the output is de
35af0 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d  stined for a tem
35b00 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70  porary table, op
35b10 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20  en that table.. 
35b20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d   */.  if( pDest-
35b30 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65  >eDest==SRT_Ephe
35b40 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  mTab ){.    sqli
35b50 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
35b60 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
35b70 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  l, pDest->iSDPar
35b80 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  m, pEList->nExpr
35b90 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  );.  }..  /* Set
35ba0 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20   the limiter..  
35bb0 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c 69  */.  iEnd = sqli
35bc0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
35bd0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
35be0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
35bf0 46 5f 46 69 78 65 64 4c 69 6d 69 74 29 3d 3d 30  F_FixedLimit)==0
35c00 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65   ){.    p->nSele
35c10 63 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a  ctRow = 320;  /*
35c20 20 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20   4 billion rows 
35c30 2a 2f 0a 20 20 7d 0a 20 20 63 6f 6d 70 75 74 65  */.  }.  compute
35c40 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
35c50 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b  Parse, p, iEnd);
35c60 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
35c70 3d 3d 30 20 26 26 20 73 53 6f 72 74 2e 61 64 64  ==0 && sSort.add
35c80 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b  rSortIndex>=0 ){
35c90 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
35ca0 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20  ChangeOpcode(v, 
35cb0 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
35cc0 64 65 78 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70  dex, OP_SorterOp
35cd0 65 6e 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73  en);.    sSort.s
35ce0 6f 72 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54  ortFlags |= SORT
35cf0 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a  FLAG_UseSorter;.
35d00 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61    }..  /* Open a
35d10 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65  n ephemeral inde
35d20 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  x to use for the
35d30 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20   distinct set.. 
35d40 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
35d50 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
35d60 6e 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74  nct ){.    sDist
35d70 69 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70  inct.tabTnct = p
35d80 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
35d90 20 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64     sDistinct.add
35da0 72 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56  rTnct = sqlite3V
35db0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
35dc0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20  OpenEphemeral,. 
35dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35de0 20 20 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e        sDistinct.
35df0 74 61 62 54 6e 63 74 2c 20 30 2c 20 30 2c 0a 20  tabTnct, 0, 0,. 
35e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e10 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c        (char*)sql
35e20 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45  ite3KeyInfoFromE
35e30 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
35e40 70 2d 3e 70 45 4c 69 73 74 2c 30 2c 30 29 2c 0a  p->pEList,0,0),.
35e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e60 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46         P4_KEYINF
35e70 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  O);.    sqlite3V
35e80 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42  dbeChangeP5(v, B
35e90 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b  TREE_UNORDERED);
35ea0 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65  .    sDistinct.e
35eb0 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52 45  TnctType = WHERE
35ec0 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45  _DISTINCT_UNORDE
35ed0 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  RED;.  }else{.  
35ee0 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63    sDistinct.eTnc
35ef0 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49  tType = WHERE_DI
35f00 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d  STINCT_NOOP;.  }
35f10 0a 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 26  ..  if( !isAgg &
35f20 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b  & pGroupBy==0 ){
35f30 0a 20 20 20 20 2f 2a 20 4e 6f 20 61 67 67 72 65  .    /* No aggre
35f40 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  gate functions a
35f50 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63  nd no GROUP BY c
35f60 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 75 31 36  lause */.    u16
35f70 20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 28 73   wctrlFlags = (s
35f80 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
35f90 3f 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  ? WHERE_WANT_DIS
35fa0 54 49 4e 43 54 20 3a 20 30 29 0a 20 20 20 20 20  TINCT : 0).     
35fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
35fc0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
35fd0 46 5f 46 69 78 65 64 4c 69 6d 69 74 29 3b 0a 23  F_FixedLimit);.#
35fe0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
35ff0 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20  IT_WINDOWFUNC.  
36000 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 20 3d    Window *pWin =
36010 20 70 2d 3e 70 57 69 6e 3b 20 20 20 20 20 20 2f   p->pWin;      /
36020 2a 20 4d 61 73 74 65 72 20 77 69 6e 64 6f 77 20  * Master window 
36030 6f 62 6a 65 63 74 20 28 6f 72 20 4e 55 4c 4c 29  object (or NULL)
36040 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 69 6e   */.    if( pWin
36050 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
36060 33 57 69 6e 64 6f 77 43 6f 64 65 49 6e 69 74 28  3WindowCodeInit(
36070 70 50 61 72 73 65 2c 20 70 57 69 6e 29 3b 0a 20  pParse, pWin);. 
36080 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
36090 61 73 73 65 72 74 28 20 57 48 45 52 45 5f 55 53  assert( WHERE_US
360a0 45 5f 4c 49 4d 49 54 3d 3d 53 46 5f 46 69 78 65  E_LIMIT==SF_Fixe
360b0 64 4c 69 6d 69 74 20 29 3b 0a 0a 0a 20 20 20 20  dLimit );...    
360c0 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74  /* Begin the dat
360d0 61 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20  abase scan. */. 
360e0 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31     SELECTTRACE(1
360f0 2c 70 50 61 72 73 65 2c 70 2c 28 22 57 68 65 72  ,pParse,p,("Wher
36100 65 42 65 67 69 6e 5c 6e 22 29 29 3b 0a 20 20 20  eBegin\n"));.   
36110 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
36120 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
36130 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
36140 68 65 72 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64  here, sSort.pOrd
36150 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20  erBy,.          
36160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36170 20 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 2c 20       p->pEList, 
36180 77 63 74 72 6c 46 6c 61 67 73 2c 20 70 2d 3e 6e  wctrlFlags, p->n
36190 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20  SelectRow);.    
361a0 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
361b0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
361c0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
361d0 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f  WhereOutputRowCo
361e0 75 6e 74 28 70 57 49 6e 66 6f 29 20 3c 20 70 2d  unt(pWInfo) < p-
361f0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20  >nSelectRow ){. 
36200 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
36210 6f 77 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  ow = sqlite3Wher
36220 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28  eOutputRowCount(
36230 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20  pWInfo);.    }. 
36240 20 20 20 69 66 28 20 73 44 69 73 74 69 6e 63 74     if( sDistinct
36250 2e 69 73 54 6e 63 74 20 26 26 20 73 71 6c 69 74  .isTnct && sqlit
36260 65 33 57 68 65 72 65 49 73 44 69 73 74 69 6e 63  e3WhereIsDistinc
36270 74 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20  t(pWInfo) ){.   
36280 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e     sDistinct.eTn
36290 63 74 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33  ctType = sqlite3
362a0 57 68 65 72 65 49 73 44 69 73 74 69 6e 63 74 28  WhereIsDistinct(
362b0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20  pWInfo);.    }. 
362c0 20 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72     if( sSort.pOr
362d0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73  derBy ){.      s
362e0 53 6f 72 74 2e 6e 4f 42 53 61 74 20 3d 20 73 71  Sort.nOBSat = sq
362f0 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65  lite3WhereIsOrde
36300 72 65 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  red(pWInfo);.   
36310 20 20 20 73 53 6f 72 74 2e 6c 61 62 65 6c 4f 42     sSort.labelOB
36320 4c 6f 70 74 20 3d 20 73 71 6c 69 74 65 33 57 68  Lopt = sqlite3Wh
36330 65 72 65 4f 72 64 65 72 42 79 4c 69 6d 69 74 4f  ereOrderByLimitO
36340 70 74 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 3b  ptLabel(pWInfo);
36350 0a 20 20 20 20 20 20 69 66 28 20 73 53 6f 72 74  .      if( sSort
36360 2e 6e 4f 42 53 61 74 3d 3d 73 53 6f 72 74 2e 70  .nOBSat==sSort.p
36370 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29  OrderBy->nExpr )
36380 7b 0a 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e  {.        sSort.
36390 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
363a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
363b0 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20 69   /* If sorting i
363c0 6e 64 65 78 20 74 68 61 74 20 77 61 73 20 63 72  ndex that was cr
363d0 65 61 74 65 64 20 62 79 20 61 20 70 72 69 6f 72  eated by a prior
363e0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
363f0 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75  l .    ** instru
36400 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e  ction ended up n
36410 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64 2c  ot being needed,
36420 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65   then change the
36430 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
36440 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e  l.    ** into an
36450 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f   OP_Noop..    */
36460 0a 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e 61  .    if( sSort.a
36470 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20  ddrSortIndex>=0 
36480 26 26 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  && sSort.pOrderB
36490 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  y==0 ){.      sq
364a0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
364b0 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61  oNoop(v, sSort.a
364c0 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20  ddrSortIndex);. 
364d0 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
364e0 28 20 70 2d 3e 70 45 4c 69 73 74 3d 3d 70 45 4c  ( p->pEList==pEL
364f0 69 73 74 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  ist );.#ifndef S
36500 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
36510 57 46 55 4e 43 0a 20 20 20 20 69 66 28 20 70 57  WFUNC.    if( pW
36520 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  in ){.      int 
36530 61 64 64 72 47 6f 73 75 62 20 3d 20 73 71 6c 69  addrGosub = sqli
36540 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
36550 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
36560 69 6e 74 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69  int iCont = sqli
36570 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
36580 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
36590 69 6e 74 20 69 42 72 65 61 6b 20 3d 20 73 71 6c  int iBreak = sql
365a0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
365b0 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
365c0 20 69 6e 74 20 72 65 67 47 6f 73 75 62 20 3d 20   int regGosub = 
365d0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
365e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 69  .      sqlite3Wi
365f0 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 70 50 61  ndowCodeStep(pPa
36600 72 73 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c 20  rse, p, pWInfo, 
36610 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f  regGosub, addrGo
36620 73 75 62 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  sub);..      sql
36630 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
36640 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42  , OP_Goto, 0, iB
36650 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
36660 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
36670 61 62 65 6c 28 76 2c 20 61 64 64 72 47 6f 73 75  abel(v, addrGosu
36680 62 29 3b 0a 20 20 20 20 20 20 56 64 62 65 4e 6f  b);.      VdbeNo
36690 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  opComment((v, "i
366a0 6e 6e 65 72 2d 6c 6f 6f 70 20 73 75 62 72 6f 75  nner-loop subrou
366b0 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 20 20 73  tine"));.      s
366c0 53 6f 72 74 2e 6c 61 62 65 6c 4f 42 4c 6f 70 74  Sort.labelOBLopt
366d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 65 6c 65   = 0;.      sele
366e0 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
366f0 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73 53 6f 72  se, p, -1, &sSor
36700 74 2c 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70  t, &sDistinct, p
36710 44 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72  Dest, iCont, iBr
36720 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
36730 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
36740 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
36750 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
36760 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
36770 75 72 6e 2c 20 72 65 67 47 6f 73 75 62 29 3b 0a  urn, regGosub);.
36780 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
36790 74 28 28 76 2c 20 22 65 6e 64 20 69 6e 6e 65 72  t((v, "end inner
367a0 2d 6c 6f 6f 70 20 73 75 62 72 6f 75 74 69 6e 65  -loop subroutine
367b0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
367c0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
367d0 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
367e0 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20     }else.#endif 
367f0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
36800 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 20 20 20  INDOWFUNC */.   
36810 20 7b 0a 20 20 20 20 20 20 2f 2a 20 55 73 65 20   {.      /* Use 
36820 74 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e  the standard inn
36830 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20  er loop. */.    
36840 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
36850 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c  p(pParse, p, -1,
36860 20 26 73 53 6f 72 74 2c 20 26 73 44 69 73 74 69   &sSort, &sDisti
36870 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20  nct, pDest,.    
36880 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
36890 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28  reContinueLabel(
368a0 70 57 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20  pWInfo),.       
368b0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42     sqlite3WhereB
368c0 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f  reakLabel(pWInfo
368d0 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e  ));..      /* En
368e0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
368f0 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 20  can loop..      
36900 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
36910 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
36920 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
36930 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73  .    /* This cas
36940 65 20 77 68 65 6e 20 74 68 65 72 65 20 65 78 69  e when there exi
36950 73 74 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  st aggregate fun
36960 63 74 69 6f 6e 73 20 6f 72 20 61 20 47 52 4f 55  ctions or a GROU
36970 50 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20  P BY clause.    
36980 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a 20 20  ** or both */.  
36990 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
369a0 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  C;    /* Name co
369b0 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73  ntext for proces
369c0 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 20 69  sing aggregate i
369d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
369e0 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20    int iAMem;    
369f0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
36a00 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 73  em address for s
36a10 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47  toring current G
36a20 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69  ROUP BY */.    i
36a30 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20  nt iBMem;       
36a40 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
36a50 61 64 64 72 65 73 73 20 66 6f 72 20 70 72 65 76  address for prev
36a60 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f  ious GROUP BY */
36a70 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61  .    int iUseFla
36a80 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20  g;       /* Mem 
36a90 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20  address holding 
36aa0 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20  flag indicating 
36ab0 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20  that at least.  
36ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36ad0 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77        ** one row
36ae0 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f   of the input to
36af0 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 20   the aggregator 
36b00 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20  has been.       
36b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f   ** processed */
36b30 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46  .    int iAbortF
36b40 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20  lag;     /* Mem 
36b50 61 64 64 72 65 73 73 20 77 68 69 63 68 20 63 61  address which ca
36b60 75 73 65 73 20 71 75 65 72 79 20 61 62 6f 72 74  uses query abort
36b70 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a   if positive */.
36b80 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53      int groupByS
36b90 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20  ort;    /* Rows 
36ba0 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65  come from source
36bb0 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64   in GROUP BY ord
36bc0 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  er */.    int ad
36bd0 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a  drEnd;        /*
36be0 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73 69   End of processi
36bf0 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45  ng for this SELE
36c00 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f  CT */.    int so
36c10 72 74 50 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a  rtPTab = 0;   /*
36c20 20 50 73 65 75 64 6f 74 61 62 6c 65 20 75 73 65   Pseudotable use
36c30 64 20 74 6f 20 64 65 63 6f 64 65 20 73 6f 72 74  d to decode sort
36c40 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ing results */. 
36c50 20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74 20 3d     int sortOut =
36c60 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70 75 74   0;    /* Output
36c70 20 72 65 67 69 73 74 65 72 20 66 72 6f 6d 20 74   register from t
36c80 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20  he sorter */.   
36c90 20 69 6e 74 20 6f 72 64 65 72 42 79 47 72 70 20   int orderByGrp 
36ca0 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69 66 20  = 0; /* True if 
36cb0 74 68 65 20 47 52 4f 55 50 20 42 59 20 61 6e 64  the GROUP BY and
36cc0 20 4f 52 44 45 52 20 42 59 20 61 72 65 20 74 68   ORDER BY are th
36cd0 65 20 73 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 2f  e same */..    /
36ce0 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64  * Remove any and
36cf0 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62 65 74   all aliases bet
36d00 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  ween the result 
36d10 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20 20 20  set and the.    
36d20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  ** GROUP BY clau
36d30 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
36d40 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
36d50 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20       int k;     
36d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d70 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
36d80 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75  er */.      stru
36d90 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
36da0 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72   *pItem;  /* For
36db0 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78   looping over ex
36dc0 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69  pression in a li
36dd0 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72  st */..      for
36de0 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  (k=p->pEList->nE
36df0 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45  xpr, pItem=p->pE
36e00 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d  List->a; k>0; k-
36e10 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
36e20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e       pItem->u.x.
36e30 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20  iAlias = 0;.    
36e40 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d    }.      for(k=
36e50 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c  pGroupBy->nExpr,
36e60 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d   pItem=pGroupBy-
36e70 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49  >a; k>0; k--, pI
36e80 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
36e90 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61  pItem->u.x.iAlia
36ea0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 0;.      }. 
36eb0 20 20 20 20 20 61 73 73 65 72 74 28 20 36 36 3d       assert( 66=
36ec0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
36ed0 30 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  00) );.      if(
36ee0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 36   p->nSelectRow>6
36ef0 36 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  6 ) p->nSelectRo
36f00 77 20 3d 20 36 36 3b 0a 20 20 20 20 7d 65 6c 73  w = 66;.    }els
36f10 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
36f20 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73   0==sqlite3LogEs
36f30 74 28 31 29 20 29 3b 0a 20 20 20 20 20 20 70 2d  t(1) );.      p-
36f40 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b  >nSelectRow = 0;
36f50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
36f60 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68 20  f there is both 
36f70 61 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 61  a GROUP BY and a
36f80 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
36f90 65 20 61 6e 64 20 74 68 65 79 20 61 72 65 0a 20  e and they are. 
36fa0 20 20 20 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c     ** identical,
36fb0 20 74 68 65 6e 20 69 74 20 6d 61 79 20 62 65 20   then it may be 
36fc0 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 69 73 61  possible to disa
36fd0 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ble the ORDER BY
36fe0 20 63 6c 61 75 73 65 20 0a 20 20 20 20 2a 2a 20   clause .    ** 
36ff0 6f 6e 20 74 68 65 20 67 72 6f 75 6e 64 73 20 74  on the grounds t
37000 68 61 74 20 74 68 65 20 47 52 4f 55 50 20 42 59  hat the GROUP BY
37010 20 77 69 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d   will cause elem
37020 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74  ents to come out
37030 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20   .    ** in the 
37040 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2e 20 49  correct order. I
37050 74 20 61 6c 73 6f 20 6d 61 79 20 6e 6f 74 20 2d  t also may not -
37060 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 6d 69   the GROUP BY mi
37070 67 68 74 20 75 73 65 20 61 0a 20 20 20 20 2a 2a  ght use a.    **
37080 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
37090 74 68 61 74 20 63 61 75 73 65 73 20 72 6f 77 73  that causes rows
370a0 20 74 6f 20 62 65 20 67 72 6f 75 70 65 64 20 74   to be grouped t
370b0 6f 67 65 74 68 65 72 20 61 73 20 72 65 71 75 69  ogether as requi
370c0 72 65 64 0a 20 20 20 20 2a 2a 20 62 75 74 20 6e  red.    ** but n
370d0 6f 74 20 61 63 74 75 61 6c 6c 79 20 73 6f 72 74  ot actually sort
370e0 65 64 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20  ed. Either way, 
370f0 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  record the fact 
37100 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  that the.    ** 
37110 4f 52 44 45 52 20 42 59 20 61 6e 64 20 47 52 4f  ORDER BY and GRO
37120 55 50 20 42 59 20 63 6c 61 75 73 65 73 20 61 72  UP BY clauses ar
37130 65 20 74 68 65 20 73 61 6d 65 20 62 79 20 73 65  e the same by se
37140 74 74 69 6e 67 20 74 68 65 20 6f 72 64 65 72 42  tting the orderB
37150 79 47 72 70 0a 20 20 20 20 2a 2a 20 76 61 72 69  yGrp.    ** vari
37160 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  able.  */.    if
37170 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  ( sqlite3ExprLis
37180 74 43 6f 6d 70 61 72 65 28 70 47 72 6f 75 70 42  tCompare(pGroupB
37190 79 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  y, sSort.pOrderB
371a0 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20  y, -1)==0 ){.   
371b0 20 20 20 6f 72 64 65 72 42 79 47 72 70 20 3d 20     orderByGrp = 
371c0 31 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f  1;.    }. .    /
371d0 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62 65 6c  * Create a label
371e0 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e   to jump to when
371f0 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62 6f 72   we want to abor
37200 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20  t the query */. 
37210 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71 6c     addrEnd = sql
37220 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
37230 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20  l(pParse);..    
37240 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f  /* Convert TK_CO
37250 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20  LUMN nodes into 
37260 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e  TK_AGG_COLUMN an
37270 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69  d make entries i
37280 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66  n.    ** sAggInf
37290 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47  o for all TK_AGG
372a0 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20  _FUNCTION nodes 
372b0 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  in expressions o
372c0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c  f the.    ** SEL
372d0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  ECT statement.. 
372e0 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74     */.    memset
372f0 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sNC, 0, sizeof
37300 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e  (sNC));.    sNC.
37310 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
37320 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  .    sNC.pSrcLis
37330 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
37340 20 20 73 4e 43 2e 75 4e 43 2e 70 41 67 67 49 6e    sNC.uNC.pAggIn
37350 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a  fo = &sAggInfo;.
37360 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 73 4e      VVA_ONLY( sN
37370 43 2e 6e 63 46 6c 61 67 73 20 3d 20 4e 43 5f 55  C.ncFlags = NC_U
37380 41 67 67 49 6e 66 6f 3b 20 29 0a 20 20 20 20 73  AggInfo; ).    s
37390 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20  AggInfo.mnReg = 
373a0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
373b0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f      sAggInfo.nSo
373c0 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47  rtingColumn = pG
373d0 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42  roupBy ? pGroupB
373e0 79 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20  y->nExpr : 0;.  
373f0 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75    sAggInfo.pGrou
37400 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
37410 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
37420 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
37430 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  NC, pEList);.   
37440 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
37450 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
37460 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 29   sSort.pOrderBy)
37470 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e  ;.    if( pHavin
37480 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  g ){.      if( p
37490 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
374a0 20 20 20 61 73 73 65 72 74 28 20 70 57 68 65 72     assert( pWher
374b0 65 3d 3d 70 2d 3e 70 57 68 65 72 65 20 29 3b 0a  e==p->pWhere );.
374c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
374d0 70 48 61 76 69 6e 67 3d 3d 70 2d 3e 70 48 61 76  pHaving==p->pHav
374e0 69 6e 67 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ing );.        a
374f0 73 73 65 72 74 28 20 70 47 72 6f 75 70 42 79 3d  ssert( pGroupBy=
37500 3d 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a  =p->pGroupBy );.
37510 20 20 20 20 20 20 20 20 68 61 76 69 6e 67 54 6f          havingTo
37520 57 68 65 72 65 28 70 50 61 72 73 65 2c 20 70 29  Where(pParse, p)
37530 3b 0a 20 20 20 20 20 20 20 20 70 57 68 65 72 65  ;.        pWhere
37540 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
37550 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
37560 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
37570 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70  gregates(&sNC, p
37580 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20  Having);.    }. 
37590 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63     sAggInfo.nAcc
375a0 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49  umulator = sAggI
375b0 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  nfo.nColumn;.   
375c0 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79   if( p->pGroupBy
375d0 3d 3d 30 20 26 26 20 70 2d 3e 70 48 61 76 69 6e  ==0 && p->pHavin
375e0 67 3d 3d 30 20 26 26 20 73 41 67 67 49 6e 66 6f  g==0 && sAggInfo
375f0 2e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20  .nFunc==1 ){.   
37600 20 20 20 6d 69 6e 4d 61 78 46 6c 61 67 20 3d 20     minMaxFlag = 
37610 6d 69 6e 4d 61 78 51 75 65 72 79 28 64 62 2c 20  minMaxQuery(db, 
37620 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30  sAggInfo.aFunc[0
37630 5d 2e 70 45 78 70 72 2c 20 26 70 4d 69 6e 4d 61  ].pExpr, &pMinMa
37640 78 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 7d  xOrderBy);.    }
37650 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 69 6e 4d  else{.      minM
37660 61 78 46 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f  axFlag = WHERE_O
37670 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20  RDERBY_NORMAL;. 
37680 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
37690 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75  ; i<sAggInfo.nFu
376a0 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nc; i++){.      
376b0 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 73 41  Expr *pExpr = sA
376c0 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e  ggInfo.aFunc[i].
376d0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
376e0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
376f0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
37700 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
37710 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20      sNC.ncFlags 
37720 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b  |= NC_InAggFunc;
37730 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
37740 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
37750 28 26 73 4e 43 2c 20 70 45 78 70 72 2d 3e 78 2e  (&sNC, pExpr->x.
37760 70 4c 69 73 74 29 3b 0a 23 69 66 6e 64 65 66 20  pList);.#ifndef 
37770 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
37780 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 61 73 73  OWFUNC.      ass
37790 65 72 74 28 20 21 49 73 57 69 6e 64 6f 77 46 75  ert( !IsWindowFu
377a0 6e 63 28 70 45 78 70 72 29 20 29 3b 0a 20 20 20  nc(pExpr) );.   
377b0 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
377c0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
377d0 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20  _WinFunc) ){.   
377e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
377f0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
37800 73 28 26 73 4e 43 2c 20 70 45 78 70 72 2d 3e 79  s(&sNC, pExpr->y
37810 2e 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 29 3b  .pWin->pFilter);
37820 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
37830 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67        sNC.ncFlag
37840 73 20 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75  s &= ~NC_InAggFu
37850 6e 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41  nc;.    }.    sA
37860 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 3d 20 70  ggInfo.mxReg = p
37870 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
37880 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
37890 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c  ailed ) goto sel
378a0 65 63 74 5f 65 6e 64 3b 0a 23 69 66 20 53 45 4c  ect_end;.#if SEL
378b0 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
378c0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
378d0 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78  SelectTrace & 0x
378e0 34 30 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  400 ){.      int
378f0 20 69 69 3b 0a 20 20 20 20 20 20 53 45 4c 45 43   ii;.      SELEC
37900 54 54 52 41 43 45 28 30 78 34 30 30 2c 70 50 61  TTRACE(0x400,pPa
37910 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 61 67  rse,p,("After ag
37920 67 72 65 67 61 74 65 20 61 6e 61 6c 79 73 69 73  gregate analysis
37930 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 73 71  :\n"));.      sq
37940 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
37950 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
37960 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
37970 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d  <sAggInfo.nColum
37980 6e 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  n; ii++){.      
37990 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
379a0 69 6e 74 66 28 22 61 67 67 2d 63 6f 6c 75 6d 6e  intf("agg-column
379b0 5b 25 64 5d 20 69 4d 65 6d 3d 25 64 5c 6e 22 2c  [%d] iMem=%d\n",
379c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 69 2c  .            ii,
379d0 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69   sAggInfo.aCol[i
379e0 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  i].iMem);.      
379f0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
37a00 77 45 78 70 72 28 30 2c 20 73 41 67 67 49 6e 66  wExpr(0, sAggInf
37a10 6f 2e 61 43 6f 6c 5b 69 69 5d 2e 70 45 78 70 72  o.aCol[ii].pExpr
37a20 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
37a30 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
37a40 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b  <sAggInfo.nFunc;
37a50 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
37a60 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
37a70 74 66 28 22 61 67 67 2d 66 75 6e 63 5b 25 64 5d  tf("agg-func[%d]
37a80 3a 20 69 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20  : iMem=%d\n",.  
37a90 20 20 20 20 20 20 20 20 20 20 69 69 2c 20 73 41            ii, sA
37aa0 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 69 5d  ggInfo.aFunc[ii]
37ab0 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20  .iMem);.        
37ac0 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45  sqlite3TreeViewE
37ad0 78 70 72 28 30 2c 20 73 41 67 67 49 6e 66 6f 2e  xpr(0, sAggInfo.
37ae0 61 46 75 6e 63 5b 69 69 5d 2e 70 45 78 70 72 2c  aFunc[ii].pExpr,
37af0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
37b00 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 20 20   }.#endif...    
37b10 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f  /* Processing fo
37b20 72 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74  r aggregates wit
37b30 68 20 47 52 4f 55 50 20 42 59 20 69 73 20 76 65  h GROUP BY is ve
37b40 72 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64  ry different and
37b50 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72  .    ** much mor
37b60 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61  e complex than a
37b70 67 67 72 65 67 61 74 65 73 20 77 69 74 68 6f 75  ggregates withou
37b80 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20  t a GROUP BY..  
37b90 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72    */.    if( pGr
37ba0 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b  oupBy ){.      K
37bb0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
37bc0 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66  ;  /* Keying inf
37bd0 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
37be0 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65   group by clause
37bf0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
37c00 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  dr1;          /*
37c10 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69 73   A-vs-B comparis
37c20 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20  ion jump */.    
37c30 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74    int addrOutput
37c40 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f  Row;  /* Start o
37c50 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  f subroutine tha
37c60 74 20 6f 75 74 70 75 74 73 20 61 20 72 65 73 75  t outputs a resu
37c70 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20  lt row */.      
37c80 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77  int regOutputRow
37c90 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64  ;   /* Return ad
37ca0 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
37cb0 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  or output subrou
37cc0 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tine */.      in
37cd0 74 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20  t addrSetAbort; 
37ce0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f    /* Set the abo
37cf0 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75  rt flag and retu
37d00 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  rn */.      int 
37d10 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20  addrTopOfLoop;  
37d20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e  /* Top of the in
37d30 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  put loop */.    
37d40 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e    int addrSortin
37d50 67 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f  gIdx; /* The OP_
37d60 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f  OpenEphemeral fo
37d70 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  r the sorting in
37d80 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  dex */.      int
37d90 20 61 64 64 72 52 65 73 65 74 3b 20 20 20 20 20   addrReset;     
37da0 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66   /* Subroutine f
37db0 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65  or resetting the
37dc0 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a   accumulator */.
37dd0 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 73        int regRes
37de0 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74  et;       /* Ret
37df0 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69  urn address regi
37e00 73 74 65 72 20 66 6f 72 20 72 65 73 65 74 20 73  ster for reset s
37e10 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20  ubroutine */..  
37e20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
37e30 69 73 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c  is a GROUP BY cl
37e40 61 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65  ause we might ne
37e50 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  ed a sorting ind
37e60 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69  ex to.      ** i
37e70 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c  mplement it.  Al
37e80 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72 74  locate that sort
37e90 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20  ing index now.  
37ea0 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a  If it turns out.
37eb0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65        ** that we
37ec0 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20   do not need it 
37ed0 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f  after all, the O
37ee0 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73  P_SorterOpen ins
37ef0 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  truction.      *
37f00 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72  * will be conver
37f10 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e  ted into a Noop.
37f20 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20    .      */.    
37f30 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
37f40 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e  ngIdx = pParse->
37f50 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b  nTab++;.      pK
37f60 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
37f70 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  KeyInfoFromExprL
37f80 69 73 74 28 70 50 61 72 73 65 2c 70 47 72 6f 75  ist(pParse,pGrou
37f90 70 42 79 2c 30 2c 73 41 67 67 49 6e 66 6f 2e 6e  pBy,0,sAggInfo.n
37fa0 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 61  Column);.      a
37fb0 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 20  ddrSortingIdx = 
37fc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
37fd0 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70  4(v, OP_SorterOp
37fe0 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  en, .          s
37ff0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
38000 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f  dx, sAggInfo.nSo
38010 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20  rtingColumn, .  
38020 20 20 20 20 20 20 20 20 30 2c 20 28 63 68 61 72          0, (char
38030 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
38040 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20 20 20 20  EYINFO);..      
38050 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65  /* Initialize me
38060 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75  mory locations u
38070 73 65 64 20 62 79 20 47 52 4f 55 50 20 42 59 20  sed by GROUP BY 
38080 61 67 67 72 65 67 61 74 65 20 70 72 6f 63 65 73  aggregate proces
38090 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sing.      */.  
380a0 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b      iUseFlag = +
380b0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
380c0 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20       iAbortFlag 
380d0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
380e0 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74 70 75  ;.      regOutpu
380f0 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d  tRow = ++pParse-
38100 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64  >nMem;.      add
38110 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c  rOutputRow = sql
38120 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
38130 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
38140 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50   regReset = ++pP
38150 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
38160 20 20 61 64 64 72 52 65 73 65 74 20 3d 20 73 71    addrReset = sq
38170 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
38180 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
38190 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65    iAMem = pParse
381a0 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20  ->nMem + 1;.    
381b0 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
381c0 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
381d0 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d  r;.      iBMem =
381e0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
381f0 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  1;.      pParse-
38200 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42  >nMem += pGroupB
38210 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
38220 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
38230 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
38240 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   0, iAbortFlag);
38250 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
38260 6e 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62  nt((v, "clear ab
38270 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
38280 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
38290 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp3(v, OP_Null,
382a0 20 30 2c 20 69 41 4d 65 6d 2c 20 69 41 4d 65 6d   0, iAMem, iAMem
382b0 2b 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  +pGroupBy->nExpr
382c0 2d 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42  -1);..      /* B
382d0 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74  egin a loop that
382e0 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 61 6c   will extract al
382f0 6c 20 73 6f 75 72 63 65 20 72 6f 77 73 20 69 6e  l source rows in
38300 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 2e   GROUP BY order.
38310 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d  .      ** This m
38320 69 67 68 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f  ight involve two
38330 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 70 73 20   separate loops 
38340 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20  with an OP_Sort 
38350 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20  in between, or. 
38360 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74       ** it might
38370 20 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f   be a single loo