/ Hex Artifact Content
Login

Artifact e6ac5358179fd7f9e5b7e5fc8b42155abf40511296e9b97cb943b9b30c865361:


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 46 6c 61 67 73 2c 20 30  I->aSortFlags, 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 46 6c 61 67 73     p->aSortFlags
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 46 6c 61 67 73 5b 69 2d 69 53 74  aSortFlags[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 46 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20  rtFlags;.    }. 
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 73 77 69  List!=0 );.  swi
e6d0: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
e6e0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  {.    case TK_CO
e6f0: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LUMN: {.      /*
e700: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
e710: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63  is a column. Loc
e720: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68  ate the table th
e730: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e  e column is bein
e740: 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61  g.      ** extra
e750: 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d  cted from in Nam
e760: 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73  eContext.pSrcLis
e770: 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61  t. This table ma
e780: 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20  y be real.      
e790: 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  ** database tabl
e7a0: 65 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e  e or a subquery.
e7b0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
e7c0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
e7d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e7e0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63  able structure c
e7f0: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
e800: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
e810: 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b   Select *pS = 0;
e820: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e830: 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d  Select the colum
e840: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
e850: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  rom */.      int
e860: 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69   iCol = pExpr->i
e870: 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65  Column;  /* Inde
e880: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70  x of column in p
e890: 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  Tab */.      whi
e8a0: 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62  le( pNC && !pTab
e8b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c   ){.        SrcL
e8c0: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
e8d0: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
e8e0: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a         for(j=0;j
e8f0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
e900: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a  && pTabList->a[j
e910: 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72  ].iCursor!=pExpr
e920: 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20  ->iTable;j++);. 
e930: 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61         if( j<pTa
e940: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20  bList->nSrc ){. 
e950: 20 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20           pTab = 
e960: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
e970: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Tab;.          p
e980: 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  S = pTabList->a[
e990: 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  j].pSelect;.    
e9a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e9b0: 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e       pNC = pNC->
e9c0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d  pNext;.        }
e9d0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
e9e0: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
e9f0: 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65         /* At one
ea00: 20 74 69 6d 65 2c 20 63 6f 64 65 20 73 75 63 68   time, code such
ea10: 20 61 73 20 22 53 45 4c 45 43 54 20 6e 65 77 2e   as "SELECT new.
ea20: 78 22 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  x" within a trig
ea30: 67 65 72 20 77 6f 75 6c 64 0a 20 20 20 20 20 20  ger would.      
ea40: 20 20 2a 2a 20 63 61 75 73 65 20 74 68 69 73 20    ** cause this 
ea50: 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e  condition to run
ea60: 2e 20 20 53 69 6e 63 65 20 74 68 65 6e 2c 20 77  .  Since then, w
ea70: 65 20 68 61 76 65 20 72 65 73 74 72 75 63 74 75  e have restructu
ea80: 72 65 64 20 68 6f 77 0a 20 20 20 20 20 20 20 20  red how.        
ea90: 2a 2a 20 74 72 69 67 67 65 72 20 63 6f 64 65 20  ** trigger code 
eaa0: 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e 64  is generated and
eab0: 20 73 6f 20 74 68 69 73 20 63 6f 6e 64 69 74 69   so this conditi
eac0: 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  on is no longer 
ead0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73  .        ** poss
eae0: 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69  ible. However, i
eaf0: 74 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 74  t can still be t
eb00: 72 75 65 20 66 6f 72 20 73 74 61 74 65 6d 65 6e  rue for statemen
eb10: 74 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20  ts like.        
eb20: 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
eb30: 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
eb40: 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45       **   CREATE
eb50: 20 54 41 42 4c 45 20 74 31 28 63 6f 6c 20 49 4e   TABLE t1(col IN
eb60: 54 45 47 45 52 29 3b 0a 20 20 20 20 20 20 20 20  TEGER);.        
eb70: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
eb80: 45 43 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f 4d  ECT t1.col) FROM
eb90: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
eba0: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
ebb0: 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28  when columnType(
ebc0: 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
ebd0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 74  he expression "t
ebe0: 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a 20  1.col" in the . 
ebf0: 20 20 20 20 20 20 20 2a 2a 20 73 75 62 2d 73 65         ** sub-se
ec00: 6c 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63 61  lect. In this ca
ec10: 73 65 2c 20 73 65 74 20 74 68 65 20 63 6f 6c 75  se, set the colu
ec20: 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c 2c  mn type to NULL,
ec30: 20 65 76 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   even.        **
ec40: 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c   though it shoul
ec50: 64 20 72 65 61 6c 6c 79 20 62 65 20 22 49 4e 54  d really be "INT
ec60: 45 47 45 52 22 2e 0a 20 20 20 20 20 20 20 20 2a  EGER"..        *
ec70: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
ec80: 73 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c  s is not a probl
ec90: 65 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c 75 6d  em, as the colum
eca0: 6e 20 74 79 70 65 20 6f 66 20 22 74 31 2e 63 6f  n type of "t1.co
ecb0: 6c 22 20 69 73 20 6e 65 76 65 72 0a 20 20 20 20  l" is never.    
ecc0: 20 20 20 20 2a 2a 20 75 73 65 64 2e 20 57 68 65      ** used. Whe
ecd0: 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69  n columnType() i
ece0: 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  s called on the 
ecf0: 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 20 20  expression .    
ed00: 20 20 20 20 2a 2a 20 22 28 53 45 4c 45 43 54 20      ** "(SELECT 
ed10: 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63 6f  t1.col)", the co
ed20: 72 72 65 63 74 20 74 79 70 65 20 69 73 20 72 65  rrect type is re
ed30: 74 75 72 6e 65 64 20 28 73 65 65 20 74 68 65 20  turned (see the 
ed40: 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 20 20  TK_SELECT.      
ed50: 20 20 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c 6f    ** branch belo
ed60: 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  w.  */.        b
ed70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
ed80: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
ed90: 62 20 26 26 20 70 45 78 70 72 2d 3e 79 2e 70 54  b && pExpr->y.pT
eda0: 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20  ab==pTab );.    
edb0: 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20    if( pS ){.    
edc0: 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c      /* The "tabl
edd0: 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  e" is actually a
ede0: 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61   sub-select or a
edf0: 20 76 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f   view in the FRO
ee00: 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20  M clause.       
ee10: 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43   ** of the SELEC
ee20: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74  T statement. Ret
ee30: 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74  urn the declarat
ee40: 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69  ion type and ori
ee50: 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  gin.        ** d
ee60: 61 74 61 20 66 6f 72 20 74 68 65 20 72 65 73 75  ata for the resu
ee70: 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66  lt-set column of
ee80: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e   the sub-select.
ee90: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
eea0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
eeb0: 26 26 20 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69  && iCol<pS->pELi
eec0: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
eed0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f         /* If iCo
eee0: 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  l is less than z
eef0: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78  ero, then the ex
ef00: 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74  pression request
ef10: 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  s the.          
ef20: 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  ** rowid of the 
ef30: 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69  sub-select or vi
ef40: 65 77 2e 20 54 68 69 73 20 65 78 70 72 65 73 73  ew. This express
ef50: 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65  ion is legal (se
ef60: 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e .          ** 
ef70: 74 65 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e  test case misc2.
ef80: 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73  2.2) - it always
ef90: 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
efa0: 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  LL..          */
efb0: 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43  .          NameC
efc0: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20  ontext sNC;.    
efd0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20        Expr *p = 
efe0: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43  pS->pEList->a[iC
eff0: 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  ol].pExpr;.     
f000: 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73       sNC.pSrcLis
f010: 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  t = pS->pSrc;.  
f020: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78          sNC.pNex
f030: 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 20  t = pNC;.       
f040: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
f050: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pNC->pParse;.   
f060: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63         zType = c
f070: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
f080: 70 2c 26 7a 4f 72 69 67 44 62 2c 26 7a 4f 72 69  p,&zOrigDb,&zOri
f090: 67 54 61 62 2c 26 7a 4f 72 69 67 43 6f 6c 29 3b  gTab,&zOrigCol);
f0a0: 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
f0b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f0c0: 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62 6c 65   /* A real table
f0d0: 20 6f 72 20 61 20 43 54 45 20 74 61 62 6c 65 20   or a CTE table 
f0e0: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
f0f0: 74 28 20 21 70 53 20 29 3b 0a 23 69 66 64 65 66  t( !pS );.#ifdef
f100: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
f110: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
f120: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
f130: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
f140: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  >iPKey;.        
f150: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 58 4e  assert( iCol==XN
f160: 5f 52 4f 57 49 44 20 7c 7c 20 28 69 43 6f 6c 3e  _ROWID || (iCol>
f170: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
f180: 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20  >nCol) );.      
f190: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
f1a0: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
f1b0: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
f1c0: 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20         zOrigCol 
f1d0: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
f1e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f1f0: 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70      zOrigCol = p
f200: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
f210: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
f220: 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   zType = sqlite3
f230: 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62  ColumnType(&pTab
f240: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b  ->aCol[iCol],0);
f250: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f260: 20 20 20 7a 4f 72 69 67 54 61 62 20 3d 20 70 54     zOrigTab = pT
f270: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
f280: 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72     if( pNC->pPar
f290: 73 65 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68  se && pTab->pSch
f2a0: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ema ){.         
f2b0: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
f2c0: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
f2d0: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  pNC->pParse->db,
f2e0: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
f2f0: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
f300: 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  Db = pNC->pParse
f310: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
f320: 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  DbSName;.       
f330: 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20   }.#else.       
f340: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 58   assert( iCol==X
f350: 4e 5f 52 4f 57 49 44 20 7c 7c 20 28 69 43 6f 6c  N_ROWID || (iCol
f360: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
f370: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
f380: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
f390: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
f3a0: 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
f3b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f3c0: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 73         zType = s
f3d0: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65  qlite3ColumnType
f3e0: 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  (&pTab->aCol[iCo
f3f0: 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  l],0);.        }
f400: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a  .#endif.      }.
f410: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f420: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
f430: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
f440: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
f450: 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  CT: {.      /* T
f460: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
f470: 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 52   a sub-select. R
f480: 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72  eturn the declar
f490: 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20  ation type and. 
f4a0: 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69       ** origin i
f4b0: 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e 67  nfo for the sing
f4c0: 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  le column in the
f4d0: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
f4e0: 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20  he SELECT.      
f4f0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  ** statement..  
f500: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d      */.      Nam
f510: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
f520: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d      Select *pS =
f530: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
f540: 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
f550: 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61   = pS->pEList->a
f560: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [0].pExpr;.     
f570: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
f580: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
f590: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
f5a0: 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  .      sNC.pSrcL
f5b0: 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a  ist = pS->pSrc;.
f5c0: 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20        sNC.pNext 
f5d0: 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43  = pNC;.      sNC
f5e0: 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  .pParse = pNC->p
f5f0: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79  Parse;.      zTy
f600: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
f610: 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44  &sNC, p, &zOrigD
f620: 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a  b, &zOrigTab, &z
f630: 4f 72 69 67 43 6f 6c 29 3b 20 0a 20 20 20 20 20  OrigCol); .     
f640: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
f650: 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64 65 66  ndif.  }..#ifdef
f660: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
f670: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 20  OLUMN_METADATA  
f680: 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 44 62 20  .  if( pzOrigDb 
f690: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
f6a0: 7a 4f 72 69 67 54 61 62 20 26 26 20 70 7a 4f 72  zOrigTab && pzOr
f6b0: 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a  igCol );.    *pz
f6c0: 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69 67 44 62  OrigDb = zOrigDb
f6d0: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54 61 62  ;.    *pzOrigTab
f6e0: 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20 20 20   = zOrigTab;.   
f6f0: 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a 4f   *pzOrigCol = zO
f700: 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e 64  rigCol;.  }.#end
f710: 69 66 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70  if.  return zTyp
f720: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  e;.}../*.** Gene
f730: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
f740: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
f750: 45 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  E the declaratio
f760: 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d  n types of colum
f770: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
f780: 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  ult set..*/.stat
f790: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
f7a0: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50  ColumnTypes(.  P
f7b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
f7c0: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
f7d0: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
f7e0: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
f7f0: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
f800: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
f810: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
f820: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
f830: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
f840: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
f850: 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
f860: 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  PE.  Vdbe *v = p
f870: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
f880: 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
f890: 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e  text sNC;.  sNC.
f8a0: 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
f8b0: 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73  ist;.  sNC.pPars
f8c0: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 4e  e = pParse;.  sN
f8d0: 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 66  C.pNext = 0;.  f
f8e0: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
f8f0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
f900: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c     Expr *p = pEL
f910: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
f920: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
f930: 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66 20 53  *zType;.#ifdef S
f940: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
f950: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20  UMN_METADATA.   
f960: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
f970: 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  igDb = 0;.    co
f980: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54  nst char *zOrigT
f990: 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  ab = 0;.    cons
f9a0: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c  t char *zOrigCol
f9b0: 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70 65 20   = 0;.    zType 
f9c0: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
f9d0: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20  C, p, &zOrigDb, 
f9e0: 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69  &zOrigTab, &zOri
f9f0: 67 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  gCol);..    /* T
fa00: 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b  he vdbe must mak
fa10: 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f  e its own copy o
fa20: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70  f the column-typ
fa30: 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20  e and other .   
fa40: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69   ** column speci
fa50: 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20  fic strings, in 
fa60: 63 61 73 65 20 74 68 65 20 73 63 68 65 6d 61 20  case the schema 
fa70: 69 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20  is reset before 
fa80: 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74  this.    ** virt
fa90: 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64  ual machine is d
faa0: 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
fab0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
fac0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
fad0: 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c  OLNAME_DATABASE,
fae0: 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49 54 45   zOrigDb, SQLITE
faf0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
fb00: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
fb10: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
fb20: 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69  NAME_TABLE, zOri
fb30: 67 54 61 62 2c 20 53 51 4c 49 54 45 5f 54 52 41  gTab, SQLITE_TRA
fb40: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
fb50: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
fb60: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
fb70: 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f  _COLUMN, zOrigCo
fb80: 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  l, SQLITE_TRANSI
fb90: 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ENT);.#else.    
fba0: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
fbb0: 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30  pe(&sNC, p, 0, 0
fbc0: 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
fbd0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
fbe0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
fbf0: 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a  NAME_DECLTYPE, z
fc00: 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  Type, SQLITE_TRA
fc10: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e  NSIENT);.  }.#en
fc20: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
fc30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
fc40: 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a  TYPE) */.}.../*.
fc50: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  ** Compute the c
fc60: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20  olumn names for 
fc70: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
fc80: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e  nt..**.** The on
fc90: 6c 79 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  ly guarantee tha
fca0: 74 20 53 51 4c 69 74 65 20 6d 61 6b 65 73 20 61  t SQLite makes a
fcb0: 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  bout column name
fcc0: 73 20 69 73 20 74 68 61 74 20 69 66 20 74 68 65  s is that if the
fcd0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61  .** column has a
fce0: 6e 20 41 53 20 63 6c 61 75 73 65 20 61 73 73 69  n AS clause assi
fcf0: 67 6e 69 6e 67 20 69 74 20 61 20 6e 61 6d 65 2c  gning it a name,
fd00: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 74 68   that will be th
fd10: 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a 2a 2a 20  e name used..** 
fd20: 54 68 61 74 20 69 73 20 74 68 65 20 6f 6e 6c 79  That is the only
fd30: 20 64 6f 63 75 6d 65 6e 74 65 64 20 67 75 61 72   documented guar
fd40: 61 6e 74 65 65 2e 20 20 48 6f 77 65 76 65 72 2c  antee.  However,
fd50: 20 63 6f 75 6e 74 6c 65 73 73 20 61 70 70 6c 69   countless appli
fd60: 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c  cations.** devel
fd70: 6f 70 65 64 20 6f 76 65 72 20 74 68 65 20 79 65  oped over the ye
fd80: 61 72 73 20 68 61 76 65 20 6d 61 64 65 20 62 61  ars have made ba
fd90: 73 65 6c 65 73 73 20 61 73 73 75 6d 70 74 69 6f  seless assumptio
fda0: 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20  ns about column 
fdb0: 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20 77 69 6c  names.** and wil
fdc0: 6c 20 62 72 65 61 6b 20 69 66 20 74 68 6f 73 65  l break if those
fdd0: 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 63 68 61   assumptions cha
fde0: 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c 20 75 73  nges.  Hence, us
fdf0: 65 20 65 78 74 72 65 6d 65 20 63 61 75 74 69 6f  e extreme cautio
fe00: 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64 69 66 79  n.** when modify
fe10: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
fe20: 20 74 6f 20 61 76 6f 69 64 20 62 72 65 61 6b 69   to avoid breaki
fe30: 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a  ng legacy..**.**
fe40: 20 53 65 65 20 41 6c 73 6f 3a 20 73 71 6c 69 74   See Also: sqlit
fe50: 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  e3ColumnsFromExp
fe60: 72 4c 69 73 74 28 29 0a 2a 2a 0a 2a 2a 20 54 68  rList().**.** Th
fe70: 65 20 50 52 41 47 4d 41 20 73 68 6f 72 74 5f 63  e PRAGMA short_c
fe80: 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20 61 6e 64 20  olumn_names and 
fe90: 50 52 41 47 4d 41 20 66 75 6c 6c 5f 63 6f 6c 75  PRAGMA full_colu
fea0: 6d 6e 5f 6e 61 6d 65 73 20 73 65 74 74 69 6e 67  mn_names setting
feb0: 73 20 61 72 65 0a 2a 2a 20 64 65 70 72 65 63 61  s are.** depreca
fec0: 74 65 64 2e 20 20 54 68 65 20 64 65 66 61 75 6c  ted.  The defaul
fed0: 74 20 73 65 74 74 69 6e 67 20 69 73 20 73 68 6f  t setting is sho
fee0: 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f 46 46 2e  rt=ON, full=OFF.
fef0: 20 20 39 39 2e 39 25 20 6f 66 20 61 6c 6c 0a 2a    99.9% of all.*
ff00: 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 73  * applications s
ff10: 68 6f 75 6c 64 20 6f 70 65 72 61 74 65 20 74 68  hould operate th
ff20: 69 73 20 77 61 79 2e 20 20 4e 65 76 65 72 74 68  is way.  Neverth
ff30: 65 6c 65 73 73 2c 20 77 65 20 6e 65 65 64 20 74  eless, we need t
ff40: 6f 20 73 75 70 70 6f 72 74 20 74 68 65 0a 2a 2a  o support the.**
ff50: 20 6f 74 68 65 72 20 6d 6f 64 65 73 20 66 6f 72   other modes for
ff60: 20 6c 65 67 61 63 79 3a 0a 2a 2a 0a 2a 2a 20 20   legacy:.**.**  
ff70: 20 20 73 68 6f 72 74 3d 4f 46 46 2c 20 66 75 6c    short=OFF, ful
ff80: 6c 3d 4f 46 46 3a 20 20 20 20 20 20 43 6f 6c 75  l=OFF:      Colu
ff90: 6d 6e 20 6e 61 6d 65 20 69 73 20 74 68 65 20 74  mn name is the t
ffa0: 65 78 74 20 6f 66 20 74 68 65 20 65 78 70 72 65  ext of the expre
ffb0: 73 73 69 6f 6e 20 68 61 73 20 69 74 0a 2a 2a 20  ssion has it.** 
ffc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 72 69               ori
ffe0: 67 69 6e 61 6c 6c 79 20 61 70 70 65 61 72 73 20  ginally appears 
fff0: 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  in the SELECT st
10000 61 74 65 6d 65 6e 74 2e 20 20 49 6e 0a 2a 2a 20  atement.  In.** 
10010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10020 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 74 68               oth
10030 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 7a 53  er words, the zS
10040 70 61 6e 20 6f 66 20 74 68 65 20 72 65 73 75 6c  pan of the resul
10050 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  t expression..**
10060 0a 2a 2a 20 20 20 20 73 68 6f 72 74 3d 4f 4e 2c  .**    short=ON,
10070 20 66 75 6c 6c 3d 4f 46 46 3a 20 20 20 20 20 20   full=OFF:      
10080 20 28 54 68 69 73 20 69 73 20 74 68 65 20 64 65   (This is the de
10090 66 61 75 6c 74 20 73 65 74 74 69 6e 67 29 2e 20  fault setting). 
100a0 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 0a 2a   If the result.*
100b0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
100c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
100d0 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74  efers directly t
100e0 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  o a table column
100f0 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20  , then the.**   
10100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10110 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
10120 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73  t column name is
10130 20 6a 75 73 74 20 74 68 65 20 74 61 62 6c 65 20   just the table 
10140 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 20 20 20 20  column.**       
10150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10160 20 20 20 20 20 20 20 6e 61 6d 65 3a 20 43 4f 4c         name: COL
10170 55 4d 4e 2e 20 20 4f 74 68 65 72 77 69 73 65 20  UMN.  Otherwise 
10180 75 73 65 20 7a 53 70 61 6e 2e 0a 2a 2a 0a 2a 2a  use zSpan..**.**
10190 20 20 20 20 66 75 6c 6c 3d 4f 4e 2c 20 73 68 6f      full=ON, sho
101a0 72 74 3d 41 4e 59 3a 20 20 20 20 20 20 20 49 66  rt=ANY:       If
101b0 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 66 65   the result refe
101c0 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 61  rs directly to a
101d0 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 0a 2a   table column,.*
101e0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
101f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
10200 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63  hen the result c
10210 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 69 74 68 20  olumn name with 
10220 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 0a 2a  the table name.*
10230 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
10240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
10250 72 65 66 69 78 2c 20 65 78 3a 20 54 41 42 4c 45  refix, ex: TABLE
10260 2e 43 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65 72 77  .COLUMN.  Otherw
10270 69 73 65 20 75 73 65 20 7a 53 70 61 6e 2e 0a 2a  ise use zSpan..*
10280 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
10290 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
102a0 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
102b0 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
102c0 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
102d0 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
102e0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
102f0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72  column names for
10300 20 74 68 69 73 20 53 45 4c 45 43 54 20 73 74 61   this SELECT sta
10310 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56  tement */.){.  V
10320 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
10330 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
10340 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
10350 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
10360 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
10370 2a 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74  *pEList;.  sqlit
10380 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
10390 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e  >db;.  int fullN
103a0 61 6d 65 3b 20 20 20 20 2f 2a 20 54 41 42 4c 45  ame;    /* TABLE
103b0 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e 6f 20 41 53  .COLUMN if no AS
103c0 20 63 6c 61 75 73 65 20 61 6e 64 20 69 73 20 61   clause and is a
103d0 20 64 69 72 65 63 74 20 74 61 62 6c 65 20 72 65   direct table re
103e0 66 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 4e 61  f */.  int srcNa
103f0 6d 65 3b 20 20 20 20 20 2f 2a 20 43 4f 4c 55 4d  me;     /* COLUM
10400 4e 20 6f 72 20 54 41 42 4c 45 2e 43 4f 4c 55 4d  N or TABLE.COLUM
10410 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c 61 75 73  N if no AS claus
10420 65 20 61 6e 64 20 69 73 20 64 69 72 65 63 74 20  e and is direct 
10430 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
10440 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
10450 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
10460 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70  an EXPLAIN, skip
10470 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20   this step */.  
10480 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
10490 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ain ){.    retur
104a0 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
104b0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c   if( pParse->col
104c0 4e 61 6d 65 73 53 65 74 20 29 20 72 65 74 75 72  NamesSet ) retur
104d0 6e 3b 0a 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e  n;.  /* Column n
104e0 61 6d 65 73 20 61 72 65 20 64 65 74 65 72 6d 69  ames are determi
104f0 6e 65 64 20 62 79 20 74 68 65 20 6c 65 66 74 2d  ned by the left-
10500 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 61 20 63  most term of a c
10510 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 2a  ompound select *
10520 2f 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  /.  while( pSele
10530 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  ct->pPrior ) pSe
10540 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  lect = pSelect->
10550 70 50 72 69 6f 72 3b 0a 20 20 53 45 4c 45 43 54  pPrior;.  SELECT
10560 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
10570 53 65 6c 65 63 74 2c 28 22 67 65 6e 65 72 61 74  Select,("generat
10580 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ing column names
10590 5c 6e 22 29 29 3b 0a 20 20 70 54 61 62 4c 69 73  \n"));.  pTabLis
105a0 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72  t = pSelect->pSr
105b0 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53  c;.  pEList = pS
105c0 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
105d0 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
105e0 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 4c  .  assert( pTabL
105f0 69 73 74 21 3d 30 20 29 3b 0a 20 20 70 50 61 72  ist!=0 );.  pPar
10600 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
10610 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 20  = 1;.  fullName 
10620 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
10630 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
10640 65 73 29 21 3d 30 3b 0a 20 20 73 72 63 4e 61 6d  es)!=0;.  srcNam
10650 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  e = (db->flags &
10660 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
10670 4e 61 6d 65 73 29 21 3d 30 20 7c 7c 20 66 75 6c  Names)!=0 || ful
10680 6c 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33  lName;.  sqlite3
10690 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76  VdbeSetNumCols(v
106a0 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
106b0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
106c0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
106d0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
106e0 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
106f0 45 78 70 72 3b 0a 0a 20 20 20 20 61 73 73 65 72  Expr;..    asser
10700 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 20 20 61  t( p!=0 );.    a
10710 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b  ssert( p->op!=TK
10720 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 20 20  _AGG_COLUMN );  
10730 2f 2a 20 41 67 67 20 70 72 6f 63 65 73 73 69 6e  /* Agg processin
10740 67 20 68 61 73 20 6e 6f 74 20 72 75 6e 20 79 65  g has not run ye
10750 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  t */.    assert(
10760 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d   p->op!=TK_COLUM
10770 4e 20 7c 7c 20 70 2d 3e 79 2e 70 54 61 62 21 3d  N || p->y.pTab!=
10780 30 20 29 3b 20 2f 2a 20 43 6f 76 65 72 69 6e 67  0 ); /* Covering
10790 20 69 64 78 20 6e 6f 74 20 79 65 74 20 63 6f 64   idx not yet cod
107a0 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 45  ed */.    if( pE
107b0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
107c0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20   ){.      /* An 
107d0 41 53 20 63 6c 61 75 73 65 20 61 6c 77 61 79 73  AS clause always
107e0 20 74 61 6b 65 73 20 66 69 72 73 74 20 70 72 69   takes first pri
107f0 6f 72 69 74 79 20 2a 2f 0a 20 20 20 20 20 20 63  ority */.      c
10800 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c  har *zName = pEL
10810 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  ist->a[i].zName;
10820 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10830 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
10840 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
10850 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54   zName, SQLITE_T
10860 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
10870 65 6c 73 65 20 69 66 28 20 73 72 63 4e 61 6d 65  else if( srcName
10880 20 26 26 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f   && p->op==TK_CO
10890 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63 68  LUMN ){.      ch
108a0 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20  ar *zCol;.      
108b0 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43  int iCol = p->iC
108c0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54 61  olumn;.      pTa
108d0 62 20 3d 20 70 2d 3e 79 2e 70 54 61 62 3b 0a 20  b = p->y.pTab;. 
108e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
108f0 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  b!=0 );.      if
10900 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
10910 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
10920 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
10930 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
10940 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
10950 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69  nCol) );.      i
10960 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
10970 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77       zCol = "row
10980 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id";.      }else
10990 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
109a0 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
109b0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  ].zName;.      }
109c0 0a 20 20 20 20 20 20 69 66 28 20 66 75 6c 6c 4e  .      if( fullN
109d0 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ame ){.        c
109e0 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a  har *zName = 0;.
109f0 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
10a00 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
10a10 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62  b, "%s.%s", pTab
10a20 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a  ->zName, zCol);.
10a30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10a40 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
10a50 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
10a60 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
10a70 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
10a80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
10a90 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
10aa0 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
10ab0 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53  ME_NAME, zCol, S
10ac0 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
10ad0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
10ae0 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  lse{.      const
10af0 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 4c 69 73   char *z = pELis
10b00 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20  t->a[i].zSpan;. 
10b10 20 20 20 20 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20       z = z==0 ? 
10b20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
10b30 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69  b, "column%d", i
10b40 2b 31 29 20 3a 20 73 71 6c 69 74 65 33 44 62 53  +1) : sqlite3DbS
10b50 74 72 44 75 70 28 64 62 2c 20 7a 29 3b 0a 20 20  trDup(db, z);.  
10b60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
10b70 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
10b80 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c  COLNAME_NAME, z,
10b90 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29   SQLITE_DYNAMIC)
10ba0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65  ;.    }.  }.  ge
10bb0 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65  nerateColumnType
10bc0 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
10bd0 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a  st, pEList);.}..
10be0 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65  /*.** Given an e
10bf0 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 28  xpression list (
10c00 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20  which is really 
10c10 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72  the list of expr
10c20 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
10c30 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74 20  form the result 
10c40 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 20  set of a SELECT 
10c50 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75  statement) compu
10c60 74 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  te appropriate.*
10c70 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  * column names f
10c80 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  or a table that 
10c90 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
10ca0 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
10cb0 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e  **.** All column
10cc0 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20 75   names will be u
10cd0 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  nique..**.** Onl
10ce0 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  y the column nam
10cf0 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64 2e  es are computed.
10d00 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20    Column.zType, 
10d10 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a  Column.zColl,.**
10d20 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64   and other field
10d30 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20  s of Column are 
10d40 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  zeroed..**.** Re
10d50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
10d60 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 61  n success.  If a
10d70 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
10d80 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
10d90 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69  .** store NULL i
10da0 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20 69  n *paCol and 0 i
10db0 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74  n *pnCol and ret
10dc0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
10dd0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79  ..**.** The only
10de0 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
10df0 53 51 4c 69 74 65 20 6d 61 6b 65 73 20 61 62 6f  SQLite makes abo
10e00 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ut column names 
10e10 69 73 20 74 68 61 74 20 69 66 20 74 68 65 0a 2a  is that if the.*
10e20 2a 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61 6e 20  * column has an 
10e30 41 53 20 63 6c 61 75 73 65 20 61 73 73 69 67 6e  AS clause assign
10e40 69 6e 67 20 69 74 20 61 20 6e 61 6d 65 2c 20 74  ing it a name, t
10e50 68 61 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20  hat will be the 
10e60 6e 61 6d 65 20 75 73 65 64 2e 0a 2a 2a 20 54 68  name used..** Th
10e70 61 74 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 64  at is the only d
10e80 6f 63 75 6d 65 6e 74 65 64 20 67 75 61 72 61 6e  ocumented guaran
10e90 74 65 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 63  tee.  However, c
10ea0 6f 75 6e 74 6c 65 73 73 20 61 70 70 6c 69 63 61  ountless applica
10eb0 74 69 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c 6f 70  tions.** develop
10ec0 65 64 20 6f 76 65 72 20 74 68 65 20 79 65 61 72  ed over the year
10ed0 73 20 68 61 76 65 20 6d 61 64 65 20 62 61 73 65  s have made base
10ee0 6c 65 73 73 20 61 73 73 75 6d 70 74 69 6f 6e 73  less assumptions
10ef0 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61   about column na
10f00 6d 65 73 0a 2a 2a 20 61 6e 64 20 77 69 6c 6c 20  mes.** and will 
10f10 62 72 65 61 6b 20 69 66 20 74 68 6f 73 65 20 61  break if those a
10f20 73 73 75 6d 70 74 69 6f 6e 73 20 63 68 61 6e 67  ssumptions chang
10f30 65 73 2e 20 20 48 65 6e 63 65 2c 20 75 73 65 20  es.  Hence, use 
10f40 65 78 74 72 65 6d 65 20 63 61 75 74 69 6f 6e 0a  extreme caution.
10f50 2a 2a 20 77 68 65 6e 20 6d 6f 64 69 66 79 69 6e  ** when modifyin
10f60 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  g this routine t
10f70 6f 20 61 76 6f 69 64 20 62 72 65 61 6b 69 6e 67  o avoid breaking
10f80 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a 20 53   legacy..**.** S
10f90 65 65 20 41 6c 73 6f 3a 20 67 65 6e 65 72 61 74  ee Also: generat
10fa0 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 0a 2a  eColumnNames().*
10fb0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 6c  /.int sqlite3Col
10fc0 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
10fd0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
10fe0 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
10ff0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
11000 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
11010 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45  List,       /* E
11020 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68  xpr list from wh
11030 69 63 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f  ich to derive co
11040 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
11050 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20  i16 *pnCol,     
11060 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
11070 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
11080 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20  olumns here */. 
11090 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20   Column **paCol 
110a0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
110b0 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e  e the new column
110c0 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b   list here */.){
110d0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
110e0 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
110f0 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
11100 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
11110 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
11120 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
11130 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 75 33 32  ounters */.  u32
11140 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20   cnt;           
11150 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
11160 78 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20  x added to make 
11170 74 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20  the name unique 
11180 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  */.  Column *aCo
11190 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20  l, *pCol;       
111a0 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
111b0 6f 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75  over result colu
111c0 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  mns */.  int nCo
111d0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
111e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
111f0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
11200 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
11210 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
11220 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11230 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  Column name */. 
11240 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
11250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11260 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20  Size of name in 
11270 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 20 20 48 61 73  zName[] */.  Has
11280 68 20 68 74 3b 20 20 20 20 20 20 20 20 20 20 20  h ht;           
11290 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68           /* Hash
112a0 20 74 61 62 6c 65 20 6f 66 20 63 6f 6c 75 6d 6e   table of column
112b0 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 73 71 6c   names */..  sql
112c0 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 68 74  ite3HashInit(&ht
112d0 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20  );.  if( pEList 
112e0 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 45  ){.    nCol = pE
112f0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
11300 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44   aCol = sqlite3D
11310 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
11320 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a  sizeof(aCol[0])*
11330 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73 74 63  nCol);.    testc
11340 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ase( aCol==0 );.
11350 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e 33 32 37      if( nCol>327
11360 36 37 20 29 20 6e 43 6f 6c 20 3d 20 33 32 37 36  67 ) nCol = 3276
11370 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  7;.  }else{.    
11380 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43  nCol = 0;.    aC
11390 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  ol = 0;.  }.  as
113a0 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 28 69 31 36  sert( nCol==(i16
113b0 29 6e 43 6f 6c 20 29 3b 0a 20 20 2a 70 6e 43 6f  )nCol );.  *pnCo
113c0 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43  l = nCol;.  *paC
113d0 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f  ol = aCol;..  fo
113e0 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c  r(i=0, pCol=aCol
113f0 3b 20 69 3c 6e 43 6f 6c 20 26 26 20 21 64 62 2d  ; i<nCol && !db-
11400 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 20 69  >mallocFailed; i
11410 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
11420 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f   /* Get an appro
11430 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20  priate name for 
11440 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a  the column.    *
11450 2f 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65  /.    if( (zName
11460 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
11470 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
11480 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
11490 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  umn contains an 
114a0 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61  "AS <name>" phra
114b0 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61  se, use <name> a
114c0 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  s the name */.  
114d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45    }else{.      E
114e0 78 70 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20  xpr *pColExpr = 
114f0 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
11500 6f 6c 6c 61 74 65 41 6e 64 4c 69 6b 65 6c 79 28  ollateAndLikely(
11510 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
11520 70 72 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  pr);.      while
11530 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
11540 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20  TK_DOT ){.      
11550 20 20 70 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f    pColExpr = pCo
11560 6c 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  lExpr->pRight;. 
11570 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
11580 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ColExpr!=0 );.  
11590 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
115a0 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
115b0 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
115c0 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e     /* For column
115d0 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e  s use the column
115e0 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   name name */.  
115f0 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
11600 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75   pColExpr->iColu
11610 6d 6e 3b 0a 20 20 20 20 20 20 20 20 54 61 62 6c  mn;.        Tabl
11620 65 20 2a 70 54 61 62 20 3d 20 70 43 6f 6c 45 78  e *pTab = pColEx
11630 70 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20  pr->y.pTab;.    
11640 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
11650 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !=0 );.        i
11660 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
11670 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
11680 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
11690 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e  iCol>=0 ? pTab->
116a0 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
116b0 20 3a 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20   : "rowid";.    
116c0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c    }else if( pCol
116d0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Expr->op==TK_ID 
116e0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
116f0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
11700 72 74 79 28 70 43 6f 6c 45 78 70 72 2c 20 45 50  rty(pColExpr, EP
11710 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
11720 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 43        zName = pC
11730 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  olExpr->u.zToken
11740 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11750 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68         /* Use th
11760 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20  e original text 
11770 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78  of the column ex
11780 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20  pression as its 
11790 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
117a0 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
117b0 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20  a[i].zSpan;.    
117c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
117d0 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ( zName ){.     
117e0 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
117f0 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61  DbStrDup(db, zNa
11800 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
11810 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
11820 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
11830 22 63 6f 6c 75 6d 6e 25 64 22 2c 69 2b 31 29 3b  "column%d",i+1);
11840 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
11850 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c  ake sure the col
11860 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71  umn name is uniq
11870 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65  ue.  If the name
11880 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a   is not unique,.
11890 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 6e      ** append an
118a0 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20   integer to the 
118b0 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20  name so that it 
118c0 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a  becomes unique..
118d0 20 20 20 20 2a 2f 0a 20 20 20 20 63 6e 74 20 3d      */.    cnt =
118e0 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a   0;.    while( z
118f0 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 48  Name && sqlite3H
11900 61 73 68 46 69 6e 64 28 26 68 74 2c 20 7a 4e 61  ashFind(&ht, zNa
11910 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
11920 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
11930 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
11940 20 20 20 20 20 20 69 66 28 20 6e 4e 61 6d 65 3e        if( nName>
11950 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  0 ){.        for
11960 28 6a 3d 6e 4e 61 6d 65 2d 31 3b 20 6a 3e 30 20  (j=nName-1; j>0 
11970 26 26 20 73 71 6c 69 74 65 33 49 73 64 69 67 69  && sqlite3Isdigi
11980 74 28 7a 4e 61 6d 65 5b 6a 5d 29 3b 20 6a 2d 2d  t(zName[j]); j--
11990 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ){}.        if( 
119a0 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a 27 20 29 20  zName[j]==':' ) 
119b0 6e 4e 61 6d 65 20 3d 20 6a 3b 0a 20 20 20 20 20  nName = j;.     
119c0 20 7d 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d   }.      zName =
119d0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
119e0 64 62 2c 20 22 25 2e 2a 7a 3a 25 75 22 2c 20 6e  db, "%.*z:%u", n
119f0 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63  Name, zName, ++c
11a00 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  nt);.      if( c
11a10 6e 74 3e 33 20 29 20 73 71 6c 69 74 65 33 46 61  nt>3 ) sqlite3Fa
11a20 73 74 52 61 6e 64 6f 6d 6e 65 73 73 28 26 64 62  stRandomness(&db
11a30 2d 3e 73 50 72 6e 67 2c 20 73 69 7a 65 6f 66 28  ->sPrng, sizeof(
11a40 63 6e 74 29 2c 20 26 63 6e 74 29 3b 0a 20 20 20  cnt), &cnt);.   
11a50 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61   }.    pCol->zNa
11a60 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20  me = zName;.    
11a70 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f  sqlite3ColumnPro
11a80 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28  pertiesFromName(
11a90 30 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20 69 66  0, pCol);.    if
11aa0 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69 74  ( zName && sqlit
11ab0 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 68 74  e3HashInsert(&ht
11ac0 2c 20 7a 4e 61 6d 65 2c 20 70 43 6f 6c 29 3d 3d  , zName, pCol)==
11ad0 70 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  pCol ){.      sq
11ae0 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62  lite3OomFault(db
11af0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
11b00 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28  qlite3HashClear(
11b10 26 68 74 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  &ht);.  if( db->
11b20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
11b30 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69      for(j=0; j<i
11b40 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; j++){.      sq
11b50 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
11b60 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a  aCol[j].zName);.
11b70 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
11b80 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c  3DbFree(db, aCol
11b90 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d 20  );.    *paCol = 
11ba0 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20  0;.    *pnCol = 
11bb0 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
11bc0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
11bd0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
11be0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
11bf0 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64 20 63  * Add type and c
11c00 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61  ollation informa
11c10 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d 6e  tion to a column
11c20 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a 2a   list based on.*
11c30 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  * a SELECT state
11c40 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65  ment..** .** The
11c50 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72 65   column list pre
11c60 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72 6f  sumably came fro
11c70 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61  m selectColumnNa
11c80 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mesFromExprList(
11c90 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e  )..** The column
11ca0 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20 6e   list has only n
11cb0 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73 20  ames, not types 
11cc0 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20  or collations.  
11cd0 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
11ce0 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e 64  goes through and
11cf0 20 61 64 64 73 20 74 68 65 20 74 79 70 65 73 20   adds the types 
11d00 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a  and collations..
11d10 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
11d20 6e 65 20 72 65 71 75 69 72 65 73 20 74 68 61 74  ne requires that
11d30 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72 73   all identifiers
11d40 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a 2a   in the SELECT.*
11d50 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20 72  * statement be r
11d60 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64  esolved..*/.void
11d70 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
11d80 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
11d90 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73 65  llation(.  Parse
11da0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
11db0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
11dc0 65 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c 65 20  exts */.  Table 
11dd0 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *pTab,          
11de0 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20 74 79  /* Add column ty
11df0 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  pe information t
11e00 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  o this table */.
11e10 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
11e20 74 2c 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43  t,      /* SELEC
11e30 54 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  T used to determ
11e40 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f  ine types and co
11e50 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68  llations */.  ch
11e60 61 72 20 61 66 66 20 20 20 20 20 20 20 20 20 20  ar aff          
11e70 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 61      /* Default a
11e80 66 66 69 6e 69 74 79 20 66 6f 72 20 63 6f 6c 75  ffinity for colu
11e90 6d 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  mns */.){.  sqli
11ea0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
11eb0 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74  ->db;.  NameCont
11ec0 65 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d  ext sNC;.  Colum
11ed0 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53  n *pCol;.  CollS
11ee0 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74  eq *pColl;.  int
11ef0 20 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20   i;.  Expr *p;. 
11f00 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
11f10 5f 69 74 65 6d 20 2a 61 3b 0a 0a 20 20 61 73 73  _item *a;..  ass
11f20 65 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30 20  ert( pSelect!=0 
11f30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 53  );.  assert( (pS
11f40 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20  elect->selFlags 
11f50 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d  & SF_Resolved)!=
11f60 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
11f70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65  Tab->nCol==pSele
11f80 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ct->pEList->nExp
11f90 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
11fa0 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64  ailed );.  if( d
11fb0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
11fc0 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73  ) return;.  mems
11fd0 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
11fe0 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e  of(sNC));.  sNC.
11ff0 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65  pSrcList = pSele
12000 63 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20  ct->pSrc;.  a = 
12010 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
12020 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  >a;.  for(i=0, p
12030 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20  Col=pTab->aCol; 
12040 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
12050 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
12060 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
12070 65 3b 0a 20 20 20 20 69 6e 74 20 6e 2c 20 6d 3b  e;.    int n, m;
12080 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70 45  .    p = a[i].pE
12090 78 70 72 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d  xpr;.    zType =
120a0 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
120b0 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , p, 0, 0, 0);. 
120c0 20 20 20 2f 2a 20 70 43 6f 6c 2d 3e 73 7a 45 73     /* pCol->szEs
120d0 74 20 3d 20 2e 2e 2e 20 2f 2f 20 43 6f 6c 75 6d  t = ... // Colum
120e0 6e 20 73 69 7a 65 20 65 73 74 20 66 6f 72 20 53  n size est for S
120f0 45 4c 45 43 54 20 74 61 62 6c 65 73 20 6e 65 76  ELECT tables nev
12100 65 72 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 70  er used */.    p
12110 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
12120 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
12130 69 74 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20  ity(p);.    if( 
12140 7a 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 6d  zType ){.      m
12150 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
12160 33 30 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 20  30(zType);.     
12170 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
12180 65 6e 33 30 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  en30(pCol->zName
12190 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a  );.      pCol->z
121a0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
121b0 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 64 62  ReallocOrFree(db
121c0 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 6e  , pCol->zName, n
121d0 2b 6d 2b 32 29 3b 0a 20 20 20 20 20 20 69 66 28  +m+2);.      if(
121e0 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 29 7b 0a   pCol->zName ){.
121f0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
12200 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 5b 6e 2b 31 5d  pCol->zName[n+1]
12210 2c 20 7a 54 79 70 65 2c 20 6d 2b 31 29 3b 0a 20  , zType, m+1);. 
12220 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c         pCol->col
12230 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47  Flags |= COLFLAG
12240 5f 48 41 53 54 59 50 45 3b 0a 20 20 20 20 20 20  _HASTYPE;.      
12250 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
12260 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3c 3d  pCol->affinity<=
12270 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
12280 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ) pCol->affinity
12290 20 3d 20 61 66 66 3b 0a 20 20 20 20 70 43 6f 6c   = aff;.    pCol
122a0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
122b0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
122c0 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  );.    if( pColl
122d0 20 26 26 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3d   && pCol->zColl=
122e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c  =0 ){.      pCol
122f0 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65  ->zColl = sqlite
12300 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 43  3DbStrDup(db, pC
12310 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
12320 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 73   }.  }.  pTab->s
12330 7a 54 61 62 52 6f 77 20 3d 20 31 3b 20 2f 2a 20  zTabRow = 1; /* 
12340 41 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  Any non-zero val
12350 75 65 20 77 6f 72 6b 73 20 2a 2f 0a 7d 0a 0a 2f  ue works */.}../
12360 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c  *.** Given a SEL
12370 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67  ECT statement, g
12380 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65 20  enerate a Table 
12390 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
123a0 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20  escribes.** the 
123b0 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
123c0 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61  at SELECT..*/.Ta
123d0 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75  ble *sqlite3Resu
123e0 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61  ltSetOfSelect(Pa
123f0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
12400 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 63 68  ect *pSelect, ch
12410 61 72 20 61 66 66 29 7b 0a 20 20 54 61 62 6c 65  ar aff){.  Table
12420 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65   *pTab;.  sqlite
12430 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
12440 64 62 3b 0a 20 20 75 36 34 20 73 61 76 65 64 46  db;.  u64 savedF
12450 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c  lags;..  savedFl
12460 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b  ags = db->flags;
12470 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
12480 7e 28 75 36 34 29 53 51 4c 49 54 45 5f 46 75 6c  ~(u64)SQLITE_Ful
12490 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d  lColNames;.  db-
124a0 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
124b0 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a  _ShortColNames;.
124c0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50    sqlite3SelectP
124d0 72 65 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c  rep(pParse, pSel
124e0 65 63 74 2c 20 30 29 3b 0a 20 20 64 62 2d 3e 66  ect, 0);.  db->f
124f0 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67  lags = savedFlag
12500 73 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  s;.  if( pParse-
12510 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30  >nErr ) return 0
12520 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  ;.  while( pSele
12530 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  ct->pPrior ) pSe
12540 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  lect = pSelect->
12550 70 50 72 69 6f 72 3b 0a 20 20 70 54 61 62 20 3d  pPrior;.  pTab =
12560 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
12570 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
12580 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20  Table) );.  if( 
12590 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pTab==0 ){.    r
125a0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
125b0 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31  Tab->nTabRef = 1
125c0 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20  ;.  pTab->zName 
125d0 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f  = 0;.  pTab->nRo
125e0 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61  wLogEst = 200; a
125f0 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69  ssert( 200==sqli
12600 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37  te3LogEst(104857
12610 36 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  6) );.  sqlite3C
12620 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
12630 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  st(pParse, pSele
12640 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61  ct->pEList, &pTa
12650 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e  b->nCol, &pTab->
12660 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  aCol);.  sqlite3
12670 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  SelectAddColumnT
12680 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
12690 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53  pParse, pTab, pS
126a0 65 6c 65 63 74 2c 20 61 66 66 29 3b 0a 20 20 70  elect, aff);.  p
126b0 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  Tab->iPKey = -1;
126c0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
126d0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
126e0 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
126f0 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  e(db, pTab);.   
12700 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
12710 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
12720 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42  ./*.** Get a VDB
12730 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  E for the given 
12740 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20  parser context. 
12750 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   Create a new on
12760 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
12770 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
12780 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55  ccurs, return NU
12790 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d  LL and leave a m
127a0 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
127b0 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
127c0 65 33 47 65 74 56 64 62 65 28 50 61 72 73 65 20  e3GetVdbe(Parse 
127d0 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20  *pParse){.  if( 
127e0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b  pParse->pVdbe ){
127f0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 72  .    return pPar
12800 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 7d 0a 20  se->pVdbe;.  }. 
12810 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 54 6f   if( pParse->pTo
12820 70 6c 65 76 65 6c 3d 3d 30 0a 20 20 20 26 26 20  plevel==0.   && 
12830 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
12840 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 53  led(pParse->db,S
12850 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74 43  QLITE_FactorOutC
12860 6f 6e 73 74 29 0a 20 20 29 7b 0a 20 20 20 20 70  onst).  ){.    p
12870 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61  Parse->okConstFa
12880 63 74 6f 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  ctor = 1;.  }.  
12890 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
128a0 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65 29  beCreate(pParse)
128b0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  ;.}.../*.** Comp
128c0 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61  ute the iLimit a
128d0 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64  nd iOffset field
128e0 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  s of the SELECT 
128f0 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20  based on the.** 
12900 70 4c 69 6d 69 74 20 65 78 70 72 65 73 73 69 6f  pLimit expressio
12910 6e 73 2e 20 20 70 4c 69 6d 69 74 2d 3e 70 4c 65  ns.  pLimit->pLe
12920 66 74 20 61 6e 64 20 70 4c 69 6d 69 74 2d 3e 70  ft and pLimit->p
12930 52 69 67 68 74 20 68 6f 6c 64 20 74 68 65 20 65  Right hold the e
12940 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68  xpressions.** th
12950 61 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  at appear in the
12960 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74   original SQL st
12970 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68  atement after th
12980 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  e LIMIT and OFFS
12990 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20  ET.** keywords. 
129a0 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73   Or NULL if thos
129b0 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f  e keywords are o
129c0 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61  mitted. iLimit a
129d0 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61  nd iOffset .** a
129e0 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d  re the integer m
129f0 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e  emory register n
12a00 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74  umbers for count
12a10 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  ers used to comp
12a20 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69  ute .** the limi
12a30 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49  t and offset.  I
12a40 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69  f there is no li
12a50 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65  mit and/or offse
12a60 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d  t, then .** iLim
12a70 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61  it and iOffset a
12a80 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a  re negative..**.
12a90 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12aa0 63 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75  changes the valu
12ab0 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64  es of iLimit and
12ac0 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66   iOffset only if
12ad0 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f  .** a limit or o
12ae0 66 66 73 65 74 20 69 73 20 64 65 66 69 6e 65 64  ffset is defined
12af0 20 62 79 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66   by pLimit->pLef
12b00 74 20 61 6e 64 20 70 4c 69 6d 69 74 2d 3e 70 52  t and pLimit->pR
12b10 69 67 68 74 2e 20 20 69 4c 69 6d 69 74 0a 2a 2a  ight.  iLimit.**
12b20 20 61 6e 64 20 69 4f 66 66 73 65 74 20 73 68 6f   and iOffset sho
12b30 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72  uld have been pr
12b40 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69  eset to appropri
12b50 61 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  ate default valu
12b60 65 73 20 28 7a 65 72 6f 29 0a 2a 2a 20 70 72 69  es (zero).** pri
12b70 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
12b80 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
12b90 2a 20 54 68 65 20 69 4f 66 66 73 65 74 20 72 65  * The iOffset re
12ba0 67 69 73 74 65 72 20 28 69 66 20 69 74 20 65 78  gister (if it ex
12bb0 69 73 74 73 29 20 69 73 20 69 6e 69 74 69 61 6c  ists) is initial
12bc0 69 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75  ized to the valu
12bd0 65 0a 2a 2a 20 6f 66 20 74 68 65 20 4f 46 46 53  e.** of the OFFS
12be0 45 54 2e 20 20 54 68 65 20 69 4c 69 6d 69 74 20  ET.  The iLimit 
12bf0 72 65 67 69 73 74 65 72 20 69 73 20 69 6e 69 74  register is init
12c00 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54  ialized to LIMIT
12c10 2e 20 20 52 65 67 69 73 74 65 72 0a 2a 2a 20 69  .  Register.** i
12c20 4f 66 66 73 65 74 2b 31 20 69 73 20 69 6e 69 74  Offset+1 is init
12c30 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54  ialized to LIMIT
12c40 2b 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f  +OFFSET..**.** O
12c50 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74 2d 3e 70  nly if pLimit->p
12c60 4c 65 66 74 21 3d 30 20 64 6f 20 74 68 65 20 6c  Left!=0 do the l
12c70 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67  imit registers g
12c80 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e  et.** redefined.
12c90 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20    The UNION ALL 
12ca0 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68  operator uses th
12cb0 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66  is property to f
12cc0 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73  orce.** the reus
12cd0 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69  e of the same li
12ce0 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72  mit and offset r
12cf0 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20  egisters across 
12d00 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45  multiple.** SELE
12d10 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CT statements..*
12d20 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
12d30 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
12d40 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ers(Parse *pPars
12d50 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
12d60 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62  t iBreak){.  Vdb
12d70 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20  e *v = 0;.  int 
12d80 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e  iLimit = 0;.  in
12d90 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74  t iOffset;.  int
12da0 20 6e 3b 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d   n;.  Expr *pLim
12db0 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
12dc0 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
12dd0 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
12de0 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31   .  ** "LIMIT -1
12df0 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61  " always shows a
12e00 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20  ll rows.  There 
12e10 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e  is some.  ** con
12e20 74 72 6f 76 65 72 73 79 20 61 62 6f 75 74 20 77  troversy about w
12e30 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
12e40 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20  behavior should 
12e50 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72  be..  ** The cur
12e60 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
12e70 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22  ion interprets "
12e80 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e  LIMIT 0" to mean
12e90 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20  .  ** no rows.. 
12ea0 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 6d 69 74   */.  if( pLimit
12eb0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
12ec0 70 4c 69 6d 69 74 2d 3e 6f 70 3d 3d 54 4b 5f 4c  pLimit->op==TK_L
12ed0 49 4d 49 54 20 29 3b 0a 20 20 20 20 61 73 73 65  IMIT );.    asse
12ee0 72 74 28 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66  rt( pLimit->pLef
12ef0 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 69  t!=0 );.    p->i
12f00 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d  Limit = iLimit =
12f10 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
12f20 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
12f30 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
12f40 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d  .    assert( v!=
12f50 30 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  0 );.    if( sql
12f60 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
12f70 72 28 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c  r(pLimit->pLeft,
12f80 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 73 71   &n) ){.      sq
12f90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12fa0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e  v, OP_Integer, n
12fb0 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
12fc0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
12fd0 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22   "LIMIT counter"
12fe0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d  ));.      if( n=
12ff0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
13000 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
13010 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
13020 7d 65 6c 73 65 20 69 66 28 20 6e 3e 3d 30 20 26  }else if( n>=0 &
13030 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e  & p->nSelectRow>
13040 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75  sqlite3LogEst((u
13050 36 34 29 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  64)n) ){.       
13060 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
13070 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28   sqlite3LogEst((
13080 75 36 34 29 6e 29 3b 0a 20 20 20 20 20 20 20 20  u64)n);.        
13090 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
130a0 46 5f 46 69 78 65 64 4c 69 6d 69 74 3b 0a 20 20  F_FixedLimit;.  
130b0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
130c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
130d0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
130e0 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 69 4c  Limit->pLeft, iL
130f0 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  imit);.      sql
13100 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
13110 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
13120 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76  iLimit); VdbeCov
13130 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
13140 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
13150 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29  "LIMIT counter")
13160 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13170 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13180 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20  _IfNot, iLimit, 
13190 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  iBreak); VdbeCov
131a0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
131b0 20 20 20 20 69 66 28 20 70 4c 69 6d 69 74 2d 3e      if( pLimit->
131c0 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  pRight ){.      
131d0 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66  p->iOffset = iOf
131e0 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  fset = ++pParse-
131f0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61  >nMem;.      pPa
13200 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f  rse->nMem++;   /
13210 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78  * Allocate an ex
13220 74 72 61 20 72 65 67 69 73 74 65 72 20 66 6f 72  tra register for
13230 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f   limit+offset */
13240 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
13250 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
13260 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 2c 20 69  Limit->pRight, i
13270 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73  Offset);.      s
13280 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
13290 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
132a0 2c 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65  , iOffset); Vdbe
132b0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
132c0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
132d0 76 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74  v, "OFFSET count
132e0 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  er"));.      sql
132f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
13300 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74  , OP_OffsetLimit
13310 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65  , iLimit, iOffse
13320 74 2b 31 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  t+1, iOffset);. 
13330 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
13340 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53  ((v, "LIMIT+OFFS
13350 45 54 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ET"));.    }.  }
13360 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
13370 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
13380 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65  _SELECT./*.** Re
13390 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72  turn the appropr
133a0 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  iate collating s
133b0 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
133c0 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol-th column o
133d0 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  f.** the result 
133e0 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  set for the comp
133f0 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74  ound-select stat
13400 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75  ement "p".  Retu
13410 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68  rn NULL if.** th
13420 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20  e column has no 
13430 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e  default collatin
13440 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a  g sequence..**.*
13450 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * The collating 
13460 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
13470 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
13480 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74   is taken from t
13490 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20  he.** left-most 
134a0 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65  term of the sele
134b0 63 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f  ct that has a co
134c0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
134d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c  ..*/.static Coll
134e0 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74  Seq *multiSelect
134f0 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
13500 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
13510 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43  , int iCol){.  C
13520 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20  ollSeq *pRet;.  
13530 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
13540 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74  .    pRet = mult
13550 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
13560 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72  Parse, p->pPrior
13570 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65  , iCol);.  }else
13580 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a  {.    pRet = 0;.
13590 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43    }.  assert( iC
135a0 6f 6c 3e 3d 30 20 29 3b 0a 20 20 2f 2a 20 69 43  ol>=0 );.  /* iC
135b0 6f 6c 20 6d 75 73 74 20 62 65 20 6c 65 73 73 20  ol must be less 
135c0 74 68 61 6e 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  than p->pEList->
135d0 6e 45 78 70 72 2e 20 20 4f 74 68 65 72 77 69 73  nExpr.  Otherwis
135e0 65 20 61 6e 20 65 72 72 6f 72 20 77 6f 75 6c 64  e an error would
135f0 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  .  ** have been 
13600 74 68 72 6f 77 6e 20 64 75 72 69 6e 67 20 6e 61  thrown during na
13610 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6e  me resolution an
13620 64 20 77 65 20 77 6f 75 6c 64 20 6e 6f 74 20 68  d we would not h
13630 61 76 65 20 67 6f 74 74 65 6e 0a 20 20 2a 2a 20  ave gotten.  ** 
13640 74 68 69 73 20 66 61 72 20 2a 2f 0a 20 20 69 66  this far */.  if
13650 28 20 70 52 65 74 3d 3d 30 20 26 26 20 41 4c 57  ( pRet==0 && ALW
13660 41 59 53 28 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69  AYS(iCol<p->pELi
13670 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20  st->nExpr) ){.  
13680 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
13690 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
136a0 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  se, p->pEList->a
136b0 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20  [iCol].pExpr);. 
136c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
136d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
136e0 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
136f0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
13700 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
13710 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
13720 45 43 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f  ECT.** with an O
13730 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
13740 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
13750 6c 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75  locates and retu
13760 72 6e 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a  rns a KeyInfo.**
13770 20 73 74 72 75 63 74 75 72 65 20 73 75 69 74 61   structure suita
13780 62 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e  ble for implemen
13790 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ting the ORDER B
137a0 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  Y..**.** Space t
137b0 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e  o hold the KeyIn
137c0 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
137d0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
137e0 6c 6c 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e  lloc. The callin
137f0 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  g.** function is
13800 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
13810 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74   ensuring that t
13820 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
13830 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66   eventually.** f
13840 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  reed..*/.static 
13850 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65  KeyInfo *multiSe
13860 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
13870 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  fo(Parse *pParse
13880 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
13890 20 6e 45 78 74 72 61 29 7b 0a 20 20 45 78 70 72   nExtra){.  Expr
138a0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
138b0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
138c0 69 6e 74 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  int nOrderBy = p
138d0 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
138e0 72 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r;.  sqlite3 *db
138f0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
13900 20 4b 65 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d   KeyInfo *pRet =
13910 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
13920 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42  lloc(db, nOrderB
13930 79 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20 20  y+nExtra, 1);.  
13940 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
13950 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
13960 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
13970 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
13980 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
13990 20 2a 70 49 74 65 6d 20 3d 20 26 70 4f 72 64 65   *pItem = &pOrde
139a0 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  rBy->a[i];.     
139b0 20 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70   Expr *pTerm = p
139c0 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
139d0 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
139e0 6c 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54  l;..      if( pT
139f0 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  erm->flags & EP_
13a00 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
13a10 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
13a20 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
13a30 61 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20  arse, pTerm);.  
13a40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13a50 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69     pColl = multi
13a60 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
13a70 61 72 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e  arse, p, pItem->
13a80 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d  u.x.iOrderByCol-
13a90 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
13aa0 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c  pColl==0 ) pColl
13ab0 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
13ac0 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  ;.        pOrder
13ad0 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  By->a[i].pExpr =
13ae0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
13af0 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
13b00 53 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70  String(pParse, p
13b10 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  Term, pColl->zNa
13b20 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
13b30 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
13b40 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
13b50 61 62 6c 65 28 70 52 65 74 29 20 29 3b 0a 20 20  able(pRet) );.  
13b60 20 20 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b      pRet->aColl[
13b70 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  i] = pColl;.    
13b80 20 20 70 52 65 74 2d 3e 61 53 6f 72 74 46 6c 61    pRet->aSortFla
13b90 67 73 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79  gs[i] = pOrderBy
13ba0 2d 3e 61 5b 69 5d 2e 73 6f 72 74 46 6c 61 67 73  ->a[i].sortFlags
13bb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
13bc0 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23  eturn pRet;.}..#
13bd0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13be0 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69  IT_CTE./*.** Thi
13bf0 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
13c00 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 74 6f  tes VDBE code to
13c10 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e   compute the con
13c20 74 65 6e 74 20 6f 66 20 61 20 57 49 54 48 20 52  tent of a WITH R
13c30 45 43 55 52 53 49 56 45 0a 2a 2a 20 71 75 65 72  ECURSIVE.** quer
13c40 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  y of the form:.*
13c50 2a 0a 2a 2a 20 20 20 3c 72 65 63 75 72 73 69 76  *.**   <recursiv
13c60 65 2d 74 61 62 6c 65 3e 20 41 53 20 28 3c 73 65  e-table> AS (<se
13c70 74 75 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e  tup-query> UNION
13c80 20 5b 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76   [ALL] <recursiv
13c90 65 2d 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20  e-query>).**    
13ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cb0 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
13cc0 5f 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 5c  _/             \
13cd0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
13ce0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
13cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
13d00 3e 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20  >pPrior         
13d10 20 20 20 20 20 20 20 20 20 20 20 20 20 70 0a 2a               p.*
13d20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  *.**.** There is
13d30 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 72 65 66   exactly one ref
13d40 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 72 65  erence to the re
13d50 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 69 6e  cursive-table in
13d60 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
13d70 0a 2a 2a 20 6f 66 20 72 65 63 75 72 73 69 76 65  .** of recursive
13d80 2d 71 75 65 72 79 2c 20 6d 61 72 6b 65 64 20 77  -query, marked w
13d90 69 74 68 20 74 68 65 20 53 72 63 4c 69 73 74 2d  ith the SrcList-
13da0 3e 61 5b 5d 2e 66 67 2e 69 73 52 65 63 75 72 73  >a[].fg.isRecurs
13db0 69 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20  ive flag..**.** 
13dc0 54 68 65 20 73 65 74 75 70 2d 71 75 65 72 79 20  The setup-query 
13dd0 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e  runs once to gen
13de0 65 72 61 74 65 20 61 6e 20 69 6e 69 74 69 61 6c  erate an initial
13df0 20 73 65 74 20 6f 66 20 72 6f 77 73 20 74 68 61   set of rows tha
13e00 74 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51  t go.** into a Q
13e10 75 65 75 65 20 74 61 62 6c 65 2e 20 20 52 6f 77  ueue table.  Row
13e20 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64 20  s are extracted 
13e30 66 72 6f 6d 20 74 68 65 20 51 75 65 75 65 20 74  from the Queue t
13e40 61 62 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f  able one by.** o
13e50 6e 65 2e 20 20 45 61 63 68 20 72 6f 77 20 65 78  ne.  Each row ex
13e60 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65  tracted from Que
13e70 75 65 20 69 73 20 6f 75 74 70 75 74 20 74 6f 20  ue is output to 
13e80 70 44 65 73 74 2e 20 20 54 68 65 6e 20 74 68 65  pDest.  Then the
13e90 20 73 69 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61   single.** extra
13ea0 63 74 65 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e  cted row (now in
13eb0 20 74 68 65 20 69 43 75 72 72 65 6e 74 20 74 61   the iCurrent ta
13ec0 62 6c 65 29 20 62 65 63 6f 6d 65 73 20 74 68 65  ble) becomes the
13ed0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a   content of the.
13ee0 2a 2a 20 72 65 63 75 72 73 69 76 65 2d 74 61 62  ** recursive-tab
13ef0 6c 65 20 66 6f 72 20 61 20 72 65 63 75 72 73 69  le for a recursi
13f00 76 65 2d 71 75 65 72 79 20 72 75 6e 2e 20 20 54  ve-query run.  T
13f10 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65  he output of the
13f20 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79   recursive-query
13f30 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 62 61 63  .** is added bac
13f40 6b 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65  k into the Queue
13f50 20 74 61 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e   table.  Then an
13f60 6f 74 68 65 72 20 72 6f 77 20 69 73 20 65 78 74  other row is ext
13f70 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75  racted from Queu
13f80 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 74 65  e.** and the ite
13f90 72 61 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  ration continues
13fa0 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65   until the Queue
13fb0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
13fc0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  .**.** If the co
13fd0 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 6f 70 65  mpound query ope
13fe0 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74  rator is UNION t
13ff0 68 65 6e 20 6e 6f 20 64 75 70 6c 69 63 61 74 65  hen no duplicate
14000 20 72 6f 77 73 20 61 72 65 20 65 76 65 72 0a 2a   rows are ever.*
14010 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  * inserted into 
14020 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e  the Queue table.
14030 20 20 54 68 65 20 69 44 69 73 74 69 6e 63 74 20    The iDistinct 
14040 74 61 62 6c 65 20 6b 65 65 70 73 20 61 20 63 6f  table keeps a co
14050 70 79 20 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a  py of all rows.*
14060 2a 20 74 68 61 74 20 68 61 76 65 20 65 76 65 72  * that have ever
14070 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69   been inserted i
14080 6e 74 6f 20 51 75 65 75 65 20 61 6e 64 20 63 61  nto Queue and ca
14090 75 73 65 73 20 64 75 70 6c 69 63 61 74 65 73 20  uses duplicates 
140a0 74 6f 20 62 65 0a 2a 2a 20 64 69 73 63 61 72 64  to be.** discard
140b0 65 64 2e 20 20 49 66 20 74 68 65 20 6f 70 65 72  ed.  If the oper
140c0 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c  ator is UNION AL
140d0 4c 2c 20 74 68 65 6e 20 64 75 70 6c 69 63 61 74  L, then duplicat
140e0 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a  es are allowed..
140f0 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 71 75  ** .** If the qu
14100 65 72 79 20 68 61 73 20 61 6e 20 4f 52 44 45 52  ery has an ORDER
14110 20 42 59 2c 20 74 68 65 6e 20 65 6e 74 72 69 65   BY, then entrie
14120 73 20 69 6e 20 74 68 65 20 51 75 65 75 65 20 74  s in the Queue t
14130 61 62 6c 65 20 61 72 65 20 6b 65 70 74 20 69 6e  able are kept in
14140 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 64  .** ORDER BY ord
14150 65 72 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  er and the first
14160 20 65 6e 74 72 79 20 69 73 20 65 78 74 72 61 63   entry is extrac
14170 74 65 64 20 66 6f 72 20 65 61 63 68 20 63 79 63  ted for each cyc
14180 6c 65 2e 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20  le.  Without.** 
14190 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65  an ORDER BY, the
141a0 20 51 75 65 75 65 20 74 61 62 6c 65 20 69 73 20   Queue table is 
141b0 6a 75 73 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a  just a FIFO..**.
141c0 2a 2a 20 49 66 20 61 20 4c 49 4d 49 54 20 63 6c  ** If a LIMIT cl
141d0 61 75 73 65 20 69 73 20 70 72 6f 76 69 64 65 64  ause is provided
141e0 2c 20 74 68 65 6e 20 74 68 65 20 69 74 65 72 61  , then the itera
141f0 74 69 6f 6e 20 73 74 6f 70 73 20 61 66 74 65 72  tion stops after
14200 20 4c 49 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68   LIMIT rows.** h
14210 61 76 65 20 62 65 65 6e 20 6f 75 74 70 75 74 20  ave been output 
14220 74 6f 20 70 44 65 73 74 2e 20 20 41 20 4c 49 4d  to pDest.  A LIM
14230 49 54 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73  IT of zero means
14240 20 74 6f 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f   to output no ro
14250 77 73 20 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61  ws and a.** nega
14260 74 69 76 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73  tive LIMIT means
14270 20 74 6f 20 6f 75 74 70 75 74 20 61 6c 6c 20 72   to output all r
14280 6f 77 73 2e 20 20 49 66 20 74 68 65 72 65 20 69  ows.  If there i
14290 73 20 61 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54  s also an OFFSET
142a0 20 63 6c 61 75 73 65 0a 2a 2a 20 77 69 74 68 20   clause.** with 
142b0 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65  a positive value
142c0 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
142d0 20 4f 46 46 53 45 54 20 6f 75 74 70 75 74 73 20   OFFSET outputs 
142e0 61 72 65 20 64 69 73 63 61 72 64 65 64 20 72 61  are discarded ra
142f0 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69  ther.** than bei
14300 6e 67 20 73 65 6e 74 20 74 6f 20 70 44 65 73 74  ng sent to pDest
14310 2e 20 20 54 68 65 20 4c 49 4d 49 54 20 63 6f 75  .  The LIMIT cou
14320 6e 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69  nt does not begi
14330 6e 20 75 6e 74 69 6c 20 61 66 74 65 72 20 4f 46  n until after OF
14340 46 53 45 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76  FSET.** rows hav
14350 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a  e been skipped..
14360 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
14370 65 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72  enerateWithRecur
14380 73 69 76 65 51 75 65 72 79 28 0a 20 20 50 61 72  siveQuery(.  Par
14390 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
143a0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
143b0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
143c0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
143d0 20 2f 2a 20 54 68 65 20 72 65 63 75 72 73 69 76   /* The recursiv
143e0 65 20 53 45 4c 45 43 54 20 74 6f 20 62 65 20 63  e SELECT to be c
143f0 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
14400 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
14410 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
14420 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
14430 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74   */.){.  SrcList
14440 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63   *pSrc = p->pSrc
14450 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ;      /* The FR
14460 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
14470 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72 79   recursive query
14480 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d   */.  int nCol =
14490 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
144a0 72 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  r;  /* Number of
144b0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
144c0 72 65 63 75 72 73 69 76 65 20 74 61 62 6c 65 20  recursive table 
144d0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  */.  Vdbe *v = p
144e0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
144f0 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72     /* The prepar
14500 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64  ed statement und
14510 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
14520 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
14530 74 75 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  tup = p->pPrior;
14540 20 20 20 2f 2a 20 54 68 65 20 73 65 74 75 70 20     /* The setup 
14550 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61  query */.  int a
14560 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20  ddrTop;         
14570 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20           /* Top 
14580 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  of the loop */. 
14590 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 2c 20 61   int addrCont, a
145a0 64 64 72 42 72 65 61 6b 3b 20 20 20 20 20 20 2f  ddrBreak;      /
145b0 2a 20 43 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42  * CONTINUE and B
145c0 52 45 41 4b 20 61 64 64 72 65 73 73 65 73 20 2a  REAK addresses *
145d0 2f 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74  /.  int iCurrent
145e0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
145f0 20 20 2f 2a 20 54 68 65 20 43 75 72 72 65 6e 74    /* The Current
14600 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
14610 72 65 67 43 75 72 72 65 6e 74 3b 20 20 20 20 20  regCurrent;     
14620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
14630 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 43 75  ister holding Cu
14640 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20  rrent table */. 
14650 20 69 6e 74 20 69 51 75 65 75 65 3b 20 20 20 20   int iQueue;    
14660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14670 2a 20 54 68 65 20 51 75 65 75 65 20 74 61 62 6c  * The Queue tabl
14680 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 69 73 74  e */.  int iDist
14690 69 6e 63 74 20 3d 20 30 3b 20 20 20 20 20 20 20  inct = 0;       
146a0 20 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72       /* To ensur
146b0 65 20 75 6e 69 71 75 65 20 72 65 73 75 6c 74 73  e unique results
146c0 20 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69   if UNION */.  i
146d0 6e 74 20 65 44 65 73 74 20 3d 20 53 52 54 5f 46  nt eDest = SRT_F
146e0 69 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ifo;         /* 
146f0 48 6f 77 20 74 6f 20 77 72 69 74 65 20 74 6f 20  How to write to 
14700 51 75 65 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63  Queue */.  Selec
14710 74 44 65 73 74 20 64 65 73 74 51 75 65 75 65 3b  tDest destQueue;
14720 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
14730 63 74 44 65 73 74 20 74 61 72 67 65 74 74 69 6e  ctDest targettin
14740 67 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  g the Queue tabl
14750 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
14760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14770 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
14780 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
14790 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
147a0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
147b0 74 20 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72  t code */.  Expr
147c0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
147d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
147e0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
147f0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d   */.  Expr *pLim
14800 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
14810 20 20 20 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d      /* Saved LIM
14820 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f  IT and OFFSET */
14830 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c  .  int regLimit,
14840 20 72 65 67 4f 66 66 73 65 74 3b 20 20 20 20 20   regOffset;     
14850 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 75 73   /* Registers us
14860 65 64 20 62 79 20 4c 49 4d 49 54 20 61 6e 64 20  ed by LIMIT and 
14870 4f 46 46 53 45 54 20 2a 2f 0a 0a 23 69 66 6e 64  OFFSET */..#ifnd
14880 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
14890 49 4e 44 4f 57 46 55 4e 43 0a 20 20 69 66 28 20  INDOWFUNC.  if( 
148a0 70 2d 3e 70 57 69 6e 20 29 7b 0a 20 20 20 20 73  p->pWin ){.    s
148b0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
148c0 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 75  Parse, "cannot u
148d0 73 65 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  se window functi
148e0 6f 6e 73 20 69 6e 20 72 65 63 75 72 73 69 76 65  ons in recursive
148f0 20 71 75 65 72 69 65 73 22 29 3b 0a 20 20 20 20   queries");.    
14900 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
14910 69 66 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20  if..  /* Obtain 
14920 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f  authorization to
14930 20 64 6f 20 61 20 72 65 63 75 72 73 69 76 65 20   do a recursive 
14940 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 73  query */.  if( s
14950 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
14960 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52  pParse, SQLITE_R
14970 45 43 55 52 53 49 56 45 2c 20 30 2c 20 30 2c 20  ECURSIVE, 0, 0, 
14980 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  0) ) return;..  
14990 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20 4c  /* Process the L
149a0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
149b0 63 6c 61 75 73 65 73 2c 20 69 66 20 74 68 65 79  clauses, if they
149c0 20 65 78 69 73 74 20 2a 2f 0a 20 20 61 64 64 72   exist */.  addr
149d0 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
149e0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
149f0 72 73 65 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65  rse);.  p->nSele
14a00 63 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a  ctRow = 320;  /*
14a10 20 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20   4 billion rows 
14a20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69  */.  computeLimi
14a30 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
14a40 65 2c 20 70 2c 20 61 64 64 72 42 72 65 61 6b 29  e, p, addrBreak)
14a50 3b 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e  ;.  pLimit = p->
14a60 70 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4c 69 6d  pLimit;.  regLim
14a70 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a  it = p->iLimit;.
14a80 20 20 72 65 67 4f 66 66 73 65 74 20 3d 20 70 2d    regOffset = p-
14a90 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70  >iOffset;.  p->p
14aa0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  Limit = 0;.  p->
14ab0 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66  iLimit = p->iOff
14ac0 73 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65  set = 0;.  pOrde
14ad0 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
14ae0 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20  y;..  /* Locate 
14af0 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
14b00 72 20 6f 66 20 74 68 65 20 43 75 72 72 65 6e 74  r of the Current
14b10 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28   table */.  for(
14b20 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 53  i=0; ALWAYS(i<pS
14b30 72 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b  rc->nSrc); i++){
14b40 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61  .    if( pSrc->a
14b50 5b 69 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69  [i].fg.isRecursi
14b60 76 65 20 29 7b 0a 20 20 20 20 20 20 69 43 75 72  ve ){.      iCur
14b70 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69  rent = pSrc->a[i
14b80 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ].iCursor;.     
14b90 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14ba0 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
14bb0 20 63 75 72 73 6f 72 73 20 6e 75 6d 62 65 72 73   cursors numbers
14bc0 20 66 6f 72 20 51 75 65 75 65 20 61 6e 64 20 44   for Queue and D
14bd0 69 73 74 69 6e 63 74 2e 20 20 54 68 65 20 63 75  istinct.  The cu
14be0 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a  rsor number for.
14bf0 20 20 2a 2a 20 74 68 65 20 44 69 73 74 69 6e 63    ** the Distinc
14c00 74 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20  t table must be 
14c10 65 78 61 63 74 6c 79 20 6f 6e 65 20 67 72 65 61  exactly one grea
14c20 74 65 72 20 74 68 61 6e 20 51 75 65 75 65 20 69  ter than Queue i
14c30 6e 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72  n order.  ** for
14c40 20 74 68 65 20 53 52 54 5f 44 69 73 74 46 69 66   the SRT_DistFif
14c50 6f 20 61 6e 64 20 53 52 54 5f 44 69 73 74 51 75  o and SRT_DistQu
14c60 65 75 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73  eue destinations
14c70 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69   to work. */.  i
14c80 51 75 65 75 65 20 3d 20 70 50 61 72 73 65 2d 3e  Queue = pParse->
14c90 6e 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d  nTab++;.  if( p-
14ca0 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b  >op==TK_UNION ){
14cb0 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72  .    eDest = pOr
14cc0 64 65 72 42 79 20 3f 20 53 52 54 5f 44 69 73 74  derBy ? SRT_Dist
14cd0 51 75 65 75 65 20 3a 20 53 52 54 5f 44 69 73 74  Queue : SRT_Dist
14ce0 46 69 66 6f 3b 0a 20 20 20 20 69 44 69 73 74 69  Fifo;.    iDisti
14cf0 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
14d00 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ab++;.  }else{. 
14d10 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65     eDest = pOrde
14d20 72 42 79 20 3f 20 53 52 54 5f 51 75 65 75 65 20  rBy ? SRT_Queue 
14d30 3a 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a  : SRT_Fifo;.  }.
14d40 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
14d50 65 73 74 49 6e 69 74 28 26 64 65 73 74 51 75 65  estInit(&destQue
14d60 75 65 2c 20 65 44 65 73 74 2c 20 69 51 75 65 75  ue, eDest, iQueu
14d70 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  e);..  /* Alloca
14d80 74 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20 43  te cursors for C
14d90 75 72 72 65 6e 74 2c 20 51 75 65 75 65 2c 20 61  urrent, Queue, a
14da0 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a  nd Distinct. */.
14db0 20 20 72 65 67 43 75 72 72 65 6e 74 20 3d 20 2b    regCurrent = +
14dc0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
14dd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14de0 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65  p3(v, OP_OpenPse
14df0 75 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20 72  udo, iCurrent, r
14e00 65 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29  egCurrent, nCol)
14e10 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
14e20 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   ){.    KeyInfo 
14e30 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74  *pKeyInfo = mult
14e40 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65  iSelectOrderByKe
14e50 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c  yInfo(pParse, p,
14e60 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
14e70 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
14e80 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
14e90 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79  iQueue, pOrderBy
14ea0 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20  ->nExpr+2, 0,.  
14eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ec0 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
14ed0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
14ee0 3b 0a 20 20 20 20 64 65 73 74 51 75 65 75 65 2e  ;.    destQueue.
14ef0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
14f00 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rBy;.  }else{.  
14f10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14f20 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
14f30 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c  hemeral, iQueue,
14f40 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64   nCol);.  }.  Vd
14f50 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51  beComment((v, "Q
14f60 75 65 75 65 20 74 61 62 6c 65 22 29 29 3b 0a 20  ueue table"));. 
14f70 20 69 66 28 20 69 44 69 73 74 69 6e 63 74 20 29   if( iDistinct )
14f80 7b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65  {.    p->addrOpe
14f90 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74  nEphm[0] = sqlit
14fa0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14fb0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
14fc0 2c 20 69 44 69 73 74 69 6e 63 74 2c 20 30 29 3b  , iDistinct, 0);
14fd0 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
14fe0 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
14ff0 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  eral;.  }..  /* 
15000 44 65 74 61 63 68 20 74 68 65 20 4f 52 44 45 52  Detach the ORDER
15010 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20   BY clause from 
15020 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  the compound SEL
15030 45 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64  ECT */.  p->pOrd
15040 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  erBy = 0;..  /* 
15050 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
15060 73 20 6f 66 20 74 68 65 20 73 65 74 75 70 2d 71  s of the setup-q
15070 75 65 72 79 20 69 6e 20 51 75 65 75 65 2e 20 2a  uery in Queue. *
15080 2f 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78  /.  pSetup->pNex
15090 74 20 3d 20 30 3b 0a 20 20 45 78 70 6c 61 69 6e  t = 0;.  Explain
150a0 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
150b0 65 2c 20 31 2c 20 22 53 45 54 55 50 22 29 29 3b  e, 1, "SETUP"));
150c0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53  .  rc = sqlite3S
150d0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
150e0 65 74 75 70 2c 20 26 64 65 73 74 51 75 65 75 65  etup, &destQueue
150f0 29 3b 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65  );.  pSetup->pNe
15100 78 74 20 3d 20 70 3b 0a 20 20 69 66 28 20 72 63  xt = p;.  if( rc
15110 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72   ) goto end_of_r
15120 65 63 75 72 73 69 76 65 5f 71 75 65 72 79 3b 0a  ecursive_query;.
15130 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e  .  /* Find the n
15140 65 78 74 20 72 6f 77 20 69 6e 20 74 68 65 20 51  ext row in the Q
15150 75 65 75 65 20 61 6e 64 20 6f 75 74 70 75 74 20  ueue and output 
15160 74 68 61 74 20 72 6f 77 20 2a 2f 0a 20 20 61 64  that row */.  ad
15170 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  drTop = sqlite3V
15180 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15190 52 65 77 69 6e 64 2c 20 69 51 75 65 75 65 2c 20  Rewind, iQueue, 
151a0 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65  addrBreak); Vdbe
151b0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
151c0 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20  /* Transfer the 
151d0 6e 65 78 74 20 72 6f 77 20 69 6e 20 51 75 65 75  next row in Queu
151e0 65 20 6f 76 65 72 20 74 6f 20 43 75 72 72 65 6e  e over to Curren
151f0 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  t */.  sqlite3Vd
15200 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
15210 75 6c 6c 52 6f 77 2c 20 69 43 75 72 72 65 6e 74  ullRow, iCurrent
15220 29 3b 20 2f 2a 20 54 6f 20 72 65 73 65 74 20 63  ); /* To reset c
15230 6f 6c 75 6d 6e 20 63 61 63 68 65 20 2a 2f 0a 20  olumn cache */. 
15240 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
15250 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15260 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
15270 75 6d 6e 2c 20 69 51 75 65 75 65 2c 20 70 4f 72  umn, iQueue, pOr
15280 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20  derBy->nExpr+1, 
15290 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d  regCurrent);.  }
152a0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
152b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
152c0 50 5f 52 6f 77 44 61 74 61 2c 20 69 51 75 65 75  P_RowData, iQueu
152d0 65 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a  e, regCurrent);.
152e0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
152f0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65  eAddOp1(v, OP_De
15300 6c 65 74 65 2c 20 69 51 75 65 75 65 29 3b 0a 0a  lete, iQueue);..
15310 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
15320 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75  single row in Cu
15330 72 72 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 43  rrent */.  addrC
15340 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
15350 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
15360 65 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65 74  e);.  codeOffset
15370 28 76 2c 20 72 65 67 4f 66 66 73 65 74 2c 20 61  (v, regOffset, a
15380 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c 65  ddrCont);.  sele
15390 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
153a0 73 65 2c 20 70 2c 20 69 43 75 72 72 65 6e 74 2c  se, p, iCurrent,
153b0 0a 20 20 20 20 20 20 30 2c 20 30 2c 20 70 44 65  .      0, 0, pDe
153c0 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61 64  st, addrCont, ad
153d0 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28 20  drBreak);.  if( 
153e0 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  regLimit ){.    
153f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15400 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70  2(v, OP_DecrJump
15410 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c 20  Zero, regLimit, 
15420 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20  addrBreak);.    
15430 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
15440 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
15450 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
15460 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a 20 20  , addrCont);..  
15470 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 72  /* Execute the r
15480 65 63 75 72 73 69 76 65 20 53 45 4c 45 43 54 20  ecursive SELECT 
15490 74 61 6b 69 6e 67 20 74 68 65 20 73 69 6e 67 6c  taking the singl
154a0 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74  e row in Current
154b0 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c   as.  ** the val
154c0 75 65 20 66 6f 72 20 74 68 65 20 72 65 63 75 72  ue for the recur
154d0 73 69 76 65 2d 74 61 62 6c 65 2e 20 53 74 6f 72  sive-table. Stor
154e0 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
154f0 20 74 68 65 20 51 75 65 75 65 2e 0a 20 20 2a 2f   the Queue..  */
15500 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
15510 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
15520 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
15530 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
15540 20 22 72 65 63 75 72 73 69 76 65 20 61 67 67 72   "recursive aggr
15550 65 67 61 74 65 20 71 75 65 72 69 65 73 20 6e 6f  egate queries no
15560 74 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20  t supported");. 
15570 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 70   }else{.    p->p
15580 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 45  Prior = 0;.    E
15590 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
155a0 28 70 50 61 72 73 65 2c 20 31 2c 20 22 52 45 43  (pParse, 1, "REC
155b0 55 52 53 49 56 45 20 53 54 45 50 22 29 29 3b 0a  URSIVE STEP"));.
155c0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
155d0 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  t(pParse, p, &de
155e0 73 74 51 75 65 75 65 29 3b 0a 20 20 20 20 61 73  stQueue);.    as
155f0 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d  sert( p->pPrior=
15600 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72  =0 );.    p->pPr
15610 69 6f 72 20 3d 20 70 53 65 74 75 70 3b 0a 20 20  ior = pSetup;.  
15620 7d 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 72 75 6e  }..  /* Keep run
15630 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 70 20 75 6e  ning the loop un
15640 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 69 73  til the Queue is
15650 20 65 6d 70 74 79 20 2a 2f 0a 20 20 73 71 6c 69   empty */.  sqli
15660 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
15670 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74  ddrTop);.  sqlit
15680 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
15690 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29  el(v, addrBreak)
156a0 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73  ;..end_of_recurs
156b0 69 76 65 5f 71 75 65 72 79 3a 0a 20 20 73 71 6c  ive_query:.  sql
156c0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
156d0 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
156e0 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70  ->pOrderBy);.  p
156f0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
15700 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d  derBy;.  p->pLim
15710 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 72  it = pLimit;.  r
15720 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20  eturn;.}.#endif 
15730 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
15740 54 45 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72  TE */../* Forwar
15750 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a  d references */.
15760 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
15770 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20  SelectOrderBy(. 
15780 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
15790 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
157a0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
157b0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
157c0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
157d0 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
157e0 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  s to be coded */
157f0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
15800 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
15810 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
15820 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a  y results */.);.
15830 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 20 74 68  ./*.** Handle th
15840 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 6f  e special case o
15850 66 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c  f a compound-sel
15860 65 63 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61  ect that origina
15870 74 65 73 20 66 72 6f 6d 20 61 0a 2a 2a 20 56 41  tes from a.** VA
15880 4c 55 45 53 20 63 6c 61 75 73 65 2e 20 20 42 79  LUES clause.  By
15890 20 68 61 6e 64 6c 69 6e 67 20 74 68 69 73 20 61   handling this a
158a0 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65  s a special case
158b0 2c 20 77 65 20 61 76 6f 69 64 20 64 65 65 70 0a  , we avoid deep.
158c0 2a 2a 20 72 65 63 75 72 73 69 6f 6e 2c 20 61 6e  ** recursion, an
158d0 64 20 74 68 75 73 20 64 6f 20 6e 6f 74 20 6e 65  d thus do not ne
158e0 65 64 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68  ed to enforce th
158f0 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  e SQLITE_LIMIT_C
15900 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2a  OMPOUND_SELECT.*
15910 2a 20 6f 6e 20 61 20 56 41 4c 55 45 53 20 63 6c  * on a VALUES cl
15920 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 63 61  ause..**.** Beca
15930 75 73 65 20 74 68 65 20 53 65 6c 65 63 74 20 6f  use the Select o
15940 62 6a 65 63 74 20 6f 72 69 67 69 6e 61 74 65 73  bject originates
15950 20 66 72 6f 6d 20 61 20 56 41 4c 55 45 53 20 63   from a VALUES c
15960 6c 61 75 73 65 3a 0a 2a 2a 20 20 20 28 31 29 20  lause:.**   (1) 
15970 54 68 65 72 65 20 69 73 20 6e 6f 20 4c 49 4d 49  There is no LIMI
15980 54 20 6f 72 20 4f 46 46 53 45 54 20 6f 72 20 65  T or OFFSET or e
15990 6c 73 65 20 74 68 65 72 65 20 69 73 20 61 20 4c  lse there is a L
159a0 49 4d 49 54 20 6f 66 20 65 78 61 63 74 6c 79 20  IMIT of exactly 
159b0 31 0a 2a 2a 20 20 20 28 32 29 20 41 6c 6c 20 74  1.**   (2) All t
159c0 65 72 6d 73 20 61 72 65 20 55 4e 49 4f 4e 20 41  erms are UNION A
159d0 4c 4c 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 72  LL.**   (3) Ther
159e0 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
159f0 20 63 6c 61 75 73 65 0a 2a 2a 0a 2a 2a 20 54 68   clause.**.** Th
15a00 65 20 22 4c 49 4d 49 54 20 6f 66 20 65 78 61 63  e "LIMIT of exac
15a10 74 6c 79 20 31 22 20 63 61 73 65 20 6f 66 20 63  tly 1" case of c
15a20 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20 63 6f 6d  ondition (1) com
15a30 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20 61 20  es about when a 
15a40 56 41 4c 55 45 53 0a 2a 2a 20 63 6c 61 75 73 65  VALUES.** clause
15a50 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 73   occurs within s
15a60 63 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  calar expression
15a70 20 28 65 78 3a 20 22 53 45 4c 45 43 54 20 28 56   (ex: "SELECT (V
15a80 41 4c 55 45 53 28 31 29 2c 28 32 29 2c 28 33 29  ALUES(1),(2),(3)
15a90 29 22 29 2e 0a 2a 2a 20 54 68 65 20 73 71 6c 69  )")..** The sqli
15aa0 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
15ab0 20 77 69 6c 6c 20 68 61 76 65 20 61 64 64 65 64   will have added
15ac0 20 74 68 65 20 4c 49 4d 49 54 20 31 20 63 6c 61   the LIMIT 1 cla
15ad0 75 73 65 20 69 6e 20 74 68 74 20 63 61 73 65 2e  use in tht case.
15ae0 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 6c 69  .** Since the li
15af0 6d 69 74 20 69 73 20 65 78 61 63 74 6c 79 20 31  mit is exactly 1
15b00 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74  , we only need t
15b10 6f 20 65 76 61 6c 75 74 65 73 20 74 68 65 20 6c  o evalutes the l
15b20 65 66 74 2d 6d 6f 73 74 20 56 41 4c 55 45 53 2e  eft-most VALUES.
15b30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
15b40 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75 65 73  ultiSelectValues
15b50 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
15b60 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
15b70 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
15b80 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
15b90 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
15ba0 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  ight-most of SEL
15bb0 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64  ECTs to be coded
15bc0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
15bd0 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
15be0 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
15bf0 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
15c00 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 20 3d 20  ){.  int nRow = 
15c10 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  1;.  int rc = 0;
15c20 0a 20 20 69 6e 74 20 62 53 68 6f 77 41 6c 6c 20  .  int bShowAll 
15c30 3d 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 3b 0a  = p->pLimit==0;.
15c40 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c    assert( p->sel
15c50 46 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74 69  Flags & SF_Multi
15c60 56 61 6c 75 65 20 29 3b 0a 20 20 64 6f 7b 0a 20  Value );.  do{. 
15c70 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65     assert( p->se
15c80 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75  lFlags & SF_Valu
15c90 65 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  es );.    assert
15ca0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  ( p->op==TK_ALL 
15cb0 7c 7c 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  || (p->op==TK_SE
15cc0 4c 45 43 54 20 26 26 20 70 2d 3e 70 50 72 69 6f  LECT && p->pPrio
15cd0 72 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73  r==0) );.    ass
15ce0 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30  ert( p->pNext==0
15cf0 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   || p->pEList->n
15d00 45 78 70 72 3d 3d 70 2d 3e 70 4e 65 78 74 2d 3e  Expr==p->pNext->
15d10 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
15d20 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50 72 69  .    if( p->pPri
15d30 6f 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  or==0 ) break;. 
15d40 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50     assert( p->pP
15d50 72 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70 20 29  rior->pNext==p )
15d60 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72  ;.    p = p->pPr
15d70 69 6f 72 3b 0a 20 20 20 20 6e 52 6f 77 20 2b 3d  ior;.    nRow +=
15d80 20 62 53 68 6f 77 41 6c 6c 3b 0a 20 20 7d 77 68   bShowAll;.  }wh
15d90 69 6c 65 28 31 29 3b 0a 20 20 45 78 70 6c 61 69  ile(1);.  Explai
15da0 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72  nQueryPlan((pPar
15db0 73 65 2c 20 30 2c 20 22 53 43 41 4e 20 25 64 20  se, 0, "SCAN %d 
15dc0 43 4f 4e 53 54 41 4e 54 20 52 4f 57 25 73 22 2c  CONSTANT ROW%s",
15dd0 20 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20   nRow,.         
15de0 20 20 20 20 20 20 20 20 20 20 20 6e 52 6f 77 3d             nRow=
15df0 3d 31 20 3f 20 22 22 20 3a 20 22 53 22 29 29 3b  =1 ? "" : "S"));
15e00 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
15e10 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
15e20 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d 31  op(pParse, p, -1
15e30 2c 20 30 2c 20 30 2c 20 70 44 65 73 74 2c 20 31  , 0, 0, pDest, 1
15e40 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21 62  , 1);.    if( !b
15e50 53 68 6f 77 41 6c 6c 20 29 20 62 72 65 61 6b 3b  ShowAll ) break;
15e60 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52  .    p->nSelectR
15e70 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 70  ow = nRow;.    p
15e80 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
15e90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15ea0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
15eb0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
15ec0 20 70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f   process a compo
15ed0 75 6e 64 20 71 75 65 72 79 20 66 6f 72 6d 20 66  und query form f
15ee0 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f  rom.** two or mo
15ef0 72 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72  re separate quer
15f00 69 65 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c  ies using UNION,
15f10 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45   UNION ALL, EXCE
15f20 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53  PT, or.** INTERS
15f30 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f  ECT.**.** "p" po
15f40 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67 68  ints to the righ
15f50 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77  t-most of the tw
15f60 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68 65 20  o queries.  the 
15f70 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20  query on the.** 
15f80 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f  left is p->pPrio
15f90 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75 65  r.  The left que
15fa0 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65  ry could also be
15fb0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
15fc0 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61  y.** in which ca
15fd0 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
15fe0 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72  will be called r
15ff0 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a  ecursively. .**.
16000 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f  ** The results o
16010 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72  f the total quer
16020 79 20 61 72 65 20 74 6f 20 62 65 20 77 72 69 74  y are to be writ
16030 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69  ten into a desti
16040 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70  nation.** of typ
16050 65 20 65 44 65 73 74 20 77 69 74 68 20 70 61 72  e eDest with par
16060 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a  ameter iParm..**
16070 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20  .** Example 1:  
16080 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65 65  Consider a three
16090 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51  -way compound SQ
160a0 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  L statement..**.
160b0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  **     SELECT a 
160c0 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45  FROM t1 UNION SE
160d0 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55  LECT b FROM t2 U
160e0 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52  NION SELECT c FR
160f0 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73  OM t3.**.** This
16100 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61   statement is pa
16110 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f  rsed up as follo
16120 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  ws:.**.**     SE
16130 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
16140 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20  *      |.**     
16150 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54   `----->  SELECT
16160 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20   b FROM t2.**   
16170 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a               |.*
16180 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
16190 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43   `------>  SELEC
161a0 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a  T a FROM t1.**.*
161b0 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20  * The arrows in 
161c0 74 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76  the diagram abov
161d0 65 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20  e represent the 
161e0 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f  Select.pPrior po
161f0 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20  inter..** So if 
16200 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
16210 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71  called with p eq
16220 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75  ual to the t3 qu
16230 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72  ery, then.** pPr
16240 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20  ior will be the 
16250 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70  t2 query.  p->op
16260 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f   will be TK_UNIO
16270 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  N in this case..
16280 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61  **.** Notice tha
16290 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65  t because of the
162a0 20 77 61 79 20 53 51 4c 69 74 65 20 70 61 72 73   way SQLite pars
162b0 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  es compound SELE
162c0 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69  CTs, the.** indi
162d0 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61  vidual selects a
162e0 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d  lways group from
162f0 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a   left to right..
16300 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
16310 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72  ltiSelect(.  Par
16320 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
16330 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
16340 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
16350 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
16360 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
16370 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
16380 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
16390 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
163a0 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
163b0 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
163c0 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
163d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
163e0 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63  ;   /* Success c
163f0 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f  ode from a subro
16400 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63  utine */.  Selec
16410 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20  t *pPrior;      
16420 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
16430 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  CT immediately t
16440 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20  o our left */.  
16450 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
16460 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
16470 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  e code to this V
16480 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  DBE */.  SelectD
16490 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f  est dest;      /
164a0 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61  * Alternative da
164b0 74 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a  ta destination *
164c0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 44 65 6c  /.  Select *pDel
164d0 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61  ete = 0;  /* Cha
164e0 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c  in of simple sel
164f0 65 63 74 73 20 74 6f 20 64 65 6c 65 74 65 20 2a  ects to delete *
16500 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
16510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
16520 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
16530 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73   */..  /* Make s
16540 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ure there is no 
16550 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
16560 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f  T clause on prio
16570 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79  r SELECTs.  Only
16580 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28  .  ** the last (
16590 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45  right-most) SELE
165a0 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73  CT in the series
165b0 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44   may have an ORD
165c0 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a  ER BY or LIMIT..
165d0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
165e0 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b   && p->pPrior );
165f0 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e    /* Calling fun
16600 63 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73  ction guarantees
16610 20 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20   this much */.  
16620 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46  assert( (p->selF
16630 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73  lags & SF_Recurs
16640 69 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70  ive)==0 || p->op
16650 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f  ==TK_ALL || p->o
16660 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
16670 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46   assert( p->selF
16680 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f 75  lags & SF_Compou
16690 6e 64 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61  nd );.  db = pPa
166a0 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72 69 6f  rse->db;.  pPrio
166b0 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
166c0 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a   dest = *pDest;.
166d0 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f    if( pPrior->pO
166e0 72 64 65 72 42 79 20 7c 7c 20 70 50 72 69 6f 72  rderBy || pPrior
166f0 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
16700 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
16710 70 50 61 72 73 65 2c 22 25 73 20 63 6c 61 75 73  pParse,"%s claus
16720 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
16730 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
16740 65 22 2c 0a 20 20 20 20 20 20 70 50 72 69 6f 72  e",.      pPrior
16750 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 3f 20  ->pOrderBy!=0 ? 
16760 22 4f 52 44 45 52 20 42 59 22 20 3a 20 22 4c 49  "ORDER BY" : "LI
16770 4d 49 54 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61  MIT", selectOpNa
16780 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
16790 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
167a0 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
167b0 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71  d;.  }..  v = sq
167c0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
167d0 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
167e0 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65 20  v!=0 );  /* The 
167f0 56 44 42 45 20 61 6c 72 65 61 64 79 20 63 72 65  VDBE already cre
16800 61 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20  ated by calling 
16810 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f  function */..  /
16820 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 65 73  * Create the des
16830 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61  tination tempora
16840 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65  ry table if nece
16850 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28  ssary.  */.  if(
16860 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54   dest.eDest==SRT
16870 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20  _EphemTab ){.   
16880 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
16890 73 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  st );.    sqlite
168a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
168b0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
168c0 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 70   dest.iSDParm, p
168d0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
168e0 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73 74  ;.    dest.eDest
168f0 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20   = SRT_Table;.  
16900 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  }..  /* Special 
16910 68 61 6e 64 6c 69 6e 67 20 66 6f 72 20 61 20 63  handling for a c
16920 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74  ompound-select t
16930 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 61  hat originates a
16940 73 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73  s a VALUES claus
16950 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  e..  */.  if( p-
16960 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d  >selFlags & SF_M
16970 75 6c 74 69 56 61 6c 75 65 20 29 7b 0a 20 20 20  ultiValue ){.   
16980 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63   rc = multiSelec
16990 74 56 61 6c 75 65 73 28 70 50 61 72 73 65 2c 20  tValues(pParse, 
169a0 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 67  p, &dest);.    g
169b0 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
169c0 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
169d0 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45  Make sure all SE
169e0 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73 74 61  LECTs in the sta
169f0 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20  tement have the 
16a00 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65  same number of e
16a10 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20  lements.  ** in 
16a20 74 68 65 69 72 20 72 65 73 75 6c 74 20 73 65 74  their result set
16a30 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  s..  */.  assert
16a40 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70  ( p->pEList && p
16a50 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b  Prior->pEList );
16a60 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45  .  assert( p->pE
16a70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 50 72  List->nExpr==pPr
16a80 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ior->pEList->nEx
16a90 70 72 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  pr );..#ifndef S
16aa0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20  QLITE_OMIT_CTE. 
16ab0 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
16ac0 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20   & SF_Recursive 
16ad0 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 57  ){.    generateW
16ae0 69 74 68 52 65 63 75 72 73 69 76 65 51 75 65 72  ithRecursiveQuer
16af0 79 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  y(pParse, p, &de
16b00 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  st);.  }else.#en
16b10 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75  dif..  /* Compou
16b20 6e 64 20 53 45 4c 45 43 54 73 20 74 68 61 74 20  nd SELECTs that 
16b30 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59  have an ORDER BY
16b40 20 63 6c 61 75 73 65 20 61 72 65 20 68 61 6e 64   clause are hand
16b50 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a  led separately..
16b60 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f    */.  if( p->pO
16b70 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65  rderBy ){.    re
16b80 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74  turn multiSelect
16b90 4f 72 64 65 72 42 79 28 70 50 61 72 73 65 2c 20  OrderBy(pParse, 
16ba0 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c  p, pDest);.  }el
16bb0 73 65 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  se{..#ifndef SQL
16bc0 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
16bd0 0a 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 2d  .    if( pPrior-
16be0 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20  >pPrior==0 ){.  
16bf0 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79      ExplainQuery
16c00 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c  Plan((pParse, 1,
16c10 20 22 43 4f 4d 50 4f 55 4e 44 20 51 55 45 52 59   "COMPOUND QUERY
16c20 22 29 29 3b 0a 20 20 20 20 20 20 45 78 70 6c 61  "));.      Expla
16c30 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
16c40 72 73 65 2c 20 31 2c 20 22 4c 45 46 54 2d 4d 4f  rse, 1, "LEFT-MO
16c50 53 54 20 53 55 42 51 55 45 52 59 22 29 29 3b 0a  ST SUBQUERY"));.
16c60 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
16c70 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
16c80 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20  de for the left 
16c90 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54  and right SELECT
16ca0 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20   statements..   
16cb0 20 2a 2f 0a 20 20 20 20 73 77 69 74 63 68 28 20   */.    switch( 
16cc0 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 63  p->op ){.      c
16cd0 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20  ase TK_ALL: {.  
16ce0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
16cf0 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   0;.        int 
16d00 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  nLimit;.        
16d10 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d  assert( !pPrior-
16d20 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20  >pLimit );.     
16d30 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69     pPrior->iLimi
16d40 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20  t = p->iLimit;. 
16d50 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69         pPrior->i
16d60 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66  Offset = p->iOff
16d70 73 65 74 3b 0a 20 20 20 20 20 20 20 20 70 50 72  set;.        pPr
16d80 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d  ior->pLimit = p-
16d90 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20  >pLimit;.       
16da0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
16db0 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
16dc0 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20  or, &dest);.    
16dd0 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
16de0 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  0;.        if( r
16df0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
16e00 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
16e10 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
16e20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f          p->pPrio
16e30 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  r = 0;.        p
16e40 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f  ->iLimit = pPrio
16e50 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20  r->iLimit;.     
16e60 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
16e70 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b  pPrior->iOffset;
16e80 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
16e90 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
16ea0 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
16eb0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
16ec0 4f 50 5f 49 66 4e 6f 74 2c 20 70 2d 3e 69 4c 69  OP_IfNot, p->iLi
16ed0 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  mit); VdbeCovera
16ee0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
16ef0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
16f00 20 22 4a 75 6d 70 20 61 68 65 61 64 20 69 66 20   "Jump ahead if 
16f10 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22 29 29  LIMIT reached"))
16f20 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
16f30 70 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a 20 20  p->iOffset ){.  
16f40 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
16f50 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
16f60 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c 0a 20  P_OffsetLimit,. 
16f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f80 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
16f90 69 4c 69 6d 69 74 2c 20 70 2d 3e 69 4f 66 66 73  iLimit, p->iOffs
16fa0 65 74 2b 31 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et+1, p->iOffset
16fb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
16fc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16fd0 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61   ExplainQueryPla
16fe0 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 55  n((pParse, 1, "U
16ff0 4e 49 4f 4e 20 41 4c 4c 22 29 29 3b 0a 20 20 20  NION ALL"));.   
17000 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
17010 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
17020 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  p, &dest);.     
17030 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
17040 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
17050 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20        pDelete = 
17060 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  p->pPrior;.     
17070 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
17080 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 70  Prior;.        p
17090 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
170a0 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
170b0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70  p->nSelectRow, p
170c0 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
170d0 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  w);.        if( 
170e0 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a 20  pPrior->pLimit. 
170f0 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
17100 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
17110 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2d 3e  pPrior->pLimit->
17120 70 4c 65 66 74 2c 20 26 6e 4c 69 6d 69 74 29 0a  pLeft, &nLimit).
17130 20 20 20 20 20 20 20 20 20 26 26 20 6e 4c 69 6d           && nLim
17140 69 74 3e 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65  it>0 && p->nSele
17150 63 74 52 6f 77 20 3e 20 73 71 6c 69 74 65 33 4c  ctRow > sqlite3L
17160 6f 67 45 73 74 28 28 75 36 34 29 6e 4c 69 6d 69  ogEst((u64)nLimi
17170 74 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  t) .        ){. 
17180 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c           p->nSel
17190 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
171a0 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 4c 69 6d  LogEst((u64)nLim
171b0 69 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  it);.        }. 
171c0 20 20 20 20 20 20 20 69 66 28 20 61 64 64 72 20         if( addr 
171d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
171e0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
171f0 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
17200 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
17210 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
17220 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
17230 3a 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f  :.      case TK_
17240 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 20  UNION: {.       
17250 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20   int unionTab;  
17260 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
17270 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 20 74  er of the temp t
17280 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73  able holding res
17290 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 75  ult */.        u
172a0 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 20  8 op = 0;       
172b0 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52  /* One of the SR
172c0 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  T_ operations to
172d0 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a   apply to self *
172e0 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 70 72  /.        int pr
172f0 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68  iorOp;     /* Th
17300 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
17310 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69   to apply to pri
17320 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20  or selects */.  
17330 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d        Expr *pLim
17340 69 74 3b 20 20 20 20 2f 2a 20 53 61 76 65 64 20  it;    /* Saved 
17350 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69  values of p->nLi
17360 6d 69 74 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  mit  */.        
17370 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
17380 20 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69    SelectDest uni
17390 6f 6e 64 65 73 74 3b 0a 20 20 0a 20 20 20 20 20  ondest;.  .     
173a0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
173b0 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 3b  op==TK_EXCEPT );
173c0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
173d0 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  e( p->op==TK_UNI
173e0 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 72  ON );.        pr
173f0 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f  iorOp = SRT_Unio
17400 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  n;.        if( d
17410 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72  est.eDest==prior
17420 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Op ){.          
17430 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65 20  /* We can reuse 
17440 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
17450 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  e generated by a
17460 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20   SELECT to our. 
17470 20 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68           ** righ
17480 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  t..          */.
17490 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
174a0 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29  ( p->pLimit==0 )
174b0 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c  ;      /* Not al
174c0 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72  lowed on leftwar
174d0 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  d elements */.  
174e0 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
174f0 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b   = dest.iSDParm;
17500 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
17510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
17520 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65  will need to cre
17530 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70  ate our own temp
17540 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68  orary table to h
17550 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20 20  old the.        
17560 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74    ** intermediat
17570 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20  e results..     
17580 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
17590 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61    unionTab = pPa
175a0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
175b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
175c0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
175d0 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 72 20  .          addr 
175e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
175f0 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
17600 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61  hemeral, unionTa
17610 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  b, 0);.         
17620 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
17630 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d  OpenEphm[0] == -
17640 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  1 );.          p
17650 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
17660 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
17670 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f 73      findRightmos
17680 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  t(p)->selFlags |
17690 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72  = SF_UsesEphemer
176a0 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  al;.          as
176b0 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
176c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a  );.        }.  .
176d0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20          /* Code 
176e0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
176f0 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66  ments to our lef
17700 74 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  t.        */.   
17710 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
17720 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
17730 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
17740 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
17750 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f  &uniondest, prio
17760 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a  rOp, unionTab);.
17770 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
17780 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
17790 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69 6f  e, pPrior, &unio
177a0 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20  ndest);.        
177b0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
177c0 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
177d0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
177e0 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20     }.  .        
177f0 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
17800 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ent SELECT state
17810 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ment.        */.
17820 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f          if( p->o
17830 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a  p==TK_EXCEPT ){.
17840 20 20 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53            op = S
17850 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20 20 20  RT_Except;.     
17860 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17870 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
17880 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
17890 20 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52           op = SR
178a0 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 20  T_Union;.       
178b0 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50   }.        p->pP
178c0 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
178d0 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
178e0 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 2d  imit;.        p-
178f0 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
17900 20 20 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65       uniondest.e
17910 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20  Dest = op;.     
17920 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50     ExplainQueryP
17930 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20  lan((pParse, 1, 
17940 22 25 73 20 55 53 49 4e 47 20 54 45 4d 50 20 42  "%s USING TEMP B
17950 2d 54 52 45 45 22 2c 0a 20 20 20 20 20 20 20 20  -TREE",.        
17960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17970 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70    selectOpName(p
17980 2d 3e 6f 70 29 29 29 3b 0a 20 20 20 20 20 20 20  ->op)));.       
17990 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
179a0 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
179b0 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20  uniondest);.    
179c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
179d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
179e0 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20         /* Query 
179f0 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73 71  flattening in sq
17a00 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d 69  lite3Select() mi
17a10 67 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f  ght refill p->pO
17a20 72 64 65 72 42 79 2e 0a 20 20 20 20 20 20 20 20  rderBy..        
17a30 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20 64 65  ** Be sure to de
17a40 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72 42 79  lete p->pOrderBy
17a50 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74 6f 20  , therefore, to 
17a60 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c  avoid a memory l
17a70 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  eak. */.        
17a80 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
17a90 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
17aa0 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 20 20  derBy);.        
17ab0 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72  pDelete = p->pPr
17ac0 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ior;.        p->
17ad0 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
17ae0 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64  .        p->pOrd
17af0 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
17b00 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
17b10 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 20  UNION ){.       
17b20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
17b30 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
17b40 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  Add(p->nSelectRo
17b50 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  w, pPrior->nSele
17b60 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20  ctRow);.        
17b70 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
17b80 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
17b90 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->pLimit);.    
17ba0 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
17bb0 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  pLimit;.        
17bc0 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->iLimit = 0;. 
17bd0 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65         p->iOffse
17be0 74 20 3d 20 30 3b 0a 20 20 0a 20 20 20 20 20 20  t = 0;.  .      
17bf0 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
17c00 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d   data in the tem
17c10 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74  porary table int
17c20 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a  o whatever form.
17c30 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73          ** it is
17c40 20 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74   that we current
17c50 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 20  ly need..       
17c60 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
17c70 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65  rt( unionTab==de
17c80 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64 65  st.iSDParm || de
17c90 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f  st.eDest!=priorO
17ca0 70 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  p );.        if(
17cb0 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69   dest.eDest!=pri
17cc0 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  orOp ){.        
17cd0 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
17ce0 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
17cf0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
17d00 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
17d10 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
17d20 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
17d30 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  bel(pParse);.   
17d40 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73         iCont = s
17d50 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
17d60 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  bel(pParse);.   
17d70 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69         computeLi
17d80 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
17d90 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b  rse, p, iBreak);
17da0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
17db0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17dc0 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e  OP_Rewind, union
17dd0 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  Tab, iBreak); Vd
17de0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
17df0 20 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20           iStart 
17e00 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
17e10 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
17e20 20 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e         selectInn
17e30 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
17e40 2c 20 75 6e 69 6f 6e 54 61 62 2c 0a 20 20 20 20  , unionTab,.    
17e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e60 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73        0, 0, &des
17e70 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  t, iCont, iBreak
17e80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
17e90 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
17ea0 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
17eb0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17ec0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17ed0 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62  P_Next, unionTab
17ee0 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62 65 43  , iStart); VdbeC
17ef0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
17f00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17f10 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
17f20 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
17f30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17f40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
17f50 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  e, unionTab, 0);
17f60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17f70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
17f80 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  }.      default:
17f90 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
17fa0 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b 20  TK_INTERSECT ); 
17fb0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61  {.        int ta
17fc0 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20  b1, tab2;.      
17fd0 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
17fe0 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
17ff0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
18000 74 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  t;.        int a
18010 64 64 72 3b 0a 20 20 20 20 20 20 20 20 53 65 6c  ddr;.        Sel
18020 65 63 74 44 65 73 74 20 69 6e 74 65 72 73 65 63  ectDest intersec
18030 74 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20 69  tdest;.        i
18040 6e 74 20 72 31 3b 0a 20 20 0a 20 20 20 20 20 20  nt r1;.  .      
18050 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69    /* INTERSECT i
18060 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  s different from
18070 20 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63   the others sinc
18080 65 20 69 74 20 72 65 71 75 69 72 65 73 0a 20 20  e it requires.  
18090 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d        ** two tem
180a0 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20  porary tables.  
180b0 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73  Hence it has its
180c0 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69   own case.  Begi
180d0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20  n.        ** by 
180e0 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74  allocating the t
180f0 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65  ables we will ne
18100 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
18110 20 20 20 20 20 20 20 74 61 62 31 20 3d 20 70 50         tab1 = pP
18120 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
18130 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61        tab2 = pPa
18140 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
18150 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
18160 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
18170 20 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d   .        addr =
18180 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18190 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
181a0 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29  emeral, tab1, 0)
181b0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
181c0 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
181d0 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[0] == -1 );.  
181e0 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
181f0 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b  nEphm[0] = addr;
18200 0a 20 20 20 20 20 20 20 20 66 69 6e 64 52 69 67  .        findRig
18210 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c  htmost(p)->selFl
18220 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
18230 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20  hemeral;.       
18240 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
18250 73 74 20 29 3b 0a 20 20 0a 20 20 20 20 20 20 20  st );.  .       
18260 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
18270 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ECTs to our left
18280 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
18290 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20  table "tab1"..  
182a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
182b0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
182c0 73 74 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63  stInit(&intersec
182d0 74 64 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e  tdest, SRT_Union
182e0 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20 20 20  , tab1);.       
182f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
18300 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
18310 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65  or, &intersectde
18320 73 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  st);.        if(
18330 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
18340 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
18350 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
18360 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  }.  .        /* 
18370 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74  Code the current
18380 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d   SELECT into tem
18390 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61  porary table "ta
183a0 62 32 22 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  b2".        */. 
183b0 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
183c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
183d0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
183e0 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ral, tab2, 0);. 
183f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
18400 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
18410 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
18420 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
18430 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[1] = addr;.  
18440 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
18450 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4c 69  = 0;.        pLi
18460 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
18470 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  .        p->pLim
18480 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  it = 0;.        
18490 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69 53  intersectdest.iS
184a0 44 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20  DParm = tab2;.  
184b0 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65        ExplainQue
184c0 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
184d0 31 2c 20 22 25 73 20 55 53 49 4e 47 20 54 45 4d  1, "%s USING TEM
184e0 50 20 42 2d 54 52 45 45 22 2c 0a 20 20 20 20 20  P B-TREE",.     
184f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18500 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
18510 65 28 70 2d 3e 6f 70 29 29 29 3b 0a 20 20 20 20  e(p->op)));.    
18520 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18530 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
18540 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  , &intersectdest
18550 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
18560 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
18570 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44  OK );.        pD
18580 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
18590 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50  r;.        p->pP
185a0 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
185b0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53         if( p->nS
185c0 65 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d  electRow>pPrior-
185d0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20  >nSelectRow ){. 
185e0 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c           p->nSel
185f0 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d  ectRow = pPrior-
18600 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
18610 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
18620 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
18630 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
18640 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  .        p->pLim
18650 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 0a  it = pLimit;.  .
18660 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
18670 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65  ate code to take
18680 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f   the intersectio
18690 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d  n of the two tem
186a0 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a  porary.        *
186b0 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20  * tables..      
186c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
186d0 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
186e0 3b 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b  ;.        iBreak
186f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
18700 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
18710 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d  .        iCont =
18720 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
18730 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  Label(pParse);. 
18740 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69         computeLi
18750 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
18760 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b  rse, p, iBreak);
18770 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18780 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18790 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69  _Rewind, tab1, i
187a0 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
187b0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
187c0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
187d0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
187e0 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20  .        iStart 
187f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
18800 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74  Op2(v, OP_RowDat
18810 61 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20  a, tab1, r1);.  
18820 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18830 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
18840 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c  _NotFound, tab2,
18850 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b 0a   iCont, r1, 0);.
18860 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
18870 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
18880 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
18890 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
188a0 31 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65  1);.        sele
188b0 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
188c0 73 65 2c 20 70 2c 20 74 61 62 31 2c 0a 20 20 20  se, p, tab1,.   
188d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188e0 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74       0, 0, &dest
188f0 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29  , iCont, iBreak)
18900 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18910 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
18920 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
18930 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18940 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
18950 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29  t, tab1, iStart)
18960 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
18970 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
18980 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
18990 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
189a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
189b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
189c0 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a  lose, tab2, 0);.
189d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
189e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
189f0 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b  Close, tab1, 0);
18a00 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
18a10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18a20 0a 20 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  .  #ifndef SQLIT
18a30 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
18a40 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 3d     if( p->pNext=
18a50 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 6c  =0 ){.      Expl
18a60 61 69 6e 51 75 65 72 79 50 6c 61 6e 50 6f 70 28  ainQueryPlanPop(
18a70 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20  pParse);.    }. 
18a80 20 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20   #endif.  }.  . 
18a90 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c   /* Compute coll
18aa0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20  ating sequences 
18ab0 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65  used by .  ** te
18ac0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e  mporary tables n
18ad0 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65  eeded to impleme
18ae0 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  nt the compound 
18af0 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74  select..  ** Att
18b00 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  ach the KeyInfo 
18b10 73 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c  structure to all
18b20 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
18b30 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  s..  **.  ** Thi
18b40 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e  s section is run
18b50 20 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   by the right-mo
18b60 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  st SELECT statem
18b70 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53  ent only..  ** S
18b80 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
18b90 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77   to the left alw
18ba0 61 79 73 20 73 6b 69 70 20 74 68 69 73 20 70 61  ays skip this pa
18bb0 72 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d  rt.  The right-m
18bc0 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20  ost.  ** SELECT 
18bd0 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20  might also skip 
18be0 74 68 69 73 20 70 61 72 74 20 69 66 20 69 74 20  this part if it 
18bf0 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20  has no ORDER BY 
18c00 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20  clause and.  ** 
18c10 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61  no temp tables a
18c20 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a  re required..  *
18c30 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
18c40 61 67 73 20 26 20 53 46 5f 55 73 65 73 45 70 68  ags & SF_UsesEph
18c50 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e  emeral ){.    in
18c60 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
18c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
18c80 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
18c90 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
18ca0 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
18cb0 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65   /* Collating se
18cc0 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72  quence for the r
18cd0 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20  esult set */.   
18ce0 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20   Select *pLoop; 
18cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18d00 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68  * For looping th
18d10 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74 61  rough SELECT sta
18d20 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43  tements */.    C
18d30 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b  ollSeq **apColl;
18d40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18d50 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f  For looping thro
18d60 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  ugh pKeyInfo->aC
18d70 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74  oll[] */.    int
18d80 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
18d90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
18da0 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
18db0 69 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  in result set */
18dc0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ..    assert( p-
18dd0 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20  >pNext==0 );.   
18de0 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73   nCol = p->pELis
18df0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b  t->nExpr;.    pK
18e00 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
18e10 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c  KeyInfoAlloc(db,
18e20 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69   nCol, 1);.    i
18e30 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  f( !pKeyInfo ){.
18e40 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
18e50 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
18e60 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
18e70 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
18e80 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70  .    for(i=0, ap
18e90 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61  Coll=pKeyInfo->a
18ea0 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  Coll; i<nCol; i+
18eb0 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20  +, apColl++){.  
18ec0 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75      *apColl = mu
18ed0 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
18ee0 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a  (pParse, p, i);.
18ef0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70        if( 0==*ap
18f00 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
18f10 2a 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  *apColl = db->pD
18f20 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  fltColl;.      }
18f30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
18f40 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20  pLoop=p; pLoop; 
18f50 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72  pLoop=pLoop->pPr
18f60 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  ior){.      for(
18f70 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a  i=0; i<2; i++){.
18f80 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
18f90 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70   = pLoop->addrOp
18fa0 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20  enEphm[i];.     
18fb0 20 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b     if( addr<0 ){
18fc0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
18fd0 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74   [0] is unused t
18fe0 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20  hen [1] is also 
18ff0 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63  unused.  So we c
19000 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  an.          ** 
19010 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62  always safely ab
19020 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74  ort as soon as t
19030 68 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20  he first unused 
19040 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f  slot is found */
19050 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
19060 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70  t( pLoop->addrOp
19070 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20  enEphm[1]<0 );. 
19080 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
19090 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
190a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
190b0 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e  ngeP2(v, addr, n
190c0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
190d0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
190e0 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72  4(v, addr, (char
190f0 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  *)sqlite3KeyInfo
19100 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 0a 20  Ref(pKeyInfo),. 
19110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19120 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45             P4_KE
19130 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20  YINFO);.        
19140 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
19150 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20  phm[i] = -1;.   
19160 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
19170 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
19180 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  ef(pKeyInfo);.  
19190 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  }..multi_select_
191a0 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53  end:.  pDest->iS
191b0 64 73 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74  dst = dest.iSdst
191c0 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74  ;.  pDest->nSdst
191d0 20 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20   = dest.nSdst;. 
191e0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
191f0 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 65 74 65  lete(db, pDelete
19200 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
19210 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
19220 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
19230 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a  _SELECT */../*.*
19240 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20  * Error message 
19250 66 6f 72 20 77 68 65 6e 20 74 77 6f 20 6f 72 20  for when two or 
19260 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66 20 61 20  more terms of a 
19270 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
19280 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a  have different.*
19290 2a 20 73 69 7a 65 20 72 65 73 75 6c 74 20 73 65  * size result se
192a0 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ts..*/.void sqli
192b0 74 65 33 53 65 6c 65 63 74 57 72 6f 6e 67 4e 75  te3SelectWrongNu
192c0 6d 54 65 72 6d 73 45 72 72 6f 72 28 50 61 72 73  mTermsError(Pars
192d0 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
192e0 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  t *p){.  if( p->
192f0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61  selFlags & SF_Va
19300 6c 75 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69  lues ){.    sqli
19310 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
19320 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53 20  se, "all VALUES 
19330 6d 75 73 74 20 68 61 76 65 20 74 68 65 20 73 61  must have the sa
19340 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72  me number of ter
19350 6d 73 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ms");.  }else{. 
19360 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
19370 73 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45  sg(pParse, "SELE
19380 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  CTs to the left 
19390 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 22  and right of %s"
193a0 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20  .      " do not 
193b0 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
193c0 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
193d0 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f  olumns", selectO
193e0 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
193f0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
19400 20 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f   an output subro
19410 75 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f  utine for a coro
19420 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61  utine implementa
19430 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c  tion of a.** SEL
19440 45 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a  ECT statment..**
19450 0a 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20  .** The data to 
19460 62 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e  be output is con
19470 74 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69  tained in pIn->i
19480 53 64 73 74 2e 20 20 54 68 65 72 65 20 61 72 65  Sdst.  There are
19490 0a 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63  .** pIn->nSdst c
194a0 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74  olumns to be out
194b0 70 75 74 2e 20 20 70 44 65 73 74 20 69 73 20 77  put.  pDest is w
194c0 68 65 72 65 20 74 68 65 20 6f 75 74 70 75 74 20  here the output 
194d0 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e  should.** be sen
194e0 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75  t..**.** regRetu
194f0 72 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  rn is the number
19500 20 6f 66 20 74 68 65 20 72 65 67 69 73 74 65 72   of the register
19510 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62   holding the sub
19520 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
19530 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a  n address..**.**
19540 20 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68   If regPrev>0 th
19550 65 6e 20 69 74 20 69 73 20 74 68 65 20 66 69 72  en it is the fir
19560 73 74 20 72 65 67 69 73 74 65 72 20 69 6e 20 61  st register in a
19570 20 76 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20   vector that.** 
19580 72 65 63 6f 72 64 73 20 74 68 65 20 70 72 65 76  records the prev
19590 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65  ious output.  me
195a0 6d 5b 72 65 67 50 72 65 76 5d 20 69 73 20 61 20  m[regPrev] is a 
195b0 66 6c 61 67 20 74 68 61 74 20 69 73 20 66 61 6c  flag that is fal
195c0 73 65 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68  se.** if there h
195d0 61 73 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69  as been no previ
195e0 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20  ous output.  If 
195f0 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63  regPrev>0 then c
19600 6f 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61  ode is.** genera
19610 74 65 64 20 74 6f 20 73 75 70 70 72 65 73 73 20  ted to suppress 
19620 64 75 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65  duplicates.  pKe
19630 79 49 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f  yInfo is used fo
19640 72 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b  r comparing.** k
19650 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  eys..**.** If th
19660 65 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e  e LIMIT found in
19670 20 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65   p->iLimit is re
19680 61 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65  ached, jump imme
19690 64 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42  diately to.** iB
196a0 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  reak..*/.static 
196b0 69 6e 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70  int generateOutp
196c0 75 74 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20  utSubroutine(.  
196d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
196e0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
196f0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
19700 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
19710 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
19720 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
19730 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
19740 2a 70 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20  *pIn,        /* 
19750 43 6f 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79  Coroutine supply
19760 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65  ing data */.  Se
19770 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c  lectDest *pDest,
19780 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
19790 6f 20 73 65 6e 64 20 74 68 65 20 64 61 74 61 20  o send the data 
197a0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75  */.  int regRetu
197b0 72 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rn,          /* 
197c0 54 68 65 20 72 65 74 75 72 6e 20 61 64 64 72 65  The return addre
197d0 73 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  ss register */. 
197e0 20 69 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20   int regPrev,   
197f0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
19800 69 6f 75 73 20 72 65 73 75 6c 74 20 72 65 67 69  ious result regi
19810 73 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65  ster.  No unique
19820 6e 65 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b  ness if 0 */.  K
19830 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
19840 2c 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f  ,      /* For co
19850 6d 70 61 72 69 6e 67 20 77 69 74 68 20 70 72 65  mparing with pre
19860 76 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20  vious entry */. 
19870 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20   int iBreak     
19880 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
19890 20 68 65 72 65 20 69 66 20 77 65 20 68 69 74 20   here if we hit 
198a0 74 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a  the LIMIT */.){.
198b0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
198c0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
198d0 20 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e   iContinue;.  in
198e0 74 20 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20  t addr;..  addr 
198f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
19900 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
19910 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74  Continue = sqlit
19920 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
19930 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 53  pParse);..  /* S
19940 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74  uppress duplicat
19950 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58  es for UNION, EX
19960 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53  CEPT, and INTERS
19970 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ECT .  */.  if( 
19980 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20 69  regPrev ){.    i
19990 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b  nt addr1, addr2;
199a0 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c  .    addr1 = sql
199b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
199c0 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50  , OP_IfNot, regP
199d0 72 65 76 29 3b 20 56 64 62 65 43 6f 76 65 72 61  rev); VdbeCovera
199e0 67 65 28 76 29 3b 0a 20 20 20 20 61 64 64 72 32  ge(v);.    addr2
199f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
19a00 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp4(v, OP_Compa
19a10 72 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  re, pIn->iSdst, 
19a20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e  regPrev+1, pIn->
19a30 6e 53 64 73 74 2c 0a 20 20 20 20 20 20 20 20 20  nSdst,.         
19a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a50 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69       (char*)sqli
19a60 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b  te3KeyInfoRef(pK
19a70 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49  eyInfo), P4_KEYI
19a80 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  NFO);.    sqlite
19a90 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
19aa0 50 5f 4a 75 6d 70 2c 20 61 64 64 72 32 2b 32 2c  P_Jump, addr2+2,
19ab0 20 69 43 6f 6e 74 69 6e 75 65 2c 20 61 64 64 72   iContinue, addr
19ac0 32 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61  2+2); VdbeCovera
19ad0 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
19ae0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
19af0 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71  , addr1);.    sq
19b00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
19b10 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49 6e 2d  v, OP_Copy, pIn-
19b20 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b  >iSdst, regPrev+
19b30 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d 31 29  1, pIn->nSdst-1)
19b40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
19b50 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
19b60 74 65 67 65 72 2c 20 31 2c 20 72 65 67 50 72 65  teger, 1, regPre
19b70 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  v);.  }.  if( pP
19b80 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
19b90 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
19ba0 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73  0;..  /* Suppres
19bb0 73 20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53  s the first OFFS
19bc0 45 54 20 65 6e 74 72 69 65 73 20 69 66 20 74 68  ET entries if th
19bd0 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54  ere is an OFFSET
19be0 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63   clause.  */.  c
19bf0 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e  odeOffset(v, p->
19c00 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e  iOffset, iContin
19c10 75 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ue);..  assert( 
19c20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
19c30 54 5f 45 78 69 73 74 73 20 29 3b 0a 20 20 61 73  T_Exists );.  as
19c40 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65  sert( pDest->eDe
19c50 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b  st!=SRT_Table );
19c60 0a 20 20 73 77 69 74 63 68 28 20 70 44 65 73 74  .  switch( pDest
19c70 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f  ->eDest ){.    /
19c80 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
19c90 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67  lt as data using
19ca0 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20   a unique key.. 
19cb0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
19cc0 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20  RT_EphemTab: {. 
19cd0 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
19ce0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
19cf0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
19d00 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47  nt r2 = sqlite3G
19d10 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
19d20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19d30 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
19d40 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e  _MakeRecord, pIn
19d50 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
19d60 64 73 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  dst, r1);.      
19d70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19d80 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
19d90 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
19da0 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r2);.      sql
19db0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
19dc0 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44 65  , OP_Insert, pDe
19dd0 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c  st->iSDParm, r1,
19de0 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r2);.      sqli
19df0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
19e00 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
19e10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19e20 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
19e30 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20  Parse, r2);.    
19e40 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
19e50 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
19e60 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r1);.      break
19e70 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
19e80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
19e90 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20  QUERY.    /* If 
19ea0 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20  we are creating 
19eb0 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78  a set for an "ex
19ec0 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
19ed0 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  .)"..    */.    
19ee0 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
19ef0 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20        int r1;.  
19f00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 49      testcase( pI
19f10 6e 2d 3e 6e 53 64 73 74 3e 31 20 29 3b 0a 20 20  n->nSdst>1 );.  
19f20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
19f30 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
19f40 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
19f50 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
19f60 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49  P_MakeRecord, pI
19f70 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
19f80 53 64 73 74 2c 20 0a 20 20 20 20 20 20 20 20 20  Sdst, .         
19f90 20 72 31 2c 20 70 44 65 73 74 2d 3e 7a 41 66 66   r1, pDest->zAff
19fa0 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
19fb0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19fc0 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
19fd0 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
19fe0 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
19ff0 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
1a000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
1a010 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
1a020 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Sdst);.      sql
1a030 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1a040 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
1a050 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a060 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1a070 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73  is is a scalar s
1a080 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61  elect that is pa
1a090 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
1a0a0 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
1a0b0 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
1a0c0 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70  ts in the approp
1a0d0 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c  riate memory cel
1a0e0 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a  l and break out.
1a0f0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63      ** of the sc
1a100 61 6e 20 6c 6f 6f 70 2e 20 20 4e 6f 74 65 20 74  an loop.  Note t
1a110 68 61 74 20 74 68 65 20 73 65 6c 65 63 74 20 6d  hat the select m
1a120 69 67 68 74 20 72 65 74 75 72 6e 20 6d 75 6c 74  ight return mult
1a130 69 70 6c 65 20 63 6f 6c 75 6d 6e 73 0a 20 20 20  iple columns.   
1a140 20 2a 2a 20 69 66 20 69 74 20 69 73 20 74 68 65   ** if it is the
1a150 20 52 48 53 20 6f 66 20 61 20 72 6f 77 2d 76 61   RHS of a row-va
1a160 6c 75 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e  lue IN operator.
1a170 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1a180 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20   SRT_Mem: {.    
1a190 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
1a1a0 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rr==0 ){.       
1a1b0 20 74 65 73 74 63 61 73 65 28 20 70 49 6e 2d 3e   testcase( pIn->
1a1c0 6e 53 64 73 74 3e 31 20 29 3b 0a 20 20 20 20 20  nSdst>1 );.     
1a1d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1a1e0 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70  deMove(pParse, p
1a1f0 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74  In->iSdst, pDest
1a200 2d 3e 69 53 44 50 61 72 6d 2c 20 70 49 6e 2d 3e  ->iSDParm, pIn->
1a210 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  nSdst);.      }.
1a220 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
1a230 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a  IT clause will j
1a240 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  ump out of the l
1a250 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
1a260 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1a270 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
1a280 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1a290 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
1a2a0 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  /* The results a
1a2b0 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73  re stored in a s
1a2c0 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73  equence of regis
1a2d0 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72  ters.    ** star
1a2e0 74 69 6e 67 20 61 74 20 70 44 65 73 74 2d 3e 69  ting at pDest->i
1a2f0 53 64 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20  Sdst.  Then the 
1a300 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c 64  co-routine yield
1a310 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  s..    */.    ca
1a320 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  se SRT_Coroutine
1a330 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44  : {.      if( pD
1a340 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b  est->iSdst==0 ){
1a350 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e  .        pDest->
1a360 69 53 64 73 74 20 3d 20 73 71 6c 69 74 65 33 47  iSdst = sqlite3G
1a370 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
1a380 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  se, pIn->nSdst);
1a390 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e  .        pDest->
1a3a0 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64  nSdst = pIn->nSd
1a3b0 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  st;.      }.    
1a3c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1a3d0 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49  eMove(pParse, pI
1a3e0 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d  n->iSdst, pDest-
1a3f0 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
1a400 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
1a410 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
1a420 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d  OP_Yield, pDest-
1a430 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  >iSDParm);.     
1a440 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1a450 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66     /* If none of
1a460 20 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65 6e   the above, then
1a470 20 74 68 65 20 72 65 73 75 6c 74 20 64 65 73 74   the result dest
1a480 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a  ination must be.
1a490 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75      ** SRT_Outpu
1a4a0 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
1a4b0 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
1a4c0 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72 0a   with any other.
1a4d0 20 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69      ** destinati
1a4e0 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  on other than th
1a4f0 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20 61  e ones handled a
1a500 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74 70  bove or SRT_Outp
1a510 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ut..    **.    *
1a520 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75 74  * For SRT_Output
1a530 2c 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74  , results are st
1a540 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e  ored in a sequen
1a550 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e  ce of registers.
1a560 20 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 74    .    ** Then t
1a570 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20  he OP_ResultRow 
1a580 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20 74  opcode is used t
1a590 6f 20 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f  o cause sqlite3_
1a5a0 73 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a  step() to.    **
1a5b0 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74   return the next
1a5c0 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a   row of result..
1a5d0 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
1a5e0 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
1a5f0 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  rt( pDest->eDest
1a600 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a  ==SRT_Output );.
1a610 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a620 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
1a630 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53  sultRow, pIn->iS
1a640 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
1a650 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1a660 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a     }.  }..  /* J
1a670 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ump to the end o
1a680 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68  f the loop if th
1a690 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68  e LIMIT is reach
1a6a0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
1a6b0 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
1a6c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a6d0 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70  2(v, OP_DecrJump
1a6e0 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  Zero, p->iLimit,
1a6f0 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
1a700 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a  verage(v);.  }..
1a710 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
1a720 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74  e subroutine ret
1a730 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  urn.  */.  sqlit
1a740 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1a750 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29  el(v, iContinue)
1a760 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1a770 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
1a780 72 6e 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a  rn, regReturn);.
1a790 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
1a7a0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61  }../*.** Alterna
1a7b0 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65  tive compound se
1a7c0 6c 65 63 74 20 63 6f 64 65 20 67 65 6e 65 72 61  lect code genera
1a7d0 74 6f 72 20 66 6f 72 20 63 61 73 65 73 20 77 68  tor for cases wh
1a7e0 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61  en there.** is a
1a7f0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
1a800 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75  e..**.** We assu
1a810 6d 65 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  me a query of th
1a820 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d  e following form
1a830 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65  :.**.**      <se
1a840 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f  lectA>  <operato
1a850 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f  r>  <selectB>  O
1a860 52 44 45 52 20 42 59 20 3c 6f 72 64 65 72 62 79  RDER BY <orderby
1a870 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65  list>.**.** <ope
1a880 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66  rator> is one of
1a890 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f   UNION ALL, UNIO
1a8a0 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e  N, EXCEPT, or IN
1a8b0 54 45 52 53 45 43 54 2e 20 20 54 68 65 20 69 64  TERSECT.  The id
1a8c0 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65  ea.** is to code
1a8d0 20 62 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e 20   both <selectA> 
1a8e0 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20 77 69  and <selectB> wi
1a8f0 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  th the ORDER BY 
1a900 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d  clause as.** co-
1a910 72 6f 75 74 69 6e 65 73 2e 20 20 54 68 65 6e 20  routines.  Then 
1a920 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69  run the co-routi
1a930 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20  nes in parallel 
1a940 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72 65  and merge the re
1a950 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68  sults.** into th
1a960 65 20 6f 75 74 70 75 74 2e 20 20 49 6e 20 61 64  e output.  In ad
1a970 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 77  dition to the tw
1a980 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 28 63 61  o coroutines (ca
1a990 6c 6c 65 64 20 73 65 6c 65 63 74 41 20 61 6e 64  lled selectA and
1a9a0 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20 74 68 65  .** selectB) the
1a9b0 72 65 20 61 72 65 20 37 20 73 75 62 72 6f 75 74  re are 7 subrout
1a9c0 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f  ines:.**.**    o
1a9d0 75 74 41 3a 20 20 20 20 4d 6f 76 65 20 74 68 65  utA:    Move the
1a9e0 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73   output of the s
1a9f0 65 6c 65 63 74 41 20 63 6f 72 6f 75 74 69 6e 65  electA coroutine
1aa00 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
1aa10 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1aa20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
1aa30 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  query..**.**    
1aa40 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65 20 74 68  outB:    Move th
1aa50 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20  e output of the 
1aa60 73 65 6c 65 63 74 42 20 63 6f 72 6f 75 74 69 6e  selectB coroutin
1aa70 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  e into the outpu
1aa80 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1aa90 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
1aaa0 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67   query.  (Only g
1aab0 65 6e 65 72 61 74 65 64 20 66 6f 72 20 55 4e 49  enerated for UNI
1aac0 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  ON and.**       
1aad0 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e        UNION ALL.
1aae0 20 20 45 58 43 45 50 54 20 61 6e 64 20 49 4e 53    EXCEPT and INS
1aaf0 45 52 54 53 45 43 54 20 6e 65 76 65 72 20 6f 75  ERTSECT never ou
1ab00 74 70 75 74 20 61 20 72 6f 77 20 74 68 61 74 0a  tput a row that.
1ab10 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 61  **             a
1ab20 70 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42  ppears only in B
1ab30 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42  .).**.**    AltB
1ab40 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
1ab50 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66   there is data f
1ab60 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69  rom both corouti
1ab70 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a  nes and A<B..**.
1ab80 2a 2a 20 20 20 20 41 65 71 42 3a 20 20 20 20 43  **    AeqB:    C
1ab90 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
1aba0 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f   is data from bo
1abb0 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  th coroutines an
1abc0 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20  d A==B..**.**   
1abd0 20 41 67 74 42 3a 20 20 20 20 43 61 6c 6c 65 64   AgtB:    Called
1abe0 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64   when there is d
1abf0 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f  ata from both co
1ac00 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3e 42  routines and A>B
1ac10 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a  ..**.**    EofA:
1ac20 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
1ac30 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65  data is exhauste
1ac40 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a  d from selectA..
1ac50 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20  **.**    EofB:  
1ac60 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61    Called when da
1ac70 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
1ac80 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a  from selectB..**
1ac90 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
1aca0 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61  tation of the la
1acb0 74 74 65 72 20 66 69 76 65 20 73 75 62 72 6f 75  tter five subrou
1acc0 74 69 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e 20  tines depend on 
1acd0 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61  which .** <opera
1ace0 74 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a  tor> is used:.**
1acf0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
1ad00 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20     UNION ALL    
1ad10 20 20 20 20 20 55 4e 49 4f 4e 20 20 20 20 20 20       UNION      
1ad20 20 20 20 20 20 20 45 58 43 45 50 54 20 20 20 20        EXCEPT    
1ad30 20 20 20 20 20 20 49 4e 54 45 52 53 45 43 54 0a        INTERSECT.
1ad40 2a 2a 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d  **          ----
1ad50 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d  ---------  -----
1ad60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d  ------------  --
1ad70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d  ------------  --
1ad80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1ad90 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f 75 74  **   AltB:   out
1ada0 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75  A, nextA      ou
1adb0 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
1adc0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
1add0 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20      nextA.**.** 
1ade0 20 20 41 65 71 42 3a 20 20 20 6f 75 74 41 2c 20    AeqB:   outA, 
1adf0 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65  nextA         ne
1ae00 78 74 41 20 20 20 20 20 20 20 20 20 20 20 20 20  xtA             
1ae10 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6f 75  nextA         ou
1ae20 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20  tA, nextA.**.** 
1ae30 20 20 41 67 74 42 3a 20 20 20 6f 75 74 42 2c 20    AgtB:   outB, 
1ae40 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c  nextB      outB,
1ae50 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
1ae60 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20 20  nextB           
1ae70 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45   nextB.**.**   E
1ae80 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78  ofA:   outB, nex
1ae90 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65  tB      outB, ne
1aea0 78 74 42 20 20 20 20 20 20 20 20 20 20 68 61 6c  xtB          hal
1aeb0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 68 61  t             ha
1aec0 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a  lt.**.**   EofB:
1aed0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
1aee0 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
1aef0 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
1af00 41 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a  A         halt.*
1af10 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74 42  *.** In the AltB
1af20 2c 20 41 65 71 42 2c 20 61 6e 64 20 41 67 74 42  , AeqB, and AgtB
1af30 20 73 75 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e   subroutines, an
1af40 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77   EOF on A follow
1af50 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75  ing nextA.** cau
1af60 73 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  ses an immediate
1af70 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e   jump to EofA an
1af80 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f  d an EOF on B fo
1af90 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20 63 61  llowing nextB ca
1afa0 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64  uses.** an immed
1afb0 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66  iate jump to Eof
1afc0 42 2e 20 20 57 69 74 68 69 6e 20 45 6f 66 41 20  B.  Within EofA 
1afd0 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f  and EofB, and EO
1afe0 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a  F on entry or.**
1aff0 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58   following nextX
1b000 20 63 61 75 73 65 73 20 61 20 6a 75 6d 70 20 74   causes a jump t
1b010 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
1b020 20 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69   select processi
1b030 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63  ng..**.** Duplic
1b040 61 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74  ate removal in t
1b050 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54  he UNION, EXCEPT
1b060 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20  , and INTERSECT 
1b070 63 61 73 65 73 20 69 73 20 68 61 6e 64 6c 65 64  cases is handled
1b080 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 6f  .** within the o
1b090 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
1b0a0 2e 20 20 54 68 65 20 72 65 67 50 72 65 76 20 72  .  The regPrev r
1b0b0 65 67 69 73 74 65 72 20 73 65 74 20 68 6f 6c 64  egister set hold
1b0c0 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79  s the previously
1b0d0 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c 75 65  .** output value
1b0e0 2e 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20  .  A comparison 
1b0f0 69 73 20 6d 61 64 65 20 61 67 61 69 6e 73 74 20  is made against 
1b100 74 68 69 73 20 76 61 6c 75 65 20 61 6e 64 20 74  this value and t
1b110 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20  he output.** is 
1b120 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6e  skipped if the n
1b130 65 78 74 20 72 65 73 75 6c 74 73 20 77 6f 75 6c  ext results woul
1b140 64 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  d be the same as
1b150 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a   the previous..*
1b160 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
1b170 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20  ntation plan is 
1b180 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
1b190 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20   two coroutines 
1b1a0 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62  and seven.** sub
1b1b0 72 6f 75 74 69 6e 65 73 20 66 69 72 73 74 2c 20  routines first, 
1b1c0 74 68 65 6e 20 70 75 74 20 74 68 65 20 63 6f 6e  then put the con
1b1d0 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74 68  trol logic at th
1b1e0 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20  e bottom.  Like 
1b1f0 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
1b200 20 20 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a       goto Init.*
1b210 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75  *     coA: corou
1b220 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 71 75  tine for left qu
1b230 65 72 79 20 28 41 29 0a 2a 2a 20 20 20 20 20 63  ery (A).**     c
1b240 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  oB: coroutine fo
1b250 72 20 72 69 67 68 74 20 71 75 65 72 79 20 28 42  r right query (B
1b260 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75  ).**    outA: ou
1b270 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20  tput one row of 
1b280 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75  A.**    outB: ou
1b290 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20  tput one row of 
1b2a0 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49  B (UNION and UNI
1b2b0 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20  ON ALL only).** 
1b2c0 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20     EofA: ....** 
1b2d0 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20     EofB: ....** 
1b2e0 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20     AltB: ....** 
1b2f0 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20     AeqB: ....** 
1b300 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20     AgtB: ....** 
1b310 20 20 20 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c     Init: initial
1b320 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20 72 65  ize coroutine re
1b330 67 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20 20  gisters.**      
1b340 20 20 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a      yield coA.**
1b350 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66            if eof
1b360 28 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a  (A) goto EofA.**
1b370 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
1b380 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  coB.**          
1b390 69 66 20 65 6f 66 28 42 29 20 67 6f 74 6f 20 45  if eof(B) goto E
1b3a0 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20  ofB.**    Cmpr: 
1b3b0 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20  Compare A, B.** 
1b3c0 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20 41 6c           Jump Al
1b3d0 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 0a 2a  tB, AeqB, AgtB.*
1b3e0 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a  *     End: ....*
1b3f0 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74  *.** We call Alt
1b400 42 2c 20 41 65 71 42 2c 20 41 67 74 42 2c 20 45  B, AeqB, AgtB, E
1b410 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42 20 22 73  ofA, and EofB "s
1b420 75 62 72 6f 75 74 69 6e 65 73 22 20 62 75 74 20  ubroutines" but 
1b430 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20  they are not.** 
1b440 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20  actually called 
1b450 75 73 69 6e 67 20 47 6f 73 75 62 20 61 6e 64 20  using Gosub and 
1b460 74 68 65 79 20 64 6f 20 6e 6f 74 20 52 65 74 75  they do not Retu
1b470 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20 45 6f  rn.  EofA and Eo
1b480 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c  fB loop.** until
1b490 20 61 6c 6c 20 64 61 74 61 20 69 73 20 65 78 68   all data is exh
1b4a0 61 75 73 74 65 64 20 74 68 65 6e 20 6a 75 6d 70  austed then jump
1b4b0 20 74 6f 20 74 68 65 20 22 65 6e 64 22 20 6c 61   to the "end" la
1b4c0 62 65 2e 20 20 41 6c 74 42 2c 20 41 65 71 42 2c  be.  AltB, AeqB,
1b4d0 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a 75 6d  .** and AgtB jum
1b4e0 70 20 74 6f 20 65 69 74 68 65 72 20 4c 32 20 6f  p to either L2 o
1b4f0 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41  r to one of EofA
1b500 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66   or EofB..*/.#if
1b510 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1b520 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
1b530 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
1b540 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a  iSelectOrderBy(.
1b550 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1b560 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
1b570 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1b580 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
1b590 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
1b5a0 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43  ht-most of SELEC
1b5b0 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  Ts to be coded *
1b5c0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
1b5d0 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
1b5e0 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
1b5f0 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
1b600 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
1b610 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1b620 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53   counters */.  S
1b630 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20  elect *pPrior;  
1b640 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20       /* Another 
1b650 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65  SELECT immediate
1b660 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a  ly to our left *
1b670 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
1b680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
1b690 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68  erate code to th
1b6a0 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c  is VDBE */.  Sel
1b6b0 65 63 74 44 65 73 74 20 64 65 73 74 41 3b 20 20  ectDest destA;  
1b6c0 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f     /* Destinatio
1b6d0 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20  n for coroutine 
1b6e0 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  A */.  SelectDes
1b6f0 74 20 64 65 73 74 42 3b 20 20 20 20 20 2f 2a 20  t destB;     /* 
1b700 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20  Destination for 
1b710 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20  coroutine B */. 
1b720 20 69 6e 74 20 72 65 67 41 64 64 72 41 3b 20 20   int regAddrA;  
1b730 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
1b740 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  s register for s
1b750 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e  elect-A coroutin
1b760 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64  e */.  int regAd
1b770 64 72 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  drB;         /* 
1b780 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
1b790 20 66 6f 72 20 73 65 6c 65 63 74 2d 42 20 63 6f   for select-B co
1b7a0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1b7b0 20 61 64 64 72 53 65 6c 65 63 74 41 3b 20 20 20   addrSelectA;   
1b7c0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
1b7d0 20 74 68 65 20 73 65 6c 65 63 74 2d 41 20 63 6f   the select-A co
1b7e0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1b7f0 20 61 64 64 72 53 65 6c 65 63 74 42 3b 20 20 20   addrSelectB;   
1b800 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
1b810 20 74 68 65 20 73 65 6c 65 63 74 2d 42 20 63 6f   the select-B co
1b820 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1b830 20 72 65 67 4f 75 74 41 3b 20 20 20 20 20 20 20   regOutA;       
1b840 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
1b850 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f  gister for the o
1b860 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69  utput-A subrouti
1b870 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ne */.  int regO
1b880 75 74 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  utB;          /*
1b890 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
1b8a0 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74  r for the output
1b8b0 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -B subroutine */
1b8c0 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 41 3b  .  int addrOutA;
1b8d0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
1b8e0 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ess of the outpu
1b8f0 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-A subroutine *
1b900 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 42  /.  int addrOutB
1b910 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41 64 64   = 0;     /* Add
1b920 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70  ress of the outp
1b930 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-B subroutine 
1b940 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66  */.  int addrEof
1b950 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  A;         /* Ad
1b960 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
1b970 65 63 74 2d 41 2d 65 78 68 61 75 73 74 65 64 20  ect-A-exhausted 
1b980 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
1b990 69 6e 74 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42  int addrEofA_noB
1b9a0 3b 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61  ;     /* Alterna
1b9b0 74 65 20 61 64 64 72 45 6f 66 41 20 69 66 20 42  te addrEofA if B
1b9c0 20 69 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   is uninitialize
1b9d0 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45  d */.  int addrE
1b9e0 6f 66 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ofB;         /* 
1b9f0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73  Address of the s
1ba00 65 6c 65 63 74 2d 42 2d 65 78 68 61 75 73 74 65  elect-B-exhauste
1ba10 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  d subroutine */.
1ba20 20 20 69 6e 74 20 61 64 64 72 41 6c 74 42 3b 20    int addrAltB; 
1ba30 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
1ba40 73 73 20 6f 66 20 74 68 65 20 41 3c 42 20 73 75  ss of the A<B su
1ba50 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
1ba60 74 20 61 64 64 72 41 65 71 42 3b 20 20 20 20 20  t addrAeqB;     
1ba70 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
1ba80 66 20 74 68 65 20 41 3d 3d 42 20 73 75 62 72 6f  f the A==B subro
1ba90 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
1baa0 64 64 72 41 67 74 42 3b 20 20 20 20 20 20 20 20  ddrAgtB;        
1bab0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
1bac0 68 65 20 41 3e 42 20 73 75 62 72 6f 75 74 69 6e  he A>B subroutin
1bad0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69  e */.  int regLi
1bae0 6d 69 74 41 3b 20 20 20 20 20 20 20 20 2f 2a 20  mitA;        /* 
1baf0 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66  Limit register f
1bb00 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20  or select-A */. 
1bb10 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b 20   int regLimitB; 
1bb20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20         /* Limit 
1bb30 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
1bb40 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72  ect-A */.  int r
1bb50 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20 20  egPrev;         
1bb60 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66 20 72   /* A range of r
1bb70 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64  egisters to hold
1bb80 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
1bb90 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4c   */.  int savedL
1bba0 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53  imit;       /* S
1bbb0 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d  aved value of p-
1bbc0 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74  >iLimit */.  int
1bbd0 20 73 61 76 65 64 4f 66 66 73 65 74 3b 20 20 20   savedOffset;   
1bbe0 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75     /* Saved valu
1bbf0 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74 20  e of p->iOffset 
1bc00 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d  */.  int labelCm
1bc10 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 61  pr;        /* La
1bc20 62 65 6c 20 66 6f 72 20 74 68 65 20 73 74 61 72  bel for the star
1bc30 74 20 6f 66 20 74 68 65 20 6d 65 72 67 65 20 61  t of the merge a
1bc40 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e  lgorithm */.  in
1bc50 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20 20  t labelEnd;     
1bc60 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
1bc70 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1bc80 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43 54 20 73  overall SELECT s
1bc90 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  tmt */.  int add
1bca0 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  r1;            /
1bcb0 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75 63 74 69  * Jump instructi
1bcc0 6f 6e 73 20 74 68 61 74 20 67 65 74 20 72 65 74  ons that get ret
1bcd0 61 72 67 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e  argetted */.  in
1bce0 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
1bcf0 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b      /* One of TK
1bd00 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20  _ALL, TK_UNION, 
1bd10 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e  TK_EXCEPT, TK_IN
1bd20 54 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79  TERSECT */.  Key
1bd30 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20  Info *pKeyDup = 
1bd40 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e  0; /* Comparison
1bd50 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
1bd60 20 64 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76   duplicate remov
1bd70 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  al */.  KeyInfo 
1bd80 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a  *pKeyMerge;   /*
1bd90 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f   Comparison info
1bda0 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67  rmation for merg
1bdb0 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71  ing rows */.  sq
1bdc0 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
1bdd0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1bde0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
1bdf0 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
1be00 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  By;   /* The ORD
1be10 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
1be20 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20    int nOrderBy; 
1be30 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1be40 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68  r of terms in th
1be50 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1be60 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72  e */.  int *aPer
1be70 6d 75 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  mute;        /* 
1be80 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44  Mapping from ORD
1be90 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 72  ER BY terms to r
1bea0 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e  esult set column
1beb0 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
1bec0 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 29  p->pOrderBy!=0 )
1bed0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
1bee0 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61  Dup==0 ); /* "Ma
1bef0 6e 61 67 65 64 22 20 63 6f 64 65 20 6e 65 65 64  naged" code need
1bf00 73 20 74 68 69 73 2e 20 20 54 69 63 6b 65 74 20  s this.  Ticket 
1bf10 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d  #3382. */.  db =
1bf20 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76   pParse->db;.  v
1bf30 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
1bf40 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
1bf50 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 72   );       /* Alr
1bf60 65 61 64 79 20 74 68 72 6f 77 6e 20 74 68 65 20  eady thrown the 
1bf70 65 72 72 6f 72 20 69 66 20 56 44 42 45 20 61 6c  error if VDBE al
1bf80 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  loc failed */.  
1bf90 6c 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74  labelEnd = sqlit
1bfa0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1bfb0 70 50 61 72 73 65 29 3b 0a 20 20 6c 61 62 65 6c  pParse);.  label
1bfc0 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Cmpr = sqlite3Vd
1bfd0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
1bfe0 73 65 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63  se);...  /* Patc
1bff0 68 20 75 70 20 74 68 65 20 4f 52 44 45 52 20 42  h up the ORDER B
1c000 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  Y clause.  */.  
1c010 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20  op = p->op;  .  
1c020 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
1c030 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  or;.  assert( pP
1c040 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  rior->pOrderBy==
1c050 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20  0 );.  pOrderBy 
1c060 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
1c070 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
1c080 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20  y );.  nOrderBy 
1c090 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
1c0a0 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65  r;..  /* For ope
1c0b0 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61  rators other tha
1c0c0 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68  n UNION ALL we h
1c0d0 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ave to make sure
1c0e0 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f   that.  ** the O
1c0f0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63  RDER BY clause c
1c100 6f 76 65 72 73 20 65 76 65 72 79 20 74 65 72 6d  overs every term
1c110 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73   of the result s
1c120 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65  et.  Add.  ** te
1c130 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52  rms to the ORDER
1c140 20 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65   BY clause as ne
1c150 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
1c160 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29  if( op!=TK_ALL )
1c170 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64  {.    for(i=1; d
1c180 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
1c190 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69  =0 && i<=p->pELi
1c1a0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
1c1b0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
1c1c0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
1c1d0 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  em;.      for(j=
1c1e0 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  0, pItem=pOrderB
1c1f0 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79  y->a; j<nOrderBy
1c200 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
1c210 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1c220 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
1c230 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20  erByCol>0 );.   
1c240 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
1c250 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d  u.x.iOrderByCol=
1c260 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =i ) break;.    
1c270 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d    }.      if( j=
1c280 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  =nOrderBy ){.   
1c290 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20       Expr *pNew 
1c2a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
1c2b0 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29  , TK_INTEGER, 0)
1c2c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
1c2d0 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ew==0 ) return S
1c2e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
1c2f0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
1c300 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56  flags |= EP_IntV
1c310 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e  alue;.        pN
1c320 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69  ew->u.iValue = i
1c330 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72  ;.        p->pOr
1c340 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
1c350 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
1c360 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
1c370 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29   pOrderBy, pNew)
1c380 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
1c390 72 64 65 72 42 79 20 29 20 70 4f 72 64 65 72 42  rderBy ) pOrderB
1c3a0 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d  y->a[nOrderBy++]
1c3b0 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
1c3c0 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20   = (u16)i;.     
1c3d0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1c3e0 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  /* Compute the c
1c3f0 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74  omparison permut
1c400 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66  ation and keyinf
1c410 6f 20 74 68 61 74 20 69 73 20 75 73 65 64 20 77  o that is used w
1c420 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72  ith.  ** the per
1c430 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f  mutation used to
1c440 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
1c450 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20  e next.  ** row 
1c460 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73  of results comes
1c470 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72   from selectA or
1c480 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20   selectB.  Also 
1c490 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a  add explicit.  *
1c4a0 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20  * collations to 
1c4b0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1c4c0 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61  use terms so tha
1c4d0 74 20 77 68 65 6e 20 74 68 65 20 73 75 62 71 75  t when the subqu
1c4e0 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68  eries.  ** to th
1c4f0 65 20 72 69 67 68 74 20 61 6e 64 20 74 68 65 20  e right and the 
1c500 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75 61 74  left are evaluat
1c510 65 64 2c 20 74 68 65 79 20 75 73 65 20 74 68 65  ed, they use the
1c520 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f   correct.  ** co
1c530 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  llation..  */.  
1c540 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74  aPermute = sqlit
1c550 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
1c560 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a  db, sizeof(int)*
1c570 28 6e 4f 72 64 65 72 42 79 20 2b 20 31 29 29 3b  (nOrderBy + 1));
1c580 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74 65 20  .  if( aPermute 
1c590 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
1c5a0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
1c5b0 65 6d 3b 0a 20 20 20 20 61 50 65 72 6d 75 74 65  em;.    aPermute
1c5c0 5b 30 5d 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a  [0] = nOrderBy;.
1c5d0 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 74      for(i=1, pIt
1c5e0 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20  em=pOrderBy->a; 
1c5f0 69 3c 3d 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b  i<=nOrderBy; i++
1c600 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1c610 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
1c620 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
1c630 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >0 );.      asse
1c640 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  rt( pItem->u.x.i
1c650 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70  OrderByCol<=p->p
1c660 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
1c670 20 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b 69        aPermute[i
1c680 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  ] = pItem->u.x.i
1c690 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b 0a  OrderByCol - 1;.
1c6a0 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65      }.    pKeyMe
1c6b0 72 67 65 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  rge = multiSelec
1c6c0 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28  tOrderByKeyInfo(
1c6d0 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20  pParse, p, 1);. 
1c6e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79   }else{.    pKey
1c6f0 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Merge = 0;.  }..
1c700 20 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68    /* Reattach th
1c710 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1c720 65 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a  e to the query..
1c730 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72    */.  p->pOrder
1c740 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
1c750 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
1c760 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
1c770 69 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64  istDup(pParse->d
1c780 62 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29 3b  b, pOrderBy, 0);
1c790 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
1c7a0 61 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f  a range of tempo
1c7b0 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61  rary registers a
1c7c0 6e 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e  nd the KeyInfo n
1c7d0 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74  eeded.  ** for t
1c7e0 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65  he logic that re
1c7f0 6d 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65 20  moves duplicate 
1c800 72 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e  result rows when
1c810 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74   the.  ** operat
1c820 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43  or is UNION, EXC
1c830 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43  EPT, or INTERSEC
1c840 54 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e  T (but not UNION
1c850 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66   ALL)..  */.  if
1c860 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op==TK_ALL ){.
1c870 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b      regPrev = 0;
1c880 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1c890 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c  t nExpr = p->pEL
1c8a0 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
1c8b0 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79  assert( nOrderBy
1c8c0 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d  >=nExpr || db->m
1c8d0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
1c8e0 20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61     regPrev = pPa
1c8f0 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
1c900 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
1c910 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 73 71   nExpr+1;.    sq
1c920 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1c930 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
1c940 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20  , regPrev);.    
1c950 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65  pKeyDup = sqlite
1c960 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
1c970 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20  , nExpr, 1);.   
1c980 20 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a   if( pKeyDup ){.
1c990 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
1c9a0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
1c9b0 69 74 65 61 62 6c 65 28 70 4b 65 79 44 75 70 29  iteable(pKeyDup)
1c9c0 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   );.      for(i=
1c9d0 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29  0; i<nExpr; i++)
1c9e0 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75  {.        pKeyDu
1c9f0 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75  p->aColl[i] = mu
1ca00 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
1ca10 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a  (pParse, p, i);.
1ca20 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d          pKeyDup-
1ca30 3e 61 53 6f 72 74 46 6c 61 67 73 5b 69 5d 20 3d  >aSortFlags[i] =
1ca40 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1ca50 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70  }.  }. .  /* Sep
1ca60 61 72 61 74 65 20 74 68 65 20 6c 65 66 74 20 61  arate the left a
1ca70 6e 64 20 74 68 65 20 72 69 67 68 74 20 71 75 65  nd the right que
1ca80 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74  ry from one anot
1ca90 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50  her.  */.  p->pP
1caa0 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72 69  rior = 0;.  pPri
1cab0 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  or->pNext = 0;. 
1cac0 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f   sqlite3ResolveO
1cad0 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72  rderGroupBy(pPar
1cae0 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72  se, p, p->pOrder
1caf0 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20  By, "ORDER");.  
1cb00 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69  if( pPrior->pPri
1cb10 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  or==0 ){.    sql
1cb20 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72  ite3ResolveOrder
1cb30 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20  GroupBy(pParse, 
1cb40 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e  pPrior, pPrior->
1cb50 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52  pOrderBy, "ORDER
1cb60 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  ");.  }..  /* Co
1cb70 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20  mpute the limit 
1cb80 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 63  registers */.  c
1cb90 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
1cba0 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
1cbb0 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28  labelEnd);.  if(
1cbc0 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70   p->iLimit && op
1cbd0 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
1cbe0 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50  regLimitA = ++pP
1cbf0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1cc00 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50  regLimitB = ++pP
1cc10 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1cc20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1cc30 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d  2(v, OP_Copy, p-
1cc40 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f  >iOffset ? p->iO
1cc50 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69  ffset+1 : p->iLi
1cc60 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  mit,.           
1cc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc80 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74 41         regLimitA
1cc90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1cca0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
1ccb0 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20  opy, regLimitA, 
1ccc0 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65  regLimitB);.  }e
1ccd0 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69  lse{.    regLimi
1cce0 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d  tA = regLimitB =
1ccf0 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
1cd00 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
1cd10 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d  p->pLimit);.  p-
1cd20 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20  >pLimit = 0;..  
1cd30 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61  regAddrA = ++pPa
1cd40 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
1cd50 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65  AddrB = ++pParse
1cd60 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74  ->nMem;.  regOut
1cd70 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
1cd80 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20  em;.  regOutB = 
1cd90 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1cda0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
1cdb0 65 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20  estInit(&destA, 
1cdc0 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72  SRT_Coroutine, r
1cdd0 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69  egAddrA);.  sqli
1cde0 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
1cdf0 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f  t(&destB, SRT_Co
1ce00 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
1ce10 42 29 3b 0a 0a 20 20 45 78 70 6c 61 69 6e 51 75  B);..  ExplainQu
1ce20 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
1ce30 20 31 2c 20 22 4d 45 52 47 45 20 28 25 73 29 22   1, "MERGE (%s)"
1ce40 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70  , selectOpName(p
1ce50 2d 3e 6f 70 29 29 29 3b 0a 0a 20 20 2f 2a 20 47  ->op)));..  /* G
1ce60 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74  enerate a corout
1ce70 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ine to evaluate 
1ce80 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
1ce90 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a  ment to the.  **
1cea0 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d   left of the com
1ceb0 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d  pound operator -
1cec0 20 74 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e   the "A" select.
1ced0 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65  .  */.  addrSele
1cee0 63 74 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ctA = sqlite3Vdb
1cef0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
1cf00 2b 20 31 3b 0a 20 20 61 64 64 72 31 20 3d 20 73  + 1;.  addr1 = s
1cf10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1cf20 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
1cf30 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 2c 20  tine, regAddrA, 
1cf40 30 2c 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b  0, addrSelectA);
1cf50 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
1cf60 76 2c 20 22 6c 65 66 74 20 53 45 4c 45 43 54 22  v, "left SELECT"
1cf70 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c  ));.  pPrior->iL
1cf80 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 41  imit = regLimitA
1cf90 3b 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79  ;.  ExplainQuery
1cfa0 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c  Plan((pParse, 1,
1cfb0 20 22 4c 45 46 54 22 29 29 3b 0a 20 20 73 71 6c   "LEFT"));.  sql
1cfc0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
1cfd0 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74  e, pPrior, &dest
1cfe0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
1cff0 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c  eEndCoroutine(v,
1d000 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71   regAddrA);.  sq
1d010 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
1d020 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20  e(v, addr1);..  
1d030 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f  /* Generate a co
1d040 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75  routine to evalu
1d050 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ate the SELECT s
1d060 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a  tatement on .  *
1d070 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20 74 68  * the right - th
1d080 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20 20 2a  e "B" select.  *
1d090 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74 42 20  /.  addrSelectB 
1d0a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1d0b0 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b  rentAddr(v) + 1;
1d0c0 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  .  addr1 = sqlit
1d0d0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1d0e0 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
1d0f0 2c 20 72 65 67 41 64 64 72 42 2c 20 30 2c 20 61  , regAddrB, 0, a
1d100 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20 56  ddrSelectB);.  V
1d110 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1d120 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b  right SELECT"));
1d130 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20  .  savedLimit = 
1d140 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76  p->iLimit;.  sav
1d150 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f  edOffset = p->iO
1d160 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d  ffset;.  p->iLim
1d170 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a  it = regLimitB;.
1d180 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30    p->iOffset = 0
1d190 3b 20 20 0a 20 20 45 78 70 6c 61 69 6e 51 75 65  ;  .  ExplainQue
1d1a0 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
1d1b0 31 2c 20 22 52 49 47 48 54 22 29 29 3b 0a 20 20  1, "RIGHT"));.  
1d1c0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
1d1d0 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 42 29  arse, p, &destB)
1d1e0 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20  ;.  p->iLimit = 
1d1f0 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d  savedLimit;.  p-
1d200 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64  >iOffset = saved
1d210 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65  Offset;.  sqlite
1d220 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e  3VdbeEndCoroutin
1d230 65 28 76 2c 20 72 65 67 41 64 64 72 42 29 3b 0a  e(v, regAddrB);.
1d240 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1d250 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
1d260 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72   outputs the cur
1d270 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
1d280 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73  A.  ** select as
1d290 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74   the next output
1d2a0 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70   row of the comp
1d2b0 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
1d2c0 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
1d2d0 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20  ent((v, "Output 
1d2e0 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29  routine for A"))
1d2f0 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67  ;.  addrOutA = g
1d300 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
1d310 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a  routine(pParse,.
1d320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d330 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73   p, &destA, pDes
1d340 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20  t, regOutA,.    
1d350 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
1d360 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c  Prev, pKeyDup, l
1d370 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f  abelEnd);.  .  /
1d380 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
1d390 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
1d3a0 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  puts the current
1d3b0 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20   row of the B.  
1d3c0 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65  ** select as the
1d3d0 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77   next output row
1d3e0 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
1d3f0 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
1d400 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  if( op==TK_ALL |
1d410 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  | op==TK_UNION )
1d420 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f  {.    VdbeNoopCo
1d430 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75  mment((v, "Outpu
1d440 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22  t routine for B"
1d450 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42  ));.    addrOutB
1d460 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75   = generateOutpu
1d470 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72  tSubroutine(pPar
1d480 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
1d490 20 20 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20       p, &destB, 
1d4a0 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a  pDest, regOutB,.
1d4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d4c0 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75   regPrev, pKeyDu
1d4d0 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
1d4e0 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  }.  sqlite3KeyIn
1d4f0 66 6f 55 6e 72 65 66 28 70 4b 65 79 44 75 70 29  foUnref(pKeyDup)
1d500 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1d510 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f   a subroutine to
1d520 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65   run when the re
1d530 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63  sults from selec
1d540 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68  t A.  ** are exh
1d550 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20  austed and only 
1d560 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42  data in select B
1d570 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20   remains..  */. 
1d580 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45   if( op==TK_EXCE
1d590 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54  PT || op==TK_INT
1d5a0 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64  ERSECT ){.    ad
1d5b0 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 61 64 64  drEofA_noB = add
1d5c0 72 45 6f 66 41 20 3d 20 6c 61 62 65 6c 45 6e 64  rEofA = labelEnd
1d5d0 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20  ;.  }else{  .   
1d5e0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1d5f0 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72  ((v, "eof-A subr
1d600 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61  outine"));.    a
1d610 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65  ddrEofA = sqlite
1d620 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1d630 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42  P_Gosub, regOutB
1d640 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20  , addrOutB);.   
1d650 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20   addrEofA_noB = 
1d660 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d670 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1d680 65 67 41 64 64 72 42 2c 20 6c 61 62 65 6c 45 6e  egAddrB, labelEn
1d690 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
1d6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6b0 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
1d6c0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
1d6d0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
1d6e0 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20   addrEofA);.    
1d6f0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
1d700 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
1d710 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20  (p->nSelectRow, 
1d720 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
1d730 6f 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  ow);.  }..  /* G
1d740 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
1d750 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e  tine to run when
1d760 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f   the results fro
1d770 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20  m select B.  ** 
1d780 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e  are exhausted an
1d790 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73  d only data in s
1d7a0 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73 2e  elect A remains.
1d7b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
1d7c0 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a  TK_INTERSECT ){.
1d7d0 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 61      addrEofB = a
1d7e0 64 64 72 45 6f 66 41 3b 0a 20 20 20 20 69 66 28  ddrEofA;.    if(
1d7f0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e   p->nSelectRow >
1d800 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
1d810 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  Row ) p->nSelect
1d820 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53  Row = pPrior->nS
1d830 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c 73  electRow;.  }els
1d840 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f  e{  .    VdbeNoo
1d850 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f  pComment((v, "eo
1d860 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  f-B subroutine")
1d870 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20  );.    addrEofB 
1d880 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1d890 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
1d8a0 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75   regOutA, addrOu
1d8b0 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tA);.    sqlite3
1d8c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d8d0 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
1d8e0 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56 64 62  , labelEnd); Vdb
1d8f0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1d900 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
1d910 6f 28 76 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a  o(v, addrEofB);.
1d920 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
1d930 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
1d940 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c  e the case of A<
1d950 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  B.  */.  VdbeNoo
1d960 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d  pComment((v, "A-
1d970 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  lt-B subroutine"
1d980 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d  ));.  addrAltB =
1d990 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d9a0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
1d9b0 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74  regOutA, addrOut
1d9c0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
1d9d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1d9e0 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61  eld, regAddrA, a
1d9f0 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f  ddrEofA); VdbeCo
1da00 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
1da10 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1da20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f  labelCmpr);..  /
1da30 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1da40 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
1da50 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a  se of A==B.  */.
1da60 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
1da70 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42   ){.    addrAeqB
1da80 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d   = addrAltB;.  }
1da90 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
1daa0 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
1dab0 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72   addrAeqB = addr
1dac0 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c  AltB;.    addrAl
1dad0 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tB++;.  }else{. 
1dae0 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
1daf0 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73  nt((v, "A-eq-B s
1db00 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
1db10 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20    addrAeqB =.   
1db20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1db30 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1db40 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f  regAddrA, addrEo
1db50 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  fA); VdbeCoverag
1db60 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
1db70 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62  3VdbeGoto(v, lab
1db80 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  elCmpr);.  }..  
1db90 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1dba0 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
1dbb0 61 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a  ase of A>B.  */.
1dbc0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1dbd0 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75  t((v, "A-gt-B su
1dbe0 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61  broutine"));.  a
1dbf0 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65  ddrAgtB = sqlite
1dc00 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1dc10 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  (v);.  if( op==T
1dc20 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  K_ALL || op==TK_
1dc30 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c  UNION ){.    sql
1dc40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1dc50 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
1dc60 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a  utB, addrOutB);.
1dc70 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
1dc80 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1dc90 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61  eld, regAddrB, a
1dca0 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f  ddrEofB); VdbeCo
1dcb0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
1dcc0 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1dcd0 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f  labelCmpr);..  /
1dce0 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e 73  * This code runs
1dcf0 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c   once to initial
1dd00 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67 2e 0a  ize everything..
1dd10 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
1dd20 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
1dd30 64 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  dr1);.  sqlite3V
1dd40 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1dd50 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c  Yield, regAddrA,
1dd60 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b 20   addrEofA_noB); 
1dd70 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1dd80 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1dd90 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1dda0 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72  , regAddrB, addr
1ddb0 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72  EofB); VdbeCover
1ddc0 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d  age(v);..  /* Im
1ddd0 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e  plement the main
1dde0 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f   merge loop.  */
1ddf0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
1de00 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61  solveLabel(v, la
1de10 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69  belCmpr);.  sqli
1de20 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1de30 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c   OP_Permutation,
1de40 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a   0, 0, 0, (char*
1de50 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e  )aPermute, P4_IN
1de60 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74  TARRAY);.  sqlit
1de70 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1de80 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74  OP_Compare, dest
1de90 41 2e 69 53 64 73 74 2c 20 64 65 73 74 42 2e 69  A.iSdst, destB.i
1dea0 53 64 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a  Sdst, nOrderBy,.
1deb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dec0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
1ded0 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45  pKeyMerge, P4_KE
1dee0 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65  YINFO);.  sqlite
1def0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
1df00 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29   OPFLAG_PERMUTE)
1df10 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1df20 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
1df30 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72  , addrAltB, addr
1df40 41 65 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b  AeqB, addrAgtB);
1df50 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1df60 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  ;..  /* Jump to 
1df70 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69  the this point i
1df80 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69  n order to termi
1df90 6e 61 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a  nate the query..
1dfa0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
1dfb0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1dfc0 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20  , labelEnd);..  
1dfd0 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68  /* Reassembly th
1dfe0 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
1dff0 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c   so that it will
1e000 20 62 65 20 66 72 65 65 64 20 63 6f 72 72 65 63   be freed correc
1e010 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20  tly.  ** by the 
1e020 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
1e030 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
1e040 69 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ior ){.    sqlit
1e050 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
1e060 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  b, p->pPrior);. 
1e070 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d   }.  p->pPrior =
1e080 20 70 50 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f   pPrior;.  pPrio
1e090 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20  r->pNext = p;.. 
1e0a0 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65   /*** TBD:  Inse
1e0b0 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61  rt subroutine ca
1e0c0 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72  lls to close cur
1e0d0 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65  sors on incomple
1e0e0 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65  te.  **** subque
1e0f0 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 45 78 70  ries ****/.  Exp
1e100 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 50 6f 70  lainQueryPlanPop
1e110 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 74 75  (pParse);.  retu
1e120 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 21  rn pParse->nErr!
1e130 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  =0;.}.#endif..#i
1e140 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
1e150 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
1e160 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
1e170 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 0a  ITE_OMIT_VIEW)..
1e180 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  /* An instance o
1e190 66 20 74 68 65 20 53 75 62 73 74 43 6f 6e 74 65  f the SubstConte
1e1a0 78 74 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69  xt object descri
1e1b0 62 65 73 20 61 6e 20 73 75 62 73 74 69 74 75 74  bes an substitut
1e1c0 69 6f 6e 20 65 64 69 74 0a 2a 2a 20 74 6f 20 62  ion edit.** to b
1e1d0 65 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 61  e performed on a
1e1e0 20 70 61 72 73 65 20 74 72 65 65 2e 0a 2a 2a 0a   parse tree..**.
1e1f0 2a 2a 20 41 6c 6c 20 72 65 66 65 72 65 6e 63 65  ** All reference
1e200 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  s to columns in 
1e210 74 61 62 6c 65 20 69 54 61 62 6c 65 20 61 72 65  table iTable are
1e220 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20   to be replaced 
1e230 62 79 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  by corresponding
1e240 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
1e250 69 6e 20 70 45 4c 69 73 74 2e 0a 2a 2f 0a 74 79  in pEList..*/.ty
1e260 70 65 64 65 66 20 73 74 72 75 63 74 20 53 75 62  pedef struct Sub
1e270 73 74 43 6f 6e 74 65 78 74 20 7b 0a 20 20 50 61  stContext {.  Pa
1e280 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
1e290 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
1e2a0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1e2b0 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 3b 20  /.  int iTable; 
1e2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e2d0 20 52 65 70 6c 61 63 65 20 72 65 66 65 72 65 6e   Replace referen
1e2e0 63 65 73 20 74 6f 20 74 68 69 73 20 74 61 62 6c  ces to this tabl
1e2f0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77 54  e */.  int iNewT
1e300 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  able;           
1e310 20 2f 2a 20 4e 65 77 20 74 61 62 6c 65 20 6e 75   /* New table nu
1e320 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73  mber */.  int is
1e330 4c 65 66 74 4a 6f 69 6e 3b 20 20 20 20 20 20 20  LeftJoin;       
1e340 20 20 20 20 2f 2a 20 41 64 64 20 54 4b 5f 49 46      /* Add TK_IF
1e350 5f 4e 55 4c 4c 5f 52 4f 57 20 6f 70 63 6f 64 65  _NULL_ROW opcode
1e360 73 20 6f 6e 20 65 61 63 68 20 72 65 70 6c 61 63  s on each replac
1e370 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ement */.  ExprL
1e380 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
1e390 20 20 20 20 20 2f 2a 20 52 65 70 6c 61 63 65 6d       /* Replacem
1e3a0 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ent expressions 
1e3b0 2a 2f 0a 7d 20 53 75 62 73 74 43 6f 6e 74 65 78  */.} SubstContex
1e3c0 74 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44  t;../* Forward D
1e3d0 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73  eclarations */.s
1e3e0 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
1e3f0 45 78 70 72 4c 69 73 74 28 53 75 62 73 74 43 6f  ExprList(SubstCo
1e400 6e 74 65 78 74 2a 2c 20 45 78 70 72 4c 69 73 74  ntext*, ExprList
1e410 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  *);.static void 
1e420 73 75 62 73 74 53 65 6c 65 63 74 28 53 75 62 73  substSelect(Subs
1e430 74 43 6f 6e 74 65 78 74 2a 2c 20 53 65 6c 65 63  tContext*, Selec
1e440 74 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a  t*, int);../*.**
1e450 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68   Scan through th
1e460 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
1e470 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65  pr.  Replace eve
1e480 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a  ry reference to.
1e490 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ** a column in t
1e4a0 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62  able number iTab
1e4b0 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  le with a copy o
1e4c0 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68  f the iColumn-th
1e4d0 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c  .** entry in pEL
1e4e0 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65  ist.  (But leave
1e4f0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1e500 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20  he ROWID column 
1e510 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a  .** unchanged.).
1e520 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1e530 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ne is part of th
1e540 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f  e flattening pro
1e550 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75  cedure.  A subqu
1e560 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73  ery.** whose res
1e570 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e  ult set is defin
1e580 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70  ed by pEList app
1e590 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e  ears as entry in
1e5a0 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61   the.** FROM cla
1e5b0 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
1e5c0 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44  such that the VD
1e5d0 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e  BE cursor assign
1e5e0 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f  ed to that.** FO
1e5f0 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20  RM clause entry 
1e600 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73  is iTable.  This
1e610 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 74   routine makes t
1e620 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a  he necessary .**
1e630 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70   changes to pExp
1e640 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66  r so that it ref
1e650 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ers directly to 
1e660 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
1e670 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75  .** of the subqu
1e680 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72  ery rather the r
1e690 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
1e6a0 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74   subquery..*/.st
1e6b0 61 74 69 63 20 45 78 70 72 20 2a 73 75 62 73 74  atic Expr *subst
1e6c0 45 78 70 72 28 0a 20 20 53 75 62 73 74 43 6f 6e  Expr(.  SubstCon
1e6d0 74 65 78 74 20 2a 70 53 75 62 73 74 2c 20 20 2f  text *pSubst,  /
1e6e0 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
1e6f0 20 74 68 65 20 73 75 62 73 74 69 74 75 74 69 6f   the substitutio
1e700 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  n */.  Expr *pEx
1e710 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  pr            /*
1e720 20 45 78 70 72 20 69 6e 20 77 68 69 63 68 20 73   Expr in which s
1e730 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75  ubstitution occu
1e740 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  rs */.){.  if( p
1e750 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
1e760 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61   0;.  if( ExprHa
1e770 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1e780 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20   EP_FromJoin).  
1e790 20 26 26 20 70 45 78 70 72 2d 3e 69 52 69 67 68   && pExpr->iRigh
1e7a0 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 70 53 75 62  tJoinTable==pSub
1e7b0 73 74 2d 3e 69 54 61 62 6c 65 0a 20 20 29 7b 0a  st->iTable.  ){.
1e7c0 20 20 20 20 70 45 78 70 72 2d 3e 69 52 69 67 68      pExpr->iRigh
1e7d0 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 53 75  tJoinTable = pSu
1e7e0 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a  bst->iNewTable;.
1e7f0 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d    }.  if( pExpr-
1e800 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
1e810 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
1e820 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c 65 20  =pSubst->iTable 
1e830 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  ){.    if( pExpr
1e840 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
1e850 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
1e860 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65   TK_NULL;.    }e
1e870 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
1e880 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70  *pNew;.      Exp
1e890 72 20 2a 70 43 6f 70 79 20 3d 20 70 53 75 62 73  r *pCopy = pSubs
1e8a0 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78  t->pEList->a[pEx
1e8b0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78  pr->iColumn].pEx
1e8c0 70 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20 69  pr;.      Expr i
1e8d0 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20 20 20  fNullRow;.      
1e8e0 61 73 73 65 72 74 28 20 70 53 75 62 73 74 2d 3e  assert( pSubst->
1e8f0 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78  pEList!=0 && pEx
1e900 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 53 75 62  pr->iColumn<pSub
1e910 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  st->pEList->nExp
1e920 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
1e930 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t( pExpr->pRight
1e940 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
1e950 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65   sqlite3ExprIsVe
1e960 63 74 6f 72 28 70 43 6f 70 79 29 20 29 7b 0a 20  ctor(pCopy) ){. 
1e970 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 65         sqlite3Ve
1e980 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 70 53 75  ctorErrorMsg(pSu
1e990 62 73 74 2d 3e 70 50 61 72 73 65 2c 20 70 43 6f  bst->pParse, pCo
1e9a0 70 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  py);.      }else
1e9b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1e9c0 33 20 2a 64 62 20 3d 20 70 53 75 62 73 74 2d 3e  3 *db = pSubst->
1e9d0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20  pParse->db;.    
1e9e0 20 20 20 20 69 66 28 20 70 53 75 62 73 74 2d 3e      if( pSubst->
1e9f0 69 73 4c 65 66 74 4a 6f 69 6e 20 26 26 20 70 43  isLeftJoin && pC
1ea00 6f 70 79 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  opy->op!=TK_COLU
1ea10 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  MN ){.          
1ea20 6d 65 6d 73 65 74 28 26 69 66 4e 75 6c 6c 52 6f  memset(&ifNullRo
1ea30 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 66 4e  w, 0, sizeof(ifN
1ea40 75 6c 6c 52 6f 77 29 29 3b 0a 20 20 20 20 20 20  ullRow));.      
1ea50 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 6f 70      ifNullRow.op
1ea60 20 3d 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f   = TK_IF_NULL_RO
1ea70 57 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 4e  W;.          ifN
1ea80 75 6c 6c 52 6f 77 2e 70 4c 65 66 74 20 3d 20 70  ullRow.pLeft = p
1ea90 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 20 20  Copy;.          
1eaa0 69 66 4e 75 6c 6c 52 6f 77 2e 69 54 61 62 6c 65  ifNullRow.iTable
1eab0 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65 77 54   = pSubst->iNewT
1eac0 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20  able;.          
1ead0 70 43 6f 70 79 20 3d 20 26 69 66 4e 75 6c 6c 52  pCopy = &ifNullR
1eae0 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ow;.        }.  
1eaf0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1eb00 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1eb10 70 43 6f 70 79 2c 20 45 50 5f 53 75 62 71 75 65  pCopy, EP_Subque
1eb20 72 79 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ry) );.        p
1eb30 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
1eb40 72 44 75 70 28 64 62 2c 20 70 43 6f 70 79 2c 20  rDup(db, pCopy, 
1eb50 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
1eb60 70 4e 65 77 20 26 26 20 70 53 75 62 73 74 2d 3e  pNew && pSubst->
1eb70 69 73 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20  isLeftJoin ){.  
1eb80 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74 50          ExprSetP
1eb90 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50  roperty(pNew, EP
1eba0 5f 43 61 6e 42 65 4e 75 6c 6c 29 3b 0a 20 20 20  _CanBeNull);.   
1ebb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1ebc0 66 28 20 70 4e 65 77 20 26 26 20 45 78 70 72 48  f( pNew && ExprH
1ebd0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1ebe0 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b  ,EP_FromJoin) ){
1ebf0 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
1ec00 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
1ec10 20 3d 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74   = pExpr->iRight
1ec20 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 20 20 20  JoinTable;.     
1ec30 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70       ExprSetProp
1ec40 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 46 72  erty(pNew, EP_Fr
1ec50 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 20  omJoin);.       
1ec60 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
1ec70 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
1ec80 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
1ec90 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 0a   pExpr = pNew;..
1eca0 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 73 75 72          /* Ensur
1ecb0 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  e that the expre
1ecc0 73 73 69 6f 6e 20 6e 6f 77 20 68 61 73 20 61 6e  ssion now has an
1ecd0 20 69 6d 70 6c 69 63 69 74 20 63 6f 6c 6c 61 74   implicit collat
1ece0 69 6f 6e 20 73 65 71 75 65 6e 63 65 2c 0a 20 20  ion sequence,.  
1ecf0 20 20 20 20 20 20 2a 2a 20 6a 75 73 74 20 61 73        ** just as
1ed00 20 69 74 20 64 69 64 20 77 68 65 6e 20 69 74 20   it did when it 
1ed10 77 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20  was a column of 
1ed20 61 20 76 69 65 77 20 6f 72 20 73 75 62 2d 71 75  a view or sub-qu
1ed30 65 72 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ery. */.        
1ed40 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20  if( pExpr ){.   
1ed50 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
1ed60 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
1ed70 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  && pExpr->op!=TK
1ed80 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20  _COLLATE ){.    
1ed90 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
1eda0 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *pColl = sqlite3
1edb0 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 53 75 62  ExprCollSeq(pSub
1edc0 73 74 2d 3e 70 50 61 72 73 65 2c 20 70 45 78 70  st->pParse, pExp
1edd0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
1ede0 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
1edf0 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72  xprAddCollateStr
1ee00 69 6e 67 28 70 53 75 62 73 74 2d 3e 70 50 61 72  ing(pSubst->pPar
1ee10 73 65 2c 20 70 45 78 70 72 2c 20 0a 20 20 20 20  se, pExpr, .    
1ee20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 43 6f              (pCo
1ee30 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ll ? pColl->zNam
1ee40 65 20 3a 20 22 42 49 4e 41 52 59 22 29 0a 20 20  e : "BINARY").  
1ee50 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
1ee60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ee70 20 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70     ExprClearProp
1ee80 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 43  erty(pExpr, EP_C
1ee90 6f 6c 6c 61 74 65 29 3b 0a 20 20 20 20 20 20 20  ollate);.       
1eea0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1eeb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
1eec0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
1eed0 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 26 26 20 70  IF_NULL_ROW && p
1eee0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53  Expr->iTable==pS
1eef0 75 62 73 74 2d 3e 69 54 61 62 6c 65 20 29 7b 0a  ubst->iTable ){.
1ef00 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
1ef10 62 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e  ble = pSubst->iN
1ef20 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20  ewTable;.    }. 
1ef30 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20     pExpr->pLeft 
1ef40 3d 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62  = substExpr(pSub
1ef50 73 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  st, pExpr->pLeft
1ef60 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 52  );.    pExpr->pR
1ef70 69 67 68 74 20 3d 20 73 75 62 73 74 45 78 70 72  ight = substExpr
1ef80 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e  (pSubst, pExpr->
1ef90 70 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28  pRight);.    if(
1efa0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
1efb0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
1efc0 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73  lect) ){.      s
1efd0 75 62 73 74 53 65 6c 65 63 74 28 70 53 75 62 73  ubstSelect(pSubs
1efe0 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  t, pExpr->x.pSel
1eff0 65 63 74 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c  ect, 1);.    }el
1f000 73 65 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45  se{.      substE
1f010 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20  xprList(pSubst, 
1f020 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b  pExpr->x.pList);
1f030 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1f040 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61  urn pExpr;.}.sta
1f050 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
1f060 70 72 4c 69 73 74 28 0a 20 20 53 75 62 73 74 43  prList(.  SubstC
1f070 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74 2c 20  ontext *pSubst, 
1f080 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f  /* Description o
1f090 66 20 74 68 65 20 73 75 62 73 74 69 74 75 74 69  f the substituti
1f0a0 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  on */.  ExprList
1f0b0 20 2a 70 4c 69 73 74 20 20 20 20 20 20 20 2f 2a   *pList       /*
1f0c0 20 4c 69 73 74 20 74 6f 20 73 63 61 6e 20 61 6e   List to scan an
1f0d0 64 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61  d in which to ma
1f0e0 6b 65 20 73 75 62 73 74 69 74 75 74 65 73 20 2a  ke substitutes *
1f0f0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
1f100 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1f110 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
1f120 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
1f130 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73  ; i++){.    pLis
1f140 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20  t->a[i].pExpr = 
1f150 73 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74  substExpr(pSubst
1f160 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
1f170 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  xpr);.  }.}.stat
1f180 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c  ic void substSel
1f190 65 63 74 28 0a 20 20 53 75 62 73 74 43 6f 6e 74  ect(.  SubstCont
1f1a0 65 78 74 20 2a 70 53 75 62 73 74 2c 20 2f 2a 20  ext *pSubst, /* 
1f1b0 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  Description of t
1f1c0 68 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20  he substitution 
1f1d0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
1f1e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
1f1f0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
1f200 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20  n which to make 
1f210 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f  substitutions */
1f220 0a 20 20 69 6e 74 20 64 6f 50 72 69 6f 72 20 20  .  int doPrior  
1f230 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 73           /* Do s
1f240 75 62 73 74 69 74 75 74 65 73 20 6f 6e 20 70 2d  ubstitutes on p-
1f250 3e 70 50 72 69 6f 72 20 74 6f 6f 20 2a 2f 0a 29  >pPrior too */.)
1f260 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
1f270 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  c;.  struct SrcL
1f280 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
1f290 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1f2a0 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64  !p ) return;.  d
1f2b0 6f 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  o{.    substExpr
1f2c0 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 2d 3e  List(pSubst, p->
1f2d0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62  pEList);.    sub
1f2e0 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73  stExprList(pSubs
1f2f0 74 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b  t, p->pGroupBy);
1f300 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
1f310 73 74 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 4f  st(pSubst, p->pO
1f320 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e  rderBy);.    p->
1f330 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45  pHaving = substE
1f340 78 70 72 28 70 53 75 62 73 74 2c 20 70 2d 3e 70  xpr(pSubst, p->p
1f350 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 70 2d 3e  Having);.    p->
1f360 70 57 68 65 72 65 20 3d 20 73 75 62 73 74 45 78  pWhere = substEx
1f370 70 72 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 57  pr(pSubst, p->pW
1f380 68 65 72 65 29 3b 0a 20 20 20 20 70 53 72 63 20  here);.    pSrc 
1f390 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 61  = p->pSrc;.    a
1f3a0 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29  ssert( pSrc!=0 )
1f3b0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63  ;.    for(i=pSrc
1f3c0 2d 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70 53  ->nSrc, pItem=pS
1f3d0 72 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  rc->a; i>0; i--,
1f3e0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
1f3f0 20 73 75 62 73 74 53 65 6c 65 63 74 28 70 53 75   substSelect(pSu
1f400 62 73 74 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c  bst, pItem->pSel
1f410 65 63 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  ect, 1);.      i
1f420 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54  f( pItem->fg.isT
1f430 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  abFunc ){.      
1f440 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1f450 70 53 75 62 73 74 2c 20 70 49 74 65 6d 2d 3e 75  pSubst, pItem->u
1f460 31 2e 70 46 75 6e 63 41 72 67 29 3b 0a 20 20 20  1.pFuncArg);.   
1f470 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68     }.    }.  }wh
1f480 69 6c 65 28 20 64 6f 50 72 69 6f 72 20 26 26 20  ile( doPrior && 
1f490 28 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 29 21  (p = p->pPrior)!
1f4a0 3d 30 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  =0 );.}.#endif /
1f4b0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
1f4c0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
1f4d0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
1f4e0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a  ITE_OMIT_VIEW) *
1f4f0 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
1f500 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1f510 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
1f520 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
1f530 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  EW)./*.** This r
1f540 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20  outine attempts 
1f550 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75  to flatten subqu
1f560 65 72 69 65 73 20 61 73 20 61 20 70 65 72 66 6f  eries as a perfo
1f570 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74  rmance optimizat
1f580 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
1f590 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 20 69  tine returns 1 i
1f5a0 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67  f it makes chang
1f5b0 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66  es and 0 if no f
1f5c0 6c 61 74 74 65 6e 69 6e 67 20 6f 63 63 75 72 73  lattening occurs
1f5d0 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72  ..**.** To under
1f5e0 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70  stand the concep
1f5f0 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c  t of flattening,
1f600 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f   consider the fo
1f610 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79  llowing.** query
1f620 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
1f630 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT a FROM (SELEC
1f640 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20  T x+y AS a FROM 
1f650 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20  t1 WHERE z<100) 
1f660 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  WHERE a>5.**.** 
1f670 54 68 65 20 64 65 66 61 75 6c 74 20 77 61 79 20  The default way 
1f680 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  of implementing 
1f690 74 68 69 73 20 71 75 65 72 79 20 69 73 20 74 6f  this query is to
1f6a0 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20   execute the.** 
1f6b0 73 75 62 71 75 65 72 79 20 66 69 72 73 74 20 61  subquery first a
1f6c0 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
1f6d0 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72  ults in a tempor
1f6e0 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a  ary table, then.
1f6f0 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72  ** run the outer
1f700 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74   query on that t
1f710 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
1f720 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20 74   This requires t
1f730 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65  wo.** passes ove
1f740 72 20 74 68 65 20 64 61 74 61 2e 20 20 46 75 72  r the data.  Fur
1f750 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73  thermore, becaus
1f760 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
1f770 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20  table.** has no 
1f780 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48 45  indices, the WHE
1f790 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65  RE clause on the
1f7a0 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e   outer query can
1f7b0 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69  not be.** optimi
1f7c0 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  zed..**.** This 
1f7d0 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
1f7e0 20 74 6f 20 72 65 77 72 69 74 65 20 71 75 65 72   to rewrite quer
1f7f0 69 65 73 20 73 75 63 68 20 61 73 20 74 68 65 20  ies such as the 
1f800 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20  above into.** a 
1f810 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65  single flat sele
1f820 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  ct, like this:.*
1f830 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
1f840 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
1f850 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44   WHERE z<100 AND
1f860 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63   a>5.**.** The c
1f870 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f  ode generated fo
1f880 72 20 74 68 69 73 20 73 69 6d 70 6c 69 66 69 63  r this simplific
1f890 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20  ation gives the 
1f8a0 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62  same result.** b
1f8b0 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73  ut only has to s
1f8c0 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63  can the data onc
1f8d0 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65 20  e.  And because 
1f8e0 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a  indices might .*
1f8f0 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74  * exist on the t
1f900 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c  able t1, a compl
1f910 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20  ete scan of the 
1f920 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a  data might be.**
1f930 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20   avoided..**.** 
1f940 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 73 75  Flattening is su
1f950 62 6a 65 63 74 20 74 6f 20 74 68 65 20 66 6f 6c  bject to the fol
1f960 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e  lowing constrain
1f970 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20  ts:.**.**  (**) 
1f980 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 74   We no longer at
1f990 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74 65 6e  tempt to flatten
1f9a0 20 61 67 67 72 65 67 61 74 65 20 73 75 62 71 75   aggregate subqu
1f9b0 65 72 69 65 73 2e 20 57 61 73 3a 0a 2a 2a 20 20  eries. Was:.**  
1f9c0 20 20 20 20 20 20 54 68 65 20 73 75 62 71 75 65        The subque
1f9d0 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
1f9e0 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 6f   query cannot bo
1f9f0 74 68 20 62 65 20 61 67 67 72 65 67 61 74 65 73  th be aggregates
1fa00 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57  ..**.**  (**)  W
1fa10 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65  e no longer atte
1fa20 6d 70 74 20 74 6f 20 66 6c 61 74 74 65 6e 20 61  mpt to flatten a
1fa30 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72  ggregate subquer
1fa40 69 65 73 2e 20 57 61 73 3a 0a 2a 2a 20 20 20 20  ies. Was:.**    
1fa50 20 20 20 20 28 32 29 20 49 66 20 74 68 65 20 73      (2) If the s
1fa60 75 62 71 75 65 72 79 20 69 73 20 61 6e 20 61 67  ubquery is an ag
1fa70 67 72 65 67 61 74 65 20 74 68 65 6e 0a 2a 2a 20  gregate then.** 
1fa80 20 20 20 20 20 20 20 28 32 61 29 20 74 68 65 20         (2a) the 
1fa90 6f 75 74 65 72 20 71 75 65 72 79 20 6d 75 73 74  outer query must
1faa0 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20 61   not be a join a
1fab0 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 32 62  nd.**        (2b
1fac0 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  ) the outer quer
1fad0 79 20 6d 75 73 74 20 6e 6f 74 20 75 73 65 20 73  y must not use s
1fae0 75 62 71 75 65 72 69 65 73 0a 2a 2a 20 20 20 20  ubqueries.**    
1faf0 20 20 20 20 20 20 20 20 20 6f 74 68 65 72 20 74           other t
1fb00 68 61 6e 20 74 68 65 20 6f 6e 65 20 46 52 4f 4d  han the one FROM
1fb10 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79  -clause subquery
1fb20 20 74 68 61 74 20 69 73 20 61 20 63 61 6e 64 69   that is a candi
1fb30 64 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  date.**         
1fb40 20 20 20 20 66 6f 72 20 66 6c 61 74 74 65 6e 69      for flatteni
1fb50 6e 67 2e 20 20 28 54 68 69 73 20 69 73 20 64 75  ng.  (This is du
1fb60 65 20 74 6f 20 74 69 63 6b 65 74 20 5b 32 66 37  e to ticket [2f7
1fb70 31 37 30 64 37 33 62 66 39 61 62 66 38 30 5d 0a  170d73bf9abf80].
1fb80 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 66  **             f
1fb90 72 6f 6d 20 32 30 31 35 2d 30 32 2d 30 39 2e 29  rom 2015-02-09.)
1fba0 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 49 66  .**.**   (3)  If
1fbb0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
1fbc0 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
1fbd0 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  nd of a LEFT JOI
1fbe0 4e 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20  N then.**       
1fbf0 20 28 33 61 29 20 74 68 65 20 73 75 62 71 75 65   (3a) the subque
1fc00 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20  ry may not be a 
1fc10 6a 6f 69 6e 20 61 6e 64 0a 2a 2a 20 20 20 20 20  join and.**     
1fc20 20 20 20 28 33 62 29 20 74 68 65 20 46 52 4f 4d     (3b) the FROM
1fc30 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
1fc40 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  ubquery may not 
1fc50 63 6f 6e 74 61 69 6e 20 61 20 76 69 72 74 75 61  contain a virtua
1fc60 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
1fc70 20 74 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 20 20   table and.**   
1fc80 20 20 20 20 20 28 33 63 29 20 74 68 65 20 6f 75       (3c) the ou
1fc90 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f  ter query may no
1fca0 74 20 62 65 20 61 6e 20 61 67 67 72 65 67 61 74  t be an aggregat
1fcb0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20  e..**.**   (4)  
1fcc0 54 68 65 20 73 75 62 71 75 65 72 79 20 63 61 6e  The subquery can
1fcd0 20 6e 6f 74 20 62 65 20 44 49 53 54 49 4e 43 54   not be DISTINCT
1fce0 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41  ..**.**  (**)  A
1fcf0 74 20 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73 74  t one point rest
1fd00 72 69 63 74 69 6f 6e 73 20 28 34 29 20 61 6e 64  rictions (4) and
1fd10 20 28 35 29 20 64 65 66 69 6e 65 64 20 61 20 73   (5) defined a s
1fd20 75 62 73 65 74 20 6f 66 20 44 49 53 54 49 4e 43  ubset of DISTINC
1fd30 54 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 2d  T.**        sub-
1fd40 71 75 65 72 69 65 73 20 74 68 61 74 20 77 65 72  queries that wer
1fd50 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f 6d 20  e excluded from 
1fd60 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
1fd70 6e 2e 20 52 65 73 74 72 69 63 74 69 6f 6e 20 0a  n. Restriction .
1fd80 2a 2a 20 20 20 20 20 20 20 20 28 34 29 20 68 61  **        (4) ha
1fd90 73 20 73 69 6e 63 65 20 62 65 65 6e 20 65 78 70  s since been exp
1fda0 61 6e 64 65 64 20 74 6f 20 65 78 63 6c 75 64 65  anded to exclude
1fdb0 20 61 6c 6c 20 44 49 53 54 49 4e 43 54 20 73 75   all DISTINCT su
1fdc0 62 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20  bqueries..**.** 
1fdd0 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e   (**)  We no lon
1fde0 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66  ger attempt to f
1fdf0 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61 74 65  latten aggregate
1fe00 20 73 75 62 71 75 65 72 69 65 73 2e 20 20 57 61   subqueries.  Wa
1fe10 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 49 66 20  s:.**        If 
1fe20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
1fe30 61 67 67 72 65 67 61 74 65 2c 20 74 68 65 20 6f  aggregate, the o
1fe40 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
1fe50 6f 74 20 62 65 20 44 49 53 54 49 4e 43 54 2e 0a  ot be DISTINCT..
1fe60 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65  **.**   (7)  The
1fe70 20 73 75 62 71 75 65 72 79 20 6d 75 73 74 20 68   subquery must h
1fe80 61 76 65 20 61 20 46 52 4f 4d 20 63 6c 61 75 73  ave a FROM claus
1fe90 65 2e 20 20 54 4f 44 4f 3a 20 20 46 6f 72 20 73  e.  TODO:  For s
1fea0 75 62 71 75 65 72 69 65 73 20 77 69 74 68 6f 75  ubqueries withou
1feb0 74 0a 2a 2a 20 20 20 20 20 20 20 20 41 20 46 52  t.**        A FR
1fec0 4f 4d 20 63 6c 61 75 73 65 2c 20 63 6f 6e 73 69  OM clause, consi
1fed0 64 65 72 20 61 64 64 69 6e 67 20 61 20 46 52 4f  der adding a FRO
1fee0 4d 20 63 6c 61 75 73 65 20 77 69 74 68 20 74 68  M clause with th
1fef0 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20 20  e special.**    
1ff00 20 20 20 20 74 61 62 6c 65 20 73 71 6c 69 74 65      table sqlite
1ff10 5f 6f 6e 63 65 20 74 68 61 74 20 63 6f 6e 73 69  _once that consi
1ff20 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  sts of a single 
1ff30 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  row containing a
1ff40 0a 2a 2a 20 20 20 20 20 20 20 20 73 69 6e 67 6c  .**        singl
1ff50 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20  e NULL..**.**   
1ff60 28 38 29 20 20 49 66 20 74 68 65 20 73 75 62 71  (8)  If the subq
1ff70 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54 20  uery uses LIMIT 
1ff80 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71  then the outer q
1ff90 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20  uery may not be 
1ffa0 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
1ffb0 28 39 29 20 20 49 66 20 74 68 65 20 73 75 62 71  (9)  If the subq
1ffc0 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54 20  uery uses LIMIT 
1ffd0 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71  then the outer q
1ffe0 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20  uery may not be 
1fff0 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a  aggregate..**.**
20000 20 20 28 2a 2a 29 20 20 52 65 73 74 72 69 63 74    (**)  Restrict
20010 69 6f 6e 20 28 31 30 29 20 77 61 73 20 72 65 6d  ion (10) was rem
20020 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 63 6f  oved from the co
20030 64 65 20 6f 6e 20 32 30 30 35 2d 30 32 2d 30 35  de on 2005-02-05
20040 20 62 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20   but we.**      
20050 20 20 61 63 63 69 64 65 6e 74 6c 79 20 63 61 72    accidently car
20060 72 69 65 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74  ried the comment
20070 20 66 6f 72 77 61 72 64 20 75 6e 74 69 6c 20 32   forward until 2
20080 30 31 34 2d 30 39 2d 31 35 2e 20 20 4f 72 69 67  014-09-15.  Orig
20090 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 63  inal.**        c
200a0 6f 6e 73 74 72 61 69 6e 74 3a 20 22 49 66 20 74  onstraint: "If t
200b0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61  he subquery is a
200c0 67 67 72 65 67 61 74 65 20 74 68 65 6e 20 74 68  ggregate then th
200d0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 0a 2a  e outer query .*
200e0 2a 20 20 20 20 20 20 20 20 6d 61 79 20 6e 6f 74  *        may not
200f0 20 75 73 65 20 4c 49 4d 49 54 2e 22 0a 2a 2a 0a   use LIMIT.".**.
20100 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75  **  (11)  The su
20110 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
20120 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
20130 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44  ot both have ORD
20140 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a  ER BY clauses..*
20150 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20  *.**  (**)  Not 
20160 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75  implemented.  Su
20170 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74  bsumed into rest
20180 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61  riction (3).  Wa
20190 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  s previously.** 
201a0 20 20 20 20 20 20 20 61 20 73 65 70 61 72 61 74         a separat
201b0 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65  e restriction de
201c0 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b  riving from tick
201d0 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20  et #350..**.**  
201e0 28 31 33 29 20 20 54 68 65 20 73 75 62 71 75 65  (13)  The subque
201f0 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65  ry and outer que
20200 72 79 20 6d 61 79 20 6e 6f 74 20 62 6f 74 68 20  ry may not both 
20210 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a  use LIMIT..**.**
20220 20 20 28 31 34 29 20 20 54 68 65 20 73 75 62 71    (14)  The subq
20230 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 75 73 65  uery may not use
20240 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20   OFFSET..**.**  
20250 28 31 35 29 20 20 49 66 20 74 68 65 20 6f 75 74  (15)  If the out
20260 65 72 20 71 75 65 72 79 20 69 73 20 70 61 72 74  er query is part
20270 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
20280 65 6c 65 63 74 2c 20 74 68 65 6e 20 74 68 65 0a  elect, then the.
20290 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75 65  **        subque
202a0 72 79 20 6d 61 79 20 6e 6f 74 20 75 73 65 20 4c  ry may not use L
202b0 49 4d 49 54 2e 0a 2a 2a 20 20 20 20 20 20 20 20  IMIT..**        
202c0 28 53 65 65 20 74 69 63 6b 65 74 20 23 32 33 33  (See ticket #233
202d0 39 20 61 6e 64 20 74 69 63 6b 65 74 20 5b 30 32  9 and ticket [02
202e0 61 38 65 38 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a  a8e81d44])..**.*
202f0 2a 20 20 28 31 36 29 20 20 49 66 20 74 68 65 20  *  (16)  If the 
20300 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 61  outer query is a
20310 67 67 72 65 67 61 74 65 2c 20 74 68 65 6e 20 74  ggregate, then t
20320 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20  he subquery may 
20330 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73  not.**        us
20340 65 20 4f 52 44 45 52 20 42 59 2e 20 20 28 54 69  e ORDER BY.  (Ti
20350 63 6b 65 74 20 23 32 39 34 32 29 20 20 54 68 69  cket #2942)  Thi
20360 73 20 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61  s used to not ma
20370 74 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 75  tter.**        u
20380 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f 64 75 63  ntil we introduc
20390 65 64 20 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e  ed the group_con
203a0 63 61 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20  cat() function. 
203b0 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20 49   .**.**  (17)  I
203c0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
203d0 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  s a compound sel
203e0 65 63 74 2c 20 74 68 65 6e 0a 2a 2a 20 20 20 20  ect, then.**    
203f0 20 20 20 20 28 31 37 61 29 20 61 6c 6c 20 63 6f      (17a) all co
20400 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 73  mpound operators
20410 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e   must be a UNION
20420 20 41 4c 4c 2c 20 61 6e 64 0a 2a 2a 20 20 20 20   ALL, and.**    
20430 20 20 20 20 28 31 37 62 29 20 6e 6f 20 74 65 72      (17b) no ter
20440 6d 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 75  ms within the su
20450 62 71 75 65 72 79 20 63 6f 6d 70 6f 75 6e 64 20  bquery compound 
20460 6d 61 79 20 62 65 20 61 67 67 72 65 67 61 74 65  may be aggregate
20470 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
20480 20 6f 72 20 44 49 53 54 49 4e 43 54 2c 20 61 6e   or DISTINCT, an
20490 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 31 37 63  d.**        (17c
204a0 29 20 65 76 65 72 79 20 74 65 72 6d 20 77 69 74  ) every term wit
204b0 68 69 6e 20 74 68 65 20 73 75 62 71 75 65 72 79  hin the subquery
204c0 20 63 6f 6d 70 6f 75 6e 64 20 6d 75 73 74 20 68   compound must h
204d0 61 76 65 20 61 20 46 52 4f 4d 20 63 6c 61 75 73  ave a FROM claus
204e0 65 0a 2a 2a 20 20 20 20 20 20 20 20 28 31 37 64  e.**        (17d
204f0 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  ) the outer quer
20500 79 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20  y may not be.** 
20510 20 20 20 20 20 20 20 20 20 20 20 20 20 28 31 37               (17
20520 64 31 29 20 61 67 67 72 65 67 61 74 65 2c 20 6f  d1) aggregate, o
20530 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
20540 20 20 28 31 37 64 32 29 20 44 49 53 54 49 4e 43    (17d2) DISTINC
20550 54 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20  T, or.**        
20560 20 20 20 20 20 20 28 31 37 64 33 29 20 61 20 6a        (17d3) a j
20570 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  oin..**.**      
20580 20 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64    The parent and
20590 20 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63   sub-query may c
205a0 6f 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61  ontain WHERE cla
205b0 75 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f  uses. Subject to
205c0 0a 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73  .**        rules
205d0 20 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20   (11), (13) and 
205e0 28 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61  (14), they may a
205f0 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45  lso contain ORDE
20600 52 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20  R BY,.**        
20610 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
20620 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20 73   clauses.  The s
20630 75 62 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 75  ubquery cannot u
20640 73 65 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a  se any compound.
20650 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61 74  **        operat
20660 6f 72 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e  or other than UN
20670 49 4f 4e 20 41 4c 4c 20 62 65 63 61 75 73 65 20  ION ALL because 
20680 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63 6f  all the other co
20690 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20  mpound.**       
206a0 20 6f 70 65 72 61 74 6f 72 73 20 68 61 76 65 20   operators have 
206b0 61 6e 20 69 6d 70 6c 69 65 64 20 44 49 53 54 49  an implied DISTI
206c0 4e 43 54 20 77 68 69 63 68 20 69 73 20 64 69 73  NCT which is dis
206d0 61 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 20 20  allowed by.**   
206e0 20 20 20 20 20 72 65 73 74 72 69 63 74 69 6f 6e       restriction
206f0 20 28 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20   (4)..**.**     
20700 20 20 20 41 6c 73 6f 2c 20 65 61 63 68 20 63 6f     Also, each co
20710 6d 70 6f 6e 65 6e 74 20 6f 66 20 74 68 65 20 73  mponent of the s
20720 75 62 2d 71 75 65 72 79 20 6d 75 73 74 20 72 65  ub-query must re
20730 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 6e 75  turn the same nu
20740 6d 62 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 6f  mber.**        o
20750 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
20760 2e 20 54 68 69 73 20 69 73 20 61 63 74 75 61 6c  . This is actual
20770 6c 79 20 61 20 72 65 71 75 69 72 65 6d 65 6e 74  ly a requirement
20780 20 66 6f 72 20 61 6e 79 20 63 6f 6d 70 6f 75 6e   for any compoun
20790 64 0a 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45  d.**        SELE
207a0 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75  CT statement, bu
207b0 74 20 61 6c 6c 20 74 68 65 20 63 6f 64 65 20 68  t all the code h
207c0 65 72 65 20 64 6f 65 73 20 69 73 20 6d 61 6b 65  ere does is make
207d0 20 73 75 72 65 20 74 68 61 74 20 6e 6f 0a 2a 2a   sure that no.**
207e0 20 20 20 20 20 20 20 20 73 75 63 68 20 28 69 6c          such (il
207f0 6c 65 67 61 6c 29 20 73 75 62 2d 71 75 65 72 79  legal) sub-query
20800 20 69 73 20 66 6c 61 74 74 65 6e 65 64 2e 20 54   is flattened. T
20810 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 64  he caller will d
20820 65 74 65 63 74 20 74 68 65 0a 2a 2a 20 20 20 20  etect the.**    
20830 20 20 20 20 73 79 6e 74 61 78 20 65 72 72 6f 72      syntax error
20840 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65   and return a de
20850 74 61 69 6c 65 64 20 6d 65 73 73 61 67 65 2e 0a  tailed message..
20860 2a 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49 66 20  **.**  (18)  If 
20870 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
20880 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
20890 63 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 72  ct, then all ter
208a0 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20  ms of the.**    
208b0 20 20 20 20 4f 52 44 45 52 20 42 59 20 63 6c 61      ORDER BY cla
208c0 75 73 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e  use of the paren
208d0 74 20 6d 75 73 74 20 62 65 20 73 69 6d 70 6c 65  t must be simple
208e0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 0a   references to .
208f0 2a 2a 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  **        column
20900 73 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65  s of the sub-que
20910 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20  ry..**.**  (19) 
20920 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
20930 20 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65 6e   uses LIMIT then
20940 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
20950 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20 20 20 20 20   may not.**     
20960 20 20 20 68 61 76 65 20 61 20 57 48 45 52 45 20     have a WHERE 
20970 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  clause..**.**  (
20980 32 30 29 20 20 49 66 20 74 68 65 20 73 75 62 2d  20)  If the sub-
20990 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
209a0 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
209b0 20 69 74 20 6d 75 73 74 20 6e 6f 74 20 75 73 65   it must not use
209c0 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 20 4f 52  .**        an OR
209d0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20  DER BY clause.  
209e0 54 69 63 6b 65 74 20 23 33 37 37 33 2e 20 20 57  Ticket #3773.  W
209f0 65 20 63 6f 75 6c 64 20 72 65 6c 61 78 20 74 68  e could relax th
20a00 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a  is constraint.**
20a10 20 20 20 20 20 20 20 20 73 6f 6d 65 77 68 61 74          somewhat
20a20 20 62 79 20 73 61 79 69 6e 67 20 74 68 61 74 20   by saying that 
20a30 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
20a40 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
20a50 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20 20 20   must.**        
20a60 61 70 70 65 61 72 20 61 73 20 75 6e 6d 6f 64 69  appear as unmodi
20a70 66 69 65 64 20 72 65 73 75 6c 74 20 63 6f 6c 75  fied result colu
20a80 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72  mns in the outer
20a90 20 71 75 65 72 79 2e 20 20 42 75 74 20 77 65 0a   query.  But we.
20aa0 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 6f  **        have o
20ab0 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ther optimizatio
20ac0 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65  ns in mind to de
20ad0 61 6c 20 77 69 74 68 20 74 68 61 74 20 63 61 73  al with that cas
20ae0 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20  e..**.**  (21)  
20af0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
20b00 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65 6e 20  uses LIMIT then 
20b10 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
20b20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 20 20  may not be.**   
20b30 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 20 20       DISTINCT.  
20b40 28 53 65 65 20 74 69 63 6b 65 74 20 5b 37 35 32  (See ticket [752
20b50 65 31 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a  e1646fc])..**.**
20b60 20 20 28 32 32 29 20 20 54 68 65 20 73 75 62 71    (22)  The subq
20b70 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20  uery may not be 
20b80 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2e  a recursive CTE.
20b90 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 53 75  .**.**  (**)  Su
20ba0 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74  bsumed into rest
20bb0 72 69 63 74 69 6f 6e 20 28 31 37 64 33 29 2e 20  riction (17d3). 
20bc0 20 57 61 73 3a 20 49 66 20 74 68 65 20 6f 75 74   Was: If the out
20bd0 65 72 20 71 75 65 72 79 20 69 73 0a 2a 2a 20 20  er query is.**  
20be0 20 20 20 20 20 20 61 20 72 65 63 75 72 73 69 76        a recursiv
20bf0 65 20 43 54 45 2c 20 74 68 65 6e 20 74 68 65 20  e CTE, then the 
20c00 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20 6e 6f  sub-query may no
20c10 74 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t be a compound 
20c20 71 75 65 72 79 2e 0a 2a 2a 20 20 20 20 20 20 20  query..**       
20c30 20 54 68 69 73 20 72 65 73 74 72 69 63 74 69 6f   This restrictio
20c40 6e 20 69 73 20 62 65 63 61 75 73 65 20 74 72 61  n is because tra
20c50 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 0a 2a 2a  nsforming the.**
20c60 20 20 20 20 20 20 20 20 70 61 72 65 6e 74 20 74          parent t
20c70 6f 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  o a compound que
20c80 72 79 20 63 6f 6e 66 75 73 65 73 20 74 68 65 20  ry confuses the 
20c90 63 6f 64 65 20 74 68 61 74 20 68 61 6e 64 6c 65  code that handle
20ca0 73 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 63 75  s.**        recu
20cb0 72 73 69 76 65 20 71 75 65 72 69 65 73 20 69 6e  rsive queries in
20cc0 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 2e 0a   multiSelect()..
20cd0 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20  **.**  (**)  We 
20ce0 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70  no longer attemp
20cf0 74 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67  t to flatten agg
20d00 72 65 67 61 74 65 20 73 75 62 71 75 65 72 69 65  regate subquerie
20d10 73 2e 20 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20  s.  Was:.**     
20d20 20 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20     The subquery 
20d30 6d 61 79 20 6e 6f 74 20 62 65 20 61 6e 20 61 67  may not be an ag
20d40 67 72 65 67 61 74 65 20 74 68 61 74 20 75 73 65  gregate that use
20d50 73 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6d  s the built-in m
20d60 69 6e 28 29 20 6f 72 20 0a 2a 2a 20 20 20 20 20  in() or .**     
20d70 20 20 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63     or max() func
20d80 74 69 6f 6e 73 2e 20 20 28 57 69 74 68 6f 75 74  tions.  (Without
20d90 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f   this restrictio
20da0 6e 2c 20 61 20 71 75 65 72 79 20 6c 69 6b 65 3a  n, a query like:
20db0 0a 2a 2a 20 20 20 20 20 20 20 20 22 53 45 4c 45  .**        "SELE
20dc0 43 54 20 78 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT x FROM (SELEC
20dd0 54 20 6d 61 78 28 79 29 2c 20 78 20 46 52 4f 4d  T max(y), x FROM
20de0 20 74 31 29 22 20 77 6f 75 6c 64 20 6e 6f 74 20   t1)" would not 
20df0 6e 65 63 65 73 73 61 72 69 6c 79 0a 2a 2a 20 20  necessarily.**  
20e00 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 68 65        return the
20e10 20 76 61 6c 75 65 20 58 20 66 6f 72 20 77 68 69   value X for whi
20e20 63 68 20 59 20 77 61 73 20 6d 61 78 69 6d 61 6c  ch Y was maximal
20e30 2e 29 0a 2a 2a 0a 2a 2a 20 20 28 32 35 29 20 20  .).**.**  (25)  
20e40 49 66 20 65 69 74 68 65 72 20 74 68 65 20 73 75  If either the su
20e50 62 71 75 65 72 79 20 6f 72 20 74 68 65 20 70 61  bquery or the pa
20e60 72 65 6e 74 20 71 75 65 72 79 20 63 6f 6e 74 61  rent query conta
20e70 69 6e 73 20 61 20 77 69 6e 64 6f 77 0a 2a 2a 20  ins a window.** 
20e80 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20         function 
20e90 69 6e 20 74 68 65 20 73 65 6c 65 63 74 20 6c 69  in the select li
20ea0 73 74 20 6f 72 20 4f 52 44 45 52 20 42 59 20 63  st or ORDER BY c
20eb0 6c 61 75 73 65 2c 20 66 6c 61 74 74 65 6e 69 6e  lause, flattenin
20ec0 67 0a 2a 2a 20 20 20 20 20 20 20 20 69 73 20 6e  g.**        is n
20ed0 6f 74 20 61 74 74 65 6d 70 74 65 64 2e 0a 2a 2a  ot attempted..**
20ee0 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72  .**.** In this r
20ef0 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20  outine, the "p" 
20f00 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
20f10 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75  ointer to the ou
20f20 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68  ter query..** Th
20f30 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70 2d  e subquery is p-
20f40 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e  >pSrc->a[iFrom].
20f50 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65 20    isAgg is true 
20f60 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  if the outer que
20f70 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65  ry.** uses aggre
20f80 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  gates..**.** If 
20f90 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f  flattening is no
20fa0 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69  t attempted, thi
20fb0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
20fc0 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73  o-op and returns
20fd0 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65   0..** If flatte
20fe0 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65  ning is attempte
20ff0 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  d this routine r
21000 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20  eturns 1..**.** 
21010 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65  All of the expre
21020 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d  ssion analysis m
21030 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74  ust occur on bot
21040 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  h the outer quer
21050 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62  y and.** the sub
21060 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68 69  query before thi
21070 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a  s routine runs..
21080 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
21090 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20  attenSubquery(. 
210a0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
210b0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
210c0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
210d0 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
210e0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74     /* The parent
210f0 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54   or outer SELECT
21100 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
21110 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20  int iFrom,      
21120 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
21130 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66   p->pSrc->a[] of
21140 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75   the inner subqu
21150 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  ery */.  int isA
21160 67 67 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gg            /*
21170 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53   True if outer S
21180 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65  ELECT uses aggre
21190 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
211a0 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
211b0 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e  r *zSavedAuthCon
211c0 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a  text = pParse->z
211d0 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53  AuthContext;.  S
211e0 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b 20  elect *pParent; 
211f0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 55 4e     /* Current UN
21200 49 4f 4e 20 41 4c 4c 20 74 65 72 6d 20 6f 66 20  ION ALL term of 
21210 74 68 65 20 6f 74 68 65 72 20 71 75 65 72 79 20  the other query 
21220 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  */.  Select *pSu
21230 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  b;       /* The 
21240 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22  inner query or "
21250 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53  subquery" */.  S
21260 65 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20  elect *pSub1;   
21270 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
21280 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73   the rightmost s
21290 65 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65  elect in sub-que
212a0 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ry */.  SrcList 
212b0 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54  *pSrc;      /* T
212c0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
212d0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
212e0 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  y */.  SrcList *
212f0 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68  pSubSrc;   /* Th
21300 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
21310 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   the subquery */
21320 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20  .  int iParent; 
21330 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63         /* VDBE c
21340 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
21350 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74 20  the pSub result 
21360 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a  set temp table *
21370 2f 0a 20 20 69 6e 74 20 69 4e 65 77 50 61 72 65  /.  int iNewPare
21380 6e 74 20 3d 20 2d 31 3b 2f 2a 20 52 65 70 6c 61  nt = -1;/* Repla
21390 63 65 6d 65 6e 74 20 74 61 62 6c 65 20 66 6f 72  cement table for
213a0 20 69 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e   iParent */.  in
213b0 74 20 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 30  t isLeftJoin = 0
213c0 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 70 53 75  ; /* True if pSu
213d0 62 20 69 73 20 74 68 65 20 72 69 67 68 74 20 73  b is the right s
213e0 69 64 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  ide of a LEFT JO
213f0 49 4e 20 2a 2f 20 20 20 20 0a 20 20 69 6e 74 20  IN */    .  int 
21400 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
21410 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
21420 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
21430 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
21440 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
21450 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
21460 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
21470 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20  em *pSubitem;   
21480 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  /* The subquery 
21490 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
214a0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
214b0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
214c0 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  e if flattening 
214d0 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52  is permitted.  R
214e0 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a  eturn 0 if not..
214f0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
21500 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21510 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b   p->pPrior==0 );
21520 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74  .  if( Optimizat
21530 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20  ionDisabled(db, 
21540 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74  SQLITE_QueryFlat
21550 74 65 6e 65 72 29 20 29 20 72 65 74 75 72 6e 20  tener) ) return 
21560 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  0;.  pSrc = p->p
21570 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
21580 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20  Src && iFrom>=0 
21590 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e  && iFrom<pSrc->n
215a0 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65  Src );.  pSubite
215b0 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72  m = &pSrc->a[iFr
215c0 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d  om];.  iParent =
215d0 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73   pSubitem->iCurs
215e0 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75  or;.  pSub = pSu
215f0 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  bitem->pSelect;.
21600 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21 3d    assert( pSub!=
21610 30 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  0 );..#ifndef SQ
21620 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
21630 46 55 4e 43 0a 20 20 69 66 28 20 70 2d 3e 70 57  FUNC.  if( p->pW
21640 69 6e 20 7c 7c 20 70 53 75 62 2d 3e 70 57 69 6e  in || pSub->pWin
21650 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
21660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21670 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 35   Restriction (25
21680 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 70  ) */.#endif..  p
21690 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
216a0 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
216b0 53 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50  SubSrc );.  /* P
216c0 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20  rior to version 
216d0 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49  3.1.2, when LIMI
216e0 54 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64  T and OFFSET had
216f0 20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f   to be simple co
21700 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f  nstants,.  ** no
21710 74 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72  t arbitrary expr
21720 65 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f  essions, we allo
21730 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69  wed some combini
21740 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20  ng of LIMIT and 
21750 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61  OFFSET.  ** beca
21760 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62  use they could b
21770 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f  e computed at co
21780 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74  mpile-time.  But
21790 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20   when LIMIT and 
217a0 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61  OFFSET.  ** beca
217b0 6d 65 20 61 72 62 69 74 72 61 72 79 20 65 78 70  me arbitrary exp
217c0 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72  ressions, we wer
217d0 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20  e forced to add 
217e0 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33  restrictions (13
217f0 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e  ).  ** and (14).
21800 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
21810 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69  pLimit && p->pLi
21820 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  mit ) return 0; 
21830 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21840 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29  Restriction (13)
21850 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
21860 70 4c 69 6d 69 74 20 26 26 20 70 53 75 62 2d 3e  pLimit && pSub->
21870 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 20 29  pLimit->pRight )
21880 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20   return 0;   /* 
21890 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29  Restriction (14)
218a0 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65   */.  if( (p->se
218b0 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70  lFlags & SF_Comp
218c0 6f 75 6e 64 29 21 3d 30 20 26 26 20 70 53 75 62  ound)!=0 && pSub
218d0 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
218e0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
218f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21910 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
21920 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a  ion (15) */.  }.
21930 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e    if( pSubSrc->n
21940 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Src==0 ) return 
21950 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
21960 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
21970 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a  riction (7)  */.
21980 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46    if( pSub->selF
21990 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
219a0 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ct ) return 0;  
219b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
219c0 72 69 63 74 69 6f 6e 20 28 34 29 20 20 2a 2f 0a  riction (4)  */.
219d0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
219e0 69 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72  it && (pSrc->nSr
219f0 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b  c>1 || isAgg) ){
21a00 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
21a10 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
21a20 69 63 74 69 6f 6e 73 20 28 38 29 28 39 29 20 2a  ictions (8)(9) *
21a30 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  /.  }.  if( p->p
21a40 4f 72 64 65 72 42 79 20 26 26 20 70 53 75 62 2d  OrderBy && pSub-
21a50 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
21a60 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
21a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a90 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
21aa0 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d  tion (11) */.  }
21ab0 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20  .  if( isAgg && 
21ac0 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
21ad0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
21ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
21af0 74 72 69 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f  triction (16) */
21b00 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
21b10 6d 69 74 20 26 26 20 70 2d 3e 70 57 68 65 72 65  mit && p->pWhere
21b20 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
21b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
21b40 74 72 69 63 74 69 6f 6e 20 28 31 39 29 20 2a 2f  triction (19) */
21b50 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
21b60 6d 69 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c  mit && (p->selFl
21b70 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
21b80 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 72 65  t)!=0 ){.     re
21b90 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
21ba0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
21bb0 32 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  21) */.  }.  if(
21bc0 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
21bd0 26 20 28 53 46 5f 52 65 63 75 72 73 69 76 65 29  & (SF_Recursive)
21be0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
21bf0 3b 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e  ; /* Restriction
21c00 73 20 28 32 32 29 20 2a 2f 0a 20 20 7d 0a 0a 20  s (22) */.  }.. 
21c10 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   /*.  ** If the 
21c20 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20  subquery is the 
21c30 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
21c40 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68   a LEFT JOIN, th
21c50 65 6e 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  en the.  ** subq
21c60 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20  uery may not be 
21c70 61 20 6a 6f 69 6e 20 69 74 73 65 6c 66 20 28 33  a join itself (3
21c80 61 29 2e 20 45 78 61 6d 70 6c 65 20 6f 66 20 77  a). Example of w
21c90 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 0a 20  hy this is not. 
21ca0 20 2a 2a 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a   ** allowed:.  *
21cb0 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74  *.  **         t
21cc0 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
21cd0 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20  N (t2 JOIN t3). 
21ce0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66   **.  ** If we f
21cf0 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65  latten the above
21d00 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20  , we would get. 
21d10 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
21d20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20   (t1 LEFT OUTER 
21d30 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33  JOIN t2) JOIN t3
21d40 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68  .  **.  ** which
21d50 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74   is not at all t
21d60 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20  he same thing.. 
21d70 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
21d80 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20  subquery is the 
21d90 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
21da0 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68   a LEFT JOIN, th
21db0 65 6e 20 74 68 65 20 6f 75 74 65 72 0a 20 20 2a  en the outer.  *
21dc0 2a 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62  * query cannot b
21dd0 65 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20  e an aggregate. 
21de0 28 33 63 29 20 20 54 68 69 73 20 69 73 20 61 6e  (3c)  This is an
21df0 20 61 72 74 69 66 61 63 74 20 6f 66 20 74 68 65   artifact of the
21e00 20 77 61 79 0a 20 20 2a 2a 20 61 67 67 72 65 67   way.  ** aggreg
21e10 61 74 65 73 20 61 72 65 20 70 72 6f 63 65 73 73  ates are process
21e20 65 64 20 2d 20 74 68 65 72 65 20 69 73 20 6e 6f  ed - there is no
21e30 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f 20 64 65   mechanism to de
21e40 74 65 72 6d 69 6e 65 20 69 66 0a 20 20 2a 2a 20  termine if.  ** 
21e50 74 68 65 20 4c 45 46 54 20 4a 4f 49 4e 20 74 61  the LEFT JOIN ta
21e60 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 61 6c  ble should be al
21e70 6c 2d 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a  l-NULL..  **.  *
21e80 2a 20 53 65 65 20 61 6c 73 6f 20 74 69 63 6b 65  * See also ticke
21e90 74 73 20 23 33 30 36 2c 20 23 33 35 30 2c 20 61  ts #306, #350, a
21ea0 6e 64 20 23 33 33 30 30 2e 0a 20 20 2a 2f 0a 20  nd #3300..  */. 
21eb0 20 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e   if( (pSubitem->
21ec0 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  fg.jointype & JT
21ed0 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20  _OUTER)!=0 ){.  
21ee0 20 20 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 31    isLeftJoin = 1
21ef0 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 53 72  ;.    if( pSubSr
21f00 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41  c->nSrc>1 || isA
21f10 67 67 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28  gg || IsVirtual(
21f20 70 53 75 62 53 72 63 2d 3e 61 5b 30 5d 2e 70 54  pSubSrc->a[0].pT
21f30 61 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ab) ){.      /* 
21f40 20 28 33 61 29 20 20 20 20 20 20 20 20 20 20 20   (3a)           
21f50 20 20 28 33 63 29 20 20 20 20 20 28 33 62 29 20    (3c)     (3b) 
21f60 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
21f70 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66  0;.    }.  }.#if
21f80 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41  def SQLITE_EXTRA
21f90 5f 49 46 4e 55 4c 4c 52 4f 57 0a 20 20 65 6c 73  _IFNULLROW.  els
21fa0 65 20 69 66 28 20 69 46 72 6f 6d 3e 30 20 26 26  e if( iFrom>0 &&
21fb0 20 21 69 73 41 67 67 20 29 7b 0a 20 20 20 20 2f   !isAgg ){.    /
21fc0 2a 20 53 65 74 74 69 6e 67 20 69 73 4c 65 66 74  * Setting isLeft
21fd0 4a 6f 69 6e 20 74 6f 20 2d 31 20 63 61 75 73 65  Join to -1 cause
21fe0 73 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 20 6f  s OP_IfNullRow o
21ff0 70 63 6f 64 65 73 20 74 6f 20 62 65 20 67 65 6e  pcodes to be gen
22000 65 72 61 74 65 64 20 66 6f 72 0a 20 20 20 20 2a  erated for.    *
22010 2a 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63  * every referenc
22020 65 20 74 6f 20 61 6e 79 20 72 65 73 75 6c 74 20  e to any result 
22030 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 73 75 62 71  column from subq
22040 75 65 72 79 20 69 6e 20 61 20 6a 6f 69 6e 2c 20  uery in a join, 
22050 65 76 65 6e 0a 20 20 20 20 2a 2a 20 74 68 6f 75  even.    ** thou
22060 67 68 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  gh they are not 
22070 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 69 73  necessary.  This
22080 20 77 69 6c 6c 20 73 74 72 65 73 73 2d 74 65 73   will stress-tes
22090 74 20 74 68 65 20 4f 50 5f 49 66 4e 75 6c 6c 52  t the OP_IfNullR
220a0 6f 77 20 0a 20 20 20 20 2a 2a 20 6f 70 63 6f 64  ow .    ** opcod
220b0 65 2e 20 2a 2f 0a 20 20 20 20 69 73 4c 65 66 74  e. */.    isLeft
220c0 4a 6f 69 6e 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23  Join = -1;.  }.#
220d0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 73 74  endif..  /* Rest
220e0 72 69 63 74 69 6f 6e 20 28 31 37 29 3a 20 49 66  riction (17): If
220f0 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
22100 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
22110 45 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73  ECT, then it mus
22120 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20  t.  ** use only 
22130 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  the UNION ALL op
22140 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65  erator. And none
22150 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20 73   of the simple s
22160 65 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20 20  elect queries.  
22170 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ** that make up 
22180 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  the compound SEL
22190 45 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  ECT are allowed 
221a0 74 6f 20 62 65 20 61 67 67 72 65 67 61 74 65 20  to be aggregate 
221b0 6f 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a  or distinct.  **
221c0 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20   queries..  */. 
221d0 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f   if( pSub->pPrio
221e0 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 75  r ){.    if( pSu
221f0 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
22200 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
22210 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
22220 32 30 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  20) */.    }.   
22230 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20 28 70   if( isAgg || (p
22240 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
22250 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20  Distinct)!=0 || 
22260 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b  pSrc->nSrc!=1 ){
22270 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
22280 20 2f 2a 20 28 31 37 64 31 29 2c 20 28 31 37 64   /* (17d1), (17d
22290 32 29 2c 20 6f 72 20 28 31 37 64 33 29 20 2a 2f  2), or (17d3) */
222a0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
222b0 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75 62 31  Sub1=pSub; pSub1
222c0 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d 3e 70  ; pSub1=pSub1->p
222d0 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 74 65  Prior){.      te
222e0 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e  stcase( (pSub1->
222f0 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
22300 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
22310 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69  gate))==SF_Disti
22320 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  nct );.      tes
22330 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73  tcase( (pSub1->s
22340 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
22350 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
22360 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67  ate))==SF_Aggreg
22370 61 74 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ate );.      ass
22380 65 72 74 28 20 70 53 75 62 2d 3e 70 53 72 63 21  ert( pSub->pSrc!
22390 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
223a0 72 74 28 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  rt( pSub->pEList
223b0 2d 3e 6e 45 78 70 72 3d 3d 70 53 75 62 31 2d 3e  ->nExpr==pSub1->
223c0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
223d0 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 75 62  .      if( (pSub
223e0 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
223f0 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
22400 67 72 65 67 61 74 65 29 29 21 3d 30 20 20 20 20  gregate))!=0    
22410 2f 2a 20 28 31 37 62 29 20 2a 2f 0a 20 20 20 20  /* (17b) */.    
22420 20 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70 50     || (pSub1->pP
22430 72 69 6f 72 20 26 26 20 70 53 75 62 31 2d 3e 6f  rior && pSub1->o
22440 70 21 3d 54 4b 5f 41 4c 4c 29 20 20 20 20 20 20  p!=TK_ALL)      
22450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31             /* (1
22460 37 61 29 20 2a 2f 0a 20 20 20 20 20 20 20 7c 7c  7a) */.       ||
22470 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53   pSub1->pSrc->nS
22480 72 63 3c 31 20 20 20 20 20 20 20 20 20 20 20 20  rc<1            
22490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224a0 20 20 20 20 20 20 2f 2a 20 28 31 37 63 29 20 2a        /* (17c) *
224b0 2f 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  /.      ){.     
224c0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
224d0 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
224e0 61 73 65 28 20 70 53 75 62 31 2d 3e 70 53 72 63  ase( pSub1->pSrc
224f0 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20 20 20 20  ->nSrc>1 );.    
22500 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 72 69  }..    /* Restri
22510 63 74 69 6f 6e 20 28 31 38 29 2e 20 2a 2f 0a 20  ction (18). */. 
22520 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
22530 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  By ){.      int 
22540 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69  ii;.      for(ii
22550 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72  =0; ii<p->pOrder
22560 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29  By->nExpr; ii++)
22570 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
22580 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d  >pOrderBy->a[ii]
22590 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
225a0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
225b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
225c0 7d 0a 0a 20 20 2f 2a 20 45 78 2d 72 65 73 74 72  }..  /* Ex-restr
225d0 69 63 74 69 6f 6e 20 28 32 33 29 3a 0a 20 20 2a  iction (23):.  *
225e0 2a 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 20 74  * The only way t
225f0 68 61 74 20 74 68 65 20 72 65 63 75 72 73 69 76  hat the recursiv
22600 65 20 70 61 72 74 20 6f 66 20 61 20 43 54 45 20  e part of a CTE 
22610 63 61 6e 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f  can contain a co
22620 6d 70 6f 75 6e 64 0a 20 20 2a 2a 20 73 75 62 71  mpound.  ** subq
22630 75 65 72 79 20 69 73 20 66 6f 72 20 74 68 65 20  uery is for the 
22640 73 75 62 71 75 65 72 79 20 74 6f 20 62 65 20 6f  subquery to be o
22650 6e 65 20 74 65 72 6d 20 6f 66 20 61 20 6a 6f 69  ne term of a joi
22660 6e 2e 20 20 42 75 74 20 69 66 20 74 68 65 0a 20  n.  But if the. 
22670 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73 20   ** subquery is 
22680 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68 65  a join, then the
22690 20 66 6c 61 74 74 65 6e 69 6e 67 20 68 61 73 20   flattening has 
226a0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 74 6f  already been sto
226b0 70 70 65 64 20 62 79 0a 20 20 2a 2a 20 72 65 73  pped by.  ** res
226c0 74 72 69 63 74 69 6f 6e 20 28 31 37 64 33 29 0a  triction (17d3).
226d0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
226e0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
226f0 5f 52 65 63 75 72 73 69 76 65 29 3d 3d 30 20 7c  _Recursive)==0 |
22700 7c 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3d 3d  | pSub->pPrior==
22710 30 20 29 3b 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49  0 );..  /***** I
22720 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
22730 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e  point, flattenin
22740 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20  g is permitted. 
22750 2a 2a 2a 2a 2a 2f 0a 20 20 53 45 4c 45 43 54 54  *****/.  SELECTT
22760 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c  RACE(1,pParse,p,
22770 28 22 66 6c 61 74 74 65 6e 20 25 75 2e 25 70 20  ("flatten %u.%p 
22780 66 72 6f 6d 20 74 65 72 6d 20 25 64 5c 6e 22 2c  from term %d\n",
22790 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
227a0 20 20 20 20 70 53 75 62 2d 3e 73 65 6c 49 64 2c      pSub->selId,
227b0 20 70 53 75 62 2c 20 69 46 72 6f 6d 29 29 3b 0a   pSub, iFrom));.
227c0 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20  .  /* Authorize 
227d0 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
227e0 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
227f0 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69 74 65  ontext = pSubite
22800 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45 53 54  m->zName;.  TEST
22810 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69 74 65  ONLY(i =) sqlite
22820 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
22830 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54  e, SQLITE_SELECT
22840 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 74 65  , 0, 0, 0);.  te
22850 73 74 63 61 73 65 28 20 69 3d 3d 53 51 4c 49 54  stcase( i==SQLIT
22860 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50 61 72  E_DENY );.  pPar
22870 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
22880 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e   = zSavedAuthCon
22890 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  text;..  /* If t
228a0 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
228b0 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
228c0 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  T statement, the
228d0 6e 20 28 62 79 20 72 65 73 74 72 69 63 74 69 6f  n (by restrictio
228e0 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20 31  ns.  ** 17 and 1
228f0 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73 74  8 above) it must
22900 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20   be a UNION ALL 
22910 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20 71  and the parent q
22920 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20  uery must .  ** 
22930 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  be of the form:.
22940 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
22950 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e  LECT <expr-list>
22960 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72   FROM (<sub-quer
22970 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75 73  y>) <where-claus
22980 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f  e> .  **.  ** fo
22990 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f 52  llowed by any OR
229a0 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e  DER BY, LIMIT an
229b0 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61 75  d/or OFFSET clau
229c0 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a  ses. This block.
229d0 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d 31    ** creates N-1
229e0 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70   copies of the p
229f0 61 72 65 6e 74 20 71 75 65 72 79 20 77 69 74 68  arent query with
22a00 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42 59  out any ORDER BY
22a10 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a  , LIMIT or .  **
22a20 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 20   OFFSET clauses 
22a30 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74  and joins them t
22a40 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d  o the left-hand-
22a50 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69 67  side of the orig
22a60 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20  inal.  ** using 
22a70 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
22a80 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ors. In this cas
22a90 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e N is the numbe
22aa0 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a  r of simple.  **
22ab0 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
22ac0 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75  ts in the compou
22ad0 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20  nd sub-query..  
22ae0 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  **.  ** Example:
22af0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
22b00 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20 28  ELECT a+1 FROM (
22b10 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  .  **        SEL
22b20 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a 20  ECT x FROM tab. 
22b30 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e   **        UNION
22b40 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20   ALL.  **       
22b50 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74   SELECT y FROM t
22b60 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55  ab.  **        U
22b70 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
22b80 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28       SELECT abs(
22b90 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a 20  z*2) FROM tab2. 
22ba0 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45 20   **     ) WHERE 
22bb0 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31 0a  a!=5 ORDER BY 1.
22bc0 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66    **.  ** Transf
22bd0 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a  ormed into:.  **
22be0 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
22bf0 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48   x+1 FROM tab WH
22c00 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20  ERE x+1!=5.  ** 
22c10 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
22c20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79 2b  **     SELECT y+
22c30 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45  1 FROM tab WHERE
22c40 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20   y+1!=5.  **    
22c50 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
22c60 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a      SELECT abs(z
22c70 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32 20  *2)+1 FROM tab2 
22c80 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b 31  WHERE abs(z*2)+1
22c90 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44  !=5.  **     ORD
22ca0 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a  ER BY 1.  **.  *
22cb0 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20 74  * We call this t
22cc0 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  he "compound-sub
22cd0 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  query flattening
22ce0 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53  "..  */.  for(pS
22cf0 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b  ub=pSub->pPrior;
22d00 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75 62   pSub; pSub=pSub
22d10 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 53  ->pPrior){.    S
22d20 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20  elect *pNew;.   
22d30 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
22d40 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
22d50 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 69  y;.    Expr *pLi
22d60 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
22d70 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72  .    Select *pPr
22d80 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
22d90 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  .    p->pOrderBy
22da0 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72   = 0;.    p->pSr
22db0 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50  c = 0;.    p->pP
22dc0 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d  rior = 0;.    p-
22dd0 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
22de0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53   pNew = sqlite3S
22df0 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2c 20  electDup(db, p, 
22e00 30 29 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69  0);.    p->pLimi
22e10 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
22e20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
22e30 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70  rderBy;.    p->p
22e40 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20  Src = pSrc;.    
22e50 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a  p->op = TK_ALL;.
22e60 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
22e70 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  ){.      p->pPri
22e80 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
22e90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e   }else{.      pN
22ea0 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72  ew->pPrior = pPr
22eb0 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ior;.      if( p
22ec0 50 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e  Prior ) pPrior->
22ed0 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pNext = pNew;.  
22ee0 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20      pNew->pNext 
22ef0 3d 20 70 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  = p;.      p->pP
22f00 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20  rior = pNew;.   
22f10 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 32     SELECTTRACE(2
22f20 2c 70 50 61 72 73 65 2c 70 2c 28 22 63 6f 6d 70  ,pParse,p,("comp
22f30 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c  ound-subquery fl
22f40 61 74 74 65 6e 65 72 22 0a 20 20 20 20 20 20 20  attener".       
22f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f60 20 20 20 20 20 20 20 22 20 63 72 65 61 74 65 73         " creates
22f70 20 25 75 20 61 73 20 70 65 65 72 5c 6e 22 2c 70   %u as peer\n",p
22f80 4e 65 77 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20  New->selId));.  
22f90 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
22fa0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
22fb0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
22fc0 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74 74 65 6e  /* Begin flatten
22fd0 69 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d 74 68  ing the iFrom-th
22fe0 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52   entry of the FR
22ff0 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20  OM clause .  ** 
23000 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
23010 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20  ry..  */.  pSub 
23020 3d 20 70 53 75 62 31 20 3d 20 70 53 75 62 69 74  = pSub1 = pSubit
23030 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20  em->pSelect;..  
23040 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 74 72  /* Delete the tr
23050 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74  ansient table st
23060 72 75 63 74 75 72 65 20 61 73 73 6f 63 69 61 74  ructure associat
23070 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a  ed with the.  **
23080 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20   subquery.  */. 
23090 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
230a0 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61  b, pSubitem->zDa
230b0 74 61 62 61 73 65 29 3b 0a 20 20 73 71 6c 69 74  tabase);.  sqlit
230c0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75  e3DbFree(db, pSu
230d0 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  bitem->zName);. 
230e0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
230f0 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c  b, pSubitem->zAl
23100 69 61 73 29 3b 0a 20 20 70 53 75 62 69 74 65 6d  ias);.  pSubitem
23110 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b  ->zDatabase = 0;
23120 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61  .  pSubitem->zNa
23130 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74  me = 0;.  pSubit
23140 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a  em->zAlias = 0;.
23150 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c    pSubitem->pSel
23160 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44  ect = 0;..  /* D
23170 65 66 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68  efer deleting th
23180 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 61  e Table object a
23190 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
231a0 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79  he.  ** subquery
231b0 20 75 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65   until code gene
231c0 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63  ration is.  ** c
231d0 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65 20 74  omplete, since t
231e0 68 65 72 65 20 6d 61 79 20 73 74 69 6c 6c 20 65  here may still e
231f0 78 69 73 74 20 45 78 70 72 2e 70 54 61 62 20 65  xist Expr.pTab e
23200 6e 74 72 69 65 73 20 74 68 61 74 0a 20 20 2a 2a  ntries that.  **
23210 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 73 75   refer to the su
23220 62 71 75 65 72 79 20 65 76 65 6e 20 61 66 74 65  bquery even afte
23230 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54  r flattening.  T
23240 69 63 6b 65 74 20 23 33 33 34 36 2e 0a 20 20 2a  icket #3346..  *
23250 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d  *.  ** pSubitem-
23260 3e 70 54 61 62 20 69 73 20 61 6c 77 61 79 73 20  >pTab is always 
23270 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74  non-NULL by test
23280 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 61 6e   restrictions an
23290 64 20 74 65 73 74 73 20 61 62 6f 76 65 2e 0a 20  d tests above.. 
232a0 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53   */.  if( ALWAYS
232b0 28 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 21  (pSubitem->pTab!
232c0 3d 30 29 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  =0) ){.    Table
232d0 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20 70 53   *pTabToDel = pS
232e0 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  ubitem->pTab;.  
232f0 20 20 69 66 28 20 70 54 61 62 54 6f 44 65 6c 2d    if( pTabToDel-
23300 3e 6e 54 61 62 52 65 66 3d 3d 31 20 29 7b 0a 20  >nTabRef==1 ){. 
23310 20 20 20 20 20 50 61 72 73 65 20 2a 70 54 6f 70       Parse *pTop
23320 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
23330 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
23340 72 73 65 29 3b 0a 20 20 20 20 20 20 70 54 61 62  rse);.      pTab
23350 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62  ToDel->pNextZomb
23360 69 65 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  ie = pToplevel->
23370 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20 20 20 20  pZombieTab;.    
23380 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f    pToplevel->pZo
23390 6d 62 69 65 54 61 62 20 3d 20 70 54 61 62 54 6f  mbieTab = pTabTo
233a0 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Del;.    }else{.
233b0 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d        pTabToDel-
233c0 3e 6e 54 61 62 52 65 66 2d 2d 3b 0a 20 20 20 20  >nTabRef--;.    
233d0 7d 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e  }.    pSubitem->
233e0 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  pTab = 0;.  }.. 
233f0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
23400 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65  g loop runs once
23410 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69   for each term i
23420 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  n a compound-sub
23430 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74  query.  ** flatt
23440 65 6e 69 6e 67 20 28 61 73 20 64 65 73 63 72 69  ening (as descri
23450 62 65 64 20 61 62 6f 76 65 29 2e 20 20 49 66 20  bed above).  If 
23460 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 64  we are doing a d
23470 69 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20  ifferent kind.  
23480 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** of flattening
23490 20 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e 67 20   - a flattening 
234a0 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6d  other than a com
234b0 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
234c0 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a  lattening -.  **
234d0 20 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20   then this loop 
234e0 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a  only runs once..
234f0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c    **.  ** This l
23500 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66  oop moves all of
23510 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e   the FROM elemen
23520 74 73 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ts of the subque
23530 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  ry into the.  **
23540 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
23550 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
23560 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69  ery.  Before doi
23570 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65  ng this, remembe
23580 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f  r.  ** the curso
23590 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
235a0 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20   original outer 
235b0 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65  query FROM eleme
235c0 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65  nt in.  ** iPare
235d0 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74  nt.  The iParent
235e0 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76   cursor will nev
235f0 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75 62  er be used.  Sub
23600 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a  sequent code.  *
23610 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72  * will scan expr
23620 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20  essions looking 
23630 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66 65  for iParent refe
23640 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61  rences and repla
23650 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65  ce.  ** those re
23660 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65 78  ferences with ex
23670 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72  pressions that r
23680 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75  esolve to the su
23690 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a  bquery FROM.  **
236a0 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65   elements we are
236b0 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e   now copying in.
236c0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72  .  */.  for(pPar
236d0 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20  ent=p; pParent; 
236e0 70 50 61 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d  pParent=pParent-
236f0 3e 70 50 72 69 6f 72 2c 20 70 53 75 62 3d 70 53  >pPrior, pSub=pS
23700 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  ub->pPrior){.   
23710 20 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20 20   int nSubSrc;.  
23720 20 20 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20    u8 jointype = 
23730 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
23740 53 75 62 21 3d 30 20 29 3b 0a 20 20 20 20 70 53  Sub!=0 );.    pS
23750 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
23760 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  rc;     /* FROM 
23770 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65  clause of subque
23780 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72  ry */.    nSubSr
23790 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  c = pSubSrc->nSr
237a0 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  c;  /* Number of
237b0 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65   terms in subque
237c0 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  ry FROM clause *
237d0 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50 61  /.    pSrc = pPa
237e0 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20  rent->pSrc;     
237f0 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  /* FROM clause o
23800 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
23810 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53  y */..    if( pS
23820 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  rc ){.      asse
23830 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29  rt( pParent==p )
23840 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65  ;  /* First time
23850 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f   through the loo
23860 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74  p */.      joint
23870 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ype = pSubitem->
23880 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  fg.jointype;.   
23890 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
238a0 73 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70  sert( pParent!=p
238b0 20 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20   );  /* 2nd and 
238c0 73 75 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73  subsequent times
238d0 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f   through the loo
238e0 70 20 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20  p */.      pSrc 
238f0 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
23900 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
23910 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
23920 66 28 20 70 53 72 63 3d 3d 30 20 29 20 62 72 65  f( pSrc==0 ) bre
23930 61 6b 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  ak;.      pParen
23940 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  t->pSrc = pSrc;.
23950 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
23960 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
23970 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66  a single slot of
23980 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
23990 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20   of the outer.  
239a0 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20    ** query.  If 
239b0 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  the subquery has
239c0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65   more than one e
239d0 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52  lement in its FR
239e0 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a  OM clause,.    *
239f0 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68  * then expand th
23a00 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f  e outer query to
23a10 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20   make space for 
23a20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65  it to hold all e
23a30 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f  lements.    ** o
23a40 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
23a50 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78      **.    ** Ex
23a60 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
23a70 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a    **    SELECT *
23a80 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c   FROM tabA, (SEL
23a90 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c  ECT * FROM sub1,
23aa0 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20   sub2), tabB;.  
23ab0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
23ac0 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 73 20  outer query has 
23ad0 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46  3 slots in its F
23ae0 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65  ROM clause.  One
23af0 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20   slot of the.   
23b00 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20   ** outer query 
23b10 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74  (the middle slot
23b20 29 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  ) is used by the
23b30 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 65 20   subquery.  The 
23b40 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63  next.    ** bloc
23b50 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65  k of code will e
23b60 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  xpand the outer 
23b70 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73  query FROM claus
23b80 65 20 74 6f 20 34 20 73 6c 6f 74 73 2e 0a 20 20  e to 4 slots..  
23b90 20 20 2a 2a 20 54 68 65 20 6d 69 64 64 6c 65 20    ** The middle 
23ba0 73 6c 6f 74 20 69 73 20 65 78 70 61 6e 64 65 64  slot is expanded
23bb0 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e   to two slots in
23bc0 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73   order to make s
23bd0 70 61 63 65 0a 20 20 20 20 2a 2a 20 66 6f 72 20  pace.    ** for 
23be0 74 68 65 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73  the two elements
23bf0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
23c00 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  use of the subqu
23c10 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ery..    */.    
23c20 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b  if( nSubSrc>1 ){
23c30 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 73 71  .      pSrc = sq
23c40 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61  lite3SrcListEnla
23c50 72 67 65 28 70 50 61 72 73 65 2c 20 70 53 72 63  rge(pParse, pSrc
23c60 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f  , nSubSrc-1,iFro
23c70 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  m+1);.      if( 
23c80 70 53 72 63 3d 3d 30 20 29 20 62 72 65 61 6b 3b  pSrc==0 ) break;
23c90 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
23ca0 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20  pSrc = pSrc;.   
23cb0 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73   }..    /* Trans
23cc0 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  fer the FROM cla
23cd0 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74  use terms from t
23ce0 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
23cf0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
23d00 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  r query..    */.
23d10 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
23d20 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
23d30 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
23d40 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63  tDelete(db, pSrc
23d50 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73  ->a[i+iFrom].pUs
23d60 69 6e 67 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ing);.      asse
23d70 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46  rt( pSrc->a[i+iF
23d80 72 6f 6d 5d 2e 66 67 2e 69 73 54 61 62 46 75 6e  rom].fg.isTabFun
23d90 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 53  c==0 );.      pS
23da0 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d  rc->a[i+iFrom] =
23db0 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a   pSubSrc->a[i];.
23dc0 20 20 20 20 20 20 69 4e 65 77 50 61 72 65 6e 74        iNewParent
23dd0 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d   = pSubSrc->a[i]
23de0 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  .iCursor;.      
23df0 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d  memset(&pSubSrc-
23e00 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  >a[i], 0, sizeof
23e10 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29  (pSubSrc->a[i]))
23e20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63  ;.    }.    pSrc
23e30 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a 6f  ->a[iFrom].fg.jo
23e40 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70  intype = jointyp
23e50 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77  e;.  .    /* Now
23e60 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75 74   begin substitut
23e70 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65 73  ing subquery res
23e80 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69  ult set expressi
23e90 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20  ons for .    ** 
23ea0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
23eb0 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65  e iParent in the
23ec0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
23ed0 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61    ** .    ** Exa
23ee0 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mple:.    **.   
23ef0 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35   **   SELECT a+5
23f00 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c  , b*10 FROM (SEL
23f10 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b  ECT x*3 AS a, y+
23f20 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29  10 AS b FROM t1)
23f30 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20   WHERE a>b;.    
23f40 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20  **   \          
23f50 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
23f60 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65  _________ subque
23f70 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20  ry __________/  
23f80 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a          /.    **
23f90 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
23fa0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72  __________ outer
23fb0 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f   query _________
23fc0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23fd0 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20  _____/.    **.  
23fe0 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20    ** We look at 
23ff0 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
24000 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
24010 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c  ery and every pl
24020 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a  ace we see.    *
24030 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74  * "a" we substit
24040 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76  ute "x*3" and ev
24050 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65  ery place we see
24060 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75   "b" we substitu
24070 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a  te "y+10"..    *
24080 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  /.    if( pSub->
24090 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
240a0 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
240b0 6e 74 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f  nt, any non-zero
240c0 20 69 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c   iOrderByCol val
240d0 75 65 73 20 69 6e 64 69 63 61 74 65 20 74 68 61  ues indicate tha
240e0 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f  t the.      ** O
240f0 52 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 65  RDER BY column e
24100 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 64 65  xpression is ide
24110 6e 74 69 63 61 6c 20 74 6f 20 74 68 65 20 69 4f  ntical to the iO
24120 72 64 65 72 42 79 43 6f 6c 27 74 68 0a 20 20 20  rderByCol'th.   
24130 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
24140 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c   returned by SEL
24150 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 53  ECT statement pS
24160 75 62 2e 20 53 69 6e 63 65 20 74 68 65 73 65 20  ub. Since these 
24170 76 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20  values.      ** 
24180 64 6f 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  do not necessari
24190 6c 79 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ly correspond to
241a0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 53 45 4c 45   columns in SELE
241b0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 50 61  CT statement pPa
241c0 72 65 6e 74 2c 0a 20 20 20 20 20 20 2a 2a 20 7a  rent,.      ** z
241d0 65 72 6f 20 74 68 65 6d 20 62 65 66 6f 72 65 20  ero them before 
241e0 74 72 61 6e 73 66 65 72 69 6e 67 20 74 68 65 20  transfering the 
241f0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
24200 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
24210 2a 2a 20 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69  ** Not doing thi
24220 73 20 6d 61 79 20 63 61 75 73 65 20 61 6e 20 65  s may cause an e
24230 72 72 6f 72 20 69 66 20 61 20 73 75 62 73 65 71  rror if a subseq
24240 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 74 68 69  uent call to thi
24250 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74  s.      ** funct
24260 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
24270 66 6c 61 74 74 65 6e 20 61 20 63 6f 6d 70 6f 75  flatten a compou
24280 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69 6e 74  nd sub-query int
24290 6f 20 70 50 61 72 65 6e 74 0a 20 20 20 20 20 20  o pParent.      
242a0 2a 2a 20 28 74 68 65 20 6f 6e 6c 79 20 77 61 79  ** (the only way
242b0 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   this can happen
242c0 20 69 73 20 69 66 20 74 68 65 20 63 6f 6d 70 6f   is if the compo
242d0 75 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69 73  und sub-query is
242e0 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  .      ** curren
242f0 74 6c 79 20 70 61 72 74 20 6f 66 20 70 53 75 62  tly part of pSub
24300 2d 3e 70 53 72 63 29 2e 20 53 65 65 20 74 69 63  ->pSrc). See tic
24310 6b 65 74 20 5b 64 31 31 61 36 65 39 30 38 66 5d  ket [d11a6e908f]
24320 2e 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  .  */.      Expr
24330 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
24340 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b   pSub->pOrderBy;
24350 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
24360 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
24370 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
24380 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
24390 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
243a0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
243b0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
243c0 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  nt->pOrderBy==0 
243d0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
243e0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
243f0 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75  derBy;.      pSu
24400 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  b->pOrderBy = 0;
24410 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 68 65 72  .    }.    pWher
24420 65 20 3d 20 70 53 75 62 2d 3e 70 57 68 65 72 65  e = pSub->pWhere
24430 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 57 68 65  ;.    pSub->pWhe
24440 72 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  re = 0;.    if( 
24450 69 73 4c 65 66 74 4a 6f 69 6e 3e 30 20 29 7b 0a  isLeftJoin>0 ){.
24460 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70        setJoinExp
24470 72 28 70 57 68 65 72 65 2c 20 69 4e 65 77 50 61  r(pWhere, iNewPa
24480 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rent);.    }.   
24490 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
244a0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
244b0 64 28 70 50 61 72 73 65 2c 20 70 57 68 65 72 65  d(pParse, pWhere
244c0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72  , pParent->pWher
244d0 65 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  e);.    if( db->
244e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
244f0 29 7b 0a 20 20 20 20 20 20 53 75 62 73 74 43 6f  ){.      SubstCo
24500 6e 74 65 78 74 20 78 3b 0a 20 20 20 20 20 20 78  ntext x;.      x
24510 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
24520 3b 0a 20 20 20 20 20 20 78 2e 69 54 61 62 6c 65  ;.      x.iTable
24530 20 3d 20 69 50 61 72 65 6e 74 3b 0a 20 20 20 20   = iParent;.    
24540 20 20 78 2e 69 4e 65 77 54 61 62 6c 65 20 3d 20    x.iNewTable = 
24550 69 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20 20 20  iNewParent;.    
24560 20 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e 20 3d    x.isLeftJoin =
24570 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 0a 20 20 20   isLeftJoin;.   
24580 20 20 20 78 2e 70 45 4c 69 73 74 20 3d 20 70 53     x.pEList = pS
24590 75 62 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  ub->pEList;.    
245a0 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 26 78    substSelect(&x
245b0 2c 20 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20  , pParent, 0);. 
245c0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54     }.  .    /* T
245d0 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65  he flattened que
245e0 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
245f0 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69   if either the i
24600 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20  nner or the.    
24610 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  ** outer query i
24620 73 20 61 20 63 6f 6d 70 6f 75 6e 64 2e 20 2a 2f  s a compound. */
24630 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 73 65  .    pParent->se
24640 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e  lFlags |= pSub->
24650 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f  selFlags & SF_Co
24660 6d 70 6f 75 6e 64 3b 0a 20 20 20 20 61 73 73 65  mpound;.    asse
24670 72 74 28 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c  rt( (pSub->selFl
24680 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
24690 74 29 3d 3d 30 20 29 3b 20 2f 2a 20 72 65 73 74  t)==0 ); /* rest
246a0 72 69 63 74 69 6f 6e 20 28 31 37 62 29 20 2a 2f  riction (17b) */
246b0 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  .  .    /*.    *
246c0 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  * SELECT ... FRO
246d0 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49  M (SELECT ... LI
246e0 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29 20  MIT a OFFSET b) 
246f0 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79  LIMIT x OFFSET y
24700 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
24710 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20 74  One is tempted t
24720 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61 20 61  o try to add a a
24730 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20  nd b to combine 
24740 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74  the limits.  But
24750 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65   this.    ** doe
24760 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69  s not work if ei
24770 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65  ther limit is ne
24780 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20  gative..    */. 
24790 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69     if( pSub->pLi
247a0 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61  mit ){.      pPa
247b0 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  rent->pLimit = p
247c0 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  Sub->pLimit;.   
247d0 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20     pSub->pLimit 
247e0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
247f0 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64    /* Finially, d
24800 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65  elete what is le
24810 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ft of the subque
24820 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ry and return.  
24830 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f  ** success..  */
24840 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
24850 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 31  Delete(db, pSub1
24860 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52  );..#if SELECTTR
24870 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
24880 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
24890 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a  race & 0x100 ){.
248a0 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
248b0 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28  0x100,pParse,p,(
248c0 22 41 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e  "After flattenin
248d0 67 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c  g:\n"));.    sql
248e0 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
248f0 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d  ct(0, p, 0);.  }
24900 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
24910 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
24920 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
24930 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
24940 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
24950 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f  TE_OMIT_VIEW) */
24960 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74  ../*.** A struct
24970 75 72 65 20 74 6f 20 6b 65 65 70 20 74 72 61 63  ure to keep trac
24980 6b 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  k of all of the 
24990 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 74 68  column values th
249a0 61 74 20 61 72 65 20 66 69 78 65 64 20 74 6f 0a  at are fixed to.
249b0 2a 2a 20 61 20 6b 6e 6f 77 6e 20 76 61 6c 75 65  ** a known value
249c0 20 64 75 65 20 74 6f 20 57 48 45 52 45 20 63 6c   due to WHERE cl
249d0 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ause constraints
249e0 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 43 4f 4c   of the form COL
249f0 55 4d 4e 3d 56 41 4c 55 45 2e 0a 2a 2f 0a 74 79  UMN=VALUE..*/.ty
24a00 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65  pedef struct Whe
24a10 72 65 43 6f 6e 73 74 20 57 68 65 72 65 43 6f 6e  reConst WhereCon
24a20 73 74 3b 0a 73 74 72 75 63 74 20 57 68 65 72 65  st;.struct Where
24a30 43 6f 6e 73 74 20 7b 0a 20 20 50 61 72 73 65 20  Const {.  Parse 
24a40 2a 70 50 61 72 73 65 3b 20 20 20 2f 2a 20 50 61  *pParse;   /* Pa
24a50 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
24a60 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 3b 20 20  .  int nConst;  
24a70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 66 6f      /* Number fo
24a80 72 20 43 4f 4c 55 4d 4e 3d 43 4f 4e 53 54 41 4e  r COLUMN=CONSTAN
24a90 54 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74  T terms */.  int
24aa0 20 6e 43 68 6e 67 3b 20 20 20 20 20 20 20 2f 2a   nChng;       /*
24ab0 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   Number of times
24ac0 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 73 20 70   a constant is p
24ad0 72 6f 70 61 67 61 74 65 64 20 2a 2f 0a 20 20 45  ropagated */.  E
24ae0 78 70 72 20 2a 2a 61 70 45 78 70 72 3b 20 20 20  xpr **apExpr;   
24af0 2f 2a 20 5b 69 2a 32 5d 20 69 73 20 43 4f 4c 55  /* [i*2] is COLU
24b00 4d 4e 20 61 6e 64 20 5b 69 2a 32 2b 31 5d 20 69  MN and [i*2+1] i
24b10 73 20 56 41 4c 55 45 20 2a 2f 0a 7d 3b 0a 0a 2f  s VALUE */.};../
24b20 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
24b30 6e 74 72 79 20 74 6f 20 74 68 65 20 70 43 6f 6e  ntry to the pCon
24b40 73 74 20 6f 62 6a 65 63 74 2e 20 20 45 78 63 65  st object.  Exce
24b50 70 74 2c 20 64 6f 20 6e 6f 74 20 61 64 64 20 64  pt, do not add d
24b60 75 70 6c 69 63 61 74 65 0a 2a 2a 20 70 43 6f 6c  uplicate.** pCol
24b70 75 6d 6e 20 65 6e 74 69 72 65 73 2e 0a 2a 2f 0a  umn entires..*/.
24b80 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 73  static void cons
24b90 74 49 6e 73 65 72 74 28 0a 20 20 57 68 65 72 65  tInsert(.  Where
24ba0 43 6f 6e 73 74 20 2a 70 43 6f 6e 73 74 2c 20 20  Const *pConst,  
24bb0 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
24bc0 43 6f 6e 73 74 20 69 6e 74 6f 20 77 68 69 63 68  Const into which
24bd0 20 77 65 20 61 72 65 20 69 6e 73 65 72 74 69 6e   we are insertin
24be0 67 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43 6f  g */.  Expr *pCo
24bf0 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20  lumn,           
24c00 2f 2a 20 54 68 65 20 43 4f 4c 55 4d 4e 20 70 61  /* The COLUMN pa
24c10 72 74 20 6f 66 20 74 68 65 20 63 6f 6e 73 74 72  rt of the constr
24c20 61 69 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  aint */.  Expr *
24c30 70 56 61 6c 75 65 20 20 20 20 20 20 20 20 20 20  pValue          
24c40 20 20 20 2f 2a 20 54 68 65 20 56 41 4c 55 45 20     /* The VALUE 
24c50 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6e 73  part of the cons
24c60 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  traint */.){.  i
24c70 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
24c80 70 43 6f 6c 75 6d 6e 2d 3e 6f 70 3d 3d 54 4b 5f  pColumn->op==TK_
24c90 43 4f 4c 55 4d 4e 20 29 3b 0a 0a 20 20 2f 2a 20  COLUMN );..  /* 
24ca0 32 30 31 38 2d 31 30 2d 32 35 20 74 69 63 6b 65  2018-10-25 ticke
24cb0 74 20 5b 63 66 35 65 64 32 30 66 5d 0a 20 20 2a  t [cf5ed20f].  *
24cc0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
24cd0 73 61 6d 65 20 70 43 6f 6c 75 6d 6e 20 69 73 20  same pColumn is 
24ce0 6e 6f 74 20 69 6e 73 65 72 74 65 64 20 6d 6f 72  not inserted mor
24cf0 65 20 74 68 61 6e 20 6f 6e 63 65 20 2a 2f 0a 20  e than once */. 
24d00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e   for(i=0; i<pCon
24d10 73 74 2d 3e 6e 43 6f 6e 73 74 3b 20 69 2b 2b 29  st->nConst; i++)
24d20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 45 78 70 72  {.    const Expr
24d30 20 2a 70 45 78 70 72 20 3d 20 70 43 6f 6e 73 74   *pExpr = pConst
24d40 2d 3e 61 70 45 78 70 72 5b 69 2a 32 5d 3b 0a 20  ->apExpr[i*2];. 
24d50 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
24d60 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
24d70 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  );.    if( pExpr
24d80 2d 3e 69 54 61 62 6c 65 3d 3d 70 43 6f 6c 75 6d  ->iTable==pColum
24d90 6e 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 26  n->iTable.     &
24da0 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
24db0 3d 3d 70 43 6f 6c 75 6d 6e 2d 3e 69 43 6f 6c 75  ==pColumn->iColu
24dc0 6d 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  mn.    ){.      
24dd0 72 65 74 75 72 6e 3b 20 20 2f 2a 20 41 6c 72 65  return;  /* Alre
24de0 61 64 79 20 70 72 65 73 65 6e 74 2e 20 20 52 65  ady present.  Re
24df0 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69  turn without doi
24e00 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 2a 2f 0a  ng anything. */.
24e10 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f      }.  }..  pCo
24e20 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2b 2b 3b 0a 20  nst->nConst++;. 
24e30 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 20   pConst->apExpr 
24e40 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
24e50 6f 63 4f 72 46 72 65 65 28 70 43 6f 6e 73 74 2d  ocOrFree(pConst-
24e60 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 43 6f  >pParse->db, pCo
24e70 6e 73 74 2d 3e 61 70 45 78 70 72 2c 0a 20 20 20  nst->apExpr,.   
24e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e90 20 20 20 20 20 20 70 43 6f 6e 73 74 2d 3e 6e 43        pConst->nC
24ea0 6f 6e 73 74 2a 32 2a 73 69 7a 65 6f 66 28 45 78  onst*2*sizeof(Ex
24eb0 70 72 2a 29 29 3b 0a 20 20 69 66 28 20 70 43 6f  pr*));.  if( pCo
24ec0 6e 73 74 2d 3e 61 70 45 78 70 72 3d 3d 30 20 29  nst->apExpr==0 )
24ed0 7b 0a 20 20 20 20 70 43 6f 6e 73 74 2d 3e 6e 43  {.    pConst->nC
24ee0 6f 6e 73 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  onst = 0;.  }els
24ef0 65 7b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  e{.    if( ExprH
24f00 61 73 50 72 6f 70 65 72 74 79 28 70 56 61 6c 75  asProperty(pValu
24f10 65 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 20  e, EP_FixedCol) 
24f20 29 20 70 56 61 6c 75 65 20 3d 20 70 56 61 6c 75  ) pValue = pValu
24f30 65 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 70 43  e->pLeft;.    pC
24f40 6f 6e 73 74 2d 3e 61 70 45 78 70 72 5b 70 43 6f  onst->apExpr[pCo
24f50 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2a 32 2d 32 5d  nst->nConst*2-2]
24f60 20 3d 20 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20   = pColumn;.    
24f70 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 5b 70  pConst->apExpr[p
24f80 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2a 32 2d  Const->nConst*2-
24f90 31 5d 20 3d 20 70 56 61 6c 75 65 3b 0a 20 20 7d  1] = pValue;.  }
24fa0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
24fb0 6c 6c 20 74 65 72 6d 73 20 6f 66 20 43 4f 4c 55  ll terms of COLU
24fc0 4d 4e 3d 56 41 4c 55 45 20 6f 72 20 56 41 4c 55  MN=VALUE or VALU
24fd0 45 3d 43 4f 4c 55 4d 4e 20 69 6e 20 70 45 78 70  E=COLUMN in pExp
24fe0 72 20 77 68 65 72 65 20 56 41 4c 55 45 0a 2a 2a  r where VALUE.**
24ff0 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 65   is a constant e
25000 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 77 68  xpression and wh
25010 65 72 65 20 74 68 65 20 74 65 72 6d 20 6d 75 73  ere the term mus
25020 74 20 62 65 20 74 72 75 65 20 62 65 63 61 75 73  t be true becaus
25030 65 20 69 74 0a 2a 2a 20 69 73 20 70 61 72 74 20  e it.** is part 
25040 6f 66 20 74 68 65 20 41 4e 44 2d 63 6f 6e 6e 65  of the AND-conne
25050 63 74 65 64 20 74 65 72 6d 73 20 6f 66 20 74 68  cted terms of th
25060 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 46  e expression.  F
25070 6f 72 20 65 61 63 68 20 74 65 72 6d 0a 2a 2a 20  or each term.** 
25080 66 6f 75 6e 64 2c 20 61 64 64 20 69 74 20 74 6f  found, add it to
25090 20 74 68 65 20 70 43 6f 6e 73 74 20 73 74 72 75   the pConst stru
250a0 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
250b0 20 76 6f 69 64 20 66 69 6e 64 43 6f 6e 73 74 49   void findConstI
250c0 6e 57 68 65 72 65 28 57 68 65 72 65 43 6f 6e 73  nWhere(WhereCons
250d0 74 20 2a 70 43 6f 6e 73 74 2c 20 45 78 70 72 20  t *pConst, Expr 
250e0 2a 70 45 78 70 72 29 7b 0a 20 20 45 78 70 72 20  *pExpr){.  Expr 
250f0 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b  *pRight, *pLeft;
25100 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
25110 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
25120 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
25130 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
25140 69 6e 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  in) ) return;.  
25150 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
25160 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 66 69 6e  K_AND ){.    fin
25170 64 43 6f 6e 73 74 49 6e 57 68 65 72 65 28 70 43  dConstInWhere(pC
25180 6f 6e 73 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  onst, pExpr->pRi
25190 67 68 74 29 3b 0a 20 20 20 20 66 69 6e 64 43 6f  ght);.    findCo
251a0 6e 73 74 49 6e 57 68 65 72 65 28 70 43 6f 6e 73  nstInWhere(pCons
251b0 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  t, pExpr->pLeft)
251c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
251d0 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  }.  if( pExpr->o
251e0 70 21 3d 54 4b 5f 45 51 20 29 20 72 65 74 75 72  p!=TK_EQ ) retur
251f0 6e 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 70 45  n;.  pRight = pE
25200 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 70  xpr->pRight;.  p
25210 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
25220 65 66 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  eft;.  assert( p
25230 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 61 73  Right!=0 );.  as
25240 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29  sert( pLeft!=0 )
25250 3b 0a 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e  ;.  if( pRight->
25260 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20  op==TK_COLUMN.  
25270 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
25280 65 72 74 79 28 70 52 69 67 68 74 2c 20 45 50 5f  erty(pRight, EP_
25290 46 69 78 65 64 43 6f 6c 29 0a 20 20 20 26 26 20  FixedCol).   && 
252a0 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
252b0 73 74 61 6e 74 28 70 4c 65 66 74 29 0a 20 20 20  stant(pLeft).   
252c0 26 26 20 73 71 6c 69 74 65 33 49 73 42 69 6e 61  && sqlite3IsBina
252d0 72 79 28 73 71 6c 69 74 65 33 42 69 6e 61 72 79  ry(sqlite3Binary
252e0 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
252f0 43 6f 6e 73 74 2d 3e 70 50 61 72 73 65 2c 70 4c  Const->pParse,pL
25300 65 66 74 2c 70 52 69 67 68 74 29 29 0a 20 20 29  eft,pRight)).  )
25310 7b 0a 20 20 20 20 63 6f 6e 73 74 49 6e 73 65 72  {.    constInser
25320 74 28 70 43 6f 6e 73 74 2c 20 70 52 69 67 68 74  t(pConst, pRight
25330 2c 20 70 4c 65 66 74 29 3b 0a 20 20 7d 65 6c 73  , pLeft);.  }els
25340 65 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f  e.  if( pLeft->o
25350 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20  p==TK_COLUMN.   
25360 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
25370 72 74 79 28 70 4c 65 66 74 2c 20 45 50 5f 46 69  rty(pLeft, EP_Fi
25380 78 65 64 43 6f 6c 29 0a 20 20 20 26 26 20 73 71  xedCol).   && sq
25390 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
253a0 61 6e 74 28 70 52 69 67 68 74 29 0a 20 20 20 26  ant(pRight).   &
253b0 26 20 73 71 6c 69 74 65 33 49 73 42 69 6e 61 72  & sqlite3IsBinar
253c0 79 28 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  y(sqlite3BinaryC
253d0 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 43  ompareCollSeq(pC
253e0 6f 6e 73 74 2d 3e 70 50 61 72 73 65 2c 70 4c 65  onst->pParse,pLe
253f0 66 74 2c 70 52 69 67 68 74 29 29 0a 20 20 29 7b  ft,pRight)).  ){
25400 0a 20 20 20 20 63 6f 6e 73 74 49 6e 73 65 72 74  .    constInsert
25410 28 70 43 6f 6e 73 74 2c 20 70 4c 65 66 74 2c 20  (pConst, pLeft, 
25420 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  pRight);.  }.}..
25430 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
25440 57 61 6c 6b 65 72 20 65 78 70 72 65 73 73 69 6f  Walker expressio
25450 6e 20 63 61 6c 6c 62 61 63 6b 2e 20 20 70 45 78  n callback.  pEx
25460 70 72 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  pr is a candidat
25470 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
25480 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20 62  to be replaced b
25490 79 20 61 20 76 61 6c 75 65 2e 20 20 49 66 20 70  y a value.  If p
254a0 45 78 70 72 20 69 73 20 65 71 75 69 76 61 6c 65  Expr is equivale
254b0 6e 74 20 74 6f 20 6f 6e 65 20 6f 66 20 74 68 65  nt to one of the
254c0 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65  .** columns name
254d0 64 20 69 6e 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  d in pWalker->u.
254e0 70 43 6f 6e 73 74 2c 20 74 68 65 6e 20 6f 76 65  pConst, then ove
254f0 72 77 72 69 74 65 20 69 74 20 77 69 74 68 20 69  rwrite it with i
25500 74 73 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  ts.** correspond
25510 69 6e 67 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  ing value..*/.st
25520 61 74 69 63 20 69 6e 74 20 70 72 6f 70 61 67 61  atic int propaga
25530 74 65 43 6f 6e 73 74 61 6e 74 45 78 70 72 52 65  teConstantExprRe
25540 77 72 69 74 65 28 57 61 6c 6b 65 72 20 2a 70 57  write(Walker *pW
25550 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
25560 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  pr){.  int i;.  
25570 57 68 65 72 65 43 6f 6e 73 74 20 2a 70 43 6f 6e  WhereConst *pCon
25580 73 74 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  st;.  if( pExpr-
25590 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
255a0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
255b0 69 6e 75 65 3b 0a 20 20 69 66 28 20 45 78 70 72  inue;.  if( Expr
255c0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
255d0 72 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 20  r, EP_FixedCol) 
255e0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
255f0 74 69 6e 75 65 3b 0a 20 20 70 43 6f 6e 73 74 20  tinue;.  pConst 
25600 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 43 6f  = pWalker->u.pCo
25610 6e 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  nst;.  for(i=0; 
25620 69 3c 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74  i<pConst->nConst
25630 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
25640 20 2a 70 43 6f 6c 75 6d 6e 20 3d 20 70 43 6f 6e   *pColumn = pCon
25650 73 74 2d 3e 61 70 45 78 70 72 5b 69 2a 32 5d 3b  st->apExpr[i*2];
25660 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e  .    if( pColumn
25670 3d 3d 70 45 78 70 72 20 29 20 63 6f 6e 74 69 6e  ==pExpr ) contin
25680 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  ue;.    if( pCol
25690 75 6d 6e 2d 3e 69 54 61 62 6c 65 21 3d 70 45 78  umn->iTable!=pEx
256a0 70 72 2d 3e 69 54 61 62 6c 65 20 29 20 63 6f 6e  pr->iTable ) con
256b0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
256c0 43 6f 6c 75 6d 6e 2d 3e 69 43 6f 6c 75 6d 6e 21  Column->iColumn!
256d0 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20  =pExpr->iColumn 
256e0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
256f0 2f 2a 20 41 20 6d 61 74 63 68 20 69 73 20 66 6f  /* A match is fo
25700 75 6e 64 2e 20 20 41 64 64 20 74 68 65 20 45 50  und.  Add the EP
25710 5f 46 69 78 65 64 43 6f 6c 20 70 72 6f 70 65 72  _FixedCol proper
25720 74 79 20 2a 2f 0a 20 20 20 20 70 43 6f 6e 73 74  ty */.    pConst
25730 2d 3e 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20 20 45  ->nChng++;.    E
25740 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79  xprClearProperty
25750 28 70 45 78 70 72 2c 20 45 50 5f 4c 65 61 66 29  (pExpr, EP_Leaf)
25760 3b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  ;.    ExprSetPro
25770 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
25780 46 69 78 65 64 43 6f 6c 29 3b 0a 20 20 20 20 61  FixedCol);.    a
25790 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
257a0 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 45  eft==0 );.    pE
257b0 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c  xpr->pLeft = sql
257c0 69 74 65 33 45 78 70 72 44 75 70 28 70 43 6f 6e  ite3ExprDup(pCon
257d0 73 74 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20  st->pParse->db, 
257e0 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 5b 69  pConst->apExpr[i
257f0 2a 32 2b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 62  *2+1], 0);.    b
25800 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
25810 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 7d 0a  rn WRC_Prune;.}.
25820 0a 2f 2a 0a 2a 2a 20 54 68 65 20 57 48 45 52 45  ./*.** The WHERE
25830 2d 63 6c 61 75 73 65 20 63 6f 6e 73 74 61 6e 74  -clause constant
25840 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6f 70 74   propagation opt
25850 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  imization..**.**
25860 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   If the WHERE cl
25870 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 74 65  ause contains te
25880 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rms of the form 
25890 43 4f 4c 55 4d 4e 3d 43 4f 4e 53 54 41 4e 54 20  COLUMN=CONSTANT 
258a0 6f 72 0a 2a 2a 20 43 4f 4e 53 54 41 4e 54 3d 43  or.** CONSTANT=C
258b0 4f 4c 55 4d 4e 20 74 68 61 74 20 6d 75 73 74 20  OLUMN that must 
258c0 62 65 20 74 72 65 65 20 28 69 6e 20 6f 74 68 65  be tree (in othe
258d0 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20  r words, if the 
258e0 74 65 72 6d 73 20 74 6f 70 2d 6c 65 76 65 6c 0a  terms top-level.
258f0 2a 2a 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64  ** AND-connected
25900 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 20   terms that are 
25910 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 4f 4e  not part of a ON
25920 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 61 20 4c   clause from a L
25930 45 46 54 20 4a 4f 49 4e 29 0a 2a 2a 20 74 68 65  EFT JOIN).** the
25940 6e 20 74 68 72 6f 75 67 68 6f 75 74 20 74 68 65  n throughout the
25950 20 71 75 65 72 79 20 72 65 70 6c 61 63 65 20 61   query replace a
25960 6c 6c 20 6f 74 68 65 72 20 6f 63 63 75 72 72 65  ll other occurre
25970 6e 63 65 73 20 6f 66 20 43 4f 4c 55 4d 4e 0a 2a  nces of COLUMN.*
25980 2a 20 77 69 74 68 20 43 4f 4e 53 54 41 4e 54 20  * with CONSTANT 
25990 77 69 74 68 69 6e 20 74 68 65 20 57 48 45 52 45  within the WHERE
259a0 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 46   clause..**.** F
259b0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20  or example, the 
259c0 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
259d0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
259e0 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45  t1, t2, t3 WHERE
259f0 20 74 31 2e 61 3d 33 39 20 41 4e 44 20 74 32 2e   t1.a=39 AND t2.
25a00 62 3d 74 31 2e 61 20 41 4e 44 20 74 33 2e 63 3d  b=t1.a AND t3.c=
25a10 74 32 2e 62 0a 2a 2a 0a 2a 2a 20 49 73 20 74 72  t2.b.**.** Is tr
25a20 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 0a 2a  ansformed into.*
25a30 2a 0a 2a 2a 20 20 20 20 20 20 53 45 4c 45 43 54  *.**      SELECT
25a40 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20   * FROM t1, t2, 
25a50 74 33 20 57 48 45 52 45 20 74 31 2e 61 3d 33 39  t3 WHERE t1.a=39
25a60 20 41 4e 44 20 74 32 2e 62 3d 33 39 20 41 4e 44   AND t2.b=39 AND
25a70 20 74 33 2e 63 3d 33 39 0a 2a 2a 0a 2a 2a 20 52   t3.c=39.**.** R
25a80 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e  eturn true if an
25a90 79 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  y transformation
25aa0 73 20 77 68 65 72 65 20 6d 61 64 65 20 61 6e 64  s where made and
25ab0 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a   false if not..*
25ac0 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
25ad0 69 6f 6e 20 6e 6f 74 65 3a 20 20 43 6f 6e 73 74  ion note:  Const
25ae0 61 6e 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  ant propagation 
25af0 69 73 20 74 72 69 63 6b 79 20 64 75 65 20 74 6f  is tricky due to
25b00 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 61 6e 64   affinity.** and
25b10 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
25b20 6e 63 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 73  nce interactions
25b30 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69 73  .  Consider this
25b40 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
25b50 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
25b60 74 31 28 61 20 49 4e 54 2c 62 20 54 45 58 54 29  t1(a INT,b TEXT)
25b70 3b 0a 2a 2a 20 20 20 20 49 4e 53 45 52 54 20 49  ;.**    INSERT I
25b80 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 32  NTO t1 VALUES(12
25b90 33 2c 27 30 31 32 33 27 29 3b 0a 2a 2a 20 20 20  3,'0123');.**   
25ba0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
25bb0 31 20 57 48 45 52 45 20 61 3d 31 32 33 20 41 4e  1 WHERE a=123 AN
25bc0 44 20 62 3d 61 3b 0a 2a 2a 20 20 20 20 53 45 4c  D b=a;.**    SEL
25bd0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
25be0 45 52 45 20 61 3d 31 32 33 20 41 4e 44 20 62 3d  ERE a=123 AND b=
25bf0 31 32 33 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  123;.**.** The t
25c00 77 6f 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  wo SELECT statem
25c10 65 6e 74 73 20 61 62 6f 76 65 20 73 68 6f 75 6c  ents above shoul
25c20 64 20 72 65 74 75 72 6e 20 64 69 66 66 65 72 65  d return differe
25c30 6e 74 20 61 6e 73 77 65 72 73 2e 20 20 62 3d 61  nt answers.  b=a
25c40 0a 2a 2a 20 69 73 20 61 6c 77 61 79 20 74 72 75  .** is alway tru
25c50 65 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f  e because the co
25c60 6d 70 61 72 69 73 6f 6e 20 75 73 65 73 20 6e 75  mparison uses nu
25c70 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 2c 20  meric affinity, 
25c80 62 75 74 20 62 3d 31 32 33 0a 2a 2a 20 69 73 20  but b=123.** is 
25c90 66 61 6c 73 65 20 62 65 63 61 75 73 65 20 69 74  false because it
25ca0 20 75 73 65 73 20 74 65 78 74 20 61 66 66 69 6e   uses text affin
25cb0 69 74 79 20 61 6e 64 20 27 30 31 32 33 27 20 69  ity and '0123' i
25cc0 73 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 61  s not the same a
25cd0 73 20 27 31 32 33 27 2e 0a 2a 2a 20 54 6f 20 77  s '123'..** To w
25ce0 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c  ork around this,
25cf0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
25d00 74 72 65 65 20 69 73 20 6e 6f 74 20 61 63 74 75  tree is not actu
25d10 61 6c 6c 79 20 63 68 61 6e 67 65 64 20 66 72 6f  ally changed fro
25d20 6d 0a 2a 2a 20 22 62 3d 61 22 20 74 6f 20 22 62  m.** "b=a" to "b
25d30 3d 31 32 33 22 20 62 75 74 20 72 61 74 68 65 72  =123" but rather
25d40 20 74 68 65 20 22 61 22 20 69 6e 20 22 62 3d 61   the "a" in "b=a
25d50 22 20 69 73 20 74 61 67 67 65 64 20 77 69 74 68  " is tagged with
25d60 20 45 50 5f 46 69 78 65 64 43 6f 6c 0a 2a 2a 20   EP_FixedCol.** 
25d70 61 6e 64 20 74 68 65 20 22 31 32 33 22 20 76 61  and the "123" va
25d80 6c 75 65 20 69 73 20 68 75 6e 67 20 6f 66 66 20  lue is hung off 
25d90 6f 66 20 74 68 65 20 70 4c 65 66 74 20 70 6f 69  of the pLeft poi
25da0 6e 74 65 72 2e 20 20 43 6f 64 65 20 67 65 6e 65  nter.  Code gene
25db0 72 61 74 6f 72 0a 2a 2a 20 72 6f 75 74 69 6e 65  rator.** routine
25dc0 73 20 6b 6e 6f 77 20 74 6f 20 67 65 6e 65 72 61  s know to genera
25dd0 74 65 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20  te the constant 
25de0 22 31 32 33 22 20 69 6e 73 74 65 61 64 20 6f 66  "123" instead of
25df0 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 0a   looking up the.
25e00 2a 2a 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2e  ** column value.
25e10 20 20 41 6c 73 6f 2c 20 74 6f 20 61 76 6f 69 64    Also, to avoid
25e20 20 63 6f 6c 6c 61 74 69 6f 6e 20 70 72 6f 62 6c   collation probl
25e30 65 6d 73 2c 20 74 68 69 73 20 6f 70 74 69 6d 69  ems, this optimi
25e40 7a 61 74 69 6f 6e 20 69 73 0a 2a 2a 20 6f 6e 6c  zation is.** onl
25e50 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20 74  y attempted if t
25e60 68 65 20 22 61 3d 31 32 33 22 20 74 65 72 6d 20  he "a=123" term 
25e70 75 73 65 73 20 74 68 65 20 64 65 66 61 75 6c 74  uses the default
25e80 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f   BINARY collatio
25e90 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
25ea0 20 70 72 6f 70 61 67 61 74 65 43 6f 6e 73 74 61   propagateConsta
25eb0 6e 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nts(.  Parse *pP
25ec0 61 72 73 65 2c 20 20 20 2f 2a 20 54 68 65 20 70  arse,   /* The p
25ed0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
25ee0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 20 20 20  /.  Select *p   
25ef0 20 20 20 20 20 2f 2a 20 54 68 65 20 71 75 65 72       /* The quer
25f00 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70 72  y in which to pr
25f10 6f 70 61 67 61 74 65 20 63 6f 6e 73 74 61 6e 74  opagate constant
25f20 73 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 43  s */.){.  WhereC
25f30 6f 6e 73 74 20 78 3b 0a 20 20 57 61 6c 6b 65 72  onst x;.  Walker
25f40 20 77 3b 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20   w;.  int nChng 
25f50 3d 20 30 3b 0a 20 20 78 2e 70 50 61 72 73 65 20  = 0;.  x.pParse 
25f60 3d 20 70 50 61 72 73 65 3b 0a 20 20 64 6f 7b 0a  = pParse;.  do{.
25f70 20 20 20 20 78 2e 6e 43 6f 6e 73 74 20 3d 20 30      x.nConst = 0
25f80 3b 0a 20 20 20 20 78 2e 6e 43 68 6e 67 20 3d 20  ;.    x.nChng = 
25f90 30 3b 0a 20 20 20 20 78 2e 61 70 45 78 70 72 20  0;.    x.apExpr 
25fa0 3d 20 30 3b 0a 20 20 20 20 66 69 6e 64 43 6f 6e  = 0;.    findCon
25fb0 73 74 49 6e 57 68 65 72 65 28 26 78 2c 20 70 2d  stInWhere(&x, p-
25fc0 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 69 66  >pWhere);.    if
25fd0 28 20 78 2e 6e 43 6f 6e 73 74 20 29 7b 0a 20 20  ( x.nConst ){.  
25fe0 20 20 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30      memset(&w, 0
25ff0 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
26000 20 20 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70      w.pParse = p
26010 50 61 72 73 65 3b 0a 20 20 20 20 20 20 77 2e 78  Parse;.      w.x
26020 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 70  ExprCallback = p
26030 72 6f 70 61 67 61 74 65 43 6f 6e 73 74 61 6e 74  ropagateConstant
26040 45 78 70 72 52 65 77 72 69 74 65 3b 0a 20 20 20  ExprRewrite;.   
26050 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c     w.xSelectCall
26060 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65  back = sqlite3Se
26070 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  lectWalkNoop;.  
26080 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c      w.xSelectCal
26090 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20  lback2 = 0;.    
260a0 20 20 77 2e 77 61 6c 6b 65 72 44 65 70 74 68 20    w.walkerDepth 
260b0 3d 20 30 3b 0a 20 20 20 20 20 20 77 2e 75 2e 70  = 0;.      w.u.p
260c0 43 6f 6e 73 74 20 3d 20 26 78 3b 0a 20 20 20 20  Const = &x;.    
260d0 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
260e0 72 28 26 77 2c 20 70 2d 3e 70 57 68 65 72 65 29  r(&w, p->pWhere)
260f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
26100 62 46 72 65 65 28 78 2e 70 50 61 72 73 65 2d 3e  bFree(x.pParse->
26110 64 62 2c 20 78 2e 61 70 45 78 70 72 29 3b 0a 20  db, x.apExpr);. 
26120 20 20 20 20 20 6e 43 68 6e 67 20 2b 3d 20 78 2e       nChng += x.
26130 6e 43 68 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 7d  nChng;.    }.  }
26140 77 68 69 6c 65 28 20 78 2e 6e 43 68 6e 67 20 29  while( x.nChng )
26150 3b 20 20 0a 20 20 72 65 74 75 72 6e 20 6e 43 68  ;  .  return nCh
26160 6e 67 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  ng;.}..#if !defi
26170 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
26180 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
26190 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
261a0 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 4d 61  T_VIEW)./*.** Ma
261b0 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 72 65 6c  ke copies of rel
261c0 65 76 61 6e 74 20 57 48 45 52 45 20 63 6c 61 75  evant WHERE clau
261d0 73 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  se terms of the 
261e0 6f 75 74 65 72 20 71 75 65 72 79 20 69 6e 74 6f  outer query into
261f0 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c  .** the WHERE cl
26200 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79  ause of subquery
26210 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  .  Example:.**.*
26220 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
26230 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53 20  OM (SELECT a AS 
26240 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f 4d  x, c-d AS y FROM
26250 20 74 31 29 20 57 48 45 52 45 20 78 3d 35 20 41   t1) WHERE x=5 A
26260 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54  ND y=10;.**.** T
26270 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a  ransformed into:
26280 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
26290 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   * FROM (SELECT 
262a0 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20 79  a AS x, c-d AS y
262b0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
262c0 3d 35 20 41 4e 44 20 63 2d 64 3d 31 30 29 0a 2a  =5 AND c-d=10).*
262d0 2a 20 20 20 20 20 57 48 45 52 45 20 78 3d 35 20  *     WHERE x=5 
262e0 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20  AND y=10;.**.** 
262f0 54 68 65 20 68 6f 70 65 20 69 73 20 74 68 61 74  The hope is that
26300 20 74 68 65 20 74 65 72 6d 73 20 61 64 64 65 64   the terms added
26310 20 74 6f 20 74 68 65 20 69 6e 6e 65 72 20 71 75   to the inner qu
26320 65 72 79 20 77 69 6c 6c 20 6d 61 6b 65 20 69 74  ery will make it
26330 20 6d 6f 72 65 0a 2a 2a 20 65 66 66 69 63 69 65   more.** efficie
26340 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74  nt..**.** Do not
26350 20 61 74 74 65 6d 70 74 20 74 68 69 73 20 6f 70   attempt this op
26360 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 3a 0a 2a  timization if:.*
26370 2a 0a 2a 2a 20 20 20 28 31 29 20 28 2a 2a 20 54  *.**   (1) (** T
26380 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20  his restriction 
26390 77 61 73 20 72 65 6d 6f 76 65 64 20 6f 6e 20 32  was removed on 2
263a0 30 31 37 2d 30 39 2d 32 39 2e 20 20 57 65 20 75  017-09-29.  We u
263b0 73 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  sed to.**       
263c0 20 20 20 20 64 69 73 61 6c 6c 6f 77 20 74 68 69      disallow thi
263d0 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66  s optimization f
263e0 6f 72 20 61 67 67 72 65 67 61 74 65 20 73 75 62  or aggregate sub
263f0 71 75 65 72 69 65 73 2c 20 62 75 74 20 6e 6f 77  queries, but now
26400 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 69 74  .**           it
26410 20 69 73 20 61 6c 6c 6f 77 65 64 20 62 79 20 70   is allowed by p
26420 75 74 74 69 6e 67 20 74 68 65 20 65 78 74 72 61  utting the extra
26430 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 48 41   terms on the HA
26440 56 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 20  VING clause..** 
26450 20 20 20 20 20 20 20 20 20 20 54 68 65 20 61 64            The ad
26460 64 65 64 20 48 41 56 49 4e 47 20 63 6c 61 75 73  ded HAVING claus
26470 65 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 20 69  e is pointless i
26480 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 6c  f the subquery l
26490 61 63 6b 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  acks.**         
264a0 20 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61    a GROUP BY cla
264b0 75 73 65 2e 20 20 42 75 74 20 73 75 63 68 20 61  use.  But such a
264c0 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 69   HAVING clause i
264d0 73 20 61 6c 73 6f 20 68 61 72 6d 6c 65 73 73 0a  s also harmless.
264e0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 73 6f 20  **           so 
264f0 74 68 65 72 65 20 64 6f 65 73 20 6e 6f 74 20 61  there does not a
26500 70 70 65 61 72 20 74 6f 20 62 65 20 61 6e 79 20  ppear to be any 
26510 72 65 61 73 6f 6e 20 74 6f 20 61 64 64 20 65 78  reason to add ex
26520 74 72 61 20 6c 6f 67 69 63 0a 2a 2a 20 20 20 20  tra logic.**    
26530 20 20 20 20 20 20 20 74 6f 20 73 75 70 70 72 65         to suppre
26540 73 73 20 69 74 2e 20 2a 2a 29 0a 2a 2a 0a 2a 2a  ss it. **).**.**
26550 20 20 20 28 32 29 20 54 68 65 20 69 6e 6e 65 72     (2) The inner
26560 20 71 75 65 72 79 20 69 73 20 74 68 65 20 72 65   query is the re
26570 63 75 72 73 69 76 65 20 70 61 72 74 20 6f 66 20  cursive part of 
26580 61 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65  a common table e
26590 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
265a0 20 20 20 28 33 29 20 54 68 65 20 69 6e 6e 65 72     (3) The inner
265b0 20 71 75 65 72 79 20 68 61 73 20 61 20 4c 49 4d   query has a LIM
265c0 49 54 20 63 6c 61 75 73 65 20 28 73 69 6e 63 65  IT clause (since
265d0 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20   the changes to 
265e0 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 20 20 20  the WHERE.**    
265f0 20 20 20 63 6c 61 75 73 65 20 77 6f 75 6c 64 20     clause would 
26600 63 68 61 6e 67 65 20 74 68 65 20 6d 65 61 6e 69  change the meani
26610 6e 67 20 6f 66 20 74 68 65 20 4c 49 4d 49 54 29  ng of the LIMIT)
26620 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 54 68  ..**.**   (4) Th
26630 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73  e inner query is
26640 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
26650 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  nd of a LEFT JOI
26660 4e 20 61 6e 64 20 74 68 65 0a 2a 2a 20 20 20 20  N and the.**    
26670 20 20 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f     expression to
26680 20 62 65 20 70 75 73 68 65 64 20 64 6f 77 6e 20   be pushed down 
26690 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 66 72  does not come fr
266a0 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  om the ON clause
266b0 0a 2a 2a 20 20 20 20 20 20 20 6f 6e 20 74 68 61  .**       on tha
266c0 74 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 2a 2a 0a  t LEFT JOIN..**.
266d0 2a 2a 20 20 20 28 35 29 20 54 68 65 20 57 48 45  **   (5) The WHE
266e0 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73  RE clause expres
266f0 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 73 20  sion originates 
26700 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
26710 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20  NG clause.**    
26720 20 20 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49     of a LEFT JOI
26730 4e 20 77 68 65 72 65 20 69 43 75 72 73 6f 72 20  N where iCursor 
26740 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  is not the right
26750 2d 68 61 6e 64 20 74 61 62 6c 65 20 6f 66 20 74  -hand table of t
26760 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 6c 65 66  hat.**       lef
26770 74 20 6a 6f 69 6e 2e 20 20 41 6e 20 65 78 61 6d  t join.  An exam
26780 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ple:.**.**      
26790 20 20 20 20 20 53 45 4c 45 43 54 20 2a 0a 2a 2a       SELECT *.**
267a0 20 20 20 20 20 20 20 20 20 20 20 46 52 4f 4d 20             FROM 
267b0 28 53 45 4c 45 43 54 20 31 20 41 53 20 61 31 20  (SELECT 1 AS a1 
267c0 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
267d0 20 32 29 20 41 53 20 61 61 0a 2a 2a 20 20 20 20   2) AS aa.**    
267e0 20 20 20 20 20 20 20 4a 4f 49 4e 20 28 53 45 4c         JOIN (SEL
267f0 45 43 54 20 31 20 41 53 20 62 32 20 55 4e 49 4f  ECT 1 AS b2 UNIO
26800 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 32 29 20  N ALL SELECT 2) 
26810 41 53 20 62 62 20 4f 4e 20 28 61 31 3d 62 32 29  AS bb ON (a1=b2)
26820 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4c 45  .**           LE
26830 46 54 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20  FT JOIN (SELECT 
26840 38 20 41 53 20 63 33 20 55 4e 49 4f 4e 20 41 4c  8 AS c3 UNION AL
26850 4c 20 53 45 4c 45 43 54 20 39 29 20 41 53 20 63  L SELECT 9) AS c
26860 63 20 4f 4e 20 28 62 32 3d 32 29 3b 0a 2a 2a 0a  c ON (b2=2);.**.
26870 2a 2a 20 20 20 20 20 20 20 54 68 65 20 63 6f 72  **       The cor
26880 72 65 63 74 20 61 6e 73 77 65 72 20 69 73 20 74  rect answer is t
26890 68 72 65 65 20 72 6f 77 73 3a 20 20 28 31 2c 31  hree rows:  (1,1
268a0 2c 4e 55 4c 4c 29 2c 28 32 2c 32 2c 38 29 2c 28  ,NULL),(2,2,8),(
268b0 32 2c 32 2c 39 29 2e 0a 2a 2a 20 20 20 20 20 20  2,2,9)..**      
268c0 20 42 75 74 20 69 66 20 74 68 65 20 28 62 32 3d   But if the (b2=
268d0 32 29 20 74 65 72 6d 20 77 65 72 65 20 74 6f 20  2) term were to 
268e0 62 65 20 70 75 73 68 65 64 20 64 6f 77 6e 20 69  be pushed down i
268f0 6e 74 6f 20 74 68 65 20 62 62 20 73 75 62 71 75  nto the bb subqu
26900 65 72 79 2c 0a 2a 2a 20 20 20 20 20 20 20 74 68  ery,.**       th
26910 65 6e 20 74 68 65 20 28 31 2c 31 2c 4e 55 4c 4c  en the (1,1,NULL
26920 29 20 72 6f 77 20 77 6f 75 6c 64 20 62 65 20 73  ) row would be s
26930 75 70 70 72 65 73 73 65 64 2e 0a 2a 2a 0a 2a 2a  uppressed..**.**
26940 20 20 20 28 36 29 20 54 68 65 20 69 6e 6e 65 72     (6) The inner
26950 20 71 75 65 72 79 20 66 65 61 74 75 72 65 73 20   query features 
26960 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 77 69 6e 64  one or more wind
26970 6f 77 2d 66 75 6e 63 74 69 6f 6e 73 20 28 73 69  ow-functions (si
26980 6e 63 65 20 0a 2a 2a 20 20 20 20 20 20 20 63 68  nce .**       ch
26990 61 6e 67 65 73 20 74 6f 20 74 68 65 20 57 48 45  anges to the WHE
269a0 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  RE clause of the
269b0 20 69 6e 6e 65 72 20 71 75 65 72 79 20 63 6f 75   inner query cou
269c0 6c 64 20 63 68 61 6e 67 65 20 74 68 65 20 0a 2a  ld change the .*
269d0 2a 20 20 20 20 20 20 20 77 69 6e 64 6f 77 20 6f  *       window o
269e0 76 65 72 20 77 68 69 63 68 20 77 69 6e 64 6f 77  ver which window
269f0 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 63   functions are c
26a00 61 6c 63 75 6c 61 74 65 64 29 2e 0a 2a 2a 0a 2a  alculated)..**.*
26a10 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f  * Return 0 if no
26a20 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
26a30 65 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69  e and non-zero i
26a40 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48  f one or more WH
26a50 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 74 65  ERE clause.** te
26a60 72 6d 73 20 61 72 65 20 64 75 70 6c 69 63 61 74  rms are duplicat
26a70 65 64 20 69 6e 74 6f 20 74 68 65 20 73 75 62 71  ed into the subq
26a80 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uery..*/.static 
26a90 69 6e 74 20 70 75 73 68 44 6f 77 6e 57 68 65 72  int pushDownWher
26aa0 65 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65 20  eTerms(.  Parse 
26ab0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
26ac0 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
26ad0 20 28 66 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 61   (for malloc() a
26ae0 6e 64 20 65 72 72 6f 72 20 72 65 70 6f 72 74 69  nd error reporti
26af0 6e 67 29 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ng) */.  Select 
26b00 2a 70 53 75 62 71 2c 20 20 20 20 20 20 20 20 2f  *pSubq,        /
26b10 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 77  * The subquery w
26b20 68 6f 73 65 20 57 48 45 52 45 20 63 6c 61 75 73  hose WHERE claus
26b30 65 20 69 73 20 74 6f 20 62 65 20 61 75 67 6d 65  e is to be augme
26b40 6e 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nted */.  Expr *
26b50 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20  pWhere,         
26b60 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
26b70 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
26b80 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
26b90 69 43 75 72 73 6f 72 2c 20 20 20 20 20 20 20 20  iCursor,        
26ba0 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
26bb0 65 72 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  er of the subque
26bc0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c 65  ry */.  int isLe
26bd0 66 74 4a 6f 69 6e 20 20 20 20 20 20 20 20 2f 2a  ftJoin        /*
26be0 20 54 72 75 65 20 69 66 20 70 53 75 62 71 20 69   True if pSubq i
26bf0 73 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d  s the right term
26c00 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
26c10 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  */.){.  Expr *pN
26c20 65 77 3b 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20  ew;.  int nChng 
26c30 3d 20 30 3b 0a 20 20 69 66 28 20 70 57 68 65 72  = 0;.  if( pWher
26c40 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
26c50 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e 73 65  .  if( pSubq->se
26c60 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
26c70 72 73 69 76 65 20 29 20 72 65 74 75 72 6e 20 30  rsive ) return 0
26c80 3b 20 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f  ;  /* restrictio
26c90 6e 20 28 32 29 20 2a 2f 0a 0a 23 69 66 6e 64 65  n (2) */..#ifnde
26ca0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
26cb0 4e 44 4f 57 46 55 4e 43 0a 20 20 69 66 28 20 70  NDOWFUNC.  if( p
26cc0 53 75 62 71 2d 3e 70 57 69 6e 20 29 20 72 65 74  Subq->pWin ) ret
26cd0 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 72 65 73  urn 0;    /* res
26ce0 74 72 69 63 74 69 6f 6e 20 28 36 29 20 2a 2f 0a  triction (6) */.
26cf0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
26d00 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
26d10 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20   Only the first 
26d20 74 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70 6f 75  term of a compou
26d30 6e 64 20 63 61 6e 20 68 61 76 65 20 61 20 57 49  nd can have a WI
26d40 54 48 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20  TH clause.  But 
26d50 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 6e  make.  ** sure n
26d60 6f 20 6f 74 68 65 72 20 74 65 72 6d 73 20 61 72  o other terms ar
26d70 65 20 6d 61 72 6b 65 64 20 53 46 5f 52 65 63 75  e marked SF_Recu
26d80 72 73 69 76 65 20 69 6e 20 63 61 73 65 20 73 6f  rsive in case so
26d90 6d 65 74 68 69 6e 67 20 63 68 61 6e 67 65 73 0a  mething changes.
26da0 20 20 2a 2a 20 69 6e 20 74 68 65 20 66 75 74 75    ** in the futu
26db0 72 65 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20  re..  */.  {.   
26dc0 20 53 65 6c 65 63 74 20 2a 70 58 3b 20 20 0a 20   Select *pX;  . 
26dd0 20 20 20 66 6f 72 28 70 58 3d 70 53 75 62 71 3b     for(pX=pSubq;
26de0 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69   pX; pX=pX->pPri
26df0 6f 72 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  or){.      asser
26e00 74 28 20 28 70 58 2d 3e 73 65 6c 46 6c 61 67 73  t( (pX->selFlags
26e10 20 26 20 28 53 46 5f 52 65 63 75 72 73 69 76 65   & (SF_Recursive
26e20 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  ))==0 );.    }. 
26e30 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
26e40 20 70 53 75 62 71 2d 3e 70 4c 69 6d 69 74 21 3d   pSubq->pLimit!=
26e50 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
26e60 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f  0; /* restrictio
26e70 6e 20 28 33 29 20 2a 2f 0a 20 20 7d 0a 20 20 77  n (3) */.  }.  w
26e80 68 69 6c 65 28 20 70 57 68 65 72 65 2d 3e 6f 70  hile( pWhere->op
26e90 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20  ==TK_AND ){.    
26ea0 6e 43 68 6e 67 20 2b 3d 20 70 75 73 68 44 6f 77  nChng += pushDow
26eb0 6e 57 68 65 72 65 54 65 72 6d 73 28 70 50 61 72  nWhereTerms(pPar
26ec0 73 65 2c 20 70 53 75 62 71 2c 20 70 57 68 65 72  se, pSubq, pWher
26ed0 65 2d 3e 70 52 69 67 68 74 2c 0a 20 20 20 20 20  e->pRight,.     
26ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ef0 20 20 20 20 20 20 20 20 20 20 20 69 43 75 72 73             iCurs
26f00 6f 72 2c 20 69 73 4c 65 66 74 4a 6f 69 6e 29 3b  or, isLeftJoin);
26f10 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 57  .    pWhere = pW
26f20 68 65 72 65 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d  here->pLeft;.  }
26f30 0a 20 20 69 66 28 20 69 73 4c 65 66 74 4a 6f 69  .  if( isLeftJoi
26f40 6e 0a 20 20 20 26 26 20 28 45 78 70 72 48 61 73  n.   && (ExprHas
26f50 50 72 6f 70 65 72 74 79 28 70 57 68 65 72 65 2c  Property(pWhere,
26f60 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3d 3d 30 0a  EP_FromJoin)==0.
26f70 20 20 20 20 20 20 20 20 20 7c 7c 20 70 57 68 65           || pWhe
26f80 72 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  re->iRightJoinTa
26f90 62 6c 65 21 3d 69 43 75 72 73 6f 72 29 0a 20 20  ble!=iCursor).  
26fa0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
26fb0 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20   /* restriction 
26fc0 28 34 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  (4) */.  }.  if(
26fd0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
26fe0 28 70 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a  (pWhere,EP_FromJ
26ff0 6f 69 6e 29 20 26 26 20 70 57 68 65 72 65 2d 3e  oin) && pWhere->
27000 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21  iRightJoinTable!
27010 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  =iCursor ){.    
27020 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73  return 0; /* res
27030 74 72 69 63 74 69 6f 6e 20 28 35 29 20 2a 2f 0a  triction (5) */.
27040 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
27050 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73  3ExprIsTableCons
27060 74 61 6e 74 28 70 57 68 65 72 65 2c 20 69 43 75  tant(pWhere, iCu
27070 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 6e 43 68  rsor) ){.    nCh
27080 6e 67 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28  ng++;.    while(
27090 20 70 53 75 62 71 20 29 7b 0a 20 20 20 20 20 20   pSubq ){.      
270a0 53 75 62 73 74 43 6f 6e 74 65 78 74 20 78 3b 0a  SubstContext x;.
270b0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
270c0 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72  ite3ExprDup(pPar
270d0 73 65 2d 3e 64 62 2c 20 70 57 68 65 72 65 2c 20  se->db, pWhere, 
270e0 30 29 3b 0a 20 20 20 20 20 20 75 6e 73 65 74 4a  0);.      unsetJ
270f0 6f 69 6e 45 78 70 72 28 70 4e 65 77 2c 20 2d 31  oinExpr(pNew, -1
27100 29 3b 0a 20 20 20 20 20 20 78 2e 70 50 61 72 73  );.      x.pPars
27110 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20  e = pParse;.    
27120 20 20 78 2e 69 54 61 62 6c 65 20 3d 20 69 43 75    x.iTable = iCu
27130 72 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e 69 4e  rsor;.      x.iN
27140 65 77 54 61 62 6c 65 20 3d 20 69 43 75 72 73 6f  ewTable = iCurso
27150 72 3b 0a 20 20 20 20 20 20 78 2e 69 73 4c 65 66  r;.      x.isLef
27160 74 4a 6f 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20  tJoin = 0;.     
27170 20 78 2e 70 45 4c 69 73 74 20 3d 20 70 53 75 62   x.pEList = pSub
27180 71 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20  q->pEList;.     
27190 20 70 4e 65 77 20 3d 20 73 75 62 73 74 45 78 70   pNew = substExp
271a0 72 28 26 78 2c 20 70 4e 65 77 29 3b 0a 20 20 20  r(&x, pNew);.   
271b0 20 20 20 69 66 28 20 70 53 75 62 71 2d 3e 73 65     if( pSubq->se
271c0 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
271d0 65 67 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  egate ){.       
271e0 20 70 53 75 62 71 2d 3e 70 48 61 76 69 6e 67 20   pSubq->pHaving 
271f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
27200 28 70 50 61 72 73 65 2c 20 70 53 75 62 71 2d 3e  (pParse, pSubq->
27210 70 48 61 76 69 6e 67 2c 20 70 4e 65 77 29 3b 0a  pHaving, pNew);.
27220 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27230 20 20 20 20 20 70 53 75 62 71 2d 3e 70 57 68 65       pSubq->pWhe
27240 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
27250 41 6e 64 28 70 50 61 72 73 65 2c 20 70 53 75 62  And(pParse, pSub
27260 71 2d 3e 70 57 68 65 72 65 2c 20 70 4e 65 77 29  q->pWhere, pNew)
27270 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27280 70 53 75 62 71 20 3d 20 70 53 75 62 71 2d 3e 70  pSubq = pSubq->p
27290 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Prior;.    }.  }
272a0 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 6e 67 3b  .  return nChng;
272b0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
272c0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
272d0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
272e0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
272f0 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a  MIT_VIEW) */../*
27300 0a 2a 2a 20 54 68 65 20 70 46 75 6e 63 20 69 73  .** The pFunc is
27310 20 74 68 65 20 6f 6e 6c 79 20 61 67 67 72 65 67   the only aggreg
27320 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20  ate function in 
27330 74 68 65 20 71 75 65 72 79 2e 20 20 43 68 65 63  the query.  Chec
27340 6b 20 74 6f 20 73 65 65 0a 2a 2a 20 69 66 20 74  k to see.** if t
27350 68 65 20 71 75 65 72 79 20 69 73 20 61 20 63 61  he query is a ca
27360 6e 64 69 64 61 74 65 20 66 6f 72 20 74 68 65 20  ndidate for the 
27370 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a 61  min/max optimiza
27380 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  tion. .**.** If 
27390 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20 63  the query is a c
273a0 61 6e 64 69 64 61 74 65 20 66 6f 72 20 74 68 65  andidate for the
273b0 20 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a   min/max optimiz
273c0 61 74 69 6f 6e 2c 20 74 68 65 6e 20 73 65 74 0a  ation, then set.
273d0 2a 2a 20 2a 70 70 4d 69 6e 4d 61 78 20 74 6f 20  ** *ppMinMax to 
273e0 62 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  be an ORDER BY c
273f0 6c 61 75 73 65 20 74 6f 20 62 65 20 75 73 65 64  lause to be used
27400 20 66 6f 72 20 74 68 65 20 6f 70 74 69 6d 69 7a   for the optimiz
27410 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72 65 74  ation.** and ret
27420 75 72 6e 20 65 69 74 68 65 72 20 57 48 45 52 45  urn either WHERE
27430 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20  _ORDERBY_MIN or 
27440 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
27450 58 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 0a 2a  X depending on.*
27460 2a 20 77 68 65 74 68 65 72 20 70 46 75 6e 63 20  * whether pFunc 
27470 69 73 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61  is a min() or ma
27480 78 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  x() function..**
27490 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79  .** If the query
274a0 20 69 73 20 6e 6f 74 20 61 20 63 61 6e 64 69 64   is not a candid
274b0 61 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f  ate for the min/
274c0 6d 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  max optimization
274d0 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 57 48 45 52  , return.** WHER
274e0 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
274f0 20 28 77 68 69 63 68 20 6d 75 73 74 20 62 65 20   (which must be 
27500 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  zero)..**.** Thi
27510 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
27520 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61  e called after a
27530 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
27540 6e 73 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  ns have been.** 
27550 6c 6f 63 61 74 65 64 20 62 75 74 20 62 65 66 6f  located but befo
27560 72 65 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e  re their argumen
27570 74 73 20 68 61 76 65 20 62 65 65 6e 20 73 75 62  ts have been sub
27580 6a 65 63 74 65 64 20 74 6f 20 61 67 67 72 65 67  jected to aggreg
27590 61 74 65 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2e  ate.** analysis.
275a0 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 6d 69  .*/.static u8 mi
275b0 6e 4d 61 78 51 75 65 72 79 28 73 71 6c 69 74 65  nMaxQuery(sqlite
275c0 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 46 75  3 *db, Expr *pFu
275d0 6e 63 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a 70  nc, ExprList **p
275e0 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20  pMinMax){.  int 
275f0 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44  eRet = WHERE_ORD
27600 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20  ERBY_NORMAL;    
27610 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
27620 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
27630 2a 70 45 4c 69 73 74 20 3d 20 70 46 75 6e 63 2d  *pEList = pFunc-
27640 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20  >x.pList;    /* 
27650 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 67 67  Arguments to agg
27660 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 63   function */.  c
27670 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
27680 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27690 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
276a0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
276b0 6f 6e 20 70 46 75 6e 63 20 2a 2f 0a 20 20 45 78  on pFunc */.  Ex
276c0 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
276d0 3b 0a 20 20 75 38 20 73 6f 72 74 46 6c 61 67 73  ;.  u8 sortFlags
276e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 70  ;..  assert( *pp
276f0 4d 69 6e 4d 61 78 3d 3d 30 20 29 3b 0a 20 20 61  MinMax==0 );.  a
27700 73 73 65 72 74 28 20 70 46 75 6e 63 2d 3e 6f 70  ssert( pFunc->op
27710 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  ==TK_AGG_FUNCTIO
27720 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  N );.  assert( !
27730 49 73 57 69 6e 64 6f 77 46 75 6e 63 28 70 46 75  IsWindowFunc(pFu
27740 6e 63 29 20 29 3b 0a 20 20 69 66 28 20 70 45 4c  nc) );.  if( pEL
27750 69 73 74 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74  ist==0 || pEList
27760 2d 3e 6e 45 78 70 72 21 3d 31 20 7c 7c 20 45 78  ->nExpr!=1 || Ex
27770 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46  prHasProperty(pF
27780 75 6e 63 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29  unc, EP_WinFunc)
27790 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 65   ){.    return e
277a0 52 65 74 3b 0a 20 20 7d 0a 20 20 7a 46 75 6e 63  Ret;.  }.  zFunc
277b0 20 3d 20 70 46 75 6e 63 2d 3e 75 2e 7a 54 6f 6b   = pFunc->u.zTok
277c0 65 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  en;.  if( sqlite
277d0 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20  3StrICmp(zFunc, 
277e0 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "min")==0 ){.   
277f0 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52   eRet = WHERE_OR
27800 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 73  DERBY_MIN;.    s
27810 6f 72 74 46 6c 61 67 73 20 3d 20 4b 45 59 49 4e  ortFlags = KEYIN
27820 46 4f 5f 4f 52 44 45 52 5f 42 49 47 4e 55 4c 4c  FO_ORDER_BIGNULL
27830 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71  ;.  }else if( sq
27840 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75  lite3StrICmp(zFu
27850 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29 7b  nc, "max")==0 ){
27860 0a 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52  .    eRet = WHER
27870 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20  E_ORDERBY_MAX;. 
27880 20 20 20 73 6f 72 74 46 6c 61 67 73 20 3d 20 4b     sortFlags = K
27890 45 59 49 4e 46 4f 5f 4f 52 44 45 52 5f 44 45 53  EYINFO_ORDER_DES
278a0 43 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  C;.  }else{.    
278b0 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 20 20 7d  return eRet;.  }
278c0 0a 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70  .  *ppMinMax = p
278d0 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
278e0 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
278f0 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 61   pEList, 0);.  a
27900 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21  ssert( pOrderBy!
27910 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
27920 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
27930 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64 65  pOrderBy ) pOrde
27940 72 42 79 2d 3e 61 5b 30 5d 2e 73 6f 72 74 46 6c  rBy->a[0].sortFl
27950 61 67 73 20 3d 20 73 6f 72 74 46 6c 61 67 73 3b  ags = sortFlags;
27960 0a 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a  .  return eRet;.
27970 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c  }../*.** The sel
27980 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ect statement pa
27990 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
279a0 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e  t argument is an
279b0 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
279c0 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  ..** The second 
279d0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
279e0 61 73 73 6f 63 69 61 74 65 64 20 61 67 67 72 65  associated aggre
279f0 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74  gate-info object
27a00 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
27a10 69 6f 6e 20 74 65 73 74 73 20 69 66 20 74 68 65  ion tests if the
27a20 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68   SELECT is of th
27a30 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
27a40 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
27a50 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a  FROM <tbl>.**.**
27a60 20 77 68 65 72 65 20 74 61 62 6c 65 20 69 73 20   where table is 
27a70 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  a database table
27a80 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c 65  , not a sub-sele
27a90 63 74 20 6f 72 20 76 69 65 77 2e 20 49 66 20 74  ct or view. If t
27aa0 68 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73  he query.** does
27ab0 20 6d 61 74 63 68 20 74 68 69 73 20 70 61 74 74   match this patt
27ac0 65 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e  ern, then a poin
27ad0 74 65 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65  ter to the Table
27ae0 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e   object represen
27af0 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73  ting.** <tbl> is
27b00 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
27b10 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72  wise, 0 is retur
27b20 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54  ned..*/.static T
27b30 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f  able *isSimpleCo
27b40 75 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 41  unt(Select *p, A
27b50 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
27b60 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
27b70 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b  ;.  Expr *pExpr;
27b80 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e  ..  assert( !p->
27b90 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69  pGroupBy );..  i
27ba0 66 28 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20  f( p->pWhere || 
27bb0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
27bc0 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53  !=1 .   || p->pS
27bd0 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70  rc->nSrc!=1 || p
27be0 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65  ->pSrc->a[0].pSe
27bf0 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20 20 72 65  lect.  ){.    re
27c00 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54  turn 0;.  }.  pT
27c10 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  ab = p->pSrc->a[
27c20 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78 70 72  0].pTab;.  pExpr
27c30 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b   = p->pEList->a[
27c40 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65  0].pExpr;.  asse
27c50 72 74 28 20 70 54 61 62 20 26 26 20 21 70 54 61  rt( pTab && !pTa
27c60 62 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 70 45  b->pSelect && pE
27c70 78 70 72 20 29 3b 0a 0a 20 20 69 66 28 20 49 73  xpr );..  if( Is
27c80 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20  Virtual(pTab) ) 
27c90 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
27ca0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47  pExpr->op!=TK_AG
27cb0 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74  G_FUNCTION ) ret
27cc0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45 56  urn 0;.  if( NEV
27cd0 45 52 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75  ER(pAggInfo->nFu
27ce0 6e 63 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20  nc==0) ) return 
27cf0 30 3b 0a 20 20 69 66 28 20 28 70 41 67 67 49 6e  0;.  if( (pAggIn
27d00 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75  fo->aFunc[0].pFu
27d10 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53 51  nc->funcFlags&SQ
27d20 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29  LITE_FUNC_COUNT)
27d30 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
27d40 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
27d50 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
27d60 44 69 73 74 69 6e 63 74 7c 45 50 5f 57 69 6e 46  Distinct|EP_WinF
27d70 75 6e 63 29 20 29 20 72 65 74 75 72 6e 20 30 3b  unc) ) return 0;
27d80 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  ..  return pTab;
27d90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
27da0 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65   source-list ite
27db0 6d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  m passed as an a
27dc0 72 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d  rgument was augm
27dd0 65 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a  ented with an.**
27de0 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
27df0 73 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20  se, then try to 
27e00 6c 6f 63 61 74 65 20 74 68 65 20 73 70 65 63 69  locate the speci
27e10 66 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74  fied index. If t
27e20 68 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68  here.** was such
27e30 20 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68   a clause and th
27e40 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61  e named index ca
27e50 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72  nnot be found, r
27e60 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
27e70 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65  _ERROR and leave
27e80 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61   an error in pPa
27e90 72 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rse. Otherwise, 
27ea0 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72  populate .** pFr
27eb0 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72  om->pIndex and r
27ec0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
27ed0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
27ee0 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50  ndexedByLookup(P
27ef0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74  arse *pParse, st
27f00 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
27f10 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28  m *pFrom){.  if(
27f20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20   pFrom->pTab && 
27f30 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 49 6e 64 65  pFrom->fg.isInde
27f40 78 65 64 42 79 20 29 7b 0a 20 20 20 20 54 61 62  xedBy ){.    Tab
27f50 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
27f60 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72  ->pTab;.    char
27f70 20 2a 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 70   *zIndexedBy = p
27f80 46 72 6f 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65  From->u1.zIndexe
27f90 64 42 79 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  dBy;.    Index *
27fa0 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49  pIdx;.    for(pI
27fb0 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
27fc0 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 26   .        pIdx &
27fd0 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
27fe0 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49  (pIdx->zName, zI
27ff0 6e 64 65 78 65 64 42 79 29 3b 20 0a 20 20 20 20  ndexedBy); .    
28000 20 20 20 20 70 49 64 78 3d 70 49 64 78 2d 3e 70      pIdx=pIdx->p
28010 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20 20 20 20  Next.    );.    
28020 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20  if( !pIdx ){.   
28030 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
28040 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
28050 75 63 68 20 69 6e 64 65 78 3a 20 25 73 22 2c 20  uch index: %s", 
28060 7a 49 6e 64 65 78 65 64 42 79 2c 20 30 29 3b 0a  zIndexedBy, 0);.
28070 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68        pParse->ch
28080 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
28090 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
280a0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
280b0 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49 42 49 6e      pFrom->pIBIn
280c0 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a  dex = pIdx;.  }.
280d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
280e0 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65  OK;.}./*.** Dete
280f0 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  ct compound SELE
28100 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  CT statements th
28110 61 74 20 75 73 65 20 61 6e 20 4f 52 44 45 52 20  at use an ORDER 
28120 42 59 20 63 6c 61 75 73 65 20 77 69 74 68 20 0a  BY clause with .
28130 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  ** an alternativ
28140 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
28150 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53  ence..**.**    S
28160 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
28170 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20  1 EXCEPT SELECT 
28180 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52 44 45  ... FROM t2 ORDE
28190 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20  R BY .. COLLATE 
281a0 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ....**.** These 
281b0 61 72 65 20 72 65 77 72 69 74 74 65 6e 20 61 73  are rewritten as
281c0 20 61 20 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a   a subquery:.**.
281d0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
281e0 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20  ROM (SELECT ... 
281f0 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53  FROM t1 EXCEPT S
28200 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
28210 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45 52 20  2).**     ORDER 
28220 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e  BY ... COLLATE .
28230 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72  ...**.** This tr
28240 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20  ansformation is 
28250 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73  necessary becaus
28260 65 20 74 68 65 20 6d 75 6c 74 69 53 65 6c 65 63  e the multiSelec
28270 74 4f 72 64 65 72 42 79 28 29 20 72 6f 75 74 69  tOrderBy() routi
28280 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68 61 74  ne.** above that
28290 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
282a0 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75  ode for a compou
282b0 6e 64 20 53 45 4c 45 43 54 20 77 69 74 68 20 61  nd SELECT with a
282c0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
282d0 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65 72 67  e.** uses a merg
282e0 65 20 61 6c 67 6f 72 69 74 68 6d 20 74 68 61 74  e algorithm that
282f0 20 72 65 71 75 69 72 65 73 20 74 68 65 20 73 61   requires the sa
28300 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  me collating seq
28310 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20  uence on the.** 
28320 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61  result columns a
28330 73 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s on the ORDER B
28340 59 20 63 6c 61 75 73 65 2e 20 20 53 65 65 20 74  Y clause.  See t
28350 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f  icket.** http://
28360 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73  www.sqlite.org/s
28370 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37 34 64  rc/info/6709574d
28380 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72  2a.**.** This tr
28390 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20  ansformation is 
283a0 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f 72 20  only needed for 
283b0 45 58 43 45 50 54 2c 20 49 4e 54 45 52 53 45 43  EXCEPT, INTERSEC
283c0 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a  T, and UNION..**
283d0 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   The UNION ALL o
283e0 70 65 72 61 74 6f 72 20 77 6f 72 6b 73 20 66 69  perator works fi
283f0 6e 65 20 77 69 74 68 20 6d 75 6c 74 69 53 65 6c  ne with multiSel
28400 65 63 74 4f 72 64 65 72 42 79 28 29 20 65 76 65  ectOrderBy() eve
28410 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20  n when.** there 
28420 61 72 65 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d  are COLLATE term
28430 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
28440 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  Y..*/.static int
28450 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64   convertCompound
28460 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79  SelectToSubquery
28470 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
28480 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
28490 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63 74 20  int i;.  Select 
284a0 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20  *pNew;.  Select 
284b0 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *pX;.  sqlite3 *
284c0 64 62 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  db;.  struct Exp
284d0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20  rList_item *a;. 
284e0 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 53 72   SrcList *pNewSr
284f0 63 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  c;.  Parse *pPar
28500 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d  se;.  Token dumm
28510 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  y;..  if( p->pPr
28520 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ior==0 ) return 
28530 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
28540 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  if( p->pOrderBy=
28550 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
28560 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28  Continue;.  for(
28570 70 58 3d 70 3b 20 70 58 20 26 26 20 28 70 58 2d  pX=p; pX && (pX-
28580 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70  >op==TK_ALL || p
28590 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  X->op==TK_SELECT
285a0 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72  ); pX=pX->pPrior
285b0 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d 30 20  ){}.  if( pX==0 
285c0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
285d0 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e  tinue;.  a = p->
285e0 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66  pOrderBy->a;.  f
285f0 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79  or(i=p->pOrderBy
28600 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b  ->nExpr-1; i>=0;
28610 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61   i--){.    if( a
28620 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73  [i].pExpr->flags
28630 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20   & EP_Collate ) 
28640 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
28650 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 57 52   i<0 ) return WR
28660 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f  C_Continue;..  /
28670 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
28680 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d  is point, that m
28690 65 61 6e 73 20 74 68 65 20 74 72 61 6e 73 66 6f  eans the transfo
286a0 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69  rmation is requi
286b0 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73  red. */..  pPars
286c0 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
286d0 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  rse;.  db = pPar
286e0 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d  se->db;.  pNew =
286f0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
28700 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
28710 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20  *pNew) );.  if( 
28720 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
28730 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65   WRC_Abort;.  me
28740 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20  mset(&dummy, 0, 
28750 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a  sizeof(dummy));.
28760 20 20 70 4e 65 77 53 72 63 20 3d 20 73 71 6c 69    pNewSrc = sqli
28770 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
28780 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c  FromTerm(pParse,
28790 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65  0,0,0,&dummy,pNe
287a0 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20 70 4e  w,0,0);.  if( pN
287b0 65 77 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72  ewSrc==0 ) retur
287c0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 2a  n WRC_Abort;.  *
287d0 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e  pNew = *p;.  p->
287e0 70 53 72 63 20 3d 20 70 4e 65 77 53 72 63 3b 0a  pSrc = pNewSrc;.
287f0 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71    p->pEList = sq
28800 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
28810 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73  end(pParse, 0, s
28820 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
28830 4b 5f 41 53 54 45 52 49 53 4b 2c 20 30 29 29 3b  K_ASTERISK, 0));
28840 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45  .  p->op = TK_SE
28850 4c 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68 65 72  LECT;.  p->pWher
28860 65 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  e = 0;.  pNew->p
28870 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 70  GroupBy = 0;.  p
28880 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30  New->pHaving = 0
28890 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72  ;.  pNew->pOrder
288a0 42 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 50 72  By = 0;.  p->pPr
288b0 69 6f 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e  ior = 0;.  p->pN
288c0 65 78 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 57  ext = 0;.  p->pW
288d0 69 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 73 65  ith = 0;.  p->se
288e0 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f  lFlags &= ~SF_Co
288f0 6d 70 6f 75 6e 64 3b 0a 20 20 61 73 73 65 72 74  mpound;.  assert
28900 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
28910 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 29 3d 3d   SF_Converted)==
28920 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  0 );.  p->selFla
28930 67 73 20 7c 3d 20 53 46 5f 43 6f 6e 76 65 72 74  gs |= SF_Convert
28940 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e  ed;.  assert( pN
28950 65 77 2d 3e 70 50 72 69 6f 72 21 3d 30 20 29 3b  ew->pPrior!=0 );
28960 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 2d  .  pNew->pPrior-
28970 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20  >pNext = pNew;. 
28980 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20   pNew->pLimit = 
28990 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  0;.  return WRC_
289a0 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
289b0 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
289c0 69 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  if the FROM clau
289d0 73 65 20 74 65 72 6d 20 70 46 72 6f 6d 20 68 61  se term pFrom ha
289e0 73 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 20 66  s table-valued f
289f0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72 67 75 6d  unction.** argum
28a00 65 6e 74 73 2e 20 20 49 66 20 69 74 20 64 6f 65  ents.  If it doe
28a10 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
28a20 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
28a30 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  rse and return.*
28a40 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 73 69 6e 63  * non-zero, sinc
28a50 65 20 70 46 72 6f 6d 20 69 73 20 6e 6f 74 20 61  e pFrom is not a
28a60 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 20 74  llowed to be a t
28a70 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e 63  able-valued func
28a80 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
28a90 69 6e 74 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63  int cannotBeFunc
28aa0 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
28ab0 73 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69  se, struct SrcLi
28ac0 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b  st_item *pFrom){
28ad0 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67  .  if( pFrom->fg
28ae0 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20  .isTabFunc ){.  
28af0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
28b00 67 28 70 50 61 72 73 65 2c 20 22 27 25 73 27 20  g(pParse, "'%s' 
28b10 69 73 20 6e 6f 74 20 61 20 66 75 6e 63 74 69 6f  is not a functio
28b20 6e 22 2c 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65  n", pFrom->zName
28b30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
28b40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
28b50 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
28b60 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a  TE_OMIT_CTE./*.*
28b70 2a 20 41 72 67 75 6d 65 6e 74 20 70 57 69 74 68  * Argument pWith
28b80 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 4e   (which may be N
28b90 55 4c 4c 29 20 70 6f 69 6e 74 73 20 74 6f 20 61  ULL) points to a
28ba0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
28bb0 6e 65 73 74 65 64 20 0a 2a 2a 20 57 49 54 48 20  nested .** WITH 
28bc0 63 6f 6e 74 65 78 74 73 2c 20 66 72 6f 6d 20 69  contexts, from i
28bd0 6e 6e 65 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73  nner to outermos
28be0 74 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  t. If the table 
28bf0 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 0a 2a  identified by .*
28c00 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c  * FROM clause el
28c10 65 6d 65 6e 74 20 70 49 74 65 6d 20 69 73 20 72  ement pItem is r
28c20 65 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74  eally a common-t
28c30 61 62 6c 65 2d 65 78 70 72 65 73 73 69 6f 6e 20  able-expression 
28c40 28 43 54 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72  (CTE) .** then r
28c50 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
28c60 74 6f 20 74 68 65 20 43 54 45 20 64 65 66 69 6e  to the CTE defin
28c70 69 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 74  ition for that t
28c80 61 62 6c 65 2e 20 4f 74 68 65 72 77 69 73 65 0a  able. Otherwise.
28c90 2a 2a 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  ** return NULL..
28ca0 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e  **.** If a non-N
28cb0 55 4c 4c 20 76 61 6c 75 65 20 69 73 20 72 65 74  ULL value is ret
28cc0 75 72 6e 65 64 2c 20 73 65 74 20 2a 70 70 43 6f  urned, set *ppCo
28cd0 6e 74 65 78 74 20 74 6f 20 70 6f 69 6e 74 20 74  ntext to point t
28ce0 6f 20 74 68 65 20 57 69 74 68 0a 2a 2a 20 6f 62  o the With.** ob
28cf0 6a 65 63 74 20 74 68 61 74 20 74 68 65 20 72 65  ject that the re
28d00 74 75 72 6e 65 64 20 43 54 45 20 62 65 6c 6f 6e  turned CTE belon
28d10 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  gs to..*/.static
28d20 20 73 74 72 75 63 74 20 43 74 65 20 2a 73 65 61   struct Cte *sea
28d30 72 63 68 57 69 74 68 28 0a 20 20 57 69 74 68 20  rchWith(.  With 
28d40 2a 70 57 69 74 68 2c 20 20 20 20 20 20 20 20 20  *pWith,         
28d50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
28d60 72 72 65 6e 74 20 69 6e 6e 65 72 6d 6f 73 74 20  rrent innermost 
28d70 57 49 54 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20  WITH clause */. 
28d80 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
28d90 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20  item *pItem,    
28da0 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
28db0 65 6c 65 6d 65 6e 74 20 74 6f 20 72 65 73 6f 6c  element to resol
28dc0 76 65 20 2a 2f 0a 20 20 57 69 74 68 20 2a 2a 70  ve */.  With **p
28dd0 70 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20  pContext        
28de0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
28df0 57 49 54 48 20 63 6c 61 75 73 65 20 72 65 74 75  WITH clause retu
28e00 72 6e 20 76 61 6c 75 65 20 62 65 6c 6f 6e 67 73  rn value belongs
28e10 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73   to */.){.  cons
28e20 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
28e30 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74   if( pItem->zDat
28e40 61 62 61 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61  abase==0 && (zNa
28e50 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  me = pItem->zNam
28e60 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 57 69 74  e)!=0 ){.    Wit
28e70 68 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  h *p;.    for(p=
28e80 70 57 69 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70  pWith; p; p=p->p
28e90 4f 75 74 65 72 29 7b 0a 20 20 20 20 20 20 69 6e  Outer){.      in
28ea0 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t i;.      for(i
28eb0 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69  =0; i<p->nCte; i
28ec0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
28ed0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
28ee0 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a  zName, p->a[i].z
28ef0 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
28f00 20 20 20 20 20 20 2a 70 70 43 6f 6e 74 65 78 74        *ppContext
28f10 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
28f20 72 65 74 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b  return &p->a[i];
28f30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28f40 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
28f50 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54  eturn 0;.}../* T
28f60 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
28f70 72 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 73 74  r maintains a st
28f80 61 63 6b 20 6f 66 20 61 63 74 69 76 65 20 57 49  ack of active WI
28f90 54 48 20 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69  TH clauses.** wi
28fa0 74 68 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73  th the inner-mos
28fb0 74 20 57 49 54 48 20 63 6c 61 75 73 65 20 62 65  t WITH clause be
28fc0 69 6e 67 20 61 74 20 74 68 65 20 74 6f 70 20 6f  ing at the top o
28fd0 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a  f the stack..**.
28fe0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
28ff0 70 75 73 68 65 73 20 74 68 65 20 57 49 54 48 20  pushes the WITH 
29000 63 6c 61 75 73 65 20 70 61 73 73 65 64 20 61 73  clause passed as
29010 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
29020 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65  ment.** onto the
29030 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
29040 6b 2e 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62  k. If argument b
29050 46 72 65 65 20 69 73 20 74 72 75 65 2c 20 74 68  Free is true, th
29060 65 6e 20 74 68 69 73 0a 2a 2a 20 57 49 54 48 20  en this.** WITH 
29070 63 6c 61 75 73 65 20 77 69 6c 6c 20 6e 65 76 65  clause will neve
29080 72 20 62 65 20 70 6f 70 70 65 64 20 66 72 6f 6d  r be popped from
29090 20 74 68 65 20 73 74 61 63 6b 2e 20 49 6e 20 74   the stack. In t
290a0 68 69 73 20 63 61 73 65 20 69 74 0a 2a 2a 20 73  his case it.** s
290b0 68 6f 75 6c 64 20 62 65 20 66 72 65 65 64 20 61  hould be freed a
290c0 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 50 61  long with the Pa
290d0 72 73 65 20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f  rse object. In o
290e0 74 68 65 72 20 63 61 73 65 73 2c 20 77 68 65 6e  ther cases, when
290f0 0a 2a 2a 20 62 46 72 65 65 3d 3d 30 2c 20 74 68  .** bFree==0, th
29100 65 20 57 69 74 68 20 6f 62 6a 65 63 74 20 77 69  e With object wi
29110 6c 6c 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e  ll be freed alon
29120 67 20 77 69 74 68 20 74 68 65 20 53 45 4c 45 43  g with the SELEC
29130 54 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  T .** statement 
29140 77 69 74 68 20 77 68 69 63 68 20 69 74 20 69 73  with which it is
29150 20 61 73 73 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a   associated..*/.
29160 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 74 68  void sqlite3With
29170 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61 72  Push(Parse *pPar
29180 73 65 2c 20 57 69 74 68 20 2a 70 57 69 74 68 2c  se, With *pWith,
29190 20 75 38 20 62 46 72 65 65 29 7b 0a 20 20 61 73   u8 bFree){.  as
291a0 73 65 72 74 28 20 62 46 72 65 65 3d 3d 30 20 7c  sert( bFree==0 |
291b0 7c 20 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68  | (pParse->pWith
291c0 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 70  ==0 && pParse->p
291d0 57 69 74 68 54 6f 46 72 65 65 3d 3d 30 29 20 29  WithToFree==0) )
291e0 3b 0a 20 20 69 66 28 20 70 57 69 74 68 20 29 7b  ;.  if( pWith ){
291f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
29200 72 73 65 2d 3e 70 57 69 74 68 21 3d 70 57 69 74  rse->pWith!=pWit
29210 68 20 29 3b 0a 20 20 20 20 70 57 69 74 68 2d 3e  h );.    pWith->
29220 70 4f 75 74 65 72 20 3d 20 70 50 61 72 73 65 2d  pOuter = pParse-
29230 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72  >pWith;.    pPar
29240 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
29250 68 3b 0a 20 20 20 20 69 66 28 20 62 46 72 65 65  h;.    if( bFree
29260 20 29 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68   ) pParse->pWith
29270 54 6f 46 72 65 65 20 3d 20 70 57 69 74 68 3b 0a  ToFree = pWith;.
29280 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
29290 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b  s function check
292a0 73 20 69 66 20 61 72 67 75 6d 65 6e 74 20 70 46  s if argument pF
292b0 72 6f 6d 20 72 65 66 65 72 73 20 74 6f 20 61 20  rom refers to a 
292c0 43 54 45 20 64 65 63 6c 61 72 65 64 20 62 79 20  CTE declared by 
292d0 0a 2a 2a 20 61 20 57 49 54 48 20 63 6c 61 75 73  .** a WITH claus
292e0 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 63  e on the stack c
292f0 75 72 72 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69  urrently maintai
29300 6e 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  ned by the parse
29310 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75  r. And,.** if cu
29320 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69  rrently processi
29330 6e 67 20 61 20 43 54 45 20 65 78 70 72 65 73 73  ng a CTE express
29340 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 61 20  ion, if it is a 
29350 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 72 65 66  recursive.** ref
29360 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 75  erence to the cu
29370 72 72 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a  rrent CTE..**.**
29380 20 49 66 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20   If pFrom falls 
29390 69 6e 74 6f 20 65 69 74 68 65 72 20 6f 66 20 74  into either of t
293a0 68 65 20 74 77 6f 20 63 61 74 65 67 6f 72 69 65  he two categorie
293b0 73 20 61 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e  s above, pFrom->
293c0 70 54 61 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65  pTab.** and othe
293d0 72 20 66 69 65 6c 64 73 20 61 72 65 20 70 6f 70  r fields are pop
293e0 75 6c 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67  ulated according
293f0 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 73  ly. The caller s
29400 68 6f 75 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28  hould check.** (
29410 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20  pFrom->pTab!=0) 
29420 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
29430 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 75  ther or not a su
29440 63 63 65 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a  ccessful match.*
29450 2a 20 77 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  * was found..**.
29460 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** Whether or no
29470 74 20 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75  t a match is fou
29480 6e 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  nd, SQLITE_OK is
29490 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20   returned if no 
294a0 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e  error.** occurs.
294b0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65   If an error doe
294c0 73 20 6f 63 63 75 72 2c 20 61 6e 20 65 72 72 6f  s occur, an erro
294d0 72 20 6d 65 73 73 61 67 65 20 69 73 20 73 74 6f  r message is sto
294e0 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61  red in the.** pa
294f0 72 73 65 72 20 61 6e 64 20 73 6f 6d 65 20 65 72  rser and some er
29500 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 20 74  ror code other t
29510 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  han SQLITE_OK re
29520 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
29530 63 20 69 6e 74 20 77 69 74 68 45 78 70 61 6e 64  c int withExpand
29540 28 0a 20 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c  (.  Walker *pWal
29550 6b 65 72 2c 20 0a 20 20 73 74 72 75 63 74 20 53  ker, .  struct S
29560 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
29570 6f 6d 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  om.){.  Parse *p
29580 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
29590 3e 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74  >pParse;.  sqlit
295a0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
295b0 3e 64 62 3b 0a 20 20 73 74 72 75 63 74 20 43 74  >db;.  struct Ct
295c0 65 20 2a 70 43 74 65 3b 20 20 20 20 20 20 20 20  e *pCte;        
295d0 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 65         /* Matche
295e0 64 20 43 54 45 20 28 6f 72 20 4e 55 4c 4c 20 69  d CTE (or NULL i
295f0 66 20 6e 6f 20 6d 61 74 63 68 29 20 2a 2f 0a 20  f no match) */. 
29600 20 57 69 74 68 20 2a 70 57 69 74 68 3b 20 20 20   With *pWith;   
29610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29620 20 2f 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20   /* WITH clause 
29630 74 68 61 74 20 70 43 74 65 20 62 65 6c 6f 6e 67  that pCte belong
29640 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72  s to */..  asser
29650 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
29660 30 20 29 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73  0 );..  pCte = s
29670 65 61 72 63 68 57 69 74 68 28 70 50 61 72 73 65  earchWith(pParse
29680 2d 3e 70 57 69 74 68 2c 20 70 46 72 6f 6d 2c 20  ->pWith, pFrom, 
29690 26 70 57 69 74 68 29 3b 0a 20 20 69 66 28 20 70  &pWith);.  if( p
296a0 43 74 65 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  Cte ){.    Table
296b0 20 2a 70 54 61 62 3b 0a 20 20 20 20 45 78 70 72   *pTab;.    Expr
296c0 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
296d0 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a    Select *pSel;.
296e0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 65 66      Select *pLef
296f0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
29700 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53    /* Left-most S
29710 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
29720 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4d 61 79 52  */.    int bMayR
29730 65 63 75 72 73 69 76 65 3b 20 20 20 20 20 20 20  ecursive;       
29740 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
29750 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65 64 20  compound joined 
29760 62 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a  by UNION [ALL] *
29770 2f 0a 20 20 20 20 57 69 74 68 20 2a 70 53 61 76  /.    With *pSav
29780 65 64 57 69 74 68 3b 20 20 20 20 20 20 20 20 20  edWith;         
29790 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76      /* Initial v
297a0 61 6c 75 65 20 6f 66 20 70 50 61 72 73 65 2d 3e  alue of pParse->
297b0 70 57 69 74 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a  pWith */..    /*
297c0 20 49 66 20 70 43 74 65 2d 3e 7a 43 74 65 45 72   If pCte->zCteEr
297d0 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74  r is non-NULL at
297e0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
297f0 6e 20 74 68 69 73 20 69 73 20 61 6e 20 69 6c 6c  n this is an ill
29800 65 67 61 6c 0a 20 20 20 20 2a 2a 20 72 65 63 75  egal.    ** recu
29810 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20  rsive reference 
29820 74 6f 20 43 54 45 20 70 43 74 65 2e 20 4c 65 61  to CTE pCte. Lea
29830 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70  ve an error in p
29840 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
29850 0a 20 20 20 20 2a 2a 20 65 61 72 6c 79 2e 20 49  .    ** early. I
29860 66 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20  f pCte->zCteErr 
29870 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
29880 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75  is is not a recu
29890 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 2e  rsive reference.
298a0 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  .    ** In this 
298b0 63 61 73 65 2c 20 70 72 6f 63 65 65 64 2e 20 20  case, proceed.  
298c0 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d  */.    if( pCte-
298d0 3e 7a 43 74 65 45 72 72 20 29 7b 0a 20 20 20 20  >zCteErr ){.    
298e0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
298f0 67 28 70 50 61 72 73 65 2c 20 70 43 74 65 2d 3e  g(pParse, pCte->
29900 7a 43 74 65 45 72 72 2c 20 70 43 74 65 2d 3e 7a  zCteErr, pCte->z
29910 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Name);.      ret
29920 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
29930 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
29940 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e  cannotBeFunction
29950 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20  (pParse, pFrom) 
29960 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
29970 45 52 52 4f 52 3b 0a 0a 20 20 20 20 61 73 73 65  ERROR;..    asse
29980 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
29990 3d 30 20 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d  =0 );.    pFrom-
299a0 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73  >pTab = pTab = s
299b0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
299c0 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
299d0 62 6c 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70  ble));.    if( p
299e0 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
299f0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 70  WRC_Abort;.    p
29a00 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31  Tab->nTabRef = 1
29a10 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d  ;.    pTab->zNam
29a20 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
29a30 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e  Dup(db, pCte->zN
29a40 61 6d 65 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e  ame);.    pTab->
29a50 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20  iPKey = -1;.    
29a60 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
29a70 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20   = 200; assert( 
29a80 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  200==sqlite3LogE
29a90 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20  st(1048576) );. 
29aa0 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67     pTab->tabFlag
29ab0 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61  s |= TF_Ephemera
29ac0 6c 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65  l | TF_NoVisible
29ad0 52 6f 77 69 64 3b 0a 20 20 20 20 70 46 72 6f 6d  Rowid;.    pFrom
29ae0 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
29af0 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
29b00 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20   pCte->pSelect, 
29b10 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  0);.    if( db->
29b20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
29b30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
29b40 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73  EM_BKPT;.    ass
29b50 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ert( pFrom->pSel
29b60 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  ect );..    /* C
29b70 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73 20  heck if this is 
29b80 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2e  a recursive CTE.
29b90 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20 3d 20 70   */.    pSel = p
29ba0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
29bb0 20 20 20 62 4d 61 79 52 65 63 75 72 73 69 76 65     bMayRecursive
29bc0 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54   = ( pSel->op==T
29bd0 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f  K_ALL || pSel->o
29be0 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
29bf0 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72     if( bMayRecur
29c00 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 6e  sive ){.      in
29c10 74 20 69 3b 0a 20 20 20 20 20 20 53 72 63 4c 69  t i;.      SrcLi
29c20 73 74 20 2a 70 53 72 63 20 3d 20 70 46 72 6f 6d  st *pSrc = pFrom
29c30 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b  ->pSelect->pSrc;
29c40 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
29c50 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
29c60 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75  +){.        stru
29c70 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
29c80 2a 70 49 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e  *pItem = &pSrc->
29c90 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  a[i];.        if
29ca0 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  ( pItem->zDataba
29cb0 73 65 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  se==0 .         
29cc0 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21  && pItem->zName!
29cd0 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0 .         && 
29ce0 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
29cf0 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20  p(pItem->zName, 
29d00 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20  pCte->zName).   
29d10 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
29d20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 20      pItem->pTab 
29d30 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  = pTab;.        
29d40 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 52 65    pItem->fg.isRe
29d50 63 75 72 73 69 76 65 20 3d 20 31 3b 0a 20 20 20  cursive = 1;.   
29d60 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 54 61         pTab->nTa
29d70 62 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20  bRef++;.        
29d80 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73    pSel->selFlags
29d90 20 7c 3d 20 53 46 5f 52 65 63 75 72 73 69 76 65   |= SF_Recursive
29da0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
29db0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
29dc0 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72  * Only one recur
29dd0 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 69  sive reference i
29de0 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20  s permitted. */ 
29df0 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e  .    if( pTab->n
29e00 54 61 62 52 65 66 3e 32 20 29 7b 0a 20 20 20 20  TabRef>2 ){.    
29e10 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
29e20 67 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  g(.          pPa
29e30 72 73 65 2c 20 22 6d 75 6c 74 69 70 6c 65 20 72  rse, "multiple r
29e40 65 66 65 72 65 6e 63 65 73 20 74 6f 20 72 65 63  eferences to rec
29e50 75 72 73 69 76 65 20 74 61 62 6c 65 3a 20 25 73  ursive table: %s
29e60 22 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20  ", pCte->zName. 
29e70 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 65       );.      re
29e80 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
29e90 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  R;.    }.    ass
29ea0 65 72 74 28 20 70 54 61 62 2d 3e 6e 54 61 62 52  ert( pTab->nTabR
29eb0 65 66 3d 3d 31 20 7c 7c 20 0a 20 20 20 20 20 20  ef==1 || .      
29ec0 20 20 20 20 20 20 28 28 70 53 65 6c 2d 3e 73 65        ((pSel->se
29ed0 6c 46 6c 61 67 73 26 53 46 5f 52 65 63 75 72 73  lFlags&SF_Recurs
29ee0 69 76 65 29 20 26 26 20 70 54 61 62 2d 3e 6e 54  ive) && pTab->nT
29ef0 61 62 52 65 66 3d 3d 32 20 29 29 3b 0a 0a 20 20  abRef==2 ));..  
29f00 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20    pCte->zCteErr 
29f10 3d 20 22 63 69 72 63 75 6c 61 72 20 72 65 66 65  = "circular refe
29f20 72 65 6e 63 65 3a 20 25 73 22 3b 0a 20 20 20 20  rence: %s";.    
29f30 70 53 61 76 65 64 57 69 74 68 20 3d 20 70 50 61  pSavedWith = pPa
29f40 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20  rse->pWith;.    
29f50 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
29f60 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20 62  pWith;.    if( b
29f70 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a  MayRecursive ){.
29f80 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50        Select *pP
29f90 72 69 6f 72 20 3d 20 70 53 65 6c 2d 3e 70 50 72  rior = pSel->pPr
29fa0 69 6f 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ior;.      asser
29fb0 74 28 20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68  t( pPrior->pWith
29fc0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 72  ==0 );.      pPr
29fd0 69 6f 72 2d 3e 70 57 69 74 68 20 3d 20 70 53 65  ior->pWith = pSe
29fe0 6c 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 20 20  l->pWith;.      
29ff0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
2a000 74 28 70 57 61 6c 6b 65 72 2c 20 70 50 72 69 6f  t(pWalker, pPrio
2a010 72 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  r);.      pPrior
2a020 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20 20 20  ->pWith = 0;.   
2a030 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
2a040 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
2a050 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a  pWalker, pSel);.
2a060 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
2a070 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b  ->pWith = pWith;
2a080 0a 0a 20 20 20 20 66 6f 72 28 70 4c 65 66 74 3d  ..    for(pLeft=
2a090 70 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72  pSel; pLeft->pPr
2a0a0 69 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74  ior; pLeft=pLeft
2a0b0 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 70  ->pPrior);.    p
2a0c0 45 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70  EList = pLeft->p
2a0d0 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70  EList;.    if( p
2a0e0 43 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20 20  Cte->pCols ){.  
2a0f0 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26      if( pEList &
2a100 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  & pEList->nExpr!
2a110 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45  =pCte->pCols->nE
2a120 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  xpr ){.        s
2a130 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2a140 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
2a150 20 68 61 73 20 25 64 20 76 61 6c 75 65 73 20 66   has %d values f
2a160 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a  or %d columns",.
2a170 20 20 20 20 20 20 20 20 20 20 20 20 70 43 74 65              pCte
2a180 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73 74 2d  ->zName, pEList-
2a190 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e 70 43  >nExpr, pCte->pC
2a1a0 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20  ols->nExpr.     
2a1b0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50     );.        pP
2a1c0 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53  arse->pWith = pS
2a1d0 61 76 65 64 57 69 74 68 3b 0a 20 20 20 20 20 20  avedWith;.      
2a1e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2a1f0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
2a200 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 43       pEList = pC
2a210 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20 20 7d  te->pCols;.    }
2a220 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c  ..    sqlite3Col
2a230 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
2a240 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c  (pParse, pEList,
2a250 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70   &pTab->nCol, &p
2a260 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20  Tab->aCol);.    
2a270 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76  if( bMayRecursiv
2a280 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e ){.      if( p
2a290 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sel->selFlags & 
2a2a0 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a  SF_Recursive ){.
2a2b0 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 43          pCte->zC
2a2c0 74 65 45 72 72 20 3d 20 22 6d 75 6c 74 69 70 6c  teErr = "multipl
2a2d0 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65  e recursive refe
2a2e0 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20 20 20  rences: %s";.   
2a2f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a300 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20    pCte->zCteErr 
2a310 3d 20 22 72 65 63 75 72 73 69 76 65 20 72 65 66  = "recursive ref
2a320 65 72 65 6e 63 65 20 69 6e 20 61 20 73 75 62 71  erence in a subq
2a330 75 65 72 79 3a 20 25 73 22 3b 0a 20 20 20 20 20  uery: %s";.     
2a340 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
2a350 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
2a360 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d  er, pSel);.    }
2a370 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45  .    pCte->zCteE
2a380 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 72  rr = 0;.    pPar
2a390 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76  se->pWith = pSav
2a3a0 65 64 57 69 74 68 3b 0a 20 20 7d 0a 0a 20 20 72  edWith;.  }..  r
2a3b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2a3c0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
2a3d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
2a3e0 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  TE./*.** If the 
2a3f0 53 45 4c 45 43 54 20 70 61 73 73 65 64 20 61 73  SELECT passed as
2a400 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
2a410 6d 65 6e 74 20 68 61 73 20 61 6e 20 61 73 73 6f  ment has an asso
2a420 63 69 61 74 65 64 20 57 49 54 48 20 0a 2a 2a 20  ciated WITH .** 
2a430 63 6c 61 75 73 65 2c 20 70 6f 70 20 69 74 20 66  clause, pop it f
2a440 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 73 74  rom the stack st
2a450 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ored as part of 
2a460 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
2a470 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2a480 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61 73  ction is used as
2a490 20 74 68 65 20 78 53 65 6c 65 63 74 43 61 6c 6c   the xSelectCall
2a4a0 62 61 63 6b 32 28 29 20 63 61 6c 6c 62 61 63 6b  back2() callback
2a4b0 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65   by.** sqlite3Se
2a4c0 6c 65 63 74 45 78 70 61 6e 64 28 29 20 77 68 65  lectExpand() whe
2a4d0 6e 20 77 61 6c 6b 69 6e 67 20 61 20 53 45 4c 45  n walking a SELE
2a4e0 43 54 20 74 72 65 65 20 74 6f 20 72 65 73 6f 6c  CT tree to resol
2a4f0 76 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65  ve table.** name
2a500 73 20 61 6e 64 20 6f 74 68 65 72 20 46 52 4f 4d  s and other FROM
2a510 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 73   clause elements
2a520 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
2a530 64 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 28  d selectPopWith(
2a540 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
2a550 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50   Select *p){.  P
2a560 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
2a570 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
2a580 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41    if( OK_IF_ALWA
2a590 59 53 5f 54 52 55 45 28 70 50 61 72 73 65 2d 3e  YS_TRUE(pParse->
2a5a0 70 57 69 74 68 29 20 26 26 20 70 2d 3e 70 50 72  pWith) && p->pPr
2a5b0 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 57 69  ior==0 ){.    Wi
2a5c0 74 68 20 2a 70 57 69 74 68 20 3d 20 66 69 6e 64  th *pWith = find
2a5d0 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57  Rightmost(p)->pW
2a5e0 69 74 68 3b 0a 20 20 20 20 69 66 28 20 70 57 69  ith;.    if( pWi
2a5f0 74 68 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  th!=0 ){.      a
2a600 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
2a610 57 69 74 68 3d 3d 70 57 69 74 68 20 29 3b 0a 20  With==pWith );. 
2a620 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69       pParse->pWi
2a630 74 68 20 3d 20 70 57 69 74 68 2d 3e 70 4f 75 74  th = pWith->pOut
2a640 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  er;.    }.  }.}.
2a650 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 73 65  #else.#define se
2a660 6c 65 63 74 50 6f 70 57 69 74 68 20 30 0a 23 65  lectPopWith 0.#e
2a670 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
2a680 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 73 74 72  SrcList_item str
2a690 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73  ucture passed as
2a6a0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
2a6b0 6d 65 6e 74 20 72 65 70 72 65 73 65 6e 74 73 20  ment represents 
2a6c0 61 0a 2a 2a 20 73 75 62 2d 71 75 65 72 79 20 69  a.** sub-query i
2a6d0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2a6e0 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74  e of a SELECT st
2a6f0 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 66 75  atement. This fu
2a700 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61  nction.** alloca
2a710 74 65 73 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  tes and populate
2a720 73 20 74 68 65 20 53 72 63 4c 69 73 74 5f 69 74  s the SrcList_it
2a730 65 6d 2e 70 54 61 62 20 6f 62 6a 65 63 74 2e 20  em.pTab object. 
2a740 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a  If successful,.*
2a750 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
2a760 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
2a770 73 65 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72  se, if an OOM er
2a780 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
2a790 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  ed,.** SQLITE_NO
2a7a0 4d 45 4d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  MEM..*/.int sqli
2a7b0 74 65 33 45 78 70 61 6e 64 53 75 62 71 75 65 72  te3ExpandSubquer
2a7c0 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
2a7d0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2a7e0 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  item *pFrom){.  
2a7f0 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70  Select *pSel = p
2a800 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
2a810 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 0a 20   Table *pTab;.. 
2a820 20 61 73 73 65 72 74 28 20 70 53 65 6c 20 29 3b   assert( pSel );
2a830 0a 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d  .  pFrom->pTab =
2a840 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44   pTab = sqlite3D
2a850 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
2a860 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 54  se->db, sizeof(T
2a870 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20 70 54  able));.  if( pT
2a880 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ab==0 ) return S
2a890 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70  QLITE_NOMEM;.  p
2a8a0 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31  Tab->nTabRef = 1
2a8b0 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a  ;.  if( pFrom->z
2a8c0 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 70 54 61  Alias ){.    pTa
2a8d0 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  b->zName = sqlit
2a8e0 65 33 44 62 53 74 72 44 75 70 28 70 50 61 72 73  e3DbStrDup(pPars
2a8f0 65 2d 3e 64 62 2c 20 70 46 72 6f 6d 2d 3e 7a 41  e->db, pFrom->zA
2a900 6c 69 61 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  lias);.  }else{.
2a910 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20      pTab->zName 
2a920 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
2a930 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 73 75  (pParse->db, "su
2a940 62 71 75 65 72 79 5f 25 75 22 2c 20 70 53 65 6c  bquery_%u", pSel
2a950 2d 3e 73 65 6c 49 64 29 3b 0a 20 20 7d 0a 20 20  ->selId);.  }.  
2a960 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72  while( pSel->pPr
2a970 69 6f 72 20 29 7b 20 70 53 65 6c 20 3d 20 70 53  ior ){ pSel = pS
2a980 65 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20  el->pPrior; }.  
2a990 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72  sqlite3ColumnsFr
2a9a0 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
2a9b0 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c  e, pSel->pEList,
2a9c0 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 26 70 54 61  &pTab->nCol,&pTa
2a9d0 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 70 54 61 62  b->aCol);.  pTab
2a9e0 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
2a9f0 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
2aa00 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20   = 200; assert( 
2aa10 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  200==sqlite3LogE
2aa20 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20  st(1048576) );. 
2aa30 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
2aa40 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b  |= TF_Ephemeral;
2aa50 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73  ..  return pPars
2aa60 65 2d 3e 6e 45 72 72 20 3f 20 53 51 4c 49 54 45  e->nErr ? SQLITE
2aa70 5f 45 52 52 4f 52 20 3a 20 53 51 4c 49 54 45 5f  _ERROR : SQLITE_
2aa80 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
2aa90 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 57  s routine is a W
2aaa0 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66  alker callback f
2aab0 6f 72 20 22 65 78 70 61 6e 64 69 6e 67 22 20 61  or "expanding" a
2aac0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2aad0 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67  t..** "Expanding
2aae0 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74 68  " means to do th
2aaf0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
2ab00 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20  **    (1)  Make 
2ab10 73 75 72 65 20 56 44 42 45 20 63 75 72 73 6f 72  sure VDBE cursor
2ab20 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65   numbers have be
2ab30 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65  en assigned to e
2ab40 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  very.**         
2ab50 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46  element of the F
2ab60 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ROM clause..**.*
2ab70 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69  *    (2)  Fill i
2ab80 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e  n the pTabList->
2ab90 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20  a[].pTab fields 
2aba0 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74  in the SrcList t
2abb0 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  hat .**         
2abc0 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61  defines FROM cla
2abd0 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73  use.  When views
2abe0 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46   appear in the F
2abf0 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20  ROM clause,.**  
2ac00 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62         fill pTab
2ac10 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63  List->a[].pSelec
2ac20 74 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  t with a copy of
2ac30 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
2ac40 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  ement.**        
2ac50 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
2ac60 20 74 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f   the view.  A co
2ac70 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68  py is made of th
2ac80 65 20 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a  e view's SELECT.
2ac90 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61 74 65  **         state
2aca0 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20  ment so that we 
2acb0 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66  can freely modif
2acc0 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74  y or delete that
2acd0 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20   statement.**   
2ace0 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f        without wo
2acf0 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73  rrying about mes
2ad00 73 69 6e 67 20 75 70 20 74 68 65 20 70 65 72 73  sing up the pers
2ad10 69 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74  istent represent
2ad20 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20  ation.**        
2ad30 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a   of the view..**
2ad40 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64 20  .**    (3)  Add 
2ad50 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45  terms to the WHE
2ad60 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63  RE clause to acc
2ad70 6f 6d 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54  ommodate the NAT
2ad80 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20  URAL keyword.** 
2ad90 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73          on joins
2ada0 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20   and the ON and 
2adb0 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
2adc0 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  joins..**.**    
2add0 28 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69  (4)  Scan the li
2ade0 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  st of columns in
2adf0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
2ae00 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67  (pEList) looking
2ae10 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20  .**         for 
2ae20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65  instances of the
2ae30 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72   "*" operator or
2ae40 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65   the TABLE.* ope
2ae50 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20  rator..**       
2ae60 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61    If found, expa
2ae70 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62  nd each "*" to b
2ae80 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69  e every column i
2ae90 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a  n every table.**
2aea0 20 20 20 20 20 20 20 20 20 61 6e 64 20 54 41 42           and TAB
2aeb0 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79  LE.* to be every
2aec0 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45   column in TABLE
2aed0 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ..**.*/.static i
2aee0 6e 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65  nt selectExpande
2aef0 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  r(Walker *pWalke
2af00 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  r, Select *p){. 
2af10 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
2af20 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
2af30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b  ;.  int i, j, k;
2af40 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
2af50 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74  List;.  ExprList
2af60 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75   *pEList;.  stru
2af70 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2af80 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65  *pFrom;.  sqlite
2af90 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
2afa0 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c 20  db;.  Expr *pE, 
2afb0 2a 70 52 69 67 68 74 2c 20 2a 70 45 78 70 72 3b  *pRight, *pExpr;
2afc0 0a 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 20  .  u16 selFlags 
2afd0 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 20  = p->selFlags;. 
2afe0 20 75 33 32 20 65 6c 69 73 74 46 6c 61 67 73 20   u32 elistFlags 
2aff0 3d 20 30 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c  = 0;..  p->selFl
2b000 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64  ags |= SF_Expand
2b010 65 64 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ed;.  if( db->ma
2b020 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20  llocFailed  ){. 
2b030 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
2b040 6f 72 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ort;.  }.  asser
2b050 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b  t( p->pSrc!=0 );
2b060 0a 20 20 69 66 28 20 28 73 65 6c 46 6c 61 67 73  .  if( (selFlags
2b070 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29 21   & SF_Expanded)!
2b080 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2b090 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a   WRC_Prune;.  }.
2b0a0 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65    if( pWalker->e
2b0b0 43 6f 64 65 20 29 7b 0a 20 20 20 20 2f 2a 20 52  Code ){.    /* R
2b0c0 65 6e 75 6d 62 65 72 20 73 65 6c 49 64 20 62 65  enumber selId be
2b0d0 63 61 75 73 65 20 69 74 20 68 61 73 20 62 65 65  cause it has bee
2b0e0 6e 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 61 20  n copied from a 
2b0f0 76 69 65 77 20 2a 2f 0a 20 20 20 20 70 2d 3e 73  view */.    p->s
2b100 65 6c 49 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  elId = ++pParse-
2b110 3e 6e 53 65 6c 65 63 74 3b 0a 20 20 7d 0a 20 20  >nSelect;.  }.  
2b120 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
2b130 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70  rc;.  pEList = p
2b140 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c 69  ->pEList;.  sqli
2b150 74 65 33 57 69 74 68 50 75 73 68 28 70 50 61 72  te3WithPush(pPar
2b160 73 65 2c 20 70 2d 3e 70 57 69 74 68 2c 20 30 29  se, p->pWith, 0)
2b170 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
2b180 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
2b190 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67   have been assig
2b1a0 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69  ned to all entri
2b1b0 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46  es in.  ** the F
2b1c0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
2b1d0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
2b1e0 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  nt..  */.  sqlit
2b1f0 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
2b200 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70  ursors(pParse, p
2b210 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20  TabList);..  /* 
2b220 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61  Look up every ta
2b230 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65  ble named in the
2b240 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
2b250 74 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a  the select.  If.
2b260 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66    ** an entry of
2b270 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2b280 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20 69   is a subquery i
2b290 6e 73 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c  nstead of a tabl
2b2a0 65 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20  e or view,.  ** 
2b2b0 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 74 72  then create a tr
2b2c0 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74  ansient table st
2b2d0 72 75 63 74 75 72 65 20 74 6f 20 64 65 73 63 72  ructure to descr
2b2e0 69 62 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ibe the subquery
2b2f0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
2b300 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
2b310 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
2b320 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
2b330 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  m++){.    Table 
2b340 2a 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72  *pTab;.    asser
2b350 74 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52  t( pFrom->fg.isR
2b360 65 63 75 72 73 69 76 65 3d 3d 30 20 7c 7c 20 70  ecursive==0 || p
2b370 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 3b  From->pTab!=0 );
2b380 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
2b390 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 29  fg.isRecursive )
2b3a0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
2b3b0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
2b3c0 61 62 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66  ab==0 );.#ifndef
2b3d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
2b3e0 0a 20 20 20 20 69 66 28 20 77 69 74 68 45 78 70  .    if( withExp
2b3f0 61 6e 64 28 70 57 61 6c 6b 65 72 2c 20 70 46 72  and(pWalker, pFr
2b400 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  om) ) return WRC
2b410 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69 66 28 20  _Abort;.    if( 
2b420 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29 20 7b 7d  pFrom->pTab ) {}
2b430 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20   else.#endif.   
2b440 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d   if( pFrom->zNam
2b450 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  e==0 ){.#ifndef 
2b460 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
2b470 55 45 52 59 0a 20 20 20 20 20 20 53 65 6c 65 63  UERY.      Selec
2b480 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d  t *pSel = pFrom-
2b490 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
2b4a0 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69  /* A sub-query i
2b4b0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2b4c0 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f  e of a SELECT */
2b4d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2b4e0 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Sel!=0 );.      
2b4f0 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
2b500 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab==0 );.      
2b510 69 66 28 20 73 71 6c 69 74 65 33 57 61 6c 6b 53  if( sqlite3WalkS
2b520 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
2b530 53 65 6c 29 20 29 20 72 65 74 75 72 6e 20 57 52  Sel) ) return WR
2b540 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 69  C_Abort;.      i
2b550 66 28 20 73 71 6c 69 74 65 33 45 78 70 61 6e 64  f( sqlite3Expand
2b560 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c  Subquery(pParse,
2b570 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e   pFrom) ) return
2b580 20 57 52 43 5f 41 62 6f 72 74 3b 0a 23 65 6e 64   WRC_Abort;.#end
2b590 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
2b5a0 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61      /* An ordina
2b5b0 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  ry table or view
2b5c0 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f   name in the FRO
2b5d0 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
2b5e0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
2b5f0 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20  >pTab==0 );.    
2b600 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
2b610 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
2b620 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50  cateTableItem(pP
2b630 61 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b  arse, 0, pFrom);
2b640 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
2b650 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
2b660 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 69 66 28  Abort;.      if(
2b670 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e 3d   pTab->nTabRef>=
2b680 30 78 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20  0xffff ){.      
2b690 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2b6a0 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
2b6b0 61 6e 79 20 72 65 66 65 72 65 6e 63 65 73 20 74  any references t
2b6c0 6f 20 5c 22 25 73 5c 22 3a 20 6d 61 78 20 36 35  o \"%s\": max 65
2b6d0 35 33 35 22 2c 0a 20 20 20 20 20 20 20 20 20 20  535",.          
2b6e0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
2b6f0 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54         pFrom->pT
2b700 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ab = 0;.        
2b710 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
2b720 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2b730 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b  pTab->nTabRef++;
2b740 0a 20 20 20 20 20 20 69 66 28 20 21 49 73 56 69  .      if( !IsVi
2b750 72 74 75 61 6c 28 70 54 61 62 29 20 26 26 20 63  rtual(pTab) && c
2b760 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28  annotBeFunction(
2b770 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29  pParse, pFrom) )
2b780 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2b790 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
2b7a0 20 20 7d 0a 23 69 66 20 21 64 65 66 69 6e 65 64    }.#if !defined
2b7b0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
2b7c0 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28  W) || !defined (
2b7d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2b7e0 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20  UALTABLE).      
2b7f0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
2b800 61 62 29 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65  ab) || pTab->pSe
2b810 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
2b820 69 31 36 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  i16 nCol;.      
2b830 20 20 75 38 20 65 43 6f 64 65 4f 72 69 67 20 3d    u8 eCodeOrig =
2b840 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3b   pWalker->eCode;
2b850 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
2b860 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
2b870 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
2b880 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 57 52  Tab) ) return WR
2b890 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20  C_Abort;.       
2b8a0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
2b8b0 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20  pSelect==0 );.  
2b8c0 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
2b8d0 70 53 65 6c 65 63 74 20 26 26 20 28 64 62 2d 3e  pSelect && (db->
2b8e0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
2b8f0 6e 61 62 6c 65 56 69 65 77 29 3d 3d 30 20 29 7b  nableView)==0 ){
2b900 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2b910 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2b920 65 2c 20 22 61 63 63 65 73 73 20 74 6f 20 76 69  e, "access to vi
2b930 65 77 20 5c 22 25 73 5c 22 20 70 72 6f 68 69 62  ew \"%s\" prohib
2b940 69 74 65 64 22 2c 0a 20 20 20 20 20 20 20 20 20  ited",.         
2b950 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
2b960 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2b970 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c       pFrom->pSel
2b980 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
2b990 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62 2d  ectDup(db, pTab-
2b9a0 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  >pSelect, 0);.  
2b9b0 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70 54 61        nCol = pTa
2b9c0 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20  b->nCol;.       
2b9d0 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 2d 31   pTab->nCol = -1
2b9e0 3b 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65  ;.        pWalke
2b9f0 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 20 20 2f  r->eCode = 1;  /
2ba00 2a 20 54 75 72 6e 20 6f 6e 20 53 65 6c 65 63 74  * Turn on Select
2ba10 2e 73 65 6c 49 64 20 72 65 6e 75 6d 62 65 72 69  .selId renumberi
2ba20 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  ng */.        sq
2ba30 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
2ba40 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e  pWalker, pFrom->
2ba50 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
2ba60 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
2ba70 20 3d 20 65 43 6f 64 65 4f 72 69 67 3b 0a 20 20   = eCodeOrig;.  
2ba80 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c        pTab->nCol
2ba90 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 7d   = nCol;.      }
2baa0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
2bab0 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65     /* Locate the
2bac0 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20   index named by 
2bad0 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 63  the INDEXED BY c
2bae0 6c 61 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a  lause, if any. *
2baf0 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
2bb00 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70  3IndexedByLookup
2bb10 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20  (pParse, pFrom) 
2bb20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2bb30 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d  WRC_Abort;.    }
2bb40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65  .  }..  /* Proce
2bb50 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  ss NATURAL keywo
2bb60 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20  rds, and ON and 
2bb70 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
2bb80 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69   joins..  */.  i
2bb90 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
2bba0 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f  led || sqlitePro
2bbb0 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c  cessJoin(pParse,
2bbc0 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   p) ){.    retur
2bbd0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
2bbe0 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79  ..  /* For every
2bbf0 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73   "*" that occurs
2bc00 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
2bc10 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20  ist, insert the 
2bc20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c  names of.  ** al
2bc30 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c  l columns in all
2bc40 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f   tables.  And fo
2bc50 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20  r every TABLE.* 
2bc60 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
2bc70 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c  .  ** of all col
2bc80 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20  umns in TABLE.  
2bc90 54 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72  The parser inser
2bca0 74 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78  ted a special ex
2bcb0 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69  pression.  ** wi
2bcc0 74 68 20 74 68 65 20 54 4b 5f 41 53 54 45 52 49  th the TK_ASTERI
2bcd0 53 4b 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20  SK operator for 
2bce0 65 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74  each "*" that it
2bcf0 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f   found in the co
2bd00 6c 75 6d 6e 0a 20 20 2a 2a 20 6c 69 73 74 2e 20  lumn.  ** list. 
2bd10 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
2bd20 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20  ode just has to 
2bd30 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41 53  locate the TK_AS
2bd40 54 45 52 49 53 4b 0a 20 20 2a 2a 20 65 78 70 72  TERISK.  ** expr
2bd50 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61  essions and expa
2bd60 6e 64 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74  nd each one to t
2bd70 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63  he list of all c
2bd80 6f 6c 75 6d 6e 73 20 69 6e 0a 20 20 2a 2a 20 61  olumns in.  ** a
2bd90 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  ll tables..  **.
2bda0 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c    ** The first l
2bdb0 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20  oop just checks 
2bdc0 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
2bdd0 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72  are any "*" oper
2bde0 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20  ators.  ** that 
2bdf0 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a  need expanding..
2be00 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20    */.  for(k=0; 
2be10 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
2be20 20 6b 2b 2b 29 7b 0a 20 20 20 20 70 45 20 3d 20   k++){.    pE = 
2be30 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78  pEList->a[k].pEx
2be40 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e  pr;.    if( pE->
2be50 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20  op==TK_ASTERISK 
2be60 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73  ) break;.    ass
2be70 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f  ert( pE->op!=TK_
2be80 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68  DOT || pE->pRigh
2be90 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t!=0 );.    asse
2bea0 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  rt( pE->op!=TK_D
2beb0 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74  OT || (pE->pLeft
2bec0 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c 65 66 74  !=0 && pE->pLeft
2bed0 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a  ->op==TK_ID) );.
2bee0 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
2bef0 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52  TK_DOT && pE->pR
2bf00 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54  ight->op==TK_AST
2bf10 45 52 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20  ERISK ) break;. 
2bf20 20 20 20 65 6c 69 73 74 46 6c 61 67 73 20 7c 3d     elistFlags |=
2bf30 20 70 45 2d 3e 66 6c 61 67 73 3b 0a 20 20 7d 0a   pE->flags;.  }.
2bf40 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e    if( k<pEList->
2bf50 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a  nExpr ){.    /*.
2bf60 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74      ** If we get
2bf70 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74   here it means t
2bf80 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f  he result set co
2bf90 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f  ntains one or mo
2bfa0 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70  re "*".    ** op
2bfb0 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65  erators that nee
2bfc0 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64  d to be expanded
2bfd0 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  .  Loop through 
2bfe0 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a  each expression.
2bff0 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65      ** in the re
2c000 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70  sult set and exp
2c010 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20  and them one by 
2c020 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  one..    */.    
2c030 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
2c040 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74  item *a = pEList
2c050 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  ->a;.    ExprLis
2c060 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20  t *pNew = 0;.   
2c070 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 50 61   int flags = pPa
2c080 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a  rse->db->flags;.
2c090 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65      int longName
2c0a0 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c  s = (flags & SQL
2c0b0 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73  ITE_FullColNames
2c0c0 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
2c0d0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 66             && (f
2c0e0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68  lags & SQLITE_Sh
2c0f0 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b  ortColNames)==0;
2c100 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b  ..    for(k=0; k
2c110 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
2c120 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 70 45 20 3d  k++){.      pE =
2c130 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20   a[k].pExpr;.   
2c140 20 20 20 65 6c 69 73 74 46 6c 61 67 73 20 7c 3d     elistFlags |=
2c150 20 70 45 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20   pE->flags;.    
2c160 20 20 70 52 69 67 68 74 20 3d 20 70 45 2d 3e 70    pRight = pE->p
2c170 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73  Right;.      ass
2c180 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f  ert( pE->op!=TK_
2c190 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 21 3d 30  DOT || pRight!=0
2c1a0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   );.      if( pE
2c1b0 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49 53  ->op!=TK_ASTERIS
2c1c0 4b 0a 20 20 20 20 20 20 20 26 26 20 28 70 45 2d  K.       && (pE-
2c1d0 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
2c1e0 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 53  Right->op!=TK_AS
2c1f0 54 45 52 49 53 4b 29 0a 20 20 20 20 20 20 29 7b  TERISK).      ){
2c200 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
2c210 20 70 61 72 74 69 63 75 6c 61 72 20 65 78 70 72   particular expr
2c220 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  ession does not 
2c230 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
2c240 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ded..        */.
2c250 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
2c260 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
2c270 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65  pend(pParse, pNe
2c280 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a  w, a[k].pExpr);.
2c290 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
2c2a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
2c2b0 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
2c2c0 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b  r-1].zName = a[k
2c2d0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
2c2e0 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
2c2f0 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20  >nExpr-1].zSpan 
2c300 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20  = a[k].zSpan;.  
2c310 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61          a[k].zNa
2c320 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
2c330 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30    a[k].zSpan = 0
2c340 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2c350 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d      a[k].pExpr =
2c360 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
2c370 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
2c380 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
2c390 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45   "*" or a "TABLE
2c3a0 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f  .*" and needs to
2c3b0 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65   be.        ** e
2c3c0 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20  xpanded. */.    
2c3d0 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65      int tableSee
2c3e0 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53  n = 0;      /* S
2c3f0 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42  et to 1 when TAB
2c400 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20  LE matches */.  
2c410 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61        char *zTNa
2c420 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  me = 0;       /*
2c430 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66   text of name of
2c440 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20   TABLE */.      
2c450 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
2c460 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20  _DOT ){.        
2c470 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 70 4c    assert( pE->pL
2c480 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  eft!=0 );.      
2c490 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2c4a0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2d  rHasProperty(pE-
2c4b0 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74 56 61  >pLeft, EP_IntVa
2c4c0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
2c4d0 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70    zTName = pE->p
2c4e0 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Left->u.zToken;.
2c4f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c500 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
2c510 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
2c520 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
2c530 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
2c540 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a           Table *
2c550 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
2c560 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 53 65  ab;.          Se
2c570 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 46 72  lect *pSub = pFr
2c580 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
2c590 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
2c5a0 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a  bName = pFrom->z
2c5b0 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20  Alias;.         
2c5c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63   const char *zSc
2c5d0 68 65 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  hemaName = 0;.  
2c5e0 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b          int iDb;
2c5f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
2c600 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  TabName==0 ){.  
2c610 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61            zTabNa
2c620 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  me = pTab->zName
2c630 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2c640 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
2c650 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62  mallocFailed ) b
2c660 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2c670 69 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20 28  if( pSub==0 || (
2c680 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
2c690 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d   SF_NestedFrom)=
2c6a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2c6b0 20 20 70 53 75 62 20 3d 20 30 3b 0a 20 20 20 20    pSub = 0;.    
2c6c0 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
2c6d0 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  me && sqlite3Str
2c6e0 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61  ICmp(zTName, zTa
2c6f0 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  bName)!=0 ){.   
2c700 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
2c710 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
2c720 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
2c730 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
2c740 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
2c750 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
2c760 20 20 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d            zSchem
2c770 61 4e 61 6d 65 20 3d 20 69 44 62 3e 3d 30 20 3f  aName = iDb>=0 ?
2c780 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44   db->aDb[iDb].zD
2c790 62 53 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20  bSName : "*";.  
2c7a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c7b0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
2c7c0 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
2c7d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
2c7e0 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d  r *zName = pTab-
2c7f0 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  >aCol[j].zName;.
2c800 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
2c810 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20   *zColname;  /* 
2c820 54 68 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c  The computed col
2c830 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  umn name */.    
2c840 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
2c850 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c  oFree;   /* Mall
2c860 6f 63 65 64 20 73 74 72 69 6e 67 20 74 68 61 74  oced string that
2c870 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65   needs to be fre
2c880 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ed */.          
2c890 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65    Token sColname
2c8a0 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63  ;  /* Computed c
2c8b0 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20  olumn name as a 
2c8c0 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20  token */..      
2c8d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e        assert( zN
2c8e0 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ame );.         
2c8f0 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26     if( zTName &&
2c900 20 70 53 75 62 0a 20 20 20 20 20 20 20 20 20 20   pSub.          
2c910 20 20 20 26 26 20 73 71 6c 69 74 65 33 4d 61 74     && sqlite3Mat
2c920 63 68 53 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d  chSpanName(pSub-
2c930 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53  >pEList->a[j].zS
2c940 70 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20  pan, 0, zTName, 
2c950 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  0)==0.          
2c960 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
2c970 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2c980 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
2c990 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20          /* If a 
2c9a0 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64  column is marked
2c9b0 20 61 73 20 27 68 69 64 64 65 6e 27 2c 20 6f 6d   as 'hidden', om
2c9c0 69 74 20 69 74 20 66 72 6f 6d 20 74 68 65 20 65  it it from the e
2c9d0 78 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20 20  xpanded.        
2c9e0 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65      ** result-se
2c9f0 74 20 6c 69 73 74 20 75 6e 6c 65 73 73 20 74 68  t list unless th
2ca00 65 20 53 45 4c 45 43 54 20 68 61 73 20 74 68 65  e SELECT has the
2ca10 20 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64 65   SF_IncludeHidde
2ca20 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  n.            **
2ca30 20 62 69 74 20 73 65 74 2e 0a 20 20 20 20 20 20   bit set..      
2ca40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2ca50 20 20 20 20 20 69 66 28 20 28 70 2d 3e 73 65 6c       if( (p->sel
2ca60 46 6c 61 67 73 20 26 20 53 46 5f 49 6e 63 6c 75  Flags & SF_Inclu
2ca70 64 65 48 69 64 64 65 6e 29 3d 3d 30 0a 20 20 20  deHidden)==0.   
2ca80 20 20 20 20 20 20 20 20 20 20 26 26 20 49 73 48            && IsH
2ca90 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61  iddenColumn(&pTa
2caa0 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 0a 20 20 20  b->aCol[j]) .   
2cab0 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
2cac0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
2cad0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
2cae0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 61  }.            ta
2caf0 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 0a 20 20  bleSeen = 1;..  
2cb00 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
2cb10 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29  0 && zTName==0 )
2cb20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2cb30 69 66 28 20 28 70 46 72 6f 6d 2d 3e 66 67 2e 6a  if( (pFrom->fg.j
2cb40 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54  ointype & JT_NAT
2cb50 55 52 41 4c 29 21 3d 30 0a 20 20 20 20 20 20 20  URAL)!=0.       
2cb60 20 20 20 20 20 20 20 20 20 26 26 20 74 61 62 6c           && tabl
2cb70 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
2cb80 70 54 61 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61  pTabList, i, zNa
2cb90 6d 65 2c 20 30 2c 20 30 29 0a 20 20 20 20 20 20  me, 0, 0).      
2cba0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2cbb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2cbc0 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c   a NATURAL join,
2cbd0 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63   omit the join c
2cbe0 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20  olumns from the 
2cbf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2cc00 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20 74 68 65   ** table to the
2cc10 20 72 69 67 68 74 20 6f 66 20 74 68 65 20 6a 6f   right of the jo
2cc20 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  in */.          
2cc30 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
2cc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2cc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2cc60 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  ( sqlite3IdListI
2cc70 6e 64 65 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69  ndex(pFrom->pUsi
2cc80 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b  ng, zName)>=0 ){
2cc90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2cca0 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69   /* In a join wi
2ccb0 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73  th a USING claus
2ccc0 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20  e, omit columns 
2ccd0 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
2cce0 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20         ** using 
2ccf0 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20  clause from the 
2cd00 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67  table on the rig
2cd10 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ht. */.         
2cd20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2cd30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2cd40 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2cd50 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68             pRigh
2cd60 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
2cd70 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65  db, TK_ID, zName
2cd80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  );.            z
2cd90 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  Colname = zName;
2cda0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f  .            zTo
2cdb0 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Free = 0;.      
2cdc0 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61        if( longNa
2cdd0 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d  mes || pTabList-
2cde0 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20  >nSrc>1 ){.     
2cdf0 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
2ce00 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Left;.          
2ce10 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69      pLeft = sqli
2ce20 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
2ce30 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20  D, zTabName);.  
2ce40 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
2ce50 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
2ce60 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
2ce70 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b   pLeft, pRight);
2ce80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2ce90 66 28 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 29  f( zSchemaName )
2cea0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2ceb0 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65    pLeft = sqlite
2cec0 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c  3Expr(db, TK_ID,
2ced0 20 7a 53 63 68 65 6d 61 4e 61 6d 65 29 3b 0a 20   zSchemaName);. 
2cee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2cef0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
2cf00 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44  xpr(pParse, TK_D
2cf10 4f 54 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72  OT, pLeft, pExpr
2cf20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2cf30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
2cf40 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29   if( longNames )
2cf50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2cf60 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c    zColname = sql
2cf70 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
2cf80 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d  "%s.%s", zTabNam
2cf90 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e, zName);.     
2cfa0 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72             zToFr
2cfb0 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20  ee = zColname;. 
2cfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2cfd0 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
2cfe0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2cff0 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a  pExpr = pRight;.
2d000 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2d010 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d            pNew =
2d020 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2d030 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
2d040 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  New, pExpr);.   
2d050 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2d060 54 6f 6b 65 6e 49 6e 69 74 28 26 73 43 6f 6c 6e  TokenInit(&sColn
2d070 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a  ame, zColname);.
2d080 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2d090 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61  te3ExprListSetNa
2d0a0 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c  me(pParse, pNew,
2d0b0 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a   &sColname, 0);.
2d0c0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2d0d0 70 4e 65 77 20 26 26 20 28 70 2d 3e 73 65 6c 46  pNew && (p->selF
2d0e0 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64  lags & SF_Nested
2d0f0 46 72 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20  From)!=0 ){.    
2d100 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
2d110 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
2d120 70 58 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e  pX = &pNew->a[pN
2d130 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  ew->nExpr-1];.  
2d140 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2d150 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pSub ){.        
2d160 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61          pX->zSpa
2d170 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  n = sqlite3DbStr
2d180 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 45  Dup(db, pSub->pE
2d190 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e  List->a[j].zSpan
2d1a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2d1b0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d     testcase( pX-
2d1c0 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20  >zSpan==0 );.   
2d1d0 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
2d1e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2d1f0 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71    pX->zSpan = sq
2d200 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
2d210 20 22 25 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20   "%s.%s.%s",.   
2d220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d240 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e          zSchemaN
2d250 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a  ame, zTabName, z
2d260 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  Colname);.      
2d270 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2d280 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30  se( pX->zSpan==0
2d290 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
2d2a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2d2b0 20 20 70 58 2d 3e 62 53 70 61 6e 49 73 54 61 62    pX->bSpanIsTab
2d2c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2d2d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2d2e0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2d2f0 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20  , zToFree);.    
2d300 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d310 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 74  }.        if( !t
2d320 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20  ableSeen ){.    
2d330 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
2d340 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d350 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2d360 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
2d370 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e   table: %s", zTN
2d380 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
2d390 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2d3a0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2d3b0 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74  sg(pParse, "no t
2d3c0 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22  ables specified"
2d3d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2d3e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2d3f0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2d400 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
2d410 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  (db, pEList);.  
2d420 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e    p->pEList = pN
2d430 65 77 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ew;.  }.  if( p-
2d440 3e 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 69  >pEList ){.    i
2d450 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  f( p->pEList->nE
2d460 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  xpr>db->aLimit[S
2d470 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
2d480 4d 4e 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  MN] ){.      sql
2d490 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2d4a0 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63  rse, "too many c
2d4b0 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74  olumns in result
2d4c0 20 73 65 74 22 29 3b 0a 20 20 20 20 20 20 72 65   set");.      re
2d4d0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
2d4e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 65      }.    if( (e
2d4f0 6c 69 73 74 46 6c 61 67 73 20 26 20 28 45 50 5f  listFlags & (EP_
2d500 48 61 73 46 75 6e 63 7c 45 50 5f 53 75 62 71 75  HasFunc|EP_Subqu
2d510 65 72 79 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ery))!=0 ){.    
2d520 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
2d530 20 53 46 5f 43 6f 6d 70 6c 65 78 52 65 73 75 6c   SF_ComplexResul
2d540 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  t;.    }.  }.  r
2d550 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
2d560 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d  ue;.}../*.** No-
2d570 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74  op routine for t
2d580 68 65 20 70 61 72 73 65 2d 74 72 65 65 20 77 61  he parse-tree wa
2d590 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  lker..**.** When
2d5a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
2d5b0 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45 78 70   the Walker.xExp
2d5c0 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65  rCallback then e
2d5d0 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 0a  xpression trees.
2d5e0 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20 77 69  ** are walked wi
2d5f0 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69 6f 6e  thout any action
2d600 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20 61 74  s being taken at
2d610 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50 72 65   each node.  Pre
2d620 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e  sumably,.** when
2d630 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
2d640 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b 65 72   used for Walker
2d650 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74  .xExprCallback t
2d660 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78  hen .** Walker.x
2d670 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 69  SelectCallback i
2d680 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65  s set to do some
2d690 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66 6f 72  thing useful for
2d6a0 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62 71 75   every .** subqu
2d6b0 65 72 79 20 69 6e 20 74 68 65 20 70 61 72 73 65  ery in the parse
2d6c0 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73  r tree..*/.int s
2d6d0 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f  qlite3ExprWalkNo
2d6e0 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73  op(Walker *NotUs
2d6f0 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73 65  ed, Expr *NotUse
2d700 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
2d710 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
2d720 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72  , NotUsed2);.  r
2d730 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
2d740 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d  ue;.}../*.** No-
2d750 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74  op routine for t
2d760 68 65 20 70 61 72 73 65 2d 74 72 65 65 20 77 61  he parse-tree wa
2d770 6c 6b 65 72 20 66 6f 72 20 53 45 4c 45 43 54 20  lker for SELECT 
2d780 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 20 73  statements..** s
2d790 75 62 71 75 65 72 79 20 69 6e 20 74 68 65 20 70  ubquery in the p
2d7a0 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69  arser tree..*/.i
2d7b0 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
2d7c0 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20  WalkNoop(Walker 
2d7d0 2a 4e 6f 74 55 73 65 64 2c 20 53 65 6c 65 63 74  *NotUsed, Select
2d7e0 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55   *NotUsed2){.  U
2d7f0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
2d800 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
2d810 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52  d2);.  return WR
2d820 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 23  C_Continue;.}..#
2d830 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  if SQLITE_DEBUG.
2d840 2f 2a 0a 2a 2a 20 41 6c 77 61 79 73 20 61 73 73  /*.** Always ass
2d850 65 72 74 2e 20 20 54 68 69 73 20 78 53 65 6c 65  ert.  This xSele
2d860 63 74 43 61 6c 6c 62 61 63 6b 32 20 69 6d 70 6c  ctCallback2 impl
2d870 65 6d 65 6e 74 61 74 69 6f 6e 20 70 72 6f 76 65  ementation prove
2d880 73 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 78 53  s that the.** xS
2d890 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 69  electCallback2 i
2d8a0 73 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 64 2e  s never invoked.
2d8b0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2d8c0 53 65 6c 65 63 74 57 61 6c 6b 41 73 73 65 72 74  SelectWalkAssert
2d8d0 32 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65  2(Walker *NotUse
2d8e0 64 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73  d, Select *NotUs
2d8f0 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2){.  UNUSED_P
2d900 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
2d910 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  d, NotUsed2);.  
2d920 61 73 73 65 72 74 28 20 30 20 29 3b 0a 7d 0a 23  assert( 0 );.}.#
2d930 65 6e 64 69 66 0a 2f 2a 0a 2a 2a 20 54 68 69 73  endif./*.** This
2d940 20 72 6f 75 74 69 6e 65 20 22 65 78 70 61 6e 64   routine "expand
2d950 73 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  s" a SELECT stat
2d960 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66  ement and all of
2d970 20 69 74 73 20 73 75 62 71 75 65 72 69 65 73 2e   its subqueries.
2d980 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74 69 6f 6e  .** For addition
2d990 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  al information o
2d9a0 6e 20 77 68 61 74 20 69 74 20 6d 65 61 6e 73 20  n what it means 
2d9b0 74 6f 20 22 65 78 70 61 6e 64 22 20 61 20 53 45  to "expand" a SE
2d9c0 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  LECT.** statemen
2d9d0 74 2c 20 73 65 65 20 74 68 65 20 63 6f 6d 6d 65  t, see the comme
2d9e0 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c 65 63 74  nt on the select
2d9f0 45 78 70 61 6e 64 20 77 6f 72 6b 65 72 20 63 61  Expand worker ca
2da00 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a  llback above..**
2da10 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20 61 20  .** Expanding a 
2da20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2da30 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73 74   is the first st
2da40 65 70 20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67  ep in processing
2da50 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61   a.** SELECT sta
2da60 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 53 45 4c  tement.  The SEL
2da70 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d 75  ECT statement mu
2da80 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20 62  st be expanded b
2da90 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65  efore.** name re
2daa0 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65 72 66  solution is perf
2dab0 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormed..**.** If 
2dac0 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
2dad0 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65  ong, an error me
2dae0 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65 6e  ssage is written
2daf0 20 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a   into pParse..**
2db00 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
2db10 63 74 69 6f 6e 20 63 61 6e 20 64 65 74 65 63 74  ction can detect
2db20 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 62 79 20   the problem by 
2db30 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61 72 73  looking at pPars
2db40 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f  e->nErr.** and/o
2db50 72 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  r pParse->db->ma
2db60 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73  llocFailed..*/.s
2db70 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
2db80 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 50  e3SelectExpand(P
2db90 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
2dba0 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
2dbb0 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e    Walker w;.  w.
2dbc0 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
2dbd0 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e  sqlite3ExprWalkN
2dbe0 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  oop;.  w.pParse 
2dbf0 3d 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20  = pParse;.  if( 
2dc00 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f 54 52 55  OK_IF_ALWAYS_TRU
2dc10 45 28 70 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d  E(pParse->hasCom
2dc20 70 6f 75 6e 64 29 20 29 7b 0a 20 20 20 20 77 2e  pound) ){.    w.
2dc30 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
2dc40 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e  = convertCompoun
2dc50 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72  dSelectToSubquer
2dc60 79 3b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74  y;.    w.xSelect
2dc70 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20  Callback2 = 0;. 
2dc80 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
2dc90 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74  lect(&w, pSelect
2dca0 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53 65 6c 65  );.  }.  w.xSele
2dcb0 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c  ctCallback = sel
2dcc0 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20 20 77  ectExpander;.  w
2dcd0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2dce0 32 20 3d 20 73 65 6c 65 63 74 50 6f 70 57 69 74  2 = selectPopWit
2dcf0 68 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 30  h;.  w.eCode = 0
2dd00 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53  ;.  sqlite3WalkS
2dd10 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63  elect(&w, pSelec
2dd20 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20  t);.}...#ifndef 
2dd30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
2dd40 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  UERY./*.** This 
2dd50 69 73 20 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c  is a Walker.xSel
2dd60 65 63 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c  ectCallback call
2dd70 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71 6c  back for the sql
2dd80 69 74 65 33 53 65 6c 65 63 74 54 79 70 65 49 6e  ite3SelectTypeIn
2dd90 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63  fo().** interfac
2dda0 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63  e..**.** For eac
2ddb0 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  h FROM-clause su
2ddc0 62 71 75 65 72 79 2c 20 61 64 64 20 43 6f 6c 75  bquery, add Colu
2ddd0 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c  mn.zType and Col
2dde0 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66  umn.zColl.** inf
2ddf0 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65 20  ormation to the 
2de00 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
2de10 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20  that represents 
2de20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a 2a  the result set.*
2de30 2a 20 6f 66 20 74 68 61 74 20 73 75 62 71 75 65  * of that subque
2de40 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61  ry..**.** The Ta
2de50 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
2de60 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68  at represents th
2de70 65 20 72 65 73 75 6c 74 20 73 65 74 20 77 61 73  e result set was
2de80 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20   constructed.** 
2de90 62 79 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65  by selectExpande
2dea0 72 28 29 20 62 75 74 20 74 68 65 20 74 79 70 65  r() but the type
2deb0 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69   and collation i
2dec0 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f  nformation was o
2ded0 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20 74 68 61  mitted.** at tha
2dee0 74 20 70 6f 69 6e 74 20 62 65 63 61 75 73 65 20  t point because 
2def0 69 64 65 6e 74 69 66 69 65 72 73 20 68 61 64 20  identifiers had 
2df00 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 72 65 73  not yet been res
2df10 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20  olved.  This.** 
2df20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2df30 64 20 61 66 74 65 72 20 69 64 65 6e 74 69 66 69  d after identifi
2df40 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a  er resolution..*
2df50 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
2df60 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54  lectAddSubqueryT
2df70 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a  ypeInfo(Walker *
2df80 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
2df90 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
2dfa0 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  arse;.  int i;. 
2dfb0 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
2dfc0 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  st;.  struct Src
2dfd0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
2dfe0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
2dff0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
2e000 73 6f 6c 76 65 64 20 29 3b 0a 20 20 69 66 28 20  solved );.  if( 
2e010 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
2e020 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72  _HasTypeInfo ) r
2e030 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 73 65 6c 46  eturn;.  p->selF
2e040 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79  lags |= SF_HasTy
2e050 70 65 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65  peInfo;.  pParse
2e060 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
2e070 73 65 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d  se;.  pTabList =
2e080 20 70 2d 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28   p->pSrc;.  for(
2e090 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
2e0a0 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
2e0b0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
2e0c0 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62  From++){.    Tab
2e0d0 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
2e0e0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65  ->pTab;.    asse
2e0f0 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
2e100 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61     if( (pTab->ta
2e110 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65  bFlags & TF_Ephe
2e120 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20  meral)!=0 ){.   
2e130 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
2e140 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
2e150 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
2e160 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74   */.      Select
2e170 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e   *pSel = pFrom->
2e180 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 69  pSelect;.      i
2e190 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 20  f( pSel ){.     
2e1a0 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e     while( pSel->
2e1b0 70 50 72 69 6f 72 20 29 20 70 53 65 6c 20 3d 20  pPrior ) pSel = 
2e1c0 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  pSel->pPrior;.  
2e1d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
2e1e0 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
2e1f0 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61  AndCollation(pPa
2e200 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 2c  rse, pTab, pSel,
2e210 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e240 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29  SQLITE_AFF_NONE)
2e250 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2e260 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
2e270 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2e280 65 20 61 64 64 73 20 64 61 74 61 74 79 70 65 20  e adds datatype 
2e290 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  and collating se
2e2a0 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69  quence informati
2e2b0 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62  on to.** the Tab
2e2c0 6c 65 20 73 74 72 75 63 74 75 72 65 73 20 6f 66  le structures of
2e2d0 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65   all FROM-clause
2e2e0 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 61   subqueries in a
2e2f0 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
2e300 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20  ment..**.** Use 
2e310 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 66 74  this routine aft
2e320 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  er name resoluti
2e330 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
2e340 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
2e350 41 64 64 54 79 70 65 49 6e 66 6f 28 50 61 72 73  AddTypeInfo(Pars
2e360 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
2e370 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69 66  t *pSelect){.#if
2e380 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2e390 5f 53 55 42 51 55 45 52 59 0a 20 20 57 61 6c 6b  _SUBQUERY.  Walk
2e3a0 65 72 20 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63  er w;.  w.xSelec
2e3b0 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69  tCallback = sqli
2e3c0 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f  te3SelectWalkNoo
2e3d0 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  p;.  w.xSelectCa
2e3e0 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74  llback2 = select
2e3f0 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49  AddSubqueryTypeI
2e400 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  nfo;.  w.xExprCa
2e410 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  llback = sqlite3
2e420 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  ExprWalkNoop;.  
2e430 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  w.pParse = pPars
2e440 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  e;.  sqlite3Walk
2e450 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65  Select(&w, pSele
2e460 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a  ct);.#endif.}...
2e470 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2e480 6e 65 20 73 65 74 73 20 75 70 20 61 20 53 45 4c  ne sets up a SEL
2e490 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f  ECT statement fo
2e4a0 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54  r processing.  T
2e4b0 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  he.** following 
2e4c0 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a  is accomplished:
2e4d0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44  .**.**     *  VD
2e4e0 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE Cursor number
2e4f0 73 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  s are assigned t
2e500 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  o all FROM-claus
2e510 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20  e terms..**     
2e520 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54 61 62  *  Ephemeral Tab
2e530 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63  le objects are c
2e540 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 46  reated for all F
2e550 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
2e560 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20  eries..**     * 
2e570 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
2e580 61 75 73 65 73 20 61 72 65 20 73 68 69 66 74 65  auses are shifte
2e590 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73 74 61  d into WHERE sta
2e5a0 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a  tements.**     *
2e5b0 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a 22 20    Wildcards "*" 
2e5c0 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e  and "TABLE.*" in
2e5d0 20 72 65 73 75 6c 74 20 73 65 74 73 20 61 72 65   result sets are
2e5e0 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20   expanded..**   
2e5f0 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65 72 73    *  Identifiers
2e600 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61   in expression a
2e610 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20 74 61  re matched to ta
2e620 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  bles..**.** This
2e630 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 72 65   routine acts re
2e640 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c  cursively on all
2e650 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68   subqueries with
2e660 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a  in the SELECT..*
2e670 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
2e680 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61 72 73  lectPrep(.  Pars
2e690 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
2e6a0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
2e6b0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
2e6c0 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
2e6d0 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
2e6e0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
2e6f0 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e  ng coded. */.  N
2e700 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74  ameContext *pOut
2e710 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  erNC  /* Name co
2e720 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74 61 69  ntext for contai
2e730 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  ner */.){.  asse
2e740 72 74 28 20 70 21 3d 30 20 7c 7c 20 70 50 61 72  rt( p!=0 || pPar
2e750 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
2e760 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 50  iled );.  if( pP
2e770 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
2e780 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
2e790 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
2e7a0 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49  gs & SF_HasTypeI
2e7b0 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  nfo ) return;.  
2e7c0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
2e7d0 61 6e 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  and(pParse, p);.
2e7e0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
2e7f0 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  rr || pParse->db
2e800 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2e810 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
2e820 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e  e3ResolveSelectN
2e830 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ames(pParse, p, 
2e840 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69 66 28  pOuterNC);.  if(
2e850 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
2e860 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
2e870 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
2e880 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  rn;.  sqlite3Sel
2e890 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 70  ectAddTypeInfo(p
2e8a0 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  Parse, p);.}../*
2e8b0 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61 67  .** Reset the ag
2e8c0 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
2e8d0 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  tor..**.** The a
2e8e0 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
2e8f0 61 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66  ator is a set of
2e900 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68   memory cells th
2e910 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72  at hold.** inter
2e920 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 20  mediate results 
2e930 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e  while calculatin
2e940 67 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20  g an aggregate. 
2e950 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
2e960 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
2e970 74 68 61 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c  that stores NULL
2e980 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73  s in all of thos
2e990 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c  e memory.** cell
2e9a0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
2e9b0 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74  d resetAccumulat
2e9c0 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
2e9d0 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
2e9e0 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
2e9f0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
2ea00 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
2ea10 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
2ea20 2a 70 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52  *pFunc;.  int nR
2ea30 65 67 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e  eg = pAggInfo->n
2ea40 46 75 6e 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d  Func + pAggInfo-
2ea50 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20  >nColumn;.  if( 
2ea60 6e 52 65 67 3d 3d 30 20 29 20 72 65 74 75 72 6e  nReg==0 ) return
2ea70 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
2ea80 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66  DEBUG.  /* Verif
2ea90 79 20 74 68 61 74 20 61 6c 6c 20 41 67 67 49 6e  y that all AggIn
2eaa0 66 6f 20 72 65 67 69 73 74 65 72 73 20 61 72 65  fo registers are
2eab0 20 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67   within the rang
2eac0 65 20 73 70 65 63 69 66 69 65 64 20 62 79 0a 20  e specified by. 
2ead0 20 2a 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65   ** AggInfo.mnRe
2eae0 67 2e 2e 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67  g..AggInfo.mxReg
2eaf0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 52   */.  assert( nR
2eb00 65 67 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78  eg==pAggInfo->mx
2eb10 52 65 67 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e  Reg-pAggInfo->mn
2eb20 52 65 67 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69  Reg+1 );.  for(i
2eb30 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
2eb40 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
2eb50 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49     assert( pAggI
2eb60 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65  nfo->aCol[i].iMe
2eb70 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52  m>=pAggInfo->mnR
2eb80 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  eg.         && p
2eb90 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d  AggInfo->aCol[i]
2eba0 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d  .iMem<=pAggInfo-
2ebb0 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20  >mxReg );.  }.  
2ebc0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
2ebd0 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29  nfo->nFunc; i++)
2ebe0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 41  {.    assert( pA
2ebf0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d  ggInfo->aFunc[i]
2ec00 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d  .iMem>=pAggInfo-
2ec10 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20  >mnReg.         
2ec20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  && pAggInfo->aFu
2ec30 6e 63 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67  nc[i].iMem<=pAgg
2ec40 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20  Info->mxReg );. 
2ec50 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
2ec60 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2ec70 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67   OP_Null, 0, pAg
2ec80 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41  gInfo->mnReg, pA
2ec90 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a  ggInfo->mxReg);.
2eca0 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67    for(pFunc=pAgg
2ecb0 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30  Info->aFunc, i=0
2ecc0 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
2ecd0 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b  unc; i++, pFunc+
2ece0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 75 6e  +){.    if( pFun
2ecf0 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20  c->iDistinct>=0 
2ed00 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
2ed10 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72  E = pFunc->pExpr
2ed20 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2ed30 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2ed40 28 70 45 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  (pE, EP_xIsSelec
2ed50 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t) );.      if( 
2ed60 70 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c  pE->x.pList==0 |
2ed70 7c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  | pE->x.pList->n
2ed80 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20  Expr!=1 ){.     
2ed90 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2eda0 73 67 28 70 50 61 72 73 65 2c 20 22 44 49 53 54  sg(pParse, "DIST
2edb0 49 4e 43 54 20 61 67 67 72 65 67 61 74 65 73 20  INCT aggregates 
2edc0 6d 75 73 74 20 68 61 76 65 20 65 78 61 63 74 6c  must have exactl
2edd0 79 20 6f 6e 65 20 22 0a 20 20 20 20 20 20 20 20  y one ".        
2ede0 20 20 20 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a     "argument");.
2edf0 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69          pFunc->i
2ee00 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20  Distinct = -1;. 
2ee10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2ee20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
2ee30 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
2ee40 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
2ee50 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 78  st(pParse, pE->x
2ee60 2e 70 4c 69 73 74 2c 30 2c 30 29 3b 0a 20 20 20  .pList,0,0);.   
2ee70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ee80 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
2ee90 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e  nEphemeral, pFun
2eea0 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c  c->iDistinct, 0,
2eeb0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
2eec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
2eed0 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
2eee0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
2eef0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
2ef00 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
2ef10 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65  e OP_AggFinalize
2ef20 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72   opcode for ever
2ef30 79 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  y aggregate func
2ef40 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41  tion.** in the A
2ef50 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ggInfo structure
2ef60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2ef70 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
2ef80 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61  tions(Parse *pPa
2ef90 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
2efa0 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
2efb0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
2efc0 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  be;.  int i;.  s
2efd0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
2efe0 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d  nc *pF;.  for(i=
2eff0 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pF=pAggInfo->
2f000 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66  aFunc; i<pAggInf
2f010 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
2f020 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  F++){.    ExprLi
2f030 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e  st *pList = pF->
2f040 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
2f050 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2f060 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d  rHasProperty(pF-
2f070 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  >pExpr, EP_xIsSe
2f080 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 73 71 6c  lect) );.    sql
2f090 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2f0a0 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70  , OP_AggFinal, p
2f0b0 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f  F->iMem, pList ?
2f0c0 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
2f0d0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
2f0e0 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70  dbeAppendP4(v, p
2f0f0 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e  F->pFunc, P4_FUN
2f100 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  CDEF);.  }.}.../
2f110 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20  *.** Update the 
2f120 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f  accumulator memo
2f130 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20  ry cells for an 
2f140 61 67 67 72 65 67 61 74 65 20 62 61 73 65 64 20  aggregate based 
2f150 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  on.** the curren
2f160 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
2f170 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 41  n..**.** If regA
2f180 63 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61  cc is non-zero a
2f190 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  nd there are no 
2f1a0 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 61  min() or max() a
2f1b0 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 69 6e 20  ggregates.** in 
2f1c0 70 41 67 67 49 6e 66 6f 2c 20 74 68 65 6e 20 6f  pAggInfo, then o
2f1d0 6e 6c 79 20 70 6f 70 75 6c 61 74 65 20 74 68 65  nly populate the
2f1e0 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75   pAggInfo->nAccu
2f1f0 6d 75 6c 61 74 6f 72 20 61 63 63 75 6d 75 6c 61  mulator accumula
2f200 74 6f 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 73  tor.** registers
2f210 20 69 66 20 72 65 67 69 73 74 65 72 20 72 65 67   if register reg
2f220 41 63 63 20 63 6f 6e 74 61 69 6e 73 20 30 2e 20  Acc contains 0. 
2f230 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
2f240 74 61 6b 65 20 63 61 72 65 0a 2a 2a 20 6f 66 20  take care.** of 
2f250 73 65 74 74 69 6e 67 20 61 6e 64 20 63 6c 65 61  setting and clea
2f260 72 69 6e 67 20 72 65 67 41 63 63 2e 0a 2a 2f 0a  ring regAcc..*/.
2f270 73 74 61 74 69 63 20 76 6f 69 64 20 75 70 64 61  static void upda
2f280 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61  teAccumulator(Pa
2f290 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
2f2a0 20 72 65 67 41 63 63 2c 20 41 67 67 49 6e 66 6f   regAcc, AggInfo
2f2b0 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
2f2c0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
2f2d0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
2f2e0 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20 3d 20  .  int regHit = 
2f2f0 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48 69 74  0;.  int addrHit
2f300 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74 72 75  Test = 0;.  stru
2f310 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
2f320 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67  *pF;.  struct Ag
2f330 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a  gInfo_col *pC;..
2f340 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65    pAggInfo->dire
2f350 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f  ctMode = 1;.  fo
2f360 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
2f370 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
2f380 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
2f390 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e  +, pF++){.    in
2f3a0 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20  t nArg;.    int 
2f3b0 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20  addrNext = 0;.  
2f3c0 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20    int regAgg;.  
2f3d0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
2f3e0 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78  t = pF->pExpr->x
2f3f0 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65  .pList;.    asse
2f400 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2f410 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20  erty(pF->pExpr, 
2f420 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
2f430 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 49 73  .    assert( !Is
2f440 57 69 6e 64 6f 77 46 75 6e 63 28 70 46 2d 3e 70  WindowFunc(pF->p
2f450 45 78 70 72 29 20 29 3b 0a 20 20 20 20 69 66 28  Expr) );.    if(
2f460 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
2f470 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 57  (pF->pExpr, EP_W
2f480 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20  inFunc) ){.     
2f490 20 45 78 70 72 20 2a 70 46 69 6c 74 65 72 20 3d   Expr *pFilter =
2f4a0 20 70 46 2d 3e 70 45 78 70 72 2d 3e 79 2e 70 57   pF->pExpr->y.pW
2f4b0 69 6e 2d 3e 70 46 69 6c 74 65 72 3b 0a 20 20 20  in->pFilter;.   
2f4c0 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71     addrNext = sq
2f4d0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
2f4e0 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
2f4f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
2f500 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 46 69  alse(pParse, pFi
2f510 6c 74 65 72 2c 20 61 64 64 72 4e 65 78 74 2c 20  lter, addrNext, 
2f520 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
2f530 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  L);.    }.    if
2f540 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
2f550 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e   nArg = pList->n
2f560 45 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41  Expr;.      regA
2f570 67 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  gg = sqlite3GetT
2f580 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
2f590 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71   nArg);.      sq
2f5a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
2f5b0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c  rList(pParse, pL
2f5c0 69 73 74 2c 20 72 65 67 41 67 67 2c 20 30 2c 20  ist, regAgg, 0, 
2f5d0 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29  SQLITE_ECEL_DUP)
2f5e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2f5f0 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20     nArg = 0;.   
2f600 20 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a 20     regAgg = 0;. 
2f610 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d     }.    if( pF-
2f620 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b  >iDistinct>=0 ){
2f630 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72 4e  .      if( addrN
2f640 65 78 74 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20  ext==0 ){ .     
2f650 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71     addrNext = sq
2f660 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
2f670 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
2f680 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61    }.      testca
2f690 73 65 28 20 6e 41 72 67 3d 3d 30 20 29 3b 20 20  se( nArg==0 );  
2f6a0 2f 2a 20 45 72 72 6f 72 20 63 6f 6e 64 69 74 69  /* Error conditi
2f6b0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  on */.      test
2f6c0 63 61 73 65 28 20 6e 41 72 67 3e 31 20 29 3b 20  case( nArg>1 ); 
2f6d0 20 20 2f 2a 20 41 6c 73 6f 20 61 6e 20 65 72 72    /* Also an err
2f6e0 6f 72 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65  or */.      code
2f6f0 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c  Distinct(pParse,
2f700 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20   pF->iDistinct, 
2f710 61 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67  addrNext, 1, reg
2f720 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Agg);.    }.    
2f730 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66  if( pF->pFunc->f
2f740 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
2f750 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20  E_FUNC_NEEDCOLL 
2f760 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
2f770 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20   *pColl = 0;.   
2f780 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
2f790 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
2f7a0 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
2f7b0 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
2f7c0 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74  !=0 );  /* pList
2f7d0 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63  !=0 if pF->pFunc
2f7e0 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f   has NEEDCOLL */
2f7f0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
2f800 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  pItem=pList->a; 
2f810 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67  !pColl && j<nArg
2f820 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
2f830 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
2f840 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2f850 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65  Seq(pParse, pIte
2f860 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
2f870 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43   }.      if( !pC
2f880 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  oll ){.        p
2f890 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
2f8a0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
2f8b0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2f8c0 72 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41 67  regHit==0 && pAg
2f8d0 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61  gInfo->nAccumula
2f8e0 74 6f 72 20 29 20 72 65 67 48 69 74 20 3d 20 2b  tor ) regHit = +
2f8f0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2f900 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2f910 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp4(v, OP_Col
2f920 6c 53 65 71 2c 20 72 65 67 48 69 74 2c 20 30 2c  lSeq, regHit, 0,
2f930 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c   0, (char *)pCol
2f940 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
2f950 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2f960 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2f970 50 5f 41 67 67 53 74 65 70 2c 20 30 2c 20 72 65  P_AggStep, 0, re
2f980 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 29 3b  gAgg, pF->iMem);
2f990 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2f9a0 41 70 70 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e  AppendP4(v, pF->
2f9b0 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
2f9c0 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  F);.    sqlite3V
2f9d0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28  dbeChangeP5(v, (
2f9e0 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71  u8)nArg);.    sq
2f9f0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
2fa00 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
2fa10 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20  gAgg, nArg);.   
2fa20 20 69 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b   if( addrNext ){
2fa30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2fa40 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
2fa50 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20  , addrNext);.   
2fa60 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67   }.  }.  if( reg
2fa70 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e  Hit==0 && pAggIn
2fa80 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  fo->nAccumulator
2fa90 20 29 7b 0a 20 20 20 20 72 65 67 48 69 74 20 3d   ){.    regHit =
2faa0 20 72 65 67 41 63 63 3b 0a 20 20 7d 0a 20 20 69   regAcc;.  }.  i
2fab0 66 28 20 72 65 67 48 69 74 20 29 7b 0a 20 20 20  f( regHit ){.   
2fac0 20 61 64 64 72 48 69 74 54 65 73 74 20 3d 20 73   addrHitTest = s
2fad0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
2fae0 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48 69  (v, OP_If, regHi
2faf0 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
2fb00 28 76 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  (v);.  }.  for(i
2fb10 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d  =0, pC=pAggInfo-
2fb20 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66  >aCol; i<pAggInf
2fb30 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b  o->nAccumulator;
2fb40 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20   i++, pC++){.   
2fb50 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
2fb60 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78  (pParse, pC->pEx
2fb70 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20  pr, pC->iMem);. 
2fb80 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64   }.  pAggInfo->d
2fb90 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20  irectMode = 0;. 
2fba0 20 69 66 28 20 61 64 64 72 48 69 74 54 65 73 74   if( addrHitTest
2fbb0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
2fbc0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
2fbd0 64 64 72 48 69 74 54 65 73 74 29 3b 0a 20 20 7d  ddrHitTest);.  }
2fbe0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
2fbf0 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69  single OP_Explai
2fc00 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  n instruction to
2fc10 20 74 68 65 20 56 44 42 45 20 74 6f 20 65 78 70   the VDBE to exp
2fc20 6c 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a  lain a simple.**
2fc30 20 63 6f 75 6e 74 28 2a 29 20 71 75 65 72 79 20   count(*) query 
2fc40 28 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  ("SELECT count(*
2fc50 29 20 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a  ) FROM pTab")..*
2fc60 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2fc70 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74  _OMIT_EXPLAIN.st
2fc80 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
2fc90 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20  nSimpleCount(.  
2fca0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2fcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fcc0 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
2fcd0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
2fce0 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
2fcf0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62        /* Table b
2fd00 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a  eing queried */.
2fd10 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
2fd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd30 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20    /* Index used 
2fd40 74 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e  to optimize scan
2fd50 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  , or NULL */.){.
2fd60 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
2fd70 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
2fd80 69 6e 74 20 62 43 6f 76 65 72 20 3d 20 28 70 49  int bCover = (pI
2fd90 64 78 21 3d 30 20 26 26 20 28 48 61 73 52 6f 77  dx!=0 && (HasRow
2fda0 69 64 28 70 54 61 62 29 20 7c 7c 20 21 49 73 50  id(pTab) || !IsP
2fdb0 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
2fdc0 49 64 78 29 29 29 3b 0a 20 20 20 20 73 71 6c 69  Idx)));.    sqli
2fdd0 74 65 33 56 64 62 65 45 78 70 6c 61 69 6e 28 70  te3VdbeExplain(p
2fde0 50 61 72 73 65 2c 20 30 2c 20 22 53 43 41 4e 20  Parse, 0, "SCAN 
2fdf0 54 41 42 4c 45 20 25 73 25 73 25 73 22 2c 0a 20  TABLE %s%s%s",. 
2fe00 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
2fe10 6d 65 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76  me,.        bCov
2fe20 65 72 20 3f 20 22 20 55 53 49 4e 47 20 43 4f 56  er ? " USING COV
2fe30 45 52 49 4e 47 20 49 4e 44 45 58 20 22 20 3a 20  ERING INDEX " : 
2fe40 22 22 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76  "",.        bCov
2fe50 65 72 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  er ? pIdx->zName
2fe60 20 3a 20 22 22 0a 20 20 20 20 29 3b 0a 20 20 7d   : "".    );.  }
2fe70 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
2fe80 65 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43  e explainSimpleC
2fe90 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64  ount(a,b,c).#end
2fea0 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65  if../*.** sqlite
2feb0 33 57 61 6c 6b 45 78 70 72 28 29 20 63 61 6c 6c  3WalkExpr() call
2fec0 62 61 63 6b 20 75 73 65 64 20 62 79 20 68 61 76  back used by hav
2fed0 69 6e 67 54 6f 57 68 65 72 65 28 29 2e 0a 2a 2a  ingToWhere()..**
2fee0 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 64 65 20  .** If the node 
2fef0 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 63 61  passed to the ca
2ff00 6c 6c 62 61 63 6b 20 69 73 20 61 20 54 4b 5f 41  llback is a TK_A
2ff10 4e 44 20 6e 6f 64 65 2c 20 72 65 74 75 72 6e 20  ND node, return 
2ff20 0a 2a 2a 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  .** WRC_Continue
2ff30 20 74 6f 20 74 65 6c 6c 20 73 71 6c 69 74 65 33   to tell sqlite3
2ff40 57 61 6c 6b 45 78 70 72 28 29 20 74 6f 20 69 74  WalkExpr() to it
2ff50 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 63 68  erate through ch
2ff60 69 6c 64 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a  ild nodes..**.**
2ff70 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
2ff80 72 6e 20 57 52 43 5f 50 72 75 6e 65 2e 20 49 6e  rn WRC_Prune. In
2ff90 20 74 68 69 73 20 63 61 73 65 2c 20 61 6c 73 6f   this case, also
2ffa0 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 0a 2a   check if the .*
2ffb0 2a 20 73 75 62 2d 65 78 70 72 65 73 73 69 6f 6e  * sub-expression
2ffc0 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 72 69   matches the cri
2ffd0 74 65 72 69 61 20 66 6f 72 20 62 65 69 6e 67 20  teria for being 
2ffe0 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 57 48 45  moved to the WHE
2fff0 52 45 0a 2a 2a 20 63 6c 61 75 73 65 2e 20 49 66  RE.** clause. If
30000 20 73 6f 2c 20 61 64 64 20 69 74 20 74 6f 20 74   so, add it to t
30010 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
30020 61 6e 64 20 72 65 70 6c 61 63 65 20 74 68 65 20  and replace the 
30030 73 75 62 2d 65 78 70 72 65 73 73 69 6f 6e 0a 2a  sub-expression.*
30040 2a 20 77 69 74 68 69 6e 20 74 68 65 20 48 41 56  * within the HAV
30050 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20 77  ING expression w
30060 69 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20 22  ith a constant "
30070 31 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  1"..*/.static in
30080 74 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65 45  t havingToWhereE
30090 78 70 72 43 62 28 57 61 6c 6b 65 72 20 2a 70 57  xprCb(Walker *pW
300a0 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
300b0 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  pr){.  if( pExpr
300c0 2d 3e 6f 70 21 3d 54 4b 5f 41 4e 44 20 29 7b 0a  ->op!=TK_AND ){.
300d0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d      Select *pS =
300e0 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 65 6c   pWalker->u.pSel
300f0 65 63 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ect;.    if( sql
30100 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
30110 6e 74 4f 72 47 72 6f 75 70 42 79 28 70 57 61 6c  ntOrGroupBy(pWal
30120 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20 70 45 78  ker->pParse, pEx
30130 70 72 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42 79  pr, pS->pGroupBy
30140 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
30150 65 33 20 2a 64 62 20 3d 20 70 57 61 6c 6b 65 72  e3 *db = pWalker
30160 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  ->pParse->db;.  
30170 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
30180 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
30190 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52  c(db, TK_INTEGER
301a0 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b  , &sqlite3IntTok
301b0 65 6e 73 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20  ens[1], 0);.    
301c0 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
301d0 20 20 20 20 20 20 45 78 70 72 20 2a 70 57 68 65        Expr *pWhe
301e0 72 65 20 3d 20 70 53 2d 3e 70 57 68 65 72 65 3b  re = pS->pWhere;
301f0 0a 20 20 20 20 20 20 20 20 53 57 41 50 28 45 78  .        SWAP(Ex
30200 70 72 2c 20 2a 70 4e 65 77 2c 20 2a 70 45 78 70  pr, *pNew, *pExp
30210 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  r);.        pNew
30220 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
30230 64 28 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  d(pWalker->pPars
30240 65 2c 20 70 57 68 65 72 65 2c 20 70 4e 65 77 29  e, pWhere, pNew)
30250 3b 0a 20 20 20 20 20 20 20 20 70 53 2d 3e 70 57  ;.        pS->pW
30260 68 65 72 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  here = pNew;.   
30270 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
30280 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ode = 1;.      }
30290 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
302a0 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
302b0 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
302c0 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
302d0 20 54 72 61 6e 73 66 65 72 20 65 6c 69 67 69 62   Transfer eligib
302e0 6c 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68  le terms from th
302f0 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  e HAVING clause 
30300 6f 66 20 61 20 71 75 65 72 79 2c 20 77 68 69 63  of a query, whic
30310 68 20 69 73 0a 2a 2a 20 70 72 6f 63 65 73 73 65  h is.** processe
30320 64 20 61 66 74 65 72 20 67 72 6f 75 70 69 6e 67  d after grouping
30330 2c 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  , to the WHERE c
30340 6c 61 75 73 65 2c 20 77 68 69 63 68 20 69 73 20  lause, which is 
30350 70 72 6f 63 65 73 73 65 64 20 62 65 66 6f 72 65  processed before
30360 0a 2a 2a 20 67 72 6f 75 70 69 6e 67 2e 20 46 6f  .** grouping. Fo
30370 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 71  r example, the q
30380 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45  uery:.**.**   SE
30390 4c 45 43 54 20 2a 20 46 52 4f 4d 20 3c 74 61 62  LECT * FROM <tab
303a0 6c 65 73 3e 20 57 48 45 52 45 20 61 3d 3f 20 47  les> WHERE a=? G
303b0 52 4f 55 50 20 42 59 20 62 20 48 41 56 49 4e 47  ROUP BY b HAVING
303c0 20 62 3d 3f 20 41 4e 44 20 63 3d 3f 0a 2a 2a 0a   b=? AND c=?.**.
303d0 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69 74  ** can be rewrit
303e0 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ten as:.**.**   
303f0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 3c 74  SELECT * FROM <t
30400 61 62 6c 65 73 3e 20 57 48 45 52 45 20 61 3d 3f  ables> WHERE a=?
30410 20 41 4e 44 20 62 3d 3f 20 47 52 4f 55 50 20 42   AND b=? GROUP B
30420 59 20 62 20 48 41 56 49 4e 47 20 63 3d 3f 0a 2a  Y b HAVING c=?.*
30430 2a 0a 2a 2a 20 41 20 74 65 72 6d 20 6f 66 20 74  *.** A term of t
30440 68 65 20 48 41 56 49 4e 47 20 65 78 70 72 65 73  he HAVING expres
30450 73 69 6f 6e 20 69 73 20 65 6c 69 67 69 62 6c 65  sion is eligible
30460 20 66 6f 72 20 74 72 61 6e 73 66 65 72 20 69 66   for transfer if
30470 20 69 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20   it consists.** 
30480 65 6e 74 69 72 65 6c 79 20 6f 66 20 63 6f 6e 73  entirely of cons
30490 74 61 6e 74 73 20 61 6e 64 20 65 78 70 72 65 73  tants and expres
304a0 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 61  sions that are a
304b0 6c 73 6f 20 47 52 4f 55 50 20 42 59 20 74 65 72  lso GROUP BY ter
304c0 6d 73 20 74 68 61 74 0a 2a 2a 20 75 73 65 20 74  ms that.** use t
304d0 68 65 20 22 42 49 4e 41 52 59 22 20 63 6f 6c 6c  he "BINARY" coll
304e0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a  ation sequence..
304f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  */.static void h
30500 61 76 69 6e 67 54 6f 57 68 65 72 65 28 50 61 72  avingToWhere(Par
30510 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
30520 63 74 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72  ct *p){.  Walker
30530 20 73 57 61 6c 6b 65 72 3b 0a 20 20 6d 65 6d 73   sWalker;.  mems
30540 65 74 28 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20  et(&sWalker, 0, 
30550 73 69 7a 65 6f 66 28 73 57 61 6c 6b 65 72 29 29  sizeof(sWalker))
30560 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 70 50 61 72  ;.  sWalker.pPar
30570 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73  se = pParse;.  s
30580 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c  Walker.xExprCall
30590 62 61 63 6b 20 3d 20 68 61 76 69 6e 67 54 6f 57  back = havingToW
305a0 68 65 72 65 45 78 70 72 43 62 3b 0a 20 20 73 57  hereExprCb;.  sW
305b0 61 6c 6b 65 72 2e 75 2e 70 53 65 6c 65 63 74 20  alker.u.pSelect 
305c0 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  = p;.  sqlite3Wa
305d0 6c 6b 45 78 70 72 28 26 73 57 61 6c 6b 65 72 2c  lkExpr(&sWalker,
305e0 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 23 69   p->pHaving);.#i
305f0 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
30600 41 42 4c 45 44 0a 20 20 69 66 28 20 73 57 61 6c  ABLED.  if( sWal
30610 6b 65 72 2e 65 43 6f 64 65 20 26 26 20 28 73 71  ker.eCode && (sq
30620 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
30630 20 26 20 30 78 31 30 30 29 21 3d 30 20 29 7b 0a   & 0x100)!=0 ){.
30640 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
30650 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28  0x100,pParse,p,(
30660 22 4d 6f 76 65 20 48 41 56 49 4e 47 20 74 65 72  "Move HAVING ter
30670 6d 73 20 69 6e 74 6f 20 57 48 45 52 45 3a 5c 6e  ms into WHERE:\n
30680 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
30690 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
306a0 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , p, 0);.  }.#en
306b0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  dif.}../*.** Che
306c0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
306d0 20 70 54 68 69 73 20 65 6e 74 72 79 20 6f 66 20   pThis entry of 
306e0 70 54 61 62 4c 69 73 74 20 69 73 20 61 20 73 65  pTabList is a se
306f0 6c 66 2d 6a 6f 69 6e 20 6f 66 20 61 20 70 72 69  lf-join of a pri
30700 6f 72 20 76 69 65 77 2e 0a 2a 2a 20 49 66 20 69  or view..** If i
30710 74 20 69 73 2c 20 74 68 65 6e 20 72 65 74 75 72  t is, then retur
30720 6e 20 74 68 65 20 53 72 63 4c 69 73 74 5f 69 74  n the SrcList_it
30730 65 6d 20 66 6f 72 20 74 68 65 20 70 72 69 6f 72  em for the prior
30740 20 76 69 65 77 2e 20 20 49 66 20 69 74 20 69 73   view.  If it is
30750 20 6e 6f 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 65   not,.** then re
30760 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
30770 63 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74  c struct SrcList
30780 5f 69 74 65 6d 20 2a 69 73 53 65 6c 66 4a 6f 69  _item *isSelfJoi
30790 6e 56 69 65 77 28 0a 20 20 53 72 63 4c 69 73 74  nView(.  SrcList
307a0 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20   *pTabList,     
307b0 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20        /* Search 
307c0 66 6f 72 20 73 65 6c 66 2d 6a 6f 69 6e 73 20 69  for self-joins i
307d0 6e 20 74 68 69 73 20 46 52 4f 4d 20 63 6c 61 75  n this FROM clau
307e0 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
307f0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 68  rcList_item *pTh
30800 69 73 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66  is   /* Search f
30810 6f 72 20 70 72 69 6f 72 20 72 65 66 65 72 65 6e  or prior referen
30820 63 65 20 74 6f 20 74 68 69 73 20 73 75 62 71 75  ce to this subqu
30830 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ery */.){.  stru
30840 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
30850 2a 70 49 74 65 6d 3b 0a 20 20 66 6f 72 28 70 49  *pItem;.  for(pI
30860 74 65 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  tem = pTabList->
30870 61 3b 20 70 49 74 65 6d 3c 70 54 68 69 73 3b 20  a; pItem<pThis; 
30880 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 53 65  pItem++){.    Se
30890 6c 65 63 74 20 2a 70 53 31 3b 0a 20 20 20 20 69  lect *pS1;.    i
308a0 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
308b0 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  t==0 ) continue;
308c0 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
308d0 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  fg.viaCoroutine 
308e0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
308f0 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  if( pItem->zName
30900 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
30910 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
30920 6d 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  m->pTab!=0 );.  
30930 20 20 61 73 73 65 72 74 28 20 70 54 68 69 73 2d    assert( pThis-
30940 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20  >pTab!=0 );.    
30950 69 66 28 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  if( pItem->pTab-
30960 3e 70 53 63 68 65 6d 61 21 3d 70 54 68 69 73 2d  >pSchema!=pThis-
30970 3e 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  >pTab->pSchema )
30980 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
30990 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
309a0 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c  mp(pItem->zName,
309b0 20 70 54 68 69 73 2d 3e 7a 4e 61 6d 65 29 21 3d   pThis->zName)!=
309c0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
309d0 20 20 70 53 31 20 3d 20 70 49 74 65 6d 2d 3e 70    pS1 = pItem->p
309e0 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 66 28 20  Select;.    if( 
309f0 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 70 53 63  pItem->pTab->pSc
30a00 68 65 6d 61 3d 3d 30 20 26 26 20 70 54 68 69 73  hema==0 && pThis
30a10 2d 3e 70 53 65 6c 65 63 74 2d 3e 73 65 6c 49 64  ->pSelect->selId
30a20 21 3d 70 53 31 2d 3e 73 65 6c 49 64 20 29 7b 0a  !=pS1->selId ){.
30a30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 71 75 65        /* The que
30a40 72 79 20 66 6c 61 74 74 65 6e 65 72 20 6c 65 66  ry flattener lef
30a50 74 20 74 77 6f 20 64 69 66 66 65 72 65 6e 74 20  t two different 
30a60 43 54 45 20 74 61 62 6c 65 73 20 77 69 74 68 20  CTE tables with 
30a70 69 64 65 6e 74 69 63 61 6c 0a 20 20 20 20 20 20  identical.      
30a80 2a 2a 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20  ** names in the 
30a90 73 61 6d 65 20 46 52 4f 4d 20 63 6c 61 75 73 65  same FROM clause
30aa0 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69  . */.      conti
30ab0 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
30ac0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
30ad0 6d 70 61 72 65 28 30 2c 20 70 54 68 69 73 2d 3e  mpare(0, pThis->
30ae0 70 53 65 6c 65 63 74 2d 3e 70 57 68 65 72 65 2c  pSelect->pWhere,
30af0 20 70 53 31 2d 3e 70 57 68 65 72 65 2c 20 2d 31   pS1->pWhere, -1
30b00 29 0a 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65  ).     || sqlite
30b10 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20  3ExprCompare(0, 
30b20 70 54 68 69 73 2d 3e 70 53 65 6c 65 63 74 2d 3e  pThis->pSelect->
30b30 70 48 61 76 69 6e 67 2c 20 70 53 31 2d 3e 70 48  pHaving, pS1->pH
30b40 61 76 69 6e 67 2c 20 2d 31 29 20 0a 20 20 20 20  aving, -1) .    
30b50 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
30b60 76 69 65 77 20 77 61 73 20 6d 6f 64 69 66 69 65  view was modifie
30b70 64 20 62 79 20 73 6f 6d 65 20 6f 74 68 65 72 20  d by some other 
30b80 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 73 75 63  optimization suc
30b90 68 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 70 75  h as.      ** pu
30ba0 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73  shDownWhereTerms
30bb0 28 29 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74  () */.      cont
30bc0 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
30bd0 72 65 74 75 72 6e 20 70 49 74 65 6d 3b 0a 20 20  return pItem;.  
30be0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
30bf0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
30c00 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d  OUNTOFVIEW_OPTIM
30c10 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 41 74  IZATION./*.** At
30c20 74 65 6d 70 74 20 74 6f 20 74 72 61 6e 73 66 6f  tempt to transfo
30c30 72 6d 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  rm a query of th
30c40 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20  e form.**.**    
30c50 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
30c60 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 20 46  FROM (SELECT x F
30c70 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 41 4c 4c  ROM t1 UNION ALL
30c80 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74   SELECT y FROM t
30c90 32 29 0a 2a 2a 0a 2a 2a 20 49 6e 74 6f 20 74 68  2).**.** Into th
30ca0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  is:.**.**    SEL
30cb0 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 75 6e  ECT (SELECT coun
30cc0 74 28 2a 29 20 46 52 4f 4d 20 74 31 29 2b 28 53  t(*) FROM t1)+(S
30cd0 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
30ce0 52 4f 4d 20 74 32 29 0a 2a 2a 0a 2a 2a 20 54 68  ROM t2).**.** Th
30cf0 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  e transformation
30d00 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 61   only works if a
30d10 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
30d20 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
30d30 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20 73 75 62  .**   *  The sub
30d40 71 75 65 72 79 20 69 73 20 61 20 55 4e 49 4f 4e  query is a UNION
30d50 20 41 4c 4c 20 6f 66 20 74 77 6f 20 6f 72 20 6d   ALL of two or m
30d60 6f 72 65 20 74 65 72 6d 73 0a 2a 2a 20 20 20 2a  ore terms.**   *
30d70 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
30d80 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 4c  oes not have a L
30d90 49 4d 49 54 20 63 6c 61 75 73 65 0a 2a 2a 20 20  IMIT clause.**  
30da0 20 2a 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20   *  There is no 
30db0 57 48 45 52 45 20 6f 72 20 47 52 4f 55 50 20 42  WHERE or GROUP B
30dc0 59 20 6f 72 20 48 41 56 49 4e 47 20 63 6c 61 75  Y or HAVING clau
30dd0 73 65 73 20 6f 6e 20 74 68 65 20 73 75 62 71 75  ses on the subqu
30de0 65 72 69 65 73 0a 2a 2a 20 20 20 2a 20 20 54 68  eries.**   *  Th
30df0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
30e00 20 61 20 73 69 6d 70 6c 65 20 63 6f 75 6e 74 28   a simple count(
30e10 2a 29 20 77 69 74 68 20 6e 6f 20 57 48 45 52 45  *) with no WHERE
30e20 20 63 6c 61 75 73 65 20 6f 72 20 6f 74 68 65 72   clause or other
30e30 0a 2a 2a 20 20 20 20 20 20 65 78 74 72 61 6e 65  .**      extrane
30e40 6f 75 73 20 73 79 6e 74 61 78 2e 0a 2a 2a 0a 2a  ous syntax..**.*
30e50 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
30e60 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
30e70 6e 20 69 73 20 75 6e 64 65 72 74 61 6b 65 6e 2e  n is undertaken.
30e80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
30e90 6f 75 6e 74 4f 66 56 69 65 77 4f 70 74 69 6d 69  ountOfViewOptimi
30ea0 7a 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  zation(Parse *pP
30eb0 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
30ec0 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  {.  Select *pSub
30ed0 2c 20 2a 70 50 72 69 6f 72 3b 0a 20 20 45 78 70  , *pPrior;.  Exp
30ee0 72 20 2a 70 45 78 70 72 3b 0a 20 20 45 78 70 72  r *pExpr;.  Expr
30ef0 20 2a 70 43 6f 75 6e 74 3b 0a 20 20 73 71 6c 69   *pCount;.  sqli
30f00 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 28  te3 *db;.  if( (
30f10 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
30f20 5f 41 67 67 72 65 67 61 74 65 29 3d 3d 30 20 29  _Aggregate)==0 )
30f30 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20   return 0;   /* 
30f40 54 68 69 73 20 69 73 20 61 6e 20 61 67 67 72 65  This is an aggre
30f50 67 61 74 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d  gate */.  if( p-
30f60 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
30f70 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  1 ) return 0;   
30f80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
30f90 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c  ingle result col
30fa0 75 6d 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  umn */.  if( p->
30fb0 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20  pWhere ) return 
30fc0 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f  0;.  if( p->pGro
30fd0 75 70 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b  upBy ) return 0;
30fe0 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45  .  pExpr = p->pE
30ff0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
31000 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
31010 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p!=TK_AGG_FUNCTI
31020 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ON ) return 0;  
31030 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
31040 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  is an aggregate 
31050 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
31060 5f 73 74 72 69 63 6d 70 28 70 45 78 70 72 2d 3e  _stricmp(pExpr->
31070 75 2e 7a 54 6f 6b 65 6e 2c 22 63 6f 75 6e 74 22  u.zToken,"count"
31080 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  ) ) return 0;  /
31090 2a 20 49 73 20 63 6f 75 6e 74 28 29 20 2a 2f 0a  * Is count() */.
310a0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 78 2e 70    if( pExpr->x.p
310b0 4c 69 73 74 21 3d 30 20 29 20 72 65 74 75 72 6e  List!=0 ) return
310c0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
310d0 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63      /* Must be c
310e0 6f 75 6e 74 28 2a 29 20 2a 2f 0a 20 20 69 66 28  ount(*) */.  if(
310f0 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d   p->pSrc->nSrc!=
31100 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  1 ) return 0;   
31110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31120 2a 20 4f 6e 65 20 74 61 62 6c 65 20 69 6e 20 46  * One table in F
31130 52 4f 4d 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d  ROM  */.  pSub =
31140 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
31150 53 65 6c 65 63 74 3b 0a 20 20 69 66 28 20 70 53  Select;.  if( pS
31160 75 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ub==0 ) return 0
31170 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
31190 68 65 20 46 52 4f 4d 20 69 73 20 61 20 73 75 62  he FROM is a sub
311a0 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 70  query */.  if( p
311b0 53 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  Sub->pPrior==0 )
311c0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
311d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
311e0 4d 75 73 74 20 62 65 20 61 20 63 6f 6d 70 6f 75  Must be a compou
311f0 6e 64 20 72 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20  nd ry */.  do{. 
31200 20 20 20 69 66 28 20 70 53 75 62 2d 3e 6f 70 21     if( pSub->op!
31210 3d 54 4b 5f 41 4c 4c 20 26 26 20 70 53 75 62 2d  =TK_ALL && pSub-
31220 3e 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e  >pPrior ) return
31230 20 30 3b 20 20 2f 2a 20 4d 75 73 74 20 62 65 20   0;  /* Must be 
31240 55 4e 49 4f 4e 20 41 4c 4c 20 2a 2f 0a 20 20 20  UNION ALL */.   
31250 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72   if( pSub->pWher
31260 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
31270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31280 20 20 20 2f 2a 20 4e 6f 20 57 48 45 52 45 20 63     /* No WHERE c
31290 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 69 66 28  lause */.    if(
312a0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 20   pSub->pLimit ) 
312b0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
312c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
312d0 2a 20 4e 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73  * No LIMIT claus
312e0 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75  e */.    if( pSu
312f0 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
31300 5f 41 67 67 72 65 67 61 74 65 20 29 20 72 65 74  _Aggregate ) ret
31310 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 4e 6f  urn 0;     /* No
31320 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a  t an aggregate *
31330 2f 0a 20 20 20 20 70 53 75 62 20 3d 20 70 53 75  /.    pSub = pSu
31340 62 2d 3e 70 50 72 69 6f 72 3b 20 20 20 20 20 20  b->pPrior;      
31350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31360 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 65 61          /* Repea
31370 74 20 6f 76 65 72 20 63 6f 6d 70 6f 75 6e 64 20  t over compound 
31380 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 70 53 75  */.  }while( pSu
31390 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  b );..  /* If we
313a0 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
313b0 74 20 74 68 65 6e 20 69 74 20 69 73 20 4f 4b 20  t then it is OK 
313c0 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20 74  to perform the t
313d0 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  ransformation */
313e0 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ..  db = pParse-
313f0 3e 64 62 3b 0a 20 20 70 43 6f 75 6e 74 20 3d 20  >db;.  pCount = 
31400 70 45 78 70 72 3b 0a 20 20 70 45 78 70 72 20 3d  pExpr;.  pExpr =
31410 20 30 3b 0a 20 20 70 53 75 62 20 3d 20 70 2d 3e   0;.  pSub = p->
31420 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
31430 63 74 3b 0a 20 20 70 2d 3e 70 53 72 63 2d 3e 61  ct;.  p->pSrc->a
31440 5b 30 5d 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b  [0].pSelect = 0;
31450 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
31460 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
31470 53 72 63 29 3b 0a 20 20 70 2d 3e 70 53 72 63 20  Src);.  p->pSrc 
31480 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
31490 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62  cZero(pParse->db
314a0 2c 20 73 69 7a 65 6f 66 28 2a 70 2d 3e 70 53 72  , sizeof(*p->pSr
314b0 63 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 53  c));.  while( pS
314c0 75 62 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  ub ){.    Expr *
314d0 70 54 65 72 6d 3b 0a 20 20 20 20 70 50 72 69 6f  pTerm;.    pPrio
314e0 72 20 3d 20 70 53 75 62 2d 3e 70 50 72 69 6f 72  r = pSub->pPrior
314f0 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 50 72 69  ;.    pSub->pPri
31500 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62  or = 0;.    pSub
31510 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  ->pNext = 0;.   
31520 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
31530 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b  |= SF_Aggregate;
31540 0a 20 20 20 20 70 53 75 62 2d 3e 73 65 6c 46 6c  .    pSub->selFl
31550 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f  ags &= ~SF_Compo
31560 75 6e 64 3b 0a 20 20 20 20 70 53 75 62 2d 3e 6e  und;.    pSub->n
31570 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20  SelectRow = 0;. 
31580 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
31590 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75  stDelete(db, pSu
315a0 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
315b0 70 54 65 72 6d 20 3d 20 70 50 72 69 6f 72 20 3f  pTerm = pPrior ?
315c0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
315d0 64 62 2c 20 70 43 6f 75 6e 74 2c 20 30 29 20 3a  db, pCount, 0) :
315e0 20 70 43 6f 75 6e 74 3b 0a 20 20 20 20 70 53 75   pCount;.    pSu
315f0 62 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  b->pEList = sqli
31600 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
31610 64 28 70 50 61 72 73 65 2c 20 30 2c 20 70 54 65  d(pParse, 0, pTe
31620 72 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  rm);.    pTerm =
31630 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
31640 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43 54 2c  arse, TK_SELECT,
31650 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
31660 74 65 33 50 45 78 70 72 41 64 64 53 65 6c 65 63  te3PExprAddSelec
31670 74 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  t(pParse, pTerm,
31680 20 70 53 75 62 29 3b 0a 20 20 20 20 69 66 28 20   pSub);.    if( 
31690 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20  pExpr==0 ){.    
316a0 20 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 3b    pExpr = pTerm;
316b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
316c0 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
316d0 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
316e0 4b 5f 50 4c 55 53 2c 20 70 54 65 72 6d 2c 20 70  K_PLUS, pTerm, p
316f0 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Expr);.    }.   
31700 20 70 53 75 62 20 3d 20 70 50 72 69 6f 72 3b 0a   pSub = pPrior;.
31710 20 20 7d 0a 20 20 70 2d 3e 70 45 4c 69 73 74 2d    }.  p->pEList-
31720 3e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70 45  >a[0].pExpr = pE
31730 78 70 72 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  xpr;.  p->selFla
31740 67 73 20 26 3d 20 7e 53 46 5f 41 67 67 72 65 67  gs &= ~SF_Aggreg
31750 61 74 65 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54  ate;..#if SELECT
31760 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
31770 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
31780 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29  tTrace & 0x400 )
31790 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  {.    SELECTTRAC
317a0 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70  E(0x400,pParse,p
317b0 2c 28 22 41 66 74 65 72 20 63 6f 75 6e 74 2d 6f  ,("After count-o
317c0 66 2d 76 69 65 77 20 6f 70 74 69 6d 69 7a 61 74  f-view optimizat
317d0 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73  ion:\n"));.    s
317e0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
317f0 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
31800 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
31810 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
31820 2a 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46  * SQLITE_COUNTOF
31830 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  VIEW_OPTIMIZATIO
31840 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  N */../*.** Gene
31850 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
31860 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
31870 6e 74 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  nt given in the 
31880 70 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a  p argument.  .**
31890 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
318a0 61 72 65 20 72 65 74 75 72 6e 65 64 20 61 63 63  are returned acc
318b0 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 53 65  ording to the Se
318c0 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75  lectDest structu
318d0 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65  re..** See comme
318e0 6e 74 73 20 69 6e 20 73 71 6c 69 74 65 49 6e 74  nts in sqliteInt
318f0 2e 68 20 66 6f 72 20 66 75 72 74 68 65 72 20 69  .h for further i
31900 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nformation..**.*
31910 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
31920 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
31930 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66  r of errors.  If
31940 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a   any errors are.
31950 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  ** encountered, 
31960 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69  then an appropri
31970 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ate error messag
31980 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20  e is left in.** 
31990 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
319a0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
319b0 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65  ine does NOT fre
319c0 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72  e the Select str
319d0 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e  ucture passed in
319e0 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  .  The.** callin
319f0 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73  g function needs
31a00 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a   to do that..*/.
31a10 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
31a20 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
31a30 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
31a40 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
31a50 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
31a60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
31a70 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
31a80 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
31a90 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  d. */.  SelectDe
31aa0 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 20 2f  st *pDest      /
31ab0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
31ac0 68 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  h the query resu
31ad0 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
31ae0 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
31af0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
31b00 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ers */.  WhereIn
31b10 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
31b20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73  /* Return from s
31b30 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
31b40 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  () */.  Vdbe *v;
31b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31b60 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61  * The virtual ma
31b70 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73  chine under cons
31b80 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
31b90 74 20 69 73 41 67 67 3b 20 20 20 20 20 20 20 20  t isAgg;        
31ba0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
31bb0 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69   select lists li
31bc0 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f  ke "count(*)" */
31bd0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
31be0 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20 4c 69 73  ist = 0;  /* Lis
31bf0 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
31c00 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72  extract. */.  Sr
31c10 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
31c20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
31c30 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74  tables to select
31c40 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20   from */.  Expr 
31c50 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20  *pWhere;        
31c60 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
31c70 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
31c80 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
31c90 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20  t *pGroupBy;    
31ca0 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20  /* The GROUP BY 
31cb0 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
31cc0 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  NULL */.  Expr *
31cd0 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20  pHaving;        
31ce0 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63   /* The HAVING c
31cf0 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
31d00 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ULL */.  int rc 
31d10 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
31d20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
31d30 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  rn from this fun
31d40 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69  ction */.  Disti
31d50 6e 63 74 43 74 78 20 73 44 69 73 74 69 6e 63 74  nctCtx sDistinct
31d60 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77  ; /* Info on how
31d70 20 74 6f 20 63 6f 64 65 20 74 68 65 20 44 49 53   to code the DIS
31d80 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f  TINCT keyword */
31d90 0a 20 20 53 6f 72 74 43 74 78 20 73 53 6f 72 74  .  SortCtx sSort
31da0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66  ;         /* Inf
31db0 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65  o on how to code
31dc0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
31dd0 61 75 73 65 20 2a 2f 0a 20 20 41 67 67 49 6e 66  ause */.  AggInf
31de0 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20  o sAggInfo;     
31df0 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
31e00 75 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74  used by aggregat
31e10 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69  e queries */.  i
31e20 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20  nt iEnd;        
31e30 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
31e40 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74   of the end of t
31e50 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71  he query */.  sq
31e60 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
31e70 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
31e80 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
31e90 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
31ea0 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79 20 3d 20  MinMaxOrderBy = 
31eb0 30 3b 20 20 2f 2a 20 41 64 64 65 64 20 4f 52 44  0;  /* Added ORD
31ec0 45 52 20 42 59 20 66 6f 72 20 6d 69 6e 2f 6d 61  ER BY for min/ma
31ed0 78 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 75  x queries */.  u
31ee0 38 20 6d 69 6e 4d 61 78 46 6c 61 67 3b 20 20 20  8 minMaxFlag;   
31ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31f00 20 46 6c 61 67 20 66 6f 72 20 6d 69 6e 2f 6d 61   Flag for min/ma
31f10 78 20 71 75 65 72 69 65 73 20 2a 2f 0a 0a 20 20  x queries */..  
31f20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
31f30 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
31f40 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
31f50 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d   if( p==0 || db-
31f60 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
31f70 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b   pParse->nErr ){
31f80 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
31f90 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
31fa0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
31fb0 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c  , SQLITE_SELECT,
31fc0 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75   0, 0, 0) ) retu
31fd0 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26  rn 1;.  memset(&
31fe0 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a  sAggInfo, 0, siz
31ff0 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a  eof(sAggInfo));.
32000 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
32010 45 4e 41 42 4c 45 44 0a 20 20 53 45 4c 45 43 54  ENABLED.  SELECT
32020 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
32030 2c 20 28 22 62 65 67 69 6e 20 70 72 6f 63 65 73  , ("begin proces
32040 73 69 6e 67 3a 5c 6e 22 2c 20 70 50 61 72 73 65  sing:\n", pParse
32050 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 29 29 3b  ->addrExplain));
32060 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
32070 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30  lectTrace & 0x10
32080 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
32090 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
320a0 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , p, 0);.  }.#en
320b0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
320c0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ->pOrderBy==0 ||
320d0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
320e0 52 54 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a 20  RT_DistFifo );. 
320f0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
32100 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74  erBy==0 || pDest
32110 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 46 69 66  ->eDest!=SRT_Fif
32120 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  o );.  assert( p
32130 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ->pOrderBy==0 ||
32140 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
32150 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 3b 0a  RT_DistQueue );.
32160 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
32170 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73  derBy==0 || pDes
32180 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 51 75  t->eDest!=SRT_Qu
32190 65 75 65 20 29 3b 0a 20 20 69 66 28 20 49 67 6e  eue );.  if( Ign
321a0 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44  orableOrderby(pD
321b0 65 73 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65  est) ){.    asse
321c0 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  rt(pDest->eDest=
321d0 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70  =SRT_Exists || p
321e0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
321f0 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20  _Union || .     
32200 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65        pDest->eDe
32210 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c  st==SRT_Except |
32220 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
32230 53 52 54 5f 44 69 73 63 61 72 64 20 7c 7c 0a 20  SRT_Discard ||. 
32240 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d            pDest-
32250 3e 65 44 65 73 74 3d 3d 53 52 54 5f 51 75 65 75  >eDest==SRT_Queu
32260 65 20 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  e  || pDest->eDe
32270 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f  st==SRT_DistFifo
32280 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70   ||.           p
32290 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
322a0 5f 44 69 73 74 51 75 65 75 65 20 7c 7c 20 70 44  _DistQueue || pD
322b0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
322c0 46 69 66 6f 29 3b 0a 20 20 20 20 2f 2a 20 49 66  Fifo);.    /* If
322d0 20 4f 52 44 45 52 20 42 59 20 6d 61 6b 65 73 20   ORDER BY makes 
322e0 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e  no difference in
322f0 20 74 68 65 20 6f 75 74 70 75 74 20 74 68 65 6e   the output then
32300 20 6e 65 69 74 68 65 72 20 64 6f 65 73 0a 20 20   neither does.  
32310 20 20 2a 2a 20 44 49 53 54 49 4e 43 54 20 73 6f    ** DISTINCT so
32320 20 69 74 20 63 61 6e 20 62 65 20 72 65 6d 6f 76   it can be remov
32330 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73  ed too. */.    s
32340 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
32350 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64  lete(db, p->pOrd
32360 65 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f  erBy);.    p->pO
32370 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
32380 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  p->selFlags &= ~
32390 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d  SF_Distinct;.  }
323a0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
323b0 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Prep(pParse, p, 
323c0 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  0);.  if( pParse
323d0 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
323e0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
323f0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
32400 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  d;.  }.  assert(
32410 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b   p->pEList!=0 );
32420 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
32430 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
32440 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
32450 65 20 26 20 30 78 31 30 34 20 29 7b 0a 20 20 20  e & 0x104 ){.   
32460 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
32470 30 34 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 61  04,pParse,p, ("a
32480 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75  fter name resolu
32490 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  tion:\n"));.    
324a0 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
324b0 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
324c0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
324d0 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
324e0 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
324f0 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
32500 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29  Names(pParse, p)
32510 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
32520 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
32530 57 46 55 4e 43 0a 20 20 69 66 28 20 73 71 6c 69  WFUNC.  if( sqli
32540 74 65 33 57 69 6e 64 6f 77 52 65 77 72 69 74 65  te3WindowRewrite
32550 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20  (pParse, p) ){. 
32560 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
32570 6e 64 3b 0a 20 20 7d 0a 23 69 66 20 53 45 4c 45  nd;.  }.#if SELE
32580 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
32590 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
325a0 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30 38  ectTrace & 0x108
325b0 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52   ){.    SELECTTR
325c0 41 43 45 28 30 78 31 30 34 2c 70 50 61 72 73 65  ACE(0x104,pParse
325d0 2c 70 2c 20 28 22 61 66 74 65 72 20 77 69 6e 64  ,p, ("after wind
325e0 6f 77 20 72 65 77 72 69 74 65 3a 5c 6e 22 29 29  ow rewrite:\n"))
325f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
32600 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
32610 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
32620 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
32630 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
32640 43 20 2a 2f 0a 20 20 70 54 61 62 4c 69 73 74 20  C */.  pTabList 
32650 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 73 41  = p->pSrc;.  isA
32660 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67  gg = (p->selFlag
32670 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
32680 29 21 3d 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26  )!=0;.  memset(&
32690 73 53 6f 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66  sSort, 0, sizeof
326a0 28 73 53 6f 72 74 29 29 3b 0a 20 20 73 53 6f 72  (sSort));.  sSor
326b0 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e  t.pOrderBy = p->
326c0 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20  pOrderBy;..  /* 
326d0 54 72 79 20 74 6f 20 76 61 72 69 6f 75 73 20 6f  Try to various o
326e0 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 28 66 6c  ptimizations (fl
326f0 61 74 74 65 6e 69 6e 67 20 73 75 62 71 75 65 72  attening subquer
32700 69 65 73 2c 20 61 6e 64 20 73 74 72 65 6e 67 74  ies, and strengt
32710 68 0a 20 20 2a 2a 20 72 65 64 75 63 74 69 6f 6e  h.  ** reduction
32720 20 6f 66 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f   of join operato
32730 72 73 29 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  rs) in the FROM 
32740 63 6c 61 75 73 65 20 75 70 20 69 6e 74 6f 20 74  clause up into t
32750 68 65 20 6d 61 69 6e 20 71 75 65 72 79 0a 20 20  he main query.  
32760 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
32770 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
32780 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
32790 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
327a0 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21  EW).  for(i=0; !
327b0 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70  p->pPrior && i<p
327c0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
327d0 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
327e0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
327f0 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
32800 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63  >a[i];.    Selec
32810 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d  t *pSub = pItem-
32820 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 54 61  >pSelect;.    Ta
32830 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74 65  ble *pTab = pIte
32840 6d 2d 3e 70 54 61 62 3b 0a 0a 20 20 20 20 2f 2a  m->pTab;..    /*
32850 20 43 6f 6e 76 65 72 74 20 4c 45 46 54 20 4a 4f   Convert LEFT JO
32860 49 4e 20 69 6e 74 6f 20 4a 4f 49 4e 20 69 66 20  IN into JOIN if 
32870 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20  there are terms 
32880 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
32890 6c 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  le.    ** of the
328a0 20 4c 45 46 54 20 4a 4f 49 4e 20 75 73 65 64 20   LEFT JOIN used 
328b0 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
328c0 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  use..    */.    
328d0 69 66 28 20 28 70 49 74 65 6d 2d 3e 66 67 2e 6a  if( (pItem->fg.j
328e0 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
328f0 54 29 21 3d 30 0a 20 20 20 20 20 26 26 20 73 71  T)!=0.     && sq
32900 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
32910 4e 6f 6e 4e 75 6c 6c 52 6f 77 28 70 2d 3e 70 57  NonNullRow(p->pW
32920 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75  here, pItem->iCu
32930 72 73 6f 72 29 0a 20 20 20 20 20 26 26 20 4f 70  rsor).     && Op
32940 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
32950 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 69 6d  d(db, SQLITE_Sim
32960 70 6c 69 66 79 4a 6f 69 6e 29 0a 20 20 20 20 29  plifyJoin).    )
32970 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  {.      SELECTTR
32980 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65  ACE(0x100,pParse
32990 2c 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ,p,.            
329a0 20 20 20 20 28 22 4c 45 46 54 2d 4a 4f 49 4e 20      ("LEFT-JOIN 
329b0 73 69 6d 70 6c 69 66 69 65 73 20 74 6f 20 4a 4f  simplifies to JO
329c0 49 4e 20 6f 6e 20 74 65 72 6d 20 25 64 5c 6e 22  IN on term %d\n"
329d0 2c 69 29 29 3b 0a 20 20 20 20 20 20 70 49 74 65  ,i));.      pIte
329e0 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  m->fg.jointype &
329f0 3d 20 7e 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f  = ~(JT_LEFT|JT_O
32a00 55 54 45 52 29 3b 0a 20 20 20 20 20 20 75 6e 73  UTER);.      uns
32a10 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 57  etJoinExpr(p->pW
32a20 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75  here, pItem->iCu
32a30 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  rsor);.    }..  
32a40 20 20 2f 2a 20 4e 6f 20 66 75 74 68 65 72 20 61    /* No futher a
32a50 63 74 69 6f 6e 20 69 66 20 74 68 69 73 20 74 65  ction if this te
32a60 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  rm of the FROM c
32a70 6c 61 75 73 65 20 69 73 20 6e 6f 20 61 20 73 75  lause is no a su
32a80 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 69 66  bquery */.    if
32a90 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74  ( pSub==0 ) cont
32aa0 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 43 61  inue;..    /* Ca
32ab0 74 63 68 20 6d 69 73 6d 61 74 63 68 20 69 6e 20  tch mismatch in 
32ac0 74 68 65 20 64 65 63 6c 61 72 65 64 20 63 6f 6c  the declared col
32ad0 75 6d 6e 73 20 6f 66 20 61 20 76 69 65 77 20 61  umns of a view a
32ae0 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
32af0 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20  .    ** columns 
32b00 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 6f 6e  in the SELECT on
32b10 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 20 20   the RHS */.    
32b20 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 21 3d  if( pTab->nCol!=
32b30 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  pSub->pEList->nE
32b40 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  xpr ){.      sql
32b50 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
32b60 72 73 65 2c 20 22 65 78 70 65 63 74 65 64 20 25  rse, "expected %
32b70 64 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 27 25  d columns for '%
32b80 73 27 20 62 75 74 20 67 6f 74 20 25 64 22 2c 0a  s' but got %d",.
32b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ba0 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c        pTab->nCol
32bb0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70  , pTab->zName, p
32bc0 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  Sub->pEList->nEx
32bd0 70 72 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  pr);.      goto 
32be0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
32bf0 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  }..    /* Do not
32c00 20 74 72 79 20 74 6f 20 66 6c 61 74 74 65 6e 20   try to flatten 
32c10 61 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62  an aggregate sub
32c20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20  query..    **.  
32c30 20 20 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20    ** Flattening 
32c40 61 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62  an aggregate sub
32c50 71 75 65 72 79 20 69 73 20 6f 6e 6c 79 20 70 6f  query is only po
32c60 73 73 69 62 6c 65 20 69 66 20 74 68 65 20 6f 75  ssible if the ou
32c70 74 65 72 20 71 75 65 72 79 0a 20 20 20 20 2a 2a  ter query.    **
32c80 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 20   is not a join. 
32c90 20 42 75 74 20 69 66 20 74 68 65 20 6f 75 74 65   But if the oute
32ca0 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
32cb0 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68 65 20   join, then the 
32cc0 73 75 62 71 75 65 72 79 0a 20 20 20 20 2a 2a 20  subquery.    ** 
32cd0 77 69 6c 6c 20 62 65 20 69 6d 70 6c 65 6d 65 6e  will be implemen
32ce0 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74  ted as a co-rout
32cf0 69 6e 65 20 61 6e 64 20 74 68 65 72 65 20 69 73  ine and there is
32d00 20 6e 6f 20 61 64 76 61 6e 74 61 67 65 20 74 6f   no advantage to
32d10 0a 20 20 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69  .    ** flatteni
32d20 6e 67 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e  ng in that case.
32d30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
32d40 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20  (pSub->selFlags 
32d50 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21  & SF_Aggregate)!
32d60 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
32d70 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d     assert( pSub-
32d80 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a  >pGroupBy==0 );.
32d90 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
32da0 75 74 65 72 20 71 75 65 72 79 20 63 6f 6e 74 61  uter query conta
32db0 69 6e 73 20 61 20 22 63 6f 6d 70 6c 65 78 22 20  ins a "complex" 
32dc0 72 65 73 75 6c 74 20 73 65 74 20 28 74 68 61 74  result set (that
32dd0 20 69 73 2c 0a 20 20 20 20 2a 2a 20 69 66 20 74   is,.    ** if t
32de0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
32df0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
32e00 20 75 73 65 73 20 66 75 6e 63 74 69 6f 6e 73 20   uses functions 
32e10 6f 72 20 73 75 62 71 75 65 72 69 65 73 29 0a 20  or subqueries). 
32e20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65     ** and if the
32e30 20 73 75 62 71 75 65 72 79 20 63 6f 6e 74 61 69   subquery contai
32e40 6e 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  ns an ORDER BY c
32e50 6c 61 75 73 65 20 61 6e 64 20 69 66 0a 20 20 20  lause and if.   
32e60 20 2a 2a 20 69 74 20 77 69 6c 6c 20 62 65 20 69   ** it will be i
32e70 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
32e80 63 6f 2d 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e  co-routine, then
32e90 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e 2e   do not flatten.
32ea0 20 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 72 65    This.    ** re
32eb0 73 74 72 69 63 74 69 6f 6e 20 61 6c 6c 6f 77 73  striction allows
32ec0 20 53 51 4c 20 63 6f 6e 73 74 72 75 63 74 73 20   SQL constructs 
32ed0 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a  like this:.    *
32ee0 2a 0a 20 20 20 20 2a 2a 20 20 53 45 4c 45 43 54  *.    **  SELECT
32ef0 20 65 78 70 65 6e 73 69 76 65 5f 66 75 6e 63 74   expensive_funct
32f00 69 6f 6e 28 78 29 0a 20 20 20 20 2a 2a 20 20 20  ion(x).    **   
32f10 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 20   FROM (SELECT x 
32f20 46 52 4f 4d 20 74 61 62 20 4f 52 44 45 52 20 42  FROM tab ORDER B
32f30 59 20 79 20 4c 49 4d 49 54 20 31 30 29 3b 0a 20  Y y LIMIT 10);. 
32f40 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
32f50 20 65 78 70 65 6e 73 69 76 65 5f 66 75 6e 63 74   expensive_funct
32f60 69 6f 6e 28 29 20 69 73 20 6f 6e 6c 79 20 63 6f  ion() is only co
32f70 6d 70 75 74 65 64 20 6f 6e 20 74 68 65 20 31 30  mputed on the 10
32f80 20 72 6f 77 73 20 74 68 61 74 0a 20 20 20 20 2a   rows that.    *
32f90 2a 20 61 72 65 20 6f 75 74 70 75 74 2c 20 72 61  * are output, ra
32fa0 74 68 65 72 20 74 68 61 6e 20 65 76 65 72 79 20  ther than every 
32fb0 72 6f 77 20 6f 66 20 74 68 65 20 74 61 62 6c 65  row of the table
32fc0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
32fd0 54 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 20  The requirement 
32fe0 74 68 61 74 20 74 68 65 20 6f 75 74 65 72 20 71  that the outer q
32ff0 75 65 72 79 20 68 61 76 65 20 61 20 63 6f 6d 70  uery have a comp
33000 6c 65 78 20 72 65 73 75 6c 74 20 73 65 74 0a 20  lex result set. 
33010 20 20 20 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74     ** means that
33020 20 66 6c 61 74 74 65 6e 69 6e 67 20 64 6f 65 73   flattening does
33030 20 6f 63 63 75 72 20 6f 6e 20 73 69 6d 70 6c 65   occur on simple
33040 72 20 53 51 4c 20 63 6f 6e 73 74 72 61 69 6e 74  r SQL constraint
33050 73 20 77 69 74 68 6f 75 74 0a 20 20 20 20 2a 2a  s without.    **
33060 20 74 68 65 20 65 78 70 65 6e 73 69 76 65 5f 66   the expensive_f
33070 75 6e 63 74 69 6f 6e 28 29 20 6c 69 6b 65 3a 0a  unction() like:.
33080 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 53      **.    **  S
33090 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 28 53 45  ELECT x FROM (SE
330a0 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 20  LECT x FROM tab 
330b0 4f 52 44 45 52 20 42 59 20 79 20 4c 49 4d 49 54  ORDER BY y LIMIT
330c0 20 31 30 29 3b 0a 20 20 20 20 2a 2f 0a 20 20 20   10);.    */.   
330d0 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
330e0 72 42 79 21 3d 30 0a 20 20 20 20 20 26 26 20 69  rBy!=0.     && i
330f0 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 2d 3e  ==0.     && (p->
33100 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f  selFlags & SF_Co
33110 6d 70 6c 65 78 52 65 73 75 6c 74 29 21 3d 30 0a  mplexResult)!=0.
33120 20 20 20 20 20 26 26 20 28 70 54 61 62 4c 69 73       && (pTabLis
33130 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20  t->nSrc==1.     
33140 20 20 20 20 7c 7c 20 28 70 54 61 62 4c 69 73 74      || (pTabList
33150 2d 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79  ->a[1].fg.jointy
33160 70 65 26 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43  pe&(JT_LEFT|JT_C
33170 52 4f 53 53 29 29 21 3d 30 29 0a 20 20 20 20 29  ROSS))!=0).    )
33180 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
33190 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
331a0 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
331b0 28 70 50 61 72 73 65 2c 20 70 2c 20 69 2c 20 69  (pParse, p, i, i
331c0 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20 69  sAgg) ){.      i
331d0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
331e0 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
331f0 64 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  d;.      /* This
33200 20 73 75 62 71 75 65 72 79 20 63 61 6e 20 62 65   subquery can be
33210 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 69   absorbed into i
33220 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20  ts parent. */.  
33230 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20      i = -1;.    
33240 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d  }.    pTabList =
33250 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66   p->pSrc;.    if
33260 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
33270 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  ed ) goto select
33280 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 21 49  _end;.    if( !I
33290 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
332a0 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pDest) ){.      
332b0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
332c0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
332d0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
332e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
332f0 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
33300 45 43 54 0a 20 20 2f 2a 20 48 61 6e 64 6c 65 20  ECT.  /* Handle 
33310 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
33320 73 74 61 74 65 6d 65 6e 74 73 20 75 73 69 6e 67  statements using
33330 20 74 68 65 20 73 65 70 61 72 61 74 65 20 6d 75   the separate mu
33340 6c 74 69 53 65 6c 65 63 74 28 29 0a 20 20 2a 2a  ltiSelect().  **
33350 20 70 72 6f 63 65 64 75 72 65 2e 0a 20 20 2a 2f   procedure..  */
33360 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
33370 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c   ){.    rc = mul
33380 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  tiSelect(pParse,
33390 20 70 2c 20 70 44 65 73 74 29 3b 0a 23 69 66 20   p, pDest);.#if 
333a0 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
333b0 4c 45 44 0a 20 20 20 20 53 45 4c 45 43 54 54 52  LED.    SELECTTR
333c0 41 43 45 28 30 78 31 2c 70 50 61 72 73 65 2c 70  ACE(0x1,pParse,p
333d0 2c 28 22 65 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d  ,("end compound-
333e0 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e  select processin
333f0 67 5c 6e 22 29 29 3b 0a 20 20 20 20 69 66 28 20  g\n"));.    if( 
33400 28 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72  (sqlite3SelectTr
33410 61 63 65 20 26 20 30 78 32 30 30 30 29 21 3d 30  ace & 0x2000)!=0
33420 20 26 26 20 45 78 70 6c 61 69 6e 51 75 65 72 79   && ExplainQuery
33430 50 6c 61 6e 50 61 72 65 6e 74 28 70 50 61 72 73  PlanParent(pPars
33440 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  e)==0 ){.      s
33450 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
33460 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
33470 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
33480 69 66 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20  if( p->pNext==0 
33490 29 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c  ) ExplainQueryPl
334a0 61 6e 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  anPop(pParse);. 
334b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
334c0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  }.#endif..  /* D
334d0 6f 20 74 68 65 20 57 48 45 52 45 2d 63 6c 61 75  o the WHERE-clau
334e0 73 65 20 63 6f 6e 73 74 61 6e 74 20 70 72 6f 70  se constant prop
334f0 61 67 61 74 69 6f 6e 20 6f 70 74 69 6d 69 7a 61  agation optimiza
33500 74 69 6f 6e 20 69 66 20 74 68 69 73 20 69 73 0a  tion if this is.
33510 20 20 2a 2a 20 61 20 6a 6f 69 6e 2e 20 20 4e 6f    ** a join.  No
33520 20 6e 65 65 64 20 74 6f 20 73 70 65 65 64 20 74   need to speed t
33530 69 6d 65 20 6f 6e 20 74 68 69 73 20 6f 70 65 72  ime on this oper
33540 61 74 69 6f 6e 20 66 6f 72 20 6e 6f 6e 2d 6a 6f  ation for non-jo
33550 69 6e 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20  in queries.  ** 
33560 61 73 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  as the equivalen
33570 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77  t optimization w
33580 69 6c 6c 20 62 65 20 68 61 6e 64 6c 65 64 20 62  ill be handled b
33590 79 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20  y query planner 
335a0 69 6e 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 57  in.  ** sqlite3W
335b0 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 20 20 2a  hereBegin()..  *
335c0 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74  /.  if( pTabList
335d0 2d 3e 6e 53 72 63 3e 31 0a 20 20 20 26 26 20 4f  ->nSrc>1.   && O
335e0 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
335f0 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 50 72  ed(db, SQLITE_Pr
33600 6f 70 61 67 61 74 65 43 6f 6e 73 74 29 0a 20 20  opagateConst).  
33610 20 26 26 20 70 72 6f 70 61 67 61 74 65 43 6f 6e   && propagateCon
33620 73 74 61 6e 74 73 28 70 50 61 72 73 65 2c 20 70  stants(pParse, p
33630 29 0a 20 20 29 7b 0a 23 69 66 20 53 45 4c 45 43  ).  ){.#if SELEC
33640 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
33650 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
33660 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30  lectTrace & 0x10
33670 30 20 29 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  0 ){.      SELEC
33680 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61  TTRACE(0x100,pPa
33690 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 63 6f  rse,p,("After co
336a0 6e 73 74 61 6e 74 20 70 72 6f 70 61 67 61 74 69  nstant propagati
336b0 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  on:\n"));.      
336c0 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
336d0 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
336e0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
336f0 65 6c 73 65 7b 0a 20 20 20 20 53 45 4c 45 43 54  else{.    SELECT
33700 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72  TRACE(0x100,pPar
33710 73 65 2c 70 2c 28 22 43 6f 6e 73 74 61 6e 74 20  se,p,("Constant 
33720 70 72 6f 70 61 67 61 74 69 6f 6e 20 6e 6f 74 20  propagation not 
33730 68 65 6c 70 66 75 6c 5c 6e 22 29 29 3b 0a 20 20  helpful\n"));.  
33740 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
33750 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54  _COUNTOFVIEW_OPT
33760 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20  IMIZATION.  if( 
33770 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
33780 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51  led(db, SQLITE_Q
33790 75 65 72 79 46 6c 61 74 74 65 6e 65 72 7c 53 51  ueryFlattener|SQ
337a0 4c 49 54 45 5f 43 6f 75 6e 74 4f 66 56 69 65 77  LITE_CountOfView
337b0 29 0a 20 20 20 26 26 20 63 6f 75 6e 74 4f 66 56  ).   && countOfV
337c0 69 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28  iewOptimization(
337d0 70 50 61 72 73 65 2c 20 70 29 0a 20 20 29 7b 0a  pParse, p).  ){.
337e0 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
337f0 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
33800 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
33810 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
33820 73 74 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74  st;.    pTabList
33830 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 7d 0a   = p->pSrc;.  }.
33840 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 6f 72  #endif..  /* For
33850 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 74 68   each term in th
33860 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20 64  e FROM clause, d
33870 6f 20 74 77 6f 20 74 68 69 6e 67 73 3a 0a 20 20  o two things:.  
33880 2a 2a 20 28 31 29 20 41 75 74 68 6f 72 69 7a 65  ** (1) Authorize
33890 64 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 74  d unreferenced t
338a0 61 62 6c 65 73 0a 20 20 2a 2a 20 28 32 29 20 47  ables.  ** (2) G
338b0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
338c0 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73   all sub-queries
338d0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
338e0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
338f0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  c; i++){.    str
33900 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
33910 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c   *pItem = &pTabL
33920 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53  ist->a[i];.    S
33930 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a  electDest dest;.
33940 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62      Select *pSub
33950 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
33960 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
33970 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
33980 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
33990 57 29 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  W).    const cha
339a0 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e  r *zSavedAuthCon
339b0 74 65 78 74 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  text;.#endif..  
339c0 20 20 2f 2a 20 49 73 73 75 65 20 53 51 4c 49 54    /* Issue SQLIT
339d0 45 5f 52 45 41 44 20 61 75 74 68 6f 72 69 7a 61  E_READ authoriza
339e0 74 69 6f 6e 73 20 77 69 74 68 20 61 20 66 61 6b  tions with a fak
339f0 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 66 6f  e column name fo
33a00 72 20 61 6e 79 0a 20 20 20 20 2a 2a 20 74 61 62  r any.    ** tab
33a10 6c 65 73 20 74 68 61 74 20 61 72 65 20 72 65 66  les that are ref
33a20 65 72 65 6e 63 65 64 20 62 75 74 20 66 72 6f 6d  erenced but from
33a30 20 77 68 69 63 68 20 6e 6f 20 76 61 6c 75 65 73   which no values
33a40 20 61 72 65 20 65 78 74 72 61 63 74 65 64 2e 0a   are extracted..
33a50 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 73 20      ** Examples 
33a60 6f 66 20 77 68 65 72 65 20 74 68 65 73 65 20 6b  of where these k
33a70 69 6e 64 73 20 6f 66 20 6e 75 6c 6c 20 53 51 4c  inds of null SQL
33a80 49 54 45 5f 52 45 41 44 20 61 75 74 68 6f 72 69  ITE_READ authori
33a90 7a 61 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 77  zations.    ** w
33aa0 6f 75 6c 64 20 6f 63 63 75 72 3a 0a 20 20 20 20  ould occur:.    
33ab0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 45  **.    **     SE
33ac0 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
33ad0 4f 4d 20 74 31 3b 20 20 20 2d 2d 20 53 51 4c 49  OM t1;   -- SQLI
33ae0 54 45 5f 52 45 41 44 20 74 31 2e 22 22 0a 20 20  TE_READ t1."".  
33af0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
33b00 74 31 2e 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32  t1.* FROM t1, t2
33b10 3b 20 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52 45  ;   -- SQLITE_RE
33b20 41 44 20 74 32 2e 22 22 0a 20 20 20 20 2a 2a 0a  AD t2."".    **.
33b30 20 20 20 20 2a 2a 20 54 68 65 20 66 61 6b 65 20      ** The fake 
33b40 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 61  column name is a
33b50 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20  n empty string. 
33b60 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
33b70 66 6f 72 20 61 20 74 61 62 6c 65 20 74 6f 0a 20  for a table to. 
33b80 20 20 20 2a 2a 20 68 61 76 65 20 61 20 63 6f 6c     ** have a col
33b90 75 6d 6e 20 6e 61 6d 65 64 20 62 79 20 74 68 65  umn named by the
33ba0 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 69   empty string, i
33bb0 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65  n which case the
33bc0 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 0a  re is no way to.
33bd0 20 20 20 20 2a 2a 20 64 69 73 74 69 6e 67 75 69      ** distingui
33be0 73 68 20 62 65 74 77 65 65 6e 20 61 6e 20 75 6e  sh between an un
33bf0 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
33c00 20 61 6e 64 20 61 6e 20 61 63 74 75 61 6c 20 72   and an actual r
33c10 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a  eference to the.
33c20 20 20 20 20 2a 2a 20 22 22 20 63 6f 6c 75 6d 6e      ** "" column
33c30 2e 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  . The original d
33c40 65 73 69 67 6e 20 77 61 73 20 66 6f 72 20 74 68  esign was for th
33c50 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61  e fake column na
33c60 6d 65 20 74 6f 20 62 65 20 61 20 4e 55 4c 4c 2c  me to be a NULL,
33c70 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 77 6f  .    ** which wo
33c80 75 6c 64 20 62 65 20 75 6e 61 6d 62 69 67 75 6f  uld be unambiguo
33c90 75 73 2e 20 20 42 75 74 20 6c 65 67 61 63 79 20  us.  But legacy 
33ca0 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61  authorization ca
33cb0 6c 6c 62 61 63 6b 73 20 6d 69 67 68 74 0a 20 20  llbacks might.  
33cc0 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 65 20    ** assume the 
33cd0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 6e  column name is n
33ce0 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20 73 65 67 66  on-NULL and segf
33cf0 61 75 6c 74 2e 20 20 54 68 65 20 75 73 65 20 6f  ault.  The use o
33d00 66 20 61 6e 20 65 6d 70 74 79 0a 20 20 20 20 2a  f an empty.    *
33d10 2a 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65  * string for the
33d20 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d   fake column nam
33d30 65 20 73 65 65 6d 73 20 73 61 66 65 72 2e 0a 20  e seems safer.. 
33d40 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49     */.    if( pI
33d50 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3d 3d 30 20  tem->colUsed==0 
33d60 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21  && pItem->zName!
33d70 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
33d80 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
33d90 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 41 44  rse, SQLITE_READ
33da0 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20  , pItem->zName, 
33db0 22 22 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  "", pItem->zData
33dc0 62 61 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69  base);.    }..#i
33dd0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
33de0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
33df0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
33e00 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20  ITE_OMIT_VIEW). 
33e10 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
33e20 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d  ode for all sub-
33e30 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46  queries in the F
33e40 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 2a  ROM clause.    *
33e50 2f 0a 20 20 20 20 70 53 75 62 20 3d 20 70 49 74  /.    pSub = pIt
33e60 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  em->pSelect;.   
33e70 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63   if( pSub==0 ) c
33e80 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
33e90 20 54 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20   The code for a 
33ea0 73 75 62 71 75 65 72 79 20 73 68 6f 75 6c 64 20  subquery should 
33eb0 6f 6e 6c 79 20 62 65 20 67 65 6e 65 72 61 74 65  only be generate
33ec0 64 20 6f 6e 63 65 2c 20 74 68 6f 75 67 68 20 69  d once, though i
33ed0 74 20 69 73 0a 20 20 20 20 2a 2a 20 74 65 63 68  t is.    ** tech
33ee0 6e 69 63 61 6c 6c 79 20 68 61 72 6d 6c 65 73 73  nically harmless
33ef0 20 66 6f 72 20 69 74 20 74 6f 20 62 65 20 67 65   for it to be ge
33f00 6e 65 72 61 74 65 64 20 6d 75 6c 74 69 70 6c 65  nerated multiple
33f10 20 74 69 6d 65 73 2e 20 54 68 65 0a 20 20 20 20   times. The.    
33f20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  ** following ass
33f30 65 72 74 28 29 20 77 69 6c 6c 20 64 65 74 65 63  ert() will detec
33f40 74 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 63  t if something c
33f50 68 61 6e 67 65 73 20 74 6f 20 63 61 75 73 65 0a  hanges to cause.
33f60 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20      ** the same 
33f70 73 75 62 71 75 65 72 79 20 74 6f 20 62 65 20 63  subquery to be c
33f80 6f 64 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69  oded multiple ti
33f90 6d 65 73 2c 20 61 73 20 61 20 73 69 67 6e 61 6c  mes, as a signal
33fa0 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   to the.    ** d
33fb0 65 76 65 6c 6f 70 65 72 73 20 74 6f 20 74 72 79  evelopers to try
33fc0 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 65   to optimize the
33fd0 20 73 69 74 75 61 74 69 6f 6e 2e 0a 20 20 20 20   situation..    
33fe0 2a 2a 0a 20 20 20 20 2a 2a 20 55 70 64 61 74 65  **.    ** Update
33ff0 20 32 30 31 39 2d 30 37 2d 32 34 3a 0a 20 20 20   2019-07-24:.   
34000 20 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 20 68   ** See ticket h
34010 74 74 70 73 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72  ttps://sqlite.or
34020 67 2f 73 72 63 2f 74 6b 74 76 69 65 77 2f 63 35  g/src/tktview/c5
34030 32 62 30 39 63 37 66 33 38 39 30 33 62 31 33 31  2b09c7f38903b131
34040 31 63 65 63 34 30 2e 0a 20 20 20 20 2a 2a 20 54  1cec40..    ** T
34050 68 65 20 64 62 73 71 6c 66 75 7a 7a 20 66 75 7a  he dbsqlfuzz fuz
34060 7a 65 72 20 66 6f 75 6e 64 20 61 20 63 61 73 65  zer found a case
34070 20 77 68 65 72 65 20 74 68 65 20 73 61 6d 65 20   where the same 
34080 73 75 62 71 75 65 72 79 20 67 65 74 73 0a 20 20  subquery gets.  
34090 20 20 2a 2a 20 63 6f 64 65 64 20 74 77 69 63 65    ** coded twice
340a0 2e 20 20 53 6f 20 74 68 69 73 20 61 73 73 65 72  .  So this asser
340b0 74 28 29 20 6e 6f 77 20 62 65 63 6f 6d 65 73 20  t() now becomes 
340c0 61 20 74 65 73 74 63 61 73 65 28 29 2e 20 20 49  a testcase().  I
340d0 74 20 73 68 6f 75 6c 64 0a 20 20 20 20 2a 2a 20  t should.    ** 
340e0 62 65 20 76 65 72 79 20 72 61 72 65 2c 20 74 68  be very rare, th
340f0 6f 75 67 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ough..    */.   
34100 20 74 65 73 74 63 61 73 65 28 20 70 49 74 65 6d   testcase( pItem
34110 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 21 3d 30  ->addrFillSub!=0
34120 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72   );..    /* Incr
34130 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69  ement Parse.nHei
34140 67 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68  ght by the heigh
34150 74 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74  t of the largest
34160 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
34170 2a 2a 20 74 72 65 65 20 72 65 66 65 72 72 65 64  ** tree referred
34180 20 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65   to by this, the
34190 20 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20   parent select. 
341a0 54 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74  The child select
341b0 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74  .    ** may cont
341c0 61 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ain expression t
341d0 72 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a  rees of at most.
341e0 20 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d      ** (SQLITE_M
341f0 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61  AX_EXPR_DEPTH-Pa
34200 72 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69  rse.nHeight) hei
34210 67 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62  ght. This is a b
34220 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63  it.    ** more c
34230 6f 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e  onservative than
34240 20 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20   necessary, but 
34250 6d 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e  much easier than
34260 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a   enforcing.    *
34270 2a 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74  * an exact limit
34280 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
34290 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20  rse->nHeight += 
342a0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
342b0 72 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20  rHeight(p);..   
342c0 20 2f 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20   /* Make copies 
342d0 6f 66 20 63 6f 6e 73 74 61 6e 74 20 57 48 45 52  of constant WHER
342e0 45 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 20 69  E-clause terms i
342f0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
34300 79 20 64 6f 77 6e 0a 20 20 20 20 2a 2a 20 69 6e  y down.    ** in
34310 73 69 64 65 20 74 68 65 20 73 75 62 71 75 65 72  side the subquer
34320 79 2e 20 20 54 68 69 73 20 63 61 6e 20 68 65 6c  y.  This can hel
34330 70 20 74 68 65 20 73 75 62 71 75 65 72 79 20 74  p the subquery t
34340 6f 20 72 75 6e 20 6d 6f 72 65 20 65 66 66 69 63  o run more effic
34350 69 65 6e 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20  iently..    */. 
34360 20 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74     if( Optimizat
34370 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
34380 51 4c 49 54 45 5f 50 75 73 68 44 6f 77 6e 29 0a  QLITE_PushDown).
34390 20 20 20 20 20 26 26 20 70 75 73 68 44 6f 77 6e       && pushDown
343a0 57 68 65 72 65 54 65 72 6d 73 28 70 50 61 72 73  WhereTerms(pPars
343b0 65 2c 20 70 53 75 62 2c 20 70 2d 3e 70 57 68 65  e, pSub, p->pWhe
343c0 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  re, pItem->iCurs
343d0 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  or,.            
343e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
343f0 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  pItem->fg.jointy
34400 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
34410 30 29 0a 20 20 20 20 29 7b 0a 23 69 66 20 53 45  0).    ){.#if SE
34420 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
34430 44 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  D.      if( sqli
34440 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
34450 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 20 20   0x100 ){.      
34460 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
34470 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20  100,pParse,p,.  
34480 20 20 20 20 20 20 20 20 20 20 28 22 41 66 74 65            ("Afte
34490 72 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 70  r WHERE-clause p
344a0 75 73 68 2d 64 6f 77 6e 20 69 6e 74 6f 20 73 75  ush-down into su
344b0 62 71 75 65 72 79 20 25 64 3a 5c 6e 22 2c 20 70  bquery %d:\n", p
344c0 53 75 62 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20  Sub->selId));.  
344d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
344e0 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
344f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  , 0);.      }.#e
34500 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
34510 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43        SELECTTRAC
34520 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70  E(0x100,pParse,p
34530 2c 28 22 50 75 73 68 2d 64 6f 77 6e 20 6e 6f 74  ,("Push-down not
34540 20 70 6f 73 73 69 62 6c 65 5c 6e 22 29 29 3b 0a   possible\n"));.
34550 20 20 20 20 7d 0a 0a 20 20 20 20 7a 53 61 76 65      }..    zSave
34560 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  dAuthContext = p
34570 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
34580 65 78 74 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ext;.    pParse-
34590 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
345a0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20  pItem->zName;.. 
345b0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
345c0 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ode to implement
345d0 20 74 68 65 20 73 75 62 71 75 65 72 79 0a 20 20   the subquery.  
345e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
345f0 73 75 62 71 75 65 72 79 20 69 73 20 69 6d 70 6c  subquery is impl
34600 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d  emented as a co-
34610 72 6f 75 74 69 6e 65 20 69 66 20 74 68 65 20 73  routine if the s
34620 75 62 71 75 65 72 79 20 69 73 0a 20 20 20 20 2a  ubquery is.    *
34630 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  * guaranteed to 
34640 62 65 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  be the outer loo
34650 70 20 28 73 6f 20 74 68 61 74 20 69 74 20 64 6f  p (so that it do
34660 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
34670 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 75 74 65  e.    ** compute
34680 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65  d more than once
34690 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
346a0 54 4f 44 4f 3a 20 41 72 65 20 74 68 65 72 65 20  TODO: Are there 
346b0 6f 74 68 65 72 20 72 65 61 73 6f 6e 73 20 62 65  other reasons be
346c0 73 69 64 65 20 28 31 29 20 74 6f 20 75 73 65 20  side (1) to use 
346d0 61 20 63 6f 2d 72 6f 75 74 69 6e 65 0a 20 20 20  a co-routine.   
346e0 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   ** implementati
346f0 6f 6e 3f 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on?.    */.    i
34700 66 28 20 69 3d 3d 30 0a 20 20 20 20 20 26 26 20  f( i==0.     && 
34710 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d  (pTabList->nSrc=
34720 3d 31 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  =1.            |
34730 7c 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31  | (pTabList->a[1
34740 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a  ].fg.jointype&(J
34750 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29  T_LEFT|JT_CROSS)
34760 29 21 3d 30 29 20 20 2f 2a 20 28 31 29 20 2a 2f  )!=0)  /* (1) */
34770 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
34780 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d   Implement a co-
34790 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
347a0 6c 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c  l return a singl
347b0 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73  e row of the res
347c0 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74  ult.      ** set
347d0 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74   on each invocat
347e0 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
347f0 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 20      int addrTop 
34800 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
34810 72 65 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a 20  rentAddr(v)+1;. 
34820 20 20 20 20 0a 20 20 20 20 20 20 70 49 74 65 6d      .      pItem
34830 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  ->regReturn = ++
34840 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
34850 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
34860 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74  ddOp3(v, OP_Init
34870 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d  Coroutine, pItem
34880 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 30 2c 20  ->regReturn, 0, 
34890 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20  addrTop);.      
348a0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
348b0 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61  "%s", pItem->pTa
348c0 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
348d0 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c    pItem->addrFil
348e0 6c 53 75 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a  lSub = addrTop;.
348f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
34900 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
34910 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t, SRT_Coroutine
34920 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
34930 72 6e 29 3b 0a 20 20 20 20 20 20 45 78 70 6c 61  rn);.      Expla
34940 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
34950 72 73 65 2c 20 31 2c 20 22 43 4f 2d 52 4f 55 54  rse, 1, "CO-ROUT
34960 49 4e 45 20 25 75 22 2c 20 70 53 75 62 2d 3e 73  INE %u", pSub->s
34970 65 6c 49 64 29 29 3b 0a 20 20 20 20 20 20 73 71  elId));.      sq
34980 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
34990 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
349a0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70  ;.      pItem->p
349b0 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
349c0 3d 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52  = pSub->nSelectR
349d0 6f 77 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  ow;.      pItem-
349e0 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
349f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65   = 1;.      pIte
34a00 6d 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 64  m->regResult = d
34a10 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 20 20 20  est.iSdst;.     
34a20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43   sqlite3VdbeEndC
34a30 6f 72 6f 75 74 69 6e 65 28 76 2c 20 70 49 74 65  oroutine(v, pIte
34a40 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  m->regReturn);. 
34a50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
34a60 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
34a70 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 73 71  Top-1);.      sq
34a80 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65  lite3ClearTempRe
34a90 67 43 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a  gCache(pParse);.
34aa0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34ab0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
34ac0 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77  ubroutine that w
34ad0 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68 65  ill fill an ephe
34ae0 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 74 68  meral table with
34af0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  .      ** the co
34b00 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 73 75  ntent of this su
34b10 62 71 75 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e  bquery.  pItem->
34b20 61 64 64 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c  addrFillSub will
34b30 20 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20   point.      ** 
34b40 74 6f 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  to the address o
34b50 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  f the generated 
34b60 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 70 49 74  subroutine.  pIt
34b70 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20 20  em->regReturn.  
34b80 20 20 20 20 2a 2a 20 69 73 20 61 20 72 65 67 69      ** is a regi
34b90 73 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 74  ster allocated t
34ba0 6f 20 68 6f 6c 64 20 74 68 65 20 73 75 62 72 6f  o hold the subro
34bb0 75 74 69 6e 65 20 72 65 74 75 72 6e 20 61 64 64  utine return add
34bc0 72 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ress.      */.  
34bd0 20 20 20 20 69 6e 74 20 74 6f 70 41 64 64 72 3b      int topAddr;
34be0 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 41  .      int onceA
34bf0 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ddr = 0;.      i
34c00 6e 74 20 72 65 74 41 64 64 72 3b 0a 20 20 20 20  nt retAddr;.    
34c10 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
34c20 5f 69 74 65 6d 20 2a 70 50 72 69 6f 72 3b 0a 0a  _item *pPrior;..
34c30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
34c40 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
34c50 75 62 3d 3d 30 20 29 3b 20 2f 2a 20 54 69 63 6b  ub==0 ); /* Tick
34c60 65 74 20 63 35 32 62 30 39 63 37 66 33 38 39 30  et c52b09c7f3890
34c70 33 62 31 33 31 31 20 2a 2f 0a 20 20 20 20 20 20  3b1311 */.      
34c80 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
34c90 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
34ca0 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41 64 64 72  m;.      topAddr
34cb0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
34cc0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
34cd0 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65  er, 0, pItem->re
34ce0 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
34cf0 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
34d00 75 62 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a  ub = topAddr+1;.
34d10 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
34d20 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61 74 65 64  >fg.isCorrelated
34d30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
34d40 2a 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72  * If the subquer
34d50 79 20 69 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61  y is not correla
34d60 74 65 64 20 61 6e 64 20 69 66 20 77 65 20 61 72  ted and if we ar
34d70 65 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a  e not inside of.
34d80 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69          ** a tri
34d90 67 67 65 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e  gger, then we on
34da0 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75  ly need to compu
34db0 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  te the value of 
34dc0 74 68 65 20 73 75 62 71 75 65 72 79 0a 20 20 20  the subquery.   
34dd0 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f       ** once. */
34de0 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 41 64 64  .        onceAdd
34df0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
34e00 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65  ddOp0(v, OP_Once
34e10 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
34e20 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  v);.        Vdbe
34e30 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74  Comment((v, "mat
34e40 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22  erialize \"%s\""
34e50 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
34e60 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 65  Name));.      }e
34e70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 56 64 62  lse{.        Vdb
34e80 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
34e90 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c 22   "materialize \"
34ea0 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54  %s\"", pItem->pT
34eb0 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ab->zName));.   
34ec0 20 20 20 7d 0a 20 20 20 20 20 20 70 50 72 69 6f     }.      pPrio
34ed0 72 20 3d 20 69 73 53 65 6c 66 4a 6f 69 6e 56 69  r = isSelfJoinVi
34ee0 65 77 28 70 54 61 62 4c 69 73 74 2c 20 70 49 74  ew(pTabList, pIt
34ef0 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  em);.      if( p
34f00 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  Prior ){.       
34f10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
34f20 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70  p2(v, OP_OpenDup
34f30 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
34f40 2c 20 70 50 72 69 6f 72 2d 3e 69 43 75 72 73 6f  , pPrior->iCurso
34f50 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  r);.        asse
34f60 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 53 65 6c  rt( pPrior->pSel
34f70 65 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ect!=0 );.      
34f80 20 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52    pSub->nSelectR
34f90 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 70 53 65  ow = pPrior->pSe
34fa0 6c 65 63 74 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  lect->nSelectRow
34fb0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
34fc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
34fd0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
34fe0 73 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62  st, SRT_EphemTab
34ff0 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
35000 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 6c 61  );.        Expla
35010 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
35020 72 73 65 2c 20 31 2c 20 22 4d 41 54 45 52 49 41  rse, 1, "MATERIA
35030 4c 49 5a 45 20 25 75 22 2c 20 70 53 75 62 2d 3e  LIZE %u", pSub->
35040 73 65 6c 49 64 29 29 3b 0a 20 20 20 20 20 20 20  selId));.       
35050 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
35060 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65  Parse, pSub, &de
35070 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
35080 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e     pItem->pTab->
35090 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53 75  nRowLogEst = pSu
350a0 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  b->nSelectRow;. 
350b0 20 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64 64       if( onceAdd
350c0 72 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  r ) sqlite3VdbeJ
350d0 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65 41  umpHere(v, onceA
350e0 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74 41  ddr);.      retA
350f0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
35100 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
35110 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67  turn, pItem->reg
35120 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 56  Return);.      V
35130 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
35140 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e  end %s", pItem->
35150 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
35160 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
35170 43 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70 41  ChangeP1(v, topA
35180 64 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a 20  ddr, retAddr);. 
35190 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61       sqlite3Clea
351a0 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50  rTempRegCache(pP
351b0 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  arse);.    }.   
351c0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
351d0 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c  ailed ) goto sel
351e0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70 50 61  ect_end;.    pPa
351f0 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20  rse->nHeight -= 
35200 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
35210 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20 20 20  rHeight(p);.    
35220 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
35230 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74  text = zSavedAut
35240 68 43 6f 6e 74 65 78 74 3b 0a 23 65 6e 64 69 66  hContext;.#endif
35250 0a 20 20 7d 0a 0a 20 20 2f 2a 20 56 61 72 69 6f  .  }..  /* Vario
35260 75 73 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  us elements of t
35270 68 65 20 53 45 4c 45 43 54 20 63 6f 70 69 65 64  he SELECT copied
35280 20 69 6e 74 6f 20 6c 6f 63 61 6c 20 76 61 72 69   into local vari
35290 61 62 6c 65 73 20 66 6f 72 0a 20 20 2a 2a 20 63  ables for.  ** c
352a0 6f 6e 76 65 6e 69 65 6e 63 65 20 2a 2f 0a 20 20  onvenience */.  
352b0 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
352c0 73 74 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70  st;.  pWhere = p
352d0 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f  ->pWhere;.  pGro
352e0 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
352f0 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20  By;.  pHaving = 
35300 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44  p->pHaving;.  sD
35310 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d  istinct.isTnct =
35320 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
35330 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b  SF_Distinct)!=0;
35340 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ..#if SELECTTRAC
35350 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
35360 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
35370 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20  ce & 0x400 ){.  
35380 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
35390 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41  400,pParse,p,("A
353a0 66 74 65 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c  fter all FROM-cl
353b0 61 75 73 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e  ause analysis:\n
353c0 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
353d0 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
353e0 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , p, 0);.  }.#en
353f0 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
35400 20 71 75 65 72 79 20 69 73 20 44 49 53 54 49 4e   query is DISTIN
35410 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52  CT with an ORDER
35420 20 42 59 20 62 75 74 20 69 73 20 6e 6f 74 20 61   BY but is not a
35430 6e 20 61 67 67 72 65 67 61 74 65 2c 20 61 6e 64  n aggregate, and
35440 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 73 65   .  ** if the se
35450 6c 65 63 74 2d 6c 69 73 74 20 69 73 20 74 68 65  lect-list is the
35460 20 73 61 6d 65 20 61 73 20 74 68 65 20 4f 52 44   same as the ORD
35470 45 52 20 42 59 20 6c 69 73 74 2c 20 74 68 65 6e  ER BY list, then
35480 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2a   this query.  **
35490 20 63 61 6e 20 62 65 20 72 65 77 72 69 74 74 65   can be rewritte
354a0 6e 20 61 73 20 61 20 47 52 4f 55 50 20 42 59 2e  n as a GROUP BY.
354b0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
354c0 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   this:.  **.  **
354d0 20 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54       SELECT DIST
354e0 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e  INCT xyz FROM ..
354f0 2e 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20  . ORDER BY xyz. 
35500 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e   **.  ** is tran
35510 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a  sformed to:.  **
35520 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
35530 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52   xyz FROM ... GR
35540 4f 55 50 20 42 59 20 78 79 7a 20 4f 52 44 45 52  OUP BY xyz ORDER
35550 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a   BY xyz.  **.  *
35560 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  * The second for
35570 6d 20 69 73 20 70 72 65 66 65 72 72 65 64 20 61  m is preferred a
35580 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65 78  s a single index
35590 20 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c 65 29   (or temp-table)
355a0 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20 75 73   may be .  ** us
355b0 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20  ed for both the 
355c0 4f 52 44 45 52 20 42 59 20 61 6e 64 20 44 49 53  ORDER BY and DIS
355d0 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69 6e 67  TINCT processing
355e0 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20  . As originally 
355f0 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 68  .  ** written th
35600 65 20 71 75 65 72 79 20 6d 75 73 74 20 75 73 65  e query must use
35610 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f   a temp-table fo
35620 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  r at least one o
35630 66 20 74 68 65 20 4f 52 44 45 52 20 0a 20 20 2a  f the ORDER .  *
35640 2a 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43  * BY and DISTINC
35650 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65 78 20  T, and an index 
35660 6f 72 20 73 65 70 61 72 61 74 65 20 74 65 6d 70  or separate temp
35670 2d 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6f  -table for the o
35680 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ther..  */.  if(
35690 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
356a0 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
356b0 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
356c0 44 69 73 74 69 6e 63 74 20 0a 20 20 20 26 26 20  Distinct .   && 
356d0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
356e0 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e 70 4f 72  ompare(sSort.pOr
356f0 64 65 72 42 79 2c 20 70 45 4c 69 73 74 2c 20 2d  derBy, pEList, -
35700 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70  1)==0.  ){.    p
35710 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
35720 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20  F_Distinct;.    
35730 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
35740 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
35750 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
35760 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20  pEList, 0);.    
35770 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 65  /* Notice that e
35780 76 65 6e 20 74 68 6f 75 67 68 74 20 53 46 5f 44  ven thought SF_D
35790 69 73 74 69 6e 63 74 20 68 61 73 20 62 65 65 6e  istinct has been
357a0 20 63 6c 65 61 72 65 64 20 66 72 6f 6d 20 70 2d   cleared from p-
357b0 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20 2a  >selFlags,.    *
357c0 2a 20 74 68 65 20 73 44 69 73 74 69 6e 63 74 2e  * the sDistinct.
357d0 69 73 54 6e 63 74 20 69 73 20 73 74 69 6c 6c 20  isTnct is still 
357e0 73 65 74 2e 20 20 48 65 6e 63 65 2c 20 69 73 54  set.  Hence, isT
357f0 6e 63 74 20 72 65 70 72 65 73 65 6e 74 73 20 74  nct represents t
35800 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e  he.    ** origin
35810 61 6c 20 73 65 74 74 69 6e 67 20 6f 66 20 74 68  al setting of th
35820 65 20 53 46 5f 44 69 73 74 69 6e 63 74 20 66 6c  e SF_Distinct fl
35830 61 67 2c 20 6e 6f 74 20 74 68 65 20 63 75 72 72  ag, not the curr
35840 65 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20  ent setting */. 
35850 20 20 20 61 73 73 65 72 74 28 20 73 44 69 73 74     assert( sDist
35860 69 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b 0a 0a  inct.isTnct );..
35870 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
35880 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20  ENABLED.    if( 
35890 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
358a0 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20  ce & 0x400 ){.  
358b0 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
358c0 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28  0x400,pParse,p,(
358d0 22 54 72 61 6e 73 66 6f 72 6d 20 44 49 53 54 49  "Transform DISTI
358e0 4e 43 54 20 69 6e 74 6f 20 47 52 4f 55 50 20 42  NCT into GROUP B
358f0 59 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 73  Y:\n"));.      s
35900 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
35910 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
35920 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
35930 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
35940 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
35950 61 75 73 65 2c 20 74 68 65 6e 20 63 72 65 61 74  ause, then creat
35960 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69  e an ephemeral i
35970 6e 64 65 78 20 74 6f 0a 20 20 2a 2a 20 64 6f 20  ndex to.  ** do 
35980 74 68 65 20 73 6f 72 74 69 6e 67 2e 20 20 42 75  the sorting.  Bu
35990 74 20 74 68 69 73 20 73 6f 72 74 69 6e 67 20 65  t this sorting e
359a0 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 6d  phemeral index m
359b0 69 67 68 74 20 65 6e 64 20 75 70 0a 20 20 2a 2a  ight end up.  **
359c0 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20 69 66   being unused if
359d0 20 74 68 65 20 64 61 74 61 20 63 61 6e 20 62 65   the data can be
359e0 20 65 78 74 72 61 63 74 65 64 20 69 6e 20 70 72   extracted in pr
359f0 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 0a  e-sorted order..
35a00 20 20 2a 2a 20 49 66 20 74 68 61 74 20 69 73 20    ** If that is 
35a10 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74  the case, then t
35a20 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
35a30 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
35a40 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 63 68 61  will be.  ** cha
35a50 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f  nged to an OP_No
35a60 6f 70 20 6f 6e 63 65 20 77 65 20 66 69 67 75 72  op once we figur
35a70 65 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 73  e out that the s
35a80 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73 0a  orting index is.
35a90 20 20 2a 2a 20 6e 6f 74 20 6e 65 65 64 65 64 2e    ** not needed.
35aa0 20 20 54 68 65 20 73 53 6f 72 74 2e 61 64 64 72    The sSort.addr
35ab0 53 6f 72 74 49 6e 64 65 78 20 76 61 72 69 61 62  SortIndex variab
35ac0 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 66 61  le is used to fa
35ad0 63 69 6c 69 74 61 74 65 0a 20 20 2a 2a 20 74 68  cilitate.  ** th
35ae0 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a  at change..  */.
35af0 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64    if( sSort.pOrd
35b00 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49  erBy ){.    KeyI
35b10 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
35b20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
35b30 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d  lite3KeyInfoFrom
35b40 45 78 70 72 4c 69 73 74 28 0a 20 20 20 20 20 20  ExprList(.      
35b50 20 20 70 50 61 72 73 65 2c 20 73 53 6f 72 74 2e    pParse, sSort.
35b60 70 4f 72 64 65 72 42 79 2c 20 30 2c 20 70 45 4c  pOrderBy, 0, pEL
35b70 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
35b80 20 73 53 6f 72 74 2e 69 45 43 75 72 73 6f 72 20   sSort.iECursor 
35b90 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
35ba0 3b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72  ;.    sSort.addr
35bb0 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20  SortIndex =.    
35bc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
35bd0 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
35be0 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20  hemeral,.       
35bf0 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73 6f     sSort.iECurso
35c00 72 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  r, sSort.pOrderB
35c10 79 2d 3e 6e 45 78 70 72 2b 31 2b 70 45 4c 69 73  y->nExpr+1+pELis
35c20 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a 20 20 20  t->nExpr, 0,.   
35c30 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
35c40 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
35c50 46 4f 0a 20 20 20 20 20 20 29 3b 0a 20 20 7d 65  FO.      );.  }e
35c60 6c 73 65 7b 0a 20 20 20 20 73 53 6f 72 74 2e 61  lse{.    sSort.a
35c70 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d  ddrSortIndex = -
35c80 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
35c90 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64 65  the output is de
35ca0 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d  stined for a tem
35cb0 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70  porary table, op
35cc0 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20  en that table.. 
35cd0 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d   */.  if( pDest-
35ce0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65  >eDest==SRT_Ephe
35cf0 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  mTab ){.    sqli
35d00 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
35d10 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
35d20 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  l, pDest->iSDPar
35d30 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  m, pEList->nExpr
35d40 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  );.  }..  /* Set
35d50 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20   the limiter..  
35d60 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c 69  */.  iEnd = sqli
35d70 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
35d80 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
35d90 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
35da0 46 5f 46 69 78 65 64 4c 69 6d 69 74 29 3d 3d 30  F_FixedLimit)==0
35db0 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65   ){.    p->nSele
35dc0 63 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a  ctRow = 320;  /*
35dd0 20 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20   4 billion rows 
35de0 2a 2f 0a 20 20 7d 0a 20 20 63 6f 6d 70 75 74 65  */.  }.  compute
35df0 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
35e00 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b  Parse, p, iEnd);
35e10 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
35e20 3d 3d 30 20 26 26 20 73 53 6f 72 74 2e 61 64 64  ==0 && sSort.add
35e30 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b  rSortIndex>=0 ){
35e40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
35e50 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20  ChangeOpcode(v, 
35e60 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
35e70 64 65 78 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70  dex, OP_SorterOp
35e80 65 6e 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73  en);.    sSort.s
35e90 6f 72 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54  ortFlags |= SORT
35ea0 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a  FLAG_UseSorter;.
35eb0 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61    }..  /* Open a
35ec0 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65  n ephemeral inde
35ed0 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  x to use for the
35ee0 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20   distinct set.. 
35ef0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
35f00 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
35f10 6e 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74  nct ){.    sDist
35f20 69 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70  inct.tabTnct = p
35f30 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
35f40 20 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64     sDistinct.add
35f50 72 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56  rTnct = sqlite3V
35f60 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
35f70 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20  OpenEphemeral,. 
35f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35f90 20 20 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e        sDistinct.
35fa0 74 61 62 54 6e 63 74 2c 20 30 2c 20 30 2c 0a 20  tabTnct, 0, 0,. 
35fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35fc0 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c        (char*)sql
35fd0 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45  ite3KeyInfoFromE
35fe0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
35ff0 70 2d 3e 70 45 4c 69 73 74 2c 30 2c 30 29 2c 0a  p->pEList,0,0),.
36000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36010 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46         P4_KEYINF
36020 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  O);.    sqlite3V
36030 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42  dbeChangeP5(v, B
36040 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b  TREE_UNORDERED);
36050 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65  .    sDistinct.e
36060 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52 45  TnctType = WHERE
36070 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45  _DISTINCT_UNORDE
36080 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  RED;.  }else{.  
36090 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63    sDistinct.eTnc
360a0 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49  tType = WHERE_DI
360b0 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d  STINCT_NOOP;.  }
360c0 0a 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 26  ..  if( !isAgg &
360d0 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b  & pGroupBy==0 ){
360e0 0a 20 20 20 20 2f 2a 20 4e 6f 20 61 67 67 72 65  .    /* No aggre
360f0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  gate functions a
36100 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63  nd no GROUP BY c
36110 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 75 31 36  lause */.    u16
36120 20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 28 73   wctrlFlags = (s
36130 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
36140 3f 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  ? WHERE_WANT_DIS
36150 54 49 4e 43 54 20 3a 20 30 29 0a 20 20 20 20 20  TINCT : 0).     
36160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
36170 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
36180 46 5f 46 69 78 65 64 4c 69 6d 69 74 29 3b 0a 23  F_FixedLimit);.#
36190 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
361a0 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20  IT_WINDOWFUNC.  
361b0 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 20 3d    Window *pWin =
361c0 20 70 2d 3e 70 57 69 6e 3b 20 20 20 20 20 20 2f   p->pWin;      /
361d0 2a 20 4d 61 73 74 65 72 20 77 69 6e 64 6f 77 20  * Master window 
361e0 6f 62 6a 65 63 74 20 28 6f 72 20 4e 55 4c 4c 29  object (or NULL)
361f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 69 6e   */.    if( pWin
36200 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
36210 33 57 69 6e 64 6f 77 43 6f 64 65 49 6e 69 74 28  3WindowCodeInit(
36220 70 50 61 72 73 65 2c 20 70 57 69 6e 29 3b 0a 20  pParse, pWin);. 
36230 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
36240 61 73 73 65 72 74 28 20 57 48 45 52 45 5f 55 53  assert( WHERE_US
36250 45 5f 4c 49 4d 49 54 3d 3d 53 46 5f 46 69 78 65  E_LIMIT==SF_Fixe
36260 64 4c 69 6d 69 74 20 29 3b 0a 0a 0a 20 20 20 20  dLimit );...    
36270 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74  /* Begin the dat
36280 61 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20  abase scan. */. 
36290 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31     SELECTTRACE(1
362a0 2c 70 50 61 72 73 65 2c 70 2c 28 22 57 68 65 72  ,pParse,p,("Wher
362b0 65 42 65 67 69 6e 5c 6e 22 29 29 3b 0a 20 20 20  eBegin\n"));.   
362c0 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
362d0 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
362e0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
362f0 68 65 72 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64  here, sSort.pOrd
36300 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20  erBy,.          
36310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36320 20 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 2c 20       p->pEList, 
36330 77 63 74 72 6c 46 6c 61 67 73 2c 20 70 2d 3e 6e  wctrlFlags, p->n
36340 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20  SelectRow);.    
36350 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
36360 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
36370 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
36380 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f  WhereOutputRowCo
36390 75 6e 74 28 70 57 49 6e 66 6f 29 20 3c 20 70 2d  unt(pWInfo) < p-
363a0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20  >nSelectRow ){. 
363b0 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
363c0 6f 77 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  ow = sqlite3Wher
363d0 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28  eOutputRowCount(
363e0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20  pWInfo);.    }. 
363f0 20 20 20 69 66 28 20 73 44 69 73 74 69 6e 63 74     if( sDistinct
36400 2e 69 73 54 6e 63 74 20 26 26 20 73 71 6c 69 74  .isTnct && sqlit
36410 65 33 57 68 65 72 65 49 73 44 69 73 74 69 6e 63  e3WhereIsDistinc
36420 74 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20  t(pWInfo) ){.   
36430 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e     sDistinct.eTn
36440 63 74 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33  ctType = sqlite3
36450 57 68 65 72 65 49 73 44 69 73 74 69 6e 63 74 28  WhereIsDistinct(
36460 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20  pWInfo);.    }. 
36470 20 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72     if( sSort.pOr
36480 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73  derBy ){.      s
36490 53 6f 72 74 2e 6e 4f 42 53 61 74 20 3d 20 73 71  Sort.nOBSat = sq
364a0 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65  lite3WhereIsOrde
364b0 72 65 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  red(pWInfo);.   
364c0 20 20 20 73 53 6f 72 74 2e 6c 61 62 65 6c 4f 42     sSort.labelOB
364d0 4c 6f 70 74 20 3d 20 73 71 6c 69 74 65 33 57 68  Lopt = sqlite3Wh
364e0 65 72 65 4f 72 64 65 72 42 79 4c 69 6d 69 74 4f  ereOrderByLimitO
364f0 70 74 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 3b  ptLabel(pWInfo);
36500 0a 20 20 20 20 20 20 69 66 28 20 73 53 6f 72 74  .      if( sSort
36510 2e 6e 4f 42 53 61 74 3d 3d 73 53 6f 72 74 2e 70  .nOBSat==sSort.p
36520 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29  OrderBy->nExpr )
36530 7b 0a 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e  {.        sSort.
36540 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
36550 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
36560 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20 69   /* If sorting i
36570 6e 64 65 78 20 74 68 61 74 20 77 61 73 20 63 72  ndex that was cr
36580 65 61 74 65 64 20 62 79 20 61 20 70 72 69 6f 72  eated by a prior
36590 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
365a0 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75  l .    ** instru
365b0 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e  ction ended up n
365c0 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64 2c  ot being needed,
365d0 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65   then change the
365e0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
365f0 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e  l.    ** into an
36600 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f   OP_Noop..    */
36610 0a 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e 61  .    if( sSort.a
36620 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20  ddrSortIndex>=0 
36630 26 26 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  && sSort.pOrderB
36640 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  y==0 ){.      sq
36650 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
36660 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61  oNoop(v, sSort.a
36670 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20  ddrSortIndex);. 
36680 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
36690 28 20 70 2d 3e 70 45 4c 69 73 74 3d 3d 70 45 4c  ( p->pEList==pEL
366a0 69 73 74 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  ist );.#ifndef S
366b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
366c0 57 46 55 4e 43 0a 20 20 20 20 69 66 28 20 70 57  WFUNC.    if( pW
366d0 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  in ){.      int 
366e0 61 64 64 72 47 6f 73 75 62 20 3d 20 73 71 6c 69  addrGosub = sqli
366f0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
36700 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
36710 69 6e 74 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69  int iCont = sqli
36720 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
36730 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
36740 69 6e 74 20 69 42 72 65 61 6b 20 3d 20 73 71 6c  int iBreak = sql
36750 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
36760 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
36770 20 69 6e 74 20 72 65 67 47 6f 73 75 62 20 3d 20   int regGosub = 
36780 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
36790 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 69  .      sqlite3Wi
367a0 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 70 50 61  ndowCodeStep(pPa
367b0 72 73 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c 20  rse, p, pWInfo, 
367c0 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f  regGosub, addrGo
367d0 73 75 62 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  sub);..      sql
367e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
367f0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42  , OP_Goto, 0, iB
36800 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
36810 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
36820 61 62 65 6c 28 76 2c 20 61 64 64 72 47 6f 73 75  abel(v, addrGosu
36830 62 29 3b 0a 20 20 20 20 20 20 56 64 62 65 4e 6f  b);.      VdbeNo
36840 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  opComment((v, "i
36850 6e 6e 65 72 2d 6c 6f 6f 70 20 73 75 62 72 6f 75  nner-loop subrou
36860 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 20 20 73  tine"));.      s
36870 53 6f 72 74 2e 6c 61 62 65 6c 4f 42 4c 6f 70 74  Sort.labelOBLopt
36880 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 65 6c 65   = 0;.      sele
36890 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
368a0 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73 53 6f 72  se, p, -1, &sSor
368b0 74 2c 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70  t, &sDistinct, p
368c0 44 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72  Dest, iCont, iBr
368d0 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
368e0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
368f0 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
36900 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
36910 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
36920 75 72 6e 2c 20 72 65 67 47 6f 73 75 62 29 3b 0a  urn, regGosub);.
36930 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
36940 74 28 28 76 2c 20 22 65 6e 64 20 69 6e 6e 65 72  t((v, "end inner
36950 2d 6c 6f 6f 70 20 73 75 62 72 6f 75 74 69 6e 65  -loop subroutine
36960 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
36970 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
36980 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
36990 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20     }else.#endif 
369a0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
369b0 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 20 20 20  INDOWFUNC */.   
369c0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 55 73 65 20   {.      /* Use 
369d0 74 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e  the standard inn
369e0 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20  er loop. */.    
369f0 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
36a00 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c  p(pParse, p, -1,
36a10 20 26 73 53 6f 72 74 2c 20 26 73 44 69 73 74 69   &sSort, &sDisti
36a20 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20  nct, pDest,.    
36a30 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
36a40 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28  reContinueLabel(
36a50 70 57 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20  pWInfo),.       
36a60 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42     sqlite3WhereB
36a70 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f  reakLabel(pWInfo
36a80 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e  ));..      /* En
36a90 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
36aa0 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 20  can loop..      
36ab0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
36ac0 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
36ad0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
36ae0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73  .    /* This cas
36af0 65 20 77 68 65 6e 20 74 68 65 72 65 20 65 78 69  e when there exi
36b00 73 74 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  st aggregate fun
36b10 63 74 69 6f 6e 73 20 6f 72 20 61 20 47 52 4f 55  ctions or a GROU
36b20 50 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20  P BY clause.    
36b30 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a 20 20  ** or both */.  
36b40 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
36b50 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  C;    /* Name co
36b60 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73  ntext for proces
36b70 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 20 69  sing aggregate i
36b80 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
36b90 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20    int iAMem;    
36ba0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
36bb0 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 73  em address for s
36bc0 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47  toring current G
36bd0 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69  ROUP BY */.    i
36be0 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20  nt iBMem;       
36bf0 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
36c00 61 64 64 72 65 73 73 20 66 6f 72 20 70 72 65 76  address for prev
36c10 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f  ious GROUP BY */
36c20 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61  .    int iUseFla
36c30 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20  g;       /* Mem 
36c40 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20  address holding 
36c50 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20  flag indicating 
36c60 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20  that at least.  
36c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36c80 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77        ** one row
36c90 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f   of the input to
36ca0 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 20   the aggregator 
36cb0 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20  has been.       
36cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36cd0 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f   ** processed */
36ce0 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46  .    int iAbortF
36cf0 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20  lag;     /* Mem 
36d00 61 64 64 72 65 73 73 20 77 68 69 63 68 20 63 61  address which ca
36d10 75 73 65 73 20 71 75 65 72 79 20 61 62 6f 72 74  uses query abort
36d20 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a   if positive */.
36d30 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53      int groupByS
36d40 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20  ort;    /* Rows 
36d50 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65  come from source
36d60 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64   in GROUP BY ord
36d70 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  er */.    int ad
36d80 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a  drEnd;        /*
36d90 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73 69   End of processi
36da0 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45  ng for this SELE
36db0 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f  CT */.    int so
36dc0 72 74 50 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a  rtPTab = 0;   /*
36dd0 20 50 73 65 75 64 6f 74 61 62 6c 65 20 75 73 65   Pseudotable use
36de0 64 20 74 6f 20 64 65 63 6f 64 65 20 73 6f 72 74  d to decode sort
36df0 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ing results */. 
36e00 20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74 20 3d     int sortOut =
36e10 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70 75 74   0;    /* Output
36e20 20 72 65 67 69 73 74 65 72 20 66 72 6f 6d 20 74   register from t
36e30 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20  he sorter */.   
36e40 20 69 6e 74 20 6f 72 64 65 72 42 79 47 72 70 20   int orderByGrp 
36e50 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69 66 20  = 0; /* True if 
36e60 74 68 65 20 47 52 4f 55 50 20 42 59 20 61 6e 64  the GROUP BY and
36e70 20 4f 52 44 45 52 20 42 59 20 61 72 65 20 74 68   ORDER BY are th
36e80 65 20 73 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 2f  e same */..    /
36e90 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64  * Remove any and
36ea0 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62 65 74   all aliases bet
36eb0 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  ween the result 
36ec0 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20 20 20  set and the.    
36ed0 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  ** GROUP BY clau
36ee0 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
36ef0 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
36f00 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20       int k;     
36f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
36f30 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75  er */.      stru
36f40 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
36f50 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72   *pItem;  /* For
36f60 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78   looping over ex
36f70 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69  pression in a li
36f80 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72  st */..      for
36f90 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  (k=p->pEList->nE
36fa0 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45  xpr, pItem=p->pE
36fb0 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d  List->a; k>0; k-
36fc0 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
36fd0 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e       pItem->u.x.
36fe0 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20  iAlias = 0;.    
36ff0 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d    }.      for(k=
37000 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c  pGroupBy->nExpr,
37010 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d   pItem=pGroupBy-
37020 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49  >a; k>0; k--, pI
37030 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
37040 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61  pItem->u.x.iAlia
37050 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 0;.      }. 
37060 20 20 20 20 20 61 73 73 65 72 74 28 20 36 36 3d       assert( 66=
37070 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
37080 30 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  00) );.      if(
37090 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 36   p->nSelectRow>6
370a0 36 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  6 ) p->nSelectRo
370b0 77 20 3d 20 36 36 3b 0a 20 20 20 20 7d 65 6c 73  w = 66;.    }els
370c0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
370d0 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73   0==sqlite3LogEs
370e0 74 28 31 29 20 29 3b 0a 20 20 20 20 20 20 70 2d  t(1) );.      p-
370f0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b  >nSelectRow = 0;
37100 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
37110 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68 20  f there is both 
37120 61 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 61  a GROUP BY and a
37130 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
37140 65 20 61 6e 64 20 74 68 65 79 20 61 72 65 0a 20  e and they are. 
37150 20 20 20 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c     ** identical,
37160 20 74 68 65 6e 20 69 74 20 6d 61 79 20 62 65 20   then it may be 
37170 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 69 73 61  possible to disa
37180 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ble the ORDER BY
37190 20 63 6c 61 75 73 65 20 0a 20 20 20 20 2a 2a 20   clause .    ** 
371a0 6f 6e 20 74 68 65 20 67 72 6f 75 6e 64 73 20 74  on the grounds t
371b0 68 61 74 20 74 68 65 20 47 52 4f 55 50 20 42 59  hat the GROUP BY
371c0 20 77 69 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d   will cause elem
371d0 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74  ents to come out
371e0 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20   .    ** in the 
371f0 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2e 20 49  correct order. I
37200 74 20 61 6c 73 6f 20 6d 61 79 20 6e 6f 74 20 2d  t also may not -
37210 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 6d 69   the GROUP BY mi
37220 67 68 74 20 75 73 65 20 61 0a 20 20 20 20 2a 2a  ght use a.    **
37230 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
37240 74 68 61 74 20 63 61 75 73 65 73 20 72 6f 77 73  that causes rows
37250 20 74 6f 20 62 65 20 67 72 6f 75 70 65 64 20 74   to be grouped t
37260 6f 67 65 74 68 65 72 20 61 73 20 72 65 71 75 69  ogether as requi
37270 72 65 64 0a 20 20 20 20 2a 2a 20 62 75 74 20 6e  red.    ** but n
37280 6f 74 20 61 63 74 75 61 6c 6c 79 20 73 6f 72 74  ot actually sort
37290 65 64 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20  ed. Either way, 
372a0 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  record the fact 
372b0 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  that the.    ** 
372c0 4f 52 44 45 52 20 42 59 20 61 6e 64 20 47 52 4f  ORDER BY and GRO
372d0 55 50 20 42 59 20 63 6c 61 75 73 65 73 20 61 72  UP BY clauses ar
372e0 65 20 74 68 65 20 73 61 6d 65 20 62 79 20 73 65  e the same by se
372f0 74 74 69 6e 67 20 74 68 65 20 6f 72 64 65 72 42  tting the orderB
37300 79 47 72 70 0a 20 20 20 20 2a 2a 20 76 61 72 69  yGrp.    ** vari
37310 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  able.  */.    if
37320 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  ( sqlite3ExprLis
37330 74 43 6f 6d 70 61 72 65 28 70 47 72 6f 75 70 42  tCompare(pGroupB
37340 79 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  y, sSort.pOrderB
37350 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20  y, -1)==0 ){.   
37360 20 20 20 6f 72 64 65 72 42 79 47 72 70 20 3d 20     orderByGrp = 
37370 31 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f  1;.    }. .    /
37380 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62 65 6c  * Create a label
37390 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e   to jump to when
373a0 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62 6f 72   we want to abor
373b0 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20  t the query */. 
373c0 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71 6c     addrEnd = sql
373d0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
373e0 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20  l(pParse);..    
373f0 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f  /* Convert TK_CO
37400 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20  LUMN nodes into 
37410 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e  TK_AGG_COLUMN an
37420 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69  d make entries i
37430 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66  n.    ** sAggInf
37440 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47  o for all TK_AGG
37450 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20  _FUNCTION nodes 
37460 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  in expressions o
37470 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c  f the.    ** SEL
37480 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  ECT statement.. 
37490 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74     */.    memset
374a0 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sNC, 0, sizeof
374b0 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e  (sNC));.    sNC.
374c0 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
374d0 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  .    sNC.pSrcLis
374e0 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
374f0 20 20 73 4e 43 2e 75 4e 43 2e 70 41 67 67 49 6e    sNC.uNC.pAggIn
37500 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a  fo = &sAggInfo;.
37510 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 73 4e      VVA_ONLY( sN
37520 43 2e 6e 63 46 6c 61 67 73 20 3d 20 4e 43 5f 55  C.ncFlags = NC_U
37530 41 67 67 49 6e 66 6f 3b 20 29 0a 20 20 20 20 73  AggInfo; ).    s
37540 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20  AggInfo.mnReg = 
37550 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
37560 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f      sAggInfo.nSo
37570 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47  rtingColumn = pG
37580 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42  roupBy ? pGroupB
37590 79 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20  y->nExpr : 0;.  
375a0 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75    sAggInfo.pGrou
375b0 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
375c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
375d0 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
375e0 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  NC, pEList);.   
375f0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
37600 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
37610 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 29   sSort.pOrderBy)
37620 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e  ;.    if( pHavin
37630 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  g ){.      if( p
37640 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
37650 20 20 20 61 73 73 65 72 74 28 20 70 57 68 65 72     assert( pWher
37660 65 3d 3d 70 2d 3e 70 57 68 65 72 65 20 29 3b 0a  e==p->pWhere );.
37670 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
37680 70 48 61 76 69 6e 67 3d 3d 70 2d 3e 70 48 61 76  pHaving==p->pHav
37690 69 6e 67 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ing );.        a
376a0 73 73 65 72 74 28 20 70 47 72 6f 75 70 42 79 3d  ssert( pGroupBy=
376b0 3d 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a  =p->pGroupBy );.
376c0 20 20 20 20 20 20 20 20 68 61 76 69 6e 67 54 6f          havingTo
376d0 57 68 65 72 65 28 70 50 61 72 73 65 2c 20 70 29  Where(pParse, p)
376e0 3b 0a 20 20 20 20 20 20 20 20 70 57 68 65 72 65  ;.        pWhere
376f0 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
37700 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
37710 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
37720 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70  gregates(&sNC, p
37730 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20  Having);.    }. 
37740 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63     sAggInfo.nAcc
37750 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49  umulator = sAggI
37760 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  nfo.nColumn;.   
37770 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79   if( p->pGroupBy
37780 3d 3d 30 20 26 26 20 70 2d 3e 70 48 61 76 69 6e  ==0 && p->pHavin
37790 67 3d 3d 30 20 26 26 20 73 41 67 67 49 6e 66 6f  g==0 && sAggInfo
377a0 2e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20  .nFunc==1 ){.   
377b0 20 20 20 6d 69 6e 4d 61 78 46 6c 61 67 20 3d 20     minMaxFlag = 
377c0 6d 69 6e 4d 61 78 51 75 65 72 79 28 64 62 2c 20  minMaxQuery(db, 
377d0 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30  sAggInfo.aFunc[0
377e0 5d 2e 70 45 78 70 72 2c 20 26 70 4d 69 6e 4d 61  ].pExpr, &pMinMa
377f0 78 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 7d  xOrderBy);.    }
37800 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 69 6e 4d  else{.      minM
37810 61 78 46 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f  axFlag = WHERE_O
37820 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20  RDERBY_NORMAL;. 
37830 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
37840 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75  ; i<sAggInfo.nFu
37850 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nc; i++){.      
37860 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 73 41  Expr *pExpr = sA
37870 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e  ggInfo.aFunc[i].
37880 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
37890 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
378a0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
378b0 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
378c0 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20      sNC.ncFlags 
378d0 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b  |= NC_InAggFunc;
378e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
378f0 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
37900 28 26 73 4e 43 2c 20 70 45 78 70 72 2d 3e 78 2e  (&sNC, pExpr->x.
37910 70 4c 69 73 74 29 3b 0a 23 69 66 6e 64 65 66 20  pList);.#ifndef 
37920 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
37930 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 61 73 73  OWFUNC.      ass
37940 65 72 74 28 20 21 49 73 57 69 6e 64 6f 77 46 75  ert( !IsWindowFu
37950 6e 63 28 70 45 78 70 72 29 20 29 3b 0a 20 20 20  nc(pExpr) );.   
37960 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
37970 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
37980 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20  _WinFunc) ){.   
37990 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
379a0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
379b0 73 28 26 73 4e 43 2c 20 70 45 78 70 72 2d 3e 79  s(&sNC, pExpr->y
379c0 2e 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 29 3b  .pWin->pFilter);
379d0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
379e0 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67        sNC.ncFlag
379f0 73 20 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75  s &= ~NC_InAggFu
37a00 6e 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41  nc;.    }.    sA
37a10 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 3d 20 70  ggInfo.mxReg = p
37a20 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
37a30 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
37a40 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c  ailed ) goto sel
37a50 65 63 74 5f 65 6e 64 3b 0a 23 69 66 20 53 45 4c  ect_end;.#if SEL
37a60 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
37a70 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
37a80 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78  SelectTrace & 0x
37a90 34 30 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  400 ){.      int
37aa0 20 69 69 3b 0a 20 20 20 20 20 20 53 45 4c 45 43   ii;.      SELEC
37ab0 54 54 52 41 43 45 28 30 78 34 30 30 2c 70 50 61  TTRACE(0x400,pPa
37ac0 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 61 67  rse,p,("After ag
37ad0 67 72 65 67 61 74 65 20 61 6e 61 6c 79 73 69 73  gregate analysis
37ae0 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 73 71  :\n"));.      sq
37af0 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
37b00 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
37b10 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
37b20 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d  <sAggInfo.nColum
37b30 6e 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  n; ii++){.      
37b40 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
37b50 69 6e 74 66 28 22 61 67 67 2d 63 6f 6c 75 6d 6e  intf("agg-column
37b60 5b 25 64 5d 20 69 4d 65 6d 3d 25 64 5c 6e 22 2c  [%d] iMem=%d\n",
37b70 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 69 2c  .            ii,
37b80 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69   sAggInfo.aCol[i
37b90 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  i].iMem);.      
37ba0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
37bb0 77 45 78 70 72 28 30 2c 20 73 41 67 67 49 6e 66  wExpr(0, sAggInf
37bc0 6f 2e 61 43 6f 6c 5b 69 69 5d 2e 70 45 78 70 72  o.aCol[ii].pExpr
37bd0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
37be0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
37bf0 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b  <sAggInfo.nFunc;
37c00 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
37c10 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
37c20 74 66 28 22 61 67 67 2d 66 75 6e 63 5b 25 64 5d  tf("agg-func[%d]
37c30 3a 20 69 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20  : iMem=%d\n",.  
37c40 20 20 20 20 20 20 20 20 20 20 69 69 2c 20 73 41            ii, sA
37c50 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 69 5d  ggInfo.aFunc[ii]
37c60 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20  .iMem);.        
37c70 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45  sqlite3TreeViewE
37c80 78 70 72 28 30 2c 20 73 41 67 67 49 6e 66 6f 2e  xpr(0, sAggInfo.
37c90 61 46 75 6e 63 5b 69 69 5d 2e 70 45 78 70 72 2c  aFunc[ii].pExpr,
37ca0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
37cb0 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 20 20   }.#endif...    
37cc0 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f  /* Processing fo
37cd0 72 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74  r aggregates wit
37ce0 68 20 47 52 4f 55 50 20 42 59 20 69 73 20 76 65  h GROUP BY is ve
37cf0 72 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64  ry different and
37d00 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72  .    ** much mor
37d10 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61  e complex than a
37d20 67 67 72 65 67 61 74 65 73 20 77 69 74 68 6f 75  ggregates withou
37d30 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20  t a GROUP BY..  
37d40 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72    */.    if( pGr
37d50 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b  oupBy ){.      K
37d60 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
37d70 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66  ;  /* Keying inf
37d80 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
37d90 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65   group by clause
37da0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
37db0 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  dr1;          /*
37dc0 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69 73   A-vs-B comparis
37dd0 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20  ion jump */.    
37de0 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74    int addrOutput
37df0 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f  Row;  /* Start o
37e00 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  f subroutine tha
37e10 74 20 6f 75 74 70 75 74 73 20 61 20 72 65 73 75  t outputs a resu
37e20 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20  lt row */.      
37e30 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77  int regOutputRow
37e40 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64  ;   /* Return ad
37e50 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
37e60 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  or output subrou
37e70 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tine */.      in
37e80 74 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20  t addrSetAbort; 
37e90 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f    /* Set the abo
37ea0 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75  rt flag and retu
37eb0 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  rn */.      int 
37ec0 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20  addrTopOfLoop;  
37ed0 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e  /* Top of the in
37ee0 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  put loop */.    
37ef0 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e    int addrSortin
37f00 67 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f  gIdx; /* The OP_
37f10 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f  OpenEphemeral fo
37f20 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  r the sorting in
37f30 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  dex */.      int
37f40 20 61 64 64 72 52 65 73 65 74 3b 20 20 20 20 20   addrReset;     
37f50 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66   /* Subroutine f
37f60 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65  or resetting the
37f70 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a   accumulator */.
37f80 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 73        int regRes
37f90 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74  et;       /* Ret
37fa0 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69  urn address regi
37fb0 73 74 65 72 20 66 6f 72 20 72 65 73 65 74 20 73  ster for reset s
37fc0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20  ubroutine */..  
37fd0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
37fe0 69 73 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c  is a GROUP BY cl
37ff0 61 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65  ause we might ne
38000 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  ed a sorting ind
38010 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69  ex to.      ** i
38020 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c  mplement it.  Al
38030 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72 74  locate that sort
38040 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20  ing index now.  
38050 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a  If it turns out.
38060 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65        ** that we
38070 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20   do not need it 
38080 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f  after all, the O
38090 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73  P_SorterOpen ins
380a0 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  truction.      *
380b0 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72  * will be conver
380c0 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e  ted into a Noop.
380d0 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20    .      */.    
380e0 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
380f0 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e  ngIdx = pParse->
38100 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b  nTab++;.      pK
38110 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
38120 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  KeyInfoFromExprL
38130 69 73 74 28 70 50 61 72 73 65 2c 70 47 72 6f 75  ist(pParse,pGrou
38140 70 42 79 2c 30 2c 73 41 67 67 49 6e 66 6f 2e 6e  pBy,0,sAggInfo.n
38150 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 61  Column);.      a
38160 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 20  ddrSortingIdx = 
38170 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
38180 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70  4(v, OP_SorterOp
38190 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  en, .          s
381a0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
381b0 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f  dx, sAggInfo.nSo
381c0 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20  rtingColumn, .  
381d0 20 20 20 20 20 20 20 20 30 2c 20 28 63 68 61 72          0, (char
381e0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
381f0 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20 20 20 20  EYINFO);..      
38200 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65  /* Initialize me
38210 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75  mory locations u
38220 73 65 64 20 62 79 20 47 52 4f 55 50 20 42 59 20  sed by GROUP BY 
38230 61 67 67 72 65 67 61 74 65 20 70 72 6f 63 65 73  aggregate proces
38240 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sing.      */.  
38250 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b      iUseFlag = +
38260 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
38270 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20       iAbortFlag 
38280 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
38290 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74 70 75  ;.      regOutpu
382a0 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d  tRow = ++pParse-
382b0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64  >nMem;.      add
382c0 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c  rOutputRow = sql
382d0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
382e0 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
382f0 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50   regReset = ++pP
38300 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
38310 20 20 61 64 64 72 52 65 73 65 74 20 3d 20 73 71    addrReset = sq
38320 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
38330 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
38340 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65    iAMem = pParse
38350 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20  ->nMem + 1;.    
38360 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
38370 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
38380 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d  r;.      iBMem =
38390 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
383a0 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  1;.      pParse-
383b0 3e 6e 4d 65 6d 20 2b 3d 20 70 47