/ Hex Artifact Content
Login

Artifact 45d01474cfb359b7ac12fbdf0fed6bdff53e63bd88eaef65e2001b52a4676a93:


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 69 66 28 20 62 46 72 65 65  );.    if( bFree
0f80: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
0f90: 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70  NN(db, p);.    p
0fa0: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 62   = pPrior;.    b
0fb0: 46 72 65 65 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  Free = 1;.  }.}.
0fc0: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
0fd0: 65 20 61 20 53 65 6c 65 63 74 44 65 73 74 20 73  e a SelectDest s
0fe0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69  tructure..*/.voi
0ff0: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  d sqlite3SelectD
1000: 65 73 74 49 6e 69 74 28 53 65 6c 65 63 74 44 65  estInit(SelectDe
1010: 73 74 20 2a 70 44 65 73 74 2c 20 69 6e 74 20 65  st *pDest, int e
1020: 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29  Dest, int iParm)
1030: 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74  {.  pDest->eDest
1040: 20 3d 20 28 75 38 29 65 44 65 73 74 3b 0a 20 20   = (u8)eDest;.  
1050: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 3d  pDest->iSDParm =
1060: 20 69 50 61 72 6d 3b 0a 20 20 70 44 65 73 74 2d   iParm;.  pDest-
1070: 3e 7a 41 66 66 53 64 73 74 20 3d 20 30 3b 0a 20  >zAffSdst = 0;. 
1080: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
1090: 30 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73  0;.  pDest->nSds
10a0: 74 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  t = 0;.}.../*.**
10b0: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
10c0: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
10d0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
10e0: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a  inter to that.**
10f0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53   structure..*/.S
1100: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
1110: 6c 65 63 74 4e 65 77 28 0a 20 20 50 61 72 73 65  lectNew(.  Parse
1120: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1130: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
1140: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
1150: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 2f  t *pEList,     /
1160: 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20  * which columns 
1170: 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68  to include in th
1180: 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 53 72  e result */.  Sr
1190: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
11a0: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
11b0: 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63 68 20  clause -- which 
11c0: 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e 20 2a  tables to scan *
11d0: 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
11e0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  ,         /* the
11f0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
1200: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
1210: 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68 65 20  oupBy,   /* the 
1220: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
1230: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
1240: 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68  ng,        /* th
1250: 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  e HAVING clause 
1260: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1270: 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 74 68  OrderBy,   /* th
1280: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1290: 65 20 2a 2f 0a 20 20 75 33 32 20 73 65 6c 46 6c  e */.  u32 selFl
12a0: 61 67 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ags,         /* 
12b0: 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 73 2c  Flag parameters,
12c0: 20 73 75 63 68 20 61 73 20 53 46 5f 44 69 73 74   such as SF_Dist
12d0: 69 6e 63 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  inct */.  Expr *
12e0: 70 4c 69 6d 69 74 20 20 20 20 20 20 20 20 20 20  pLimit          
12f0: 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65 2e 20  /* LIMIT value. 
1300: 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 74 20   NULL means not 
1310: 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c  used */.){.  Sel
1320: 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c  ect *pNew;.  Sel
1330: 65 63 74 20 73 74 61 6e 64 69 6e 3b 0a 20 20 70  ect standin;.  p
1340: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
1350: 61 6c 6c 6f 63 52 61 77 4e 4e 28 70 50 61 72 73  allocRawNN(pPars
1360: 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  e->db, sizeof(*p
1370: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
1380: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ew==0 ){.    ass
1390: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
13a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
13b0: 0a 20 20 20 20 70 4e 65 77 20 3d 20 26 73 74 61  .    pNew = &sta
13c0: 6e 64 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndin;.  }.  if( 
13d0: 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  pEList==0 ){.   
13e0: 20 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65   pEList = sqlite
13f0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
1400: 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20  pParse, 0,.     
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1430: 6c 69 74 65 33 45 78 70 72 28 70 50 61 72 73 65  lite3Expr(pParse
1440: 2d 3e 64 62 2c 54 4b 5f 41 53 54 45 52 49 53 4b  ->db,TK_ASTERISK
1450: 2c 30 29 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77  ,0));.  }.  pNew
1460: 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73  ->pEList = pELis
1470: 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20  t;.  pNew->op = 
1480: 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 4e 65  TK_SELECT;.  pNe
1490: 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 73 65  w->selFlags = se
14a0: 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e  lFlags;.  pNew->
14b0: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e  iLimit = 0;.  pN
14c0: 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b  ew->iOffset = 0;
14d0: 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 49 64 20 3d  .  pNew->selId =
14e0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65   ++pParse->nSele
14f0: 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  ct;.  pNew->addr
1500: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31  OpenEphm[0] = -1
1510: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
1520: 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a  enEphm[1] = -1;.
1530: 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52    pNew->nSelectR
1540: 6f 77 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53  ow = 0;.  if( pS
1550: 72 63 3d 3d 30 20 29 20 70 53 72 63 20 3d 20 73  rc==0 ) pSrc = s
1560: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
1570: 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
1580: 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20  izeof(*pSrc));. 
1590: 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53   pNew->pSrc = pS
15a0: 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65  rc;.  pNew->pWhe
15b0: 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70  re = pWhere;.  p
15c0: 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
15d0: 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77  pGroupBy;.  pNew
15e0: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76  ->pHaving = pHav
15f0: 69 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  ing;.  pNew->pOr
1600: 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
1610: 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  ;.  pNew->pPrior
1620: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e   = 0;.  pNew->pN
1630: 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ext = 0;.  pNew-
1640: 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
1650: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69 74 68 20  ;.  pNew->pWith 
1660: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
1670: 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
1680: 55 4e 43 0a 20 20 70 4e 65 77 2d 3e 70 57 69 6e  UNC.  pNew->pWin
1690: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 57   = 0;.  pNew->pW
16a0: 69 6e 44 65 66 6e 20 3d 20 30 3b 0a 23 65 6e 64  inDefn = 0;.#end
16b0: 69 66 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  if.  if( pParse-
16c0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
16d0: 64 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53  d ) {.    clearS
16e0: 65 6c 65 63 74 28 70 50 61 72 73 65 2d 3e 64 62  elect(pParse->db
16f0: 2c 20 70 4e 65 77 2c 20 70 4e 65 77 21 3d 26 73  , pNew, pNew!=&s
1700: 74 61 6e 64 69 6e 29 3b 0a 20 20 20 20 70 4e 65  tandin);.    pNe
1710: 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w = 0;.  }else{.
1720: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
1730: 2d 3e 70 53 72 63 21 3d 30 20 7c 7c 20 70 50 61  ->pSrc!=0 || pPa
1740: 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a 20  rse->nErr>0 );. 
1750: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65   }.  assert( pNe
1760: 77 21 3d 26 73 74 61 6e 64 69 6e 20 29 3b 0a 20  w!=&standin );. 
1770: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
1780: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
1790: 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63 74 20  he given Select 
17a0: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c  structure and al
17b0: 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74 72 75  l of its substru
17c0: 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ctures..*/.void 
17d0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
17e0: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
17f0: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
1800: 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f  f( OK_IF_ALWAYS_
1810: 54 52 55 45 28 70 29 20 29 20 63 6c 65 61 72 53  TRUE(p) ) clearS
1820: 65 6c 65 63 74 28 64 62 2c 20 70 2c 20 31 29 3b  elect(db, p, 1);
1830: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1840: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1850: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c  e right-most SEL
1860: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ECT statement in
1870: 20 61 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f 0a   a compound..*/.
1880: 73 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 66  static Select *f
1890: 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 53 65 6c  indRightmost(Sel
18a0: 65 63 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65  ect *p){.  while
18b0: 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 20 3d  ( p->pNext ) p =
18c0: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65 74   p->pNext;.  ret
18d0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
18e0: 47 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64 65  Given 1 to 3 ide
18f0: 6e 74 69 66 69 65 72 73 20 70 72 65 63 65 64 69  ntifiers precedi
1900: 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77  ng the JOIN keyw
1910: 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74  ord, determine t
1920: 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f  he.** type of jo
1930: 69 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69  in.  Return an i
1940: 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
1950: 74 68 61 74 20 65 78 70 72 65 73 73 65 73 20 74  that expresses t
1960: 68 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74  hat type.** in t
1970: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c  erms of the foll
1980: 6f 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73  owing bit values
1990: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49  :.**.**     JT_I
19a0: 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43  NNER.**     JT_C
19b0: 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f  ROSS.**     JT_O
19c0: 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e  UTER.**     JT_N
19d0: 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54  ATURAL.**     JT
19e0: 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f  _LEFT.**     JT_
19f0: 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75  RIGHT.**.** A fu
1a00: 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73  ll outer join is
1a10: 20 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e   the combination
1a20: 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20   of JT_LEFT and 
1a30: 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20  JT_RIGHT..**.** 
1a40: 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72  If an illegal or
1a50: 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69   unsupported joi
1a60: 6e 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20  n type is seen, 
1a70: 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72  then still retur
1a80: 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65  n.** a join type
1a90: 2c 20 62 75 74 20 70 75 74 20 61 6e 20 65 72 72  , but put an err
1aa0: 6f 72 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  or in the pParse
1ab0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69   structure..*/.i
1ac0: 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79  nt sqlite3JoinTy
1ad0: 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pe(Parse *pParse
1ae0: 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b  , Token *pA, Tok
1af0: 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70  en *pB, Token *p
1b00: 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79  C){.  int jointy
1b10: 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20  pe = 0;.  Token 
1b20: 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b  *apAll[3];.  Tok
1b30: 65 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 20  en *p;.         
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b50: 20 20 20 20 2f 2a 20 20 20 30 31 32 33 34 35 36      /*   0123456
1b60: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
1b70: 33 34 35 36 37 38 39 20 31 32 33 20 2a 2f 0a 20  3456789 123 */. 
1b80: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
1b90: 61 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20  ar zKeyText[] = 
1ba0: 22 6e 61 74 75 72 61 6c 65 66 74 6f 75 74 65 72  "naturaleftouter
1bb0: 69 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f  ightfullinnercro
1bc0: 73 73 22 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  ss";.  static co
1bd0: 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
1be0: 20 75 38 20 69 3b 20 20 20 20 20 20 20 20 2f 2a   u8 i;        /*
1bf0: 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65   Beginning of ke
1c00: 79 77 6f 72 64 20 74 65 78 74 20 69 6e 20 7a 4b  yword text in zK
1c10: 65 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20  eyText[] */.    
1c20: 75 38 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20  u8 nChar;    /* 
1c30: 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b 65  Length of the ke
1c40: 79 77 6f 72 64 20 69 6e 20 63 68 61 72 61 63 74  yword in charact
1c50: 65 72 73 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f  ers */.    u8 co
1c60: 64 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20  de;     /* Join 
1c70: 74 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d  type mask */.  }
1c80: 20 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a   aKeyword[] = {.
1c90: 20 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a      /* natural *
1ca0: 2f 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41  / { 0,  7, JT_NA
1cb0: 54 55 52 41 4c 20 20 20 20 20 20 20 20 20 20 20  TURAL           
1cc0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c       },.    /* l
1cd0: 65 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20  eft    */ { 6,  
1ce0: 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55  4, JT_LEFT|JT_OU
1cf0: 54 45 52 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  TER          },.
1d00: 20 20 20 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a      /* outer   *
1d10: 2f 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55  / { 10, 5, JT_OU
1d20: 54 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  TER             
1d30: 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72       },.    /* r
1d40: 69 67 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20  ight   */ { 14, 
1d50: 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f  5, JT_RIGHT|JT_O
1d60: 55 54 45 52 20 20 20 20 20 20 20 20 20 7d 2c 0a  UTER         },.
1d70: 20 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a      /* full    *
1d80: 2f 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45  / { 19, 4, JT_LE
1d90: 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f  FT|JT_RIGHT|JT_O
1da0: 55 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69  UTER },.    /* i
1db0: 6e 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20  nner   */ { 23, 
1dc0: 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20  5, JT_INNER     
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
1de0: 20 20 20 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a      /* cross   *
1df0: 2f 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e  / { 28, 5, JT_IN
1e00: 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20  NER|JT_CROSS    
1e10: 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69       },.  };.  i
1e20: 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c  nt i, j;.  apAll
1e30: 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c  [0] = pA;.  apAl
1e40: 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41  l[1] = pB;.  apA
1e50: 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f  ll[2] = pC;.  fo
1e60: 72 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61 70  r(i=0; i<3 && ap
1e70: 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  All[i]; i++){.  
1e80: 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a    p = apAll[i];.
1e90: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41      for(j=0; j<A
1ea0: 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72  rraySize(aKeywor
1eb0: 64 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  d); j++){.      
1ec0: 69 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f  if( p->n==aKeywo
1ed0: 72 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20  rd[j].nChar .   
1ee0: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
1ef0: 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a  3StrNICmp((char*
1f00: 29 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74  )p->z, &zKeyText
1f10: 5b 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c  [aKeyword[j].i],
1f20: 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20   p->n)==0 ){.   
1f30: 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d       jointype |=
1f40: 20 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64   aKeyword[j].cod
1f50: 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
1f60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f70: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d      testcase( j=
1f80: 3d 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d  =0 || j==1 || j=
1f90: 3d 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d  =2 || j==3 || j=
1fa0: 3d 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d  =4 || j==5 || j=
1fb0: 3d 36 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e  =6 );.    if( j>
1fc0: 3d 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77  =ArraySize(aKeyw
1fd0: 6f 72 64 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f  ord) ){.      jo
1fe0: 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52  intype |= JT_ERR
1ff0: 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
2000: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2010: 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20  .     (jointype 
2020: 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f  & (JT_INNER|JT_O
2030: 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45  UTER))==(JT_INNE
2040: 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20  R|JT_OUTER) ||. 
2050: 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20      (jointype & 
2060: 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29  JT_ERROR)!=0.  )
2070: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2080: 20 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20 20   *zSp = " ";.   
2090: 20 61 73 73 65 72 74 28 20 70 42 21 3d 30 20 29   assert( pB!=0 )
20a0: 3b 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20  ;.    if( pC==0 
20b0: 29 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20  ){ zSp++; }.    
20c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
20d0: 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
20e0: 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20   or unsupported 
20f0: 6a 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20  join type: ".   
2100: 20 20 20 20 22 25 54 20 25 54 25 73 25 54 22 2c      "%T %T%s%T",
2110: 20 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43   pA, pB, zSp, pC
2120: 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  );.    jointype 
2130: 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65  = JT_INNER;.  }e
2140: 6c 73 65 20 69 66 28 20 28 6a 6f 69 6e 74 79 70  lse if( (jointyp
2150: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
2160: 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 6a   .         && (j
2170: 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45  ointype & (JT_LE
2180: 46 54 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a  FT|JT_RIGHT))!=J
2190: 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 73 71  T_LEFT ){.    sq
21a0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
21b0: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49  arse, .      "RI
21c0: 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54  GHT and FULL OUT
21d0: 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74  ER JOINs are not
21e0: 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f   currently suppo
21f0: 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e  rted");.    join
2200: 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b  type = JT_INNER;
2210: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f  .  }.  return jo
2220: 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  intype;.}../*.**
2230: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
2240: 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  x of a column in
2250: 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72   a table.  Retur
2260: 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75  n -1 if the colu
2270: 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e  mn.** is not con
2280: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61  tained in the ta
2290: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
22a0: 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54  nt columnIndex(T
22b0: 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73  able *pTab, cons
22c0: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20  t char *zCol){. 
22d0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
22e0: 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
22f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
2300: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54  qlite3StrICmp(pT
2310: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ab->aCol[i].zNam
2320: 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65  e, zCol)==0 ) re
2330: 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
2340: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
2350: 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 69 72  * Search the fir
2360: 73 74 20 4e 20 74 61 62 6c 65 73 20 69 6e 20 70  st N tables in p
2370: 53 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74  Src, from left t
2380: 6f 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67  o right, looking
2390: 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20   for a.** table 
23a0: 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 75 6d  that has a colum
23b0: 6e 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a  n named zCol.  .
23c0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64  **.** When found
23d0: 2c 20 73 65 74 20 2a 70 69 54 61 62 20 61 6e 64  , set *piTab and
23e0: 20 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65 20 74   *piCol to the t
23f0: 61 62 6c 65 20 69 6e 64 65 78 20 61 6e 64 20 63  able index and c
2400: 6f 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f  olumn index.** o
2410: 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63  f the matching c
2420: 6f 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e  olumn and return
2430: 20 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   TRUE..**.** If 
2440: 6e 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75 72  not found, retur
2450: 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74  n FALSE..*/.stat
2460: 69 63 20 69 6e 74 20 74 61 62 6c 65 41 6e 64 43  ic int tableAndC
2470: 6f 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72  olumnIndex(.  Sr
2480: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
2490: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74     /* Array of t
24a0: 61 62 6c 65 73 20 74 6f 20 73 65 61 72 63 68 20  ables to search 
24b0: 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  */.  int N,     
24c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
24d0: 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ber of tables in
24e0: 20 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65   pSrc->a[] to se
24f0: 61 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  arch */.  const 
2500: 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f  char *zCol,    /
2510: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
2520: 6c 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b  lumn we are look
2530: 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  ing for */.  int
2540: 20 2a 70 69 54 61 62 2c 20 20 20 20 20 20 20 20   *piTab,        
2550: 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78    /* Write index
2560: 20 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65   of pSrc->a[] he
2570: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43  re */.  int *piC
2580: 6f 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ol           /* 
2590: 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70  Write index of p
25a0: 53 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70  Src->a[*piTab].p
25b0: 54 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65  Tab->aCol[] here
25c0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25e0: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
25f0: 72 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63  r tables in pSrc
2600: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20   */.  int iCol; 
2610: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2620: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61  dex of column ma
2630: 74 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a  tching zCol */..
2640: 20 20 61 73 73 65 72 74 28 20 28 70 69 54 61 62    assert( (piTab
2650: 3d 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29  ==0)==(piCol==0)
2660: 20 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20   );  /* Both or 
2670: 6e 65 69 74 68 65 72 20 61 72 65 20 4e 55 4c 4c  neither are NULL
2680: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
2690: 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43  <N; i++){.    iC
26a0: 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78  ol = columnIndex
26b0: 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62  (pSrc->a[i].pTab
26c0: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28  , zCol);.    if(
26d0: 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20   iCol>=0 ){.    
26e0: 20 20 69 66 28 20 70 69 54 61 62 20 29 7b 0a 20    if( piTab ){. 
26f0: 20 20 20 20 20 20 20 2a 70 69 54 61 62 20 3d 20         *piTab = 
2700: 69 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f  i;.        *piCo
2710: 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  l = iCol;.      
2720: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  }.      return 1
2730: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2740: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2750: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2760: 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 74 65  s used to add te
2770: 72 6d 73 20 69 6d 70 6c 69 65 64 20 62 79 20 4a  rms implied by J
2780: 4f 49 4e 20 73 79 6e 74 61 78 20 74 6f 20 74 68  OIN syntax to th
2790: 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  e.** WHERE claus
27a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  e expression of 
27b0: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
27c0: 6e 74 2e 20 54 68 65 20 6e 65 77 20 74 65 72 6d  nt. The new term
27d0: 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e  , which.** is AN
27e0: 44 65 64 20 77 69 74 68 20 74 68 65 20 65 78 69  Ded with the exi
27f0: 73 74 69 6e 67 20 57 48 45 52 45 20 63 6c 61 75  sting WHERE clau
2800: 73 65 2c 20 69 73 20 6f 66 20 74 68 65 20 66 6f  se, is of the fo
2810: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61  rm:.**.**    (ta
2820: 62 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63  b1.col1 = tab2.c
2830: 6f 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  ol2).**.** where
2840: 20 74 61 62 31 20 69 73 20 74 68 65 20 69 53 72   tab1 is the iSr
2850: 63 27 74 68 20 74 61 62 6c 65 20 69 6e 20 53 72  c'th table in Sr
2860: 63 4c 69 73 74 20 70 53 72 63 20 61 6e 64 20 74  cList pSrc and t
2870: 61 62 32 20 69 73 20 74 68 65 20 0a 2a 2a 20 28  ab2 is the .** (
2880: 69 53 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75  iSrc+1)'th. Colu
2890: 6d 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d  mn col1 is colum
28a0: 6e 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61  n iColLeft of ta
28b0: 62 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a  b1, and col2 is.
28c0: 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69  ** column iColRi
28d0: 67 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a  ght of tab2..*/.
28e0: 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57  static void addW
28f0: 68 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73  hereTerm(.  Pars
2900: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
2910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2920: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
2930: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
2940: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2950: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74      /* List of t
2960: 61 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c  ables in FROM cl
2970: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ause */.  int iL
2980: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
2990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
29a0: 65 78 20 6f 66 20 66 69 72 73 74 20 74 61 62 6c  ex of first tabl
29b0: 65 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72  e to join in pSr
29c0: 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c  c */.  int iColL
29d0: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
29e0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
29f0: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72  of column in fir
2a00: 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  st table */.  in
2a10: 74 20 69 52 69 67 68 74 2c 20 20 20 20 20 20 20  t iRight,       
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a30: 20 49 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e 64   Index of second
2a40: 20 74 61 62 6c 65 20 69 6e 20 70 53 72 63 20 2a   table in pSrc *
2a50: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69 67 68  /.  int iColRigh
2a60: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
2a70: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
2a80: 63 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64  column in second
2a90: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
2aa0: 69 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20  isOuterJoin,    
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2ac0: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2ad0: 6e 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a  n OUTER join */.
2ae0: 20 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65    Expr **ppWhere
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b00: 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65    /* IN/OUT: The
2b10: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
2b20: 20 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20   add to */.){.  
2b30: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
2b40: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
2b50: 20 2a 70 45 31 3b 0a 20 20 45 78 70 72 20 2a 70   *pE1;.  Expr *p
2b60: 45 32 3b 0a 20 20 45 78 70 72 20 2a 70 45 71 3b  E2;.  Expr *pEq;
2b70: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 66  ..  assert( iLef
2b80: 74 3c 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73  t<iRight );.  as
2b90: 73 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72 63  sert( pSrc->nSrc
2ba0: 3e 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73  >iRight );.  ass
2bb0: 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65  ert( pSrc->a[iLe
2bc0: 66 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61 73  ft].pTab );.  as
2bd0: 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 52  sert( pSrc->a[iR
2be0: 69 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20  ight].pTab );.. 
2bf0: 20 70 45 31 20 3d 20 73 71 6c 69 74 65 33 43 72   pE1 = sqlite3Cr
2c00: 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64  eateColumnExpr(d
2c10: 62 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20  b, pSrc, iLeft, 
2c20: 69 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32  iColLeft);.  pE2
2c30: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
2c40: 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70  ColumnExpr(db, p
2c50: 53 72 63 2c 20 69 52 69 67 68 74 2c 20 69 43 6f  Src, iRight, iCo
2c60: 6c 52 69 67 68 74 29 3b 0a 0a 20 20 70 45 71 20  lRight);..  pEq 
2c70: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
2c80: 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45  Parse, TK_EQ, pE
2c90: 31 2c 20 70 45 32 29 3b 0a 20 20 69 66 28 20 70  1, pE2);.  if( p
2ca0: 45 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69  Eq && isOuterJoi
2cb0: 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  n ){.    ExprSet
2cc0: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
2cd0: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
2ce0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2cf0: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
2d00: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
2d10: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78  duced) );.    Ex
2d20: 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
2d30: 28 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63  (pEq, EP_NoReduc
2d40: 65 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52 69  e);.    pEq->iRi
2d50: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28  ghtJoinTable = (
2d60: 69 31 36 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b  i16)pE2->iTable;
2d70: 0a 20 20 7d 0a 20 20 2a 70 70 57 68 65 72 65 20  .  }.  *ppWhere 
2d80: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
2d90: 28 64 62 2c 20 2a 70 70 57 68 65 72 65 2c 20 70  (db, *ppWhere, p
2da0: 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  Eq);.}../*.** Se
2db0: 74 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  t the EP_FromJoi
2dc0: 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c  n property on al
2dd0: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67  l terms of the g
2de0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  iven expression.
2df0: 0a 2a 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20  .** And set the 
2e00: 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
2e10: 61 62 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66  able to iTable f
2e20: 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  or every term in
2e30: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
2e40: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50  on..**.** The EP
2e50: 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72  _FromJoin proper
2e60: 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65  ty is used on te
2e70: 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73  rms of an expres
2e80: 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20  sion to tell.** 
2e90: 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  the LEFT OUTER J
2ea0: 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  OIN processing l
2eb0: 6f 67 69 63 20 74 68 61 74 20 74 68 69 73 20 74  ogic that this t
2ec0: 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74  erm is part of t
2ed0: 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72  he.** join restr
2ee0: 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64  iction specified
2ef0: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
2f00: 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e  ING clause and n
2f10: 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20  ot a part.** of 
2f20: 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c  the more general
2f30: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
2f40: 54 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20  These terms are 
2f50: 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68  moved over to th
2f60: 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  e.** WHERE claus
2f70: 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72  e during join pr
2f80: 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77 65 20  ocessing but we 
2f90: 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
2fa0: 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72   that they.** or
2fb0: 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20  iginated in the 
2fc0: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
2fd0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78  se..**.** The Ex
2fe0: 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  pr.iRightJoinTab
2ff0: 6c 65 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45  le tells the WHE
3000: 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
3010: 73 69 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a  sing that the.**
3020: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65   expression depe
3030: 6e 64 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69  nds on table iRi
3040: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65  ghtJoinTable eve
3050: 6e 20 69 66 20 74 68 61 74 20 74 61 62 6c 65 20  n if that table 
3060: 69 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63  is not.** explic
3070: 69 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69  itly mentioned i
3080: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
3090: 2e 20 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74  .  That informat
30a0: 69 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a  ion is needed.**
30b0: 20 66 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20   for cases like 
30c0: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  this:.**.**    S
30d0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
30e0: 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
30f0: 74 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31  t1.a=t2.b AND t1
3100: 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77  .x=5.**.** The w
3110: 68 65 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64  here clause need
3120: 73 20 74 6f 20 64 65 66 65 72 20 74 68 65 20 68  s to defer the h
3130: 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74  andling of the t
3140: 31 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e  1.x=5.** term un
3150: 74 69 6c 20 61 66 74 65 72 20 74 68 65 20 74 32  til after the t2
3160: 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69   loop of the joi
3170: 6e 2e 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c  n.  In that way,
3180: 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f   a.** NULL t2 ro
3190: 77 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  w will be insert
31a0: 65 64 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78  ed whenever t1.x
31b0: 21 3d 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e  !=5.  If we do n
31c0: 6f 74 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20  ot.** defer the 
31d0: 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78  handling of t1.x
31e0: 3d 35 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70  =5, it will be p
31f0: 72 6f 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61  rocessed immedia
3200: 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68  tely.** after th
3210: 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f  e t1 loop and ro
3220: 77 73 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20  ws with t1.x!=5 
3230: 77 69 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61  will never appea
3240: 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70  r in.** the outp
3250: 75 74 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63  ut, which is inc
3260: 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  orrect..*/.stati
3270: 63 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78  c void setJoinEx
3280: 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  pr(Expr *p, int 
3290: 69 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65  iTable){.  while
32a0: 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53  ( p ){.    ExprS
32b0: 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  etProperty(p, EP
32c0: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
32d0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
32e0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
32f0: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
3300: 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72  ced) );.    Expr
3310: 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
3320: 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
3330: 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69      p->iRightJoi
3340: 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54  nTable = (i16)iT
3350: 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 70 2d  able;.    if( p-
3360: 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e  >op==TK_FUNCTION
3370: 20 26 26 20 70 2d 3e 65 58 3d 3d 45 58 5f 4c 69   && p->eX==EX_Li
3380: 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  st ){.      int 
3390: 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
33a0: 3b 20 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e  ; i<p->x.pList->
33b0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
33c0: 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72       setJoinExpr
33d0: 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69  (p->x.pList->a[i
33e0: 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 29  ].pExpr, iTable)
33f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3400: 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28      setJoinExpr(
3410: 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65  p->pLeft, iTable
3420: 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 65 58  );.    p = p->eX
3430: 3d 3d 45 58 5f 52 69 67 68 74 20 3f 20 70 2d 3e  ==EX_Right ? p->
3440: 78 2e 70 52 69 67 68 74 20 3a 20 30 3b 0a 20 20  x.pRight : 0;.  
3450: 7d 20 0a 7d 0a 0a 2f 2a 20 55 6e 64 6f 20 74 68  } .}../* Undo th
3460: 65 20 77 6f 72 6b 20 6f 66 20 73 65 74 4a 6f 69  e work of setJoi
3470: 6e 45 78 70 72 28 29 2e 20 20 49 6e 20 74 68 65  nExpr().  In the
3480: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
3490: 20 70 2c 20 63 6f 6e 76 65 72 74 20 65 76 65 72   p, convert ever
34a0: 79 0a 2a 2a 20 74 65 72 6d 20 74 68 61 74 20 69  y.** term that i
34b0: 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 45 50  s marked with EP
34c0: 5f 46 72 6f 6d 4a 6f 69 6e 20 61 6e 64 20 69 52  _FromJoin and iR
34d0: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69  ightJoinTable==i
34e0: 54 61 62 6c 65 20 69 6e 74 6f 0a 2a 2a 20 61 6e  Table into.** an
34f0: 20 6f 72 64 69 6e 61 72 79 20 74 65 72 6d 20 74   ordinary term t
3500: 68 61 74 20 6f 6d 69 74 73 20 74 68 65 20 45 50  hat omits the EP
3510: 5f 46 72 6f 6d 4a 6f 69 6e 20 6d 61 72 6b 2e 0a  _FromJoin mark..
3520: 2a 2a 0a 2a 2a 20 54 68 69 73 20 68 61 70 70 65  **.** This happe
3530: 6e 73 20 77 68 65 6e 20 61 20 4c 45 46 54 20 4a  ns when a LEFT J
3540: 4f 49 4e 20 69 73 20 73 69 6d 70 6c 69 66 69 65  OIN is simplifie
3550: 64 20 69 6e 74 6f 20 61 6e 20 6f 72 64 69 6e 61  d into an ordina
3560: 72 79 20 4a 4f 49 4e 2e 0a 2a 2f 0a 73 74 61 74  ry JOIN..*/.stat
3570: 69 63 20 76 6f 69 64 20 75 6e 73 65 74 4a 6f 69  ic void unsetJoi
3580: 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69  nExpr(Expr *p, i
3590: 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 77 68  nt iTable){.  wh
35a0: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66  ile( p ){.    if
35b0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
35c0: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
35d0: 29 0a 20 20 20 20 20 26 26 20 28 69 54 61 62 6c  ).     && (iTabl
35e0: 65 3c 30 20 7c 7c 20 70 2d 3e 69 52 69 67 68 74  e<0 || p->iRight
35f0: 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69 54 61 62 6c  JoinTable==iTabl
3600: 65 29 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  e) ){.      Expr
3610: 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70 2c  ClearProperty(p,
3620: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20   EP_FromJoin);. 
3630: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
3640: 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20  op==TK_FUNCTION 
3650: 26 26 20 70 2d 3e 65 58 3d 3d 45 58 5f 4c 69 73  && p->eX==EX_Lis
3660: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t ){.      int i
3670: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
3680: 20 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e   i<p->x.pList->n
3690: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
36a0: 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70      unsetJoinExp
36b0: 72 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  r(p->x.pList->a[
36c0: 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65  i].pExpr, iTable
36d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
36e0: 0a 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78  .    unsetJoinEx
36f0: 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61  pr(p->pLeft, iTa
3700: 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  ble);.    p = p-
3710: 3e 65 58 3d 3d 45 58 5f 52 69 67 68 74 20 3f 20  >eX==EX_Right ? 
3720: 70 2d 3e 78 2e 70 52 69 67 68 74 20 3a 20 30 3b  p->x.pRight : 0;
3730: 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  .  } .}../*.** T
3740: 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63  his routine proc
3750: 65 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69  esses the join i
3760: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61  nformation for a
3770: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
3780: 74 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49  t..** ON and USI
3790: 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 63  NG clauses are c
37a0: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78  onverted into ex
37b0: 74 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65  tra terms of the
37c0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
37d0: 2a 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20  * NATURAL joins 
37e0: 61 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74 72  also create extr
37f0: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
3800: 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  erms..**.** The 
3810: 74 65 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20  terms of a FROM 
3820: 63 6c 61 75 73 65 20 61 72 65 20 63 6f 6e 74 61  clause are conta
3830: 69 6e 65 64 20 69 6e 20 74 68 65 20 53 65 6c 65  ined in the Sele
3840: 63 74 2e 70 53 72 63 20 73 74 72 75 63 74 75 72  ct.pSrc structur
3850: 65 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d  e..** The left m
3860: 6f 73 74 20 74 61 62 6c 65 20 69 73 20 74 68 65  ost table is the
3870: 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
3880: 53 65 6c 65 63 74 2e 70 53 72 63 2e 20 20 54 68  Select.pSrc.  Th
3890: 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20  e right-most.** 
38a0: 74 61 62 6c 65 20 69 73 20 74 68 65 20 6c 61 73  table is the las
38b0: 74 20 65 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f  t entry.  The jo
38c0: 69 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 68  in operator is h
38d0: 65 6c 64 20 69 6e 20 74 68 65 20 65 6e 74 72 79  eld in the entry
38e0: 20 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e   to.** the left.
38f0: 20 20 54 68 75 73 20 65 6e 74 72 79 20 30 20 63    Thus entry 0 c
3900: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e  ontains the join
3910: 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 74 68   operator for th
3920: 65 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a  e join between.*
3930: 2a 20 65 6e 74 72 69 65 73 20 30 20 61 6e 64 20  * entries 0 and 
3940: 31 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53  1.  Any ON or US
3950: 49 4e 47 20 63 6c 61 75 73 65 73 20 61 73 73 6f  ING clauses asso
3960: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
3970: 6a 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f  join are.** also
3980: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
3990: 20 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a   left entry..**.
39a0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
39b0: 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
39c0: 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63  er of errors enc
39d0: 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61  ountered..*/.sta
39e0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50 72  tic int sqlitePr
39f0: 6f 63 65 73 73 4a 6f 69 6e 28 50 61 72 73 65 20  ocessJoin(Parse 
3a00: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
3a10: 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  *p){.  SrcList *
3a20: 70 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  pSrc;           
3a30: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61         /* All ta
3a40: 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
3a50: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
3a60: 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3a80: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
3a90: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
3aa0: 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20  t_item *pLeft;  
3ab0: 20 20 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65     /* Left table
3ac0: 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f   being joined */
3ad0: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
3ae0: 74 5f 69 74 65 6d 20 2a 70 52 69 67 68 74 3b 20  t_item *pRight; 
3af0: 20 20 20 2f 2a 20 52 69 67 68 74 20 74 61 62 6c     /* Right tabl
3b00: 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a  e being joined *
3b10: 2f 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  /..  pSrc = p->p
3b20: 53 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26  Src;.  pLeft = &
3b30: 70 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52  pSrc->a[0];.  pR
3b40: 69 67 68 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d  ight = &pLeft[1]
3b50: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
3b60: 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b  Src->nSrc-1; i++
3b70: 2c 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66  , pRight++, pLef
3b80: 74 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  t++){.    Table 
3b90: 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70 52 69  *pRightTab = pRi
3ba0: 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  ght->pTab;.    i
3bb0: 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20  nt isOuter;..   
3bc0: 20 69 66 28 20 4e 45 56 45 52 28 70 4c 65 66 74   if( NEVER(pLeft
3bd0: 2d 3e 70 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69  ->pTab==0 || pRi
3be0: 67 68 74 54 61 62 3d 3d 30 29 20 29 20 63 6f 6e  ghtTab==0) ) con
3bf0: 74 69 6e 75 65 3b 0a 20 20 20 20 69 73 4f 75 74  tinue;.    isOut
3c00: 65 72 20 3d 20 28 70 52 69 67 68 74 2d 3e 66 67  er = (pRight->fg
3c10: 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  .jointype & JT_O
3c20: 55 54 45 52 29 21 3d 30 3b 0a 0a 20 20 20 20 2f  UTER)!=0;..    /
3c30: 2a 20 57 68 65 6e 20 74 68 65 20 4e 41 54 55 52  * When the NATUR
3c40: 41 4c 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  AL keyword is pr
3c50: 65 73 65 6e 74 2c 20 61 64 64 20 57 48 45 52 45  esent, add WHERE
3c60: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 6f   clause terms fo
3c70: 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 63  r.    ** every c
3c80: 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20 74  olumn that the t
3c90: 77 6f 20 74 61 62 6c 65 73 20 68 61 76 65 20 69  wo tables have i
3ca0: 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f  n common..    */
3cb0: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
3cc0: 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  >fg.jointype & J
3cd0: 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20  T_NATURAL ){.   
3ce0: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
3cf0: 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55  On || pRight->pU
3d00: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  sing ){.        
3d10: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
3d20: 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52  pParse, "a NATUR
3d30: 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20  AL join may not 
3d40: 68 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20  have ".         
3d50: 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e    "an ON or USIN
3d60: 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20  G clause", 0);. 
3d70: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
3d80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
3d90: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 52 69 67 68 74  or(j=0; j<pRight
3da0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
3db0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
3dc0: 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20  Name;   /* Name 
3dd0: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  of column in the
3de0: 20 72 69 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a   right table */.
3df0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66          int iLef
3e00: 74 3b 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 69  t;     /* Matchi
3e10: 6e 67 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f  ng left table */
3e20: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65  .        int iLe
3e30: 66 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74 63 68  ftCol;  /* Match
3e40: 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  ing column in th
3e50: 65 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a  e left table */.
3e60: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
3e70: 20 70 52 69 67 68 74 54 61 62 2d 3e 61 43 6f 6c   pRightTab->aCol
3e80: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
3e90: 20 20 20 69 66 28 20 74 61 62 6c 65 41 6e 64 43     if( tableAndC
3ea0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c  olumnIndex(pSrc,
3eb0: 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c   i+1, zName, &iL
3ec0: 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 20  eft, &iLeftCol) 
3ed0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  ){.          add
3ee0: 57 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65  WhereTerm(pParse
3ef0: 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69  , pSrc, iLeft, i
3f00: 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c  LeftCol, i+1, j,
3f10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3f20: 20 20 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c          isOuter,
3f30: 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20   &p->pWhere);.  
3f40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
3f50: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69      }..    /* Di
3f60: 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61  sallow both ON a
3f70: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
3f80: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69   in the same joi
3f90: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  n.    */.    if(
3fa0: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20   pRight->pOn && 
3fb0: 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29  pRight->pUsing )
3fc0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
3fd0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3fe0: 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74  "cannot have bot
3ff0: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22  h ON and USING "
4000: 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75 73 65  .        "clause
4010: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f  s in the same jo
4020: 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  in");.      retu
4030: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 1;.    }..   
4040: 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63   /* Add the ON c
4050: 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64  lause to the end
4060: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
4070: 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20  ause, connected 
4080: 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44  by.    ** an AND
4090: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a   operator..    *
40a0: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
40b0: 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69  ->pOn ){.      i
40c0: 66 28 20 69 73 4f 75 74 65 72 20 29 20 73 65 74  f( isOuter ) set
40d0: 4a 6f 69 6e 45 78 70 72 28 70 52 69 67 68 74 2d  JoinExpr(pRight-
40e0: 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43  >pOn, pRight->iC
40f0: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d  ursor);.      p-
4100: 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
4110: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
4120: 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  >db, p->pWhere, 
4130: 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20  pRight->pOn);.  
4140: 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20      pRight->pOn 
4150: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
4160: 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72 61 20  /* Create extra 
4170: 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45  terms on the WHE
4180: 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61  RE clause for ea
4190: 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a  ch column named.
41a0: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53      ** in the US
41b0: 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61  ING clause.  Exa
41c0: 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f  mple: If the two
41d0: 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f   tables to be jo
41e0: 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a  ined are .    **
41f0: 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65   A and B and the
4200: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61   USING clause na
4210: 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c  mes X, Y, and Z,
4220: 20 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20   then add this. 
4230: 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45     ** to the WHE
4240: 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e  RE clause:    A.
4250: 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e  X=B.X AND A.Y=B.
4260: 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20  Y AND A.Z=B.Z.  
4270: 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65    ** Report an e
4280: 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75  rror if any colu
4290: 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20  mn mentioned in 
42a0: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
42b0: 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63   is.    ** not c
42c0: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68  ontained in both
42d0: 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f   tables to be jo
42e0: 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ined..    */.   
42f0: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 55 73   if( pRight->pUs
4300: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c  ing ){.      IdL
4310: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 52 69  ist *pList = pRi
4320: 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20  ght->pUsing;.   
4330: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c     for(j=0; j<pL
4340: 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a  ist->nId; j++){.
4350: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
4360: 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame;     /* Name
4370: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 69 6e 20   of the term in 
4380: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
4390: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
43a0: 69 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20  iLeft;       /* 
43b0: 54 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66  Table on the lef
43c0: 74 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20  t with matching 
43d0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  column name */. 
43e0: 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74         int iLeft
43f0: 43 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  Col;    /* Colum
4400: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63  n number of matc
4410: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74  hing column on t
4420: 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 20  he left */.     
4430: 20 20 20 69 6e 74 20 69 52 69 67 68 74 43 6f 6c     int iRightCol
4440: 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75  ;   /* Column nu
4450: 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67  mber of matching
4460: 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 72   column on the r
4470: 69 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20  ight */..       
4480: 20 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e   zName = pList->
4490: 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[j].zName;.    
44a0: 20 20 20 20 69 52 69 67 68 74 43 6f 6c 20 3d 20      iRightCol = 
44b0: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67  columnIndex(pRig
44c0: 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  htTab, zName);. 
44d0: 20 20 20 20 20 20 20 69 66 28 20 69 52 69 67 68         if( iRigh
44e0: 74 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20 20 20  tCol<0.         
44f0: 7c 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f 6c 75  || !tableAndColu
4500: 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b  mnIndex(pSrc, i+
4510: 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74  1, zName, &iLeft
4520: 2c 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20 20 20  , &iLeftCol).   
4530: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
4540: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4550: 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
4560: 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c  t join using col
4570: 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20  umn %s - column 
4580: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e  ".            "n
4590: 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f  ot present in bo
45a0: 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d  th tables", zNam
45b0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  e);.          re
45c0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
45d0: 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57 68 65  }.        addWhe
45e0: 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  reTerm(pParse, p
45f0: 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66  Src, iLeft, iLef
4600: 74 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69 67 68  tCol, i+1, iRigh
4610: 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  tCol,.          
4620: 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74             isOut
4630: 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b  er, &p->pWhere);
4640: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4650: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
4660: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
4670: 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65  nce of this obje
4680: 63 74 20 68 6f 6c 64 73 20 69 6e 66 6f 72 6d 61  ct holds informa
4690: 74 69 6f 6e 20 28 62 65 79 6f 6e 64 20 70 50 61  tion (beyond pPa
46a0: 72 73 65 20 61 6e 64 20 70 53 65 6c 65 63 74 29  rse and pSelect)
46b0: 0a 2a 2a 20 6e 65 65 64 65 64 20 74 6f 20 6c 6f  .** needed to lo
46c0: 61 64 20 74 68 65 20 6e 65 78 74 20 72 65 73 75  ad the next resu
46d0: 6c 74 20 72 6f 77 20 74 68 61 74 20 69 73 20 74  lt row that is t
46e0: 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  o be added to th
46f0: 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 74 79 70  e sorter..*/.typ
4700: 65 64 65 66 20 73 74 72 75 63 74 20 52 6f 77 4c  edef struct RowL
4710: 6f 61 64 49 6e 66 6f 20 52 6f 77 4c 6f 61 64 49  oadInfo RowLoadI
4720: 6e 66 6f 3b 0a 73 74 72 75 63 74 20 52 6f 77 4c  nfo;.struct RowL
4730: 6f 61 64 49 6e 66 6f 20 7b 0a 20 20 69 6e 74 20  oadInfo {.  int 
4740: 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20  regResult;      
4750: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72           /* Stor
4760: 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 72 72  e results in arr
4770: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
4780: 68 65 72 65 20 2a 2f 0a 20 20 75 38 20 65 63 65  here */.  u8 ece
4790: 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  lFlags;         
47a0: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 61         /* Flag a
47b0: 72 67 75 6d 65 6e 74 20 74 6f 20 45 78 70 72 43  rgument to ExprC
47c0: 6f 64 65 45 78 70 72 4c 69 73 74 28 29 20 2a 2f  odeExprList() */
47d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
47e0: 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
47f0: 45 52 45 4e 43 45 53 0a 20 20 45 78 70 72 4c 69  ERENCES.  ExprLi
4800: 73 74 20 2a 70 45 78 74 72 61 3b 20 20 20 20 20  st *pExtra;     
4810: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
4820: 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 62  columns needed b
4830: 79 20 73 6f 72 74 65 72 20 72 65 66 73 20 2a 2f  y sorter refs */
4840: 0a 20 20 69 6e 74 20 72 65 67 45 78 74 72 61 52  .  int regExtraR
4850: 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20  esult;          
4860: 2f 2a 20 57 68 65 72 65 20 74 6f 20 6c 6f 61 64  /* Where to load
4870: 20 74 68 65 20 65 78 74 72 61 20 63 6f 6c 75 6d   the extra colum
4880: 6e 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  ns */.#endif.};.
4890: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
48a0: 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77 6f 72  ine does the wor
48b0: 6b 20 6f 66 20 6c 6f 61 64 69 6e 67 20 71 75 65  k of loading que
48c0: 72 79 20 64 61 74 61 20 69 6e 74 6f 20 61 6e 20  ry data into an 
48d0: 61 72 72 61 79 20 6f 66 0a 2a 2a 20 72 65 67 69  array of.** regi
48e0: 73 74 65 72 73 20 73 6f 20 74 68 61 74 20 69 74  sters so that it
48f0: 20 63 61 6e 20 62 65 20 61 64 64 65 64 20 74 6f   can be added to
4900: 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a   the sorter..*/.
4910: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 6e 65  static void inne
4920: 72 4c 6f 6f 70 4c 6f 61 64 52 6f 77 28 0a 20 20  rLoopLoadRow(.  
4930: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4940: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
4950: 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f  atement under co
4960: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
4970: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
4980: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
4990: 65 20 71 75 65 72 79 20 62 65 69 6e 67 20 63 6f  e query being co
49a0: 64 65 64 20 2a 2f 0a 20 20 52 6f 77 4c 6f 61 64  ded */.  RowLoad
49b0: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
49c0: 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6e 65 65 64      /* Info need
49d0: 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  ed to complete t
49e0: 68 65 20 72 6f 77 20 6c 6f 61 64 20 2a 2f 0a 29  he row load */.)
49f0: 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  {.  sqlite3ExprC
4a00: 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
4a10: 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  se, pSelect->pEL
4a20: 69 73 74 2c 20 70 49 6e 66 6f 2d 3e 72 65 67 52  ist, pInfo->regR
4a30: 65 73 75 6c 74 2c 0a 20 20 20 20 20 20 20 20 20  esult,.         
4a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a50: 20 30 2c 20 70 49 6e 66 6f 2d 3e 65 63 65 6c 46   0, pInfo->ecelF
4a60: 6c 61 67 73 29 3b 0a 23 69 66 64 65 66 20 53 51  lags);.#ifdef SQ
4a70: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
4a80: 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20  ER_REFERENCES.  
4a90: 69 66 28 20 70 49 6e 66 6f 2d 3e 70 45 78 74 72  if( pInfo->pExtr
4aa0: 61 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  a ){.    sqlite3
4ab0: 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
4ac0: 28 70 50 61 72 73 65 2c 20 70 49 6e 66 6f 2d 3e  (pParse, pInfo->
4ad0: 70 45 78 74 72 61 2c 20 70 49 6e 66 6f 2d 3e 72  pExtra, pInfo->r
4ae0: 65 67 45 78 74 72 61 52 65 73 75 6c 74 2c 20 30  egExtraResult, 0
4af0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
4b00: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
4b10: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e 66  pParse->db, pInf
4b20: 6f 2d 3e 70 45 78 74 72 61 29 3b 0a 20 20 7d 0a  o->pExtra);.  }.
4b30: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
4b40: 43 6f 64 65 20 74 68 65 20 4f 50 5f 4d 61 6b 65  Code the OP_Make
4b50: 52 65 63 6f 72 64 20 69 6e 73 74 72 75 63 74 69  Record instructi
4b60: 6f 6e 20 74 68 61 74 20 67 65 6e 65 72 61 74 65  on that generate
4b70: 73 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 62  s the entry to b
4b80: 65 0a 2a 2a 20 61 64 64 65 64 20 69 6e 74 6f 20  e.** added into 
4b90: 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2a 0a 2a  the sorter..**.*
4ba0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67  * Return the reg
4bb0: 69 73 74 65 72 20 69 6e 20 77 68 69 63 68 20 74  ister in which t
4bc0: 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f  he result is sto
4bd0: 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
4be0: 6e 74 20 6d 61 6b 65 53 6f 72 74 65 72 52 65 63  nt makeSorterRec
4bf0: 6f 72 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ord(.  Parse *pP
4c00: 61 72 73 65 2c 0a 20 20 53 6f 72 74 43 74 78 20  arse,.  SortCtx 
4c10: 2a 70 53 6f 72 74 2c 0a 20 20 53 65 6c 65 63 74  *pSort,.  Select
4c20: 20 2a 70 53 65 6c 65 63 74 2c 0a 20 20 69 6e 74   *pSelect,.  int
4c30: 20 72 65 67 42 61 73 65 2c 0a 20 20 69 6e 74 20   regBase,.  int 
4c40: 6e 42 61 73 65 0a 29 7b 0a 20 20 69 6e 74 20 6e  nBase.){.  int n
4c50: 4f 42 53 61 74 20 3d 20 70 53 6f 72 74 2d 3e 6e  OBSat = pSort->n
4c60: 4f 42 53 61 74 3b 0a 20 20 56 64 62 65 20 2a 76  OBSat;.  Vdbe *v
4c70: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
4c80: 3b 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20 3d  ;.  int regOut =
4c90: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
4ca0: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 70 44  .  if( pSort->pD
4cb0: 65 66 65 72 72 65 64 52 6f 77 4c 6f 61 64 20 29  eferredRowLoad )
4cc0: 7b 0a 20 20 20 20 69 6e 6e 65 72 4c 6f 6f 70 4c  {.    innerLoopL
4cd0: 6f 61 64 52 6f 77 28 70 50 61 72 73 65 2c 20 70  oadRow(pParse, p
4ce0: 53 65 6c 65 63 74 2c 20 70 53 6f 72 74 2d 3e 70  Select, pSort->p
4cf0: 44 65 66 65 72 72 65 64 52 6f 77 4c 6f 61 64 29  DeferredRowLoad)
4d00: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
4d10: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
4d20: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42  MakeRecord, regB
4d30: 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73  ase+nOBSat, nBas
4d40: 65 2d 6e 4f 42 53 61 74 2c 20 72 65 67 4f 75 74  e-nOBSat, regOut
4d50: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67 4f  );.  return regO
4d60: 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ut;.}../*.** Gen
4d70: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
4d80: 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72 65  will push the re
4d90: 63 6f 72 64 20 69 6e 20 72 65 67 69 73 74 65 72  cord in register
4da0: 73 20 72 65 67 44 61 74 61 0a 2a 2a 20 74 68 72  s regData.** thr
4db0: 6f 75 67 68 20 72 65 67 44 61 74 61 2b 6e 44 61  ough regData+nDa
4dc0: 74 61 2d 31 20 6f 6e 74 6f 20 74 68 65 20 73 6f  ta-1 onto the so
4dd0: 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rter..*/.static 
4de0: 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72  void pushOntoSor
4df0: 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ter(.  Parse *pP
4e00: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
4e10: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
4e20: 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53  */.  SortCtx *pS
4e30: 6f 72 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 49  ort,        /* I
4e40: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
4e50: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
4e60: 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ause */.  Select
4e70: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20   *pSelect,      
4e80: 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53 45   /* The whole SE
4e90: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
4ea0: 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61 2c  /.  int regData,
4eb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
4ec0: 72 73 74 20 72 65 67 69 73 74 65 72 20 68 6f 6c  rst register hol
4ed0: 64 69 6e 67 20 64 61 74 61 20 74 6f 20 62 65 20  ding data to be 
4ee0: 73 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  sorted */.  int 
4ef0: 72 65 67 4f 72 69 67 44 61 74 61 2c 20 20 20 20  regOrigData,    
4f00: 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69     /* First regi
4f10: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74  ster holding dat
4f20: 61 20 62 65 66 6f 72 65 20 70 61 63 6b 69 6e 67  a before packing
4f30: 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c   */.  int nData,
4f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4f50: 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
4f60: 74 73 20 69 6e 20 74 68 65 20 72 65 67 44 61 74  ts in the regDat
4f70: 61 20 64 61 74 61 20 61 72 72 61 79 20 2a 2f 0a  a data array */.
4f80: 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67    int nPrefixReg
4f90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20           /* No. 
4fa0: 6f 66 20 72 65 67 20 70 72 69 6f 72 20 74 6f 20  of reg prior to 
4fb0: 72 65 67 44 61 74 61 20 61 76 61 69 6c 61 62 6c  regData availabl
4fc0: 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29 7b 0a  e for use */.){.
4fd0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
4fe0: 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
4ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5000: 20 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64 65 72     /* Stmt under
5010: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
5020: 0a 20 20 69 6e 74 20 62 53 65 71 20 3d 20 28 28  .  int bSeq = ((
5030: 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73  pSort->sortFlags
5040: 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53   & SORTFLAG_UseS
5050: 6f 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20 69 6e  orter)==0);.  in
5060: 74 20 6e 45 78 70 72 20 3d 20 70 53 6f 72 74 2d  t nExpr = pSort-
5070: 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
5080: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
5090: 2a 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52 20 42  * No. of ORDER B
50a0: 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74  Y terms */.  int
50b0: 20 6e 42 61 73 65 20 3d 20 6e 45 78 70 72 20 2b   nBase = nExpr +
50c0: 20 62 53 65 71 20 2b 20 6e 44 61 74 61 3b 20 20   bSeq + nData;  
50d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
50e0: 20 46 69 65 6c 64 73 20 69 6e 20 73 6f 72 74 65   Fields in sorte
50f0: 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  r record */.  in
5100: 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20  t regBase;      
5110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5130: 2a 20 52 65 67 73 20 66 6f 72 20 73 6f 72 74 65  * Regs for sorte
5140: 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  r record */.  in
5150: 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20 30 3b  t regRecord = 0;
5160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5180: 2a 20 41 73 73 65 6d 62 6c 65 64 20 73 6f 72 74  * Assembled sort
5190: 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  er record */.  i
51a0: 6e 74 20 6e 4f 42 53 61 74 20 3d 20 70 53 6f 72  nt nOBSat = pSor
51b0: 74 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20 20 20  t->nOBSat;      
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51d0: 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  /* ORDER BY term
51e0: 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 69  s to skip */.  i
51f0: 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
5200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5210: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f 20 61    /* Opcode to a
5220: 64 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  dd sorter record
5230: 20 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20   to sorter */.  
5240: 69 6e 74 20 69 4c 69 6d 69 74 3b 20 20 20 20 20  int iLimit;     
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5260: 20 20 20 2f 2a 20 4c 49 4d 49 54 20 63 6f 75 6e     /* LIMIT coun
5270: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6b  ter */.  int iSk
5280: 69 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ip = 0;         
5290: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
52a0: 6e 64 20 6f 66 20 74 68 65 20 73 6f 72 74 65 72  nd of the sorter
52b0: 20 69 6e 73 65 72 74 20 6c 6f 6f 70 20 2a 2f 0a   insert loop */.
52c0: 0a 20 20 61 73 73 65 72 74 28 20 62 53 65 71 3d  .  assert( bSeq=
52d0: 3d 30 20 7c 7c 20 62 53 65 71 3d 3d 31 20 29 3b  =0 || bSeq==1 );
52e0: 0a 0a 20 20 2f 2a 20 54 68 72 65 65 20 63 61 73  ..  /* Three cas
52f0: 65 73 3a 0a 20 20 2a 2a 20 20 20 28 31 29 20 54  es:.  **   (1) T
5300: 68 65 20 64 61 74 61 20 74 6f 20 62 65 20 73 6f  he data to be so
5310: 72 74 65 64 20 68 61 73 20 61 6c 72 65 61 64 79  rted has already
5320: 20 62 65 65 6e 20 70 61 63 6b 65 64 20 69 6e 74   been packed int
5330: 6f 20 61 20 52 65 63 6f 72 64 0a 20 20 2a 2a 20  o a Record.  ** 
5340: 20 20 20 20 20 20 62 79 20 61 20 70 72 69 6f 72        by a prior
5350: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 20   OP_MakeRecord. 
5360: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6e 44   In this case nD
5370: 61 74 61 3d 3d 31 20 61 6e 64 20 72 65 67 44 61  ata==1 and regDa
5380: 74 61 0a 20 20 2a 2a 20 20 20 20 20 20 20 77 69  ta.  **       wi
5390: 6c 6c 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79  ll be completely
53a0: 20 75 6e 72 65 6c 61 74 65 64 20 74 6f 20 72 65   unrelated to re
53b0: 67 4f 72 69 67 44 61 74 61 2e 0a 20 20 2a 2a 20  gOrigData..  ** 
53c0: 20 20 28 32 29 20 41 6c 6c 20 6f 75 74 70 75 74    (2) All output
53d0: 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 69 6e 63   columns are inc
53e0: 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73 6f 72  luded in the sor
53f0: 74 20 72 65 63 6f 72 64 2e 20 20 49 6e 20 74 68  t record.  In th
5400: 61 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 63 61  at.  **       ca
5410: 73 65 20 72 65 67 44 61 74 61 3d 3d 72 65 67 4f  se regData==regO
5420: 72 69 67 44 61 74 61 2e 0a 20 20 2a 2a 20 20 20  rigData..  **   
5430: 28 33 29 20 53 6f 6d 65 20 6f 75 74 70 75 74 20  (3) Some output 
5440: 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6f 6d 69 74  columns are omit
5450: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73 6f 72  ted from the sor
5460: 74 20 72 65 63 6f 72 64 20 64 75 65 20 74 6f 0a  t record due to.
5470: 20 20 2a 2a 20 20 20 20 20 20 20 74 68 65 20 53    **       the S
5480: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52  QLITE_ENABLE_SOR
5490: 54 45 52 5f 52 45 46 45 52 45 4e 43 45 20 6f 70  TER_REFERENCE op
54a0: 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 6f 72 20 64  timization, or d
54b0: 75 65 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 20  ue to the.  **  
54c0: 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c       SQLITE_ECEL
54d0: 5f 4f 4d 49 54 52 45 46 20 6f 70 74 69 6d 69 7a  _OMITREF optimiz
54e0: 61 74 69 6f 6e 2c 20 6f 72 20 64 75 65 20 74 6f  ation, or due to
54f0: 20 74 68 65 20 0a 20 20 2a 2a 20 20 20 20 20 20   the .  **      
5500: 20 53 6f 72 74 43 74 78 2e 70 44 65 66 65 72 72   SortCtx.pDeferr
5510: 65 64 52 6f 77 4c 6f 61 64 20 6f 70 74 69 6d 69  edRowLoad optimi
5520: 61 74 69 6f 6e 2e 20 20 49 6e 20 61 6e 79 20 6f  ation.  In any o
5530: 66 20 74 68 65 73 65 20 63 61 73 65 73 0a 20 20  f these cases.  
5540: 2a 2a 20 20 20 20 20 20 20 72 65 67 4f 72 69 67  **       regOrig
5550: 44 61 74 61 20 69 73 20 30 20 74 6f 20 70 72 65  Data is 0 to pre
5560: 76 65 6e 74 20 74 68 69 73 20 72 6f 75 74 69 6e  vent this routin
5570: 65 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f  e from trying to
5580: 20 63 6f 70 79 0a 20 20 2a 2a 20 20 20 20 20 20   copy.  **      
5590: 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d 69 67   values that mig
55a0: 68 74 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74  ht not yet exist
55b0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
55c0: 20 6e 44 61 74 61 3d 3d 31 20 7c 7c 20 72 65 67   nData==1 || reg
55d0: 44 61 74 61 3d 3d 72 65 67 4f 72 69 67 44 61 74  Data==regOrigDat
55e0: 61 20 7c 7c 20 72 65 67 4f 72 69 67 44 61 74 61  a || regOrigData
55f0: 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 6e 50  ==0 );..  if( nP
5600: 72 65 66 69 78 52 65 67 20 29 7b 0a 20 20 20 20  refixReg ){.    
5610: 61 73 73 65 72 74 28 20 6e 50 72 65 66 69 78 52  assert( nPrefixR
5620: 65 67 3d 3d 6e 45 78 70 72 2b 62 53 65 71 20 29  eg==nExpr+bSeq )
5630: 3b 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20  ;.    regBase = 
5640: 72 65 67 44 61 74 61 20 2d 20 6e 50 72 65 66 69  regData - nPrefi
5650: 78 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  xReg;.  }else{. 
5660: 20 20 20 72 65 67 42 61 73 65 20 3d 20 70 50 61     regBase = pPa
5670: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
5680: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
5690: 2b 3d 20 6e 42 61 73 65 3b 0a 20 20 7d 0a 20 20  += nBase;.  }.  
56a0: 61 73 73 65 72 74 28 20 70 53 65 6c 65 63 74 2d  assert( pSelect-
56b0: 3e 69 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70  >iOffset==0 || p
56c0: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 21 3d  Select->iLimit!=
56d0: 30 20 29 3b 0a 20 20 69 4c 69 6d 69 74 20 3d 20  0 );.  iLimit = 
56e0: 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74  pSelect->iOffset
56f0: 20 3f 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66   ? pSelect->iOff
5700: 73 65 74 2b 31 20 3a 20 70 53 65 6c 65 63 74 2d  set+1 : pSelect-
5710: 3e 69 4c 69 6d 69 74 3b 0a 20 20 70 53 6f 72 74  >iLimit;.  pSort
5720: 2d 3e 6c 61 62 65 6c 44 6f 6e 65 20 3d 20 73 71  ->labelDone = sq
5730: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
5740: 65 6c 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  el(v);.  sqlite3
5750: 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
5760: 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e  (pParse, pSort->
5770: 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42 61 73  pOrderBy, regBas
5780: 65 2c 20 72 65 67 4f 72 69 67 44 61 74 61 2c 0a  e, regOrigData,.
5790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57a0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
57b0: 5f 45 43 45 4c 5f 44 55 50 20 7c 20 28 72 65 67  _ECEL_DUP | (reg
57c0: 4f 72 69 67 44 61 74 61 3f 20 53 51 4c 49 54 45  OrigData? SQLITE
57d0: 5f 45 43 45 4c 5f 52 45 46 20 3a 20 30 29 29 3b  _ECEL_REF : 0));
57e0: 0a 20 20 69 66 28 20 62 53 65 71 20 29 7b 0a 20  .  if( bSeq ){. 
57f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5800: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65  dOp2(v, OP_Seque
5810: 6e 63 65 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75  nce, pSort->iECu
5820: 72 73 6f 72 2c 20 72 65 67 42 61 73 65 2b 6e 45  rsor, regBase+nE
5830: 78 70 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  xpr);.  }.  if( 
5840: 6e 50 72 65 66 69 78 52 65 67 3d 3d 30 20 26 26  nPrefixReg==0 &&
5850: 20 6e 44 61 74 61 3e 30 20 29 7b 0a 20 20 20 20   nData>0 ){.    
5860: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
5870: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 44  ove(pParse, regD
5880: 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e 45 78  ata, regBase+nEx
5890: 70 72 2b 62 53 65 71 2c 20 6e 44 61 74 61 29 3b  pr+bSeq, nData);
58a0: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4f 42 53 61  .  }.  if( nOBSa
58b0: 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  t>0 ){.    int r
58c0: 65 67 50 72 65 76 4b 65 79 3b 20 20 20 2f 2a 20  egPrevKey;   /* 
58d0: 54 68 65 20 66 69 72 73 74 20 6e 4f 42 53 61 74  The first nOBSat
58e0: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
58f0: 70 72 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a  previous row */.
5900: 20 20 20 20 69 6e 74 20 61 64 64 72 46 69 72 73      int addrFirs
5910: 74 3b 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  t;    /* Address
5920: 20 6f 66 20 74 68 65 20 4f 50 5f 49 66 4e 6f 74   of the OP_IfNot
5930: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 69   opcode */.    i
5940: 6e 74 20 61 64 64 72 4a 6d 70 3b 20 20 20 20 20  nt addrJmp;     
5950: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
5960: 68 65 20 4f 50 5f 4a 75 6d 70 20 6f 70 63 6f 64  he OP_Jump opcod
5970: 65 20 2a 2f 0a 20 20 20 20 56 64 62 65 4f 70 20  e */.    VdbeOp 
5980: 2a 70 4f 70 3b 20 20 20 20 20 20 2f 2a 20 4f 70  *pOp;      /* Op
5990: 63 6f 64 65 20 74 68 61 74 20 6f 70 65 6e 73 20  code that opens 
59a0: 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20  the sorter */.  
59b0: 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20    int nKey;     
59c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
59d0: 20 73 6f 72 74 69 6e 67 20 6b 65 79 20 63 6f 6c   sorting key col
59e0: 75 6d 6e 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20  umns, including 
59f0: 4f 50 5f 53 65 71 75 65 6e 63 65 20 2a 2f 0a 20  OP_Sequence */. 
5a00: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 49 3b     KeyInfo *pKI;
5a10: 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
5a20: 20 4b 65 79 49 6e 66 6f 20 6f 6e 20 74 68 65 20   KeyInfo on the 
5a30: 73 6f 72 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a  sorter table */.
5a40: 0a 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d  .    regRecord =
5a50: 20 6d 61 6b 65 53 6f 72 74 65 72 52 65 63 6f 72   makeSorterRecor
5a60: 64 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c  d(pParse, pSort,
5a70: 20 70 53 65 6c 65 63 74 2c 20 72 65 67 42 61 73   pSelect, regBas
5a80: 65 2c 20 6e 42 61 73 65 29 3b 0a 20 20 20 20 72  e, nBase);.    r
5a90: 65 67 50 72 65 76 4b 65 79 20 3d 20 70 50 61 72  egPrevKey = pPar
5aa0: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
5ab0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
5ac0: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20  pSort->nOBSat;. 
5ad0: 20 20 20 6e 4b 65 79 20 3d 20 6e 45 78 70 72 20     nKey = nExpr 
5ae0: 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 20  - pSort->nOBSat 
5af0: 2b 20 62 53 65 71 3b 0a 20 20 20 20 69 66 28 20  + bSeq;.    if( 
5b00: 62 53 65 71 20 29 7b 0a 20 20 20 20 20 20 61 64  bSeq ){.      ad
5b10: 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65  drFirst = sqlite
5b20: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
5b30: 50 5f 49 66 4e 6f 74 2c 20 72 65 67 42 61 73 65  P_IfNot, regBase
5b40: 2b 6e 45 78 70 72 29 3b 20 0a 20 20 20 20 7d 65  +nExpr); .    }e
5b50: 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 46  lse{.      addrF
5b60: 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  irst = sqlite3Vd
5b70: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53  beAddOp1(v, OP_S
5b80: 65 71 75 65 6e 63 65 54 65 73 74 2c 20 70 53 6f  equenceTest, pSo
5b90: 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20  rt->iECursor);. 
5ba0: 20 20 20 7d 0a 20 20 20 20 56 64 62 65 43 6f 76     }.    VdbeCov
5bb0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
5bc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5bd0: 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72  v, OP_Compare, r
5be0: 65 67 50 72 65 76 4b 65 79 2c 20 72 65 67 42 61  egPrevKey, regBa
5bf0: 73 65 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  se, pSort->nOBSa
5c00: 74 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20 73 71  t);.    pOp = sq
5c10: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
5c20: 2c 20 70 53 6f 72 74 2d 3e 61 64 64 72 53 6f 72  , pSort->addrSor
5c30: 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28  tIndex);.    if(
5c40: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
5c50: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
5c60: 72 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20  rn;.    pOp->p2 
5c70: 3d 20 6e 4b 65 79 20 2b 20 6e 44 61 74 61 3b 0a  = nKey + nData;.
5c80: 20 20 20 20 70 4b 49 20 3d 20 70 4f 70 2d 3e 70      pKI = pOp->p
5c90: 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  4.pKeyInfo;.    
5ca0: 6d 65 6d 73 65 74 28 70 4b 49 2d 3e 61 53 6f 72  memset(pKI->aSor
5cb0: 74 4f 72 64 65 72 2c 20 30 2c 20 70 4b 49 2d 3e  tOrder, 0, pKI->
5cc0: 6e 4b 65 79 46 69 65 6c 64 29 3b 20 2f 2a 20 4d  nKeyField); /* M
5cd0: 61 6b 65 73 20 4f 50 5f 4a 75 6d 70 20 74 65 73  akes OP_Jump tes
5ce0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c  table */.    sql
5cf0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
5d00: 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70  (v, -1, (char*)p
5d10: 4b 49 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  KI, P4_KEYINFO);
5d20: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
5d30: 4b 49 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 3e 20  KI->nAllField > 
5d40: 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c 64 2b 32  pKI->nKeyField+2
5d50: 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   );.    pOp->p4.
5d60: 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
5d70: 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  e3KeyInfoFromExp
5d80: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 70 53 6f  rList(pParse,pSo
5d90: 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c 6e 4f 42  rt->pOrderBy,nOB
5da0: 53 61 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Sat,.           
5db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dd0: 70 4b 49 2d 3e 6e 41 6c 6c 46 69 65 6c 64 2d 70  pKI->nAllField-p
5de0: 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c 64 2d 31 29  KI->nKeyField-1)
5df0: 3b 0a 20 20 20 20 61 64 64 72 4a 6d 70 20 3d 20  ;.    addrJmp = 
5e00: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
5e10: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73  ntAddr(v);.    s
5e20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
5e30: 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64  (v, OP_Jump, add
5e40: 72 4a 6d 70 2b 31 2c 20 30 2c 20 61 64 64 72 4a  rJmp+1, 0, addrJ
5e50: 6d 70 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72  mp+1); VdbeCover
5e60: 61 67 65 28 76 29 3b 0a 20 20 20 20 70 53 6f 72  age(v);.    pSor
5e70: 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 3d 20  t->labelBkOut = 
5e80: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
5e90: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 70 53 6f  abel(v);.    pSo
5ea0: 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20  rt->regReturn = 
5eb0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
5ec0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5ed0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
5ee0: 62 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74  b, pSort->regRet
5ef0: 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65  urn, pSort->labe
5f00: 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c  lBkOut);.    sql
5f10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
5f20: 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72  , OP_ResetSorter
5f30: 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  , pSort->iECurso
5f40: 72 29 3b 0a 20 20 20 20 69 66 28 20 69 4c 69 6d  r);.    if( iLim
5f50: 69 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  it ){.      sqli
5f60: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5f70: 20 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69   OP_IfNot, iLimi
5f80: 74 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44  t, pSort->labelD
5f90: 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65  one);.      Vdbe
5fa0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
5fb0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
5fc0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
5fd0: 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 73 71  drFirst);.    sq
5fe0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
5ff0: 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
6000: 65 2c 20 72 65 67 50 72 65 76 4b 65 79 2c 20 70  e, regPrevKey, p
6010: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20  Sort->nOBSat);. 
6020: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
6030: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4a 6d  mpHere(v, addrJm
6040: 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 4c  p);.  }.  if( iL
6050: 69 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20 41  imit ){.    /* A
6060: 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
6070: 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20   values for the 
6080: 6e 65 77 20 73 6f 72 74 65 72 20 65 6e 74 72 79  new sorter entry
6090: 20 61 72 65 20 73 74 6f 72 65 64 0a 20 20 20 20   are stored.    
60a0: 2a 2a 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  ** in an array o
60b0: 66 20 72 65 67 69 73 74 65 72 73 2e 20 54 68 65  f registers. The
60c0: 79 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 6d  y need to be com
60d0: 70 6f 73 65 64 20 69 6e 74 6f 20 61 20 72 65 63  posed into a rec
60e0: 6f 72 64 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69  ord.    ** and i
60f0: 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65  nserted into the
6100: 20 73 6f 72 74 65 72 20 69 66 20 65 69 74 68 65   sorter if eithe
6110: 72 20 28 61 29 20 74 68 65 72 65 20 61 72 65 20  r (a) there are 
6120: 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a 2a  currently.    **
6130: 20 6c 65 73 73 20 74 68 61 6e 20 4c 49 4d 49 54   less than LIMIT
6140: 2b 4f 46 46 53 45 54 20 69 74 65 6d 73 20 6f 72  +OFFSET items or
6150: 20 28 62 29 20 74 68 65 20 6e 65 77 20 72 65 63   (b) the new rec
6160: 6f 72 64 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  ord is smaller t
6170: 68 61 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  han .    ** the 
6180: 6c 61 72 67 65 73 74 20 72 65 63 6f 72 64 20 63  largest record c
6190: 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
61a0: 73 6f 72 74 65 72 2e 20 49 66 20 28 62 29 20 69  sorter. If (b) i
61b0: 73 20 74 72 75 65 20 61 6e 64 20 74 68 65 72 65  s true and there
61c0: 0a 20 20 20 20 2a 2a 20 61 72 65 20 61 6c 72 65  .    ** are alre
61d0: 61 64 79 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54  ady LIMIT+OFFSET
61e0: 20 69 74 65 6d 73 20 69 6e 20 74 68 65 20 73 6f   items in the so
61f0: 72 74 65 72 2c 20 64 65 6c 65 74 65 20 74 68 65  rter, delete the
6200: 20 6c 61 72 67 65 73 74 0a 20 20 20 20 2a 2a 20   largest.    ** 
6210: 65 6e 74 72 79 20 62 65 66 6f 72 65 20 69 6e 73  entry before ins
6220: 65 72 74 69 6e 67 20 74 68 65 20 6e 65 77 20 6f  erting the new o
6230: 6e 65 2e 20 54 68 69 73 20 77 61 79 20 74 68 65  ne. This way the
6240: 72 65 20 61 72 65 20 6e 65 76 65 72 20 6d 6f 72  re are never mor
6250: 65 20 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 4c  e .    ** than L
6260: 49 4d 49 54 2b 4f 46 46 53 45 54 20 69 74 65 6d  IMIT+OFFSET item
6270: 73 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 2e  s in the sorter.
6280: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
6290: 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64  f the new record
62a0: 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
62b0: 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e  o be inserted in
62c0: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2c 0a 20  to the sorter,. 
62d0: 20 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20 74 68     ** jump to th
62e0: 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  e next iteration
62f0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 49 66   of the loop. If
6300: 20 74 68 65 20 70 53 6f 72 74 2d 3e 6c 61 62 65   the pSort->labe
6310: 6c 4f 42 4c 6f 70 74 0a 20 20 20 20 2a 2a 20 76  lOBLopt.    ** v
6320: 61 6c 75 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  alue is not zero
6330: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 6c  , then it is a l
6340: 61 62 65 6c 20 6f 66 20 77 68 65 72 65 20 74 6f  abel of where to
6350: 20 6a 75 6d 70 2e 20 20 4f 74 68 65 72 77 69 73   jump.  Otherwis
6360: 65 2c 0a 20 20 20 20 2a 2a 20 6a 75 73 74 20 62  e,.    ** just b
6370: 79 70 61 73 73 20 74 68 65 20 72 6f 77 20 69 6e  ypass the row in
6380: 73 65 72 74 20 6c 6f 67 69 63 2e 20 20 53 65 65  sert logic.  See
6390: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
63a0: 65 6e 74 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ent on the.    *
63b0: 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 72  * sqlite3WhereOr
63c0: 64 65 72 42 79 4c 69 6d 69 74 4f 70 74 4c 61 62  derByLimitOptLab
63d0: 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  el() function fo
63e0: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
63f0: 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  o..    */.    in
6400: 74 20 69 43 73 72 20 3d 20 70 53 6f 72 74 2d 3e  t iCsr = pSort->
6410: 69 45 43 75 72 73 6f 72 3b 0a 20 20 20 20 73 71  iECursor;.    sq
6420: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6430: 76 2c 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f 2c  v, OP_IfNotZero,
6440: 20 69 4c 69 6d 69 74 2c 20 73 71 6c 69 74 65 33   iLimit, sqlite3
6450: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
6460: 76 29 2b 34 29 3b 0a 20 20 20 20 56 64 62 65 43  v)+4);.    VdbeC
6470: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
6480: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6490: 32 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 69 43  2(v, OP_Last, iC
64a0: 73 72 2c 20 30 29 3b 0a 20 20 20 20 69 53 6b 69  sr, 0);.    iSki
64b0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
64c0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
64d0: 64 78 4c 45 2c 0a 20 20 20 20 20 20 20 20 20 20  dxLE,.          
64e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64f0: 20 20 20 20 20 20 20 69 43 73 72 2c 20 30 2c 20         iCsr, 0, 
6500: 72 65 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20  regBase+nOBSat, 
6510: 6e 45 78 70 72 2d 6e 4f 42 53 61 74 29 3b 0a 20  nExpr-nOBSat);. 
6520: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
6530: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
6540: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
6550: 44 65 6c 65 74 65 2c 20 69 43 73 72 29 3b 0a 20  Delete, iCsr);. 
6560: 20 7d 0a 20 20 69 66 28 20 72 65 67 52 65 63 6f   }.  if( regReco
6570: 72 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 67  rd==0 ){.    reg
6580: 52 65 63 6f 72 64 20 3d 20 6d 61 6b 65 53 6f 72  Record = makeSor
6590: 74 65 72 52 65 63 6f 72 64 28 70 50 61 72 73 65  terRecord(pParse
65a0: 2c 20 70 53 6f 72 74 2c 20 70 53 65 6c 65 63 74  , pSort, pSelect
65b0: 2c 20 72 65 67 42 61 73 65 2c 20 6e 42 61 73 65  , regBase, nBase
65c0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f  );.  }.  if( pSo
65d0: 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20  rt->sortFlags & 
65e0: 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
65f0: 65 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 4f  er ){.    op = O
6600: 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 3b 0a  P_SorterInsert;.
6610: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20    }else{.    op 
6620: 3d 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 3b 0a  = OP_IdxInsert;.
6630: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
6640: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70  eAddOp4Int(v, op
6650: 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  , pSort->iECurso
6660: 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a 20 20  r, regRecord,.  
6670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6680: 20 20 20 20 20 72 65 67 42 61 73 65 2b 6e 4f 42       regBase+nOB
6690: 53 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61  Sat, nBase-nOBSa
66a0: 74 29 3b 0a 20 20 69 66 28 20 69 53 6b 69 70 20  t);.  if( iSkip 
66b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
66c0: 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 69 53  beChangeP2(v, iS
66d0: 6b 69 70 2c 0a 20 20 20 20 20 20 20 20 20 70 53  kip,.         pS
66e0: 6f 72 74 2d 3e 6c 61 62 65 6c 4f 42 4c 6f 70 74  ort->labelOBLopt
66f0: 20 3f 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 4f   ? pSort->labelO
6700: 42 4c 6f 70 74 20 3a 20 73 71 6c 69 74 65 33 56  BLopt : sqlite3V
6710: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
6720: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ));.  }.}../*.**
6730: 20 41 64 64 20 63 6f 64 65 20 74 6f 20 69 6d 70   Add code to imp
6740: 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46 46 53 45  lement the OFFSE
6750: 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  T.*/.static void
6760: 20 63 6f 64 65 4f 66 66 73 65 74 28 0a 20 20 56   codeOffset(.  V
6770: 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
6780: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
6790: 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a  e into this VM *
67a0: 2f 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 2c  /.  int iOffset,
67b0: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
67c0: 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 66  r holding the of
67d0: 66 73 65 74 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  fset counter */.
67e0: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20    int iContinue 
67f0: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
6800: 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72   to skip the cur
6810: 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 29  rent record */.)
6820: 7b 0a 20 20 69 66 28 20 69 4f 66 66 73 65 74 3e  {.  if( iOffset>
6830: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
6840: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6850: 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73 65 74 2c  _IfPos, iOffset,
6860: 20 69 43 6f 6e 74 69 6e 75 65 2c 20 31 29 3b 20   iContinue, 1); 
6870: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
6880: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
6890: 28 28 76 2c 20 22 4f 46 46 53 45 54 22 29 29 3b  ((v, "OFFSET"));
68a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
68b0: 64 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  d code that will
68c0: 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   check to make s
68d0: 75 72 65 20 74 68 65 20 4e 20 72 65 67 69 73 74  ure the N regist
68e0: 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ers starting at 
68f0: 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64  iMem.** form a d
6900: 69 73 74 69 6e 63 74 20 65 6e 74 72 79 2e 20 20  istinct entry.  
6910: 69 54 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e  iTab is a sortin
6920: 67 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c  g index that hol
6930: 64 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a  ds previously.**
6940: 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f   seen combinatio
6950: 6e 73 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75  ns of the N valu
6960: 65 73 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79  es.  A new entry
6970: 20 69 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62   is made in iTab
6980: 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72 72 65  .** if the curre
6990: 6e 74 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20  nt N values are 
69a0: 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d  new..**.** A jum
69b0: 70 20 74 6f 20 61 64 64 72 52 65 70 65 61 74 20  p to addrRepeat 
69c0: 69 73 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20  is made and the 
69d0: 4e 2b 31 20 76 61 6c 75 65 73 20 61 72 65 20 70  N+1 values are p
69e0: 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  opped from the.*
69f0: 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65 20 74  * stack if the t
6a00: 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72  op N elements ar
6a10: 65 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a  e not distinct..
6a20: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
6a30: 6f 64 65 44 69 73 74 69 6e 63 74 28 0a 20 20 50  odeDistinct(.  P
6a40: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
6a50: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
6a60: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
6a70: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
6a80: 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  t iTab,         
6a90: 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e   /* A sorting in
6aa0: 64 65 78 20 75 73 65 64 20 74 6f 20 74 65 73 74  dex used to test
6ab0: 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73   for distinctnes
6ac0: 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52  s */.  int addrR
6ad0: 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d  epeat,    /* Jum
6ae0: 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74  p to here if not
6af0: 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69   distinct */.  i
6b00: 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20  nt N,           
6b10: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
6b20: 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  lements */.  int
6b30: 20 69 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20   iMem           
6b40: 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74  /* First element
6b50: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
6b60: 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76  ;.  int r1;..  v
6b70: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
6b80: 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33  ;.  r1 = sqlite3
6b90: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
6ba0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
6bb0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
6bc0: 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61 64  _Found, iTab, ad
6bd0: 64 72 52 65 70 65 61 74 2c 20 69 4d 65 6d 2c 20  drRepeat, iMem, 
6be0: 4e 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  N); VdbeCoverage
6bf0: 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
6c00: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
6c10: 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c  akeRecord, iMem,
6c20: 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74   N, r1);.  sqlit
6c30: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
6c40: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
6c50: 20 69 54 61 62 2c 20 72 31 2c 20 69 4d 65 6d 2c   iTab, r1, iMem,
6c60: 20 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   N);.  sqlite3Vd
6c70: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
6c80: 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55  FLAG_USESEEKRESU
6c90: 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  LT);.  sqlite3Re
6ca0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
6cb0: 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 23 69 66  rse, r1);.}..#if
6cc0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
6cd0: 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e  E_SORTER_REFEREN
6ce0: 43 45 53 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  CES./*.** This f
6cf0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
6d00: 64 20 61 73 20 70 61 72 74 20 6f 66 20 69 6e 6e  d as part of inn
6d10: 65 72 2d 6c 6f 6f 70 20 67 65 6e 65 72 61 74 69  er-loop generati
6d20: 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 0a  on for a SELECT.
6d30: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74  ** statement wit
6d40: 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 74 68  h an ORDER BY th
6d50: 61 74 20 69 73 20 6e 6f 74 20 6f 70 74 69 6d 69  at is not optimi
6d60: 7a 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2e  zed by an index.
6d70: 20 49 74 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e   It .** determin
6d80: 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  es the expressio
6d90: 6e 73 2c 20 69 66 20 61 6e 79 2c 20 74 68 61 74  ns, if any, that
6da0: 20 74 68 65 20 73 6f 72 74 65 72 2d 72 65 66 65   the sorter-refe
6db0: 72 65 6e 63 65 20 0a 2a 2a 20 6f 70 74 69 6d 69  rence .** optimi
6dc0: 7a 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  zation should be
6dd0: 20 75 73 65 64 20 66 6f 72 2e 20 54 68 65 20 73   used for. The s
6de0: 6f 72 74 65 72 2d 72 65 66 65 72 65 6e 63 65 20  orter-reference 
6df0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20  optimization.** 
6e00: 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45  is used for SELE
6e10: 43 54 20 71 75 65 72 69 65 73 20 6c 69 6b 65 3a  CT queries like:
6e20: 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
6e30: 61 2c 20 62 69 67 62 6c 6f 62 20 46 52 4f 4d 20  a, bigblob FROM 
6e40: 74 31 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49  t1 ORDER BY a LI
6e50: 4d 49 54 20 31 30 0a 2a 2a 0a 2a 2a 20 49 66 20  MIT 10.**.** If 
6e60: 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
6e70: 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 78 70   is used for exp
6e80: 72 65 73 73 69 6f 6e 20 22 62 69 67 62 6c 6f 62  ression "bigblob
6e90: 22 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64 20  ", then instead 
6ea0: 6f 66 0a 2a 2a 20 73 74 6f 72 69 6e 67 20 76 61  of.** storing va
6eb0: 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74  lues read from t
6ec0: 68 61 74 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  hat column in th
6ed0: 65 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 73  e sorter records
6ee0: 2c 20 74 68 65 20 50 4b 20 6f 66 0a 2a 2a 20 74  , the PK of.** t
6ef0: 68 65 20 72 6f 77 20 66 72 6f 6d 20 74 61 62 6c  he row from tabl
6f00: 65 20 74 31 20 69 73 20 73 74 6f 72 65 64 20 69  e t1 is stored i
6f10: 6e 73 74 65 61 64 2e 20 54 68 65 6e 2c 20 61 73  nstead. Then, as
6f20: 20 72 65 63 6f 72 64 73 20 61 72 65 20 65 78 74   records are ext
6f30: 72 61 63 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74  racted from.** t
6f40: 68 65 20 73 6f 72 74 65 72 20 74 6f 20 72 65 74  he sorter to ret
6f50: 75 72 6e 20 74 6f 20 74 68 65 20 75 73 65 72 2c  urn to the user,
6f60: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 76 61   the required va
6f70: 6c 75 65 20 6f 66 20 62 69 67 62 6c 6f 62 20 69  lue of bigblob i
6f80: 73 0a 2a 2a 20 72 65 74 72 69 65 76 65 64 20 64  s.** retrieved d
6f90: 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 61 62  irectly from tab
6fa0: 6c 65 20 74 31 2e 20 49 66 20 74 68 65 20 76 61  le t1. If the va
6fb0: 6c 75 65 73 20 61 72 65 20 76 65 72 79 20 6c 61  lues are very la
6fc0: 72 67 65 2c 20 74 68 69 73 20 0a 2a 2a 20 63 61  rge, this .** ca
6fd0: 6e 20 62 65 20 6d 6f 72 65 20 65 66 66 69 63 69  n be more effici
6fe0: 65 6e 74 20 74 68 61 6e 20 73 74 6f 72 69 6e 67  ent than storing
6ff0: 20 74 68 65 6d 20 64 69 72 65 63 74 6c 79 20 69   them directly i
7000: 6e 20 74 68 65 20 73 6f 72 74 65 72 20 72 65 63  n the sorter rec
7010: 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ords..**.** The 
7020: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2e 62 53  ExprList_item.bS
7030: 6f 72 74 65 72 52 65 66 20 66 6c 61 67 20 69 73  orterRef flag is
7040: 20 73 65 74 20 66 6f 72 20 65 61 63 68 20 65 78   set for each ex
7050: 70 72 65 73 73 69 6f 6e 20 69 6e 20 70 45 4c 69  pression in pELi
7060: 73 74 20 0a 2a 2a 20 66 6f 72 20 77 68 69 63 68  st .** for which
7070: 20 74 68 65 20 73 6f 72 74 65 72 2d 72 65 66 65   the sorter-refe
7080: 72 65 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69  rence optimizati
7090: 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 65 6e 61  on should be ena
70a0: 62 6c 65 64 2e 20 0a 2a 2a 20 41 64 64 69 74 69  bled. .** Additi
70b0: 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 70 53 6f 72  onally, the pSor
70c0: 74 2d 3e 61 44 65 66 65 72 5b 5d 20 61 72 72 61  t->aDefer[] arra
70d0: 79 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  y is populated w
70e0: 69 74 68 20 65 6e 74 72 69 65 73 0a 2a 2a 20 66  ith entries.** f
70f0: 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 72  or all cursors r
7100: 65 71 75 69 72 65 64 20 74 6f 20 65 76 61 6c 75  equired to evalu
7110: 61 74 65 20 61 6c 6c 20 73 65 6c 65 63 74 65 64  ate all selected
7120: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 46 69   expressions. Fi
7130: 6e 61 6c 6c 79 2e 0a 2a 2a 20 6f 75 74 70 75 74  nally..** output
7140: 20 76 61 72 69 61 62 6c 65 20 28 2a 70 70 45 78   variable (*ppEx
7150: 74 72 61 29 20 69 73 20 73 65 74 20 74 6f 20 61  tra) is set to a
7160: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
7170: 74 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20  t containing.** 
7180: 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20  expressions for 
7190: 61 6c 6c 20 65 78 74 72 61 20 50 4b 20 76 61 6c  all extra PK val
71a0: 75 65 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ues that should 
71b0: 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  be stored in the
71c0: 0a 2a 2a 20 73 6f 72 74 65 72 20 72 65 63 6f 72  .** sorter recor
71d0: 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ds..*/.static vo
71e0: 69 64 20 73 65 6c 65 63 74 45 78 70 72 44 65 66  id selectExprDef
71f0: 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  er(.  Parse *pPa
7200: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
7210: 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 61        /* Leave a
7220: 6e 79 20 65 72 72 6f 72 20 68 65 72 65 20 2a 2f  ny error here */
7230: 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72  .  SortCtx *pSor
7240: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
7250: 20 20 20 2f 2a 20 53 6f 72 74 65 72 20 63 6f 6e     /* Sorter con
7260: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
7270: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20  st *pEList,     
7280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
7290: 72 65 73 73 69 6f 6e 73 20 64 65 73 74 69 6e 65  ressions destine
72a0: 64 20 66 6f 72 20 73 6f 72 74 65 72 20 2a 2f 0a  d for sorter */.
72b0: 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 45    ExprList **ppE
72c0: 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20 20  xtra            
72d0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
72e0: 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 73 6f   to append to so
72f0: 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 29  rter record */.)
7300: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
7310: 20 6e 44 65 66 65 72 20 3d 20 30 3b 0a 20 20 45   nDefer = 0;.  E
7320: 78 70 72 4c 69 73 74 20 2a 70 45 78 74 72 61 20  xprList *pExtra 
7330: 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
7340: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
7350: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
7360: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
7370: 2a 70 49 74 65 6d 20 3d 20 26 70 45 4c 69 73 74  *pItem = &pEList
7380: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  ->a[i];.    if( 
7390: 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
73a0: 72 42 79 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  rByCol==0 ){.   
73b0: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
73c0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20   pItem->pExpr;. 
73d0: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
73e0: 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a   = pExpr->pTab;.
73f0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
7400: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
7410: 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
7420: 3e 3d 30 20 26 26 20 70 54 61 62 20 26 26 20 21  >=0 && pTab && !
7430: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 0a  IsVirtual(pTab).
7440: 20 20 20 20 20 20 20 26 26 20 28 70 54 61 62 2d         && (pTab-
7450: 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f  >aCol[pExpr->iCo
7460: 6c 75 6d 6e 5d 2e 63 6f 6c 46 6c 61 67 73 20 26  lumn].colFlags &
7470: 20 43 4f 4c 46 4c 41 47 5f 53 4f 52 54 45 52 52   COLFLAG_SORTERR
7480: 45 46 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  EF).      ){.   
7490: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
74a0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
74b0: 44 65 66 65 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  Defer; j++){.   
74c0: 20 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74         if( pSort
74d0: 2d 3e 61 44 65 66 65 72 5b 6a 5d 2e 69 43 73 72  ->aDefer[j].iCsr
74e0: 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
74f0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
7500: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
7510: 3d 3d 6e 44 65 66 65 72 20 29 7b 0a 20 20 20 20  ==nDefer ){.    
7520: 20 20 20 20 20 20 69 66 28 20 6e 44 65 66 65 72        if( nDefer
7530: 3d 3d 41 72 72 61 79 53 69 7a 65 28 70 53 6f 72  ==ArraySize(pSor
7540: 74 2d 3e 61 44 65 66 65 72 29 20 29 7b 0a 20 20  t->aDefer) ){.  
7550: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
7560: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ue;.          }e
7570: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
7580: 20 69 6e 74 20 6e 4b 65 79 20 3d 20 31 3b 0a 20   int nKey = 1;. 
7590: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b             int k
75a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 6e  ;.            In
75b0: 64 65 78 20 2a 70 50 6b 20 3d 20 30 3b 0a 20 20  dex *pPk = 0;.  
75c0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 48            if( !H
75d0: 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b  asRowid(pTab) ){
75e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
75f0: 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
7600: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
7610: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
7620: 20 6e 4b 65 79 20 3d 20 70 50 6b 2d 3e 6e 4b 65   nKey = pPk->nKe
7630: 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  yCol;.          
7640: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
7650: 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 4b 65 79 3b  for(k=0; k<nKey;
7660: 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   k++){.         
7670: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20       Expr *pNew 
7680: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
7690: 50 61 72 73 65 2c 20 54 4b 5f 43 4f 4c 55 4d 4e  Parse, TK_COLUMN
76a0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
76b0: 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20         if( pNew 
76c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
76d0: 20 20 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65 20     pNew->iTable 
76e0: 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  = pExpr->iTable;
76f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7700: 20 70 4e 65 77 2d 3e 70 54 61 62 20 3d 20 70 45   pNew->pTab = pE
7710: 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
7720: 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d             pNew-
7730: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 50 6b 20 3f  >iColumn = pPk ?
7740: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b   pPk->aiColumn[k
7750: 5d 20 3a 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  ] : -1;.        
7760: 20 20 20 20 20 20 20 20 70 45 78 74 72 61 20 3d          pExtra =
7770: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
7780: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
7790: 45 78 74 72 61 2c 20 70 4e 65 77 29 3b 0a 20 20  Extra, pNew);.  
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 7d 0a 20 20 20 20            }.    
77c0: 20 20 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 61          pSort->a
77d0: 44 65 66 65 72 5b 6e 44 65 66 65 72 5d 2e 70 54  Defer[nDefer].pT
77e0: 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62  ab = pExpr->pTab
77f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  ;.            pS
7800: 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6e 44 65 66  ort->aDefer[nDef
7810: 65 72 5d 2e 69 43 73 72 20 3d 20 70 45 78 70 72  er].iCsr = pExpr
7820: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
7830: 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 61 44 65        pSort->aDe
7840: 66 65 72 5b 6e 44 65 66 65 72 5d 2e 6e 4b 65 79  fer[nDefer].nKey
7850: 20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20   = nKey;.       
7860: 20 20 20 20 20 6e 44 65 66 65 72 2b 2b 3b 0a 20       nDefer++;. 
7870: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7880: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 49 74     }.        pIt
7890: 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66 20 3d  em->bSorterRef =
78a0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
78b0: 7d 0a 20 20 7d 0a 20 20 70 53 6f 72 74 2d 3e 6e  }.  }.  pSort->n
78c0: 44 65 66 65 72 20 3d 20 28 75 38 29 6e 44 65 66  Defer = (u8)nDef
78d0: 65 72 3b 0a 20 20 2a 70 70 45 78 74 72 61 20 3d  er;.  *ppExtra =
78e0: 20 70 45 78 74 72 61 3b 0a 7d 0a 23 65 6e 64 69   pExtra;.}.#endi
78f0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
7900: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
7910: 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  the code for the
7920: 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69   inside of the i
7930: 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20  nner loop.** of 
7940: 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20  a SELECT..**.** 
7950: 49 66 20 73 72 63 54 61 62 20 69 73 20 6e 65 67  If srcTab is neg
7960: 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20  ative, then the 
7970: 70 2d 3e 70 45 4c 69 73 74 20 65 78 70 72 65 73  p->pEList expres
7980: 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61  sions.** are eva
7990: 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20  luated in order 
79a0: 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20  to get the data 
79b0: 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49  for this row.  I
79c0: 66 20 73 72 63 54 61 62 20 69 73 0a 2a 2a 20 7a  f srcTab is.** z
79d0: 65 72 6f 20 6f 72 20 6d 6f 72 65 2c 20 74 68 65  ero or more, the
79e0: 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64  n data is pulled
79f0: 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64   from srcTab and
7a00: 20 70 2d 3e 70 45 4c 69 73 74 20 69 73 20 75 73   p->pEList is us
7a10: 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20 67  ed only .** to g
7a20: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
7a30: 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65   columns and the
7a40: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
7a50: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  nce for each col
7a60: 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  umn..*/.static v
7a70: 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  oid selectInnerL
7a80: 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  oop(.  Parse *pP
7a90: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
7aa0: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
7ab0: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
7ac0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
7ad0: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74    /* The complet
7ae0: 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
7af0: 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  nt being coded *
7b00: 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20  /.  int srcTab, 
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7b20: 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68  ull data from th
7b30: 69 73 20 74 61 62 6c 65 20 69 66 20 6e 6f 6e 2d  is table if non-
7b40: 6e 65 67 61 74 69 76 65 20 2a 2f 0a 20 20 53 6f  negative */.  So
7b50: 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20  rtCtx *pSort,   
7b60: 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20        /* If not 
7b70: 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f  NULL, info on ho
7b80: 77 20 74 6f 20 70 72 6f 63 65 73 73 20 4f 52 44  w to process ORD
7b90: 45 52 20 42 59 20 2a 2f 0a 20 20 44 69 73 74 69  ER BY */.  Disti
7ba0: 6e 63 74 43 74 78 20 2a 70 44 69 73 74 69 6e 63  nctCtx *pDistinc
7bb0: 74 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c  t, /* If not NUL
7bc0: 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74  L, info on how t
7bd0: 6f 20 70 72 6f 63 65 73 73 20 44 49 53 54 49 4e  o process DISTIN
7be0: 43 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  CT */.  SelectDe
7bf0: 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20  st *pDest,      
7c00: 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73  /* How to dispos
7c10: 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73  e of the results
7c20: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69   */.  int iConti
7c30: 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  nue,          /*
7c40: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f   Jump here to co
7c50: 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74  ntinue with next
7c60: 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42   row */.  int iB
7c70: 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20  reak            
7c80: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
7c90: 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  o break out of t
7ca0: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f  he inner loop */
7cb0: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
7cc0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
7cd0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61   int i;.  int ha
7ce0: 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20  sDistinct;      
7cf0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
7d00: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
7d10: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
7d20: 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20   */.  int eDest 
7d30: 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20  = pDest->eDest; 
7d40: 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70    /* How to disp
7d50: 6f 73 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a  ose of results *
7d60: 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20  /.  int iParm = 
7d70: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20  pDest->iSDParm; 
7d80: 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
7d90: 74 20 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65  t to disposal me
7da0: 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  thod */.  int nR
7db0: 65 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20  esultCol;       
7dc0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7dd0: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
7de0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66  s */.  int nPref
7df0: 69 78 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20  ixReg = 0;      
7e00: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7e10: 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20  extra registers 
7e20: 62 65 66 6f 72 65 20 72 65 67 52 65 73 75 6c 74  before regResult
7e30: 20 2a 2f 0a 20 20 52 6f 77 4c 6f 61 64 49 6e 66   */.  RowLoadInf
7e40: 6f 20 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 3b 20  o sRowLoadInfo; 
7e50: 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 64 65    /* Info for de
7e60: 66 65 72 72 65 64 20 72 6f 77 20 6c 6f 61 64 69  ferred row loadi
7e70: 6e 67 20 2a 2f 0a 0a 20 20 2f 2a 20 55 73 75 61  ng */..  /* Usua
7e80: 6c 6c 79 2c 20 72 65 67 52 65 73 75 6c 74 20 69  lly, regResult i
7e90: 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c  s the first cell
7ea0: 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
7eb0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 0a 20 20 2a  memory cells.  *
7ec0: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
7ed0: 20 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74 20   current result 
7ee0: 72 6f 77 2e 20 49 6e 20 74 68 69 73 20 63 61 73  row. In this cas
7ef0: 65 20 72 65 67 4f 72 69 67 20 69 73 20 73 65 74  e regOrig is set
7f00: 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d   to the.  ** sam
7f10: 65 20 76 61 6c 75 65 2e 20 48 6f 77 65 76 65 72  e value. However
7f20: 2c 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 73  , if the results
7f30: 20 61 72 65 20 62 65 69 6e 67 20 73 65 6e 74 20   are being sent 
7f40: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2c 20 74  to the sorter, t
7f50: 68 65 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 66  he.  ** values f
7f60: 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  or any expressio
7f70: 6e 73 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f  ns that are also
7f80: 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 6f 72   part of the sor
7f90: 74 2d 6b 65 79 20 61 72 65 20 6f 6d 69 74 74 65  t-key are omitte
7fa0: 64 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 69 73  d.  ** from this
7fb0: 20 61 72 72 61 79 2e 20 49 6e 20 74 68 69 73 20   array. In this 
7fc0: 63 61 73 65 20 72 65 67 4f 72 69 67 20 69 73 20  case regOrig is 
7fd0: 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 2a 2f  set to zero.  */
7fe0: 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74  .  int regResult
7ff0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
8000: 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72  * Start of memor
8010: 79 20 68 6f 6c 64 69 6e 67 20 63 75 72 72 65 6e  y holding curren
8020: 74 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  t results */.  i
8030: 6e 74 20 72 65 67 4f 72 69 67 3b 20 20 20 20 20  nt regOrig;     
8040: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
8050: 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f  art of memory ho
8060: 6c 64 69 6e 67 20 66 75 6c 6c 20 72 65 73 75 6c  lding full resul
8070: 74 20 28 6f 72 20 30 29 20 2a 2f 0a 0a 20 20 61  t (or 0) */..  a
8080: 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 61 73  ssert( v );.  as
8090: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21  sert( p->pEList!
80a0: 3d 30 20 29 3b 0a 20 20 68 61 73 44 69 73 74 69  =0 );.  hasDisti
80b0: 6e 63 74 20 3d 20 70 44 69 73 74 69 6e 63 74 20  nct = pDistinct 
80c0: 3f 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e  ? pDistinct->eTn
80d0: 63 74 54 79 70 65 20 3a 20 57 48 45 52 45 5f 44  ctType : WHERE_D
80e0: 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20  ISTINCT_NOOP;.  
80f0: 69 66 28 20 70 53 6f 72 74 20 26 26 20 70 53 6f  if( pSort && pSo
8100: 72 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  rt->pOrderBy==0 
8110: 29 20 70 53 6f 72 74 20 3d 20 30 3b 0a 20 20 69  ) pSort = 0;.  i
8120: 66 28 20 70 53 6f 72 74 3d 3d 30 20 26 26 20 21  f( pSort==0 && !
8130: 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  hasDistinct ){. 
8140: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6e 74     assert( iCont
8150: 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20 20 20 63  inue!=0 );.    c
8160: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e  odeOffset(v, p->
8170: 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e  iOffset, iContin
8180: 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50  ue);.  }..  /* P
8190: 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65  ull the requeste
81a0: 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a  d columns..  */.
81b0: 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70    nResultCol = p
81c0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
81d0: 0a 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69  ..  if( pDest->i
81e0: 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Sdst==0 ){.    i
81f0: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
8200: 20 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20 70    nPrefixReg = p
8210: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Sort->pOrderBy->
8220: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  nExpr;.      if(
8230: 20 21 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c   !(pSort->sortFl
8240: 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55  ags & SORTFLAG_U
8250: 73 65 53 6f 72 74 65 72 29 20 29 20 6e 50 72 65  seSorter) ) nPre
8260: 66 69 78 52 65 67 2b 2b 3b 0a 20 20 20 20 20 20  fixReg++;.      
8270: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
8280: 6e 50 72 65 66 69 78 52 65 67 3b 0a 20 20 20 20  nPrefixReg;.    
8290: 7d 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64  }.    pDest->iSd
82a0: 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  st = pParse->nMe
82b0: 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
82c0: 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74  >nMem += nResult
82d0: 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  Col;.  }else if(
82e0: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 6e 52   pDest->iSdst+nR
82f0: 65 73 75 6c 74 43 6f 6c 20 3e 20 70 50 61 72 73  esultCol > pPars
8300: 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 2f  e->nMem ){.    /
8310: 2a 20 54 68 69 73 20 69 73 20 61 6e 20 65 72 72  * This is an err
8320: 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 74 68 61  or condition tha
8330: 74 20 63 61 6e 20 72 65 73 75 6c 74 2c 20 66 6f  t can result, fo
8340: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
8350: 61 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20  a SELECT.    ** 
8360: 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  on the right-han
8370: 64 20 73 69 64 65 20 6f 66 20 61 6e 20 49 4e 53  d side of an INS
8380: 45 52 54 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72  ERT contains mor
8390: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  e result columns
83a0: 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65   than.    ** the
83b0: 72 65 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20 69  re are columns i
83c0: 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74  n the table on t
83d0: 68 65 20 6c 65 66 74 2e 20 20 54 68 65 20 65 72  he left.  The er
83e0: 72 6f 72 20 77 69 6c 6c 20 62 65 20 63 61 75 67  ror will be caug
83f0: 68 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  ht.    ** and re
8400: 70 6f 72 74 65 64 20 6c 61 74 65 72 2e 20 20 42  ported later.  B
8410: 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61  ut we need to ma
8420: 6b 65 20 73 75 72 65 20 65 6e 6f 75 67 68 20 6d  ke sure enough m
8430: 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74  emory is allocat
8440: 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f  ed.    ** to avo
8450: 69 64 20 6f 74 68 65 72 20 73 70 75 72 69 6f 75  id other spuriou
8460: 73 20 65 72 72 6f 72 73 20 69 6e 20 74 68 65 20  s errors in the 
8470: 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20 20  meantime. */.   
8480: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
8490: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d   nResultCol;.  }
84a0: 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20  .  pDest->nSdst 
84b0: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
84c0: 72 65 67 4f 72 69 67 20 3d 20 72 65 67 52 65 73  regOrig = regRes
84d0: 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69 53 64  ult = pDest->iSd
84e0: 73 74 3b 0a 20 20 69 66 28 20 73 72 63 54 61 62  st;.  if( srcTab
84f0: 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  >=0 ){.    for(i
8500: 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c  =0; i<nResultCol
8510: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
8520: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
8530: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72  v, OP_Column, sr
8540: 63 54 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75  cTab, i, regResu
8550: 6c 74 2b 69 29 3b 0a 20 20 20 20 20 20 56 64 62  lt+i);.      Vdb
8560: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
8570: 22 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  ", p->pEList->a[
8580: 69 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  i].zName));.    
8590: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44  }.  }else if( eD
85a0: 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20  est!=SRT_Exists 
85b0: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
85c0: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
85d0: 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20 45 78  EFERENCES.    Ex
85e0: 70 72 4c 69 73 74 20 2a 70 45 78 74 72 61 20 3d  prList *pExtra =
85f0: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f   0;.#endif.    /
8600: 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61  * If the destina
8610: 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54  tion is an EXIST
8620: 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f  S(...) expressio
8630: 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20  n, the actual.  
8640: 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75    ** values retu
8650: 72 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45  rned by the SELE
8660: 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69  CT are not requi
8670: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
8680: 75 38 20 65 63 65 6c 46 6c 61 67 73 3b 20 20 20  u8 ecelFlags;   
8690: 20 2f 2a 20 22 65 63 65 6c 22 20 69 73 20 61 6e   /* "ecel" is an
86a0: 20 61 62 62 72 65 76 69 61 74 69 6f 6e 20 6f 66   abbreviation of
86b0: 20 22 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69   "ExprCodeExprLi
86c0: 73 74 22 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c  st" */.    ExprL
86d0: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20  ist *pEList;.   
86e0: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
86f0: 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  Mem || eDest==SR
8700: 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73  T_Output || eDes
8710: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
8720: 20 29 7b 0a 20 20 20 20 20 20 65 63 65 6c 46 6c   ){.      ecelFl
8730: 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 45 43 45  ags = SQLITE_ECE
8740: 4c 5f 44 55 50 3b 0a 20 20 20 20 7d 65 6c 73 65  L_DUP;.    }else
8750: 7b 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61 67  {.      ecelFlag
8760: 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  s = 0;.    }.   
8770: 20 69 66 28 20 70 53 6f 72 74 20 26 26 20 68 61   if( pSort && ha
8780: 73 44 69 73 74 69 6e 63 74 3d 3d 30 20 26 26 20  sDistinct==0 && 
8790: 65 44 65 73 74 21 3d 53 52 54 5f 45 70 68 65 6d  eDest!=SRT_Ephem
87a0: 54 61 62 20 26 26 20 65 44 65 73 74 21 3d 53 52  Tab && eDest!=SR
87b0: 54 5f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  T_Table ){.     
87c0: 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70   /* For each exp
87d0: 72 65 73 73 69 6f 6e 20 69 6e 20 70 2d 3e 70 45  ression in p->pE
87e0: 4c 69 73 74 20 74 68 61 74 20 69 73 20 61 20 63  List that is a c
87f0: 6f 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73  opy of an expres
8800: 73 69 6f 6e 20 69 6e 0a 20 20 20 20 20 20 2a 2a  sion in.      **
8810: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
8820: 61 75 73 65 20 28 70 53 6f 72 74 2d 3e 70 4f 72  ause (pSort->pOr
8830: 64 65 72 42 79 29 2c 20 73 65 74 20 74 68 65 20  derBy), set the 
8840: 61 73 73 6f 63 69 61 74 65 64 20 0a 20 20 20 20  associated .    
8850: 20 20 2a 2a 20 69 4f 72 64 65 72 42 79 43 6f 6c    ** iOrderByCol
8860: 20 76 61 6c 75 65 20 74 6f 20 6f 6e 65 20 6d 6f   value to one mo
8870: 72 65 20 74 68 61 6e 20 74 68 65 20 69 6e 64 65  re than the inde
8880: 78 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  x of the ORDER B
8890: 59 20 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72  Y .      ** expr
88a0: 65 73 73 69 6f 6e 20 77 69 74 68 69 6e 20 74 68  ession within th
88b0: 65 20 73 6f 72 74 2d 6b 65 79 20 74 68 61 74 20  e sort-key that 
88c0: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 29  pushOntoSorter()
88d0: 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e 0a   will generate..
88e0: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 61 6c        ** This al
88f0: 6c 6f 77 73 20 74 68 65 20 70 2d 3e 70 45 4c 69  lows the p->pELi
8900: 73 74 20 66 69 65 6c 64 20 74 6f 20 62 65 20 6f  st field to be o
8910: 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mitted from the 
8920: 73 6f 72 74 65 64 20 72 65 63 6f 72 64 2c 0a 20  sorted record,. 
8930: 20 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 73       ** saving s
8940: 70 61 63 65 20 61 6e 64 20 43 50 55 20 63 79 63  pace and CPU cyc
8950: 6c 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 65  les.  */.      e
8960: 63 65 6c 46 6c 61 67 73 20 7c 3d 20 28 53 51 4c  celFlags |= (SQL
8970: 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46  ITE_ECEL_OMITREF
8980: 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46  |SQLITE_ECEL_REF
8990: 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  );..      for(i=
89a0: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 69  pSort->nOBSat; i
89b0: 3c 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79  <pSort->pOrderBy
89c0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
89d0: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
89e0: 20 20 20 20 20 20 69 66 28 20 28 6a 20 3d 20 70        if( (j = p
89f0: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Sort->pOrderBy->
8a00: 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  a[i].u.x.iOrderB
8a10: 79 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20  yCol)>0 ){.     
8a20: 20 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 2d 3e       p->pEList->
8a30: 61 5b 6a 2d 31 5d 2e 75 2e 78 2e 69 4f 72 64 65  a[j-1].u.x.iOrde
8a40: 72 42 79 43 6f 6c 20 3d 20 69 2b 31 2d 70 53 6f  rByCol = i+1-pSo
8a50: 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20  rt->nOBSat;.    
8a60: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69      }.      }.#i
8a70: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
8a80: 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45  LE_SORTER_REFERE
8a90: 4e 43 45 53 0a 20 20 20 20 20 20 73 65 6c 65 63  NCES.      selec
8aa0: 74 45 78 70 72 44 65 66 65 72 28 70 50 61 72 73  tExprDefer(pPars
8ab0: 65 2c 20 70 53 6f 72 74 2c 20 70 2d 3e 70 45 4c  e, pSort, p->pEL
8ac0: 69 73 74 2c 20 26 70 45 78 74 72 61 29 3b 0a 20  ist, &pExtra);. 
8ad0: 20 20 20 20 20 69 66 28 20 70 45 78 74 72 61 20       if( pExtra 
8ae0: 26 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  && pParse->db->m
8af0: 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29  allocFailed==0 )
8b00: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
8b10: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 65 78  there are any ex
8b20: 74 72 61 20 50 4b 20 63 6f 6c 75 6d 6e 73 20 74  tra PK columns t
8b30: 6f 20 61 64 64 20 74 6f 20 74 68 65 20 73 6f 72  o add to the sor
8b40: 74 65 72 20 72 65 63 6f 72 64 73 2c 0a 20 20 20  ter records,.   
8b50: 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
8b60: 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 63 65   extra memory ce
8b70: 6c 6c 73 20 61 6e 64 20 61 64 6a 75 73 74 20 74  lls and adjust t
8b80: 68 65 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  he OpenEphemeral
8b90: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73   .        ** ins
8ba0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 61 63 63 6f  truction to acco
8bb0: 75 6e 74 20 66 6f 72 20 74 68 65 20 6c 61 72 67  unt for the larg
8bc0: 65 72 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73  er records. This
8bd0: 20 69 73 20 6f 6e 6c 79 0a 20 20 20 20 20 20 20   is only.       
8be0: 20 2a 2a 20 72 65 71 75 69 72 65 64 20 69 66 20   ** required if 
8bf0: 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72  there are one or
8c00: 20 6d 6f 72 65 20 57 49 54 48 4f 55 54 20 52 4f   more WITHOUT RO
8c10: 57 49 44 20 74 61 62 6c 65 73 20 77 69 74 68 0a  WID tables with.
8c20: 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 6f          ** compo
8c30: 73 69 74 65 20 70 72 69 6d 61 72 79 20 6b 65 79  site primary key
8c40: 73 20 69 6e 20 74 68 65 20 53 6f 72 74 43 74 78  s in the SortCtx
8c50: 2e 61 44 65 66 65 72 5b 5d 20 61 72 72 61 79 2e  .aDefer[] array.
8c60: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 56 64 62    */.        Vdb
8c70: 65 4f 70 20 2a 70 4f 70 20 3d 20 73 71 6c 69 74  eOp *pOp = sqlit
8c80: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
8c90: 53 6f 72 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e  Sort->addrSortIn
8ca0: 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  dex);.        pO
8cb0: 70 2d 3e 70 32 20 2b 3d 20 28 70 45 78 74 72 61  p->p2 += (pExtra
8cc0: 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d  ->nExpr - pSort-
8cd0: 3e 6e 44 65 66 65 72 29 3b 0a 20 20 20 20 20 20  >nDefer);.      
8ce0: 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e    pOp->p4.pKeyIn
8cf0: 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 2b 3d  fo->nAllField +=
8d00: 20 28 70 45 78 74 72 61 2d 3e 6e 45 78 70 72 20   (pExtra->nExpr 
8d10: 2d 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 29  - pSort->nDefer)
8d20: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
8d30: 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 45 78 74 72 61  ->nMem += pExtra
8d40: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 7d  ->nExpr;.      }
8d50: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f  .#endif..      /
8d60: 2a 20 41 64 6a 75 73 74 20 6e 52 65 73 75 6c 74  * Adjust nResult
8d70: 43 6f 6c 20 74 6f 20 61 63 63 6f 75 6e 74 20 66  Col to account f
8d80: 6f 72 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  or columns that 
8d90: 61 72 65 20 6f 6d 69 74 74 65 64 0a 20 20 20 20  are omitted.    
8da0: 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 6f    ** from the so
8db0: 72 74 65 72 20 62 79 20 74 68 65 20 6f 70 74 69  rter by the opti
8dc0: 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  mizations in thi
8dd0: 73 20 62 72 61 6e 63 68 20 2a 2f 0a 20 20 20 20  s branch */.    
8de0: 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
8df0: 4c 69 73 74 3b 0a 20 20 20 20 20 20 66 6f 72 28  List;.      for(
8e00: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
8e10: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
8e20: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e      if( pEList->
8e30: 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  a[i].u.x.iOrderB
8e40: 79 43 6f 6c 3e 30 0a 23 69 66 64 65 66 20 53 51  yCol>0.#ifdef SQ
8e50: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
8e60: 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20  ER_REFERENCES.  
8e70: 20 20 20 20 20 20 20 7c 7c 20 70 45 4c 69 73 74         || pEList
8e80: 2d 3e 61 5b 69 5d 2e 62 53 6f 72 74 65 72 52 65  ->a[i].bSorterRe
8e90: 66 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  f.#endif.       
8ea0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 52   ){.          nR
8eb0: 65 73 75 6c 74 43 6f 6c 2d 2d 3b 0a 20 20 20 20  esultCol--;.    
8ec0: 20 20 20 20 20 20 72 65 67 4f 72 69 67 20 3d 20        regOrig = 
8ed0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
8ee0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 74 65 73 74     }..      test
8ef0: 63 61 73 65 28 20 72 65 67 4f 72 69 67 20 29 3b  case( regOrig );
8f00: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
8f10: 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 20   eDest==SRT_Set 
8f20: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
8f30: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65  e( eDest==SRT_Me
8f40: 6d 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  m );.      testc
8f50: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
8f60: 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20  Coroutine );.   
8f70: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
8f80: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
8f90: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8fa0: 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 20 7c  eDest==SRT_Set |
8fb0: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d  | eDest==SRT_Mem
8fc0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
8fd0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
8fe0: 74 69 6e 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tine || eDest==S
8ff0: 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
9000: 20 7d 0a 20 20 20 20 73 52 6f 77 4c 6f 61 64 49   }.    sRowLoadI
9010: 6e 66 6f 2e 72 65 67 52 65 73 75 6c 74 20 3d 20  nfo.regResult = 
9020: 72 65 67 52 65 73 75 6c 74 3b 0a 20 20 20 20 73  regResult;.    s
9030: 52 6f 77 4c 6f 61 64 49 6e 66 6f 2e 65 63 65 6c  RowLoadInfo.ecel
9040: 46 6c 61 67 73 20 3d 20 65 63 65 6c 46 6c 61 67  Flags = ecelFlag
9050: 73 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  s;.#ifdef SQLITE
9060: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
9070: 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20 73 52  EFERENCES.    sR
9080: 6f 77 4c 6f 61 64 49 6e 66 6f 2e 70 45 78 74 72  owLoadInfo.pExtr
9090: 61 20 3d 20 70 45 78 74 72 61 3b 0a 20 20 20 20  a = pExtra;.    
90a0: 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 2e 72 65 67  sRowLoadInfo.reg
90b0: 45 78 74 72 61 52 65 73 75 6c 74 20 3d 20 72 65  ExtraResult = re
90c0: 67 52 65 73 75 6c 74 20 2b 20 6e 52 65 73 75 6c  gResult + nResul
90d0: 74 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 70 45  tCol;.    if( pE
90e0: 78 74 72 61 20 29 20 6e 52 65 73 75 6c 74 43 6f  xtra ) nResultCo
90f0: 6c 20 2b 3d 20 70 45 78 74 72 61 2d 3e 6e 45 78  l += pExtra->nEx
9100: 70 72 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  pr;.#endif.    i
9110: 66 28 20 70 2d 3e 69 4c 69 6d 69 74 0a 20 20 20  f( p->iLimit.   
9120: 20 20 26 26 20 28 65 63 65 6c 46 6c 61 67 73 20    && (ecelFlags 
9130: 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d  & SQLITE_ECEL_OM
9140: 49 54 52 45 46 29 21 3d 30 20 0a 20 20 20 20 20  ITREF)!=0 .     
9150: 26 26 20 6e 50 72 65 66 69 78 52 65 67 3e 30 0a  && nPrefixReg>0.
9160: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73      ){.      ass
9170: 65 72 74 28 20 70 53 6f 72 74 21 3d 30 20 29 3b  ert( pSort!=0 );
9180: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 68  .      assert( h
9190: 61 73 44 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b  asDistinct==0 );
91a0: 0a 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 70 44  .      pSort->pD
91b0: 65 66 65 72 72 65 64 52 6f 77 4c 6f 61 64 20 3d  eferredRowLoad =
91c0: 20 26 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 3b 0a   &sRowLoadInfo;.
91d0: 20 20 20 20 20 20 72 65 67 4f 72 69 67 20 3d 20        regOrig = 
91e0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
91f0: 20 20 20 20 69 6e 6e 65 72 4c 6f 6f 70 4c 6f 61      innerLoopLoa
9200: 64 52 6f 77 28 70 50 61 72 73 65 2c 20 70 2c 20  dRow(pParse, p, 
9210: 26 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 29 3b 0a  &sRowLoadInfo);.
9220: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
9230: 49 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  If the DISTINCT 
9240: 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72 65 73  keyword was pres
9250: 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43  ent on the SELEC
9260: 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  T statement.  **
9270: 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61   and this row ha
9280: 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f  s been seen befo
9290: 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  re, then do not 
92a0: 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20  make this row.  
92b0: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 72  ** part of the r
92c0: 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  esult..  */.  if
92d0: 28 20 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b  ( hasDistinct ){
92e0: 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 44 69  .    switch( pDi
92f0: 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70  stinct->eTnctTyp
9300: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
9310: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
9320: 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20  RDERED: {.      
9330: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20    VdbeOp *pOp;  
9340: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
9350: 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 20  longer required 
9360: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
9370: 73 74 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  str. */.        
9380: 69 6e 74 20 69 4a 75 6d 70 3b 20 20 20 20 20 20  int iJump;      
9390: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
93a0: 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20  destination */. 
93b0: 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 50 72         int regPr
93c0: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ev;            /
93d0: 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 20 63  * Previous row c
93e0: 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20  ontent */..     
93f0: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73     /* Allocate s
9400: 70 61 63 65 20 66 6f 72 20 74 68 65 20 70 72 65  pace for the pre
9410: 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20  vious row */.   
9420: 20 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70       regPrev = p
9430: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
9440: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
9450: 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f  Mem += nResultCo
9460: 6c 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  l;..        /* C
9470: 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65  hange the OP_Ope
9480: 6e 45 70 68 65 6d 65 72 61 6c 20 63 6f 64 65 64  nEphemeral coded
9490: 20 65 61 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f   earlier to an O
94a0: 50 5f 4e 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a  P_Null.        *
94b0: 2a 20 73 65 74 73 20 74 68 65 20 4d 45 4d 5f 43  * sets the MEM_C
94c0: 6c 65 61 72 65 64 20 62 69 74 20 6f 6e 20 74 68  leared bit on th
94d0: 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72  e first register
94e0: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
94f0: 2a 2a 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75  ** previous valu
9500: 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61  e.  This will ca
9510: 75 73 65 20 74 68 65 20 4f 50 5f 4e 65 20 62 65  use the OP_Ne be
9520: 6c 6f 77 20 74 6f 20 61 6c 77 61 79 73 0a 20 20  low to always.  
9530: 20 20 20 20 20 20 2a 2a 20 66 61 69 6c 20 6f 6e        ** fail on
9540: 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61   the first itera
9550: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70  tion of the loop
9560: 20 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 72   even if the fir
9570: 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f  st.        ** ro
9580: 77 20 69 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a  w is all NULLs..
9590: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
95a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
95b0: 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44  angeToNoop(v, pD
95c0: 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63  istinct->addrTnc
95d0: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 20  t);.        pOp 
95e0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
95f0: 4f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d  Op(v, pDistinct-
9600: 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20  >addrTnct);.    
9610: 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
9620: 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20  = OP_Null;.     
9630: 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a     pOp->p1 = 1;.
9640: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20          pOp->p2 
9650: 3d 20 72 65 67 50 72 65 76 3b 0a 0a 20 20 20 20  = regPrev;..    
9660: 20 20 20 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69      iJump = sqli
9670: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
9680: 64 72 28 76 29 20 2b 20 6e 52 65 73 75 6c 74 43  dr(v) + nResultC
9690: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ol;.        for(
96a0: 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f  i=0; i<nResultCo
96b0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
96c0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
96d0: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
96e0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
96f0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  ->pEList->a[i].p
9700: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
9710: 20 69 66 28 20 69 3c 6e 52 65 73 75 6c 74 43 6f   if( i<nResultCo
9720: 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l-1 ){.         
9730: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9740: 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 72  dOp3(v, OP_Ne, r
9750: 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 4a 75 6d  egResult+i, iJum
9760: 70 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20  p, regPrev+i);. 
9770: 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
9780: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
9790: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
97a0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
97b0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
97c0: 5f 45 71 2c 20 72 65 67 52 65 73 75 6c 74 2b 69  _Eq, regResult+i
97d0: 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67  , iContinue, reg
97e0: 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20  Prev+i);.       
97f0: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
9800: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
9810: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
9820: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
9830: 28 76 2c 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63  (v, -1, (const c
9840: 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
9850: 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
9860: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
9870: 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
9880: 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
9890: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
98a0: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
98b0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3d 3d  CurrentAddr(v)==
98c0: 69 4a 75 6d 70 20 7c 7c 20 70 50 61 72 73 65 2d  iJump || pParse-
98d0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
98e0: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  d );.        sql
98f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
9900: 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 52 65  , OP_Copy, regRe
9910: 73 75 6c 74 2c 20 72 65 67 50 72 65 76 2c 20 6e  sult, regPrev, n
9920: 52 65 73 75 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20  ResultCol-1);.  
9930: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9940: 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65     }..      case
9950: 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
9960: 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20  UNIQUE: {.      
9970: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
9980: 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69  ngeToNoop(v, pDi
9990: 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74  stinct->addrTnct
99a0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
99b0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
99c0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
99d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 44 69 73      assert( pDis
99e0: 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65  tinct->eTnctType
99f0: 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  ==WHERE_DISTINCT
9a00: 5f 55 4e 4f 52 44 45 52 45 44 20 29 3b 0a 20 20  _UNORDERED );.  
9a10: 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e        codeDistin
9a20: 63 74 28 70 50 61 72 73 65 2c 20 70 44 69 73 74  ct(pParse, pDist
9a30: 69 6e 63 74 2d 3e 74 61 62 54 6e 63 74 2c 20 69  inct->tabTnct, i
9a40: 43 6f 6e 74 69 6e 75 65 2c 20 6e 52 65 73 75 6c  Continue, nResul
9a50: 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  tCol,.          
9a60: 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65             regRe
9a70: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 62  sult);.        b
9a80: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
9a90: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 6f 72    }.    if( pSor
9aa0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  t==0 ){.      co
9ab0: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69  deOffset(v, p->i
9ac0: 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75  Offset, iContinu
9ad0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
9ae0: 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
9af0: 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73  {.    /* In this
9b00: 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63   mode, write eac
9b10: 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 20 74  h query result t
9b20: 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  o the key of the
9b30: 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a   temporary.    *
9b40: 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  * table iParm.. 
9b50: 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
9b60: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
9b70: 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 63 61  ND_SELECT.    ca
9b80: 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a  se SRT_Union: {.
9b90: 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20        int r1;.  
9ba0: 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
9bb0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
9bc0: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
9bd0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
9be0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
9bf0: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
9c00: 43 6f 6c 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  Col, r1);.      
9c10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9c20: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
9c30: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c  sert, iParm, r1,
9c40: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
9c50: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 73  ultCol);.      s
9c60: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
9c70: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
9c80: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9c90: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e     }..    /* Con
9ca0: 73 74 72 75 63 74 20 61 20 72 65 63 6f 72 64 20  struct a record 
9cb0: 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72  from the query r
9cc0: 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65  esult, but inste
9cd0: 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76  ad of.    ** sav
9ce0: 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c  ing that record,
9cf0: 20 75 73 65 20 69 74 20 61 73 20 61 20 6b 65 79   use it as a key
9d00: 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65   to delete eleme
9d10: 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  nts from.    ** 
9d20: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
9d30: 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a  ble iParm..    *
9d40: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  /.    case SRT_E
9d50: 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 73  xcept: {.      s
9d60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
9d70: 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c 65 74 65  (v, OP_IdxDelete
9d80: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 65 73 75  , iParm, regResu
9d90: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  lt, nResultCol);
9da0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9db0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
9dc0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
9dd0: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20  ND_SELECT */..  
9de0: 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72    /* Store the r
9df0: 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73  esult as data us
9e00: 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79  ing a unique key
9e10: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
9e20: 65 20 53 52 54 5f 46 69 66 6f 3a 0a 20 20 20 20  e SRT_Fifo:.    
9e30: 63 61 73 65 20 53 52 54 5f 44 69 73 74 46 69 66  case SRT_DistFif
9e40: 6f 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  o:.    case SRT_
9e50: 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Table:.    case 
9e60: 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
9e70: 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
9e80: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
9e90: 67 65 28 70 50 61 72 73 65 2c 20 6e 50 72 65 66  ge(pParse, nPref
9ea0: 69 78 52 65 67 2b 31 29 3b 0a 20 20 20 20 20 20  ixReg+1);.      
9eb0: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
9ec0: 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20  =SRT_Table );.  
9ed0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
9ee0: 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
9ef0: 62 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  b );.      testc
9f00: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
9f10: 46 69 66 6f 20 29 3b 0a 20 20 20 20 20 20 74 65  Fifo );.      te
9f20: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
9f30: 52 54 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a 20  RT_DistFifo );. 
9f40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9f50: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
9f60: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
9f70: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20  lt, nResultCol, 
9f80: 72 31 2b 6e 50 72 65 66 69 78 52 65 67 29 3b 0a  r1+nPrefixReg);.
9f90: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9fa0: 4d 49 54 5f 43 54 45 0a 20 20 20 20 20 20 69 66  MIT_CTE.      if
9fb0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
9fc0: 74 46 69 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  tFifo ){.       
9fd0: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
9fe0: 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74 46 69  nation is DistFi
9ff0: 66 6f 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20  fo, then cursor 
a000: 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65  (iParm+1) is ope
a010: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20  n.        ** on 
a020: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  an ephemeral ind
a030: 65 78 2e 20 49 66 20 74 68 65 20 63 75 72 72 65  ex. If the curre
a040: 6e 74 20 72 6f 77 20 69 73 20 61 6c 72 65 61 64  nt row is alread
a050: 79 20 70 72 65 73 65 6e 74 0a 20 20 20 20 20 20  y present.      
a060: 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65    ** in the inde
a070: 78 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  x, do not write 
a080: 69 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  it to the output
a090: 2e 20 49 66 20 6e 6f 74 2c 20 61 64 64 20 74 68  . If not, add th
a0a0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72  e.        ** cur
a0b0: 72 65 6e 74 20 72 6f 77 20 74 6f 20 74 68 65 20  rent row to the 
a0c0: 69 6e 64 65 78 20 61 6e 64 20 70 72 6f 63 65 65  index and procee
a0d0: 64 20 77 69 74 68 20 77 72 69 74 69 6e 67 20 69  d with writing i
a0e0: 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  t to the.       
a0f0: 20 2a 2a 20 6f 75 74 70 75 74 20 74 61 62 6c 65   ** output table
a100: 20 61 73 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20   as well.  */.  
a110: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
a120: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
a130: 65 6e 74 41 64 64 72 28 76 29 20 2b 20 34 3b 0a  entAddr(v) + 4;.
a140: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a150: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
a160: 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b  OP_Found, iParm+
a170: 31 2c 20 61 64 64 72 2c 20 72 31 2c 20 30 29 3b  1, addr, r1, 0);
a180: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
a190: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
a1a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a1b0: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78  Op4Int(v, OP_Idx
a1c0: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c  Insert, iParm+1,
a1d0: 20 72 31 2c 72 65 67 52 65 73 75 6c 74 2c 6e 52   r1,regResult,nR
a1e0: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
a1f0: 20 20 20 61 73 73 65 72 74 28 20 70 53 6f 72 74     assert( pSort
a200: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23  ==0 );.      }.#
a210: 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
a220: 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  pSort ){.       
a230: 20 61 73 73 65 72 74 28 20 72 65 67 52 65 73 75   assert( regResu
a240: 6c 74 3d 3d 72 65 67 4f 72 69 67 20 29 3b 0a 20  lt==regOrig );. 
a250: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
a260: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 53  orter(pParse, pS
a270: 6f 72 74 2c 20 70 2c 20 72 31 2b 6e 50 72 65 66  ort, p, r1+nPref
a280: 69 78 52 65 67 2c 20 72 65 67 4f 72 69 67 2c 20  ixReg, regOrig, 
a290: 31 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a  1, nPrefixReg);.
a2a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a2b0: 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71       int r2 = sq
a2c0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
a2d0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
a2e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a2f0: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
a300: 64 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20  d, iParm, r2);. 
a310: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a320: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
a330: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
a340: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73  , r2);.        s
a350: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
a360: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
a370: 45 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71  END);.        sq
a380: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
a390: 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
a3a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
a3b0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
a3c0: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
a3d0: 31 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29  1, nPrefixReg+1)
a3e0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a3f0: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
a400: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
a410: 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  RY.    /* If we 
a420: 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73  are creating a s
a430: 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20  et for an "expr 
a440: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
a450: 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20   construct,.    
a460: 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68  ** then there sh
a470: 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65  ould be a single
a480: 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61   item on the sta
a490: 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a  ck.  Write this.
a4a0: 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f      ** item into
a4b0: 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77   the set table w
a4c0: 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a  ith bogus data..
a4d0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
a4e0: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
a4f0: 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20   if( pSort ){.  
a500: 20 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73        /* At firs
a510: 74 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75  t glance you wou
a520: 6c 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c  ld think we coul
a530: 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74  d optimize out t
a540: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52  he.        ** OR
a550: 44 45 52 20 42 59 20 69 6e 20 74 68 69 73 20 63  DER BY in this c
a560: 61 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72  ase since the or
a570: 64 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  der of entries i
a580: 6e 20 74 68 65 20 73 65 74 0a 20 20 20 20 20 20  n the set.      
a590: 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61    ** does not ma
a5a0: 74 74 65 72 2e 20 20 42 75 74 20 74 68 65 72 65  tter.  But there
a5b0: 20 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49   might be a LIMI
a5c0: 54 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69  T clause, in whi
a5d0: 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  ch.        ** ca
a5e0: 73 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65  se the order doe
a5f0: 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20  s matter */.    
a600: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
a610: 65 72 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  er(.            
a620: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70  pParse, pSort, p
a630: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67  , regResult, reg
a640: 4f 72 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  Orig, nResultCol
a650: 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20  , nPrefixReg);. 
a660: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a670: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
a680: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
a690: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
a6a0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
a6b0: 74 72 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a  trlen30(pDest->z
a6c0: 41 66 66 53 64 73 74 29 3d 3d 6e 52 65 73 75 6c  AffSdst)==nResul
a6d0: 74 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  tCol );.        
a6e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a6f0: 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
a700: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
a710: 52 65 73 75 6c 74 43 6f 6c 2c 20 0a 20 20 20 20  ResultCol, .    
a720: 20 20 20 20 20 20 20 20 72 31 2c 20 70 44 65 73          r1, pDes
a730: 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20 6e 52 65  t->zAffSdst, nRe
a740: 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20  sultCol);.      
a750: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a760: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78  Op4Int(v, OP_Idx
a770: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
a780: 31 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  1, regResult, nR
a790: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
a7a0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
a7b0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
a7c0: 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r1);.      }.  
a7d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
a7e0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20  ..    /* If any 
a7f0: 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68 65  row exist in the
a800: 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63   result set, rec
a810: 6f 72 64 20 74 68 61 74 20 66 61 63 74 20 61 6e  ord that fact an
a820: 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a  d abort..    */.
a830: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69      case SRT_Exi
a840: 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  sts: {.      sql
a850: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a860: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
a870: 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f   iParm);.      /
a880: 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
a890: 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74  se will terminat
a8a0: 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  e the loop for u
a8b0: 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
a8c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
a8d0: 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61  If this is a sca
a8e0: 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20  lar select that 
a8f0: 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78  is part of an ex
a900: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20  pression, then. 
a910: 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20     ** store the 
a920: 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61  results in the a
a930: 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72  ppropriate memor
a940: 79 20 63 65 6c 6c 20 6f 72 20 61 72 72 61 79 20  y cell or array 
a950: 6f 66 20 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72  of .    ** memor
a960: 79 20 63 65 6c 6c 73 20 61 6e 64 20 62 72 65 61  y cells and brea
a970: 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 73 63 61  k out of the sca
a980: 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
a990: 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
a9a0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f   {.      if( pSo
a9b0: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  rt ){.        as
a9c0: 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c  sert( nResultCol
a9d0: 3c 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 29  <=pDest->nSdst )
a9e0: 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  ;.        pushOn
a9f0: 74 6f 53 6f 72 74 65 72 28 0a 20 20 20 20 20 20  toSorter(.      
aa00: 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 53        pParse, pS
aa10: 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c  ort, p, regResul
aa20: 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52 65 73  t, regOrig, nRes
aa30: 75 6c 74 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52  ultCol, nPrefixR
aa40: 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
aa50: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
aa60: 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d 70 44  ( nResultCol==pD
aa70: 65 73 74 2d 3e 6e 53 64 73 74 20 29 3b 0a 20 20  est->nSdst );.  
aa80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 65        assert( re
aa90: 67 52 65 73 75 6c 74 3d 3d 69 50 61 72 6d 20 29  gResult==iParm )
aaa0: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;.        /* The
aab0: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
aac0: 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74  ll jump out of t
aad0: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
aae0: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
aaf0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
ab00: 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
ab10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
ab20: 45 52 59 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65  ERY */..    case
ab30: 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20   SRT_Coroutine: 
ab40: 20 20 20 20 20 20 2f 2a 20 53 65 6e 64 20 64 61        /* Send da
ab50: 74 61 20 74 6f 20 61 20 63 6f 2d 72 6f 75 74 69  ta to a co-routi
ab60: 6e 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  ne */.    case S
ab70: 52 54 5f 4f 75 74 70 75 74 3a 20 7b 20 20 20 20  RT_Output: {    
ab80: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
ab90: 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20  e results */.   
aba0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
abb0: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
abc0: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
abd0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
abe0: 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
abf0: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
ac00: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
ac10: 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ter(pParse, pSor
ac20: 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 2c  t, p, regResult,
ac30: 20 72 65 67 4f 72 69 67 2c 20 6e 52 65 73 75 6c   regOrig, nResul
ac40: 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  tCol,.          
ac50: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 50 72               nPr
ac60: 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20  efixReg);.      
ac70: 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d  }else if( eDest=
ac80: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
ac90: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
aca0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
acb0: 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
acc0: 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
acd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
ace0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
acf0: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
ad00: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
ad10: 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20  sultCol);.      
ad20: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
ad30: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
ad40: 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
ad50: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72    /* Write the r
ad60: 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 20 70 72  esults into a pr
ad70: 69 6f 72 69 74 79 20 71 75 65 75 65 20 74 68 61  iority queue tha
ad80: 74 20 69 73 20 6f 72 64 65 72 20 61 63 63 6f 72  t is order accor
ad90: 64 69 6e 67 20 74 6f 0a 20 20 20 20 2a 2a 20 70  ding to.    ** p
ada0: 44 65 73 74 2d 3e 70 4f 72 64 65 72 42 79 20 28  Dest->pOrderBy (
adb0: 69 6e 20 70 53 4f 29 2e 20 20 70 44 65 73 74 2d  in pSO).  pDest-
adc0: 3e 69 53 44 50 61 72 6d 20 28 69 6e 20 69 50 61  >iSDParm (in iPa
add0: 72 6d 29 20 69 73 20 74 68 65 20 63 75 72 73 6f  rm) is the curso
ade0: 72 20 66 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20  r for an.    ** 
adf0: 69 6e 64 65 78 20 77 69 74 68 20 70 53 4f 2d 3e  index with pSO->
ae00: 6e 45 78 70 72 2b 32 20 63 6f 6c 75 6d 6e 73 2e  nExpr+2 columns.
ae10: 20 20 42 75 69 6c 64 20 61 20 6b 65 79 20 75 73    Build a key us
ae20: 69 6e 67 20 70 53 4f 20 66 6f 72 20 74 68 65 20  ing pSO for the 
ae30: 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 70 53 4f  first.    ** pSO
ae40: 2d 3e 6e 45 78 70 72 20 63 6f 6c 75 6d 6e 73 2c  ->nExpr columns,
ae50: 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
ae60: 61 6c 6c 20 6b 65 79 73 20 61 72 65 20 75 6e 69  all keys are uni
ae70: 71 75 65 20 62 79 20 61 64 64 69 6e 67 20 61 0a  que by adding a.
ae80: 20 20 20 20 2a 2a 20 66 69 6e 61 6c 20 4f 50 5f      ** final OP_
ae90: 53 65 71 75 65 6e 63 65 20 63 6f 6c 75 6d 6e 2e  Sequence column.
aea0: 20 20 54 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d    The last colum
aeb0: 6e 20 69 73 20 74 68 65 20 72 65 63 6f 72 64 20  n is the record 
aec0: 61 73 20 61 20 62 6c 6f 62 2e 0a 20 20 20 20 2a  as a blob..    *
aed0: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 44  /.    case SRT_D
aee0: 69 73 74 51 75 65 75 65 3a 0a 20 20 20 20 63 61  istQueue:.    ca
aef0: 73 65 20 53 52 54 5f 51 75 65 75 65 3a 20 7b 0a  se SRT_Queue: {.
af00: 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a        int nKey;.
af10: 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32        int r1, r2
af20: 2c 20 72 33 3b 0a 20 20 20 20 20 20 69 6e 74 20  , r3;.      int 
af30: 61 64 64 72 54 65 73 74 20 3d 20 30 3b 0a 20 20  addrTest = 0;.  
af40: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 53      ExprList *pS
af50: 4f 3b 0a 20 20 20 20 20 20 70 53 4f 20 3d 20 70  O;.      pSO = p
af60: 44 65 73 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  Dest->pOrderBy;.
af70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
af80: 4f 20 29 3b 0a 20 20 20 20 20 20 6e 4b 65 79 20  O );.      nKey 
af90: 3d 20 70 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20 20  = pSO->nExpr;.  
afa0: 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
afb0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
afc0: 65 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  e);.      r2 = s
afd0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
afe0: 67 65 28 70 50 61 72 73 65 2c 20 6e 4b 65 79 2b  ge(pParse, nKey+
aff0: 32 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20 72  2);.      r3 = r
b000: 32 2b 6e 4b 65 79 2b 31 3b 0a 20 20 20 20 20 20  2+nKey+1;.      
b010: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  if( eDest==SRT_D
b020: 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20  istQueue ){.    
b030: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65      /* If the de
b040: 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69 73  stination is Dis
b050: 74 51 75 65 75 65 2c 20 74 68 65 6e 20 63 75 72  tQueue, then cur
b060: 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73  sor (iParm+1) is
b070: 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
b080: 20 6f 6e 20 61 20 73 65 63 6f 6e 64 20 65 70 68   on a second eph
b090: 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 68 61  emeral index tha
b0a0: 74 20 68 6f 6c 64 73 20 61 6c 6c 20 76 61 6c 75  t holds all valu
b0b0: 65 73 20 65 76 65 72 79 20 70 72 65 76 69 6f 75  es every previou
b0c0: 73 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  sly.        ** a
b0d0: 64 64 65 64 20 74 6f 20 74 68 65 20 71 75 65 75  dded to the queu
b0e0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 64  e. */.        ad
b0f0: 64 72 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33  drTest = sqlite3
b100: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
b110: 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d   OP_Found, iParm
b120: 2b 31 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  +1, 0, .        
b130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b150: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
b160: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  ltCol);.        
b170: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
b180: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
b190: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
b1a0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
b1b0: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  d, regResult, nR
b1c0: 65 73 75 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a 20  esultCol, r3);. 
b1d0: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
b1e0: 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b  SRT_DistQueue ){
b1f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b200: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b210: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
b220: 6d 2b 31 2c 20 72 33 29 3b 0a 20 20 20 20 20 20  m+1, r3);.      
b230: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
b240: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
b250: 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a  USESEEKRESULT);.
b260: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
b270: 72 28 69 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20 69  r(i=0; i<nKey; i
b280: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
b290: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b2a0: 2c 20 4f 50 5f 53 43 6f 70 79 2c 0a 20 20 20 20  , OP_SCopy,.    
b2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2c0: 20 20 20 20 20 20 72 65 67 52 65 73 75 6c 74 20        regResult 
b2d0: 2b 20 70 53 4f 2d 3e 61 5b 69 5d 2e 75 2e 78 2e  + pSO->a[i].u.x.
b2e0: 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 2c  iOrderByCol - 1,
b2f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b300: 20 20 20 20 20 20 20 20 20 20 20 72 32 2b 69 29             r2+i)
b310: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b320: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b330: 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  2(v, OP_Sequence
b340: 2c 20 69 50 61 72 6d 2c 20 72 32 2b 6e 4b 65 79  , iParm, r2+nKey
b350: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b360: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b370: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 32 2c  _MakeRecord, r2,
b380: 20 6e 4b 65 79 2b 32 2c 20 72 31 29 3b 0a 20 20   nKey+2, r1);.  
b390: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b3a0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
b3b0: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
b3c0: 20 72 31 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29   r1, r2, nKey+2)
b3d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72  ;.      if( addr
b3e0: 54 65 73 74 20 29 20 73 71 6c 69 74 65 33 56 64  Test ) sqlite3Vd
b3f0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
b400: 64 72 54 65 73 74 29 3b 0a 20 20 20 20 20 20 73  drTest);.      s
b410: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
b420: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
b430: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
b440: 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
b450: 70 50 61 72 73 65 2c 20 72 32 2c 20 6e 4b 65 79  pParse, r2, nKey
b460: 2b 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  +2);.      break
b470: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
b480: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  * SQLITE_OMIT_CT
b490: 45 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66  E */....#if !def
b4a0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b4b0: 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20 2f 2a  _TRIGGER).    /*
b4c0: 20 44 69 73 63 61 72 64 20 74 68 65 20 72 65 73   Discard the res
b4d0: 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20 75  ults.  This is u
b4e0: 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73  sed for SELECT s
b4f0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65  tatements inside
b500: 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79  .    ** the body
b510: 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20 20   of a TRIGGER.  
b520: 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73  The purpose of s
b530: 75 63 68 20 73 65 6c 65 63 74 73 20 69 73 20 74  uch selects is t
b540: 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73  o call.    ** us
b550: 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74  er-defined funct
b560: 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 73  ions that have s
b570: 69 64 65 20 65 66 66 65 63 74 73 2e 20 20 57 65  ide effects.  We
b580: 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20   do not care.   
b590: 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63   ** about the ac
b5a0: 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20  tual results of 
b5b0: 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20  the select..    
b5c0: 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  */.    default: 
b5d0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
b5e0: 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61  eDest==SRT_Disca
b5f0: 72 64 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rd );.      brea
b600: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
b610: 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74    }..  /* Jump t
b620: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
b630: 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d   loop if the LIM
b640: 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 20 20  IT is reached.  
b650: 45 78 63 65 70 74 2c 20 69 66 0a 20 20 2a 2a 20  Except, if.  ** 
b660: 74 68 65 72 65 20 69 73 20 61 20 73 6f 72 74 65  there is a sorte
b670: 72 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  r, in which case
b680: 20 74 68 65 20 73 6f 72 74 65 72 20 68 61 73 20   the sorter has 
b690: 61 6c 72 65 61 64 79 20 6c 69 6d 69 74 65 64 0a  already limited.
b6a0: 20 20 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 20    ** the output 
b6b0: 66 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 69  for us..  */.  i
b6c0: 66 28 20 70 53 6f 72 74 3d 3d 30 20 26 26 20 70  f( pSort==0 && p
b6d0: 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
b6e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b6f0: 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70  2(v, OP_DecrJump
b700: 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  Zero, p->iLimit,
b710: 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
b720: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 7d  verage(v);.  }.}
b730: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
b740: 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63   a KeyInfo objec
b750: 74 20 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72  t sufficient for
b760: 20 61 6e 20 69 6e 64 65 78 20 6f 66 20 4e 20 6b   an index of N k
b770: 65 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 0a 2a  ey columns and.*
b780: 2a 20 58 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e  * X extra column
b790: 73 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73  s..*/.KeyInfo *s
b7a0: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
b7b0: 6f 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  oc(sqlite3 *db, 
b7c0: 69 6e 74 20 4e 2c 20 69 6e 74 20 58 29 7b 0a 20  int N, int X){. 
b7d0: 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 28 4e   int nExtra = (N
b7e0: 2b 58 29 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c  +X)*(sizeof(Coll
b7f0: 53 65 71 2a 29 2b 31 29 20 2d 20 73 69 7a 65 6f  Seq*)+1) - sizeo
b800: 66 28 43 6f 6c 6c 53 65 71 2a 29 3b 0a 20 20 4b  f(CollSeq*);.  K
b810: 65 79 49 6e 66 6f 20 2a 70 20 3d 20 73 71 6c 69  eyInfo *p = sqli
b820: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
b830: 28 64 62 2c 20 73 69 7a 65 6f 66 28 4b 65 79 49  (db, sizeof(KeyI
b840: 6e 66 6f 29 20 2b 20 6e 45 78 74 72 61 29 3b 0a  nfo) + nExtra);.
b850: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70    if( p ){.    p
b860: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
b870: 75 38 2a 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b  u8*)&p->aColl[N+
b880: 58 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 46  X];.    p->nKeyF
b890: 69 65 6c 64 20 3d 20 28 75 31 36 29 4e 3b 0a 20  ield = (u16)N;. 
b8a0: 20 20 20 70 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20     p->nAllField 
b8b0: 3d 20 28 75 31 36 29 28 4e 2b 58 29 3b 0a 20 20  = (u16)(N+X);.  
b8c0: 20 20 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64    p->enc = ENC(d
b8d0: 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20  b);.    p->db = 
b8e0: 64 62 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20  db;.    p->nRef 
b8f0: 3d 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  = 1;.    memset(
b900: 26 70 5b 31 5d 2c 20 30 2c 20 6e 45 78 74 72 61  &p[1], 0, nExtra
b910: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
b920: 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
b930: 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  db);.  }.  retur
b940: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  n p;.}../*.** De
b950: 61 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49 6e  allocate a KeyIn
b960: 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69  fo object.*/.voi
b970: 64 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  d sqlite3KeyInfo
b980: 55 6e 72 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70  Unref(KeyInfo *p
b990: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
b9a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65    assert( p->nRe
b9b0: 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52  f>0 );.    p->nR
b9c0: 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d  ef--;.    if( p-
b9d0: 3e 6e 52 65 66 3d 3d 30 20 29 20 73 71 6c 69 74  >nRef==0 ) sqlit
b9e0: 65 33 44 62 46 72 65 65 4e 4e 28 70 2d 3e 64 62  e3DbFreeNN(p->db
b9f0: 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , p);.  }.}../*.
ba00: 2a 2a 20 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f  ** Make a new po
ba10: 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e  inter to a KeyIn
ba20: 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79  fo object.*/.Key
ba30: 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79  Info *sqlite3Key
ba40: 49 6e 66 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20  InfoRef(KeyInfo 
ba50: 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  *p){.  if( p ){.
ba60: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
ba70: 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e  Ref>0 );.    p->
ba80: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  nRef++;.  }.  re
ba90: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65  turn p;.}..#ifde
baa0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
bab0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
bac0: 20 69 66 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62   if a KeyInfo ob
bad0: 6a 65 63 74 20 63 61 6e 20 62 65 20 63 68 61 6e  ject can be chan
bae0: 67 65 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f  ge.  The KeyInfo
baf0: 20 6f 62 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f   object.** can o
bb00: 6e 6c 79 20 62 65 20 63 68 61 6e 67 65 64 20 69  nly be changed i
bb10: 66 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 61  f this is just a
bb20: 20 73 69 6e 67 6c 65 20 72 65 66 65 72 65 6e 63   single referenc
bb30: 65 20 74 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e  e to the object.
bb40: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
bb50: 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ine is used only
bb60: 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72   inside of asser
bb70: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  t() statements..
bb80: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4b 65  */.int sqlite3Ke
bb90: 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
bba0: 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65  (KeyInfo *p){ re
bbb0: 74 75 72 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b  turn p->nRef==1;
bbc0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
bbd0: 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a  ITE_DEBUG */../*
bbe0: 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70  .** Given an exp
bbf0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65  ression list, ge
bc00: 6e 65 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f  nerate a KeyInfo
bc10: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
bc20: 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63  records.** the c
bc30: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
bc40: 65 20 66 6f 72 20 65 61 63 68 20 65 78 70 72 65  e for each expre
bc50: 73 73 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78  ssion in that ex
bc60: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
bc70: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72  *.** If the Expr
bc80: 4c 69 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52  List is an ORDER
bc90: 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
bca0: 63 6c 61 75 73 65 20 74 68 65 6e 20 74 68 65 20  clause then the 
bcb0: 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79  resulting.** Key
bcc0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
bcd0: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
bce0: 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61  r initializing a
bcf0: 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74   virtual index t
bd00: 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74  o.** implement t
bd10: 68 61 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20  hat clause.  If 
bd20: 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20  the ExprList is 
bd30: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
bd40: 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68  f a SELECT.** th
bd50: 65 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  en the KeyInfo s
bd60: 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72  tructure is appr
bd70: 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74  opriate for init
bd80: 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75  ializing a virtu
bd90: 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69  al.** index to i
bda0: 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49  mplement a DISTI
bdb0: 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20  NCT test..**.** 
bdc0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
bdd0: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
bde0: 75 72 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ure is obtained 
bdf0: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68  from malloc.  Th
be00: 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
be10: 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73  ction is respons
be20: 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20  ible for seeing 
be30: 74 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74  that this struct
be40: 75 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c  ure is eventuall
be50: 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 4b  y.** freed..*/.K
be60: 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b  eyInfo *sqlite3K
be70: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
be80: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
be90: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
bea0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
beb0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
bec0: 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20  st,     /* Form 
bed0: 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  the KeyInfo obje
bee0: 63 74 20 66 72 6f 6d 20 74 68 69 73 20 45 78 70  ct from this Exp
bef0: 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69  rList */.  int i
bf00: 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 20  Start,          
bf10: 2f 2a 20 42 65 67 69 6e 20 77 69 74 68 20 74 68  /* Begin with th
bf20: 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69  is column of pLi
bf30: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  st */.  int nExt
bf40: 72 61 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ra           /* 
bf50: 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 65 78  Add this many ex
bf60: 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74  tra columns to t
bf70: 68 65 20 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69  he end */.){.  i
bf80: 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49  nt nExpr;.  KeyI
bf90: 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74  nfo *pInfo;.  st
bfa0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
bfb0: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c  em *pItem;.  sql
bfc0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
bfd0: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  e->db;.  int i;.
bfe0: 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74  .  nExpr = pList
bff0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f  ->nExpr;.  pInfo
c000: 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
c010: 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72  oAlloc(db, nExpr
c020: 2d 69 53 74 61 72 74 2c 20 6e 45 78 74 72 61 2b  -iStart, nExtra+
c030: 31 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 20  1);.  if( pInfo 
c040: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
c050: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
c060: 72 69 74 65 61 62 6c 65 28 70 49 6e 66 6f 29 20  riteable(pInfo) 
c070: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 69 53 74  );.    for(i=iSt
c080: 61 72 74 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  art, pItem=pList
c090: 2d 3e 61 2b 69 53 74 61 72 74 3b 20 69 3c 6e 45  ->a+iStart; i<nE
c0a0: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
c0b0: 2b 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  +){.      pInfo-
c0c0: 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74 61 72 74 5d  >aColl[i-iStart]
c0d0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e   = sqlite3ExprNN
c0e0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
c0f0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
c100: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72       pInfo->aSor
c110: 74 4f 72 64 65 72 5b 69 2d 69 53 74 61 72 74 5d  tOrder[i-iStart]
c120: 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72   = pItem->sortOr
c130: 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  der;.    }.  }. 
c140: 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d   return pInfo;.}
c150: 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20  ../*.** Name of 
c160: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  the connection o
c170: 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f  perator, used fo
c180: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  r error messages
c190: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
c1a0: 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70  t char *selectOp
c1b0: 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20  Name(int id){.  
c1c0: 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63  char *z;.  switc
c1d0: 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73  h( id ){.    cas
c1e0: 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20  e TK_ALL:       
c1f0: 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b  z = "UNION ALL";
c200: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
c210: 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a  se TK_INTERSECT:
c220: 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22   z = "INTERSECT"
c230: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
c240: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20  ase TK_EXCEPT:  
c250: 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20    z = "EXCEPT"; 
c260: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c270: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
c280: 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20     z = "UNION"; 
c290: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
c2a0: 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a  .  return z;.}..
c2b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c2c0: 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a  MIT_EXPLAIN./*.*
c2d0: 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50  * Unless an "EXP
c2e0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22  LAIN QUERY PLAN"
c2f0: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e   command is bein
c300: 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69  g processed, thi
c310: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  s function.** is
c320: 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77   a no-op. Otherw
c330: 69 73 65 2c 20 69 74 20 61 64 64 73 20 61 20 73  ise, it adds a s
c340: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74  ingle row of out
c350: 70 75 74 20 74 6f 20 74 68 65 20 45 51 50 20 72  put to the EQP r
c360: 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20  esult,.** where 
c370: 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f  the caption is o
c380: 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
c390: 2a 20 20 20 22 55 53 45 20 54 45 4d 50 20 42 2d  *   "USE TEMP B-
c3a0: 54 52 45 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a  TREE FOR xxx".**
c3b0: 0a 2a 2a 20 77 68 65 72 65 20 78 78 78 20 69 73  .** where xxx is
c3c0: 20 6f 6e 65 20 6f 66 20 22 44 49 53 54 49 4e 43   one of "DISTINC
c3d0: 54 22 2c 20 22 4f 52 44 45 52 20 42 59 22 20 6f  T", "ORDER BY" o
c3e0: 72 20 22 47 52 4f 55 50 20 42 59 22 2e 20 45 78  r "GROUP BY". Ex
c3f0: 61 63 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69  actly which.** i
c400: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
c410: 74 68 65 20 7a 55 73 61 67 65 20 61 72 67 75 6d  the zUsage argum
c420: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
c430: 6f 69 64 20 65 78 70 6c 61 69 6e 54 65 6d 70 54  oid explainTempT
c440: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
c450: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
c460: 7a 55 73 61 67 65 29 7b 0a 20 20 45 78 70 6c 61  zUsage){.  Expla
c470: 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
c480: 72 73 65 2c 20 30 2c 20 22 55 53 45 20 54 45 4d  rse, 0, "USE TEM
c490: 50 20 42 2d 54 52 45 45 20 46 4f 52 20 25 73 22  P B-TREE FOR %s"
c4a0: 2c 20 7a 55 73 61 67 65 29 29 3b 0a 7d 0a 0a 2f  , zUsage));.}../
c4b0: 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 65 78 70 72  *.** Assign expr
c4c0: 65 73 73 69 6f 6e 20 62 20 74 6f 20 6c 76 61 6c  ession b to lval
c4d0: 75 65 20 61 2e 20 41 20 73 65 63 6f 6e 64 2c 20  ue a. A second, 
c4e0: 6e 6f 2d 6f 70 2c 20 76 65 72 73 69 6f 6e 20 6f  no-op, version o
c4f0: 66 20 74 68 69 73 20 6d 61 63 72 6f 0a 2a 2a 20  f this macro.** 
c500: 69 73 20 70 72 6f 76 69 64 65 64 20 77 68 65 6e  is provided when
c510: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
c520: 4c 41 49 4e 20 69 73 20 64 65 66 69 6e 65 64 2e  LAIN is defined.
c530: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65   This allows the
c540: 20 63 6f 64 65 0a 2a 2a 20 69 6e 20 73 71 6c 69   code.** in sqli
c550: 74 65 33 53 65 6c 65 63 74 28 29 20 74 6f 20 61  te3Select() to a
c560: 73 73 69 67 6e 20 76 61 6c 75 65 73 20 74 6f 20  ssign values to 
c570: 73 74 72 75 63 74 75 72 65 20 6d 65 6d 62 65 72  structure member
c580: 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 0a   variables that.
c590: 2a 2a 20 6f 6e 6c 79 20 65 78 69 73 74 20 69 66  ** only exist if
c5a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
c5b0: 4c 41 49 4e 20 69 73 20 6e 6f 74 20 64 65 66 69  LAIN is not defi
c5c0: 6e 65 64 20 77 69 74 68 6f 75 74 20 70 6f 6c 6c  ned without poll
c5d0: 75 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 64  uting the.** cod
c5e0: 65 20 77 69 74 68 20 23 69 66 6e 64 65 66 20 64  e with #ifndef d
c5f0: 69 72 65 63 74 69 76 65 73 2e 0a 2a 2f 0a 23 20  irectives..*/.# 
c600: 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65  define explainSe
c610: 74 49 6e 74 65 67 65 72 28 61 2c 20 62 29 20 61  tInteger(a, b) a
c620: 20 3d 20 62 0a 0a 23 65 6c 73 65 0a 2f 2a 20 4e   = b..#else./* N
c630: 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66  o-op versions of
c640: 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28   the explainXXX(
c650: 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  ) functions and 
c660: 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66  macros. */.# def
c670: 69 6e 65 20 65 78 70 6c 61 69 6e 54 65 6d 70 54  ine explainTempT
c680: 61 62 6c 65 28 79 2c 7a 29 0a 23 20 64 65 66 69  able(y,z).# defi
c690: 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74  ne explainSetInt
c6a0: 65 67 65 72 28 79 2c 7a 29 0a 23 65 6e 64 69 66  eger(y,z).#endif
c6b0: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  .../*.** If the 
c6c0: 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67  inner loop was g
c6d0: 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 61  enerated using a
c6e0: 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72   non-null pOrder
c6f0: 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  By argument,.** 
c700: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  then the results
c710: 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20   were placed in 
c720: 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72  a sorter.  After
c730: 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72   the loop is ter
c740: 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65  minated.** we ne
c750: 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f  ed to run the so
c760: 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20  rter and output 
c770: 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
c780: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72  e following.** r
c790: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
c7a0: 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64   the code needed
c7b0: 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a   to do that..*/.
c7c0: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
c7d0: 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20  rateSortTail(.  
c7e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
c7f0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
c800: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
c810: 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *p,        /* T
c820: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
c830: 65 6e 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78  ent */.  SortCtx
c840: 20 2a 70 53 6f 72 74 2c 20 20 20 2f 2a 20 49 6e   *pSort,   /* In
c850: 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 65  formation on the
c860: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
c870: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d   */.  int nColum
c880: 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  n,      /* Numbe
c890: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  r of columns of 
c8a0: 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74  data */.  Select
c8b0: 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57  Dest *pDest /* W
c8c0: 72 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20  rite the sorted 
c8d0: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
c8e0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
c8f0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
c900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c910: 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
c920: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  d statement */. 
c930: 20 69 6e 74 20 61 64 64 72 42 72 65 61 6b 20 3d   int addrBreak =
c940: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e   pSort->labelDon
c950: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
c960: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 65 78   Jump here to ex
c970: 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  it loop */.  int
c980: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20   addrContinue = 
c990: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
c9a0: 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 4a 75 6d  abel(v);  /* Jum
c9b0: 70 20 68 65 72 65 20 66 6f 72 20 6e 65 78 74 20  p here for next 
c9c0: 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61  cycle */.  int a
c9d0: 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ddr;            
c9e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
c9f0: 70 20 6f 66 20 6f 75 74 70 75 74 20 6c 6f 6f 70  p of output loop
ca00: 2e 20 4a 75 6d 70 20 66 6f 72 20 4e 65 78 74 2e  . Jump for Next.
ca10: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e   */.  int addrOn
ca20: 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54  ce = 0;.  int iT
ca30: 61 62 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  ab;.  ExprList *
ca40: 70 4f 72 64 65 72 42 79 20 3d 20 70 53 6f 72 74  pOrderBy = pSort
ca50: 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e  ->pOrderBy;.  in
ca60: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
ca70: 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74 20 69 50  >eDest;.  int iP
ca80: 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44  arm = pDest->iSD
ca90: 50 61 72 6d 3b 0a 20 20 69 6e 74 20 72 65 67 52  Parm;.  int regR
caa0: 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77  ow;.  int regRow
cab0: 69 64 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a  id;.  int iCol;.
cac0: 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20    int nKey;     
cad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cae0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b    /* Number of k
caf0: 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 73 6f  ey columns in so
cb00: 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20  rter record */. 
cb10: 20 69 6e 74 20 69 53 6f 72 74 54 61 62 3b 20 20   int iSortTab;  
cb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb30: 20 2f 2a 20 53 6f 72 74 65 72 20 63 75 72 73 6f   /* Sorter curso
cb40: 72 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  r to read from *
cb50: 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  /.  int i;.  int
cb60: 20 62 53 65 71 3b 20 20 20 20 20 20 20 20 20 20   bSeq;          
cb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cb80: 54 72 75 65 20 69 66 20 73 6f 72 74 65 72 20 72  True if sorter r
cb90: 65 63 6f 72 64 20 69 6e 63 6c 75 64 65 73 20 73  ecord includes s
cba0: 65 71 2e 20 6e 6f 2e 20 2a 2f 0a 20 20 69 6e 74  eq. no. */.  int
cbb0: 20 6e 52 65 66 4b 65 79 20 3d 20 30 3b 0a 20 20   nRefKey = 0;.  
cbc0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
cbd0: 69 74 65 6d 20 2a 61 4f 75 74 45 78 20 3d 20 70  item *aOutEx = p
cbe0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 0a 20 20  ->pEList->a;..  
cbf0: 61 73 73 65 72 74 28 20 61 64 64 72 42 72 65 61  assert( addrBrea
cc00: 6b 3c 30 20 29 3b 0a 20 20 69 66 28 20 70 53 6f  k<0 );.  if( pSo
cc10: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29  rt->labelBkOut )
cc20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
cc30: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
cc40: 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52  sub, pSort->regR
cc50: 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61  eturn, pSort->la
cc60: 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73  belBkOut);.    s
cc70: 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
cc80: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
cc90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
cca0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 53 6f  olveLabel(v, pSo
ccb0: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b  rt->labelBkOut);
ccc0: 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
ccd0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45  ITE_ENABLE_SORTE
cce0: 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 2f  R_REFERENCES.  /
ccf0: 2a 20 4f 70 65 6e 20 61 6e 79 20 63 75 72 73 6f  * Open any curso
cd00: 72 73 20 6e 65 65 64 65 64 20 66 6f 72 20 73 6f  rs needed for so
cd10: 72 74 65 72 2d 72 65 66 65 72 65 6e 63 65 20 65  rter-reference e
cd20: 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 20 20  xpressions */.  
cd30: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 6f 72 74  for(i=0; i<pSort
cd40: 2d 3e 6e 44 65 66 65 72 3b 20 69 2b 2b 29 7b 0a  ->nDefer; i++){.
cd50: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
cd60: 3d 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b  = pSort->aDefer[
cd70: 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20 69 6e 74  i].pTab;.    int
cd80: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
cd90: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
cda0: 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
cdb0: 63 68 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69  chema);.    sqli
cdc0: 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
cdd0: 72 73 65 2c 20 70 53 6f 72 74 2d 3e 61 44 65 66  rse, pSort->aDef
cde0: 65 72 5b 69 5d 2e 69 43 73 72 2c 20 69 44 62 2c  er[i].iCsr, iDb,
cdf0: 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
ce00: 61 64 29 3b 0a 20 20 20 20 6e 52 65 66 4b 65 79  ad);.    nRefKey
ce10: 20 3d 20 4d 41 58 28 6e 52 65 66 4b 65 79 2c 20   = MAX(nRefKey, 
ce20: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d  pSort->aDefer[i]
ce30: 2e 6e 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64  .nKey);.  }.#end
ce40: 69 66 0a 0a 20 20 69 54 61 62 20 3d 20 70 53 6f  if..  iTab = pSo
ce50: 72 74 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20  rt->iECursor;.  
ce60: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  if( eDest==SRT_O
ce70: 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d  utput || eDest==
ce80: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 7c 7c  SRT_Coroutine ||
ce90: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20   eDest==SRT_Mem 
cea0: 29 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20  ){.    regRowid 
ceb0: 3d 20 30 3b 0a 20 20 20 20 72 65 67 52 6f 77 20  = 0;.    regRow 
cec0: 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a  = pDest->iSdst;.
ced0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67    }else{.    reg
cee0: 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47  Rowid = sqlite3G
cef0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
cf00: 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20  );.    regRow = 
cf10: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
cf20: 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c  nge(pParse, nCol
cf30: 75 6d 6e 29 3b 0a 20 20 7d 0a 20 20 6e 4b 65 79  umn);.  }.  nKey
cf40: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
cf50: 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53  pr - pSort->nOBS
cf60: 61 74 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d  at;.  if( pSort-
cf70: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
cf80: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20  TFLAG_UseSorter 
cf90: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 53 6f  ){.    int regSo
cfa0: 72 74 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73 65  rtOut = ++pParse
cfb0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 53 6f 72  ->nMem;.    iSor
cfc0: 74 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tTab = pParse->n
cfd0: 54 61 62 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  Tab++;.    if( p
cfe0: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
cff0: 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4f 6e   ){.      addrOn
d000: 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ce = sqlite3Vdbe
d010: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63  AddOp0(v, OP_Onc
d020: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
d030: 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  (v);.    }.    s
d040: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
d050: 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
d060: 6f 2c 20 69 53 6f 72 74 54 61 62 2c 20 72 65 67  o, iSortTab, reg
d070: 53 6f 72 74 4f 75 74 2c 20 0a 20 20 20 20 20 20  SortOut, .      
d080: 20 20 6e 4b 65 79 2b 31 2b 6e 43 6f 6c 75 6d 6e    nKey+1+nColumn
d090: 2b 6e 52 65 66 4b 65 79 29 3b 0a 20 20 20 20 69  +nRefKey);.    i
d0a0: 66 28 20 61 64 64 72 4f 6e 63 65 20 29 20 73 71  f( addrOnce ) sq
d0b0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
d0c0: 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a  e(v, addrOnce);.
d0d0: 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73      addr = 1 + s
d0e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d0f0: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72  (v, OP_SorterSor
d100: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65  t, iTab, addrBre
d110: 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ak);.    VdbeCov
d120: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f  erage(v);.    co
d130: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69  deOffset(v, p->i
d140: 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74  Offset, addrCont
d150: 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  inue);.    sqlit
d160: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
d170: 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69  OP_SorterData, i
d180: 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c  Tab, regSortOut,
d190: 20 69 53 6f 72 74 54 61 62 29 3b 0a 20 20 20 20   iSortTab);.    
d1a0: 62 53 65 71 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  bSeq = 0;.  }els
d1b0: 65 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20  e{.    addr = 1 
d1c0: 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
d1d0: 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20  Op2(v, OP_Sort, 
d1e0: 69 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29  iTab, addrBreak)
d1f0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
d200: 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65  );.    codeOffse
d210: 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
d220: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a   addrContinue);.
d230: 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20 69      iSortTab = i
d240: 54 61 62 3b 0a 20 20 20 20 62 53 65 71 20 3d 20  Tab;.    bSeq = 
d250: 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  1;.  }.  for(i=0
d260: 2c 20 69 43 6f 6c 3d 6e 4b 65 79 2b 62 53 65 71  , iCol=nKey+bSeq
d270: 2d 31 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69  -1; i<nColumn; i
d280: 2b 2b 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ++){.#ifdef SQLI
d290: 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
d2a0: 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20  _REFERENCES.    
d2b0: 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 62 53  if( aOutEx[i].bS
d2c0: 6f 72 74 65 72 52 65 66 20 29 20 63 6f 6e 74 69  orterRef ) conti
d2d0: 6e 75 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  nue;.#endif.    
d2e0: 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e  if( aOutEx[i].u.
d2f0: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30  x.iOrderByCol==0
d300: 20 29 20 69 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 23   ) iCol++;.  }.#
d310: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
d320: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
d330: 45 4e 43 45 53 0a 20 20 69 66 28 20 70 53 6f 72  ENCES.  if( pSor
d340: 74 2d 3e 6e 44 65 66 65 72 20 29 7b 0a 20 20 20  t->nDefer ){.   
d350: 20 69 6e 74 20 69 4b 65 79 20 3d 20 69 43 6f 6c   int iKey = iCol
d360: 2b 31 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 4b  +1;.    int regK
d370: 65 79 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ey = sqlite3GetT
d380: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
d390: 20 6e 52 65 66 4b 65 79 29 3b 0a 0a 20 20 20 20   nRefKey);..    
d3a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 6f 72 74  for(i=0; i<pSort
d3b0: 2d 3e 6e 44 65 66 65 72 3b 20 69 2b 2b 29 7b 0a  ->nDefer; i++){.
d3c0: 20 20 20 20 20 20 69 6e 74 20 69 43 73 72 20 3d        int iCsr =
d3d0: 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69   pSort->aDefer[i
d3e0: 5d 2e 69 43 73 72 3b 0a 20 20 20 20 20 20 54 61  ].iCsr;.      Ta
d3f0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 53 6f 72  ble *pTab = pSor
d400: 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 70 54 61  t->aDefer[i].pTa
d410: 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65  b;.      int nKe
d420: 79 20 3d 20 70 53 6f 72 74 2d 3e 61 44 65 66 65  y = pSort->aDefe
d430: 72 5b 69 5d 2e 6e 4b 65 79 3b 0a 0a 20 20 20 20  r[i].nKey;..    
d440: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d450: 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
d460: 77 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20  w, iCsr);.      
d470: 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  if( HasRowid(pTa
d480: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  b) ){.        sq
d490: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
d4a0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53  v, OP_Column, iS
d4b0: 6f 72 74 54 61 62 2c 20 69 4b 65 79 2b 2b 2c 20  ortTab, iKey++, 
d4c0: 72 65 67 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  regKey);.       
d4d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d4e0: 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77  p3(v, OP_SeekRow
d4f0: 69 64 2c 20 69 43 73 72 2c 20 0a 20 20 20 20 20  id, iCsr, .     
d500: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d510: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
d520: 2b 31 2c 20 72 65 67 4b 65 79 29 3b 0a 20 20 20  +1, regKey);.   
d530: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d540: 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20    int k;.       
d550: 20 69 6e 74 20 69 4a 6d 70 3b 0a 20 20 20 20 20   int iJmp;.     
d560: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
d570: 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
d580: 78 28 70 54 61 62 29 2d 3e 6e 4b 65 79 43 6f 6c  x(pTab)->nKeyCol
d590: 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 20 20 20 20  ==nKey );.      
d5a0: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 4b 65    for(k=0; k<nKe
d5b0: 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; k++){.       
d5c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d5d0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
d5e0: 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20 69 4b 65  n, iSortTab, iKe
d5f0: 79 2b 2b 2c 20 72 65 67 4b 65 79 2b 6b 29 3b 0a  y++, regKey+k);.
d600: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d610: 20 20 69 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33    iJmp = sqlite3
d620: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
d630: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
d640: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
d650: 28 76 2c 20 4f 50 5f 53 65 65 6b 47 45 2c 20 69  (v, OP_SeekGE, i
d660: 43 73 72 2c 20 69 4a 6d 70 2b 32 2c 20 72 65 67  Csr, iJmp+2, reg
d670: 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20  Key, nKey);.    
d680: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d690: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
d6a0: 64 78 4c 45 2c 20 69 43 73 72 2c 20 69 4a 6d 70  dxLE, iCsr, iJmp
d6b0: 2b 33 2c 20 72 65 67 4b 65 79 2c 20 6e 4b 65 79  +3, regKey, nKey
d6c0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d6d0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
d6e0: 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 73 72  OP_NullRow, iCsr
d6f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
d700: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
d710: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
d720: 72 73 65 2c 20 72 65 67 4b 65 79 2c 20 6e 52 65  rse, regKey, nRe
d730: 66 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  fKey);.  }.#endi
d740: 66 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 6c 75 6d  f.  for(i=nColum
d750: 6e 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  n-1; i>=0; i--){
d760: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
d770: 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
d780: 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20  ERENCES.    if( 
d790: 61 4f 75 74 45 78 5b 69 5d 2e 62 53 6f 72 74 65  aOutEx[i].bSorte
d7a0: 72 52 65 66 20 29 7b 0a 20 20 20 20 20 20 73 71  rRef ){.      sq
d7b0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
d7c0: 61 72 73 65 2c 20 61 4f 75 74 45 78 5b 69 5d 2e  arse, aOutEx[i].
d7d0: 70 45 78 70 72 2c 20 72 65 67 52 6f 77 2b 69 29  pExpr, regRow+i)
d7e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
d7f0: 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69  if.    {.      i
d800: 6e 74 20 69 52 65 61 64 3b 0a 20 20 20 20 20 20  nt iRead;.      
d810: 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e  if( aOutEx[i].u.
d820: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 29 7b  x.iOrderByCol ){
d830: 0a 20 20 20 20 20 20 20 20 69 52 65 61 64 20 3d  .        iRead =
d840: 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69   aOutEx[i].u.x.i
d850: 4f 72 64 65 72 42 79 43 6f 6c 2d 31 3b 0a 20 20  OrderByCol-1;.  
d860: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d870: 20 20 20 69 52 65 61 64 20 3d 20 69 43 6f 6c 2d     iRead = iCol-
d880: 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
d890: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d8a0: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
d8b0: 20 69 53 6f 72 74 54 61 62 2c 20 69 52 65 61 64   iSortTab, iRead
d8c0: 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20  , regRow+i);.   
d8d0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
d8e0: 76 2c 20 22 25 73 22 2c 20 61 4f 75 74 45 78 5b  v, "%s", aOutEx[
d8f0: 69 5d 2e 7a 4e 61 6d 65 3f 61 4f 75 74 45 78 5b  i].zName?aOutEx[
d900: 69 5d 2e 7a 4e 61 6d 65 20 3a 20 61 4f 75 74 45  i].zName : aOutE
d910: 78 5b 69 5d 2e 7a 53 70 61 6e 29 29 3b 0a 20 20  x[i].zSpan));.  
d920: 20 20 7d 0a 20 20 7d 0a 20 20 73 77 69 74 63 68    }.  }.  switch
d930: 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63  ( eDest ){.    c
d940: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
d950: 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
d960: 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73 71  mTab: {.      sq
d970: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
d980: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
d990: 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29  iParm, regRowid)
d9a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d9b0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d9c0: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
d9d0: 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29  egRow, regRowid)
d9e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d9f0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
da00: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
da10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
da20: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
da30: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
da40: 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
da50: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
da60: 20 6e 43 6f 6c 75 6d 6e 3d 3d 73 71 6c 69 74 65   nColumn==sqlite
da70: 33 53 74 72 6c 65 6e 33 30 28 70 44 65 73 74 2d  3Strlen30(pDest-
da80: 3e 7a 41 66 66 53 64 73 74 29 20 29 3b 0a 20 20  >zAffSdst) );.  
da90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
daa0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
dab0: 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20  Record, regRow, 
dac0: 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 6f 77 69  nColumn, regRowi
dad0: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
dae0: 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
daf0: 2d 3e 7a 41 66 66 53 64 73 74 2c 20 6e 43 6f 6c  ->zAffSdst, nCol
db00: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  umn);.      sqli
db10: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
db20: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
db30: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69  , iParm, regRowi
db40: 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75  d, regRow, nColu
db50: 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  mn);.      break
db60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
db70: 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20   SRT_Mem: {.    
db80: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
db90: 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69  lause will termi
dba0: 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f  nate the loop fo
dbb0: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
dbc0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
dbd0: 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  f.    default: {
dbe0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
dbf0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
dc00: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
dc10: 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20 20  oroutine ); .   
dc20: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
dc30: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
dc40: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
dc50: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
dc60: 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20  outine );.      
dc70: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  if( eDest==SRT_O
dc80: 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20  utput ){.       
dc90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dca0: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
dcb0: 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74  ow, pDest->iSdst
dcc0: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
dcd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
dce0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dcf0: 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
dd00: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b  pDest->iSDParm);
dd10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
dd20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
dd30: 20 20 69 66 28 20 72 65 67 52 6f 77 69 64 20 29    if( regRowid )
dd40: 7b 0a 20 20 20 20 69 66 28 20 65 44 65 73 74 3d  {.    if( eDest=
dd50: 3d 53 52 54 5f 53 65 74 20 29 7b 0a 20 20 20 20  =SRT_Set ){.    
dd60: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
dd70: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
dd80: 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d  , regRow, nColum
dd90: 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
dda0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
ddb0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
ddc0: 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20  e, regRow);.    
ddd0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  }.    sqlite3Rel
dde0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
ddf0: 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  se, regRowid);. 
de00: 20 7d 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74   }.  /* The bott
de10: 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20  om of the loop. 
de20: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
de30: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
de40: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a   addrContinue);.
de50: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72    if( pSort->sor
de60: 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41  tFlags & SORTFLA
de70: 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20  G_UseSorter ){. 
de80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
de90: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
dea0: 72 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  rNext, iTab, add
deb0: 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
dec0: 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  (v);.  }else{.  
ded0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
dee0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
def0: 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62  iTab, addr); Vdb
df00: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
df10: 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 72  }.  if( pSort->r
df20: 65 67 52 65 74 75 72 6e 20 29 20 73 71 6c 69 74  egReturn ) sqlit
df30: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
df40: 4f 50 5f 52 65 74 75 72 6e 2c 20 70 53 6f 72 74  OP_Return, pSort
df50: 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
df60: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
df70: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42  veLabel(v, addrB
df80: 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  reak);.}../*.** 
df90: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
dfa0: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e   to a string con
dfb0: 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63  taining the 'dec
dfc0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f  laration type' o
dfd0: 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  f the.** express
dfe0: 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73  ion pExpr. The s
dff0: 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65  tring may be tre
e000: 61 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62  ated as static b
e010: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  y the caller..**
e020: 0a 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74 6f 20  .** Also try to 
e030: 65 73 74 69 6d 61 74 65 20 74 68 65 20 73 69 7a  estimate the siz
e040: 65 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  e of the returne
e050: 64 20 76 61 6c 75 65 20 61 6e 64 20 72 65 74 75  d value and retu
e060: 72 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c  rn that.** resul
e070: 74 20 69 6e 20 2a 70 45 73 74 57 69 64 74 68 2e  t in *pEstWidth.
e080: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61  .**.** The decla
e090: 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74  ration type is t
e0a0: 68 65 20 65 78 61 63 74 20 64 61 74 61 74 79 70  he exact datatyp
e0b0: 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74  e definition ext
e0c0: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a  racted from the.
e0d0: 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41  ** original CREA
e0e0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
e0f0: 6e 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73  nt if the expres
e100: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sion is a column
e110: 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61  . The.** declara
e120: 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20  tion type for a 
e130: 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49  ROWID field is I
e140: 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20  NTEGER. Exactly 
e150: 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  when an expressi
e160: 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65  on.** is conside
e170: 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e  red a column can
e180: 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74   be complex in t
e190: 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73  he presence of s
e1a0: 75 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a  ubqueries. The.*
e1b0: 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70  * result-set exp
e1c0: 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f  ression in all o
e1d0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
e1e0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
e1f0: 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65  s is .** conside
e200: 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20  red a column by 
e210: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
e220: 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f  *.**   SELECT co
e230: 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20  l FROM tbl;.**  
e240: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
e250: 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a  col FROM tbl;.**
e260: 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
e270: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b  T col FROM tbl);
e280: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63  .**   SELECT abc
e290: 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f   FROM (SELECT co
e2a0: 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62  l AS abc FROM tb
e2b0: 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64  l);.** .** The d
e2c0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
e2d0: 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73 69  for any expressi
e2e0: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  on other than a 
e2f0: 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a  column is NULL..
e300: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
e310: 6e 65 20 68 61 73 20 65 69 74 68 65 72 20 33 20  ne has either 3 
e320: 6f 72 20 36 20 70 61 72 61 6d 65 74 65 72 73 20  or 6 parameters 
e330: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
e340: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74  ther or not.** t
e350: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
e360: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
e370: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
e380: 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2f  tion is used..*/
e390: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
e3a0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
e3b0: 41 44 41 54 41 0a 23 20 64 65 66 69 6e 65 20 63  ADATA.# define c
e3c0: 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c  olumnType(A,B,C,
e3d0: 44 2c 45 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49  D,E) columnTypeI
e3e0: 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c 45 29 0a 23  mpl(A,B,C,D,E).#
e3f0: 65 6c 73 65 20 2f 2a 20 69 66 20 21 64 65 66 69  else /* if !defi
e400: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
e410: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
e420: 41 29 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 63  A) */.# define c
e430: 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c  olumnType(A,B,C,
e440: 44 2c 45 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49  D,E) columnTypeI
e450: 6d 70 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 0a  mpl(A,B).#endif.
e460: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
e470: 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70  r *columnTypeImp
e480: 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  l(.  NameContext
e490: 20 2a 70 4e 43 2c 20 0a 23 69 66 6e 64 65 66 20   *pNC, .#ifndef 
e4a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
e4b0: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20  LUMN_METADATA.  
e4c0: 45 78 70 72 20 2a 70 45 78 70 72 0a 23 65 6c 73  Expr *pExpr.#els
e4d0: 65 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  e.  Expr *pExpr,
e4e0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
e4f0: 70 7a 4f 72 69 67 44 62 2c 0a 20 20 63 6f 6e 73  pzOrigDb,.  cons
e500: 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 54  t char **pzOrigT
e510: 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ab,.  const char
e520: 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c 0a 23 65 6e   **pzOrigCol.#en
e530: 64 69 66 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f  dif.){.  char co
e540: 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  nst *zType = 0;.
e550: 20 20 69 6e 74 20 6a 3b 0a 23 69 66 64 65 66 20    int j;.#ifdef 
e560: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
e570: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20  LUMN_METADATA.  
e580: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
e590: 67 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  gDb = 0;.  char 
e5a0: 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 54 61 62 20  const *zOrigTab 
e5b0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
e5c0: 74 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b  t *zOrigCol = 0;
e5d0: 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
e5e0: 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  t( pExpr!=0 );. 
e5f0: 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53   assert( pNC->pS
e600: 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61  rcList!=0 );.  a
e610: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
e620: 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  !=TK_AGG_COLUMN 
e630: 29 3b 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  );  /* This rout
e640: 69 6e 65 20 72 75 6e 65 73 20 62 65 66 6f 72 65  ine runes before
e650: 20 61 67 67 72 65 67 61 74 65 73 0a 20 20 20 20   aggregates.    
e660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e680: 20 20 20 2a 2a 20 61 72 65 20 70 72 6f 63 65 73     ** are proces
e690: 73 65 64 20 2a 2f 0a 20 20 73 77 69 74 63 68 28  sed */.  switch(
e6a0: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
e6b0: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
e6c0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
e6d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
e6e0: 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20   column. Locate 
e6f0: 74 68 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f  the table the co
e700: 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20  lumn is being.  
e710: 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64      ** extracted
e720: 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e   from in NameCon
e730: 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54  text.pSrcList. T
e740: 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65  his table may be
e750: 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64   real.      ** d
e760: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72  atabase table or
e770: 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20   a subquery..   
e780: 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c     */.      Tabl
e790: 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20  e *pTab = 0;    
e7a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
e7b0: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d   structure colum
e7c0: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
e7d0: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c  rom */.      Sel
e7e0: 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20  ect *pS = 0;    
e7f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
e800: 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  ct the column is
e810: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
e820: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  */.      int iCo
e830: 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  l = pExpr->iColu
e840: 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66  mn;  /* Index of
e850: 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20   column in pTab 
e860: 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  */.      while( 
e870: 70 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a  pNC && !pTab ){.
e880: 20 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20          SrcList 
e890: 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d  *pTabList = pNC-
e8a0: 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20  >pSrcList;.     
e8b0: 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61     for(j=0;j<pTa
e8c0: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70  bList->nSrc && p
e8d0: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43  TabList->a[j].iC
e8e0: 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54  ursor!=pExpr->iT
e8f0: 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20  able;j++);.     
e900: 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73     if( j<pTabLis
e910: 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20  t->nSrc ){.     
e920: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62       pTab = pTab
e930: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b  List->a[j].pTab;
e940: 0a 20 20 20 20 20 20 20 20 20 20 70 53 20 3d 20  .          pS = 
e950: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
e960: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
e970: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
e980: 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78   pNC = pNC->pNex
e990: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
e9a0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
e9b0: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pTab==0 ){.     
e9c0: 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d     /* At one tim
e9d0: 65 2c 20 63 6f 64 65 20 73 75 63 68 20 61 73 20  e, code such as 
e9e0: 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77  "SELECT new.x" w
e9f0: 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 20  ithin a trigger 
ea00: 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  would.        **
ea10: 20 63 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64   cause this cond
ea20: 69 74 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53  ition to run.  S
ea30: 69 6e 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61  ince then, we ha
ea40: 76 65 20 72 65 73 74 72 75 63 74 75 72 65 64 20  ve restructured 
ea50: 68 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  how.        ** t
ea60: 72 69 67 67 65 72 20 63 6f 64 65 20 69 73 20 67  rigger code is g
ea70: 65 6e 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20  enerated and so 
ea80: 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  this condition i
ea90: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20  s no longer .   
eaa0: 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65       ** possible
eab0: 2e 20 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61  . However, it ca
eac0: 6e 20 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20  n still be true 
ead0: 66 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c  for statements l
eae0: 69 6b 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ike.        ** t
eaf0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  he following:.  
eb00: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
eb10: 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
eb20: 4c 45 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45  LE t1(col INTEGE
eb30: 52 29 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  R);.        **  
eb40: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
eb50: 74 31 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f  t1.col) FROM FRO
eb60: 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a  M t1;.        **
eb70: 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e  .        ** when
eb80: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73   columnType() is
eb90: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65   called on the e
eba0: 78 70 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f  xpression "t1.co
ebb0: 6c 22 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20  l" in the .     
ebc0: 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74     ** sub-select
ebd0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
ebe0: 73 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74  set the column t
ebf0: 79 70 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65  ype to NULL, eve
ec00: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f  n.        ** tho
ec10: 75 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65  ugh it should re
ec20: 61 6c 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52  ally be "INTEGER
ec30: 22 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  "..        **.  
ec40: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
ec50: 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20   not a problem, 
ec60: 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  as the column ty
ec70: 70 65 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69  pe of "t1.col" i
ec80: 73 20 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20  s never.        
ec90: 2a 2a 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f  ** used. When co
eca0: 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61  lumnType() is ca
ecb0: 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72  lled on the expr
ecc0: 65 73 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20  ession .        
ecd0: 2a 2a 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63  ** "(SELECT t1.c
ece0: 6f 6c 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63  ol)", the correc
ecf0: 74 20 74 79 70 65 20 69 73 20 72 65 74 75 72 6e  t type is return
ed00: 65 64 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53  ed (see the TK_S
ed10: 45 4c 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a  ELECT.        **
ed20: 20 62 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20   branch below.  
ed30: 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
ed40: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
ed50: 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26   assert( pTab &&
ed60: 20 70 45 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54   pExpr->pTab==pT
ed70: 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ab );.      if( 
ed80: 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  pS ){.        /*
ed90: 20 54 68 65 20 22 74 61 62 6c 65 22 20 69 73 20   The "table" is 
eda0: 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73  actually a sub-s
edb0: 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77 20  elect or a view 
edc0: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
edd0: 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  se.        ** of
ede0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
edf0: 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68  ement. Return th
ee00: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
ee10: 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20  pe and origin.  
ee20: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f        ** data fo
ee30: 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74  r the result-set
ee40: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73   column of the s
ee50: 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20  ub-select..     
ee60: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
ee70: 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f  ( iCol>=0 && iCo
ee80: 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  l<pS->pEList->nE
ee90: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  xpr ){.         
eea0: 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c   /* If iCol is l
eeb0: 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
eec0: 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69  hen the expressi
eed0: 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68 65 0a  on requests the.
eee0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77            ** row
eef0: 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65  id of the sub-se
ef00: 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68  lect or view. Th
ef10: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
ef20: 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20   legal (see .   
ef30: 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63         ** test c
ef40: 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d  ase misc2.2.2) -
ef50: 20 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75   it always evalu
ef60: 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20  ates to NULL..  
ef70: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
ef80: 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74       NameContext
ef90: 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20   sNC;.          
efa0: 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45  Expr *p = pS->pE
efb0: 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45  List->a[iCol].pE
efc0: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73  xpr;.          s
efd0: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53  NC.pSrcList = pS
efe0: 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20  ->pSrc;.        
eff0: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e    sNC.pNext = pN
f000: 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  C;.          sNC
f010: 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  .pParse = pNC->p
f020: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20  Parse;.         
f030: 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
f040: 79 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f 72  ype(&sNC, p,&zOr
f050: 69 67 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c 26  igDb,&zOrigTab,&
f060: 7a 4f 72 69 67 43 6f 6c 29 3b 20 0a 20 20 20 20  zOrigCol); .    
f070: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
f080: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  e{.        /* A 
f090: 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 61 20  real table or a 
f0a0: 43 54 45 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  CTE table */.   
f0b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53       assert( !pS
f0c0: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
f0d0: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
f0e0: 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20 20 20  METADATA.       
f0f0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
f100: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
f110: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
f120: 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44  ( iCol==XN_ROWID
f130: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
f140: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
f150: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
f160: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
f170: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54      zType = "INT
f180: 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20  EGER";.         
f190: 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 22 72 6f 77   zOrigCol = "row
f1a0: 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  id";.        }el
f1b0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  se{.          zO
f1c0: 72 69 67 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61  rigCol = pTab->a
f1d0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b  Col[iCol].zName;
f1e0: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
f1f0: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e   = sqlite3Column
f200: 54 79 70 65 28 26 70 54 61 62 2d 3e 61 43 6f 6c  Type(&pTab->aCol
f210: 5b 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20 20  [iCol],0);.     
f220: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72     }.        zOr
f230: 69 67 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e  igTab = pTab->zN
f240: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
f250: 20 70 4e 43 2d 3e 70 50 61 72 73 65 20 26 26 20   pNC->pParse && 
f260: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b  pTab->pSchema ){
f270: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
f280: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
f290: 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70  maToIndex(pNC->p
f2a0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
f2b0: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
f2c0: 20 20 20 20 20 7a 4f 72 69 67 44 62 20 3d 20 70       zOrigDb = p
f2d0: 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e  NC->pParse->db->
f2e0: 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
f2f0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6c  e;.        }.#el
f300: 73 65 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  se.        asser
f310: 74 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49  t( iCol==XN_ROWI
f320: 44 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26  D || (iCol>=0 &&
f330: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
f340: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ) );.        if(
f350: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
f360: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e       zType = "IN
f370: 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20  TEGER";.        
f380: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
f390: 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   zType = sqlite3
f3a0: 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62  ColumnType(&pTab
f3b0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b  ->aCol[iCol],0);
f3c0: 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
f3d0: 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  f.      }.      
f3e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
f3f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f400: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
f410: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a  se TK_SELECT: {.
f420: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
f430: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62  ression is a sub
f440: 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20  -select. Return 
f450: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
f460: 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a  type and.      *
f470: 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f  * origin info fo
f480: 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c  r the single col
f490: 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  umn in the resul
f4a0: 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
f4b0: 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ECT.      ** sta
f4c0: 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  tement..      */
f4d0: 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  .      NameConte
f4e0: 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65  xt sNC;.      Se
f4f0: 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72  lect *pS = pExpr
f500: 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  ->x.pSelect;.   
f510: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d     Expr *p = pS-
f520: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
f530: 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
f540: 74 28 20 70 45 78 70 72 2d 3e 65 58 3d 3d 45 58  t( pExpr->eX==EX
f550: 5f 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20 20  _Select );.     
f560: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
f570: 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20  pS->pSrc;.      
f580: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b  sNC.pNext = pNC;
f590: 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73  .      sNC.pPars
f5a0: 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
f5b0: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63  .      zType = c
f5c0: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
f5d0: 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f  p, &zOrigDb, &zO
f5e0: 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f  rigTab, &zOrigCo
f5f0: 6c 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  l); .      break
f600: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
f610: 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
f620: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
f630: 4d 45 54 41 44 41 54 41 20 20 0a 20 20 69 66 28  METADATA  .  if(
f640: 20 70 7a 4f 72 69 67 44 62 20 29 7b 0a 20 20 20   pzOrigDb ){.   
f650: 20 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67 54   assert( pzOrigT
f660: 61 62 20 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20  ab && pzOrigCol 
f670: 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 44 62  );.    *pzOrigDb
f680: 20 3d 20 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20   = zOrigDb;.    
f690: 2a 70 7a 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72  *pzOrigTab = zOr
f6a0: 69 67 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72  igTab;.    *pzOr
f6b0: 69 67 43 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c  igCol = zOrigCol
f6c0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
f6d0: 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a  eturn zType;.}..
f6e0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
f6f0: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65  ode that will te
f700: 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20  ll the VDBE the 
f710: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
f720: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
f730: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
f740: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
f750: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
f760: 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Types(.  Parse *
f770: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
f780: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
f790: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
f7a0: 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  bList,  /* List 
f7b0: 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45  of tables */.  E
f7c0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
f7d0: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
f7e0: 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72  s defining the r
f7f0: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a  esult set */.){.
f800: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f810: 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 56  MIT_DECLTYPE.  V
f820: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
f830: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
f840: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73  .  NameContext s
f850: 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  NC;.  sNC.pSrcLi
f860: 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
f870: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
f880: 61 72 73 65 3b 0a 20 20 73 4e 43 2e 70 4e 65 78  arse;.  sNC.pNex
f890: 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  t = 0;.  for(i=0
f8a0: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
f8b0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
f8c0: 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *p = pEList->a
f8d0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63  [i].pExpr;.    c
f8e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
f8f0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
f900: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
f910: 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74  TADATA.    const
f920: 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d   char *zOrigDb =
f930: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
f940: 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30  ar *zOrigTab = 0
f950: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
f960: 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a   *zOrigCol = 0;.
f970: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
f980: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
f990: 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67  &zOrigDb, &zOrig
f9a0: 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b  Tab, &zOrigCol);
f9b0: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62  ..    /* The vdb
f9c0: 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73 20  e must make its 
f9d0: 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20  own copy of the 
f9e0: 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20  column-type and 
f9f0: 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f  other .    ** co
fa00: 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73 74  lumn specific st
fa10: 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20 74  rings, in case t
fa20: 68 65 20 73 63 68 65 6d 61 20 69 73 20 72 65 73  he schema is res
fa30: 65 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a 20  et before this. 
fa40: 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61     ** virtual ma
fa50: 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64  chine is deleted
fa60: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
fa70: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
fa80: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
fa90: 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69 67  _DATABASE, zOrig
faa0: 44 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  Db, SQLITE_TRANS
fab0: 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
fac0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
fad0: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54  (v, i, COLNAME_T
fae0: 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c 20  ABLE, zOrigTab, 
faf0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
fb00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
fb10: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
fb20: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d  i, COLNAME_COLUM
fb30: 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53 51 4c  N, zOrigCol, SQL
fb40: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
fb50: 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70 65 20  #else.    zType 
fb60: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
fb70: 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  C, p, 0, 0, 0);.
fb80: 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
fb90: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
fba0: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44  (v, i, COLNAME_D
fbb0: 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c 20  ECLTYPE, zType, 
fbc0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
fbd0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
fbe0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
fbf0: 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 29 20  _OMIT_DECLTYPE) 
fc00: 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  */.}.../*.** Com
fc10: 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  pute the column 
fc20: 6e 61 6d 65 73 20 66 6f 72 20 61 20 53 45 4c 45  names for a SELE
fc30: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
fc40: 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 67 75 61  .** The only gua
fc50: 72 61 6e 74 65 65 20 74 68 61 74 20 53 51 4c 69  rantee that SQLi
fc60: 74 65 20 6d 61 6b 65 73 20 61 62 6f 75 74 20 63  te makes about c
fc70: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 73 20 74  olumn names is t
fc80: 68 61 74 20 69 66 20 74 68 65 0a 2a 2a 20 63 6f  hat if the.** co
fc90: 6c 75 6d 6e 20 68 61 73 20 61 6e 20 41 53 20 63  lumn has an AS c
fca0: 6c 61 75 73 65 20 61 73 73 69 67 6e 69 6e 67 20  lause assigning 
fcb0: 69 74 20 61 20 6e 61 6d 65 2c 20 74 68 61 74 20  it a name, that 
fcc0: 77 69 6c 6c 20 62 65 20 74 68 65 20 6e 61 6d 65  will be the name
fcd0: 20 75 73 65 64 2e 0a 2a 2a 20 54 68 61 74 20 69   used..** That i
fce0: 73 20 74 68 65 20 6f 6e 6c 79 20 64 6f 63 75 6d  s the only docum
fcf0: 65 6e 74 65 64 20 67 75 61 72 61 6e 74 65 65 2e  ented guarantee.
fd00: 20 20 48 6f 77 65 76 65 72 2c 20 63 6f 75 6e 74    However, count
fd10: 6c 65 73 73 20 61 70 70 6c 69 63 61 74 69 6f 6e  less application
fd20: 73 0a 2a 2a 20 64 65 76 65 6c 6f 70 65 64 20 6f  s.** developed o
fd30: 76 65 72 20 74 68 65 20 79 65 61 72 73 20 68 61  ver the years ha
fd40: 76 65 20 6d 61 64 65 20 62 61 73 65 6c 65 73 73  ve made baseless
fd50: 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 61 62 6f   assumptions abo
fd60: 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a  ut column names.
fd70: 2a 2a 20 61 6e 64 20 77 69 6c 6c 20 62 72 65 61  ** and will brea
fd80: 6b 20 69 66 20 74 68 6f 73 65 20 61 73 73 75 6d  k if those assum
fd90: 70 74 69 6f 6e 73 20 63 68 61 6e 67 65 73 2e 20  ptions changes. 
fda0: 20 48 65 6e 63 65 2c 20 75 73 65 20 65 78 74 72   Hence, use extr
fdb0: 65 6d 65 20 63 61 75 74 69 6f 6e 0a 2a 2a 20 77  eme caution.** w
fdc0: 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  hen modifying th
fdd0: 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 61 76  is routine to av
fde0: 6f 69 64 20 62 72 65 61 6b 69 6e 67 20 6c 65 67  oid breaking leg
fdf0: 61 63 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 41  acy..**.** See A
fe00: 6c 73 6f 3a 20 73 71 6c 69 74 65 33 43 6f 6c 75  lso: sqlite3Colu
fe10: 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
fe20: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 52 41 47  ).**.** The PRAG
fe30: 4d 41 20 73 68 6f 72 74 5f 63 6f 6c 75 6d 6e 5f  MA short_column_
fe40: 6e 61 6d 65 73 20 61 6e 64 20 50 52 41 47 4d 41  names and PRAGMA
fe50: 20 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d   full_column_nam
fe60: 65 73 20 73 65 74 74 69 6e 67 73 20 61 72 65 0a  es settings are.
fe70: 2a 2a 20 64 65 70 72 65 63 61 74 65 64 2e 20 20  ** deprecated.  
fe80: 54 68 65 20 64 65 66 61 75 6c 74 20 73 65 74 74  The default sett
fe90: 69 6e 67 20 69 73 20 73 68 6f 72 74 3d 4f 4e 2c  ing is short=ON,
fea0: 20 66 75 6c 6c 3d 4f 46 46 2e 20 20 39 39 2e 39   full=OFF.  99.9
feb0: 25 20 6f 66 20 61 6c 6c 0a 2a 2a 20 61 70 70 6c  % of all.** appl
fec0: 69 63 61 74 69 6f 6e 73 20 73 68 6f 75 6c 64 20  ications should 
fed0: 6f 70 65 72 61 74 65 20 74 68 69 73 20 77 61 79  operate this way
fee0: 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  .  Nevertheless,
fef0: 20 77 65 20 6e 65 65 64 20 74 6f 20 73 75 70 70   we need to supp
ff00: 6f 72 74 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72  ort the.** other
ff10: 20 6d 6f 64 65 73 20 66 6f 72 20 6c 65 67 61 63   modes for legac
ff20: 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 68 6f 72  y:.**.**    shor
ff30: 74 3d 4f 46 46 2c 20 66 75 6c 6c 3d 4f 46 46 3a  t=OFF, full=OFF:
ff40: 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 6e 61 6d        Column nam
ff50: 65 20 69 73 20 74 68 65 20 74 65 78 74 20 6f 66  e is the text of
ff60: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
ff70: 68 61 73 20 69 74 0a 2a 2a 20 20 20 20 20 20 20  has it.**       
ff80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff90: 20 20 20 20 20 20 20 6f 72 69 67 69 6e 61 6c 6c         originall
ffa0: 79 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  y appears in the
ffb0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
ffc0: 74 2e 20 20 49 6e 0a 2a 2a 20 20 20 20 20 20 20  t.  In.**       
ffd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffe0: 20 20 20 20 20 20 20 6f 74 68 65 72 20 77 6f 72         other wor
fff0: 64 73 2c 20 74 68 65 20 7a 53 70 61 6e 20 6f 66  ds, the zSpan of
10000 20 74 68 65 20 72 65 73 75 6c 74 20 65 78 70 72   the result expr
10010 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ession..**.**   
10020 20 73 68 6f 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d   short=ON, full=
10030 4f 46 46 3a 20 20 20 20 20 20 20 28 54 68 69 73  OFF:       (This
10040 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   is the default 
10050 73 65 74 74 69 6e 67 29 2e 20 20 49 66 20 74 68  setting).  If th
10060 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20  e result.**     
10070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10080 20 20 20 20 20 20 20 20 20 72 65 66 65 72 73 20           refers 
10090 64 69 72 65 63 74 6c 79 20 74 6f 20 61 20 74 61  directly to a ta
100a0 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  ble column, then
100b0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
100c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100d0 20 20 20 20 20 72 65 73 75 6c 74 20 63 6f 6c 75       result colu
100e0 6d 6e 20 6e 61 6d 65 20 69 73 20 6a 75 73 74 20  mn name is just 
100f0 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  the table column
10100 0a 2a 2a 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 20 20 20 20 20                  
10120 20 6e 61 6d 65 3a 20 43 4f 4c 55 4d 4e 2e 20 20   name: COLUMN.  
10130 4f 74 68 65 72 77 69 73 65 20 75 73 65 20 7a 53  Otherwise use zS
10140 70 61 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 66 75  pan..**.**    fu
10150 6c 6c 3d 4f 4e 2c 20 73 68 6f 72 74 3d 41 4e 59  ll=ON, short=ANY
10160 3a 20 20 20 20 20 20 20 49 66 20 74 68 65 20 72  :       If the r
10170 65 73 75 6c 74 20 72 65 66 65 72 73 20 64 69 72  esult refers dir
10180 65 63 74 6c 79 20 74 6f 20 61 20 74 61 62 6c 65  ectly to a table
10190 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 20 20 20 20   column,.**     
101a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101b0 20 20 20 20 20 20 20 20 20 74 68 65 6e 20 74 68           then th
101c0 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  e result column 
101d0 6e 61 6d 65 20 77 69 74 68 20 74 68 65 20 74 61  name with the ta
101e0 62 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 20 20  ble name.**     
101f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10200 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78 2c           prefix,
10210 20 65 78 3a 20 54 41 42 4c 45 2e 43 4f 4c 55 4d   ex: TABLE.COLUM
10220 4e 2e 20 20 4f 74 68 65 72 77 69 73 65 20 75 73  N.  Otherwise us
10230 65 20 7a 53 70 61 6e 2e 0a 2a 2f 0a 73 74 61 74  e zSpan..*/.stat
10240 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
10250 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50  ColumnNames(.  P
10260 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
10270 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
10280 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
10290 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 2f 2a   *pSelect     /*
102a0 20 47 65 6e 65 72 61 74 65 20 63 6f 6c 75 6d 6e   Generate column
102b0 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20   names for this 
102c0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
102d0 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
102e0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
102f0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 54 61 62  ;.  int i;.  Tab
10300 6c 65 20 2a 70 54 61 62 3b 0a 20 20 53 72 63 4c  le *pTab;.  SrcL
10310 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
10320 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
10330 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
10340 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
10350 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 3b 20 20   int fullName;  
10360 20 20 2f 2a 20 54 41 42 4c 45 2e 43 4f 4c 55 4d    /* TABLE.COLUM
10370 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c 61 75 73  N if no AS claus
10380 65 20 61 6e 64 20 69 73 20 61 20 64 69 72 65 63  e and is a direc
10390 74 20 74 61 62 6c 65 20 72 65 66 20 2a 2f 0a 20  t table ref */. 
103a0 20 69 6e 74 20 73 72 63 4e 61 6d 65 3b 20 20 20   int srcName;   
103b0 20 20 2f 2a 20 43 4f 4c 55 4d 4e 20 6f 72 20 54    /* COLUMN or T
103c0 41 42 4c 45 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e  ABLE.COLUMN if n
103d0 6f 20 41 53 20 63 6c 61 75 73 65 20 61 6e 64 20  o AS clause and 
103e0 69 73 20 64 69 72 65 63 74 20 2a 2f 0a 0a 23 69  is direct */..#i
103f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10400 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49  T_EXPLAIN.  /* I
10410 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50  f this is an EXP
10420 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20  LAIN, skip this 
10430 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50  step */.  if( pP
10440 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
10450 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
10460 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
10470 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53  Parse->colNamesS
10480 65 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 2f  et ) return;.  /
10490 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  * Column names a
104a0 72 65 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  re determined by
104b0 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74   the left-most t
104c0 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  erm of a compoun
104d0 64 20 73 65 6c 65 63 74 20 2a 2f 0a 20 20 77 68  d select */.  wh
104e0 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50  ile( pSelect->pP
104f0 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d  rior ) pSelect =
10500 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
10510 3b 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28  ;.  SELECTTRACE(
10520 31 2c 70 50 61 72 73 65 2c 70 53 65 6c 65 63 74  1,pParse,pSelect
10530 2c 28 22 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  ,("generating co
10540 6c 75 6d 6e 20 6e 61 6d 65 73 5c 6e 22 29 29 3b  lumn names\n"));
10550 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 53  .  pTabList = pS
10560 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 70  elect->pSrc;.  p
10570 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
10580 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65 72  >pEList;.  asser
10590 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( v!=0 );.  ass
105a0 65 72 74 28 20 70 54 61 62 4c 69 73 74 21 3d 30  ert( pTabList!=0
105b0 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f   );.  pParse->co
105c0 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20  lNamesSet = 1;. 
105d0 20 66 75 6c 6c 4e 61 6d 65 20 3d 20 28 64 62 2d   fullName = (db-
105e0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
105f0 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  FullColNames)!=0
10600 3b 0a 20 20 73 72 63 4e 61 6d 65 20 3d 20 28 64  ;.  srcName = (d
10610 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
10620 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
10630 21 3d 30 20 7c 7c 20 66 75 6c 6c 4e 61 6d 65 3b  !=0 || fullName;
10640 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  .  sqlite3VdbeSe
10650 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69  tNumCols(v, pELi
10660 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f  st->nExpr);.  fo
10670 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
10680 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
10690 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69    Expr *p = pELi
106a0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
106b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 21 3d  .    assert( p!=
106c0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
106d0 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43   p->op!=TK_AGG_C
106e0 4f 4c 55 4d 4e 20 29 3b 20 20 2f 2a 20 41 67 67  OLUMN );  /* Agg
106f0 20 70 72 6f 63 65 73 73 69 6e 67 20 68 61 73 20   processing has 
10700 6e 6f 74 20 72 75 6e 20 79 65 74 20 2a 2f 0a 20  not run yet */. 
10710 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
10720 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  !=TK_COLUMN || p
10730 2d 3e 70 54 61 62 21 3d 30 20 29 3b 20 2f 2a 20  ->pTab!=0 ); /* 
10740 43 6f 76 65 72 69 6e 67 20 69 64 78 20 6e 6f 74  Covering idx not
10750 20 79 65 74 20 63 6f 64 65 64 20 2a 2f 0a 20 20   yet coded */.  
10760 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b    if( pEList->a[
10770 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  i].zName ){.    
10780 20 20 2f 2a 20 41 6e 20 41 53 20 63 6c 61 75 73    /* An AS claus
10790 65 20 61 6c 77 61 79 73 20 74 61 6b 65 73 20 66  e always takes f
107a0 69 72 73 74 20 70 72 69 6f 72 69 74 79 20 2a 2f  irst priority */
107b0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  .      char *zNa
107c0 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  me = pEList->a[i
107d0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73  ].zName;.      s
107e0 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
107f0 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
10800 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20  ME_NAME, zName, 
10810 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
10820 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
10830 20 73 72 63 4e 61 6d 65 20 26 26 20 70 2d 3e 6f   srcName && p->o
10840 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
10850 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
10860 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  ;.      int iCol
10870 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20   = p->iColumn;. 
10880 20 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70       pTab = p->p
10890 54 61 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Tab;.      asser
108a0 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
108b0 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
108c0 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
108d0 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Key;.      asser
108e0 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28  t( iCol==-1 || (
108f0 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
10900 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
10910 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
10920 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  ){.        zCol 
10930 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
10940 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10950 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  zCol = pTab->aCo
10960 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
10970 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
10980 20 66 75 6c 6c 4e 61 6d 65 20 29 7b 0a 20 20 20   fullName ){.   
10990 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
109a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e   = 0;.        zN
109b0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
109c0 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22  intf(db, "%s.%s"
109d0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
109e0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
109f0 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
10a00 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
10a10 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53  E_NAME, zName, S
10a20 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
10a30 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10a40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10a50 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
10a60 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
10a70 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Col, SQLITE_TRAN
10a80 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a  SIENT);.      }.
10a90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10aa0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
10ab0 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53   pEList->a[i].zS
10ac0 70 61 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a  pan;.      z = z
10ad0 3d 3d 30 20 3f 20 73 71 6c 69 74 65 33 4d 50 72  ==0 ? sqlite3MPr
10ae0 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e  intf(db, "column
10af0 25 64 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69  %d", i+1) : sqli
10b00 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
10b10 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  z);.      sqlite
10b20 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
10b30 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
10b40 4d 45 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59  ME, z, SQLITE_DY
10b50 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20  NAMIC);.    }.  
10b60 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  }.  generateColu
10b70 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20  mnTypes(pParse, 
10b80 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
10b90 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  );.}../*.** Give
10ba0 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  n an expression 
10bb0 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 20 72  list (which is r
10bc0 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f  eally the list o
10bd0 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  f expressions.**
10be0 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72   that form the r
10bf0 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
10c00 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29  ELECT statement)
10c10 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72   compute appropr
10c20 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e  iate.** column n
10c30 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ames for a table
10c40 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64   that would hold
10c50 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
10c60 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  list..**.** All 
10c70 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c  column names wil
10c80 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a  l be unique..**.
10c90 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75  ** Only the colu
10ca0 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d  mn names are com
10cb0 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a  puted.  Column.z
10cc0 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f  Type, Column.zCo
10cd0 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72  ll,.** and other
10ce0 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d   fields of Colum
10cf0 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a  n are zeroed..**
10d00 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
10d10 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
10d20 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
10d30 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
10d40 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20  ccurs,.** store 
10d50 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61  NULL in *paCol a
10d60 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61  nd 0 in *pnCol a
10d70 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
10d80 5f 4e 4f 4d 45 4d 2e 0a 2a 2a 0a 2a 2a 20 54 68  _NOMEM..**.** Th
10d90 65 20 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65 65  e only guarantee
10da0 20 74 68 61 74 20 53 51 4c 69 74 65 20 6d 61 6b   that SQLite mak
10db0 65 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20  es about column 
10dc0 6e 61 6d 65 73 20 69 73 20 74 68 61 74 20 69 66  names is that if
10dd0 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68   the.** column h
10de0 61 73 20 61 6e 20 41 53 20 63 6c 61 75 73 65 20  as an AS clause 
10df0 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 6e  assigning it a n
10e00 61 6d 65 2c 20 74 68 61 74 20 77 69 6c 6c 20 62  ame, that will b
10e10 65 20 74 68 65 20 6e 61 6d 65 20 75 73 65 64 2e  e the name used.
10e20 0a 2a 2a 20 54 68 61 74 20 69 73 20 74 68 65 20  .** That is the 
10e30 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 65 64 20  only documented 
10e40 67 75 61 72 61 6e 74 65 65 2e 20 20 48 6f 77 65  guarantee.  Howe
10e50 76 65 72 2c 20 63 6f 75 6e 74 6c 65 73 73 20 61  ver, countless a
10e60 70 70 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a 20 64  pplications.** d
10e70 65 76 65 6c 6f 70 65 64 20 6f 76 65 72 20 74 68  eveloped over th
10e80 65 20 79 65 61 72 73 20 68 61 76 65 20 6d 61 64  e years have mad
10e90 65 20 62 61 73 65 6c 65 73 73 20 61 73 73 75 6d  e baseless assum
10ea0 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 63 6f 6c  ptions about col
10eb0 75 6d 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64  umn names.** and
10ec0 20 77 69 6c 6c 20 62 72 65 61 6b 20 69 66 20 74   will break if t
10ed0 68 6f 73 65 20 61 73 73 75 6d 70 74 69 6f 6e 73  hose assumptions
10ee0 20 63 68 61 6e 67 65 73 2e 20 20 48 65 6e 63 65   changes.  Hence
10ef0 2c 20 75 73 65 20 65 78 74 72 65 6d 65 20 63 61  , use extreme ca
10f00 75 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f  ution.** when mo
10f10 64 69 66 79 69 6e 67 20 74 68 69 73 20 72 6f 75  difying this rou
10f20 74 69 6e 65 20 74 6f 20 61 76 6f 69 64 20 62 72  tine to avoid br
10f30 65 61 6b 69 6e 67 20 6c 65 67 61 63 79 2e 0a 2a  eaking legacy..*
10f40 2a 0a 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20 67  *.** See Also: g
10f50 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
10f60 65 73 28 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  es().*/.int sqli
10f70 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
10f80 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
10f90 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
10fa0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
10fb0 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
10fc0 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20  st *pEList,     
10fd0 20 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66    /* Expr list f
10fe0 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72  rom which to der
10ff0 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ive column names
11000 20 2a 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c   */.  i16 *pnCol
11010 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
11020 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
11030 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72  r of columns her
11040 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a  e */.  Column **
11050 70 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f  paCol          /
11060 2a 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20  * Write the new 
11070 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65  column list here
11080 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
11090 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
110a0 62 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65  b;   /* Database
110b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
110c0 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
110d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
110e0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
110f0 0a 20 20 75 33 32 20 63 6e 74 3b 20 20 20 20 20  .  u32 cnt;     
11100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11110 2a 20 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f  * Index added to
11120 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75   make the name u
11130 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d  nique */.  Colum
11140 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20  n *aCol, *pCol; 
11150 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
11160 6f 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c  oping over resul
11170 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  t columns */.  i
11180 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
11190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
111a0 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
111b0 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
111c0 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  t */.  char *zNa
111d0 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
111e0 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d     /* Column nam
111f0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  e */.  int nName
11200 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11210 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61     /* Size of na
11220 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f  me in zName[] */
11230 0a 20 20 48 61 73 68 20 68 74 3b 20 20 20 20 20  .  Hash ht;     
11240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11250 2a 20 48 61 73 68 20 74 61 62 6c 65 20 6f 66 20  * Hash table of 
11260 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
11270 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e  .  sqlite3HashIn
11280 69 74 28 26 68 74 29 3b 0a 20 20 69 66 28 20 70  it(&ht);.  if( p
11290 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f  EList ){.    nCo
112a0 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  l = pEList->nExp
112b0 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73 71  r;.    aCol = sq
112c0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
112d0 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f  o(db, sizeof(aCo
112e0 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20  l[0])*nCol);.   
112f0 20 74 65 73 74 63 61 73 65 28 20 61 43 6f 6c 3d   testcase( aCol=
11300 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 43  =0 );.    if( nC
11310 6f 6c 3e 33 32 37 36 37 20 29 20 6e 43 6f 6c 20  ol>32767 ) nCol 
11320 3d 20 33 32 37 36 37 3b 0a 20 20 7d 65 6c 73 65  = 32767;.  }else
11330 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a  {.    nCol = 0;.
11340 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20      aCol = 0;.  
11350 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c  }.  assert( nCol
11360 3d 3d 28 69 31 36 29 6e 43 6f 6c 20 29 3b 0a 20  ==(i16)nCol );. 
11370 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a   *pnCol = nCol;.
11380 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b    *paCol = aCol;
11390 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f  ..  for(i=0, pCo
113a0 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 20 26  l=aCol; i<nCol &
113b0 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
113c0 6c 65 64 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  led; i++, pCol++
113d0 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e  ){.    /* Get an
113e0 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d   appropriate nam
113f0 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  e for the column
11400 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
11410 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d  (zName = pEList-
11420 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20  >a[i].zName)!=0 
11430 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
11440 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69  he column contai
11450 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e  ns an "AS <name>
11460 22 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e  " phrase, use <n
11470 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65  ame> as the name
11480 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
11490 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c 45       Expr *pColE
114a0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
114b0 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 4c  rSkipCollate(pEL
114c0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
114d0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
114e0 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ColExpr->op==TK_
114f0 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61  DOT ){.        a
11500 73 73 65 72 74 28 20 70 43 6f 6c 45 78 70 72 2d  ssert( pColExpr-
11510 3e 65 58 3d 3d 45 58 5f 52 69 67 68 74 20 29 3b  >eX==EX_Right );
11520 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70  .        pColExp
11530 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 78 2e  r = pColExpr->x.
11540 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
11550 61 73 73 65 72 74 28 20 70 43 6f 6c 45 78 70 72  assert( pColExpr
11560 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  !=0 );.      }. 
11570 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f       assert( pCo
11580 6c 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47  lExpr->op!=TK_AG
11590 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  G_COLUMN );.    
115a0 20 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e    if( pColExpr->
115b0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
115c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  .        /* For 
115d0 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20  columns use the 
115e0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65  column name name
115f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
11600 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d  iCol = pColExpr-
11610 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
11620 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
11630 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62 3b 0a  pColExpr->pTab;.
11640 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
11650 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20  pTab!=0 );.     
11660 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
11670 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
11680 65 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  ey;.        zNam
11690 65 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54  e = iCol>=0 ? pT
116a0 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
116b0 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22 3b 0a  Name : "rowid";.
116c0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
116d0 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
116e0 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _ID ){.        a
116f0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
11700 72 6f 70 65 72 74 79 28 70 43 6f 6c 45 78 70 72  roperty(pColExpr
11710 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
11720 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
11730 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54  = pColExpr->u.zT
11740 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73  oken;.      }els
11750 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73  e{.        /* Us
11760 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74  e the original t
11770 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ext of the colum
11780 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20  n expression as 
11790 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  its name */.    
117a0 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69      zName = pELi
117b0 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a  st->a[i].zSpan;.
117c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
117d0 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
117e0 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
117f0 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
11800 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
11810 73 65 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20  se{.      zName 
11820 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
11830 28 64 62 2c 22 63 6f 6c 75 6d 6e 25 64 22 2c 69  (db,"column%d",i
11840 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  +1);.    }..    
11850 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
11860 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
11870 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65 20  unique.  If the 
11880 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71  name is not uniq
11890 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e  ue,.    ** appen
118a0 64 20 61 6e 20 69 6e 74 65 67 65 72 20 74 6f 20  d an integer to 
118b0 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74  the name so that
118c0 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71   it becomes uniq
118d0 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ue..    */.    c
118e0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  nt = 0;.    whil
118f0 65 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69  e( zName && sqli
11900 74 65 33 48 61 73 68 46 69 6e 64 28 26 68 74 2c  te3HashFind(&ht,
11910 20 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20   zName)!=0 ){.  
11920 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69      nName = sqli
11930 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
11940 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e  e);.      if( nN
11950 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ame>0 ){.       
11960 20 66 6f 72 28 6a 3d 6e 4e 61 6d 65 2d 31 3b 20   for(j=nName-1; 
11970 6a 3e 30 20 26 26 20 73 71 6c 69 74 65 33 49 73  j>0 && sqlite3Is
11980 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6a 5d 29 3b  digit(zName[j]);
11990 20 6a 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20   j--){}.        
119a0 69 66 28 20 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a  if( zName[j]==':
119b0 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6a 3b 0a 20  ' ) nName = j;. 
119c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4e 61       }.      zNa
119d0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
119e0 6e 74 66 28 64 62 2c 20 22 25 2e 2a 7a 3a 25 75  ntf(db, "%.*z:%u
119f0 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  ", nName, zName,
11a00 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 69   ++cnt);.      i
11a10 66 28 20 63 6e 74 3e 33 20 29 20 73 71 6c 69 74  f( cnt>3 ) sqlit
11a20 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
11a30 7a 65 6f 66 28 63 6e 74 29 2c 20 26 63 6e 74 29  zeof(cnt), &cnt)
11a40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c  ;.    }.    pCol
11a50 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
11a60 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  .    sqlite3Colu
11a70 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d  mnPropertiesFrom
11a80 4e 61 6d 65 28 30 2c 20 70 43 6f 6c 29 3b 0a 20  Name(0, pCol);. 
11a90 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 26 26 20     if( zName && 
11aa0 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
11ab0 74 28 26 68 74 2c 20 7a 4e 61 6d 65 2c 20 70 43  t(&ht, zName, pC
11ac0 6f 6c 29 3d 3d 70 43 6f 6c 20 29 7b 0a 20 20 20  ol)==pCol ){.   
11ad0 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
11ae0 6c 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  lt(db);.    }.  
11af0 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43  }.  sqlite3HashC
11b00 6c 65 61 72 28 26 68 74 29 3b 0a 20 20 69 66 28  lear(&ht);.  if(
11b10 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
11b20 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  d ){.    for(j=0
11b30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<i; j++){.   
11b40 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
11b50 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  (db, aCol[j].zNa
11b60 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  me);.    }.    s
11b70 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
11b80 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43   aCol);.    *paC
11b90 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43  ol = 0;.    *pnC
11ba0 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  ol = 0;.    retu
11bb0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
11bc0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
11bd0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
11be0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20  ./*.** Add type 
11bf0 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e  and collation in
11c00 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63  formation to a c
11c10 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64  olumn list based
11c20 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20   on.** a SELECT 
11c30 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a  statement..** .*
11c40 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  * The column lis
11c50 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d  t presumably cam
11c60 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c  e from selectCol
11c70 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72  umnNamesFromExpr
11c80 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63  List()..** The c
11c90 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f  olumn list has o
11ca0 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74  nly names, not t
11cb0 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f  ypes or collatio
11cc0 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  ns.  This.** rou
11cd0 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67  tine goes throug
11ce0 68 20 61 6e 64 20 61 64 64 73 20 74 68 65 20 74  h and adds the t
11cf0 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69  ypes and collati
11d00 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
11d10 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65 73  routine requires
11d20 20 74 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69   that all identi
11d30 66 69 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c  fiers in the SEL
11d40 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ECT.** statement
11d50 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f   be resolved..*/
11d60 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
11d70 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
11d80 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20  AndCollation(.  
11d90 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
11da0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
11db0 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54   contexts */.  T
11dc0 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
11dd0 20 20 20 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75       /* Add colu
11de0 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d 61 74  mn type informat
11df0 69 6f 6e 20 74 6f 20 74 68 69 73 20 74 61 62 6c  ion to this tabl
11e00 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
11e10 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20  Select       /* 
11e20 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64  SELECT used to d
11e30 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61  etermine types a
11e40 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f  nd collations */
11e50 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
11e60 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
11e70 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
11e80 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  C;.  Column *pCo
11e90 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  l;.  CollSeq *pC
11ea0 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  oll;.  int i;.  
11eb0 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63  Expr *p;.  struc
11ec0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
11ed0 2a 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *a;..  assert( p
11ee0 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61  Select!=0 );.  a
11ef0 73 73 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d  ssert( (pSelect-
11f00 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
11f10 65 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20  esolved)!=0 );. 
11f20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
11f30 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45  Col==pSelect->pE
11f40 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64  List->nExpr || d
11f50 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
11f60 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
11f70 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
11f80 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e  rn;.  memset(&sN
11f90 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
11fa0 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  ));.  sNC.pSrcLi
11fb0 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53  st = pSelect->pS
11fc0 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63  rc;.  a = pSelec
11fd0 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20  t->pEList->a;.  
11fe0 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54  for(i=0, pCol=pT
11ff0 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62  ab->aCol; i<pTab
12000 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
12010 6c 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  l++){.    const 
12020 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20  char *zType;.   
12030 20 69 6e 74 20 6e 2c 20 6d 3b 0a 20 20 20 20 70   int n, m;.    p
12040 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20   = a[i].pExpr;. 
12050 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
12060 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30  nType(&sNC, p, 0
12070 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20  , 0, 0);.    /* 
12080 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20 2e 2e  pCol->szEst = ..
12090 2e 20 2f 2f 20 43 6f 6c 75 6d 6e 20 73 69 7a 65  . // Column size
120a0 20 65 73 74 20 66 6f 72 20 53 45 4c 45 43 54 20   est for SELECT 
120b0 74 61 62 6c 65 73 20 6e 65 76 65 72 20 75 73 65  tables never use
120c0 64 20 2a 2f 0a 20 20 20 20 70 43 6f 6c 2d 3e 61  d */.    pCol->a
120d0 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
120e0 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29  3ExprAffinity(p)
120f0 3b 0a 20 20 20 20 69 66 28 20 7a 54 79 70 65 20  ;.    if( zType 
12100 29 7b 0a 20 20 20 20 20 20 6d 20 3d 20 73 71 6c  ){.      m = sql
12110 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79  ite3Strlen30(zTy
12120 70 65 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73  pe);.      n = s
12130 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
12140 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
12150 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d     pCol->zName =
12160 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
12170 63 4f 72 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  cOrFree(db, pCol
12180 2d 3e 7a 4e 61 6d 65 2c 20 6e 2b 6d 2b 32 29 3b  ->zName, n+m+2);
12190 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d  .      if( pCol-
121a0 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  >zName ){.      
121b0 20 20 6d 65 6d 63 70 79 28 26 70 43 6f 6c 2d 3e    memcpy(&pCol->
121c0 7a 4e 61 6d 65 5b 6e 2b 31 5d 2c 20 7a 54 79 70  zName[n+1], zTyp
121d0 65 2c 20 6d 2b 31 29 3b 0a 20 20 20 20 20 20 20  e, m+1);.       
121e0 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
121f0 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 41 53 54 59  |= COLFLAG_HASTY
12200 50 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PE;.      }.    
12210 7d 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e  }.    if( pCol->
12220 61 66 66 69 6e 69 74 79 3d 3d 30 20 29 20 70 43  affinity==0 ) pC
12230 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53  ol->affinity = S
12240 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a  QLITE_AFF_BLOB;.
12250 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
12260 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
12270 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69  Parse, p);.    i
12280 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c  f( pColl && pCol
12290 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20  ->zColl==0 ){.  
122a0 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20      pCol->zColl 
122b0 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
122c0 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  p(db, pColl->zNa
122d0 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
122e0 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20   pTab->szTabRow 
122f0 3d 20 31 3b 20 2f 2a 20 41 6e 79 20 6e 6f 6e 2d  = 1; /* Any non-
12300 7a 65 72 6f 20 76 61 6c 75 65 20 77 6f 72 6b 73  zero value works
12310 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   */.}../*.** Giv
12320 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  en a SELECT stat
12330 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20  ement, generate 
12340 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
12350 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
12360 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
12370 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43  et of that SELEC
12380 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  T..*/.Table *sql
12390 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
123a0 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
123b0 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
123c0 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  lect){.  Table *
123d0 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20  pTab;.  sqlite3 
123e0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
123f0 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c 61  ;.  int savedFla
12400 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61 67  gs;..  savedFlag
12410 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20  s = db->flags;. 
12420 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
12430 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
12440 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  es;.  db->flags 
12450 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43  |= SQLITE_ShortC
12460 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74  olNames;.  sqlit
12470 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
12480 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29  rse, pSelect, 0)
12490 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
124a0 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b  nErr ) return 0;
124b0 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63  .  while( pSelec
124c0 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c  t->pPrior ) pSel
124d0 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ect = pSelect->p
124e0 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c 61  Prior;.  db->fla
124f0 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b  gs = savedFlags;
12500 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
12510 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
12520 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20  , sizeof(Table) 
12530 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  );.  if( pTab==0
12540 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
12550 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73  ;.  }.  /* The s
12560 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
12570 66 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e 6c  fSelect() is onl
12580 79 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78 74  y used n context
12590 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69 64  s where lookasid
125a0 65 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c  e.  ** is disabl
125b0 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ed */.  assert( 
125c0 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44  db->lookaside.bD
125d0 69 73 61 62 6c 65 20 29 3b 0a 20 20 70 54 61 62  isable );.  pTab
125e0 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20  ->nTabRef = 1;. 
125f0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30   pTab->zName = 0
12600 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  ;.  pTab->nRowLo
12610 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65  gEst = 200; asse
12620 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33  rt( 200==sqlite3
12630 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20  LogEst(1048576) 
12640 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  );.  sqlite3Colu
12650 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
12660 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d  pParse, pSelect-
12670 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e  >pEList, &pTab->
12680 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f  nCol, &pTab->aCo
12690 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  l);.  sqlite3Sel
126a0 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
126b0 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61  AndCollation(pPa
126c0 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 65  rse, pTab, pSele
126d0 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b  ct);.  pTab->iPK
126e0 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64  ey = -1;.  if( d
126f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
12700 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
12710 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54  leteTable(db, pT
12720 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ab);.    return 
12730 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
12740 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  pTab;.}../*.** G
12750 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74 68  et a VDBE for th
12760 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20 63  e given parser c
12770 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65 20  ontext.  Create 
12780 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
12790 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e  essary..** If an
127a0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
127b0 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c  eturn NULL and l
127c0 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20 69  eave a message i
127d0 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62  n pParse..*/.Vdb
127e0 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62  e *sqlite3GetVdb
127f0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
12800 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
12810 70 56 64 62 65 20 29 7b 0a 20 20 20 20 72 65 74  pVdbe ){.    ret
12820 75 72 6e 20 70 50 61 72 73 65 2d 3e 70 56 64 62  urn pParse->pVdb
12830 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  e;.  }.  if( pPa
12840 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d  rse->pToplevel==
12850 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61  0.   && Optimiza
12860 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61 72  tionEnabled(pPar
12870 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 46 61  se->db,SQLITE_Fa
12880 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29 0a 20 20  ctorOutConst).  
12890 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6f  ){.    pParse->o
128a0 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d 20 31  kConstFactor = 1
128b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
128c0 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65  qlite3VdbeCreate
128d0 28 70 50 61 72 73 65 29 3b 0a 7d 0a 0a 0a 2f 2a  (pParse);.}.../*
128e0 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
128f0 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
12900 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  et fields of the
12910 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e   SELECT based on
12920 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 65   the.** pLimit e
12930 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69  xpressions.  pLi
12940 6d 69 74 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70  mit->pLeft and p
12950 4c 69 6d 69 74 2d 3e 78 2c 70 52 69 67 68 74 20  Limit->x,pRight 
12960 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73  hold the express
12970 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70  ions.** that app
12980 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69  ear in the origi
12990 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  nal SQL statemen
129a0 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49  t after the LIMI
129b0 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20  T and OFFSET.** 
129c0 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55  keywords.  Or NU
129d0 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77  LL if those keyw
129e0 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64  ords are omitted
129f0 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  . iLimit and iOf
12a00 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65  fset .** are the
12a10 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20   integer memory 
12a20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  register numbers
12a30 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73   for counters us
12a40 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a  ed to compute .*
12a50 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20  * the limit and 
12a60 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65 72  offset.  If ther
12a70 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e  e is no limit an
12a80 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65  d/or offset, the
12a90 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64  n .** iLimit and
12aa0 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67   iOffset are neg
12ab0 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ative..**.** Thi
12ac0 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65  s routine change
12ad0 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  s the values of 
12ae0 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
12af0 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20  et only if.** a 
12b00 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20  limit or offset 
12b10 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c  is defined by pL
12b20 69 6d 69 74 2d 3e 70 4c 65 66 74 20 61 6e 64 20  imit->pLeft and 
12b30 70 4c 69 6d 69 74 2d 3e 78 2e 70 52 69 67 68 74  pLimit->x.pRight
12b40 2e 20 20 69 4c 69 6d 69 74 0a 2a 2a 20 61 6e 64  .  iLimit.** and
12b50 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20   iOffset should 
12b60 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65 74  have been preset
12b70 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20   to appropriate 
12b80 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20 28  default values (
12b90 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74  zero).** prior t
12ba0 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
12bb0 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
12bc0 65 20 69 4f 66 66 73 65 74 20 72 65 67 69 73 74  e iOffset regist
12bd0 65 72 20 28 69 66 20 69 74 20 65 78 69 73 74 73  er (if it exists
12be0 29 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  ) is initialized
12bf0 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a   to the value.**
12c00 20 6f 66 20 74 68 65 20 4f 46 46 53 45 54 2e 20   of the OFFSET. 
12c10 20 54 68 65 20 69 4c 69 6d 69 74 20 72 65 67 69   The iLimit regi
12c20 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69  ster is initiali
12c30 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52  zed to LIMIT.  R
12c40 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73  egister.** iOffs
12c50 65 74 2b 31 20 69 73 20 69 6e 69 74 69 61 6c 69  et+1 is initiali
12c60 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46  zed to LIMIT+OFF
12c70 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  SET..**.** Only 
12c80 69 66 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74  if pLimit->pLeft
12c90 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74  !=0 do the limit
12ca0 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a   registers get.*
12cb0 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68  * redefined.  Th
12cc0 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
12cd0 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70  ator uses this p
12ce0 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65  roperty to force
12cf0 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66  .** the reuse of
12d00 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20   the same limit 
12d10 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73  and offset regis
12d20 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74  ters across mult
12d30 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73  iple.** SELECT s
12d40 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74  tatements..*/.st
12d50 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74  atic void comput
12d60 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
12d70 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
12d80 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42  elect *p, int iB
12d90 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76  reak){.  Vdbe *v
12da0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d   = 0;.  int iLim
12db0 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f  it = 0;.  int iO
12dc0 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a  ffset;.  int n;.
12dd0 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d    Expr *pLimit =
12de0 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 0a 20 20 69   p->pLimit;..  i
12df0 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72  f( p->iLimit ) r
12e00 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20  eturn;..  /* .  
12e10 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c  ** "LIMIT -1" al
12e20 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72  ways shows all r
12e30 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 73  ows.  There is s
12e40 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f 76  ome.  ** controv
12e50 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74 20  ersy about what 
12e60 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61  the correct beha
12e70 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a  vior should be..
12e80 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74    ** The current
12e90 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
12ea0 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49  interprets "LIMI
12eb0 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a  T 0" to mean.  *
12ec0 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a  * no rows..  */.
12ed0 20 20 69 66 28 20 70 4c 69 6d 69 74 20 29 7b 0a    if( pLimit ){.
12ee0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 6d      assert( pLim
12ef0 69 74 2d 3e 6f 70 3d 3d 54 4b 5f 4c 49 4d 49 54  it->op==TK_LIMIT
12f00 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12f10 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 21 3d 30  pLimit->pLeft!=0
12f20 20 29 3b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69   );.    p->iLimi
12f30 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70  t = iLimit = ++p
12f40 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
12f50 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
12f60 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
12f70 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
12f80 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
12f90 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 4c  ExprIsInteger(pL
12fa0 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 29  imit->pLeft, &n)
12fb0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12fc0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12fd0 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c  P_Integer, n, iL
12fe0 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62  imit);.      Vdb
12ff0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
13000 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  MIT counter"));.
13010 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29        if( n==0 )
13020 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
13030 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 69 42 72  3VdbeGoto(v, iBr
13040 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  eak);.      }els
13050 65 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d  e if( n>=0 && p-
13060 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 73 71 6c 69  >nSelectRow>sqli
13070 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e  te3LogEst((u64)n
13080 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ) ){.        p->
13090 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c  nSelectRow = sql
130a0 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29  ite3LogEst((u64)
130b0 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73  n);.        p->s
130c0 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 46 69  elFlags |= SF_Fi
130d0 78 65 64 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  xedLimit;.      
130e0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
130f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
13100 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69 6d 69  de(pParse, pLimi
13110 74 2d 3e 70 4c 65 66 74 2c 20 69 4c 69 6d 69 74  t->pLeft, iLimit
13120 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13130 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
13140 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d  _MustBeInt, iLim
13150 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  it); VdbeCoverag
13160 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
13170 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d  Comment((v, "LIM
13180 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  IT counter"));. 
13190 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
131a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e  AddOp2(v, OP_IfN
131b0 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65  ot, iLimit, iBre
131c0 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
131d0 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e(v);.    }.    
131e0 69 66 28 20 70 4c 69 6d 69 74 2d 3e 65 58 3d 3d  if( pLimit->eX==
131f0 45 58 5f 52 69 67 68 74 20 29 7b 0a 20 20 20 20  EX_Right ){.    
13200 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69    p->iOffset = i
13210 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  Offset = ++pPars
13220 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70  e->nMem;.      p
13230 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20  Parse->nMem++;  
13240 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20   /* Allocate an 
13250 65 78 74 72 61 20 72 65 67 69 73 74 65 72 20 66  extra register f
13260 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20  or limit+offset 
13270 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
13280 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
13290 20 70 4c 69 6d 69 74 2d 3e 78 2e 70 52 69 67 68   pLimit->x.pRigh
132a0 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  t, iOffset);.   
132b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
132c0 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp1(v, OP_MustB
132d0 65 49 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b 20  eInt, iOffset); 
132e0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
132f0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
13300 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54 20 63  nt((v, "OFFSET c
13310 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20  ounter"));.     
13320 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13330 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c  p3(v, OP_OffsetL
13340 69 6d 69 74 2c 20 69 4c 69 6d 69 74 2c 20 69 4f  imit, iLimit, iO
13350 66 66 73 65 74 2b 31 2c 20 69 4f 66 66 73 65 74  ffset+1, iOffset
13360 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
13370 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b  ment((v, "LIMIT+
13380 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20 7d  OFFSET"));.    }
13390 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
133a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
133b0 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a  OUND_SELECT./*.*
133c0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70  * Return the app
133d0 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69  ropriate collati
133e0 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
133f0 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  the iCol-th colu
13400 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73  mn of.** the res
13410 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65 20  ult set for the 
13420 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20  compound-select 
13430 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20  statement "p".  
13440 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a  Return NULL if.*
13450 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73  * the column has
13460 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c   no default coll
13470 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a  ating sequence..
13480 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74  **.** The collat
13490 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
134a0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
134b0 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72  lect is taken fr
134c0 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d  om the.** left-m
134d0 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ost term of the 
134e0 73 65 6c 65 63 74 20 74 68 61 74 20 68 61 73 20  select that has 
134f0 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
13500 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ence..*/.static 
13510 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65  CollSeq *multiSe
13520 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73  lectCollSeq(Pars
13530 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
13540 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b  t *p, int iCol){
13550 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74  .  CollSeq *pRet
13560 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  ;.  if( p->pPrio
13570 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  r ){.    pRet = 
13580 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
13590 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50  eq(pParse, p->pP
135a0 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d  rior, iCol);.  }
135b0 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d  else{.    pRet =
135c0 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
135d0 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 2f  ( iCol>=0 );.  /
135e0 2a 20 69 43 6f 6c 20 6d 75 73 74 20 62 65 20 6c  * iCol must be l
135f0 65 73 73 20 74 68 61 6e 20 70 2d 3e 70 45 4c 69  ess than p->pELi
13600 73 74 2d 3e 6e 45 78 70 72 2e 20 20 4f 74 68 65  st->nExpr.  Othe
13610 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 77  rwise an error w
13620 6f 75 6c 64 0a 20 20 2a 2a 20 68 61 76 65 20 62  ould.  ** have b
13630 65 65 6e 20 74 68 72 6f 77 6e 20 64 75 72 69 6e  een thrown durin
13640 67 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  g name resolutio
13650 6e 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 6e  n and we would n
13660 6f 74 20 68 61 76 65 20 67 6f 74 74 65 6e 0a 20  ot have gotten. 
13670 20 2a 2a 20 74 68 69 73 20 66 61 72 20 2a 2f 0a   ** this far */.
13680 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 26 26    if( pRet==0 &&
13690 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70 2d 3e   ALWAYS(iCol<p->
136a0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  pEList->nExpr) )
136b0 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  {.    pRet = sql
136c0 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
136d0 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73  pParse, p->pELis
136e0 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72  t->a[iCol].pExpr
136f0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
13700 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pRet;.}../*.** T
13710 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
13720 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ent passed as th
13730 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
13740 65 72 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  er is a compound
13750 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20   SELECT.** with 
13760 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
13770 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  se. This functio
13780 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20  n allocates and 
13790 72 65 74 75 72 6e 73 20 61 20 4b 65 79 49 6e 66  returns a KeyInf
137a0 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 73  o.** structure s
137b0 75 69 74 61 62 6c 65 20 66 6f 72 20 69 6d 70 6c  uitable for impl
137c0 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44  ementing the ORD
137d0 45 52 20 42 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61  ER BY..**.** Spa
137e0 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b  ce to hold the K
137f0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
13800 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
13810 6d 20 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 63 61  m malloc. The ca
13820 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
13830 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  n is responsible
13840 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 68   for ensuring th
13850 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72  at this structur
13860 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a  e is eventually.
13870 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61  ** freed..*/.sta
13880 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c  tic KeyInfo *mul
13890 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b  tiSelectOrderByK
138a0 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  eyInfo(Parse *pP
138b0 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
138c0 20 69 6e 74 20 6e 45 78 74 72 61 29 7b 0a 20 20   int nExtra){.  
138d0 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
138e0 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
138f0 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79  ;.  int nOrderBy
13900 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e   = p->pOrderBy->
13910 6e 45 78 70 72 3b 0a 20 20 73 71 6c 69 74 65 33  nExpr;.  sqlite3
13920 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
13930 62 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 52  b;.  KeyInfo *pR
13940 65 74 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  et = sqlite3KeyI
13950 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72  nfoAlloc(db, nOr
13960 64 65 72 42 79 2b 6e 45 78 74 72 61 2c 20 31 29  derBy+nExtra, 1)
13970 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a  ;.  if( pRet ){.
13980 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
13990 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
139a0 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
139b0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
139c0 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
139d0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20  OrderBy->a[i];. 
139e0 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d       Expr *pTerm
139f0 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
13a00 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
13a10 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 69 66  pColl;..      if
13a20 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26  ( pTerm->flags &
13a30 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20   EP_Collate ){. 
13a40 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
13a50 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
13a60 71 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 29  q(pParse, pTerm)
13a70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13a80 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d         pColl = m
13a90 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
13aa0 71 28 70 50 61 72 73 65 2c 20 70 2c 20 70 49 74  q(pParse, p, pIt
13ab0 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
13ac0 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Col-1);.        
13ad0 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70  if( pColl==0 ) p
13ae0 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
13af0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f  Coll;.        pO
13b00 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
13b10 70 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73  pr =.          s
13b20 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c  qlite3ExprAddCol
13b30 6c 61 74 65 53 74 72 69 6e 67 28 70 50 61 72 73  lateString(pPars
13b40 65 2c 20 70 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d  e, pTerm, pColl-
13b50 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  >zName);.      }
13b60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
13b70 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
13b80 72 69 74 65 61 62 6c 65 28 70 52 65 74 29 20 29  riteable(pRet) )
13b90 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 61 43  ;.      pRet->aC
13ba0 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a  oll[i] = pColl;.
13bb0 20 20 20 20 20 20 70 52 65 74 2d 3e 61 53 6f 72        pRet->aSor
13bc0 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64  tOrder[i] = pOrd
13bd0 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
13be0 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rder;.    }.  }.
13bf0 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
13c00 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
13c10 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a  E_OMIT_CTE./*.**
13c20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
13c30 6e 65 72 61 74 65 73 20 56 44 42 45 20 63 6f 64  nerates VDBE cod
13c40 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  e to compute the
13c50 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 49   content of a WI
13c60 54 48 20 52 45 43 55 52 53 49 56 45 0a 2a 2a 20  TH RECURSIVE.** 
13c70 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72  query of the for
13c80 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 3c 72 65 63 75  m:.**.**   <recu
13c90 72 73 69 76 65 2d 74 61 62 6c 65 3e 20 41 53 20  rsive-table> AS 
13ca0 28 3c 73 65 74 75 70 2d 71 75 65 72 79 3e 20 55  (<setup-query> U
13cb0 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 3c 72 65 63 75  NION [ALL] <recu
13cc0 72 73 69 76 65 2d 71 75 65 72 79 3e 29 0a 2a 2a  rsive-query>).**
13cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ce0 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
13cf0 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20  _____/          
13d00 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
13d10 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20  ___/.**         
13d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d30 20 20 70 2d 3e 70 50 72 69 6f 72 20 20 20 20 20    p->pPrior     
13d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d50 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72   p.**.**.** Ther
13d60 65 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65  e is exactly one
13d70 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
13d80 65 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c  e recursive-tabl
13d90 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
13da0 61 75 73 65 0a 2a 2a 20 6f 66 20 72 65 63 75 72  ause.** of recur
13db0 73 69 76 65 2d 71 75 65 72 79 2c 20 6d 61 72 6b  sive-query, mark
13dc0 65 64 20 77 69 74 68 20 74 68 65 20 53 72 63 4c  ed with the SrcL
13dd0 69 73 74 2d 3e 61 5b 5d 2e 66 67 2e 69 73 52 65  ist->a[].fg.isRe
13de0 63 75 72 73 69 76 65 20 66 6c 61 67 2e 0a 2a 2a  cursive flag..**
13df0 0a 2a 2a 20 54 68 65 20 73 65 74 75 70 2d 71 75  .** The setup-qu
13e00 65 72 79 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f  ery runs once to
13e10 20 67 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 69   generate an ini
13e20 74 69 61 6c 20 73 65 74 20 6f 66 20 72 6f 77 73  tial set of rows
13e30 20 74 68 61 74 20 67 6f 0a 2a 2a 20 69 6e 74 6f   that go.** into
13e40 20 61 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20   a Queue table. 
13e50 20 52 6f 77 73 20 61 72 65 20 65 78 74 72 61 63   Rows are extrac
13e60 74 65 64 20 66 72 6f 6d 20 74 68 65 20 51 75 65  ted from the Que
13e70 75 65 20 74 61 62 6c 65 20 6f 6e 65 20 62 79 0a  ue table one by.
13e80 2a 2a 20 6f 6e 65 2e 20 20 45 61 63 68 20 72 6f  ** one.  Each ro
13e90 77 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  w extracted from
13ea0 20 51 75 65 75 65 20 69 73 20 6f 75 74 70 75 74   Queue is output
13eb0 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65 6e   to pDest.  Then
13ec0 20 74 68 65 20 73 69 6e 67 6c 65 0a 2a 2a 20 65   the single.** e
13ed0 78 74 72 61 63 74 65 64 20 72 6f 77 20 28 6e 6f  xtracted row (no
13ee0 77 20 69 6e 20 74 68 65 20 69 43 75 72 72 65 6e  w in the iCurren
13ef0 74 20 74 61 62 6c 65 29 20 62 65 63 6f 6d 65 73  t table) becomes
13f00 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
13f10 74 68 65 0a 2a 2a 20 72 65 63 75 72 73 69 76 65  the.** recursive
13f20 2d 74 61 62 6c 65 20 66 6f 72 20 61 20 72 65 63  -table for a rec
13f30 75 72 73 69 76 65 2d 71 75 65 72 79 20 72 75 6e  ursive-query run
13f40 2e 20 20 54 68 65 20 6f 75 74 70 75 74 20 6f 66  .  The output of
13f50 20 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 71   the recursive-q
13f60 75 65 72 79 0a 2a 2a 20 69 73 20 61 64 64 65 64  uery.** is added
13f70 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 51   back into the Q
13f80 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65  ueue table.  The
13f90 6e 20 61 6e 6f 74 68 65 72 20 72 6f 77 20 69 73  n another row is
13fa0 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
13fb0 51 75 65 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65  Queue.** and the
13fc0 20 69 74 65 72 61 74 69 6f 6e 20 63 6f 6e 74 69   iteration conti
13fd0 6e 75 65 73 20 75 6e 74 69 6c 20 74 68 65 20 51  nues until the Q
13fe0 75 65 75 65 20 74 61 62 6c 65 20 69 73 20 65 6d  ueue table is em
13ff0 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  pty..**.** If th
14000 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
14010 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49   operator is UNI
14020 4f 4e 20 74 68 65 6e 20 6e 6f 20 64 75 70 6c 69  ON then no dupli
14030 63 61 74 65 20 72 6f 77 73 20 61 72 65 20 65 76  cate rows are ev
14040 65 72 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69  er.** inserted i
14050 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61  nto the Queue ta
14060 62 6c 65 2e 20 20 54 68 65 20 69 44 69 73 74 69  ble.  The iDisti
14070 6e 63 74 20 74 61 62 6c 65 20 6b 65 65 70 73 20  nct table keeps 
14080 61 20 63 6f 70 79 20 6f 66 20 61 6c 6c 20 72 6f  a copy of all ro
14090 77 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20  ws.** that have 
140a0 65 76 65 72 20 62 65 65 6e 20 69 6e 73 65 72 74  ever been insert
140b0 65 64 20 69 6e 74 6f 20 51 75 65 75 65 20 61 6e  ed into Queue an
140c0 64 20 63 61 75 73 65 73 20 64 75 70 6c 69 63 61  d causes duplica
140d0 74 65 73 20 74 6f 20 62 65 0a 2a 2a 20 64 69 73  tes to be.** dis
140e0 63 61 72 64 65 64 2e 20 20 49 66 20 74 68 65 20  carded.  If the 
140f0 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f  operator is UNIO
14100 4e 20 41 4c 4c 2c 20 74 68 65 6e 20 64 75 70 6c  N ALL, then dupl
14110 69 63 61 74 65 73 20 61 72 65 20 61 6c 6c 6f 77  icates are allow
14120 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68  ed..** .** If th
14130 65 20 71 75 65 72 79 20 68 61 73 20 61 6e 20 4f  e query has an O
14140 52 44 45 52 20 42 59 2c 20 74 68 65 6e 20 65 6e  RDER BY, then en
14150 74 72 69 65 73 20 69 6e 20 74 68 65 20 51 75 65  tries in the Que
14160 75 65 20 74 61 62 6c 65 20 61 72 65 20 6b 65 70  ue table are kep
14170 74 20 69 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59  t in.** ORDER BY
14180 20 6f 72 64 65 72 20 61 6e 64 20 74 68 65 20 66   order and the f
14190 69 72 73 74 20 65 6e 74 72 79 20 69 73 20 65 78  irst entry is ex
141a0 74 72 61 63 74 65 64 20 66 6f 72 20 65 61 63 68  tracted for each
141b0 20 63 79 63 6c 65 2e 20 20 57 69 74 68 6f 75 74   cycle.  Without
141c0 0a 2a 2a 20 61 6e 20 4f 52 44 45 52 20 42 59 2c  .** an ORDER BY,
141d0 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
141e0 20 69 73 20 6a 75 73 74 20 61 20 46 49 46 4f 2e   is just a FIFO.
141f0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4c 49 4d 49  .**.** If a LIMI
14200 54 20 63 6c 61 75 73 65 20 69 73 20 70 72 6f 76  T clause is prov
14210 69 64 65 64 2c 20 74 68 65 6e 20 74 68 65 20 69  ided, then the i
14220 74 65 72 61 74 69 6f 6e 20 73 74 6f 70 73 20 61  teration stops a
14230 66 74 65 72 20 4c 49 4d 49 54 20 72 6f 77 73 0a  fter LIMIT rows.
14240 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 6f 75 74  ** have been out
14250 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20 20 41  put to pDest.  A
14260 20 4c 49 4d 49 54 20 6f 66 20 7a 65 72 6f 20 6d   LIMIT of zero m
14270 65 61 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 6e  eans to output n
14280 6f 20 72 6f 77 73 20 61 6e 64 20 61 0a 2a 2a 20  o rows and a.** 
14290 6e 65 67 61 74 69 76 65 20 4c 49 4d 49 54 20 6d  negative LIMIT m
142a0 65 61 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 61  eans to output a
142b0 6c 6c 20 72 6f 77 73 2e 20 20 49 66 20 74 68 65  ll rows.  If the
142c0 72 65 20 69 73 20 61 6c 73 6f 20 61 6e 20 4f 46  re is also an OF
142d0 46 53 45 54 20 63 6c 61 75 73 65 0a 2a 2a 20 77  FSET clause.** w
142e0 69 74 68 20 61 20 70 6f 73 69 74 69 76 65 20 76  ith a positive v
142f0 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 66  alue, then the f
14300 69 72 73 74 20 4f 46 46 53 45 54 20 6f 75 74 70  irst OFFSET outp
14310 75 74 73 20 61 72 65 20 64 69 73 63 61 72 64 65  uts are discarde
14320 64 20 72 61 74 68 65 72 0a 2a 2a 20 74 68 61 6e  d rather.** than
14330 20 62 65 69 6e 67 20 73 65 6e 74 20 74 6f 20 70   being sent to p
14340 44 65 73 74 2e 20 20 54 68 65 20 4c 49 4d 49 54  Dest.  The LIMIT
14350 20 63 6f 75 6e 74 20 64 6f 65 73 20 6e 6f 74 20   count does not 
14360 62 65 67 69 6e 20 75 6e 74 69 6c 20 61 66 74 65  begin until afte
14370 72 20 4f 46 46 53 45 54 0a 2a 2a 20 72 6f 77 73  r OFFSET.** rows
14380 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70   have been skipp
14390 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
143a0 69 64 20 67 65 6e 65 72 61 74 65 57 69 74 68 52  id generateWithR
143b0 65 63 75 72 73 69 76 65 51 75 65 72 79 28 0a 20  ecursiveQuery(. 
143c0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
143d0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
143e0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
143f0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
14400 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 75       /* The recu
14410 72 73 69 76 65 20 53 45 4c 45 43 54 20 74 6f 20  rsive SELECT to 
14420 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
14430 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
14440 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
14450 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
14460 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63  ults */.){.  Src
14470 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e  List *pSrc = p->
14480 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68  pSrc;      /* Th
14490 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
144a0 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 71   the recursive q
144b0 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  uery */.  int nC
144c0 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ol = p->pEList->
144d0 6e 45 78 70 72 3b 20 20 2f 2a 20 4e 75 6d 62 65  nExpr;  /* Numbe
144e0 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
144f0 74 68 65 20 72 65 63 75 72 73 69 76 65 20 74 61  the recursive ta
14500 62 6c 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ble */.  Vdbe *v
14510 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
14520 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72  ;      /* The pr
14530 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
14540 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
14550 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ion */.  Select 
14560 2a 70 53 65 74 75 70 20 3d 20 70 2d 3e 70 50 72  *pSetup = p->pPr
14570 69 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 73 65  ior;   /* The se
14580 74 75 70 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  tup query */.  i
14590 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20  nt addrTop;     
145a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
145b0 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  Top of the loop 
145c0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e  */.  int addrCon
145d0 74 2c 20 61 64 64 72 42 72 65 61 6b 3b 20 20 20  t, addrBreak;   
145e0 20 20 20 2f 2a 20 43 4f 4e 54 49 4e 55 45 20 61     /* CONTINUE a
145f0 6e 64 20 42 52 45 41 4b 20 61 64 64 72 65 73 73  nd BREAK address
14600 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  es */.  int iCur
14610 72 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20  rent = 0;       
14620 20 20 20 20 20 20 2f 2a 20 54 68 65 20 43 75 72        /* The Cur
14630 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  rent table */.  
14640 69 6e 74 20 72 65 67 43 75 72 72 65 6e 74 3b 20  int regCurrent; 
14650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14660 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
14670 67 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20  g Current table 
14680 2a 2f 0a 20 20 69 6e 74 20 69 51 75 65 75 65 3b  */.  int iQueue;
14690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146a0 20 20 20 2f 2a 20 54 68 65 20 51 75 65 75 65 20     /* The Queue 
146b0 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
146c0 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 20 20 20  Distinct = 0;   
146d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 65           /* To e
146e0 6e 73 75 72 65 20 75 6e 69 71 75 65 20 72 65 73  nsure unique res
146f0 75 6c 74 73 20 69 66 20 55 4e 49 4f 4e 20 2a 2f  ults if UNION */
14700 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 53  .  int eDest = S
14710 52 54 5f 46 69 66 6f 3b 20 20 20 20 20 20 20 20  RT_Fifo;        
14720 20 2f 2a 20 48 6f 77 20 74 6f 20 77 72 69 74 65   /* How to write
14730 20 74 6f 20 51 75 65 75 65 20 2a 2f 0a 20 20 53   to Queue */.  S
14740 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 51 75  electDest destQu
14750 65 75 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  eue;         /* 
14760 53 65 6c 65 63 74 44 65 73 74 20 74 61 72 67 65  SelectDest targe
14770 74 74 69 6e 67 20 74 68 65 20 51 75 65 75 65 20  tting the Queue 
14780 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
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 20 2f 2a 20 4c 6f 6f 70           /* Loop
147b0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
147c0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
147d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
147e0 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
147f0 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
14800 42 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  By;           /*
14810 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
14820 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
14830 70 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20  pLimit;         
14840 20 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64          /* Saved
14850 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
14860 54 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69  T */.  int regLi
14870 6d 69 74 2c 20 72 65 67 4f 66 66 73 65 74 3b 20  mit, regOffset; 
14880 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
14890 73 20 75 73 65 64 20 62 79 20 4c 49 4d 49 54 20  s used by LIMIT 
148a0 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 0a 20  and OFFSET */.. 
148b0 20 2f 2a 20 4f 62 74 61 69 6e 20 61 75 74 68 6f   /* Obtain autho
148c0 72 69 7a 61 74 69 6f 6e 20 74 6f 20 64 6f 20 61  rization to do a
148d0 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72 79   recursive query
148e0 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
148f0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
14900 65 2c 20 53 51 4c 49 54 45 5f 52 45 43 55 52 53  e, SQLITE_RECURS
14910 49 56 45 2c 20 30 2c 20 30 2c 20 30 29 20 29 20  IVE, 0, 0, 0) ) 
14920 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 50 72  return;..  /* Pr
14930 6f 63 65 73 73 20 74 68 65 20 4c 49 4d 49 54 20  ocess the LIMIT 
14940 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73  and OFFSET claus
14950 65 73 2c 20 69 66 20 74 68 65 79 20 65 78 69 73  es, if they exis
14960 74 20 2a 2f 0a 20 20 61 64 64 72 42 72 65 61 6b  t */.  addrBreak
14970 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
14980 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 2d  keLabel(v);.  p-
14990 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 33 32  >nSelectRow = 32
149a0 30 3b 20 20 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e  0;  /* 4 billion
149b0 20 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6d 70 75   rows */.  compu
149c0 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
149d0 28 70 50 61 72 73 65 2c 20 70 2c 20 61 64 64 72  (pParse, p, addr
149e0 42 72 65 61 6b 29 3b 0a 20 20 70 4c 69 6d 69 74  Break);.  pLimit
149f0 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
14a00 72 65 67 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c  regLimit = p->iL
14a10 69 6d 69 74 3b 0a 20 20 72 65 67 4f 66 66 73 65  imit;.  regOffse
14a20 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a  t = p->iOffset;.
14a30 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
14a40 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70  .  p->iLimit = p
14a50 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->iOffset = 0;. 
14a60 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
14a70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c  OrderBy;..  /* L
14a80 6f 63 61 74 65 20 74 68 65 20 63 75 72 73 6f 72  ocate the cursor
14a90 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 43   number of the C
14aa0 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a  urrent table */.
14ab0 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59    for(i=0; ALWAY
14ac0 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72 63 29 3b  S(i<pSrc->nSrc);
14ad0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
14ae0 53 72 63 2d 3e 61 5b 69 5d 2e 66 67 2e 69 73 52  Src->a[i].fg.isR
14af0 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
14b00 20 20 69 43 75 72 72 65 6e 74 20 3d 20 70 53 72    iCurrent = pSr
14b10 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b  c->a[i].iCursor;
14b20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14b30 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
14b40 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 6e  locate cursors n
14b50 75 6d 62 65 72 73 20 66 6f 72 20 51 75 65 75 65  umbers for Queue
14b60 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 20   and Distinct.  
14b70 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  The cursor numbe
14b80 72 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 44  r for.  ** the D
14b90 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6d 75  istinct table mu
14ba0 73 74 20 62 65 20 65 78 61 63 74 6c 79 20 6f 6e  st be exactly on
14bb0 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 51  e greater than Q
14bc0 75 65 75 65 20 69 6e 20 6f 72 64 65 72 0a 20 20  ueue in order.  
14bd0 2a 2a 20 66 6f 72 20 74 68 65 20 53 52 54 5f 44  ** for the SRT_D
14be0 69 73 74 46 69 66 6f 20 61 6e 64 20 53 52 54 5f  istFifo and SRT_
14bf0 44 69 73 74 51 75 65 75 65 20 64 65 73 74 69 6e  DistQueue destin
14c00 61 74 69 6f 6e 73 20 74 6f 20 77 6f 72 6b 2e 20  ations to work. 
14c10 2a 2f 0a 20 20 69 51 75 65 75 65 20 3d 20 70 50  */.  iQueue = pP
14c20 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
14c30 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  if( p->op==TK_UN
14c40 49 4f 4e 20 29 7b 0a 20 20 20 20 65 44 65 73 74  ION ){.    eDest
14c50 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52   = pOrderBy ? SR
14c60 54 5f 44 69 73 74 51 75 65 75 65 20 3a 20 53 52  T_DistQueue : SR
14c70 54 5f 44 69 73 74 46 69 66 6f 3b 0a 20 20 20 20  T_DistFifo;.    
14c80 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72  iDistinct = pPar
14c90 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65  se->nTab++;.  }e
14ca0 6c 73 65 7b 0a 20 20 20 20 65 44 65 73 74 20 3d  lse{.    eDest =
14cb0 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f   pOrderBy ? SRT_
14cc0 51 75 65 75 65 20 3a 20 53 52 54 5f 46 69 66 6f  Queue : SRT_Fifo
14cd0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
14ce0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
14cf0 65 73 74 51 75 65 75 65 2c 20 65 44 65 73 74 2c  estQueue, eDest,
14d00 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20   iQueue);..  /* 
14d10 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73  Allocate cursors
14d20 20 66 6f 72 20 43 75 72 72 65 6e 74 2c 20 51 75   for Current, Qu
14d30 65 75 65 2c 20 61 6e 64 20 44 69 73 74 69 6e 63  eue, and Distinc
14d40 74 2e 20 2a 2f 0a 20 20 72 65 67 43 75 72 72 65  t. */.  regCurre
14d50 6e 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  nt = ++pParse->n
14d60 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  Mem;.  sqlite3Vd
14d70 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
14d80 70 65 6e 50 73 65 75 64 6f 2c 20 69 43 75 72 72  penPseudo, iCurr
14d90 65 6e 74 2c 20 72 65 67 43 75 72 72 65 6e 74 2c  ent, regCurrent,
14da0 20 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 4f   nCol);.  if( pO
14db0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65  rderBy ){.    Ke
14dc0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
14dd0 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  = multiSelectOrd
14de0 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72  erByKeyInfo(pPar
14df0 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 20 20 73  se, p, 1);.    s
14e00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
14e10 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
14e20 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 70 4f  eral, iQueue, pO
14e30 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c  rderBy->nExpr+2,
14e40 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
14e50 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
14e60 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
14e70 59 49 4e 46 4f 29 3b 0a 20 20 20 20 64 65 73 74  YINFO);.    dest
14e80 51 75 65 75 65 2e 70 4f 72 64 65 72 42 79 20 3d  Queue.pOrderBy =
14e90 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c   pOrderBy;.  }el
14ea0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
14eb0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14ec0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
14ed0 51 75 65 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  Queue, nCol);.  
14ee0 7d 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  }.  VdbeComment(
14ef0 28 76 2c 20 22 51 75 65 75 65 20 74 61 62 6c 65  (v, "Queue table
14f00 22 29 29 3b 0a 20 20 69 66 28 20 69 44 69 73 74  "));.  if( iDist
14f10 69 6e 63 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61  inct ){.    p->a
14f20 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
14f30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14f40 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
14f50 65 6d 65 72 61 6c 2c 20 69 44 69 73 74 69 6e 63  emeral, iDistinc
14f60 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 73 65  t, 0);.    p->se
14f70 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
14f80 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a  sEphemeral;.  }.
14f90 0a 20 20 2f 2a 20 44 65 74 61 63 68 20 74 68 65  .  /* Detach the
14fa0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
14fb0 20 66 72 6f 6d 20 74 68 65 20 63 6f 6d 70 6f 75   from the compou
14fc0 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 70  nd SELECT */.  p
14fd0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
14fe0 0a 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20  .  /* Store the 
14ff0 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
15000 65 74 75 70 2d 71 75 65 72 79 20 69 6e 20 51 75  etup-query in Qu
15010 65 75 65 2e 20 2a 2f 0a 20 20 70 53 65 74 75 70  eue. */.  pSetup
15020 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 45  ->pNext = 0;.  E
15030 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
15040 28 70 50 61 72 73 65 2c 20 31 2c 20 22 53 45 54  (pParse, 1, "SET
15050 55 50 22 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  UP"));.  rc = sq
15060 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
15070 73 65 2c 20 70 53 65 74 75 70 2c 20 26 64 65 73  se, pSetup, &des
15080 74 51 75 65 75 65 29 3b 0a 20 20 70 53 65 74 75  tQueue);.  pSetu
15090 70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  p->pNext = p;.  
150a0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
150b0 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71  d_of_recursive_q
150c0 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64  uery;..  /* Find
150d0 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e   the next row in
150e0 20 74 68 65 20 51 75 65 75 65 20 61 6e 64 20 6f   the Queue and o
150f0 75 74 70 75 74 20 74 68 61 74 20 72 6f 77 20 2a  utput that row *
15100 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71  /.  addrTop = sq
15110 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15120 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 51  v, OP_Rewind, iQ
15130 75 65 75 65 2c 20 61 64 64 72 42 72 65 61 6b 29  ueue, addrBreak)
15140 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
15150 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65  );..  /* Transfe
15160 72 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69  r the next row i
15170 6e 20 51 75 65 75 65 20 6f 76 65 72 20 74 6f 20  n Queue over to 
15180 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 73 71 6c  Current */.  sql
15190 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
151a0 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43  , OP_NullRow, iC
151b0 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54 6f 20 72  urrent); /* To r
151c0 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68  eset column cach
151d0 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65  e */.  if( pOrde
151e0 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
151f0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
15200 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75 65 75  OP_Column, iQueu
15210 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  e, pOrderBy->nEx
15220 70 72 2b 31 2c 20 72 65 67 43 75 72 72 65 6e 74  pr+1, regCurrent
15230 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
15240 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15250 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c  2(v, OP_RowData,
15260 20 69 51 75 65 75 65 2c 20 72 65 67 43 75 72 72   iQueue, regCurr
15270 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ent);.  }.  sqli
15280 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
15290 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 51 75 65   OP_Delete, iQue
152a0 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75  ue);..  /* Outpu
152b0 74 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77  t the single row
152c0 20 69 6e 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20   in Current */. 
152d0 20 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69   addrCont = sqli
152e0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
152f0 28 76 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65  (v);.  codeOffse
15300 74 28 76 2c 20 72 65 67 4f 66 66 73 65 74 2c 20  t(v, regOffset, 
15310 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c  addrCont);.  sel
15320 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
15330 72 73 65 2c 20 70 2c 20 69 43 75 72 72 65 6e 74  rse, p, iCurrent
15340 2c 0a 20 20 20 20 20 20 30 2c 20 30 2c 20 70 44  ,.      0, 0, pD
15350 65 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61  est, addrCont, a
15360 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28  ddrBreak);.  if(
15370 20 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20   regLimit ){.   
15380 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15390 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d  p2(v, OP_DecrJum
153a0 70 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c  pZero, regLimit,
153b0 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20   addrBreak);.   
153c0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
153d0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
153e0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
153f0 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a 20  v, addrCont);.. 
15400 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20   /* Execute the 
15410 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43 54  recursive SELECT
15420 20 74 61 6b 69 6e 67 20 74 68 65 20 73 69 6e 67   taking the sing
15430 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e  le row in Curren
15440 74 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76 61  t as.  ** the va
15450 6c 75 65 20 66 6f 72 20 74 68 65 20 72 65 63 75  lue for the recu
15460 72 73 69 76 65 2d 74 61 62 6c 65 2e 20 53 74 6f  rsive-table. Sto
15470 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
15480 6e 20 74 68 65 20 51 75 65 75 65 2e 0a 20 20 2a  n the Queue..  *
15490 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
154a0 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
154b0 74 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  te ){.    sqlite
154c0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
154d0 2c 20 22 72 65 63 75 72 73 69 76 65 20 61 67 67  , "recursive agg
154e0 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 6e  regate queries n
154f0 6f 74 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a  ot supported");.
15500 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
15510 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
15520 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
15530 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 52 45  ((pParse, 1, "RE
15540 43 55 52 53 49 56 45 20 53 54 45 50 22 29 29 3b  CURSIVE STEP"));
15550 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
15560 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ct(pParse, p, &d
15570 65 73 74 51 75 65 75 65 29 3b 0a 20 20 20 20 61  estQueue);.    a
15580 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72  ssert( p->pPrior
15590 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 50  ==0 );.    p->pP
155a0 72 69 6f 72 20 3d 20 70 53 65 74 75 70 3b 0a 20  rior = pSetup;. 
155b0 20 7d 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 72 75   }..  /* Keep ru
155c0 6e 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 70 20 75  nning the loop u
155d0 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 69  ntil the Queue i
155e0 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 73 71 6c  s empty */.  sql
155f0 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
15600 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69  addrTop);.  sqli
15610 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
15620 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b  bel(v, addrBreak
15630 29 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63 75 72  );..end_of_recur
15640 73 69 76 65 5f 71 75 65 72 79 3a 0a 20 20 73 71  sive_query:.  sq
15650 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
15660 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
15670 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
15680 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
15690 72 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69  rderBy;.  p->pLi
156a0 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
156b0 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66  return;.}.#endif
156c0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
156d0 43 54 45 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61  CTE */../* Forwa
156e0 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f  rd references */
156f0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
15700 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a  iSelectOrderBy(.
15710 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
15720 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
15730 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
15740 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
15750 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
15760 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43  ht-most of SELEC
15770 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  Ts to be coded *
15780 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
15790 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
157a0 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
157b0 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b  ry results */.);
157c0 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 20 74  ../*.** Handle t
157d0 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  he special case 
157e0 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65  of a compound-se
157f0 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67 69 6e  lect that origin
15800 61 74 65 73 20 66 72 6f 6d 20 61 0a 2a 2a 20 56  ates from a.** V
15810 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 20 20 42  ALUES clause.  B
15820 79 20 68 61 6e 64 6c 69 6e 67 20 74 68 69 73 20  y handling this 
15830 61 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73  as a special cas
15840 65 2c 20 77 65 20 61 76 6f 69 64 20 64 65 65 70  e, we avoid deep
15850 0a 2a 2a 20 72 65 63 75 72 73 69 6f 6e 2c 20 61  .** recursion, a
15860 6e 64 20 74 68 75 73 20 64 6f 20 6e 6f 74 20 6e  nd thus do not n
15870 65 65 64 20 74 6f 20 65 6e 66 6f 72 63 65 20 74  eed to enforce t
15880 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  he SQLITE_LIMIT_
15890 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
158a0 2a 2a 20 6f 6e 20 61 20 56 41 4c 55 45 53 20 63  ** on a VALUES c
158b0 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 63  lause..**.** Bec
158c0 61 75 73 65 20 74 68 65 20 53 65 6c 65 63 74 20  ause the Select 
158d0 6f 62 6a 65 63 74 20 6f 72 69 67 69 6e 61 74 65  object originate
158e0 73 20 66 72 6f 6d 20 61 20 56 41 4c 55 45 53 20  s from a VALUES 
158f0 63 6c 61 75 73 65 3a 0a 2a 2a 20 20 20 28 31 29  clause:.**   (1)
15900 20 54 68 65 72 65 20 69 73 20 6e 6f 20 4c 49 4d   There is no LIM
15910 49 54 20 6f 72 20 4f 46 46 53 45 54 20 6f 72 20  IT or OFFSET or 
15920 65 6c 73 65 20 74 68 65 72 65 20 69 73 20 61 20  else there is a 
15930 4c 49 4d 49 54 20 6f 66 20 65 78 61 63 74 6c 79  LIMIT of exactly
15940 20 31 0a 2a 2a 20 20 20 28 32 29 20 41 6c 6c 20   1.**   (2) All 
15950 74 65 72 6d 73 20 61 72 65 20 55 4e 49 4f 4e 20  terms are UNION 
15960 41 4c 4c 0a 2a 2a 20 20 20 28 33 29 20 54 68 65  ALL.**   (3) The
15970 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
15980 59 20 63 6c 61 75 73 65 0a 2a 2a 0a 2a 2a 20 54  Y clause.**.** T
15990 68 65 20 22 4c 49 4d 49 54 20 6f 66 20 65 78 61  he "LIMIT of exa
159a0 63 74 6c 79 20 31 22 20 63 61 73 65 20 6f 66 20  ctly 1" case of 
159b0 63 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20 63 6f  condition (1) co
159c0 6d 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20 61  mes about when a
159d0 20 56 41 4c 55 45 53 0a 2a 2a 20 63 6c 61 75 73   VALUES.** claus
159e0 65 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  e occurs within 
159f0 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f  scalar expressio
15a00 6e 20 28 65 78 3a 20 22 53 45 4c 45 43 54 20 28  n (ex: "SELECT (
15a10 56 41 4c 55 45 53 28 31 29 2c 28 32 29 2c 28 33  VALUES(1),(2),(3
15a20 29 29 22 29 2e 0a 2a 2a 20 54 68 65 20 73 71 6c  ))")..** The sql
15a30 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
15a40 74 20 77 69 6c 6c 20 68 61 76 65 20 61 64 64 65  t will have adde
15a50 64 20 74 68 65 20 4c 49 4d 49 54 20 31 20 63 6c  d the LIMIT 1 cl
15a60 61 75 73 65 20 69 6e 20 74 68 74 20 63 61 73 65  ause in tht case
15a70 2e 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 6c  ..** Since the l
15a80 69 6d 69 74 20 69 73 20 65 78 61 63 74 6c 79 20  imit is exactly 
15a90 31 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20  1, we only need 
15aa0 74 6f 20 65 76 61 6c 75 74 65 73 20 74 68 65 20  to evalutes the 
15ab0 6c 65 66 74 2d 6d 6f 73 74 20 56 41 4c 55 45 53  left-most VALUES
15ac0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15ad0 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75 65  multiSelectValue
15ae0 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
15af0 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
15b00 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
15b10 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
15b20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
15b30 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
15b40 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
15b50 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
15b60 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
15b70 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
15b80 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
15b90 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 20 3d  .){.  int nRow =
15ba0 20 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30   1;.  int rc = 0
15bb0 3b 0a 20 20 69 6e 74 20 62 53 68 6f 77 41 6c 6c  ;.  int bShowAll
15bc0 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 3b   = p->pLimit==0;
15bd0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65  .  assert( p->se
15be0 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74  lFlags & SF_Mult
15bf0 69 56 61 6c 75 65 20 29 3b 0a 20 20 64 6f 7b 0a  iValue );.  do{.
15c00 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73      assert( p->s
15c10 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c  elFlags & SF_Val
15c20 75 65 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ues );.    asser
15c30 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  t( p->op==TK_ALL
15c40 20 7c 7c 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 53   || (p->op==TK_S
15c50 45 4c 45 43 54 20 26 26 20 70 2d 3e 70 50 72 69  ELECT && p->pPri
15c60 6f 72 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73  or==0) );.    as
15c70 73 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d  sert( p->pNext==
15c80 30 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  0 || p->pEList->
15c90 6e 45 78 70 72 3d 3d 70 2d 3e 70 4e 65 78 74 2d  nExpr==p->pNext-
15ca0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
15cb0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50 72  ;.    if( p->pPr
15cc0 69 6f 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ior==0 ) break;.
15cd0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
15ce0 50 72 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70 20  Prior->pNext==p 
15cf0 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50  );.    p = p->pP
15d00 72 69 6f 72 3b 0a 20 20 20 20 6e 52 6f 77 20 2b  rior;.    nRow +
15d10 3d 20 62 53 68 6f 77 41 6c 6c 3b 0a 20 20 7d 77  = bShowAll;.  }w
15d20 68 69 6c 65 28 31 29 3b 0a 20 20 45 78 70 6c 61  hile(1);.  Expla
15d30 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
15d40 72 73 65 2c 20 30 2c 20 22 53 43 41 4e 20 25 64  rse, 0, "SCAN %d
15d50 20 43 4f 4e 53 54 41 4e 54 20 52 4f 57 25 73 22   CONSTANT ROW%s"
15d60 2c 20 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20  , nRow,.        
15d70 20 20 20 20 20 20 20 20 20 20 20 20 6e 52 6f 77              nRow
15d80 3d 3d 31 20 3f 20 22 22 20 3a 20 22 53 22 29 29  ==1 ? "" : "S"))
15d90 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
15da0 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
15db0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d  oop(pParse, p, -
15dc0 31 2c 20 30 2c 20 30 2c 20 70 44 65 73 74 2c 20  1, 0, 0, pDest, 
15dd0 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21  1, 1);.    if( !
15de0 62 53 68 6f 77 41 6c 6c 20 29 20 62 72 65 61 6b  bShowAll ) break
15df0 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74  ;.    p->nSelect
15e00 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20  Row = nRow;.    
15e10 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
15e20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
15e30 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
15e40 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
15e50 6f 20 70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70  o process a comp
15e60 6f 75 6e 64 20 71 75 65 72 79 20 66 6f 72 6d 20  ound query form 
15e70 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d  from.** two or m
15e80 6f 72 65 20 73 65 70 61 72 61 74 65 20 71 75 65  ore separate que
15e90 72 69 65 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e  ries using UNION
15ea0 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43  , UNION ALL, EXC
15eb0 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52  EPT, or.** INTER
15ec0 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70  SECT.**.** "p" p
15ed0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67  oints to the rig
15ee0 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74  ht-most of the t
15ef0 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68 65  wo queries.  the
15f00 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a   query on the.**
15f10 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69   left is p->pPri
15f20 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75  or.  The left qu
15f30 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62  ery could also b
15f40 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  e a compound que
15f50 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63  ry.** in which c
15f60 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ase this routine
15f70 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
15f80 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a  recursively. .**
15f90 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
15fa0 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65  of the total que
15fb0 72 79 20 61 72 65 20 74 6f 20 62 65 20 77 72 69  ry are to be wri
15fc0 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74  tten into a dest
15fd0 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79  ination.** of ty
15fe0 70 65 20 65 44 65 73 74 20 77 69 74 68 20 70 61  pe eDest with pa
15ff0 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a  rameter iParm..*
16000 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20  *.** Example 1: 
16010 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65   Consider a thre
16020 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53  e-way compound S
16030 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  QL statement..**
16040 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61  .**     SELECT a
16050 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53   FROM t1 UNION S
16060 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20  ELECT b FROM t2 
16070 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46  UNION SELECT c F
16080 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69  ROM t3.**.** Thi
16090 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  s statement is p
160a0 61 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c  arsed up as foll
160b0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ows:.**.**     S
160c0 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
160d0 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20  **      |.**    
160e0 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43    `----->  SELEC
160f0 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20  T b FROM t2.**  
16100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
16110 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
16120 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45    `------>  SELE
16130 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a  CT a FROM t1.**.
16140 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e  ** The arrows in
16150 20 74 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f   the diagram abo
16160 76 65 20 72 65 70 72 65 73 65 6e 74 20 74 68 65  ve represent the
16170 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70   Select.pPrior p
16180 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66  ointer..** So if
16190 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
161a0 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65   called with p e
161b0 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71  qual to the t3 q
161c0 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50  uery, then.** pP
161d0 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65  rior will be the
161e0 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f   t2 query.  p->o
161f0 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49  p will be TK_UNI
16200 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ON in this case.
16210 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68  .**.** Notice th
16220 61 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68  at because of th
16230 65 20 77 61 79 20 53 51 4c 69 74 65 20 70 61 72  e way SQLite par
16240 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  ses compound SEL
16250 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64  ECTs, the.** ind
16260 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20  ividual selects 
16270 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f  always group fro
16280 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e  m left to right.
16290 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
162a0 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61  ultiSelect(.  Pa
162b0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
162c0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
162d0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
162e0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
162f0 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
16300 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
16310 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
16320 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
16330 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
16340 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
16350 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
16360 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
16370 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20  K;   /* Success 
16380 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72  code from a subr
16390 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65  outine */.  Sele
163a0 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20  ct *pPrior;     
163b0 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c    /* Another SEL
163c0 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ECT immediately 
163d0 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20  to our left */. 
163e0 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
163f0 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
16400 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20  te code to this 
16410 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74  VDBE */.  Select
16420 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20  Dest dest;      
16430 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64  /* Alternative d
16440 61 74 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ata destination 
16450 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 44 65  */.  Select *pDe
16460 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68  lete = 0;  /* Ch
16470 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73 65  ain of simple se
16480 6c 65 63 74 73 20 74 6f 20 64 65 6c 65 74 65 20  lects to delete 
16490 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
164a0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ;          /* Da
164b0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
164c0 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  n */..  /* Make 
164d0 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
164e0 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
164f0 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69  IT clause on pri
16500 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c  or SELECTs.  Onl
16510 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20  y.  ** the last 
16520 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c  (right-most) SEL
16530 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65  ECT in the serie
16540 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52  s may have an OR
16550 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e  DER BY or LIMIT.
16560 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
16570 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29  p && p->pPrior )
16580 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75  ;  /* Calling fu
16590 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65  nction guarantee
165a0 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20  s this much */. 
165b0 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c   assert( (p->sel
165c0 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
165d0 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f  sive)==0 || p->o
165e0 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e  p==TK_ALL || p->
165f0 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
16600 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
16610 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d  b;.  pPrior = p-
16620 3e 70 50 72 69 6f 72 3b 0a 20 20 64 65 73 74 20  >pPrior;.  dest 
16630 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20  = *pDest;.  if( 
16640 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
16650 20 7c 7c 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d   || pPrior->pLim
16660 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
16670 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
16680 2c 22 25 73 20 63 6c 61 75 73 65 20 73 68 6f 75  ,"%s clause shou
16690 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
166a0 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
166b0 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64      pPrior->pOrd
166c0 65 72 42 79 21 3d 30 20 3f 20 22 4f 52 44 45 52  erBy!=0 ? "ORDER
166d0 20 42 59 22 20 3a 20 22 4c 49 4d 49 54 22 2c 20   BY" : "LIMIT", 
166e0 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
166f0 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
16700 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
16710 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
16720 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
16730 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
16740 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
16750 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61  ;  /* The VDBE a
16760 6c 72 65 61 64 79 20 63 72 65 61 74 65 64 20 62  lready created b
16770 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  y calling functi
16780 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61  on */..  /* Crea
16790 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  te the destinati
167a0 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  on temporary tab
167b0 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a  le if necessary.
167c0 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e    */.  if( dest.
167d0 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d  eDest==SRT_Ephem
167e0 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Tab ){.    asser
167f0 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
16800 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16810 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
16820 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e  Ephemeral, dest.
16830 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69  iSDParm, p->pELi
16840 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
16850 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
16860 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f  _Table;.  }..  /
16870 2a 20 53 70 65 63 69 61 6c 20 68 61 6e 64 6c 69  * Special handli
16880 6e 67 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e  ng for a compoun
16890 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72  d-select that or
168a0 69 67 69 6e 61 74 65 73 20 61 73 20 61 20 56 41  iginates as a VA
168b0 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 20 20 2a  LUES clause..  *
168c0 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
168d0 61 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61  ags & SF_MultiVa
168e0 6c 75 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lue ){.    rc = 
168f0 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75 65  multiSelectValue
16900 73 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  s(pParse, p, &de
16910 73 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  st);.    goto mu
16920 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
16930 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
16940 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20  ure all SELECTs 
16950 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
16960 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
16970 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
16980 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20  s.  ** in their 
16990 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a  result sets..  *
169a0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  /.  assert( p->p
169b0 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d  EList && pPrior-
169c0 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 61 73 73  >pEList );.  ass
169d0 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ert( p->pEList->
169e0 6e 45 78 70 72 3d 3d 70 50 72 69 6f 72 2d 3e 70  nExpr==pPrior->p
169f0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
16a00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16a10 4f 4d 49 54 5f 43 54 45 0a 20 20 69 66 28 20 70  OMIT_CTE.  if( p
16a20 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
16a30 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
16a40 20 67 65 6e 65 72 61 74 65 57 69 74 68 52 65 63   generateWithRec
16a50 75 72 73 69 76 65 51 75 65 72 79 28 70 50 61 72  ursiveQuery(pPar
16a60 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20  se, p, &dest);. 
16a70 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
16a80 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c   /* Compound SEL
16a90 45 43 54 73 20 74 68 61 74 20 68 61 76 65 20 61  ECTs that have a
16aa0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
16ab0 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65  e are handled se
16ac0 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  parately..  */. 
16ad0 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
16ae0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d   ){.    return m
16af0 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
16b00 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65  y(pParse, p, pDe
16b10 73 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 23  st);.  }else{..#
16b20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16b30 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20 20 69  IT_EXPLAIN.    i
16b40 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f  f( pPrior->pPrio
16b50 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  r==0 ){.      Ex
16b60 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28  plainQueryPlan((
16b70 70 50 61 72 73 65 2c 20 31 2c 20 22 43 4f 4d 50  pParse, 1, "COMP
16b80 4f 55 4e 44 20 51 55 45 52 59 22 29 29 3b 0a 20  OUND QUERY"));. 
16b90 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72       ExplainQuer
16ba0 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31  yPlan((pParse, 1
16bb0 2c 20 22 4c 45 46 54 2d 4d 4f 53 54 20 53 55 42  , "LEFT-MOST SUB
16bc0 51 55 45 52 59 22 29 29 3b 0a 20 20 20 20 7d 0a  QUERY"));.    }.
16bd0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 47  #endif..    /* G
16be0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
16bf0 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
16c00 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ght SELECT state
16c10 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ments..    */.  
16c20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
16c30 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b  ){.      case TK
16c40 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20  _ALL: {.        
16c50 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20  int addr = 0;.  
16c60 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74        int nLimit
16c70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
16c80 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  ( !pPrior->pLimi
16c90 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 72  t );.        pPr
16ca0 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d  ior->iLimit = p-
16cb0 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20  >iLimit;.       
16cc0 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74   pPrior->iOffset
16cd0 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20   = p->iOffset;. 
16ce0 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70         pPrior->p
16cf0 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
16d00 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
16d10 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
16d20 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64  arse, pPrior, &d
16d30 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  est);.        p-
16d40 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
16d50 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
16d60 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75           goto mu
16d70 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
16d80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16d90 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
16da0 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d  .        p->iLim
16db0 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69  it = pPrior->iLi
16dc0 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  mit;.        p->
16dd0 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72  iOffset = pPrior
16de0 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->iOffset;.     
16df0 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74     if( p->iLimit
16e00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64   ){.          ad
16e10 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
16e20 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
16e30 6f 74 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 20  ot, p->iLimit); 
16e40 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
16e50 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
16e60 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70  omment((v, "Jump
16e70 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20   ahead if LIMIT 
16e80 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20  reached"));.    
16e90 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4f 66        if( p->iOf
16ea0 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  fset ){.        
16eb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16ec0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73  ddOp3(v, OP_Offs
16ed0 65 74 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20  etLimit,.       
16ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ef0 20 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74         p->iLimit
16f00 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 2c 20  , p->iOffset+1, 
16f10 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  p->iOffset);.   
16f20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16f30 20 7d 0a 20 20 20 20 20 20 20 20 45 78 70 6c 61   }.        Expla
16f40 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
16f50 72 73 65 2c 20 31 2c 20 22 55 4e 49 4f 4e 20 41  rse, 1, "UNION A
16f60 4c 4c 22 29 29 3b 0a 20 20 20 20 20 20 20 20 72  LL"));.        r
16f70 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
16f80 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  t(pParse, p, &de
16f90 73 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  st);.        tes
16fa0 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
16fb0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  E_OK );.        
16fc0 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72  pDelete = p->pPr
16fd0 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ior;.        p->
16fe0 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
16ff0 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  .        p->nSel
17000 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
17010 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65  LogEstAdd(p->nSe
17020 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d  lectRow, pPrior-
17030 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20  >nSelectRow);.  
17040 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72        if( pPrior
17050 2d 3e 70 4c 69 6d 69 74 0a 20 20 20 20 20 20 20  ->pLimit.       
17060 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
17070 49 73 49 6e 74 65 67 65 72 28 70 50 72 69 6f 72  IsInteger(pPrior
17080 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c  ->pLimit->pLeft,
17090 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20 20   &nLimit).      
170a0 20 20 20 26 26 20 6e 4c 69 6d 69 74 3e 30 20 26     && nLimit>0 &
170b0 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  & p->nSelectRow 
170c0 3e 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  > sqlite3LogEst(
170d0 28 75 36 34 29 6e 4c 69 6d 69 74 29 20 0a 20 20  (u64)nLimit) .  
170e0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
170f0 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
17100 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
17110 28 28 75 36 34 29 6e 4c 69 6d 69 74 29 3b 0a 20  ((u64)nLimit);. 
17120 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17130 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20   if( addr ){.   
17140 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17150 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
17160 64 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  dr);.        }. 
17170 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
17180 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
17190 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20   TK_EXCEPT:.    
171a0 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a    case TK_UNION:
171b0 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 75   {.        int u
171c0 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43  nionTab;    /* C
171d0 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
171e0 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 68  the temp table h
171f0 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f  olding result */
17200 0a 20 20 20 20 20 20 20 20 75 38 20 6f 70 20 3d  .        u8 op =
17210 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65   0;       /* One
17220 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65   of the SRT_ ope
17230 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79  rations to apply
17240 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20   to self */.    
17250 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b      int priorOp;
17260 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f       /* The SRT_
17270 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70   operation to ap
17280 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c  ply to prior sel
17290 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ects */.        
172a0 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20  Expr *pLimit;   
172b0 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73   /* Saved values
172c0 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 20 2a   of p->nLimit  *
172d0 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  /.        int ad
172e0 64 72 3b 0a 20 20 20 20 20 20 20 20 53 65 6c 65  dr;.        Sele
172f0 63 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74  ctDest uniondest
17300 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 74 65 73  ;.  .        tes
17310 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
17320 5f 45 58 43 45 50 54 20 29 3b 0a 20 20 20 20 20  _EXCEPT );.     
17330 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
17340 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
17350 20 20 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20          priorOp 
17360 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20  = SRT_Union;.   
17370 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
17380 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 29 7b 0a  est==priorOp ){.
17390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
173a0 63 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70  can reuse a temp
173b0 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65  orary table gene
173c0 72 61 74 65 64 20 62 79 20 61 20 53 45 4c 45 43  rated by a SELEC
173d0 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20  T to our.       
173e0 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20     ** right..   
173f0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
17400 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
17410 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20 20  Limit==0 );     
17420 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20   /* Not allowed 
17430 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d  on leftward elem
17440 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ents */.        
17450 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73    unionTab = des
17460 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20  t.iSDParm;.     
17470 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17480 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e      /* We will n
17490 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75  eed to create ou
174a0 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20  r own temporary 
174b0 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68  table to hold th
174c0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  e.          ** i
174d0 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
174e0 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  lts..          *
174f0 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69 6f  /.          unio
17500 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nTab = pParse->n
17510 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Tab++;.         
17520 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
17530 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  erBy==0 );.     
17540 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
17550 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17560 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
17570 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  l, unionTab, 0);
17580 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
17590 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
175a0 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[0] == -1 );. 
175b0 20 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72           p->addr
175c0 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64  OpenEphm[0] = ad
175d0 64 72 3b 0a 20 20 20 20 20 20 20 20 20 20 66 69  dr;.          fi
175e0 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e  ndRightmost(p)->
175f0 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55  selFlags |= SF_U
17600 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
17610 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17620 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
17630 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
17640 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
17650 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
17660 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20  to our left.    
17670 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
17680 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e  ssert( !pPrior->
17690 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20  pOrderBy );.    
176a0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
176b0 74 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e  tDestInit(&union
176c0 64 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75  dest, priorOp, u
176d0 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20  nionTab);.      
176e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
176f0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
17700 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29  ior, &uniondest)
17710 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
17720 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
17730 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
17740 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
17750 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64   .        /* Cod
17760 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45  e the current SE
17770 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20  LECT statement. 
17780 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
17790 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
177a0 45 58 43 45 50 54 20 29 7b 0a 20 20 20 20 20 20  EXCEPT ){.      
177b0 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63      op = SRT_Exc
177c0 65 70 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ept;.        }el
177d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
177e0 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  sert( p->op==TK_
177f0 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20  UNION );.       
17800 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f     op = SRT_Unio
17810 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
17820 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
17830 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 6d   0;.        pLim
17840 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
17850 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69          p->pLimi
17860 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75  t = 0;.        u
17870 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d  niondest.eDest =
17880 20 6f 70 3b 0a 20 20 20 20 20 20 20 20 45 78 70   op;.        Exp
17890 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70  lainQueryPlan((p
178a0 50 61 72 73 65 2c 20 31 2c 20 22 25 73 20 55 53  Parse, 1, "%s US
178b0 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45 22  ING TEMP B-TREE"
178c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
178d0 20 20 20 20 20 20 20 20 20 20 20 20 73 65 6c 65              sele
178e0 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
178f0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
17900 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
17910 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64  arse, p, &uniond
17920 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65  est);.        te
17930 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
17940 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20  TE_OK );.       
17950 20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65   /* Query flatte
17960 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53  ning in sqlite3S
17970 65 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72 65  elect() might re
17980 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79  fill p->pOrderBy
17990 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 42 65 20  ..        ** Be 
179a0 73 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70  sure to delete p
179b0 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72  ->pOrderBy, ther
179c0 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20  efore, to avoid 
179d0 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a  a memory leak. *
179e0 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
179f0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
17a00 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  db, p->pOrderBy)
17a10 3b 0a 20 20 20 20 20 20 20 20 70 44 65 6c 65 74  ;.        pDelet
17a20 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  e = p->pPrior;. 
17a30 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
17a40 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
17a50 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
17a60 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
17a70 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
17a80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
17a90 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c  nSelectRow = sql
17aa0 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d  ite3LogEstAdd(p-
17ab0 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72  >nSelectRow, pPr
17ac0 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29  ior->nSelectRow)
17ad0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
17ae0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
17af0 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
17b00 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  mit);.        p-
17b10 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
17b20 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69  ;.        p->iLi
17b30 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  mit = 0;.       
17b40 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
17b50 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  .  .        /* C
17b60 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20  onvert the data 
17b70 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
17b80 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74   table into what
17b90 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20  ever form.      
17ba0 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20    ** it is that 
17bb0 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65  we currently nee
17bc0 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
17bd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e        assert( un
17be0 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53 44  ionTab==dest.iSD
17bf0 50 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65  Parm || dest.eDe
17c00 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20  st!=priorOp );. 
17c10 20 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e         if( dest.
17c20 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29  eDest!=priorOp )
17c30 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
17c40 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
17c50 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 20  Start;.         
17c60 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
17c70 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  st );.          
17c80 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
17c90 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
17ca0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e  ;.          iCon
17cb0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
17cc0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
17cd0 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69         computeLi
17ce0 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
17cf0 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b  rse, p, iBreak);
17d00 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
17d10 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17d20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e  OP_Rewind, union
17d30 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  Tab, iBreak); Vd
17d40 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
17d50 20 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20           iStart 
17d60 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
17d70 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
17d80 20 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e         selectInn
17d90 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
17da0 2c 20 75 6e 69 6f 6e 54 61 62 2c 0a 20 20 20 20  , unionTab,.    
17db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17dc0 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73        0, 0, &des
17dd0 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  t, iCont, iBreak
17de0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
17df0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
17e00 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
17e10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17e20 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17e30 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62  P_Next, unionTab
17e40 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62 65 43  , iStart); VdbeC
17e50 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
17e60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17e70 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
17e80 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
17e90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17ea0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
17eb0 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  e, unionTab, 0);
17ec0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17ed0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
17ee0 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  }.      default:
17ef0 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
17f00 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b 20  TK_INTERSECT ); 
17f10 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61  {.        int ta
17f20 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20  b1, tab2;.      
17f30 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
17f40 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
17f50 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
17f60 74 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  t;.        int a
17f70 64 64 72 3b 0a 20 20 20 20 20 20 20 20 53 65 6c  ddr;.        Sel
17f80 65 63 74 44 65 73 74 20 69 6e 74 65 72 73 65 63  ectDest intersec
17f90 74 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20 69  tdest;.        i
17fa0 6e 74 20 72 31 3b 0a 20 20 0a 20 20 20 20 20 20  nt r1;.  .      
17fb0 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69    /* INTERSECT i
17fc0 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  s different from
17fd0 20 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63   the others sinc
17fe0 65 20 69 74 20 72 65 71 75 69 72 65 73 0a 20 20  e it requires.  
17ff0 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d        ** two tem
18000 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20  porary tables.  
18010 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73  Hence it has its
18020 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69   own case.  Begi
18030 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20  n.        ** by 
18040 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74  allocating the t
18050 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65  ables we will ne
18060 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
18070 20 20 20 20 20 20 20 74 61 62 31 20 3d 20 70 50         tab1 = pP
18080 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
18090 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61        tab2 = pPa
180a0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
180b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
180c0 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
180d0 20 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d   .        addr =
180e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
180f0 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
18100 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29  emeral, tab1, 0)
18110 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
18120 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
18130 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[0] == -1 );.  
18140 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
18150 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b  nEphm[0] = addr;
18160 0a 20 20 20 20 20 20 20 20 66 69 6e 64 52 69 67  .        findRig
18170 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c  htmost(p)->selFl
18180 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
18190 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20  hemeral;.       
181a0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
181b0 73 74 20 29 3b 0a 20 20 0a 20 20 20 20 20 20 20  st );.  .       
181c0 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
181d0 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ECTs to our left
181e0 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
181f0 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20  table "tab1"..  
18200 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
18210 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
18220 73 74 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63  stInit(&intersec
18230 74 64 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e  tdest, SRT_Union
18240 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20 20 20  , tab1);.       
18250 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
18260 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
18270 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65  or, &intersectde
18280 73 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  st);.        if(
18290 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
182a0 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
182b0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
182c0 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  }.  .        /* 
182d0 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74  Code the current
182e0 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d   SELECT into tem
182f0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61  porary table "ta
18300 62 32 22 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  b2".        */. 
18310 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
18320 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18330 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
18340 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ral, tab2, 0);. 
18350 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
18360 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
18370 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
18380 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
18390 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[1] = addr;.  
183a0 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
183b0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4c 69  = 0;.        pLi
183c0 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
183d0 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  .        p->pLim
183e0 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  it = 0;.        
183f0 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69 53  intersectdest.iS
18400 44 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20  DParm = tab2;.  
18410 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65        ExplainQue
18420 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
18430 31 2c 20 22 25 73 20 55 53 49 4e 47 20 54 45 4d  1, "%s USING TEM
18440 50 20 42 2d 54 52 45 45 22 2c 0a 20 20 20 20 20  P B-TREE",.     
18450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18460 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
18470 65 28 70 2d 3e 6f 70 29 29 29 3b 0a 20 20 20 20  e(p->op)));.    
18480 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18490 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
184a0 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  , &intersectdest
184b0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
184c0 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
184d0 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44  OK );.        pD
184e0 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
184f0 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50  r;.        p->pP
18500 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
18510 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53         if( p->nS
18520 65 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d  electRow>pPrior-
18530 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20  >nSelectRow ){. 
18540 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c           p->nSel
18550 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d  ectRow = pPrior-
18560 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
18570 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
18580 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
18590 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
185a0 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  .        p->pLim
185b0 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 0a  it = pLimit;.  .
185c0 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
185d0 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65  ate code to take
185e0 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f   the intersectio
185f0 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d  n of the two tem
18600 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a  porary.        *
18610 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20  * tables..      
18620 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
18630 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
18640 3b 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b  ;.        iBreak
18650 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
18660 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
18670 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
18680 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
18690 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d  (v);.        com
186a0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
186b0 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42  rs(pParse, p, iB
186c0 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
186d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
186e0 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74  (v, OP_Rewind, t
186f0 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  ab1, iBreak); Vd
18700 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
18710 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
18720 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
18730 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  arse);.        i
18740 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
18750 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18760 52 6f 77 44 61 74 61 2c 20 74 61 62 31 2c 20 72  RowData, tab1, r
18770 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
18780 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
18790 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
187a0 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31   tab2, iCont, r1
187b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64  , 0);.        Vd
187c0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
187d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
187e0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
187f0 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
18800 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
18810 70 28 70 50 61 72 73 65 2c 20 70 2c 20 74 61 62  p(pParse, p, tab
18820 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
18830 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
18840 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69   &dest, iCont, i
18850 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
18860 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
18870 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
18880 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
18890 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
188a0 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69  OP_Next, tab1, i
188b0 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65  Start); VdbeCove
188c0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
188d0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
188e0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
188f0 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
18900 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18910 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32  , OP_Close, tab2
18920 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
18930 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18940 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
18950 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62  1, 0);.        b
18960 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
18970 20 20 7d 0a 20 20 0a 20 20 23 69 66 6e 64 65 66    }.  .  #ifndef
18980 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
18990 4c 41 49 4e 0a 20 20 20 20 69 66 28 20 70 2d 3e  LAIN.    if( p->
189a0 70 4e 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pNext==0 ){.    
189b0 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
189c0 61 6e 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  anPop(pParse);. 
189d0 20 20 20 7d 0a 20 20 23 65 6e 64 69 66 0a 20 20     }.  #endif.  
189e0 7d 0a 20 20 0a 20 20 2f 2a 20 43 6f 6d 70 75 74  }.  .  /* Comput
189f0 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
18a00 65 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a 20  ences used by . 
18a10 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61   ** temporary ta
18a20 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69  bles needed to i
18a30 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d  mplement the com
18a40 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
18a50 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b 65  ** Attach the Ke
18a60 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
18a70 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79  to all temporary
18a80 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
18a90 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  ** This section 
18aa0 69 73 20 72 75 6e 20 62 79 20 74 68 65 20 72 69  is run by the ri
18ab0 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20  ght-most SELECT 
18ac0 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a  statement only..
18ad0 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
18ae0 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65  ements to the le
18af0 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74  ft always skip t
18b00 68 69 73 20 70 61 72 74 2e 20 20 54 68 65 20 72  his part.  The r
18b10 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53  ight-most.  ** S
18b20 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f  ELECT might also
18b30 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 20   skip this part 
18b40 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44  if it has no ORD
18b50 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
18b60 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61  .  ** no temp ta
18b70 62 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65  bles are require
18b80 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
18b90 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55  >selFlags & SF_U
18ba0 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a  sesEphemeral ){.
18bb0 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
18bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bd0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
18be0 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f  r */.    KeyInfo
18bf0 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20   *pKeyInfo;     
18c00 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
18c10 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
18c20 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
18c30 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  */.    Select *p
18c40 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
18c50 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
18c60 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45  ing through SELE
18c70 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  CT statements */
18c80 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61  .    CollSeq **a
18c90 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pColl;          
18ca0 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
18cb0 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e  g through pKeyIn
18cc0 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20  fo->aColl[] */. 
18cd0 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20     int nCol;    
18ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cf0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
18d00 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20  lumns in result 
18d10 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  set */..    asse
18d20 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20  rt( p->pNext==0 
18d30 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d  );.    nCol = p-
18d40 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
18d50 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
18d60 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
18d70 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b  oc(db, nCol, 1);
18d80 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e  .    if( !pKeyIn
18d90 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fo ){.      rc =
18da0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
18db0 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  PT;.      goto m
18dc0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
18dd0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
18de0 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49  =0, apColl=pKeyI
18df0 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43  nfo->aColl; i<nC
18e00 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b  ol; i++, apColl+
18e10 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c  +){.      *apCol
18e20 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  l = multiSelectC
18e30 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
18e40 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
18e50 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20  0==*apColl ){.  
18e60 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
18e70 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
18e80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
18e90 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70    for(pLoop=p; p
18ea0 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
18eb0 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  p->pPrior){.    
18ec0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20    for(i=0; i<2; 
18ed0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
18ee0 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e  t addr = pLoop->
18ef0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b  addrOpenEphm[i];
18f00 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
18f10 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  r<0 ){.         
18f20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e   /* If [0] is un
18f30 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73  used then [1] is
18f40 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53   also unused.  S
18f50 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20  o we can.       
18f60 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66     ** always saf
18f70 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f  ely abort as soo
18f80 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 20 75  n as the first u
18f90 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f  nused slot is fo
18fa0 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  und */.         
18fb0 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
18fc0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c  addrOpenEphm[1]<
18fd0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  0 );.          b
18fe0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
18ff0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
19000 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
19010 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  ddr, nCol);.    
19020 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
19030 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c  hangeP4(v, addr,
19040 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b   (char*)sqlite3K
19050 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e  eyInfoRef(pKeyIn
19060 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  fo),.           
19070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19080 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
19090 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64        pLoop->add
190a0 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d  rOpenEphm[i] = -
190b0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
190c0 0a 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49  .    sqlite3KeyI
190d0 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66  nfoUnref(pKeyInf
190e0 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73  o);.  }..multi_s
190f0 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65  elect_end:.  pDe
19100 73 74 2d 3e 69 53 64 73 74 20 3d 20 64 65 73 74  st->iSdst = dest
19110 2e 69 53 64 73 74 3b 0a 20 20 70 44 65 73 74 2d  .iSdst;.  pDest-
19120 3e 6e 53 64 73 74 20 3d 20 64 65 73 74 2e 6e 53  >nSdst = dest.nS
19130 64 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  dst;.  sqlite3Se
19140 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
19150 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75 72  Delete);.  retur
19160 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
19170 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
19180 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
19190 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 6d 65  ../*.** Error me
191a0 73 73 61 67 65 20 66 6f 72 20 77 68 65 6e 20 74  ssage for when t
191b0 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73  wo or more terms
191c0 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
191d0 65 6c 65 63 74 20 68 61 76 65 20 64 69 66 66 65  elect have diffe
191e0 72 65 6e 74 0a 2a 2a 20 73 69 7a 65 20 72 65 73  rent.** size res
191f0 75 6c 74 20 73 65 74 73 2e 0a 2a 2f 0a 76 6f 69  ult sets..*/.voi
19200 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  d sqlite3SelectW
19210 72 6f 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72 6f  rongNumTermsErro
19220 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
19230 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
19240 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
19250 20 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20 20   SF_Values ){.  
19260 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
19270 67 28 70 50 61 72 73 65 2c 20 22 61 6c 6c 20 56  g(pParse, "all V
19280 41 4c 55 45 53 20 6d 75 73 74 20 68 61 76 65 20  ALUES must have 
19290 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
192a0 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20 20 7d 65  of terms");.  }e
192b0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
192c0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
192d0 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65   "SELECTs to the
192e0 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
192f0 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64  of %s".      " d
19300 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73  o not have the s
19310 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  ame number of re
19320 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73  sult columns", s
19330 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
19340 70 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  p));.  }.}../*.*
19350 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74  * Code an output
19360 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   subroutine for 
19370 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c  a coroutine impl
19380 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a  ementation of a.
19390 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65  ** SELECT statme
193a0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61  nt..**.** The da
193b0 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20  ta to be output 
193c0 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  is contained in 
193d0 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68 65  pIn->iSdst.  The
193e0 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e  re are.** pIn->n
193f0 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  Sdst columns to 
19400 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73  be output.  pDes
19410 74 20 69 73 20 77 68 65 72 65 20 74 68 65 20 6f  t is where the o
19420 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  utput should.** 
19430 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72  be sent..**.** r
19440 65 67 52 65 74 75 72 6e 20 69 73 20 74 68 65 20  egReturn is the 
19450 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65  number of the re
19460 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74  gister holding t
19470 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a  he subroutine.**
19480 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e   return address.
19490 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65  .**.** If regPre
194a0 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20 74  v>0 then it is t
194b0 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
194c0 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68  r in a vector th
194d0 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68  at.** records th
194e0 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  e previous outpu
194f0 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d  t.  mem[regPrev]
19500 20 69 73 20 61 20 66 6c 61 67 20 74 68 61 74 20   is a flag that 
19510 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74  is false.** if t
19520 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f  here has been no
19530 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
19540 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e 30 20  .  If regPrev>0 
19550 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20  then code is.** 
19560 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70  generated to sup
19570 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73  press duplicates
19580 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75  .  pKeyInfo is u
19590 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e  sed for comparin
195a0 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a  g.** keys..**.**
195b0 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f   If the LIMIT fo
195c0 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74  und in p->iLimit
195d0 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d   is reached, jum
195e0 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
195f0 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73  .** iBreak..*/.s
19600 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61  tatic int genera
19610 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
19620 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ne(.  Parse *pPa
19630 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
19640 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
19650 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
19660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19670 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
19680 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ement */.  Selec
19690 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20  tDest *pIn,     
196a0 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20     /* Coroutine 
196b0 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a  supplying data *
196c0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
196d0 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57  pDest,      /* W
196e0 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65  here to send the
196f0 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72   data */.  int r
19700 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20  egReturn,       
19710 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
19720 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
19730 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  r */.  int regPr
19740 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ev,            /
19750 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c  * Previous resul
19760 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20  t register.  No 
19770 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30 20  uniqueness if 0 
19780 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
19790 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20  eyInfo,      /* 
197a0 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69  For comparing wi
197b0 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  th previous entr
197c0 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61  y */.  int iBrea
197d0 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k              /
197e0 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77  * Jump here if w
197f0 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20  e hit the LIMIT 
19800 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
19810 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
19820 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
19830 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20  ;.  int addr;.. 
19840 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
19850 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
19860 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d  );.  iContinue =
19870 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
19880 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20  Label(v);..  /* 
19890 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61  Suppress duplica
198a0 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45  tes for UNION, E
198b0 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52  XCEPT, and INTER
198c0 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28  SECT .  */.  if(
198d0 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20   regPrev ){.    
198e0 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32  int addr1, addr2
198f0 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71  ;.    addr1 = sq
19900 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
19910 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67  v, OP_IfNot, reg
19920 50 72 65 76 29 3b 20 56 64 62 65 43 6f 76 65 72  Prev); VdbeCover
19930 61 67 65 28 76 29 3b 0a 20 20 20 20 61 64 64 72  age(v);.    addr
19940 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
19950 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
19960 61 72 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  are, pIn->iSdst,
19970 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d   regPrev+1, pIn-
19980 3e 6e 53 64 73 74 2c 0a 20 20 20 20 20 20 20 20  >nSdst,.        
19990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199a0 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c        (char*)sql
199b0 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70  ite3KeyInfoRef(p
199c0 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59  KeyInfo), P4_KEY
199d0 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74  INFO);.    sqlit
199e0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
199f0 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 32 2b 32  OP_Jump, addr2+2
19a00 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 61 64 64  , iContinue, add
19a10 72 32 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72  r2+2); VdbeCover
19a20 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
19a30 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
19a40 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73  v, addr1);.    s
19a50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
19a60 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49 6e  (v, OP_Copy, pIn
19a70 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76  ->iSdst, regPrev
19a80 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d 31  +1, pIn->nSdst-1
19a90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
19aa0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
19ab0 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 50 72  nteger, 1, regPr
19ac0 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ev);.  }.  if( p
19ad0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
19ae0 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
19af0 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65   0;..  /* Suppre
19b00 73 73 20 74 68 65 20 66 69 72 73 74 20 4f 46 46  ss the first OFF
19b10 53 45 54 20 65 6e 74 72 69 65 73 20 69 66 20 74  SET entries if t
19b20 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45  here is an OFFSE
19b30 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  T clause.  */.  
19b40 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d  codeOffset(v, p-
19b50 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69  >iOffset, iConti
19b60 6e 75 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  nue);..  assert(
19b70 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
19b80 52 54 5f 45 78 69 73 74 73 20 29 3b 0a 20 20 61  RT_Exists );.  a
19b90 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44  ssert( pDest->eD
19ba0 65 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29  est!=SRT_Table )
19bb0 3b 0a 20 20 73 77 69 74 63 68 28 20 70 44 65 73  ;.  switch( pDes
19bc0 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20  t->eDest ){.    
19bd0 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
19be0 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e  ult as data usin
19bf0 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a  g a unique key..
19c00 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
19c10 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
19c20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
19c30 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
19c40 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
19c50 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33  int r2 = sqlite3
19c60 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
19c70 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
19c80 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
19c90 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49  P_MakeRecord, pI
19ca0 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
19cb0 53 64 73 74 2c 20 72 31 29 3b 0a 20 20 20 20 20  Sdst, r1);.     
19cc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19cd0 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
19ce0 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
19cf0 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  m, r2);.      sq
19d00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
19d10 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44  v, OP_Insert, pD
19d20 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31  est->iSDParm, r1
19d30 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r2);.      sql
19d40 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
19d50 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
19d60 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  D);.      sqlite
19d70 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
19d80 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20  pParse, r2);.   
19d90 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
19da0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
19db0 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
19dc0 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
19dd0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
19de0 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66  BQUERY.    /* If
19df0 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67   we are creating
19e00 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65   a set for an "e
19e10 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
19e20 2e 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ..)"..    */.   
19e30 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
19e40 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  .      int r1;. 
19e50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
19e60 49 6e 2d 3e 6e 53 64 73 74 3e 31 20 29 3b 0a 20  In->nSdst>1 );. 
19e70 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
19e80 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
19e90 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
19ea0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
19eb0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
19ec0 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
19ed0 6e 53 64 73 74 2c 20 0a 20 20 20 20 20 20 20 20  nSdst, .        
19ee0 20 20 72 31 2c 20 70 44 65 73 74 2d 3e 7a 41 66    r1, pDest->zAf
19ef0 66 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  fSdst, pIn->nSds
19f00 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
19f10 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
19f20 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
19f30 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
19f40 72 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r1,.            
19f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
19f60 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
19f70 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
19f80 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
19f90 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
19fa0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19fb0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
19fc0 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20  his is a scalar 
19fd0 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70  select that is p
19fe0 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
19ff0 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  sion, then.    *
1a000 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
1a010 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f  lts in the appro
1a020 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65  priate memory ce
1a030 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74  ll and break out
1a040 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
1a050 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
1a060 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
1a070 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
1a080 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31  t( pIn->nSdst==1
1a090 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
1a0a0 3e 30 20 29 3b 20 20 74 65 73 74 63 61 73 65 28  >0 );  testcase(
1a0b0 20 70 49 6e 2d 3e 6e 53 64 73 74 21 3d 31 20 29   pIn->nSdst!=1 )
1a0c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1a0d0 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
1a0e0 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
1a0f0 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
1a100 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  1);.      /* The
1a110 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
1a120 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74  ll jump out of t
1a130 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
1a140 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
1a150 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23     }.#endif /* #
1a160 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a170 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
1a180 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c      /* The resul
1a190 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ts are stored in
1a1a0 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
1a1b0 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20  egisters.    ** 
1a1c0 73 74 61 72 74 69 6e 67 20 61 74 20 70 44 65 73  starting at pDes
1a1d0 74 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 6e 20  t->iSdst.  Then 
1a1e0 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79  the co-routine y
1a1f0 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ields..    */.  
1a200 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75    case SRT_Corou
1a210 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66  tine: {.      if
1a220 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d  ( pDest->iSdst==
1a230 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
1a240 73 74 2d 3e 69 53 64 73 74 20 3d 20 73 71 6c 69  st->iSdst = sqli
1a250 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
1a260 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64  pParse, pIn->nSd
1a270 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65  st);.        pDe
1a280 73 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d  st->nSdst = pIn-
1a290 3e 6e 53 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a  >nSdst;.      }.
1a2a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a2b0 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
1a2c0 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44  , pIn->iSdst, pD
1a2d0 65 73 74 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d  est->iSdst, pIn-
1a2e0 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73  >nSdst);.      s
1a2f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
1a300 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44  (v, OP_Yield, pD
1a310 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20  est->iSDParm);. 
1a320 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a330 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e  }..    /* If non
1a340 65 20 6f 66 20 74 68 65 20 61 62 6f 76 65 2c 20  e of the above, 
1a350 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
1a360 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74  destination must
1a370 20 62 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f   be.    ** SRT_O
1a380 75 74 70 75 74 2e 20 20 54 68 69 73 20 72 6f 75  utput.  This rou
1a390 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61  tine is never ca
1a3a0 6c 6c 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74  lled with any ot
1a3b0 68 65 72 0a 20 20 20 20 2a 2a 20 64 65 73 74 69  her.    ** desti
1a3c0 6e 61 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61  nation other tha
1a3d0 6e 20 74 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c  n the ones handl
1a3e0 65 64 20 61 62 6f 76 65 20 6f 72 20 53 52 54 5f  ed above or SRT_
1a3f0 4f 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20  Output..    **. 
1a400 20 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75     ** For SRT_Ou
1a410 74 70 75 74 2c 20 72 65 73 75 6c 74 73 20 61 72  tput, results ar
1a420 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65  e stored in a se
1a430 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
1a440 65 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68  ers.  .    ** Th
1a450 65 6e 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74  en the OP_Result
1a460 52 6f 77 20 6f 70 63 6f 64 65 20 69 73 20 75 73  Row opcode is us
1a470 65 64 20 74 6f 20 63 61 75 73 65 20 73 71 6c 69  ed to cause sqli
1a480 74 65 33 5f 73 74 65 70 28 29 20 74 6f 0a 20 20  te3_step() to.  
1a490 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20    ** return the 
1a4a0 6e 65 78 74 20 72 6f 77 20 6f 66 20 72 65 73 75  next row of resu
1a4b0 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  lt..    */.    d
1a4c0 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
1a4d0 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65  assert( pDest->e
1a4e0 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
1a4f0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1a500 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a510 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e  P_ResultRow, pIn
1a520 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
1a530 64 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  dst);.      brea
1a540 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
1a550 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65  /* Jump to the e
1a560 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  nd of the loop i
1a570 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72  f the LIMIT is r
1a580 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  eached..  */.  i
1a590 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  f( p->iLimit ){.
1a5a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a5b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72  ddOp2(v, OP_Decr
1a5c0 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  JumpZero, p->iLi
1a5d0 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  mit, iBreak); Vd
1a5e0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1a5f0 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
1a600 65 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  e the subroutine
1a610 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73   return.  */.  s
1a620 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1a630 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69  eLabel(v, iConti
1a640 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  nue);.  sqlite3V
1a650 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
1a660 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72  Return, regRetur
1a670 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64  n);..  return ad
1a680 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74  dr;.}../*.** Alt
1a690 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e  ernative compoun
1a6a0 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65  d select code ge
1a6b0 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65  nerator for case
1a6c0 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20  s when there.** 
1a6d0 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
1a6e0 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  lause..**.** We 
1a6f0 61 73 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f  assume a query o
1a700 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1a710 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
1a720 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65   <selectA>  <ope
1a730 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42  rator>  <selectB
1a740 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64  >  ORDER BY <ord
1a750 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20  erbylist>.**.** 
1a760 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e  <operator> is on
1a770 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  e of UNION ALL, 
1a780 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f  UNION, EXCEPT, o
1a790 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68  r INTERSECT.  Th
1a7a0 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20  e idea.** is to 
1a7b0 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63  code both <selec
1a7c0 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42  tA> and <selectB
1a7d0 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52  > with the ORDER
1a7e0 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a   BY clause as.**
1a7f0 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54   co-routines.  T
1a800 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72  hen run the co-r
1a810 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c  outines in paral
1a820 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68  lel and merge th
1a830 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74  e results.** int
1a840 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49  o the output.  I
1a850 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68  n addition to th
1a860 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73  e two coroutines
1a870 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41   (called selectA
1a880 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29   and.** selectB)
1a890 20 74 68 65 72 65 20 61 72 65 20 37 20 73 75 62   there are 7 sub
1a8a0 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20  routines:.**.** 
1a8b0 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65     outA:    Move
1a8c0 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   the output of t
1a8d0 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75  he selectA corou
1a8e0 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75  tine into the ou
1a8f0 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  tput.**         
1a900 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f      of the compo
1a910 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a  und query..**.**
1a920 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76      outB:    Mov
1a930 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  e the output of 
1a940 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f  the selectB coro
1a950 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f  utine into the o
1a960 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  utput.**        
1a970 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70       of the comp
1a980 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e  ound query.  (On
1a990 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72  ly generated for
1a9a0 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20   UNION and.**   
1a9b0 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20            UNION 
1a9c0 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64  ALL.  EXCEPT and
1a9d0 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65   INSERTSECT neve
1a9e0 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74  r output a row t
1a9f0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
1aa00 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20     appears only 
1aa10 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20  in B.).**.**    
1aa20 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  AltB:    Called 
1aa30 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61  when there is da
1aa40 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72  ta from both cor
1aa50 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e  outines and A<B.
1aa60 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20  .**.**    AeqB: 
1aa70 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
1aa80 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
1aa90 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
1aaa0 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a  s and A==B..**.*
1aab0 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20 43 61  *    AgtB:    Ca
1aac0 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
1aad0 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
1aae0 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
1aaf0 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45   A>B..**.**    E
1ab00 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ofA:    Called w
1ab10 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61  hen data is exha
1ab20 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63  usted from selec
1ab30 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66  tA..**.**    Eof
1ab40 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
1ab50 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73  n data is exhaus
1ab60 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42  ted from selectB
1ab70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ..**.** The impl
1ab80 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
1ab90 65 20 6c 61 74 74 65 72 20 66 69 76 65 20 73 75  e latter five su
1aba0 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64  broutines depend
1abb0 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f   on which .** <o
1abc0 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64  perator> is used
1abd0 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  :.**.**.**      
1abe0 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
1abf0 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20           UNION  
1ac00 20 20 20 20 20 20 20 20 20 20 45 58 43 45 50 54            EXCEPT
1ac10 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 53            INTERS
1ac20 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ECT.**          
1ac30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
1ac40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ac50 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
1ac60 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
1ac70 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20  ---.**   AltB:  
1ac80 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
1ac90 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
1aca0 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
1acb0 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a          nextA.**
1acc0 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75  .**   AeqB:   ou
1acd0 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
1ace0 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20    nextA         
1acf0 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20      nextA       
1ad00 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a    outA, nextA.**
1ad10 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75  .**   AgtB:   ou
1ad20 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f  tB, nextB      o
1ad30 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
1ad40 20 20 20 20 6e 65 78 74 42 20 20 20 20 20 20 20      nextB       
1ad50 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a       nextB.**.**
1ad60 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c     EofA:   outB,
1ad70 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42   nextB      outB
1ad80 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20  , nextB         
1ad90 20 68 61 6c 74 20 20 20 20 20 20 20 20 20 20 20   halt           
1ada0 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45    halt.**.**   E
1adb0 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78  ofB:   outA, nex
1adc0 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  tA      outA, ne
1add0 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20  xtA       outA, 
1ade0 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 68 61  nextA         ha
1adf0 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  lt.**.** In the 
1ae00 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20  AltB, AeqB, and 
1ae10 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73  AgtB subroutines
1ae20 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f  , an EOF on A fo
1ae30 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a  llowing nextA.**
1ae40 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64   causes an immed
1ae50 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66  iate jump to Eof
1ae60 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20  A and an EOF on 
1ae70 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  B following next
1ae80 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69  B causes.** an i
1ae90 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f  mmediate jump to
1aea0 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45   EofB.  Within E
1aeb0 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e  ofA and EofB, an
1aec0 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f  d EOF on entry o
1aed0 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e  r.** following n
1aee0 65 78 74 58 20 63 61 75 73 65 73 20 61 20 6a 75  extX causes a ju
1aef0 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
1af00 20 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63   the select proc
1af10 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75  essing..**.** Du
1af20 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20  plicate removal 
1af30 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58  in the UNION, EX
1af40 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53  CEPT, and INTERS
1af50 45 43 54 20 63 61 73 65 73 20 69 73 20 68 61 6e  ECT cases is han
1af60 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74  dled.** within t
1af70 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  he output subrou
1af80 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72  tine.  The regPr
1af90 65 76 20 72 65 67 69 73 74 65 72 20 73 65 74 20  ev register set 
1afa0 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f  holds the previo
1afb0 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76  usly.** output v
1afc0 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69  alue.  A compari
1afd0 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69  son is made agai
1afe0 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65 20 61  nst this value a
1aff0 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  nd the output.**
1b000 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74   is skipped if t
1b010 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20  he next results 
1b020 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d  would be the sam
1b030 65 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75  e as the previou
1b040 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  s..**.** The imp
1b050 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e  lementation plan
1b060 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74   is to implement
1b070 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69   the two corouti
1b080 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a  nes and seven.**
1b090 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72   subroutines fir
1b0a0 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65  st, then put the
1b0b0 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61   control logic a
1b0c0 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c  t the bottom.  L
1b0d0 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
1b0e0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e           goto In
1b0f0 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63  it.**     coA: c
1b100 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66  oroutine for lef
1b110 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20  t query (A).**  
1b120 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e     coB: coroutin
1b130 65 20 66 6f 72 20 72 69 67 68 74 20 71 75 65 72  e for right quer
1b140 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41  y (B).**    outA
1b150 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77  : output one row
1b160 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42   of A.**    outB
1b170 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77  : output one row
1b180 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64   of B (UNION and
1b190 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29   UNION ALL only)
1b1a0 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e  .**    EofA: ...
1b1b0 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e  .**    EofB: ...
1b1c0 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e  .**    AltB: ...
1b1d0 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e  .**    AeqB: ...
1b1e0 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e  .**    AgtB: ...
1b1f0 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69  .**    Init: ini
1b200 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e  tialize coroutin
1b210 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20  e registers.**  
1b220 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f          yield co
1b230 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66  A.**          if
1b240 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66   eof(A) goto Eof
1b250 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69  A.**          yi
1b260 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20  eld coB.**      
1b270 20 20 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f      if eof(B) go
1b280 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d  to EofB.**    Cm
1b290 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42  pr: Compare A, B
1b2a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d  .**          Jum
1b2b0 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67  p AltB, AeqB, Ag
1b2c0 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e  tB.**     End: .
1b2d0 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c  ...**.** We call
1b2e0 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74   AltB, AeqB, Agt
1b2f0 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66  B, EofA, and Eof
1b300 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20  B "subroutines" 
1b310 62 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74  but they are not
1b320 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c  .** actually cal
1b330 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20  led using Gosub 
1b340 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  and they do not 
1b350 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e  Return.  EofA an
1b360 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75  d EofB loop.** u
1b370 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73  ntil all data is
1b380 20 65 78 68 61 75 73 74 65 64 20 74 68 65 6e 20   exhausted then 
1b390 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64  jump to the "end
1b3a0 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41  " labe.  AltB, A
1b3b0 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42  eqB,.** and AgtB
1b3c0 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20   jump to either 
1b3d0 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20  L2 or to one of 
1b3e0 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f  EofA or EofB..*/
1b3f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1b400 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
1b410 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20  LECT.static int 
1b420 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
1b430 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  By(.  Parse *pPa
1b440 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
1b450 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1b460 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
1b470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b480 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
1b490 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
1b4a0 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
1b4b0 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
1b4c0 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
1b4d0 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
1b4e0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
1b4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b500 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
1b510 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
1b520 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  r;       /* Anot
1b530 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64  her SELECT immed
1b540 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65  iately to our le
1b550 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ft */.  Vdbe *v;
1b560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b570 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1b580 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
1b590 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
1b5a0 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e  A;     /* Destin
1b5b0 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74  ation for corout
1b5c0 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63  ine A */.  Selec
1b5d0 74 44 65 73 74 20 64 65 73 74 42 3b 20 20 20 20  tDest destB;    
1b5e0 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20   /* Destination 
1b5f0 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20  for coroutine B 
1b600 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72  */.  int regAddr
1b610 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  A;         /* Ad
1b620 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
1b630 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f  or select-A coro
1b640 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
1b650 65 67 41 64 64 72 42 3b 20 20 20 20 20 20 20 20  egAddrB;        
1b660 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
1b670 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
1b680 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  B coroutine */. 
1b690 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41   int addrSelectA
1b6a0 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
1b6b0 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
1b6c0 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  A coroutine */. 
1b6d0 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42   int addrSelectB
1b6e0 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
1b6f0 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
1b700 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  B coroutine */. 
1b710 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20   int regOutA;   
1b720 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
1b730 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74  s register for t
1b740 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72  he output-A subr
1b750 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1b760 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20  regOutB;        
1b770 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
1b780 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75  ister for the ou
1b790 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  tput-B subroutin
1b7a0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f  e */.  int addrO
1b7b0 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  utA;         /* 
1b7c0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f  Address of the o
1b7d0 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69  utput-A subrouti
1b7e0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
1b7f0 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a  OutB = 0;     /*
1b800 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
1b810 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74  output-B subrout
1b820 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
1b830 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f  rEofA;         /
1b840 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
1b850 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73   select-A-exhaus
1b860 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ted subroutine *
1b870 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41  /.  int addrEofA
1b880 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41 6c 74  _noB;     /* Alt
1b890 65 72 6e 61 74 65 20 61 64 64 72 45 6f 66 41 20  ernate addrEofA 
1b8a0 69 66 20 42 20 69 73 20 75 6e 69 6e 69 74 69 61  if B is uninitia
1b8b0 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61  lized */.  int a
1b8c0 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20  ddrEofB;        
1b8d0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
1b8e0 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61  he select-B-exha
1b8f0 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  usted subroutine
1b900 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c   */.  int addrAl
1b910 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tB;         /* A
1b920 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c  ddress of the A<
1b930 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
1b940 20 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20    int addrAeqB; 
1b950 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
1b960 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73  ss of the A==B s
1b970 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
1b980 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20 20 20  nt addrAgtB;    
1b990 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1b9a0 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62 72 6f  of the A>B subro
1b9b0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
1b9c0 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20  egLimitA;       
1b9d0 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74   /* Limit regist
1b9e0 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20  er for select-A 
1b9f0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69  */.  int regLimi
1ba00 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  tB;        /* Li
1ba10 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72  mit register for
1ba20 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69   select-A */.  i
1ba30 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20  nt regPrev;     
1ba40 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20       /* A range 
1ba50 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  of registers to 
1ba60 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75  hold previous ou
1ba70 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61  tput */.  int sa
1ba80 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  vedLimit;       
1ba90 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f  /* Saved value o
1baa0 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20  f p->iLimit */. 
1bab0 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74   int savedOffset
1bac0 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20  ;      /* Saved 
1bad0 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66  value of p->iOff
1bae0 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  set */.  int lab
1baf0 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f  elCmpr;        /
1bb00 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20  * Label for the 
1bb10 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72  start of the mer
1bb20 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a  ge algorithm */.
1bb30 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20    int labelEnd; 
1bb40 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c          /* Label
1bb50 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20   for the end of 
1bb60 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45  the overall SELE
1bb70 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74  CT stmt */.  int
1bb80 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20   addr1;         
1bb90 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72     /* Jump instr
1bba0 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74  uctions that get
1bbb0 20 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a   retargetted */.
1bbc0 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
1bbd0 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
1bbe0 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49  f TK_ALL, TK_UNI
1bbf0 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54  ON, TK_EXCEPT, T
1bc00 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20  K_INTERSECT */. 
1bc10 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75   KeyInfo *pKeyDu
1bc20 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72  p = 0; /* Compar
1bc30 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ison information
1bc40 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72   for duplicate r
1bc50 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49  emoval */.  KeyI
1bc60 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20  nfo *pKeyMerge; 
1bc70 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20    /* Comparison 
1bc80 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
1bc90 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a  merging rows */.
1bca0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
1bcb0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1bcc0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
1bcd0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
1bce0 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65  rderBy;   /* The
1bcf0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1bd00 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72   */.  int nOrder
1bd10 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  By;         /* N
1bd20 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
1bd30 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
1bd40 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  lause */.  int *
1bd50 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20  aPermute;       
1bd60 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
1bd70 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
1bd80 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f  to result set co
1bd90 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 61 73 73 65  lumns */..  asse
1bda0 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 21  rt( p->pOrderBy!
1bdb0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1bdc0 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b 20 2f 2a  pKeyDup==0 ); /*
1bdd0 20 22 4d 61 6e 61 67 65 64 22 20 63 6f 64 65 20   "Managed" code 
1bde0 6e 65 65 64 73 20 74 68 69 73 2e 20 20 54 69 63  needs this.  Tic
1bdf0 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f 0a 20 20  ket #3382. */.  
1be00 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1be10 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
1be20 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
1be30 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  v!=0 );       /*
1be40 20 41 6c 72 65 61 64 79 20 74 68 72 6f 77 6e 20   Already thrown 
1be50 74 68 65 20 65 72 72 6f 72 20 69 66 20 56 44 42  the error if VDB
1be60 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a  E alloc failed *
1be70 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20 73  /.  labelEnd = s
1be80 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1be90 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c 43  bel(v);.  labelC
1bea0 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  mpr = sqlite3Vdb
1beb0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
1bec0 0a 20 20 2f 2a 20 50 61 74 63 68 20 75 70 20 74  .  /* Patch up t
1bed0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1bee0 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70  se.  */.  op = p
1bef0 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f 72  ->op;  .  pPrior
1bf00 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
1bf10 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e  assert( pPrior->
1bf20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
1bf30 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
1bf40 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73 65 72  OrderBy;.  asser
1bf50 74 28 20 70 4f 72 64 65 72 42 79 20 29 3b 0a 20  t( pOrderBy );. 
1bf60 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64   nOrderBy = pOrd
1bf70 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20  erBy->nExpr;..  
1bf80 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f 72 73  /* For operators
1bf90 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f   other than UNIO
1bfa0 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20 74 6f  N ALL we have to
1bfb0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a   make sure that.
1bfc0 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42    ** the ORDER B
1bfd0 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72 73 20  Y clause covers 
1bfe0 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68  every term of th
1bff0 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 41  e result set.  A
1c000 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f  dd.  ** terms to
1c010 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1c020 61 75 73 65 20 61 73 20 6e 65 63 65 73 73 61 72  ause as necessar
1c030 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  y..  */.  if( op
1c040 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  !=TK_ALL ){.    
1c050 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c  for(i=1; db->mal
1c060 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26 20  locFailed==0 && 
1c070 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  i<=p->pEList->nE
1c080 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1c090 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1c0a0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1c0b0 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74      for(j=0, pIt
1c0c0 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20  em=pOrderBy->a; 
1c0d0 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c  j<nOrderBy; j++,
1c0e0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
1c0f0 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
1c100 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
1c110 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  l>0 );.        i
1c120 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  f( pItem->u.x.iO
1c130 72 64 65 72 42 79 43 6f 6c 3d 3d 69 20 29 20 62  rderByCol==i ) b
1c140 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1c150 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65      if( j==nOrde
1c160 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 45  rBy ){.        E
1c170 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  xpr *pNew = sqli
1c180 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
1c190 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20 20 20 20  NTEGER, 0);.    
1c1a0 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
1c1b0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1c1c0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
1c1d0 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
1c1e0 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a  |= EP_IntValue;.
1c1f0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
1c200 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20  iValue = i;.    
1c210 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
1c220 3d 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  = pOrderBy = sql
1c230 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
1c240 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  nd(pParse, pOrde
1c250 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  rBy, pNew);.    
1c260 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
1c270 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e   ) pOrderBy->a[n
1c280 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69  OrderBy++].u.x.i
1c290 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31  OrderByCol = (u1
1c2a0 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  6)i;.      }.   
1c2b0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d   }.  }..  /* Com
1c2c0 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69  pute the compari
1c2d0 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20  son permutation 
1c2e0 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74  and keyinfo that
1c2f0 20 69 73 20 75 73 65 64 20 77 69 74 68 0a 20 20   is used with.  
1c300 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74 69  ** the permutati
1c310 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  on used to deter
1c320 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74  mine if the next
1c330 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73  .  ** row of res
1c340 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20  ults comes from 
1c350 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63  selectA or selec
1c360 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78  tB.  Also add ex
1c370 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c  plicit.  ** coll
1c380 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52  ations to the OR
1c390 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65  DER BY clause te
1c3a0 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e  rms so that when
1c3b0 20 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a   the subqueries.
1c3c0 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68    ** to the righ
1c3d0 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61  t and the left a
1c3e0 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68  re evaluated, th
1c3f0 65 79 20 75 73 65 20 74 68 65 20 63 6f 72 72 65  ey use the corre
1c400 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  ct.  ** collatio
1c410 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75  n..  */.  aPermu
1c420 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  te = sqlite3DbMa
1c430 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
1c440 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 4f 72 64 65  zeof(int)*(nOrde
1c450 72 42 79 20 2b 20 31 29 29 3b 0a 20 20 69 66 28  rBy + 1));.  if(
1c460 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20   aPermute ){.   
1c470 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1c480 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1c490 20 20 61 50 65 72 6d 75 74 65 5b 30 5d 20 3d 20    aPermute[0] = 
1c4a0 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 66 6f  nOrderBy;.    fo
1c4b0 72 28 69 3d 31 2c 20 70 49 74 65 6d 3d 70 4f 72  r(i=1, pItem=pOr
1c4c0 64 65 72 42 79 2d 3e 61 3b 20 69 3c 3d 6e 4f 72  derBy->a; i<=nOr
1c4d0 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65  derBy; i++, pIte
1c4e0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  m++){.      asse
1c4f0 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  rt( pItem->u.x.i
1c500 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a  OrderByCol>0 );.
1c510 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
1c520 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
1c530 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d  yCol<=p->pEList-
1c540 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
1c550 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49  aPermute[i] = pI
1c560 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
1c570 79 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a  yCol - 1;.    }.
1c580 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20      pKeyMerge = 
1c590 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
1c5a0 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65  ByKeyInfo(pParse
1c5b0 2c 20 70 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65  , p, 1);.  }else
1c5c0 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20  {.    pKeyMerge 
1c5d0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  = 0;.  }..  /* R
1c5e0 65 61 74 74 61 63 68 20 74 68 65 20 4f 52 44 45  eattach the ORDE
1c5f0 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74  R BY clause to t
1c600 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  he query..  */. 
1c610 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
1c620 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f  OrderBy;.  pPrio
1c630 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71  r->pOrderBy = sq
1c640 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
1c650 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72  (pParse->db, pOr
1c660 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a  derBy, 0);..  /*
1c670 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e 67   Allocate a rang
1c680 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 72  e of temporary r
1c690 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65  egisters and the
1c6a0 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a   KeyInfo needed.
1c6b0 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67    ** for the log
1c6c0 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65 73 20  ic that removes 
1c6d0 64 75 70 6c 69 63 61 74 65 20 72 65 73 75 6c 74  duplicate result
1c6e0 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65 0a 20   rows when the. 
1c6f0 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73 20   ** operator is 
1c700 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f  UNION, EXCEPT, o
1c710 72 20 49 4e 54 45 52 53 45 43 54 20 28 62 75 74  r INTERSECT (but
1c720 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e   not UNION ALL).
1c730 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
1c740 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65  TK_ALL ){.    re
1c750 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c  gPrev = 0;.  }el
1c760 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70  se{.    int nExp
1c770 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  r = p->pEList->n
1c780 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
1c790 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70  ( nOrderBy>=nExp
1c7a0 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
1c7b0 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 67  ailed );.    reg
1c7c0 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Prev = pParse->n
1c7d0 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
1c7e0 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72  e->nMem += nExpr
1c7f0 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +1;.    sqlite3V
1c800 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1c810 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50  Integer, 0, regP
1c820 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75  rev);.    pKeyDu
1c830 70 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  p = sqlite3KeyIn
1c840 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70  foAlloc(db, nExp
1c850 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 1);.    if( p
1c860 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20  KeyDup ){.      
1c870 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
1c880 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
1c890 65 28 70 4b 65 79 44 75 70 29 20 29 3b 0a 20 20  e(pKeyDup) );.  
1c8a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1c8b0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
1c8c0 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f      pKeyDup->aCo
1c8d0 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c  ll[i] = multiSel
1c8e0 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
1c8f0 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20  e, p, i);.      
1c900 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74    pKeyDup->aSort
1c910 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20  Order[i] = 0;.  
1c920 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1c930 20 0a 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20   .  /* Separate 
1c940 74 68 65 20 6c 65 66 74 20 61 6e 64 20 74 68 65  the left and the
1c950 20 72 69 67 68 74 20 71 75 65 72 79 20 66 72 6f   right query fro
1c960 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20  m one another.  
1c970 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  */.  p->pPrior =
1c980 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e   0;.  pPrior->pN
1c990 65 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ext = 0;.  sqlit
1c9a0 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  e3ResolveOrderGr
1c9b0 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c  oupBy(pParse, p,
1c9c0 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f   p->pOrderBy, "O
1c9d0 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50  RDER");.  if( pP
1c9e0 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  rior->pPrior==0 
1c9f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
1ca00 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
1ca10 79 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  y(pParse, pPrior
1ca20 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  , pPrior->pOrder
1ca30 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20  By, "ORDER");.  
1ca40 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
1ca50 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74  the limit regist
1ca60 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65  ers */.  compute
1ca70 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
1ca80 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45  Parse, p, labelE
1ca90 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  nd);.  if( p->iL
1caa0 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41  imit && op==TK_A
1cab0 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d  LL ){.    regLim
1cac0 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  itA = ++pParse->
1cad0 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d  nMem;.    regLim
1cae0 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  itB = ++pParse->
1caf0 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
1cb00 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1cb10 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73  P_Copy, p->iOffs
1cb20 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b  et ? p->iOffset+
1cb30 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20  1 : p->iLimit,. 
1cb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb60 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20   regLimitA);.   
1cb70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1cb80 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p2(v, OP_Copy, r
1cb90 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d  egLimitA, regLim
1cba0 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  itB);.  }else{. 
1cbb0 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72     regLimitA = r
1cbc0 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20  egLimitB = 0;.  
1cbd0 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
1cbe0 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
1cbf0 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69  mit);.  p->pLimi
1cc00 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64  t = 0;..  regAdd
1cc10 72 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rA = ++pParse->n
1cc20 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72 42 20  Mem;.  regAddrB 
1cc30 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1cc40 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b  ;.  regOutA = ++
1cc50 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1cc60 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72  regOutB = ++pPar
1cc70 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69  se->nMem;.  sqli
1cc80 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
1cc90 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f  t(&destA, SRT_Co
1cca0 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
1ccb0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  A);.  sqlite3Sel
1ccc0 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
1ccd0 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  tB, SRT_Coroutin
1cce0 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20  e, regAddrB);.. 
1ccf0 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61   ExplainQueryPla
1cd00 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 4d  n((pParse, 1, "M
1cd10 45 52 47 45 20 28 25 73 29 22 2c 20 73 65 6c 65  ERGE (%s)", sele
1cd20 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
1cd30 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1cd40 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f  e a coroutine to
1cd50 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45   evaluate the SE
1cd60 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
1cd70 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20  o the.  ** left 
1cd80 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
1cd90 6f 70 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22  operator - the "
1cda0 41 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a  A" select..  */.
1cdb0 20 20 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20    addrSelectA = 
1cdc0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1cdd0 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20  ntAddr(v) + 1;. 
1cde0 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
1cdf0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1ce00 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20  _InitCoroutine, 
1ce10 72 65 67 41 64 64 72 41 2c 20 30 2c 20 61 64 64  regAddrA, 0, add
1ce20 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 56 64 62  rSelectA);.  Vdb
1ce30 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c 65  eComment((v, "le
1ce40 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20  ft SELECT"));.  
1ce50 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d  pPrior->iLimit =
1ce60 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 45 78   regLimitA;.  Ex
1ce70 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28  plainQueryPlan((
1ce80 70 50 61 72 73 65 2c 20 31 2c 20 22 4c 45 46 54  pParse, 1, "LEFT
1ce90 22 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  "));.  sqlite3Se
1cea0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
1ceb0 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a 20 20  ior, &destA);.  
1cec0 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f  sqlite3VdbeEndCo
1ced0 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67 41 64  routine(v, regAd
1cee0 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  drA);.  sqlite3V
1cef0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
1cf00 64 64 72 31 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  ddr1);..  /* Gen
1cf10 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e  erate a coroutin
1cf20 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
1cf30 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
1cf40 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20  nt on .  ** the 
1cf50 72 69 67 68 74 20 2d 20 74 68 65 20 22 42 22 20  right - the "B" 
1cf60 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64  select.  */.  ad
1cf70 64 72 53 65 6c 65 63 74 42 20 3d 20 73 71 6c 69  drSelectB = sqli
1cf80 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
1cf90 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 61 64 64  dr(v) + 1;.  add
1cfa0 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
1cfb0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69  AddOp3(v, OP_Ini
1cfc0 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  tCoroutine, regA
1cfd0 64 64 72 42 2c 20 30 2c 20 61 64 64 72 53 65 6c  ddrB, 0, addrSel
1cfe0 65 63 74 42 29 3b 0a 20 20 56 64 62 65 43 6f 6d  ectB);.  VdbeCom
1cff0 6d 65 6e 74 28 28 76 2c 20 22 72 69 67 68 74 20  ment((v, "right 
1d000 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76  SELECT"));.  sav
1d010 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69  edLimit = p->iLi
1d020 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73  mit;.  savedOffs
1d030 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b  et = p->iOffset;
1d040 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72  .  p->iLimit = r
1d050 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69  egLimitB;.  p->i
1d060 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20  Offset = 0;  .  
1d070 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
1d080 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 52 49  ((pParse, 1, "RI
1d090 47 48 54 22 29 29 3b 0a 20 20 73 71 6c 69 74 65  GHT"));.  sqlite
1d0a0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
1d0b0 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d  p, &destB);.  p-
1d0c0 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c  >iLimit = savedL
1d0d0 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73  imit;.  p->iOffs
1d0e0 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74  et = savedOffset
1d0f0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 45  ;.  sqlite3VdbeE
1d100 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72  ndCoroutine(v, r
1d110 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20  egAddrB);..  /* 
1d120 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
1d130 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
1d140 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ts the current r
1d150 6f 77 20 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a  ow of the A.  **
1d160 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e   select as the n
1d170 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f  ext output row o
1d180 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
1d190 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64  elect..  */.  Vd
1d1a0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
1d1b0 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e  , "Output routin
1d1c0 65 20 66 6f 72 20 41 22 29 29 3b 0a 20 20 61 64  e for A"));.  ad
1d1d0 64 72 4f 75 74 41 20 3d 20 67 65 6e 65 72 61 74  drOutA = generat
1d1e0 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
1d1f0 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
1d200 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64             p, &d
1d210 65 73 74 41 2c 20 70 44 65 73 74 2c 20 72 65 67  estA, pDest, reg
1d220 4f 75 74 41 2c 0a 20 20 20 20 20 20 20 20 20 20  OutA,.          
1d230 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20         regPrev, 
1d240 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e  pKeyDup, labelEn
1d250 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65  d);.  .  /* Gene
1d260 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
1d270 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 74  e that outputs t
1d280 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f  he current row o
1d290 66 20 74 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c  f the B.  ** sel
1d2a0 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74 20  ect as the next 
1d2b0 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68  output row of th
1d2c0 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
1d2d0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  t..  */.  if( op
1d2e0 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d  ==TK_ALL || op==
1d2f0 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20  TK_UNION ){.    
1d300 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1d310 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74  (v, "Output rout
1d320 69 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a 20 20  ine for B"));.  
1d330 20 20 61 64 64 72 4f 75 74 42 20 3d 20 67 65 6e    addrOutB = gen
1d340 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f  erateOutputSubro
1d350 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20  utine(pParse,.  
1d360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1d370 2c 20 26 64 65 73 74 42 2c 20 70 44 65 73 74 2c  , &destB, pDest,
1d380 20 72 65 67 4f 75 74 42 2c 0a 20 20 20 20 20 20   regOutB,.      
1d390 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50 72             regPr
1d3a0 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62  ev, pKeyDup, lab
1d3b0 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 20 20 73 71  elEnd);.  }.  sq
1d3c0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
1d3d0 66 28 70 4b 65 79 44 75 70 29 3b 0a 0a 20 20 2f  f(pKeyDup);..  /
1d3e0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
1d3f0 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77  routine to run w
1d400 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  hen the results 
1d410 66 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20 20  from select A.  
1d420 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64  ** are exhausted
1d430 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69   and only data i
1d440 6e 20 73 65 6c 65 63 74 20 42 20 72 65 6d 61 69  n select B remai
1d450 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ns..  */.  if( o
1d460 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20  p==TK_EXCEPT || 
1d470 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
1d480 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 41   ){.    addrEofA
1d490 5f 6e 6f 42 20 3d 20 61 64 64 72 45 6f 66 41 20  _noB = addrEofA 
1d4a0 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a 20 20 7d 65  = labelEnd;.  }e
1d4b0 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e  lse{  .    VdbeN
1d4c0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1d4d0 65 6f 66 2d 41 20 73 75 62 72 6f 75 74 69 6e 65  eof-A subroutine
1d4e0 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66  "));.    addrEof
1d4f0 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  A = sqlite3VdbeA
1d500 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
1d510 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72  b, regOutB, addr
1d520 4f 75 74 42 29 3b 0a 20 20 20 20 61 64 64 72 45  OutB);.    addrE
1d530 6f 66 41 5f 6e 6f 42 20 3d 20 73 71 6c 69 74 65  ofA_noB = sqlite
1d540 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1d550 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1d560 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  B, labelEnd);.  
1d570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d590 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
1d5a0 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
1d5b0 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 45  dbeGoto(v, addrE
1d5c0 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53 65  ofA);.    p->nSe
1d5d0 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  lectRow = sqlite
1d5e0 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53  3LogEstAdd(p->nS
1d5f0 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72  electRow, pPrior
1d600 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20  ->nSelectRow);. 
1d610 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
1d620 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
1d630 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72  o run when the r
1d640 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65  esults from sele
1d650 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20 65 78  ct B.  ** are ex
1d660 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79  hausted and only
1d670 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20   data in select 
1d680 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a  A remains..  */.
1d690 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54    if( op==TK_INT
1d6a0 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64  ERSECT ){.    ad
1d6b0 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45 6f 66  drEofB = addrEof
1d6c0 41 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  A;.    if( p->nS
1d6d0 65 6c 65 63 74 52 6f 77 20 3e 20 70 50 72 69 6f  electRow > pPrio
1d6e0 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20  r->nSelectRow ) 
1d6f0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
1d700 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
1d710 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20  ow;.  }else{  . 
1d720 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
1d730 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20 73 75  nt((v, "eof-B su
1d740 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
1d750 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71 6c 69   addrEofB = sqli
1d760 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1d770 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
1d780 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20  tA, addrOutA);. 
1d790 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1d7a0 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1d7b0 2c 20 72 65 67 41 64 64 72 41 2c 20 6c 61 62 65  , regAddrA, labe
1d7c0 6c 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65 72  lEnd); VdbeCover
1d7d0 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
1d7e0 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
1d7f0 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20  ddrEofB);.  }.. 
1d800 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1d810 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  e to handle the 
1d820 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f  case of A<B.  */
1d830 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
1d840 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73  nt((v, "A-lt-B s
1d850 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
1d860 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74  addrAltB = sqlit
1d870 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d880 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
1d890 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20  A, addrOutA);.  
1d8a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d8b0 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1d8c0 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66  egAddrA, addrEof
1d8d0 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  A); VdbeCoverage
1d8e0 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
1d8f0 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43  beGoto(v, labelC
1d900 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  mpr);..  /* Gene
1d910 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e  rate code to han
1d920 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20  dle the case of 
1d930 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20  A==B.  */.  if( 
1d940 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op==TK_ALL ){.  
1d950 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64    addrAeqB = add
1d960 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69  rAltB;.  }else i
1d970 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  f( op==TK_INTERS
1d980 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 41  ECT ){.    addrA
1d990 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a  eqB = addrAltB;.
1d9a0 20 20 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a      addrAltB++;.
1d9b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62    }else{.    Vdb
1d9c0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1d9d0 20 22 41 2d 65 71 2d 42 20 73 75 62 72 6f 75 74   "A-eq-B subrout
1d9e0 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72  ine"));.    addr
1d9f0 41 65 71 42 20 3d 0a 20 20 20 20 73 71 6c 69 74  AeqB =.    sqlit
1da00 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1da10 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1da20 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56  rA, addrEofA); V
1da30 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1da40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
1da50 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72  oto(v, labelCmpr
1da60 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
1da70 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
1da80 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
1da90 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65   A>B.  */.  Vdbe
1daa0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1dab0 22 41 2d 67 74 2d 42 20 73 75 62 72 6f 75 74 69  "A-gt-B subrouti
1dac0 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 67 74  ne"));.  addrAgt
1dad0 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  B = sqlite3VdbeC
1dae0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
1daf0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
1db00 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  || op==TK_UNION 
1db10 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1db20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1db30 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61  osub, regOutB, a
1db40 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20  ddrOutB);.  }.  
1db50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1db60 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1db70 65 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66  egAddrB, addrEof
1db80 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  B); VdbeCoverage
1db90 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
1dba0 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43  beGoto(v, labelC
1dbb0 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  mpr);..  /* This
1dbc0 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65 20   code runs once 
1dbd0 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65 76  to initialize ev
1dbe0 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20  erything..  */. 
1dbf0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
1dc00 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
1dc10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1dc20 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1dc30 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45   regAddrA, addrE
1dc40 6f 66 41 5f 6e 6f 42 29 3b 20 56 64 62 65 43 6f  ofA_noB); VdbeCo
1dc50 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
1dc60 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1dc70 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
1dc80 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b  ddrB, addrEofB);
1dc90 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1dca0 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e  ;..  /* Implemen
1dcb0 74 20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67 65  t the main merge
1dcc0 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c   loop.  */.  sql
1dcd0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1dce0 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70  abel(v, labelCmp
1dcf0 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r);.  sqlite3Vdb
1dd00 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65  eAddOp4(v, OP_Pe
1dd10 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c  rmutation, 0, 0,
1dd20 20 30 2c 20 28 63 68 61 72 2a 29 61 50 65 72 6d   0, (char*)aPerm
1dd30 75 74 65 2c 20 50 34 5f 49 4e 54 41 52 52 41 59  ute, P4_INTARRAY
1dd40 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1dd50 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp4(v, OP_Com
1dd60 70 61 72 65 2c 20 64 65 73 74 41 2e 69 53 64 73  pare, destA.iSds
1dd70 74 2c 20 64 65 73 74 42 2e 69 53 64 73 74 2c 20  t, destB.iSdst, 
1dd80 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20  nOrderBy,.      
1dd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dda0 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d 65     (char*)pKeyMe
1ddb0 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  rge, P4_KEYINFO)
1ddc0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
1ddd0 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
1dde0 47 5f 50 45 52 4d 55 54 45 29 3b 0a 20 20 73 71  G_PERMUTE);.  sq
1ddf0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1de00 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72  v, OP_Jump, addr
1de10 41 6c 74 42 2c 20 61 64 64 72 41 65 71 42 2c 20  AltB, addrAeqB, 
1de20 61 64 64 72 41 67 74 42 29 3b 20 56 64 62 65 43  addrAgtB); VdbeC
1de30 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f  overage(v);..  /
1de40 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 74 68  * Jump to the th
1de50 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65  is point in orde
1de60 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  r to terminate t
1de70 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  he query..  */. 
1de80 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1de90 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65  lveLabel(v, labe
1dea0 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 52 65 61  lEnd);..  /* Rea
1deb0 73 73 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70  ssembly the comp
1dec0 6f 75 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68  ound query so th
1ded0 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72  at it will be fr
1dee0 65 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20  eed correctly.  
1def0 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ** by the callin
1df00 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  g function */.  
1df10 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
1df20 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
1df30 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  ctDelete(db, p->
1df40 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70  pPrior);.  }.  p
1df50 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
1df60 72 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65  r;.  pPrior->pNe
1df70 78 74 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a 20  xt = p;..  /*** 
1df80 54 42 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62  TBD:  Insert sub
1df90 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f  routine calls to
1dfa0 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f   close cursors o
1dfb0 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a  n incomplete.  *
1dfc0 2a 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a  *** subqueries *
1dfd0 2a 2a 2a 2f 0a 20 20 45 78 70 6c 61 69 6e 51 75  ***/.  ExplainQu
1dfe0 65 72 79 50 6c 61 6e 50 6f 70 28 70 50 61 72 73  eryPlanPop(pPars
1dff0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  e);.  return pPa
1e000 72 73 65 2d 3e 6e 45 72 72 21 3d 30 3b 0a 7d 0a  rse->nErr!=0;.}.
1e010 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
1e020 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1e030 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1e040 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1e050 49 54 5f 56 49 45 57 29 0a 0a 2f 2a 20 41 6e 20  IT_VIEW)../* An 
1e060 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1e070 53 75 62 73 74 43 6f 6e 74 65 78 74 20 6f 62 6a  SubstContext obj
1e080 65 63 74 20 64 65 73 63 72 69 62 65 73 20 61 6e  ect describes an
1e090 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 65 64   substitution ed
1e0a0 69 74 0a 2a 2a 20 74 6f 20 62 65 20 70 65 72 66  it.** to be perf
1e0b0 6f 72 6d 65 64 20 6f 6e 20 61 20 70 61 72 73 65  ormed on a parse
1e0c0 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c   tree..**.** All
1e0d0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
1e0e0 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20  olumns in table 
1e0f0 69 54 61 62 6c 65 20 61 72 65 20 74 6f 20 62 65  iTable are to be
1e100 20 72 65 70 6c 61 63 65 64 20 62 79 20 63 6f 72   replaced by cor
1e110 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 65 78  responding.** ex
1e120 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 70 45 4c  pressions in pEL
1e130 69 73 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ist..*/.typedef 
1e140 73 74 72 75 63 74 20 53 75 62 73 74 43 6f 6e 74  struct SubstCont
1e150 65 78 74 20 7b 0a 20 20 50 61 72 73 65 20 2a 70  ext {.  Parse *p
1e160 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
1e170 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
1e180 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
1e190 74 20 69 54 61 62 6c 65 3b 20 20 20 20 20 20 20  t iTable;       
1e1a0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 61          /* Repla
1e1b0 63 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ce references to
1e1c0 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
1e1d0 20 69 6e 74 20 69 4e 65 77 54 61 62 6c 65 3b 20   int iNewTable; 
1e1e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1e1f0 77 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  w table number *
1e200 2f 0a 20 20 69 6e 74 20 69 73 4c 65 66 74 4a 6f  /.  int isLeftJo
1e210 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  in;           /*
1e220 20 41 64 64 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f   Add TK_IF_NULL_
1e230 52 4f 57 20 6f 70 63 6f 64 65 73 20 6f 6e 20 65  ROW opcodes on e
1e240 61 63 68 20 72 65 70 6c 61 63 65 6d 65 6e 74 20  ach replacement 
1e250 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1e260 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 2f  EList;         /
1e270 2a 20 52 65 70 6c 61 63 65 6d 65 6e 74 20 65 78  * Replacement ex
1e280 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 7d 20 53  pressions */.} S
1e290 75 62 73 74 43 6f 6e 74 65 78 74 3b 0a 0a 2f 2a  ubstContext;../*
1e2a0 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61   Forward Declara
1e2b0 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20  tions */.static 
1e2c0 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
1e2d0 73 74 28 53 75 62 73 74 43 6f 6e 74 65 78 74 2a  st(SubstContext*
1e2e0 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74  , ExprList*);.st
1e2f0 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53  atic void substS
1e300 65 6c 65 63 74 28 53 75 62 73 74 43 6f 6e 74 65  elect(SubstConte
1e310 78 74 2a 2c 20 53 65 6c 65 63 74 2a 2c 20 69 6e  xt*, Select*, in
1e320 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20  t);../*.** Scan 
1e330 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72  through the expr
1e340 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52  ession pExpr.  R
1e350 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66  eplace every ref
1e360 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63  erence to.** a c
1e370 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e  olumn in table n
1e380 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74  umber iTable wit
1e390 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
1e3a0 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e  iColumn-th.** en
1e3b0 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20  try in pEList.  
1e3c0 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72  (But leave refer
1e3d0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57  ences to the ROW
1e3e0 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e  ID column .** un
1e3f0 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20  changed.).**.** 
1e400 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1e410 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74  part of the flat
1e420 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65  tening procedure
1e430 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a  .  A subquery.**
1e440 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65   whose result se
1e450 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
1e460 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61  pEList appears a
1e470 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a  s entry in the.*
1e480 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
1e490 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74   a SELECT such t
1e4a0 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72  hat the VDBE cur
1e4b0 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20  sor assigned to 
1e4c0 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61  that.** FORM cla
1e4d0 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61  use entry is iTa
1e4e0 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ble.  This routi
1e4f0 6e 65 20 6d 61 6b 65 73 20 74 68 65 20 6e 65 63  ne makes the nec
1e500 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67  essary .** chang
1e510 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74  es to pExpr so t
1e520 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69  hat it refers di
1e530 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f  rectly to the so
1e540 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66  urce table.** of
1e550 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61   the subquery ra
1e560 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20  ther the result 
1e570 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75  set of the subqu
1e580 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45  ery..*/.static E
1e590 78 70 72 20 2a 73 75 62 73 74 45 78 70 72 28 0a  xpr *substExpr(.
1e5a0 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a    SubstContext *
1e5b0 70 53 75 62 73 74 2c 20 20 2f 2a 20 44 65 73 63  pSubst,  /* Desc
1e5c0 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ription of the s
1e5d0 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20  ubstitution */. 
1e5e0 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
1e5f0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20          /* Expr 
1e600 69 6e 20 77 68 69 63 68 20 73 75 62 73 74 69 74  in which substit
1e610 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a  ution occurs */.
1e620 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ){.  if( pExpr==
1e630 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1e640 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
1e650 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
1e660 6f 6d 4a 6f 69 6e 29 0a 20 20 20 26 26 20 70 45  omJoin).   && pE
1e670 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  xpr->iRightJoinT
1e680 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54  able==pSubst->iT
1e690 61 62 6c 65 0a 20 20 29 7b 0a 20 20 20 20 70 45  able.  ){.    pE
1e6a0 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  xpr->iRightJoinT
1e6b0 61 62 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e 69  able = pSubst->i
1e6c0 4e 65 77 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  NewTable;.  }.  
1e6d0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
1e6e0 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70  K_COLUMN && pExp
1e6f0 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 75 62 73  r->iTable==pSubs
1e700 74 2d 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  t->iTable ){.   
1e710 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
1e720 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70  umn<0 ){.      p
1e730 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55  Expr->op = TK_NU
1e740 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  LL;.    }else{. 
1e750 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b       Expr *pNew;
1e760 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f  .      Expr *pCo
1e770 70 79 20 3d 20 70 53 75 62 73 74 2d 3e 70 45 4c  py = pSubst->pEL
1e780 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43  ist->a[pExpr->iC
1e790 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20  olumn].pExpr;.  
1e7a0 20 20 20 20 45 78 70 72 20 69 66 4e 75 6c 6c 52      Expr ifNullR
1e7b0 6f 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ow;.      assert
1e7c0 28 20 70 53 75 62 73 74 2d 3e 70 45 4c 69 73 74  ( pSubst->pEList
1e7d0 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43  !=0 && pExpr->iC
1e7e0 6f 6c 75 6d 6e 3c 70 53 75 62 73 74 2d 3e 70 45  olumn<pSubst->pE
1e7f0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
1e800 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
1e810 70 72 2d 3e 65 58 21 3d 45 58 5f 52 69 67 68 74  pr->eX!=EX_Right
1e820 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   );.      if( sq
1e830 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
1e840 72 28 70 43 6f 70 79 29 20 29 7b 0a 20 20 20 20  r(pCopy) ){.    
1e850 20 20 20 20 73 71 6c 69 74 65 33 56 65 63 74 6f      sqlite3Vecto
1e860 72 45 72 72 6f 72 4d 73 67 28 70 53 75 62 73 74  rErrorMsg(pSubst
1e870 2d 3e 70 50 61 72 73 65 2c 20 70 43 6f 70 79 29  ->pParse, pCopy)
1e880 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1e890 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a         sqlite3 *
1e8a0 64 62 20 3d 20 70 53 75 62 73 74 2d 3e 70 50 61  db = pSubst->pPa
1e8b0 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20  rse->db;.       
1e8c0 20 69 66 28 20 70 53 75 62 73 74 2d 3e 69 73 4c   if( pSubst->isL
1e8d0 65 66 74 4a 6f 69 6e 20 26 26 20 70 43 6f 70 79  eftJoin && pCopy
1e8e0 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
1e8f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
1e900 73 65 74 28 26 69 66 4e 75 6c 6c 52 6f 77 2c 20  set(&ifNullRow, 
1e910 30 2c 20 73 69 7a 65 6f 66 28 69 66 4e 75 6c 6c  0, sizeof(ifNull
1e920 52 6f 77 29 29 3b 0a 20 20 20 20 20 20 20 20 20  Row));.         
1e930 20 69 66 4e 75 6c 6c 52 6f 77 2e 6f 70 20 3d 20   ifNullRow.op = 
1e940 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3b 0a  TK_IF_NULL_ROW;.
1e950 20 20 20 20 20 20 20 20 20 20 69 66 4e 75 6c 6c            ifNull
1e960 52 6f 77 2e 70 4c 65 66 74 20 3d 20 70 43 6f 70  Row.pLeft = pCop
1e970 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 4e  y;.          ifN
1e980 75 6c 6c 52 6f 77 2e 69 54 61 62 6c 65 20 3d 20  ullRow.iTable = 
1e990 70 53 75 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c  pSubst->iNewTabl
1e9a0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  e;.          pCo
1e9b0 70 79 20 3d 20 26 69 66 4e 75 6c 6c 52 6f 77 3b  py = &ifNullRow;
1e9c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1e9d0 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
1e9e0 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 43 6f  3ExprDup(db, pCo
1e9f0 70 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  py, 0);.        
1ea00 69 66 28 20 70 4e 65 77 20 26 26 20 70 53 75 62  if( pNew && pSub
1ea10 73 74 2d 3e 69 73 4c 65 66 74 4a 6f 69 6e 20 29  st->isLeftJoin )
1ea20 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
1ea30 53 65 74 50 72 6f 70 65 72 74 79 28 70 4e 65 77  SetProperty(pNew
1ea40 2c 20 45 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 3b  , EP_CanBeNull);
1ea50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ea60 20 20 20 69 66 28 20 70 4e 65 77 20 26 26 20 45     if( pNew && E
1ea70 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1ea80 45 78 70 72 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e  Expr,EP_FromJoin
1ea90 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
1eaa0 4e 65 77 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  New->iRightJoinT
1eab0 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 52  able = pExpr->iR
1eac0 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20  ightJoinTable;. 
1ead0 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74           ExprSet
1eae0 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
1eaf0 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20  P_FromJoin);.   
1eb00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
1eb10 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
1eb20 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  (db, pExpr);.   
1eb30 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65       pExpr = pNe
1eb40 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  w;.      }.    }
1eb50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
1eb60 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
1eb70 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 26 26 20 70  IF_NULL_ROW && p
1eb80 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53  Expr->iTable==pS
1eb90 75 62 73 74 2d 3e 69 54 61 62 6c 65 20 29 7b 0a  ubst->iTable ){.
1eba0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
1ebb0 62 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e  ble = pSubst->iN
1ebc0 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20  ewTable;.    }. 
1ebd0 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20     pExpr->pLeft 
1ebe0 3d 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62  = substExpr(pSub
1ebf0 73 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  st, pExpr->pLeft
1ec00 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70  );.    switch( p
1ec10 45 78 70 72 2d 3e 65 58 20 29 7b 0a 20 20 20 20  Expr->eX ){.    
1ec20 20 20 63 61 73 65 20 45 58 5f 53 65 6c 65 63 74    case EX_Select
1ec30 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 75 62 73  : {.        subs
1ec40 74 53 65 6c 65 63 74 28 70 53 75 62 73 74 2c 20  tSelect(pSubst, 
1ec50 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
1ec60 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72  , 1);.        br
1ec70 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1ec80 20 20 20 63 61 73 65 20 45 58 5f 4c 69 73 74 3a     case EX_List:
1ec90 20 7b 0a 20 20 20 20 20 20 20 20 73 75 62 73 74   {.        subst
1eca0 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c  ExprList(pSubst,
1ecb0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29   pExpr->x.pList)
1ecc0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1ecd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
1ece0 61 73 65 20 45 58 5f 52 69 67 68 74 3a 20 7b 0a  ase EX_Right: {.
1ecf0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78          pExpr->x
1ed00 2e 70 52 69 67 68 74 20 3d 20 73 75 62 73 74 45  .pRight = substE
1ed10 78 70 72 28 70 53 75 62 73 74 2c 20 70 45 78 70  xpr(pSubst, pExp
1ed20 72 2d 3e 78 2e 70 52 69 67 68 74 29 3b 0a 20 20  r->x.pRight);.  
1ed30 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
1ed40 3e 78 2e 70 52 69 67 68 74 3d 3d 30 20 29 20 70  >x.pRight==0 ) p
1ed50 45 78 70 72 2d 3e 65 58 20 3d 20 45 58 5f 4e 6f  Expr->eX = EX_No
1ed60 6e 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ne;.        brea
1ed70 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1ed80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45  .  }.  return pE
1ed90 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  xpr;.}.static vo
1eda0 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
1edb0 28 0a 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74  (.  SubstContext
1edc0 20 2a 70 53 75 62 73 74 2c 20 2f 2a 20 44 65 73   *pSubst, /* Des
1edd0 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
1ede0 73 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a  substitution */.
1edf0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
1ee00 74 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  t       /* List 
1ee10 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77  to scan and in w
1ee20 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62  hich to make sub
1ee30 73 74 69 74 75 74 65 73 20 2a 2f 0a 29 7b 0a 20  stitutes */.){. 
1ee40 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
1ee50 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
1ee60 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
1ee70 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
1ee80 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69  {.    pList->a[i
1ee90 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74 45  ].pExpr = substE
1eea0 78 70 72 28 70 53 75 62 73 74 2c 20 70 4c 69 73  xpr(pSubst, pLis
1eeb0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
1eec0 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
1eed0 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20  d substSelect(. 
1eee0 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70   SubstContext *p
1eef0 53 75 62 73 74 2c 20 2f 2a 20 44 65 73 63 72 69  Subst, /* Descri
1ef00 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62  ption of the sub
1ef10 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 53  stitution */.  S
1ef20 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
1ef30 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73       /* SELECT s
1ef40 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63  tatement in whic
1ef50 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69  h to make substi
1ef60 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  tutions */.  int
1ef70 20 64 6f 50 72 69 6f 72 20 20 20 20 20 20 20 20   doPrior        
1ef80 20 20 20 2f 2a 20 44 6f 20 73 75 62 73 74 69 74     /* Do substit
1ef90 75 74 65 73 20 6f 6e 20 70 2d 3e 70 50 72 69 6f  utes on p->pPrio
1efa0 72 20 74 6f 6f 20 2a 2f 0a 29 7b 0a 20 20 53 72  r too */.){.  Sr
1efb0 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73  cList *pSrc;.  s
1efc0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1efd0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
1efe0 20 69 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72   i;.  if( !p ) r
1eff0 65 74 75 72 6e 3b 0a 20 20 64 6f 7b 0a 20 20 20  eturn;.  do{.   
1f000 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
1f010 53 75 62 73 74 2c 20 70 2d 3e 70 45 4c 69 73 74  Subst, p->pEList
1f020 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  );.    substExpr
1f030 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 2d 3e  List(pSubst, p->
1f040 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73  pGroupBy);.    s
1f050 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75  ubstExprList(pSu
1f060 62 73 74 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  bst, p->pOrderBy
1f070 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e  );.    p->pHavin
1f080 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53  g = substExpr(pS
1f090 75 62 73 74 2c 20 70 2d 3e 70 48 61 76 69 6e 67  ubst, p->pHaving
1f0a0 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65  );.    p->pWhere
1f0b0 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53 75   = substExpr(pSu
1f0c0 62 73 74 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b  bst, p->pWhere);
1f0d0 0a 20 20 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  .    pSrc = p->p
1f0e0 53 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Src;.    assert(
1f0f0 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20   pSrc!=0 );.    
1f100 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63  for(i=pSrc->nSrc
1f110 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b  , pItem=pSrc->a;
1f120 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d   i>0; i--, pItem
1f130 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  ++){.      subst
1f140 53 65 6c 65 63 74 28 70 53 75 62 73 74 2c 20 70  Select(pSubst, p
1f150 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 31  Item->pSelect, 1
1f160 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  );.      if( pIt
1f170 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  em->fg.isTabFunc
1f180 20 29 7b 0a 20 20 20 20 20 20 20 20 73 75 62 73   ){.        subs
1f190 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74  tExprList(pSubst
1f1a0 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e  , pItem->u1.pFun
1f1b0 63 41 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  cArg);.      }. 
1f1c0 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 64     }.  }while( d
1f1d0 6f 50 72 69 6f 72 20 26 26 20 28 70 20 3d 20 70  oPrior && (p = p
1f1e0 2d 3e 70 50 72 69 6f 72 29 21 3d 30 20 29 3b 0a  ->pPrior)!=0 );.
1f1f0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
1f200 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1f210 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1f220 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1f230 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66  IT_VIEW) */..#if
1f240 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1f250 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
1f260 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
1f270 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a  TE_OMIT_VIEW)./*
1f280 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1f290 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61   attempts to fla
1f2a0 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20  tten subqueries 
1f2b0 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  as a performance
1f2c0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
1f2d0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
1f2e0 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d  eturns 1 if it m
1f2f0 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64  akes changes and
1f300 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e   0 if no flatten
1f310 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ing occurs..**.*
1f320 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20  * To understand 
1f330 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66  the concept of f
1f340 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69  lattening, consi
1f350 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  der the followin
1f360 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a  g.** query:.**.*
1f370 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  *     SELECT a F
1f380 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20  ROM (SELECT x+y 
1f390 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
1f3a0 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20  RE z<100) WHERE 
1f3b0 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  a>5.**.** The de
1f3c0 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70  fault way of imp
1f3d0 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71  lementing this q
1f3e0 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63 75  uery is to execu
1f3f0 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65  te the.** subque
1f400 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f  ry first and sto
1f410 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
1f420 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
1f430 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e  ble, then.** run
1f440 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1f450 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61   on that tempora
1f460 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  ry table.  This 
1f470 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20  requires two.** 
1f480 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65 20  passes over the 
1f490 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f  data.  Furthermo
1f4a0 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20  re, because the 
1f4b0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a  temporary table.
1f4c0 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65  ** has no indice
1f4d0 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  s, the WHERE cla
1f4e0 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72  use on the outer
1f4f0 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65   query cannot be
1f500 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a  .** optimized..*
1f510 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1f520 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  e attempts to re
1f530 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73 75  write queries su
1f540 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65 20  ch as the above 
1f550 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  into.** a single
1f560 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69   flat select, li
1f570 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
1f580 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53     SELECT x+y AS
1f590 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
1f5a0 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a   z<100 AND a>5.*
1f5b0 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65  *.** The code ge
1f5c0 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69 73  nerated for this
1f5d0 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20   simplification 
1f5e0 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20 72  gives the same r
1f5f0 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c  esult.** but onl
1f600 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68  y has to scan th
1f610 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e  e data once.  An
1f620 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63 65  d because indice
1f630 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73  s might .** exis
1f640 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74  t on the table t
1f650 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63  1, a complete sc
1f660 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d  an of the data m
1f670 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64  ight be.** avoid
1f680 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65  ed..**.** Flatte
1f690 6e 69 6e 67 20 69 73 20 73 75 62 6a 65 63 74 20  ning is subject 
1f6a0 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
1f6b0 20 63 6f 6e 73 74 72 61 69 6e 74 73 3a 0a 2a 2a   constraints:.**
1f6c0 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f  .**  (**)  We no
1f6d0 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20   longer attempt 
1f6e0 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65  to flatten aggre
1f6f0 67 61 74 65 20 73 75 62 71 75 65 72 69 65 73 2e  gate subqueries.
1f700 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20   Was:.**        
1f710 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
1f720 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1f730 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20   cannot both be 
1f740 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
1f750 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c  *  (**)  We no l
1f760 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f  onger attempt to
1f770 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61   flatten aggrega
1f780 74 65 20 73 75 62 71 75 65 72 69 65 73 2e 20 57  te subqueries. W
1f790 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 28 32  as:.**        (2
1f7a0 29 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72  ) If the subquer
1f7b0 79 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74  y is an aggregat
1f7c0 65 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20  e then.**       
1f7d0 20 28 32 61 29 20 74 68 65 20 6f 75 74 65 72 20   (2a) the outer 
1f7e0 71 75 65 72 79 20 6d 75 73 74 20 6e 6f 74 20 62  query must not b
1f7f0 65 20 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a 2a 20  e a join and.** 
1f800 20 20 20 20 20 20 20 28 32 62 29 20 74 68 65 20         (2b) the 
1f810 6f 75 74 65 72 20 71 75 65 72 79 20 6d 75 73 74  outer query must
1f820 20 6e 6f 74 20 75 73 65 20 73 75 62 71 75 65 72   not use subquer
1f830 69 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ies.**          
1f840 20 20 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68     other than th
1f850 65 20 6f 6e 65 20 46 52 4f 4d 2d 63 6c 61 75 73  e one FROM-claus
1f860 65 20 73 75 62 71 75 65 72 79 20 74 68 61 74 20  e subquery that 
1f870 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 0a 2a  is a candidate.*
1f880 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  *             fo
1f890 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 28  r flattening.  (
1f8a0 54 68 69 73 20 69 73 20 64 75 65 20 74 6f 20 74  This is due to t
1f8b0 69 63 6b 65 74 20 5b 32 66 37 31 37 30 64 37 33  icket [2f7170d73
1f8c0 62 66 39 61 62 66 38 30 5d 0a 2a 2a 20 20 20 20  bf9abf80].**    
1f8d0 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20 32 30           from 20
1f8e0 31 35 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a  15-02-09.).**.**
1f8f0 20 20 20 28 33 29 20 20 49 66 20 74 68 65 20 73     (3)  If the s
1f900 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72  ubquery is the r
1f910 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
1f920 61 20 4c 45 46 54 20 4a 4f 49 4e 20 74 68 65 6e  a LEFT JOIN then
1f930 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 61 29 20  .**        (3a) 
1f940 74 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79  the subquery may
1f950 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20 61   not be a join a
1f960 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 62  nd.**        (3b
1f970 29 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  ) the FROM claus
1f980 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
1f990 79 20 6d 61 79 20 6e 6f 74 20 63 6f 6e 74 61 69  y may not contai
1f9a0 6e 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 20  n a virtual.**  
1f9b0 20 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65             table
1f9c0 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28   and.**        (
1f9d0 33 63 29 20 74 68 65 20 6f 75 74 65 72 20 71 75  3c) the outer qu
1f9e0 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61  ery may not be a
1f9f0 6e 20 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a 0a  n aggregate..**.
1fa00 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73 75  **   (4)  The su
1fa10 62 71 75 65 72 79 20 63 61 6e 20 6e 6f 74 20 62  bquery can not b
1fa20 65 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a  e DISTINCT..**.*
1fa30 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20  *  (**)  At one 
1fa40 70 6f 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f  point restrictio
1fa50 6e 73 20 28 34 29 20 61 6e 64 20 28 35 29 20 64  ns (4) and (5) d
1fa60 65 66 69 6e 65 64 20 61 20 73 75 62 73 65 74 20  efined a subset 
1fa70 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20  of DISTINCT.**  
1fa80 20 20 20 20 20 20 73 75 62 2d 71 75 65 72 69 65        sub-querie
1fa90 73 20 74 68 61 74 20 77 65 72 65 20 65 78 63 6c  s that were excl
1faa0 75 64 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f  uded from this o
1fab0 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73  ptimization. Res
1fac0 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  triction .**    
1fad0 20 20 20 20 28 34 29 20 68 61 73 20 73 69 6e 63      (4) has sinc
1fae0 65 20 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20  e been expanded 
1faf0 74 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44  to exclude all D
1fb00 49 53 54 49 4e 43 54 20 73 75 62 71 75 65 72 69  ISTINCT subqueri
1fb10 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20  es..**.**  (**) 
1fb20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 74   We no longer at
1fb30 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74 65 6e  tempt to flatten
1fb40 20 61 67 67 72 65 67 61 74 65 20 73 75 62 71 75   aggregate subqu
1fb50 65 72 69 65 73 2e 20 20 57 61 73 3a 0a 2a 2a 20  eries.  Was:.** 
1fb60 20 20 20 20 20 20 20 49 66 20 74 68 65 20 73 75         If the su
1fb70 62 71 75 65 72 79 20 69 73 20 61 67 67 72 65 67  bquery is aggreg
1fb80 61 74 65 2c 20 74 68 65 20 6f 75 74 65 72 20 71  ate, the outer q
1fb90 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20  uery may not be 
1fba0 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
1fbb0 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75    (7)  The subqu
1fbc0 65 72 79 20 6d 75 73 74 20 68 61 76 65 20 61 20  ery must have a 
1fbd0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 4f  FROM clause.  TO
1fbe0 44 4f 3a 20 20 46 6f 72 20 73 75 62 71 75 65 72  DO:  For subquer
1fbf0 69 65 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 20  ies without.**  
1fc00 20 20 20 20 20 20 41 20 46 52 4f 4d 20 63 6c 61        A FROM cla
1fc10 75 73 65 2c 20 63 6f 6e 73 69 64 65 72 20 61 64  use, consider ad
1fc20 64 69 6e 67 20 61 20 46 52 4f 4d 20 63 6c 61 75  ding a FROM clau
1fc30 73 65 20 77 69 74 68 20 74 68 65 20 73 70 65 63  se with the spec
1fc40 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74 61  ial.**        ta
1fc50 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65 20  ble sqlite_once 
1fc60 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  that consists of
1fc70 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 63 6f   a single row co
1fc80 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20 20  ntaining a.**   
1fc90 20 20 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c 4c       single NULL
1fca0 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 49  ..**.**   (8)  I
1fcb0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
1fcc0 73 65 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74  ses LIMIT then t
1fcd0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d  he outer query m
1fce0 61 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e  ay not be a join
1fcf0 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 49  ..**.**   (9)  I
1fd00 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
1fd10 73 65 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74  ses LIMIT then t
1fd20 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d  he outer query m
1fd30 61 79 20 6e 6f 74 20 62 65 20 61 67 67 72 65 67  ay not be aggreg
1fd40 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  ate..**.**  (**)
1fd50 20 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31    Restriction (1
1fd60 30 29 20 77 61 73 20 72 65 6d 6f 76 65 64 20 66  0) was removed f
1fd70 72 6f 6d 20 74 68 65 20 63 6f 64 65 20 6f 6e 20  rom the code on 
1fd80 32 30 30 35 2d 30 32 2d 30 35 20 62 75 74 20 77  2005-02-05 but w
1fd90 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 63 63 69  e.**        acci
1fda0 64 65 6e 74 6c 79 20 63 61 72 72 69 65 64 20 74  dently carried t
1fdb0 68 65 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 77 61  he comment forwa
1fdc0 72 64 20 75 6e 74 69 6c 20 32 30 31 34 2d 30 39  rd until 2014-09
1fdd0 2d 31 35 2e 20 20 4f 72 69 67 69 6e 61 6c 0a 2a  -15.  Original.*
1fde0 2a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61  *        constra
1fdf0 69 6e 74 3a 20 22 49 66 20 74 68 65 20 73 75 62  int: "If the sub
1fe00 71 75 65 72 79 20 69 73 20 61 67 67 72 65 67 61  query is aggrega
1fe10 74 65 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65  te then the oute
1fe20 72 20 71 75 65 72 79 20 0a 2a 2a 20 20 20 20 20  r query .**     
1fe30 20 20 20 6d 61 79 20 6e 6f 74 20 75 73 65 20 4c     may not use L
1fe40 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31  IMIT.".**.**  (1
1fe50 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
1fe60 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71   and the outer q
1fe70 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 6f 74  uery may not bot
1fe80 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59 20  h have ORDER BY 
1fe90 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  clauses..**.**  
1fea0 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d  (**)  Not implem
1feb0 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64  ented.  Subsumed
1fec0 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f   into restrictio
1fed0 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72 65 76  n (3).  Was prev
1fee0 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20  iously.**       
1fef0 20 61 20 73 65 70 61 72 61 74 65 20 72 65 73 74   a separate rest
1ff00 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67  riction deriving
1ff10 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35   from ticket #35
1ff20 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20  0..**.**  (13)  
1ff30 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
1ff40 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79   outer query may
1ff50 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49   not both use LI
1ff60 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29  MIT..**.**  (14)
1ff70 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 6d    The subquery m
1ff80 61 79 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45  ay not use OFFSE
1ff90 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20  T..**.**  (15)  
1ffa0 49 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  If the outer que
1ffb0 72 79 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  ry is part of a 
1ffc0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
1ffd0 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 20   then the.**    
1ffe0 20 20 20 20 73 75 62 71 75 65 72 79 20 6d 61 79      subquery may
1fff0 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 2e 0a   not use LIMIT..
20000 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65 20 74  **        (See t
20010 69 63 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20  icket #2339 and 
20020 74 69 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64  ticket [02a8e81d
20030 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36  44])..**.**  (16
20040 29 20 20 49 66 20 74 68 65 20 6f 75 74 65 72 20  )  If the outer 
20050 71 75 65 72 79 20 69 73 20 61 67 67 72 65 67 61  query is aggrega
20060 74 65 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62  te, then the sub
20070 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 0a 2a 2a  query may not.**
20080 20 20 20 20 20 20 20 20 75 73 65 20 4f 52 44 45          use ORDE
20090 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23  R BY.  (Ticket #
200a0 32 39 34 32 29 20 20 54 68 69 73 20 75 73 65 64  2942)  This used
200b0 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a   to not matter.*
200c0 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77  *        until w
200d0 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65  e introduced the
200e0 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20   group_concat() 
200f0 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a  function.  .**.*
20100 2a 20 20 28 31 37 29 20 20 49 66 20 74 68 65 20  *  (17)  If the 
20110 73 75 62 71 75 65 72 79 20 69 73 20 61 20 63 6f  subquery is a co
20120 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74  mpound select, t
20130 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 31  hen.**        (1
20140 37 61 29 20 61 6c 6c 20 63 6f 6d 70 6f 75 6e 64  7a) all compound
20150 20 6f 70 65 72 61 74 6f 72 73 20 6d 75 73 74 20   operators must 
20160 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  be a UNION ALL, 
20170 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 31  and.**        (1
20180 37 62 29 20 6e 6f 20 74 65 72 6d 73 20 77 69 74  7b) no terms wit
20190 68 69 6e 20 74 68 65 20 73 75 62 71 75 65 72 79  hin the subquery
201a0 20 63 6f 6d 70 6f 75 6e 64 20 6d 61 79 20 62 65   compound may be
201b0 20 61 67 67 72 65 67 61 74 65 0a 2a 2a 20 20 20   aggregate.**   
201c0 20 20 20 20 20 20 20 20 20 20 20 6f 72 20 44 49             or DI
201d0 53 54 49 4e 43 54 2c 20 61 6e 64 0a 2a 2a 20 20  STINCT, and.**  
201e0 20 20 20 20 20 20 28 31 37 63 29 20 65 76 65 72        (17c) ever
201f0 79 20 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68  y term within th
20200 65 20 73 75 62 71 75 65 72 79 20 63 6f 6d 70 6f  e subquery compo
20210 75 6e 64 20 6d 75 73 74 20 68 61 76 65 20 61 20  und must have a 
20220 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 20  FROM clause.**  
20230 20 20 20 20 20 20 28 31 37 64 29 20 74 68 65 20        (17d) the 
20240 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20  outer query may 
20250 6e 6f 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20  not be.**       
20260 20 20 20 20 20 20 20 28 31 37 64 31 29 20 61 67         (17d1) ag
20270 67 72 65 67 61 74 65 2c 20 6f 72 0a 2a 2a 20 20  gregate, or.**  
20280 20 20 20 20 20 20 20 20 20 20 20 20 28 31 37 64              (17d
20290 32 29 20 44 49 53 54 49 4e 43 54 2c 20 6f 72 0a  2) DISTINCT, or.
202a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
202b0 28 31 37 64 33 29 20 61 20 6a 6f 69 6e 2e 0a 2a  (17d3) a join..*
202c0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20  *.**        The 
202d0 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62 2d 71  parent and sub-q
202e0 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e  uery may contain
202f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20   WHERE clauses. 
20300 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20  Subject to.**   
20310 20 20 20 20 20 72 75 6c 65 73 20 28 31 31 29 2c       rules (11),
20320 20 28 31 33 29 20 61 6e 64 20 28 31 34 29 2c 20   (13) and (14), 
20330 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f  they may also co
20340 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a  ntain ORDER BY,.
20350 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49 54 20  **        LIMIT 
20360 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73  and OFFSET claus
20370 65 73 2e 20 20 54 68 65 20 73 75 62 71 75 65 72  es.  The subquer
20380 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79  y cannot use any
20390 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20   compound.**    
203a0 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f 74 68      operator oth
203b0 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c  er than UNION AL
203c0 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68  L because all th
203d0 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64  e other compound
203e0 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61  .**        opera
203f0 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69 6d 70  tors have an imp
20400 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20 77 68  lied DISTINCT wh
20410 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f 77 65  ich is disallowe
20420 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20 20 72  d by.**        r
20430 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a  estriction (4)..
20440 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c 73  **.**        Als
20450 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e  o, each componen
20460 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65  t of the sub-que
20470 72 79 20 6d 75 73 74 20 72 65 74 75 72 6e 20 74  ry must return t
20480 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a  he same number.*
20490 2a 20 20 20 20 20 20 20 20 6f 66 20 72 65 73 75  *        of resu
204a0 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73  lt columns. This
204b0 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 72   is actually a r
204c0 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72 20 61  equirement for a
204d0 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  ny compound.**  
204e0 20 20 20 20 20 20 53 45 4c 45 43 54 20 73 74 61        SELECT sta
204f0 74 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20  tement, but all 
20500 74 68 65 20 63 6f 64 65 20 68 65 72 65 20 64 6f  the code here do
20510 65 73 20 69 73 20 6d 61 6b 65 20 73 75 72 65 20  es is make sure 
20520 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20  that no.**      
20530 20 20 73 75 63 68 20 28 69 6c 6c 65 67 61 6c 29    such (illegal)
20540 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 66 6c   sub-query is fl
20550 61 74 74 65 6e 65 64 2e 20 54 68 65 20 63 61 6c  attened. The cal
20560 6c 65 72 20 77 69 6c 6c 20 64 65 74 65 63 74 20  ler will detect 
20570 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 79  the.**        sy
20580 6e 74 61 78 20 65 72 72 6f 72 20 61 6e 64 20 72  ntax error and r
20590 65 74 75 72 6e 20 61 20 64 65 74 61 69 6c 65 64  eturn a detailed
205a0 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20   message..**.** 
205b0 20 28 31 38 29 20 20 49 66 20 74 68 65 20 73 75   (18)  If the su
205c0 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
205d0 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68  pound select, th
205e0 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  en all terms of 
205f0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52  the.**        OR
20600 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 66  DER BY clause of
20610 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74   the parent must
20620 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72   be simple refer
20630 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20  ences to .**    
20640 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74      columns of t
20650 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a  he sub-query..**
20660 0a 2a 2a 20 20 28 31 39 29 20 20 49 66 20 74 68  .**  (19)  If th
20670 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
20680 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f  LIMIT then the o
20690 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
206a0 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76  ot.**        hav
206b0 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  e a WHERE clause
206c0 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49  ..**.**  (20)  I
206d0 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
206e0 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  is a compound se
206f0 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75  lect, then it mu
20700 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20  st not use.**   
20710 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59       an ORDER BY
20720 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74   clause.  Ticket
20730 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c   #3773.  We coul
20740 64 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e  d relax this con
20750 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20  straint.**      
20760 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61    somewhat by sa
20770 79 69 6e 67 20 74 68 61 74 20 74 68 65 20 74 65  ying that the te
20780 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
20790 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a   BY clause must.
207a0 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65 61 72  **        appear
207b0 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72   as unmodified r
207c0 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e  esult columns in
207d0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
207e0 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20 20 20 20  .  But we.**    
207f0 20 20 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f      have other o
20800 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20  ptimizations in 
20810 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74  mind to deal wit
20820 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a  h that case..**.
20830 2a 2a 20 20 28 32 31 29 20 20 49 66 20 74 68 65  **  (21)  If the
20840 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c   subquery uses L
20850 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75  IMIT then the ou
20860 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f  ter query may no
20870 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 44  t be.**        D
20880 49 53 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74  ISTINCT.  (See t
20890 69 63 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66  icket [752e1646f
208a0 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29  c])..**.**  (22)
208b0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 6d    The subquery m
208c0 61 79 20 6e 6f 74 20 62 65 20 61 20 72 65 63 75  ay not be a recu
208d0 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a  rsive CTE..**.**
208e0 20 20 28 2a 2a 29 20 20 53 75 62 73 75 6d 65 64    (**)  Subsumed
208f0 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f   into restrictio
20900 6e 20 28 31 37 64 33 29 2e 20 20 57 61 73 3a 20  n (17d3).  Was: 
20910 49 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  If the outer que
20920 72 79 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20  ry is.**        
20930 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2c  a recursive CTE,
20940 20 74 68 65 6e 20 74 68 65 20 73 75 62 2d 71 75   then the sub-qu
20950 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61  ery may not be a
20960 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e   compound query.
20970 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 69 73 20  .**        This 
20980 72 65 73 74 72 69 63 74 69 6f 6e 20 69 73 20 62  restriction is b
20990 65 63 61 75 73 65 20 74 72 61 6e 73 66 6f 72 6d  ecause transform
209a0 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ing the.**      
209b0 20 20 70 61 72 65 6e 74 20 74 6f 20 61 20 63 6f    parent to a co
209c0 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 63 6f 6e  mpound query con
209d0 66 75 73 65 73 20 74 68 65 20 63 6f 64 65 20 74  fuses the code t
209e0 68 61 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 20  hat handles.**  
209f0 20 20 20 20 20 20 72 65 63 75 72 73 69 76 65 20        recursive 
20a00 71 75 65 72 69 65 73 20 69 6e 20 6d 75 6c 74 69  queries in multi
20a10 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20  Select()..**.** 
20a20 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e   (**)  We no lon
20a30 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66  ger attempt to f
20a40 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61 74 65  latten aggregate
20a50 20 73 75 62 71 75 65 72 69 65 73 2e 20 20 57 61   subqueries.  Wa
20a60 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65  s:.**        The
20a70 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f   subquery may no
20a80 74 20 62 65 20 61 6e 20 61 67 67 72 65 67 61 74  t be an aggregat
20a90 65 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20  e that uses the 
20aa0 62 75 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 20 6f  built-in min() o
20ab0 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72 20  r .**        or 
20ac0 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e  max() functions.
20ad0 20 20 28 57 69 74 68 6f 75 74 20 74 68 69 73 20    (Without this 
20ae0 72 65 73 74 72 69 63 74 69 6f 6e 2c 20 61 20 71  restriction, a q
20af0 75 65 72 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20  uery like:.**   
20b00 20 20 20 20 20 22 53 45 4c 45 43 54 20 78 20 46       "SELECT x F
20b10 52 4f 4d 20 28 53 45 4c 45 43 54 20 6d 61 78 28  ROM (SELECT max(
20b20 79 29 2c 20 78 20 46 52 4f 4d 20 74 31 29 22 20  y), x FROM t1)" 
20b30 77 6f 75 6c 64 20 6e 6f 74 20 6e 65 63 65 73 73  would not necess
20b40 61 72 69 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20  arily.**        
20b50 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  return the value
20b60 20 58 20 66 6f 72 20 77 68 69 63 68 20 59 20 77   X for which Y w
20b70 61 73 20 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a  as maximal.).**.
20b80 2a 2a 20 20 28 32 35 29 20 20 49 66 20 65 69 74  **  (25)  If eit
20b90 68 65 72 20 74 68 65 20 73 75 62 71 75 65 72 79  her the subquery
20ba0 20 6f 72 20 74 68 65 20 70 61 72 65 6e 74 20 71   or the parent q
20bb0 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 61 20  uery contains a 
20bc0 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 20 20 20 20  window.**       
20bd0 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68 65   function in the
20be0 20 73 65 6c 65 63 74 20 6c 69 73 74 20 6f 72 20   select list or 
20bf0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
20c00 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 20   flattening.**  
20c10 20 20 20 20 20 20 69 73 20 6e 6f 74 20 61 74 74        is not att
20c20 65 6d 70 74 65 64 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a  empted..**.**.**
20c30 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65   In this routine
20c40 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d 65  , the "p" parame
20c50 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ter is a pointer
20c60 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75   to the outer qu
20c70 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71  ery..** The subq
20c80 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d  uery is p->pSrc-
20c90 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67  >a[iFrom].  isAg
20ca0 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
20cb0 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20   outer query.** 
20cc0 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73 2e  uses aggregates.
20cd0 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65  .**.** If flatte
20ce0 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65  ning is not atte
20cf0 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74  mpted, this rout
20d00 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61  ine is a no-op a
20d10 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a  nd returns 0..**
20d20 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
20d30 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69 73  s attempted this
20d40 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
20d50 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66   1..**.** All of
20d60 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
20d70 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63  analysis must oc
20d80 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20  cur on both the 
20d90 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a  outer query and.
20da0 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79 20  ** the subquery 
20db0 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
20dc0 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61  ine runs..*/.sta
20dd0 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53  tic int flattenS
20de0 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73 65  ubquery(.  Parse
20df0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
20e00 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
20e10 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
20e20 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p,           /* 
20e30 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75  The parent or ou
20e40 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  ter SELECT state
20e50 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46  ment */.  int iF
20e60 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rom,           /
20e70 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53  * Index in p->pS
20e80 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69  rc->a[] of the i
20e90 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f  nner subquery */
20ea0 0a 20 20 69 6e 74 20 69 73 41 67 67 20 20 20 20  .  int isAgg    
20eb0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
20ec0 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  if outer SELECT 
20ed0 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
20ee0 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  unctions */.){. 
20ef0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61   const char *zSa
20f00 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  vedAuthContext =
20f10 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
20f20 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20  ntext;.  Select 
20f30 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 2f 2a 20  *pParent;    /* 
20f40 43 75 72 72 65 6e 74 20 55 4e 49 4f 4e 20 41 4c  Current UNION AL
20f50 4c 20 74 65 72 6d 20 6f 66 20 74 68 65 20 6f 74  L term of the ot
20f60 68 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53  her query */.  S
20f70 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20  elect *pSub;    
20f80 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20     /* The inner 
20f90 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75 65  query or "subque
20fa0 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ry" */.  Select 
20fb0 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a 20  *pSub1;      /* 
20fc0 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72  Pointer to the r
20fd0 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74 20  ightmost select 
20fe0 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a  in sub-query */.
20ff0 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
21000 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
21010 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
21020 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
21030 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72   SrcList *pSubSr
21040 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
21050 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
21060 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  ubquery */.  int
21070 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20   iParent;       
21080 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20   /* VDBE cursor 
21090 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53  number of the pS
210a0 75 62 20 72 65 73 75 6c 74 20 73 65 74 20 74 65  ub result set te
210b0 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  mp table */.  in
210c0 74 20 69 4e 65 77 50 61 72 65 6e 74 20 3d 20 2d  t iNewParent = -
210d0 31 3b 2f 2a 20 52 65 70 6c 61 63 65 6d 65 6e 74  1;/* Replacement
210e0 20 74 61 62 6c 65 20 66 6f 72 20 69 50 61 72 65   table for iPare
210f0 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c 65  nt */.  int isLe
21100 66 74 4a 6f 69 6e 20 3d 20 30 3b 20 2f 2a 20 54  ftJoin = 0; /* T
21110 72 75 65 20 69 66 20 70 53 75 62 20 69 73 20 74  rue if pSub is t
21120 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f 66  he right side of
21130 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 20   a LEFT JOIN */ 
21140 20 20 20 0a 20 20 69 6e 74 20 69 3b 20 20 20 20     .  int i;    
21150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
21160 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45  p counter */.  E
21170 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20  xpr *pWhere;    
21180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21190 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
211a0 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
211b0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
211c0 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65  ubitem;   /* The
211d0 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 73   subquery */.  s
211e0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
211f0 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43  rse->db;..  /* C
21200 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66  heck to see if f
21210 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72  lattening is per
21220 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20  mitted.  Return 
21230 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20  0 if not..  */. 
21240 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
21250 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
21260 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28  rior==0 );.  if(
21270 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73   OptimizationDis
21280 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
21290 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72 29  _QueryFlattener)
212a0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
212b0 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
212c0 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26 26   assert( pSrc &&
212d0 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72   iFrom>=0 && iFr
212e0 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b  om<pSrc->nSrc );
212f0 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70  .  pSubitem = &p
21300 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20  Src->a[iFrom];. 
21310 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62 69   iParent = pSubi
21320 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
21330 70 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d 2d  pSub = pSubitem-
21340 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65  >pSelect;.  asse
21350 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 0a  rt( pSub!=0 );..
21360 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
21370 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20  MIT_WINDOWFUNC. 
21380 20 69 66 28 20 70 2d 3e 70 57 69 6e 20 7c 7c 20   if( p->pWin || 
21390 70 53 75 62 2d 3e 70 57 69 6e 20 29 20 72 65 74  pSub->pWin ) ret
213a0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
213b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
213c0 69 63 74 69 6f 6e 20 28 32 35 29 20 2a 2f 0a 23  iction (25) */.#
213d0 65 6e 64 69 66 0a 0a 20 20 70 53 75 62 53 72 63  endif..  pSubSrc
213e0 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20   = pSub->pSrc;. 
213f0 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72 63   assert( pSubSrc
21400 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74   );.  /* Prior t
21410 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c  o version 3.1.2,
21420 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20   when LIMIT and 
21430 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20 62 65  OFFSET had to be
21440 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74   simple constant
21450 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69  s,.  ** not arbi
21460 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e  trary expression
21470 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f  s, we allowed so
21480 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20  me combining of 
21490 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
214a0 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68  .  ** because th
214b0 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70  ey could be comp
214c0 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  uted at compile-
214d0 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20  time.  But when 
214e0 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
214f0 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62  .  ** became arb
21500 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f  itrary expressio
21510 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63  ns, we were forc
21520 65 64 20 74 6f 20 61 64 64 20 72 65 73 74 72 69  ed to add restri
21530 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a  ctions (13).  **
21540 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20   and (14). */.  
21550 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
21560 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20   && p->pLimit ) 
21570 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
21580 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
21590 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20  ction (13) */.  
215a0 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
215b0 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74   && pSub->pLimit
215c0 2d 3e 65 58 3d 3d 45 58 5f 52 69 67 68 74 20 29  ->eX==EX_Right )
215d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
215e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
21610 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a  striction (14) *
21620 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  /.  }.  if( (p->
21630 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f  selFlags & SF_Co
21640 6d 70 6f 75 6e 64 29 21 3d 30 20 26 26 20 70 53  mpound)!=0 && pS
21650 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  ub->pLimit ){.  
21660 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
21670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21690 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
216a0 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20  ction (15) */.  
216b0 7d 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d  }.  if( pSubSrc-
216c0 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72  >nSrc==0 ) retur
216d0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
216e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
216f0 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a  striction (7)  *
21700 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65  /.  if( pSub->se
21710 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
21720 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b  inct ) return 0;
21730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
21740 73 74 72 69 63 74 69 6f 6e 20 28 34 29 20 20 2a  striction (4)  *
21750 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
21760 69 6d 69 74 20 26 26 20 28 70 53 72 63 2d 3e 6e  imit && (pSrc->n
21770 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20  Src>1 || isAgg) 
21780 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
21790 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73  ;         /* Res
217a0 74 72 69 63 74 69 6f 6e 73 20 28 38 29 28 39 29  trictions (8)(9)
217b0 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d   */.  }.  if( p-
217c0 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70 53 75  >pOrderBy && pSu
217d0 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
217e0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
217f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21810 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
21820 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20  iction (11) */. 
21830 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20 26   }.  if( isAgg &
21840 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  & pSub->pOrderBy
21850 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
21860 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
21870 65 73 74 72 69 63 74 69 6f 6e 20 28 31 36 29 20  estriction (16) 
21880 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
21890 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 57 68 65  Limit && p->pWhe
218a0 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  re ) return 0;  
218b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
218c0 65 73 74 72 69 63 74 69 6f 6e 20 28 31 39 29 20  estriction (19) 
218d0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
218e0 4c 69 6d 69 74 20 26 26 20 28 70 2d 3e 73 65 6c  Limit && (p->sel
218f0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
21900 6e 63 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  nct)!=0 ){.     
21910 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
21920 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
21930 20 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69   (21) */.  }.  i
21940 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  f( pSub->selFlag
21950 73 20 26 20 28 53 46 5f 52 65 63 75 72 73 69 76  s & (SF_Recursiv
21960 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
21970 20 30 3b 20 2f 2a 20 52 65 73 74 72 69 63 74 69   0; /* Restricti
21980 6f 6e 73 20 28 32 32 29 20 2a 2f 0a 20 20 7d 0a  ons (22) */.  }.
21990 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  /*.  ** If th
219a0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68  e subquery is th
219b0 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
219c0 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20  of a LEFT JOIN, 
219d0 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 73 75  then the.  ** su
219e0 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62  bquery may not b
219f0 65 20 61 20 6a 6f 69 6e 20 69 74 73 65 6c 66 20  e a join itself 
21a00 28 33 61 29 2e 20 45 78 61 6d 70 6c 65 20 6f 66  (3a). Example of
21a10 20 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74   why this is not
21a20 0a 20 20 2a 2a 20 61 6c 6c 6f 77 65 64 3a 0a 20  .  ** allowed:. 
21a30 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
21a40 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a   t1 LEFT OUTER J
21a50 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29  OIN (t2 JOIN t3)
21a60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
21a70 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
21a80 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
21a90 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
21aa0 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
21ab0 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20  R JOIN t2) JOIN 
21ac0 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69  t3.  **.  ** whi
21ad0 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c  ch is not at all
21ae0 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e   the same thing.
21af0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
21b00 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68  e subquery is th
21b10 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
21b20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20  of a LEFT JOIN, 
21b30 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 0a 20  then the outer. 
21b40 20 2a 2a 20 71 75 65 72 79 20 63 61 6e 6e 6f 74   ** query cannot
21b50 20 62 65 20 61 6e 20 61 67 67 72 65 67 61 74 65   be an aggregate
21b60 2e 20 28 33 63 29 20 20 54 68 69 73 20 69 73 20  . (3c)  This is 
21b70 61 6e 20 61 72 74 69 66 61 63 74 20 6f 66 20 74  an artifact of t
21b80 68 65 20 77 61 79 0a 20 20 2a 2a 20 61 67 67 72  he way.  ** aggr
21b90 65 67 61 74 65 73 20 61 72 65 20 70 72 6f 63 65  egates are proce
21ba0 73 73 65 64 20 2d 20 74 68 65 72 65 20 69 73 20  ssed - there is 
21bb0 6e 6f 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f 20  no mechanism to 
21bc0 64 65 74 65 72 6d 69 6e 65 20 69 66 0a 20 20 2a  determine if.  *
21bd0 2a 20 74 68 65 20 4c 45 46 54 20 4a 4f 49 4e 20  * the LEFT JOIN 
21be0 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20  table should be 
21bf0 61 6c 6c 2d 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20  all-NULL..  **. 
21c00 20 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 69 63   ** See also tic
21c10 6b 65 74 73 20 23 33 30 36 2c 20 23 33 35 30 2c  kets #306, #350,
21c20 20 61 6e 64 20 23 33 33 30 30 2e 0a 20 20 2a 2f   and #3300..  */
21c30 0a 20 20 69 66 28 20 28 70 53 75 62 69 74 65 6d  .  if( (pSubitem
21c40 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20  ->fg.jointype & 
21c50 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a  JT_OUTER)!=0 ){.
21c60 20 20 20 20 69 73 4c 65 66 74 4a 6f 69 6e 20 3d      isLeftJoin =
21c70 20 31 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62   1;.    if( pSub
21c80 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69  Src->nSrc>1 || i
21c90 73 41 67 67 20 7c 7c 20 49 73 56 69 72 74 75 61  sAgg || IsVirtua
21ca0 6c 28 70 53 75 62 53 72 63 2d 3e 61 5b 30 5d 2e  l(pSubSrc->a[0].
21cb0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 2f  pTab) ){.      /
21cc0 2a 20 20 28 33 61 29 20 20 20 20 20 20 20 20 20  *  (3a)         
21cd0 20 20 20 20 28 33 63 29 20 20 20 20 20 28 33 62      (3c)     (3b
21ce0 29 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  ) */.      retur
21cf0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  n 0;.    }.  }.#
21d00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54  ifdef SQLITE_EXT
21d10 52 41 5f 49 46 4e 55 4c 4c 52 4f 57 0a 20 20 65  RA_IFNULLROW.  e
21d20 6c 73 65 20 69 66 28 20 69 46 72 6f 6d 3e 30 20  lse if( iFrom>0 
21d30 26 26 20 21 69 73 41 67 67 20 29 7b 0a 20 20 20  && !isAgg ){.   
21d40 20 2f 2a 20 53 65 74 74 69 6e 67 20 69 73 4c 65   /* Setting isLe
21d50 66 74 4a 6f 69 6e 20 74 6f 20 2d 31 20 63 61 75  ftJoin to -1 cau
21d60 73 65 73 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77  ses OP_IfNullRow
21d70 20 6f 70 63 6f 64 65 73 20 74 6f 20 62 65 20 67   opcodes to be g
21d80 65 6e 65 72 61 74 65 64 20 66 6f 72 0a 20 20 20  enerated for.   
21d90 20 2a 2a 20 65 76 65 72 79 20 72 65 66 65 72 65   ** every refere
21da0 6e 63 65 20 74 6f 20 61 6e 79 20 72 65 73 75 6c  nce to any resul
21db0 74 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 73 75  t column from su
21dc0 62 71 75 65 72 79 20 69 6e 20 61 20 6a 6f 69 6e  bquery in a join
21dd0 2c 20 65 76 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , even.    ** th
21de0 6f 75 67 68 20 74 68 65 79 20 61 72 65 20 6e 6f  ough they are no
21df0 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  t necessary.  Th
21e00 69 73 20 77 69 6c 6c 20 73 74 72 65 73 73 2d 74  is will stress-t
21e10 65 73 74 20 74 68 65 20 4f 50 5f 49 66 4e 75 6c  est the OP_IfNul
21e20 6c 52 6f 77 20 0a 20 20 20 20 2a 2a 20 6f 70 63  lRow .    ** opc
21e30 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 69 73 4c 65  ode. */.    isLe
21e40 66 74 4a 6f 69 6e 20 3d 20 2d 31 3b 0a 20 20 7d  ftJoin = -1;.  }
21e50 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65  .#endif..  /* Re
21e60 73 74 72 69 63 74 69 6f 6e 20 28 31 37 29 3a 20  striction (17): 
21e70 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
21e80 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   is a compound S
21e90 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74 20 6d  ELECT, then it m
21ea0 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c  ust.  ** use onl
21eb0 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20  y the UNION ALL 
21ec0 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f  operator. And no
21ed0 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65  ne of the simple
21ee0 20 73 65 6c 65 63 74 20 71 75 65 72 69 65 73 0a   select queries.
21ef0 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20 75    ** that make u
21f00 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53  p the compound S
21f10 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f 77 65  ELECT are allowe
21f20 64 20 74 6f 20 62 65 20 61 67 67 72 65 67 61 74  d to be aggregat
21f30 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a 20 20  e or distinct.  
21f40 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f  ** queries..  */
21f50 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72  .  if( pSub->pPr
21f60 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ior ){.    if( p
21f70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
21f80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
21f90 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
21fa0 20 28 32 30 29 20 2a 2f 0a 20 20 20 20 7d 0a 20   (20) */.    }. 
21fb0 20 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20     if( isAgg || 
21fc0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
21fd0 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c  F_Distinct)!=0 |
21fe0 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  | pSrc->nSrc!=1 
21ff0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
22000 30 3b 20 2f 2a 20 28 31 37 64 31 29 2c 20 28 31  0; /* (17d1), (1
22010 37 64 32 29 2c 20 6f 72 20 28 31 37 64 33 29 20  7d2), or (17d3) 
22020 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  */.    }.    for
22030 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75  (pSub1=pSub; pSu
22040 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d  b1; pSub1=pSub1-
22050 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20  >pPrior){.      
22060 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31  testcase( (pSub1
22070 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
22080 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
22090 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73  regate))==SF_Dis
220a0 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74  tinct );.      t
220b0 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d  estcase( (pSub1-
220c0 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
220d0 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
220e0 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72  egate))==SF_Aggr
220f0 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20 61  egate );.      a
22100 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 53 72  ssert( pSub->pSr
22110 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  c!=0 );.      as
22120 73 65 72 74 28 20 70 53 75 62 2d 3e 70 45 4c 69  sert( pSub->pELi
22130 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 53 75 62 31  st->nExpr==pSub1
22140 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
22150 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53  );.      if( (pS
22160 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
22170 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
22180 41 67 67 72 65 67 61 74 65 29 29 21 3d 30 20 20  Aggregate))!=0  
22190 20 20 2f 2a 20 28 31 37 62 29 20 2a 2f 0a 20 20    /* (17b) */.  
221a0 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e       || (pSub1->
221b0 70 50 72 69 6f 72 20 26 26 20 70 53 75 62 31 2d  pPrior && pSub1-
221c0 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 20 20 20  >op!=TK_ALL)    
221d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
221e0 28 31 37 61 29 20 2a 2f 0a 20 20 20 20 20 20 20  (17a) */.       
221f0 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e  || pSub1->pSrc->
22200 6e 53 72 63 3c 31 20 20 20 20 20 20 20 20 20 20  nSrc<1          
22210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22220 20 20 20 20 20 20 20 20 2f 2a 20 28 31 37 63 29          /* (17c)
22230 20 2a 2f 0a 20 20 20 20 20 20 29 7b 0a 20 20 20   */.      ){.   
22240 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
22250 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
22260 74 63 61 73 65 28 20 70 53 75 62 31 2d 3e 70 53  tcase( pSub1->pS
22270 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20 20  rc->nSrc>1 );.  
22280 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74    }..    /* Rest
22290 72 69 63 74 69 6f 6e 20 28 31 38 29 2e 20 2a 2f  riction (18). */
222a0 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64  .    if( p->pOrd
222b0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e  erBy ){.      in
222c0 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  t ii;.      for(
222d0 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64  ii=0; ii<p->pOrd
222e0 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b  erBy->nExpr; ii+
222f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
22300 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  p->pOrderBy->a[i
22310 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  i].u.x.iOrderByC
22320 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ol==0 ) return 0
22330 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
22340 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 2d 72 65 73    }..  /* Ex-res
22350 74 72 69 63 74 69 6f 6e 20 28 32 33 29 3a 0a 20  triction (23):. 
22360 20 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 77 61 79   ** The only way
22370 20 74 68 61 74 20 74 68 65 20 72 65 63 75 72 73   that the recurs
22380 69 76 65 20 70 61 72 74 20 6f 66 20 61 20 43 54  ive part of a CT
22390 45 20 63 61 6e 20 63 6f 6e 74 61 69 6e 20 61 20  E can contain a 
223a0 63 6f 6d 70 6f 75 6e 64 0a 20 20 2a 2a 20 73 75  compound.  ** su
223b0 62 71 75 65 72 79 20 69 73 20 66 6f 72 20 74 68  bquery is for th
223c0 65 20 73 75 62 71 75 65 72 79 20 74 6f 20 62 65  e subquery to be
223d0 20 6f 6e 65 20 74 65 72 6d 20 6f 66 20 61 20 6a   one term of a j
223e0 6f 69 6e 2e 20 20 42 75 74 20 69 66 20 74 68 65  oin.  But if the
223f0 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69  .  ** subquery i
22400 73 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74  s a join, then t
22410 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 68 61  he flattening ha
22420 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  s already been s
22430 74 6f 70 70 65 64 20 62 79 0a 20 20 2a 2a 20 72  topped by.  ** r
22440 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37 64 33  estriction (17d3
22450 29 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ).  */.  assert(
22460 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
22470 53 46 5f 52 65 63 75 72 73 69 76 65 29 3d 3d 30  SF_Recursive)==0
22480 20 7c 7c 20 70 53 75 62 2d 3e 70 50 72 69 6f 72   || pSub->pPrior
22490 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 2a 2a 2a 2a  ==0 );..  /*****
224a0 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
224b0 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e  s point, flatten
224c0 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
224d0 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45 4c 45 43  . *****/.  SELEC
224e0 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c  TTRACE(1,pParse,
224f0 70 2c 28 22 66 6c 61 74 74 65 6e 20 25 75 2e 25  p,("flatten %u.%
22500 70 20 66 72 6f 6d 20 74 65 72 6d 20 25 64 5c 6e  p from term %d\n
22510 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
22520 20 20 20 20 20 20 70 53 75 62 2d 3e 73 65 6c 49        pSub->selI
22530 64 2c 20 70 53 75 62 2c 20 69 46 72 6f 6d 29 29  d, pSub, iFrom))
22540 3b 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a  ;..  /* Authoriz
22550 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a  e the subquery *
22560 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  /.  pParse->zAut
22570 68 43 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69  hContext = pSubi
22580 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45  tem->zName;.  TE
22590 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69  STONLY(i =) sqli
225a0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
225b0 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45  rse, SQLITE_SELE
225c0 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  CT, 0, 0, 0);.  
225d0 74 65 73 74 63 61 73 65 28 20 69 3d 3d 53 51 4c  testcase( i==SQL
225e0 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50  ITE_DENY );.  pP
225f0 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
22600 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43  xt = zSavedAuthC
22610 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66  ontext;..  /* If
22620 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
22630 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
22640 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ECT statement, t
22650 68 65 6e 20 28 62 79 20 72 65 73 74 72 69 63 74  hen (by restrict
22660 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64  ions.  ** 17 and
22670 20 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75   18 above) it mu
22680 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c  st be a UNION AL
22690 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74  L and the parent
226a0 20 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a   query must .  *
226b0 2a 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  * be of the form
226c0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
226d0 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73  SELECT <expr-lis
226e0 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75  t> FROM (<sub-qu
226f0 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61  ery>) <where-cla
22700 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  use> .  **.  ** 
22710 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20  followed by any 
22720 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20  ORDER BY, LIMIT 
22730 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c  and/or OFFSET cl
22740 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63  auses. This bloc
22750 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e  k.  ** creates N
22760 2d 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  -1 copies of the
22770 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 77 69   parent query wi
22780 74 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20  thout any ORDER 
22790 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20  BY, LIMIT or .  
227a0 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  ** OFFSET clause
227b0 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d  s and joins them
227c0 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e   to the left-han
227d0 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72  d-side of the or
227e0 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e  iginal.  ** usin
227f0 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  g UNION ALL oper
22800 61 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63  ators. In this c
22810 61 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ase N is the num
22820 62 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20  ber of simple.  
22830 2a 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  ** select statem
22840 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70  ents in the comp
22850 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a  ound sub-query..
22860 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c    **.  ** Exampl
22870 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  e:.  **.  **    
22880 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d   SELECT a+1 FROM
22890 20 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53   (.  **        S
228a0 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62  ELECT x FROM tab
228b0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49  .  **        UNI
228c0 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
228d0 20 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d     SELECT y FROM
228e0 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20   tab.  **       
228f0 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
22900 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 62         SELECT ab
22910 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32  s(z*2) FROM tab2
22920 0a 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52  .  **     ) WHER
22930 45 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20  E a!=5 ORDER BY 
22940 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e  1.  **.  ** Tran
22950 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20  sformed into:.  
22960 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
22970 43 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20  CT x+1 FROM tab 
22980 57 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a  WHERE x+1!=5.  *
22990 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a  *     UNION ALL.
229a0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
229b0 79 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45  y+1 FROM tab WHE
229c0 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  RE y+1!=5.  **  
229d0 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
229e0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73  *     SELECT abs
229f0 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62  (z*2)+1 FROM tab
22a00 32 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29  2 WHERE abs(z*2)
22a10 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f  +1!=5.  **     O
22a20 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20  RDER BY 1.  **. 
22a30 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73   ** We call this
22a40 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73   the "compound-s
22a50 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69  ubquery flatteni
22a60 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ng"..  */.  for(
22a70 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f  pSub=pSub->pPrio
22a80 72 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53  r; pSub; pSub=pS
22a90 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  ub->pPrior){.   
22aa0 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
22ab0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72     ExprList *pOr
22ac0 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
22ad0 72 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  rBy;.    Expr *p
22ae0 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
22af0 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  t;.    Select *p
22b00 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
22b10 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  r;.    p->pOrder
22b20 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  By = 0;.    p->p
22b30 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  Src = 0;.    p->
22b40 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
22b50 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
22b60 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
22b70 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
22b80 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 70 4c 69  , 0);.    p->pLi
22b90 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
22ba0 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
22bb0 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d  pOrderBy;.    p-
22bc0 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20  >pSrc = pSrc;.  
22bd0 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c    p->op = TK_ALL
22be0 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
22bf0 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 50  0 ){.      p->pP
22c00 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
22c10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22c20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70  pNew->pPrior = p
22c30 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28  Prior;.      if(
22c40 20 70 50 72 69 6f 72 20 29 20 70 50 72 69 6f 72   pPrior ) pPrior
22c50 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a  ->pNext = pNew;.
22c60 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78        pNew->pNex
22c70 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 2d 3e  t = p;.      p->
22c80 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20  pPrior = pNew;. 
22c90 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45       SELECTTRACE
22ca0 28 32 2c 70 50 61 72 73 65 2c 70 2c 28 22 63 6f  (2,pParse,p,("co
22cb0 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20  mpound-subquery 
22cc0 66 6c 61 74 74 65 6e 65 72 22 0a 20 20 20 20 20  flattener".     
22cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ce0 20 20 20 20 20 20 20 20 20 22 20 63 72 65 61 74           " creat
22cf0 65 73 20 25 75 20 61 73 20 70 65 65 72 5c 6e 22  es %u as peer\n"
22d00 2c 70 4e 65 77 2d 3e 73 65 6c 49 64 29 29 3b 0a  ,pNew->selId));.
22d10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62      }.    if( db
22d20 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
22d30 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
22d40 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74 74    /* Begin flatt
22d50 65 6e 69 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d  ening the iFrom-
22d60 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  th entry of the 
22d70 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a  FROM clause .  *
22d80 2a 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  * in the outer q
22d90 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75  uery..  */.  pSu
22da0 62 20 3d 20 70 53 75 62 31 20 3d 20 70 53 75 62  b = pSub1 = pSub
22db0 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a  item->pSelect;..
22dc0 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
22dd0 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20  transient table 
22de0 73 74 72 75 63 74 75 72 65 20 61 73 73 6f 63 69  structure associ
22df0 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  ated with the.  
22e00 2a 2a 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2f  ** subquery.  */
22e10 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
22e20 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a  (db, pSubitem->z
22e30 44 61 74 61 62 61 73 65 29 3b 0a 20 20 73 71 6c  Database);.  sql
22e40 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
22e50 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  Subitem->zName);
22e60 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
22e70 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a  (db, pSubitem->z
22e80 41 6c 69 61 73 29 3b 0a 20 20 70 53 75 62 69 74  Alias);.  pSubit
22e90 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
22ea0 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a  0;.  pSubitem->z
22eb0 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75 62  Name = 0;.  pSub
22ec0 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30  item->zAlias = 0
22ed0 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 53  ;.  pSubitem->pS
22ee0 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  elect = 0;..  /*
22ef0 20 44 65 66 65 72 20 64 65 6c 65 74 69 6e 67 20   Defer deleting 
22f00 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  the Table object
22f10 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
22f20 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
22f30 72 79 20 75 6e 74 69 6c 20 63 6f 64 65 20 67 65  ry until code ge
22f40 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  neration is.  **
22f50 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65   complete, since
22f60 20 74 68 65 72 65 20 6d 61 79 20 73 74 69 6c 6c   there may still
22f70 20 65 78 69 73 74 20 45 78 70 72 2e 70 54 61 62   exist Expr.pTab
22f80 20 65 6e 74 72 69 65 73 20 74 68 61 74 0a 20 20   entries that.  
22f90 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  ** refer to the 
22fa0 73 75 62 71 75 65 72 79 20 65 76 65 6e 20 61 66  subquery even af
22fb0 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20  ter flattening. 
22fc0 20 54 69 63 6b 65 74 20 23 33 33 34 36 2e 0a 20   Ticket #3346.. 
22fd0 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74 65   **.  ** pSubite
22fe0 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c 77 61 79  m->pTab is alway
22ff0 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74 65  s non-NULL by te
23000 73 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  st restrictions 
23010 61 6e 64 20 74 65 73 74 73 20 61 62 6f 76 65 2e  and tests above.
23020 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41  .  */.  if( ALWA
23030 59 53 28 70 53 75 62 69 74 65 6d 2d 3e 70 54 61  YS(pSubitem->pTa
23040 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 54 61 62  b!=0) ){.    Tab
23050 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20  le *pTabToDel = 
23060 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a  pSubitem->pTab;.
23070 20 20 20 20 69 66 28 20 70 54 61 62 54 6f 44 65      if( pTabToDe
23080 6c 2d 3e 6e 54 61 62 52 65 66 3d 3d 31 20 29 7b  l->nTabRef==1 ){
23090 0a 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 54  .      Parse *pT
230a0 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65  oplevel = sqlite
230b0 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
230c0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 70 54  Parse);.      pT
230d0 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f  abToDel->pNextZo
230e0 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65 76 65 6c  mbie = pToplevel
230f0 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20 20  ->pZombieTab;.  
23100 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70      pToplevel->p
23110 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70 54 61 62  ZombieTab = pTab
23120 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  ToDel;.    }else
23130 7b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65  {.      pTabToDe
23140 6c 2d 3e 6e 54 61 62 52 65 66 2d 2d 3b 0a 20 20  l->nTabRef--;.  
23150 20 20 7d 0a 20 20 20 20 70 53 75 62 69 74 65 6d    }.    pSubitem
23160 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a  ->pTab = 0;.  }.
23170 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
23180 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e  ing loop runs on
23190 63 65 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d  ce for each term
231a0 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73   in a compound-s
231b0 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61  ubquery.  ** fla
231c0 74 74 65 6e 69 6e 67 20 28 61 73 20 64 65 73 63  ttening (as desc
231d0 72 69 62 65 64 20 61 62 6f 76 65 29 2e 20 20 49  ribed above).  I
231e0 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
231f0 20 64 69 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a   different kind.
23200 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69    ** of flatteni
23210 6e 67 20 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e  ng - a flattenin
23220 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63  g other than a c
23230 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
23240 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20   flattening -.  
23250 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f  ** then this loo
23260 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65  p only runs once
23270 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
23280 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20   loop moves all 
23290 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d  of the FROM elem
232a0 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62 71  ents of the subq
232b0 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20  uery into the.  
232c0 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
232d0 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
232e0 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64  query.  Before d
232f0 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d  oing this, remem
23300 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72  ber.  ** the cur
23310 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
23320 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65  he original oute
23330 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65  r query FROM ele
23340 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61  ment in.  ** iPa
23350 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65  rent.  The iPare
23360 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e  nt cursor will n
23370 65 76 65 72 20 62 65 20 75 73 65 64 2e 20 20 53  ever be used.  S
23380 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20  ubsequent code. 
23390 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78   ** will scan ex
233a0 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e  pressions lookin
233b0 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65  g for iParent re
233c0 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70  ferences and rep
233d0 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20  lace.  ** those 
233e0 72 65 66 65 72 65 6e 63 65 73 20 77 69 74 68 20  references with 
233f0 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
23400 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20   resolve to the 
23410 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20  subquery FROM.  
23420 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61  ** elements we a
23430 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69  re now copying i
23440 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50  n..  */.  for(pP
23450 61 72 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74  arent=p; pParent
23460 3b 20 70 50 61 72 65 6e 74 3d 70 50 61 72 65 6e  ; pParent=pParen
23470 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75 62 3d  t->pPrior, pSub=
23480 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  pSub->pPrior){. 
23490 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a     int nSubSrc;.
234a0 20 20 20 20 75 38 20 6a 6f 69 6e 74 79 70 65 20      u8 jointype 
234b0 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 53 72 63  = 0;.    pSubSrc
234c0 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 20 20   = pSub->pSrc;  
234d0 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
234e0 65 20 6f 66 20 73 75 62 71 75 65 72 79 20 2a 2f  e of subquery */
234f0 0a 20 20 20 20 6e 53 75 62 53 72 63 20 3d 20 70  .    nSubSrc = p
23500 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f  SubSrc->nSrc;  /
23510 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
23520 73 20 69 6e 20 73 75 62 71 75 65 72 79 20 46 52  s in subquery FR
23530 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
23540 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d   pSrc = pParent-
23550 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52  >pSrc;     /* FR
23560 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
23570 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
23580 0a 20 20 20 20 69 66 28 20 70 53 72 63 20 29 7b  .    if( pSrc ){
23590 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
235a0 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a  Parent==p );  /*
235b0 20 46 69 72 73 74 20 74 69 6d 65 20 74 68 72 6f   First time thro
235c0 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a  ugh the loop */.
235d0 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d        jointype =
235e0 20 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f   pSubitem->fg.jo
235f0 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73  intype;.    }els
23600 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
23610 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20 20   pParent!=p );  
23620 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65  /* 2nd and subse
23630 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72 6f  quent times thro
23640 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a  ugh the loop */.
23650 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 50 61        pSrc = pPa
23660 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c  rent->pSrc = sql
23670 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
23680 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  d(db, 0, 0, 0);.
23690 20 20 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d        if( pSrc==
236a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
236b0 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
236c0 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
236d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
236e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
236f0 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
23700 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66  a single slot of
23710 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
23720 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20   of the outer.  
23730 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20    ** query.  If 
23740 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  the subquery has
23750 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65   more than one e
23760 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52  lement in its FR
23770 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a  OM clause,.    *
23780 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68  * then expand th
23790 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f  e outer query to
237a0 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20   make space for 
237b0 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65  it to hold all e
237c0 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f  lements.    ** o
237d0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
237e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78      **.    ** Ex
237f0 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
23800 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a    **    SELECT *
23810 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c   FROM tabA, (SEL
23820 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c  ECT * FROM sub1,
23830 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20   sub2), tabB;.  
23840 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
23850 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 73 20  outer query has 
23860 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46  3 slots in its F
23870 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65  ROM clause.  One
23880 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20   slot of the.   
23890 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20   ** outer query 
238a0 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74  (the middle slot
238b0 29 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  ) is used by the
238c0 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 65 20   subquery.  The 
238d0 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63  next.    ** bloc
238e0 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65  k of code will e
238f0 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  xpand the outer 
23900 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73  query FROM claus
23910 65 20 74 6f 20 34 20 73 6c 6f 74 73 2e 0a 20 20  e to 4 slots..  
23920 20 20 2a 2a 20 54 68 65 20 6d 69 64 64 6c 65 20    ** The middle 
23930 73 6c 6f 74 20 69 73 20 65 78 70 61 6e 64 65 64  slot is expanded
23940 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e   to two slots in
23950 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73   order to make s
23960 70 61 63 65 0a 20 20 20 20 2a 2a 20 66 6f 72 20  pace.    ** for 
23970 74 68 65 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73  the two elements
23980 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
23990 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  use of the subqu
239a0 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ery..    */.    
239b0 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b  if( nSubSrc>1 ){
239c0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
239d0 70 53 72 63 20 3d 20 70 53 72 63 20 3d 20 73 71  pSrc = pSrc = sq
239e0 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61  lite3SrcListEnla
239f0 72 67 65 28 64 62 2c 20 70 53 72 63 2c 20 6e 53  rge(db, pSrc, nS
23a00 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29  ubSrc-1,iFrom+1)
23a10 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  ;.      if( db->
23a20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
23a30 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
23a40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
23a50 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68    /* Transfer th
23a60 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
23a70 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62  rms from the sub
23a80 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20  query into the. 
23a90 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72     ** outer quer
23aa0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  y..    */.    fo
23ab0 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63  r(i=0; i<nSubSrc
23ac0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
23ad0 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
23ae0 65 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69 2b  e(db, pSrc->a[i+
23af0 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a  iFrom].pUsing);.
23b00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
23b10 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 66  rc->a[i+iFrom].f
23b20 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29  g.isTabFunc==0 )
23b30 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b  ;.      pSrc->a[
23b40 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53  i+iFrom] = pSubS
23b50 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
23b60 69 4e 65 77 50 61 72 65 6e 74 20 3d 20 70 53 75  iNewParent = pSu
23b70 62 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  bSrc->a[i].iCurs
23b80 6f 72 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  or;.      memset
23b90 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c  (&pSubSrc->a[i],
23ba0 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53   0, sizeof(pSubS
23bb0 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20  rc->a[i]));.    
23bc0 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46  }.    pSrc->a[iF
23bd0 72 6f 6d 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65  rom].fg.jointype
23be0 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 0a   = jointype;.  .
23bf0 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e      /* Now begin
23c00 20 73 75 62 73 74 69 74 75 74 69 6e 67 20 73 75   substituting su
23c10 62 71 75 65 72 79 20 72 65 73 75 6c 74 20 73 65  bquery result se
23c20 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f  t expressions fo
23c30 72 20 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65  r .    ** refere
23c40 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50 61 72  nces to the iPar
23c50 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72  ent in the outer
23c60 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20 0a   query..    ** .
23c70 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a      ** Example:.
23c80 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
23c90 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30  SELECT a+5, b*10
23ca0 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a   FROM (SELECT x*
23cb0 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20  3 AS a, y+10 AS 
23cc0 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45  b FROM t1) WHERE
23cd0 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20 5c   a>b;.    **   \
23ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23cf0 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
23d00 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f  ___ subquery ___
23d10 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20  _______/        
23d20 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c 5f    /.    **    \_
23d30 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23d40 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79  ____ outer query
23d50 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   _______________
23d60 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
23d70 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57  .    **.    ** W
23d80 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20  e look at every 
23d90 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
23da0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e  e outer query an
23db0 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
23dc0 20 73 65 65 0a 20 20 20 20 2a 2a 20 22 61 22 20   see.    ** "a" 
23dd0 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22 78  we substitute "x
23de0 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c  *3" and every pl
23df0 61 63 65 20 77 65 20 73 65 65 20 22 62 22 20 77  ace we see "b" w
23e00 65 20 73 75 62 73 74 69 74 75 74 65 20 22 79 2b  e substitute "y+
23e10 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  10"..    */.    
23e20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  if( pSub->pOrder
23e30 42 79 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  By ){.      /* A
23e40 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 6e  t this point, an
23e50 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f 72 64 65  y non-zero iOrde
23e60 72 42 79 43 6f 6c 20 76 61 6c 75 65 73 20 69 6e  rByCol values in
23e70 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 0a  dicate that the.
23e80 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42        ** ORDER B
23e90 59 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73  Y column express
23ea0 69 6f 6e 20 69 73 20 69 64 65 6e 74 69 63 61 6c  ion is identical
23eb0 20 74 6f 20 74 68 65 20 69 4f 72 64 65 72 42 79   to the iOrderBy
23ec0 43 6f 6c 27 74 68 0a 20 20 20 20 20 20 2a 2a 20  Col'th.      ** 
23ed0 65 78 70 72 65 73 73 69 6f 6e 20 72 65 74 75 72  expression retur
23ee0 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 73 74  ned by SELECT st
23ef0 61 74 65 6d 65 6e 74 20 70 53 75 62 2e 20 53 69  atement pSub. Si
23f00 6e 63 65 20 74 68 65 73 65 20 76 61 6c 75 65 73  nce these values
23f10 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74  .      ** do not
23f20 20 6e 65 63 65 73 73 61 72 69 6c 79 20 63 6f 72   necessarily cor
23f30 72 65 73 70 6f 6e 64 20 74 6f 20 63 6f 6c 75 6d  respond to colum
23f40 6e 73 20 69 6e 20 53 45 4c 45 43 54 20 73 74 61  ns in SELECT sta
23f50 74 65 6d 65 6e 74 20 70 50 61 72 65 6e 74 2c 0a  tement pParent,.
23f60 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68        ** zero th
23f70 65 6d 20 62 65 66 6f 72 65 20 74 72 61 6e 73 66  em before transf
23f80 65 72 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20  ering the ORDER 
23f90 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20  BY clause..     
23fa0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74   **.      ** Not
23fb0 20 64 6f 69 6e 67 20 74 68 69 73 20 6d 61 79 20   doing this may 
23fc0 63 61 75 73 65 20 61 6e 20 65 72 72 6f 72 20 69  cause an error i
23fd0 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 63  f a subsequent c
23fe0 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20 20  all to this.    
23ff0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 74    ** function at
24000 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65  tempts to flatte
24010 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62  n a compound sub
24020 2d 71 75 65 72 79 20 69 6e 74 6f 20 70 50 61 72  -query into pPar
24030 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 28 74 68  ent.      ** (th
24040 65 20 6f 6e 6c 79 20 77 61 79 20 74 68 69 73 20  e only way this 
24050 63 61 6e 20 68 61 70 70 65 6e 20 69 73 20 69 66  can happen is if
24060 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75   the compound su
24070 62 2d 71 75 65 72 79 20 69 73 0a 20 20 20 20 20  b-query is.     
24080 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 61   ** currently pa
24090 72 74 20 6f 66 20 70 53 75 62 2d 3e 70 53 72 63  rt of pSub->pSrc
240a0 29 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b 64  ). See ticket [d
240b0 31 31 61 36 65 39 30 38 66 5d 2e 20 20 2a 2f 0a  11a6e908f].  */.
240c0 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
240d0 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d  pOrderBy = pSub-
240e0 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20  >pOrderBy;.     
240f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
24100 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
24110 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65  ){.        pOrde
24120 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f  rBy->a[i].u.x.iO
24130 72 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a 20  rderByCol = 0;. 
24140 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
24150 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f  ert( pParent->pO
24160 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
24170 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64     pParent->pOrd
24180 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
24190 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72  .      pSub->pOr
241a0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d  derBy = 0;.    }
241b0 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71  .    pWhere = sq
241c0 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
241d0 20 70 53 75 62 2d 3e 70 57 68 65 72 65 2c 20 30   pSub->pWhere, 0
241e0 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4c 65 66  );.    if( isLef
241f0 74 4a 6f 69 6e 3e 30 20 29 7b 0a 20 20 20 20 20  tJoin>0 ){.     
24200 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 57 68   setJoinExpr(pWh
24210 65 72 65 2c 20 69 4e 65 77 50 61 72 65 6e 74 29  ere, iNewParent)
24220 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
24230 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 71  ent->pWhere = sq
24240 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
24250 20 70 57 68 65 72 65 2c 20 70 50 61 72 65 6e 74   pWhere, pParent
24260 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 69  ->pWhere);.    i
24270 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
24280 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  led==0 ){.      
24290 53 75 62 73 74 43 6f 6e 74 65 78 74 20 78 3b 0a  SubstContext x;.
242a0 20 20 20 20 20 20 78 2e 70 50 61 72 73 65 20 3d        x.pParse =
242b0 20 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 78   pParse;.      x
242c0 2e 69 54 61 62 6c 65 20 3d 20 69 50 61 72 65 6e  .iTable = iParen
242d0 74 3b 0a 20 20 20 20 20 20 78 2e 69 4e 65 77 54  t;.      x.iNewT
242e0 61 62 6c 65 20 3d 20 69 4e 65 77 50 61 72 65 6e  able = iNewParen
242f0 74 3b 0a 20 20 20 20 20 20 78 2e 69 73 4c 65 66  t;.      x.isLef
24300 74 4a 6f 69 6e 20 3d 20 69 73 4c 65 66 74 4a 6f  tJoin = isLeftJo
24310 69 6e 3b 0a 20 20 20 20 20 20 78 2e 70 45 4c 69  in;.      x.pELi
24320 73 74 20 3d 20 70 53 75 62 2d 3e 70 45 4c 69 73  st = pSub->pELis
24330 74 3b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65  t;.      substSe
24340 6c 65 63 74 28 26 78 2c 20 70 50 61 72 65 6e 74  lect(&x, pParent
24350 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  , 0);.    }.  . 
24360 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65     /* The flatte
24370 6e 65 64 20 71 75 65 72 79 20 69 73 20 64 69 73  ned query is dis
24380 74 69 6e 63 74 20 69 66 20 65 69 74 68 65 72 20  tinct if either 
24390 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65  the inner or the
243a0 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
243b0 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e  ery is distinct.
243c0 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61   .    */.    pPa
243d0 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  rent->selFlags |
243e0 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  = pSub->selFlags
243f0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a   & SF_Distinct;.
24400 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a    .    /*.    **
24410 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
24420 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d   (SELECT ... LIM
24430 49 54 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c  IT a OFFSET b) L
24440 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b  IMIT x OFFSET y;
24450 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f  .    **.    ** O
24460 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f  ne is tempted to
24470 20 74 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e   try to add a an
24480 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74  d b to combine t
24490 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20  he limits.  But 
244a0 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73  this.    ** does
244b0 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69 74   not work if eit
244c0 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65 67  her limit is neg
244d0 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ative..    */.  
244e0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
244f0 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  it ){.      pPar
24500 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53  ent->pLimit = pS
24510 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20  ub->pLimit;.    
24520 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d    pSub->pLimit =
24530 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
24540 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65   /* Finially, de
24550 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65 66  lete what is lef
24560 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
24570 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a  y and return.  *
24580 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a  * success..  */.
24590 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
245a0 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 31 29  elete(db, pSub1)
245b0 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ;..#if SELECTTRA
245c0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
245d0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
245e0 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20  ace & 0x100 ){. 
245f0 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
24600 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x100,pParse,p,("
24610 41 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67  After flattening
24620 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  :\n"));.    sqli
24630 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
24640 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a  t(0, p, 0);.  }.
24650 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
24660 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
24670 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
24680 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
24690 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
246a0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
246b0 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74 75  ./*.** A structu
246c0 72 65 20 74 6f 20 6b 65 65 70 20 74 72 61 63 6b  re to keep track
246d0 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 63   of all of the c
246e0 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 74 68 61  olumn values tha
246f0 74 20 66 69 78 65 64 20 74 6f 0a 2a 2a 20 61 20  t fixed to.** a 
24700 6b 6e 6f 77 6e 20 76 61 6c 75 65 20 64 75 65 20  known value due 
24710 74 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  to WHERE clause 
24720 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74  constraints of t
24730 68 65 20 66 6f 72 6d 20 43 4f 4c 55 4d 4e 3d 56  he form COLUMN=V
24740 41 4c 55 45 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ALUE..*/.typedef
24750 20 73 74 72 75 63 74 20 57 68 65 72 65 43 6f 6e   struct WhereCon
24760 73 74 20 57 68 65 72 65 43 6f 6e 73 74 3b 0a 73  st WhereConst;.s
24770 74 72 75 63 74 20 57 68 65 72 65 43 6f 6e 73 74  truct WhereConst
24780 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72   {.  Parse *pPar
24790 73 65 3b 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  se;   /* Parsing
247a0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
247b0 74 20 6e 43 6f 6e 73 74 3b 20 20 20 20 20 20 2f  t nConst;      /
247c0 2a 20 4e 75 6d 62 65 72 20 66 6f 72 20 43 4f 4c  * Number for COL
247d0 55 4d 4e 3d 43 4f 4e 53 54 41 4e 54 20 74 65 72  UMN=CONSTANT ter
247e0 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 68 6e  ms */.  int nChn
247f0 67 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  g;       /* Numb
24800 65 72 20 6f 66 20 74 69 6d 65 73 20 61 20 63 6f  er of times a co
24810 6e 73 74 61 6e 74 20 69 73 20 70 72 6f 70 61 67  nstant is propag
24820 61 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ated */.  Expr *
24830 2a 61 70 45 78 70 72 3b 20 20 20 2f 2a 20 5b 69  *apExpr;   /* [i
24840 2a 32 5d 20 69 73 20 43 4f 4c 55 4d 4e 20 61 6e  *2] is COLUMN an
24850 64 20 5b 69 2a 32 2b 31 5d 20 69 73 20 56 41 4c  d [i*2+1] is VAL
24860 55 45 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  UE */.};../*.** 
24870 41 64 64 20 61 20 6e 65 77 20 65 6e 74 72 79 20  Add a new entry 
24880 74 6f 20 74 68 65 20 70 43 6f 6e 73 74 20 6f 62  to the pConst ob
24890 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
248a0 6f 69 64 20 63 6f 6e 73 74 49 6e 73 65 72 74 28  oid constInsert(
248b0 0a 20 20 57 68 65 72 65 43 6f 6e 73 74 20 2a 70  .  WhereConst *p
248c0 43 6f 6e 73 74 2c 0a 20 20 45 78 70 72 20 2a 70  Const,.  Expr *p
248d0 43 6f 6c 75 6d 6e 2c 0a 20 20 45 78 70 72 20 2a  Column,.  Expr *
248e0 70 56 61 6c 75 65 0a 29 7b 0a 0a 20 20 70 43 6f  pValue.){..  pCo
248f0 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2b 2b 3b 0a 20  nst->nConst++;. 
24900 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 20   pConst->apExpr 
24910 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
24920 6f 63 4f 72 46 72 65 65 28 70 43 6f 6e 73 74 2d  ocOrFree(pConst-
24930 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 43 6f  >pParse->db, pCo
24940 6e 73 74 2d 3e 61 70 45 78 70 72 2c 0a 20 20 20  nst->apExpr,.   
24950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24960 20 20 20 20 20 20 70 43 6f 6e 73 74 2d 3e 6e 43        pConst->nC
24970 6f 6e 73 74 2a 32 2a 73 69 7a 65 6f 66 28 45 78  onst*2*sizeof(Ex
24980 70 72 2a 29 29 3b 0a 20 20 69 66 28 20 70 43 6f  pr*));.  if( pCo
24990 6e 73 74 2d 3e 61 70 45 78 70 72 3d 3d 30 20 29  nst->apExpr==0 )
249a0 7b 0a 20 20 20 20 70 43 6f 6e 73 74 2d 3e 6e 43  {.    pConst->nC
249b0 6f 6e 73 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  onst = 0;.  }els
249c0 65 7b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  e{.    if( ExprH
249d0 61 73 50 72 6f 70 65 72 74 79 28 70 56 61 6c 75  asProperty(pValu
249e0 65 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 20  e, EP_FixedCol) 
249f0 29 20 70 56 61 6c 75 65 20 3d 20 70 56 61 6c 75  ) pValue = pValu
24a00 65 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 70 43  e->pLeft;.    pC
24a10 6f 6e 73 74 2d 3e 61 70 45 78 70 72 5b 70 43 6f  onst->apExpr[pCo
24a20 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2a 32 2d 32 5d  nst->nConst*2-2]
24a30 20 3d 20 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20   = pColumn;.    
24a40 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 5b 70  pConst->apExpr[p
24a50 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2a 32 2d  Const->nConst*2-
24a60 31 5d 20 3d 20 70 56 61 6c 75 65 3b 0a 20 20 7d  1] = pValue;.  }
24a70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
24a80 6c 6c 20 74 65 72 6d 73 20 6f 66 20 43 4f 4c 55  ll terms of COLU
24a90 4d 4e 3d 56 41 4c 55 45 20 6f 72 20 56 41 4c 55  MN=VALUE or VALU
24aa0 45 3d 43 4f 4c 55 4d 4e 20 69 6e 20 70 45 78 70  E=COLUMN in pExp
24ab0 72 20 77 68 65 72 65 20 56 41 4c 55 45 0a 2a 2a  r where VALUE.**
24ac0 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 65   is a constant e
24ad0 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 77 68  xpression and wh
24ae0 65 72 65 20 74 68 65 20 74 65 72 6d 20 6d 75 73  ere the term mus
24af0 74 20 62 65 20 74 72 75 65 20 62 65 63 61 75 73  t be true becaus
24b00 65 20 69 74 0a 2a 2a 20 69 73 20 70 61 72 74 20  e it.** is part 
24b10 6f 66 20 74 68 65 20 41 4e 44 2d 63 6f 6e 6e 65  of the AND-conne
24b20 63 74 65 64 20 74 65 72 6d 73 20 6f 66 20 74 68  cted terms of th
24b30 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 46  e expression.  F
24b40 6f 72 20 65 61 63 68 20 74 65 72 6d 0a 2a 2a 20  or each term.** 
24b50 66 6f 75 6e 64 2c 20 61 64 64 20 69 74 20 74 6f  found, add it to
24b60 20 74 68 65 20 70 43 6f 6e 73 74 20 73 74 72 75   the pConst stru
24b70 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
24b80 20 76 6f 69 64 20 66 69 6e 64 43 6f 6e 73 74 49   void findConstI
24b90 6e 57 68 65 72 65 28 57 68 65 72 65 43 6f 6e 73  nWhere(WhereCons
24ba0 74 20 2a 70 43 6f 6e 73 74 2c 20 45 78 70 72 20  t *pConst, Expr 
24bb0 2a 70 45 78 70 72 29 7b 0a 20 20 45 78 70 72 20  *pExpr){.  Expr 
24bc0 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b  *pRight, *pLeft;
24bd0 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
24be0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
24bf0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
24c00 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
24c10 69 6e 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  in) ) return;.  
24c20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
24c30 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 61 73 73  K_AND ){.    ass
24c40 65 72 74 28 20 70 45 78 70 72 2d 3e 65 58 3d 3d  ert( pExpr->eX==
24c50 45 58 5f 52 69 67 68 74 20 29 3b 0a 20 20 20 20  EX_Right );.    
24c60 66 69 6e 64 43 6f 6e 73 74 49 6e 57 68 65 72 65  findConstInWhere
24c70 28 70 43 6f 6e 73 74 2c 20 70 45 78 70 72 2d 3e  (pConst, pExpr->
24c80 78 2e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 66  x.pRight);.    f
24c90 69 6e 64 43 6f 6e 73 74 49 6e 57 68 65 72 65 28  indConstInWhere(
24ca0 70 43 6f 6e 73 74 2c 20 70 45 78 70 72 2d 3e 70  pConst, pExpr->p
24cb0 4c 65 66 74 29 3b 0a 20 20 20 20 72 65 74 75 72  Left);.    retur
24cc0 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78  n;.  }.  if( pEx
24cd0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 29 20  pr->op!=TK_EQ ) 
24ce0 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
24cf0 28 20 70 45 78 70 72 2d 3e 65 58 3d 3d 45 58 5f  ( pExpr->eX==EX_
24d00 52 69 67 68 74 20 29 3b 0a 20 20 70 52 69 67 68  Right );.  pRigh
24d10 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 52 69  t = pExpr->x.pRi
24d20 67 68 74 3b 0a 20 20 70 4c 65 66 74 20 3d 20 70  ght;.  pLeft = p
24d30 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 61  Expr->pLeft;.  a
24d40 73 73 65 72 74 28 20 70 52 69 67 68 74 21 3d 30  ssert( pRight!=0
24d50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c   );.  assert( pL
24d60 65 66 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  eft!=0 );.  if( 
24d70 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43  pRight->op==TK_C
24d80 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 21 45 78 70  OLUMN.   && !Exp
24d90 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 52 69  rHasProperty(pRi
24da0 67 68 74 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c  ght, EP_FixedCol
24db0 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45  ).   && sqlite3E
24dc0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 4c  xprIsConstant(pL
24dd0 65 66 74 29 0a 20 20 20 26 26 20 73 71 6c 69 74  eft).   && sqlit
24de0 65 33 49 73 42 69 6e 61 72 79 28 73 71 6c 69 74  e3IsBinary(sqlit
24df0 65 33 43 6f 6d 70 61 72 69 73 6f 6e 43 6f 6c 6c  e3ComparisonColl
24e00 53 65 71 28 70 43 6f 6e 73 74 2d 3e 70 50 61 72  Seq(pConst->pPar
24e10 73 65 2c 70 4c 65 66 74 2c 70 52 69 67 68 74 29  se,pLeft,pRight)
24e20 29 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ).  ){.    const
24e30 49 6e 73 65 72 74 28 70 43 6f 6e 73 74 2c 20 70  Insert(pConst, p
24e40 52 69 67 68 74 2c 20 70 4c 65 66 74 29 3b 0a 20  Right, pLeft);. 
24e50 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 70 4c 65   }else.  if( pLe
24e60 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ft->op==TK_COLUM
24e70 4e 0a 20 20 20 26 26 20 21 45 78 70 72 48 61 73  N.   && !ExprHas
24e80 50 72 6f 70 65 72 74 79 28 70 4c 65 66 74 2c 20  Property(pLeft, 
24e90 45 50 5f 46 69 78 65 64 43 6f 6c 29 0a 20 20 20  EP_FixedCol).   
24ea0 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
24eb0 43 6f 6e 73 74 61 6e 74 28 70 52 69 67 68 74 29  Constant(pRight)
24ec0 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73  .   && sqlite3Is
24ed0 42 69 6e 61 72 79 28 73 71 6c 69 74 65 33 43 6f  Binary(sqlite3Co
24ee0 6d 70 61 72 69 73 6f 6e 43 6f 6c 6c 53 65 71 28  mparisonCollSeq(
24ef0 70 43 6f 6e 73 74 2d 3e 70 50 61 72 73 65 2c 70  pConst->pParse,p
24f00 4c 65 66 74 2c 70 52 69 67 68 74 29 29 0a 20 20  Left,pRight)).  
24f10 29 7b 0a 20 20 20 20 63 6f 6e 73 74 49 6e 73 65  ){.    constInse
24f20 72 74 28 70 43 6f 6e 73 74 2c 20 70 4c 65 66 74  rt(pConst, pLeft
24f30 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 7d  , pRight);.  }.}
24f40 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
24f50 61 20 57 61 6c 6b 65 72 20 65 78 70 72 65 73 73  a Walker express
24f60 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 2e 20 20 70  ion callback.  p
24f70 45 78 70 72 20 69 73 20 61 20 63 61 6e 64 69 64  Expr is a candid
24f80 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  ate expression.*
24f90 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64  * to be replaced
24fa0 20 62 79 20 61 20 76 61 6c 75 65 2e 20 20 49 66   by a value.  If
24fb0 20 70 45 78 70 72 20 69 73 20 65 71 75 69 76 61   pExpr is equiva
24fc0 6c 65 6e 74 20 74 6f 20 6f 6e 65 20 6f 66 20 74  lent to one of t
24fd0 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6e 61  he.** columns na
24fe0 6d 65 64 20 69 6e 20 70 57 61 6c 6b 65 72 2d 3e  med in pWalker->
24ff0 75 2e 70 43 6f 6e 73 74 2c 20 74 68 65 6e 20 6f  u.pConst, then o
25000 76 65 72 77 72 69 74 65 20 69 74 20 77 69 74 68  verwrite it with
25010 20 69 74 73 0a 2a 2a 20 63 6f 72 72 65 73 70 6f   its.** correspo
25020 6e 64 69 6e 67 20 76 61 6c 75 65 2e 0a 2a 2f 0a  nding value..*/.
25030 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 70 61  static int propa
25040 67 61 74 65 43 6f 6e 73 74 61 6e 74 45 78 70 72  gateConstantExpr
25050 52 65 77 72 69 74 65 28 57 61 6c 6b 65 72 20 2a  Rewrite(Walker *
25060 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
25070 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Expr){.  int i;.
25080 20 20 57 68 65 72 65 43 6f 6e 73 74 20 2a 70 43    WhereConst *pC
25090 6f 6e 73 74 3b 0a 20 20 69 66 28 20 70 45 78 70  onst;.  if( pExp
250a0 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
250b0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
250c0 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28 20 45 78  ntinue;.  if( Ex
250d0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
250e0 78 70 72 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c  xpr, EP_FixedCol
250f0 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ) ) return WRC_C
25100 6f 6e 74 69 6e 75 65 3b 0a 20 20 70 43 6f 6e 73  ontinue;.  pCons
25110 74 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  t = pWalker->u.p
25120 43 6f 6e 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30  Const;.  for(i=0
25130 3b 20 69 3c 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e  ; i<pConst->nCon
25140 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  st; i++){.    Ex
25150 70 72 20 2a 70 43 6f 6c 75 6d 6e 20 3d 20 70 43  pr *pColumn = pC
25160 6f 6e 73 74 2d 3e 61 70 45 78 70 72 5b 69 2a 32  onst->apExpr[i*2
25170 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 75  ];.    if( pColu
25180 6d 6e 3d 3d 70 45 78 70 72 20 29 20 63 6f 6e 74  mn==pExpr ) cont
25190 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43  inue;.    if( pC
251a0 6f 6c 75 6d 6e 2d 3e 69 54 61 62 6c 65 21 3d 70  olumn->iTable!=p
251b0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 20 63  Expr->iTable ) c
251c0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
251d0 20 70 43 6f 6c 75 6d 6e 2d 3e 69 43 6f 6c 75 6d   pColumn->iColum
251e0 6e 21 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n!=pExpr->iColum
251f0 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  n ) continue;.  
25200 20 20 2f 2a 20 41 20 6d 61 74 63 68 20 69 73 20    /* A match is 
25210 66 6f 75 6e 64 2e 20 20 41 64 64 20 74 68 65 20  found.  Add the 
25220 45 50 5f 46 69 78 65 64 43 6f 6c 20 70 72 6f 70  EP_FixedCol prop
25230 65 72 74 79 20 2a 2f 0a 20 20 20 20 70 43 6f 6e  erty */.    pCon
25240 73 74 2d 3e 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20  st->nChng++;.   
25250 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72   ExprClearProper
25260 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4c 65 61  ty(pExpr, EP_Lea
25270 66 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74 50  f);.    ExprSetP
25280 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
25290 50 5f 46 69 78 65 64 43 6f 6c 29 3b 0a 20 20 20  P_FixedCol);.   
252a0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
252b0 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pLeft==0 );.    
252c0 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73  pExpr->pLeft = s
252d0 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 43  qlite3ExprDup(pC
252e0 6f 6e 73 74 2d 3e 70 50 61 72 73 65 2d 3e 64 62  onst->pParse->db
252f0 2c 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72  , pConst->apExpr
25300 5b 69 2a 32 2b 31 5d 2c 20 30 29 3b 0a 20 20 20  [i*2+1], 0);.   
25310 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
25320 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
25330 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 57 48 45  }../*.** The WHE
25340 52 45 2d 63 6c 61 75 73 65 20 63 6f 6e 73 74 61  RE-clause consta
25350 6e 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6f  nt propagation o
25360 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a  ptimization..**.
25370 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20  ** If the WHERE 
25380 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
25390 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72  terms of the for
253a0 6d 20 43 4f 4c 55 4d 4e 3d 43 4f 4e 53 54 41 4e  m COLUMN=CONSTAN
253b0 54 20 6f 72 0a 2a 2a 20 43 4f 4e 53 54 41 4e 54  T or.** CONSTANT
253c0 3d 43 4f 4c 55 4d 4e 20 74 68 61 74 20 6d 75 73  =COLUMN that mus
253d0 74 20 62 65 20 74 72 65 65 20 28 69 6e 20 6f 74  t be tree (in ot
253e0 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68  her words, if th
253f0 65 20 74 65 72 6d 73 20 74 6f 70 2d 6c 65 76 65  e terms top-leve
25400 6c 0a 2a 2a 20 41 4e 44 2d 63 6f 6e 6e 65 63 74  l.** AND-connect
25410 65 64 20 74 65 72 6d 73 20 74 68 61 74 20 61 72  ed terms that ar
25420 65 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20  e not part of a 
25430 4f 4e 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 61  ON clause from a
25440 20 4c 45 46 54 20 4a 4f 49 4e 29 0a 2a 2a 20 74   LEFT JOIN).** t
25450 68 65 6e 20 74 68 72 6f 75 67 68 6f 75 74 20 74  hen throughout t
25460 68 65 20 71 75 65 72 79 20 72 65 70 6c 61 63 65  he query replace
25470 20 61 6c 6c 20 6f 74 68 65 72 20 6f 63 63 75 72   all other occur
25480 72 65 6e 63 65 73 20 6f 66 20 43 4f 4c 55 4d 4e  rences of COLUMN
25490 0a 2a 2a 20 77 69 74 68 20 43 4f 4e 53 54 41 4e  .** with CONSTAN
254a0 54 20 77 69 74 68 69 6e 20 74 68 65 20 57 48 45  T within the WHE
254b0 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  RE clause..**.**
254c0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   For example, th
254d0 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  e query:.**.**  
254e0 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
254f0 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45  M t1, t2, t3 WHE
25500 52 45 20 74 31 2e 61 3d 33 39 20 41 4e 44 20 74  RE t1.a=39 AND t
25510 32 2e 62 3d 74 31 2e 61 20 41 4e 44 20 74 33 2e  2.b=t1.a AND t3.
25520 63 3d 74 32 2e 62 0a 2a 2a 0a 2a 2a 20 49 73 20  c=t2.b.**.** Is 
25530 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  transformed into
25540 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 53 45 4c 45  .**.**      SELE
25550 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32  CT * FROM t1, t2
25560 2c 20 74 33 20 57 48 45 52 45 20 74 31 2e 61 3d  , t3 WHERE t1.a=
25570 33 39 20 41 4e 44 20 74 32 2e 62 3d 33 39 20 41  39 AND t2.b=39 A
25580 4e 44 20 74 33 2e 63 3d 33 39 0a 2a 2a 0a 2a 2a  ND t3.c=39.**.**
25590 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
255a0 61 6e 79 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  any transformati
255b0 6f 6e 73 20 77 68 65 72 65 20 6d 61 64 65 20 61  ons where made a
255c0 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e  nd false if not.
255d0 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  .**.** Implement
255e0 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 43 6f 6e  ation note:  Con
255f0 73 74 61 6e 74 20 70 72 6f 70 61 67 61 74 69 6f  stant propagatio
25600 6e 20 69 73 20 74 72 69 63 6b 79 20 64 75 65 20  n is tricky due 
25610 74 6f 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 61  to affinity.** a
25620 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  nd collating seq
25630 75 65 6e 63 65 20 69 6e 74 65 72 61 63 74 69 6f  uence interactio
25640 6e 73 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68  ns.  Consider th
25650 69 73 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  is example:.**.*
25660 2a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  *    CREATE TABL
25670 45 20 74 31 28 61 20 49 4e 54 2c 62 20 54 45 58  E t1(a INT,b TEX
25680 54 29 3b 0a 2a 2a 20 20 20 20 49 4e 53 45 52 54  T);.**    INSERT
25690 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
256a0 31 32 33 2c 27 30 31 32 33 27 29 3b 0a 2a 2a 20  123,'0123');.** 
256b0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
256c0 20 74 31 20 57 48 45 52 45 20 61 3d 31 32 33 20   t1 WHERE a=123 
256d0 41 4e 44 20 62 3d 61 3b 0a 2a 2a 20 20 20 20 53  AND b=a;.**    S
256e0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
256f0 57 48 45 52 45 20 61 3d 31 32 33 20 41 4e 44 20  WHERE a=123 AND 
25700 62 3d 31 32 33 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  b=123;.**.** The
25710 20 74 77 6f 20 53 45 4c 45 43 54 20 73 74 61 74   two SELECT stat
25720 65 6d 65 6e 74 73 20 61 62 6f 76 65 20 73 68 6f  ements above sho
25730 75 6c 64 20 72 65 74 75 72 6e 20 64 69 66 66 65  uld return diffe
25740 72 65 6e 74 20 61 6e 73 77 65 72 73 2e 20 20 62  rent answers.  b
25750 3d 61 0a 2a 2a 20 69 73 20 61 6c 77 61 79 20 74  =a.** is alway t
25760 72 75 65 20 62 65 63 61 75 73 65 20 74 68 65 20  rue because the 
25770 63 6f 6d 70 61 72 69 73 6f 6e 20 75 73 65 73 20  comparison uses 
25780 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
25790 2c 20 62 75 74 20 62 3d 31 32 33 0a 2a 2a 20 69  , but b=123.** i
257a0 73 20 66 61 6c 73 65 20 62 65 63 61 75 73 65 20  s false because 
257b0 69 74 20 75 73 65 73 20 74 65 78 74 20 61 66 66  it uses text aff
257c0 69 6e 69 74 79 20 61 6e 64 20 27 30 31 32 33 27  inity and '0123'
257d0 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61 6d 65   is not the same
257e0 20 61 73 20 27 31 32 33 27 2e 0a 2a 2a 20 54 6f   as '123'..** To
257f0 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69   work around thi
25800 73 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  s, the expressio
25810 6e 20 74 72 65 65 20 69 73 20 6e 6f 74 20 61 63  n tree is not ac
25820 74 75 61 6c 6c 79 20 63 68 61 6e 67 65 64 20 66  tually changed f
25830 72 6f 6d 0a 2a 2a 20 22 62 3d 61 22 20 74 6f 20  rom.** "b=a" to 
25840 22 62 3d 31 32 33 22 20 62 75 74 20 72 61 74 68  "b=123" but rath
25850 65 72 20 74 68 65 20 22 61 22 20 69 6e 20 22 62  er the "a" in "b
25860 3d 61 22 20 69 73 20 74 61 67 67 65 64 20 77 69  =a" is tagged wi
25870 74 68 20 45 50 5f 46 69 78 65 64 43 6f 6c 0a 2a  th EP_FixedCol.*
25880 2a 20 61 6e 64 20 74 68 65 20 22 31 32 33 22 20  * and the "123" 
25890 76 61 6c 75 65 20 69 73 20 68 75 6e 67 20 6f 66  value is hung of
258a0 66 20 6f 66 20 74 68 65 20 70 4c 65 66 74 20 70  f of the pLeft p
258b0 6f 69 6e 74 65 72 2e 20 20 43 6f 64 65 20 67 65  ointer.  Code ge
258c0 6e 65 72 61 74 6f 72 0a 2a 2a 20 72 6f 75 74 69  nerator.** routi
258d0 6e 65 73 20 6b 6e 6f 77 20 74 6f 20 67 65 6e 65  nes know to gene
258e0 72 61 74 65 20 74 68 65 20 63 6f 6e 73 74 61 6e  rate the constan
258f0 74 20 22 31 32 33 22 20 69 6e 73 74 65 61 64 20  t "123" instead 
25900 6f 66 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68  of looking up th
25910 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  e.** column valu
25920 65 2e 20 20 41 6c 73 6f 2c 20 74 6f 20 61 76 6f  e.  Also, to avo
25930 69 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 70 72 6f  id collation pro
25940 62 6c 65 6d 73 2c 20 74 68 69 73 20 6f 70 74 69  blems, this opti
25950 6d 69 7a 61 74 69 6f 6e 20 69 73 0a 2a 2a 20 6f  mization is.** o
25960 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66  nly attempted if
25970 20 74 68 65 20 22 61 3d 31 32 33 22 20 74 65 72   the "a=123" ter
25980 6d 20 75 73 65 73 20 74 68 65 20 64 65 66 61 75  m uses the defau
25990 6c 74 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74  lt BINARY collat
259a0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
259b0 6e 74 20 70 72 6f 70 61 67 61 74 65 43 6f 6e 73  nt propagateCons
259c0 74 61 6e 74 73 28 0a 20 20 50 61 72 73 65 20 2a  tants(.  Parse *
259d0 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 54 68 65  pParse,   /* The
259e0 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
259f0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 20   */.  Select *p 
25a00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 71 75         /* The qu
25a10 65 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ery in which to 
25a20 70 72 6f 70 61 67 61 74 65 20 63 6f 6e 73 74 61  propagate consta
25a30 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  nts */.){.  Wher
25a40 65 43 6f 6e 73 74 20 78 3b 0a 20 20 57 61 6c 6b  eConst x;.  Walk
25a50 65 72 20 77 3b 0a 20 20 69 6e 74 20 6e 43 68 6e  er w;.  int nChn
25a60 67 20 3d 20 30 3b 0a 20 20 78 2e 70 50 61 72 73  g = 0;.  x.pPars
25a70 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 64 6f  e = pParse;.  do
25a80 7b 0a 20 20 20 20 78 2e 6e 43 6f 6e 73 74 20 3d  {.    x.nConst =
25a90 20 30 3b 0a 20 20 20 20 78 2e 6e 43 68 6e 67 20   0;.    x.nChng 
25aa0 3d 20 30 3b 0a 20 20 20 20 78 2e 61 70 45 78 70  = 0;.    x.apExp
25ab0 72 20 3d 20 30 3b 0a 20 20 20 20 66 69 6e 64 43  r = 0;.    findC
25ac0 6f 6e 73 74 49 6e 57 68 65 72 65 28 26 78 2c 20  onstInWhere(&x, 
25ad0 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  p->pWhere);.    
25ae0 69 66 28 20 78 2e 6e 43 6f 6e 73 74 20 29 7b 0a  if( x.nConst ){.
25af0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 77 2c        memset(&w,
25b00 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a   0, sizeof(w));.
25b10 20 20 20 20 20 20 77 2e 70 50 61 72 73 65 20 3d        w.pParse =
25b20 20 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 77   pParse;.      w
25b30 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
25b40 20 70 72 6f 70 61 67 61 74 65 43 6f 6e 73 74 61   propagateConsta
25b50 6e 74 45 78 70 72 52 65 77 72 69 74 65 3b 0a 20  ntExprRewrite;. 
25b60 20 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61       w.xSelectCa
25b70 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  llback = sqlite3
25b80 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b 0a  SelectWalkNoop;.
25b90 20 20 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43        w.xSelectC
25ba0 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20  allback2 = 0;.  
25bb0 20 20 20 20 77 2e 77 61 6c 6b 65 72 44 65 70 74      w.walkerDept
25bc0 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 2e 75  h = 0;.      w.u
25bd0 2e 70 43 6f 6e 73 74 20 3d 20 26 78 3b 0a 20 20  .pConst = &x;.  
25be0 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45      sqlite3WalkE
25bf0 78 70 72 28 26 77 2c 20 70 2d 3e 70 57 68 65 72  xpr(&w, p->pWher
25c00 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
25c10 33 44 62 46 72 65 65 28 78 2e 70 50 61 72 73 65  3DbFree(x.pParse
25c20 2d 3e 64 62 2c 20 78 2e 61 70 45 78 70 72 29 3b  ->db, x.apExpr);
25c30 0a 20 20 20 20 20 20 6e 43 68 6e 67 20 2b 3d 20  .      nChng += 
25c40 78 2e 6e 43 68 6e 67 3b 0a 20 20 20 20 7d 0a 20  x.nChng;.    }. 
25c50 20 7d 77 68 69 6c 65 28 20 78 2e 6e 43 68 6e 67   }while( x.nChng
25c60 20 29 3b 20 20 0a 20 20 72 65 74 75 72 6e 20 6e   );  .  return n
25c70 43 68 6e 67 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  Chng;.}..#if !de
25c80 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
25c90 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
25ca0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
25cb0 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20  MIT_VIEW)./*.** 
25cc0 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 72  Make copies of r
25cd0 65 6c 65 76 61 6e 74 20 57 48 45 52 45 20 63 6c  elevant WHERE cl
25ce0 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 74 68  ause terms of th
25cf0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 6e  e outer query in
25d00 74 6f 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20  to.** the WHERE 
25d10 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65  clause of subque
25d20 72 79 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a  ry.  Example:.**
25d30 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .**    SELECT * 
25d40 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41  FROM (SELECT a A
25d50 53 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52  S x, c-d AS y FR
25d60 4f 4d 20 74 31 29 20 57 48 45 52 45 20 78 3d 35  OM t1) WHERE x=5
25d70 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a   AND y=10;.**.**
25d80 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   Transformed int
25d90 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  o:.**.**    SELE
25da0 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT * FROM (SELEC
25db0 54 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53  T a AS x, c-d AS
25dc0 20 79 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   y FROM t1 WHERE
25dd0 20 61 3d 35 20 41 4e 44 20 63 2d 64 3d 31 30 29   a=5 AND c-d=10)
25de0 0a 2a 2a 20 20 20 20 20 57 48 45 52 45 20 78 3d  .**     WHERE x=
25df0 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a  5 AND y=10;.**.*
25e00 2a 20 54 68 65 20 68 6f 70 65 20 69 73 20 74 68  * The hope is th
25e10 61 74 20 74 68 65 20 74 65 72 6d 73 20 61 64 64  at the terms add
25e20 65 64 20 74 6f 20 74 68 65 20 69 6e 6e 65 72 20  ed to the inner 
25e30 71 75 65 72 79 20 77 69 6c 6c 20 6d 61 6b 65 20  query will make 
25e40 69 74 20 6d 6f 72 65 0a 2a 2a 20 65 66 66 69 63  it more.** effic
25e50 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e  ient..**.** Do n
25e60 6f 74 20 61 74 74 65 6d 70 74 20 74 68 69 73 20  ot attempt this 
25e70 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 3a  optimization if:
25e80 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 28 2a 2a  .**.**   (1) (**
25e90 20 54 68 69 73 20 72 65 73 74 72 69 63 74 69 6f   This restrictio
25ea0 6e 20 77 61 73 20 72 65 6d 6f 76 65 64 20 6f 6e  n was removed on
25eb0 20 32 30 31 37 2d 30 39 2d 32 39 2e 20 20 57 65   2017-09-29.  We
25ec0 20 75 73 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20   used to.**     
25ed0 20 20 20 20 20 20 64 69 73 61 6c 6c 6f 77 20 74        disallow t
25ee0 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
25ef0 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 73   for aggregate s
25f00 75 62 71 75 65 72 69 65 73 2c 20 62 75 74 20 6e  ubqueries, but n
25f10 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ow.**           
25f20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 20 62 79  it is allowed by
25f30 20 70 75 74 74 69 6e 67 20 74 68 65 20 65 78 74   putting the ext
25f40 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20  ra terms on the 
25f50 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a  HAVING clause..*
25f60 2a 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20  *           The 
25f70 61 64 64 65 64 20 48 41 56 49 4e 47 20 63 6c 61  added HAVING cla
25f80 75 73 65 20 69 73 20 70 6f 69 6e 74 6c 65 73 73  use is pointless
25f90 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
25fa0 20 6c 61 63 6b 73 0a 2a 2a 20 20 20 20 20 20 20   lacks.**       
25fb0 20 20 20 20 61 20 47 52 4f 55 50 20 42 59 20 63      a GROUP BY c
25fc0 6c 61 75 73 65 2e 20 20 42 75 74 20 73 75 63 68  lause.  But such
25fd0 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65   a HAVING clause
25fe0 20 69 73 20 61 6c 73 6f 20 68 61 72 6d 6c 65 73   is also harmles
25ff0 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 73  s.**           s
26000 6f 20 74 68 65 72 65 20 64 6f 65 73 20 6e 6f 74  o there does not
26010 20 61 70 70 65 61 72 20 74 6f 20 62 65 20 61 6e   appear to be an
26020 79 20 72 65 61 73 6f 6e 20 74 6f 20 61 64 64 20  y reason to add 
26030 65 78 74 72 61 20 6c 6f 67 69 63 0a 2a 2a 20 20  extra logic.**  
26040 20 20 20 20 20 20 20 20 20 74 6f 20 73 75 70 70           to supp
26050 72 65 73 73 20 69 74 2e 20 2a 2a 29 0a 2a 2a 0a  ress it. **).**.
26060 2a 2a 20 20 20 28 32 29 20 54 68 65 20 69 6e 6e  **   (2) The inn
26070 65 72 20 71 75 65 72 79 20 69 73 20 74 68 65 20  er query is the 
26080 72 65 63 75 72 73 69 76 65 20 70 61 72 74 20 6f  recursive part o
26090 66 20 61 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65  f a common table
260a0 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
260b0 2a 2a 20 20 20 28 33 29 20 54 68 65 20 69 6e 6e  **   (3) The inn
260c0 65 72 20 71 75 65 72 79 20 68 61 73 20 61 20 4c  er query has a L
260d0 49 4d 49 54 20 63 6c 61 75 73 65 20 28 73 69 6e  IMIT clause (sin
260e0 63 65 20 74 68 65 20 63 68 61 6e 67 65 73 20 74  ce the changes t
260f0 6f 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 20  o the WHERE.**  
26100 20 20 20 20 20 63 6c 61 75 73 65 20 77 6f 75 6c       clause woul
26110 64 20 63 68 61 6e 67 65 20 74 68 65 20 6d 65 61  d change the mea
26120 6e 69 6e 67 20 6f 66 20 74 68 65 20 4c 49 4d 49  ning of the LIMI
26130 54 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20  T)..**.**   (4) 
26140 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  The inner query 
26150 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  is the right ope
26160 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a  rand of a LEFT J
26170 4f 49 4e 20 61 6e 64 20 74 68 65 0a 2a 2a 20 20  OIN and the.**  
26180 20 20 20 20 20 65 78 70 72 65 73 73 69 6f 6e 20       expression 
26190 74 6f 20 62 65 20 70 75 73 68 65 64 20 64 6f 77  to be pushed dow
261a0 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20  n does not come 
261b0 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75  from the ON clau
261c0 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f 6e 20 74  se.**       on t
261d0 68 61 74 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 2a  hat LEFT JOIN..*
261e0 2a 0a 2a 2a 20 20 20 28 35 29 20 54 68 65 20 57  *.**   (5) The W
261f0 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72  HERE clause expr
26200 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65  ession originate
26210 73 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55  s in the ON or U
26220 53 49 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20 20  SING clause.**  
26230 20 20 20 20 20 6f 66 20 61 20 4c 45 46 54 20 4a       of a LEFT J
26240 4f 49 4e 20 77 68 65 72 65 20 69 43 75 72 73 6f  OIN where iCurso
26250 72 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67  r is not the rig
26260 68 74 2d 68 61 6e 64 20 74 61 62 6c 65 20 6f 66  ht-hand table of
26270 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 6c   that.**       l
26280 65 66 74 20 6a 6f 69 6e 2e 20 20 41 6e 20 65 78  eft join.  An ex
26290 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
262a0 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 0a         SELECT *.
262b0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 46 52 4f  **           FRO
262c0 4d 20 28 53 45 4c 45 43 54 20 31 20 41 53 20 61  M (SELECT 1 AS a
262d0 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  1 UNION ALL SELE
262e0 43 54 20 32 29 20 41 53 20 61 61 0a 2a 2a 20 20  CT 2) AS aa.**  
262f0 20 20 20 20 20 20 20 20 20 4a 4f 49 4e 20 28 53           JOIN (S
26300 45 4c 45 43 54 20 31 20 41 53 20 62 32 20 55 4e  ELECT 1 AS b2 UN
26310 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 32  ION ALL SELECT 2
26320 29 20 41 53 20 62 62 20 4f 4e 20 28 61 31 3d 62  ) AS bb ON (a1=b
26330 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  2).**           
26340 4c 45 46 54 20 4a 4f 49 4e 20 28 53 45 4c 45 43  LEFT JOIN (SELEC
26350 54 20 38 20 41 53 20 63 33 20 55 4e 49 4f 4e 20  T 8 AS c3 UNION 
26360 41 4c 4c 20 53 45 4c 45 43 54 20 39 29 20 41 53  ALL SELECT 9) AS
26370 20 63 63 20 4f 4e 20 28 62 32 3d 32 29 3b 0a 2a   cc ON (b2=2);.*
26380 2a 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20 63  *.**       The c
26390 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 69 73  orrect answer is
263a0 20 74 68 72 65 65 20 72 6f 77 73 3a 20 20 28 31   three rows:  (1
263b0 2c 31 2c 4e 55 4c 4c 29 2c 28 32 2c 32 2c 38 29  ,1,NULL),(2,2,8)
263c0 2c 28 32 2c 32 2c 39 29 2e 0a 2a 2a 20 20 20 20  ,(2,2,9)..**    
263d0 20 20 20 42 75 74 20 69 66 20 74 68 65 20 28 62     But if the (b
263e0 32 3d 32 29 20 74 65 72 6d 20 77 65 72 65 20 74  2=2) term were t
263f0 6f 20 62 65 20 70 75 73 68 65 64 20 64 6f 77 6e  o be pushed down
26400 20 69 6e 74 6f 20 74 68 65 20 62 62 20 73 75 62   into the bb sub
26410 71 75 65 72 79 2c 0a 2a 2a 20 20 20 20 20 20 20  query,.**       
26420 74 68 65 6e 20 74 68 65 20 28 31 2c 31 2c 4e 55  then the (1,1,NU
26430 4c 4c 29 20 72 6f 77 20 77 6f 75 6c 64 20 62 65  LL) row would be
26440 20 73 75 70 70 72 65 73 73 65 64 2e 0a 2a 2a 0a   suppressed..**.
26450 2a 2a 20 20 20 28 36 29 20 54 68 65 20 69 6e 6e  **   (6) The inn
26460 65 72 20 71 75 65 72 79 20 66 65 61 74 75 72 65  er query feature
26470 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 77 69  s one or more wi
26480 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 73 20 28  ndow-functions (
26490 73 69 6e 63 65 20 0a 2a 2a 20 20 20 20 20 20 20  since .**       
264a0 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 57  changes to the W
264b0 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74  HERE clause of t
264c0 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 63  he inner query c
264d0 6f 75 6c 64 20 63 68 61 6e 67 65 20 74 68 65 20  ould change the 
264e0 0a 2a 2a 20 20 20 20 20 20 20 77 69 6e 64 6f 77  .**       window
264f0 20 6f 76 65 72 20 77 68 69 63 68 20 77 69 6e 64   over which wind
26500 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65  ow functions are
26510 20 63 61 6c 63 75 6c 61 74 65 64 29 2e 0a 2a 2a   calculated)..**
26520 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20  .** Return 0 if 
26530 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  no changes are m
26540 61 64 65 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f  ade and non-zero
26550 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   if one or more 
26560 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20  WHERE clause.** 
26570 74 65 72 6d 73 20 61 72 65 20 64 75 70 6c 69 63  terms are duplic
26580 61 74 65 64 20 69 6e 74 6f 20 74 68 65 20 73 75  ated into the su
26590 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  bquery..*/.stati
265a0 63 20 69 6e 74 20 70 75 73 68 44 6f 77 6e 57 68  c int pushDownWh
265b0 65 72 65 54 65 72 6d 73 28 0a 20 20 50 61 72 73  ereTerms(.  Pars
265c0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
265d0 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
265e0 78 74 20 28 66 6f 72 20 6d 61 6c 6c 6f 63 28 29  xt (for malloc()
265f0 20 61 6e 64 20 65 72 72 6f 72 20 72 65 70 6f 72   and error repor
26600 74 69 6e 67 29 20 2a 2f 0a 20 20 53 65 6c 65 63  ting) */.  Selec
26610 74 20 2a 70 53 75 62 71 2c 20 20 20 20 20 20 20  t *pSubq,       
26620 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
26630 20 77 68 6f 73 65 20 57 48 45 52 45 20 63 6c 61   whose WHERE cla
26640 75 73 65 20 69 73 20 74 6f 20 62 65 20 61 75 67  use is to be aug
26650 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  mented */.  Expr
26660 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
26670 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
26680 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
26690 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  er query */.  in
266a0 74 20 69 43 75 72 73 6f 72 2c 20 20 20 20 20 20  t iCursor,      
266b0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
266c0 6d 62 65 72 20 6f 66 20 74 68 65 20 73 75 62 71  mber of the subq
266d0 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73  uery */.  int is
266e0 4c 65 66 74 4a 6f 69 6e 20 20 20 20 20 20 20 20  LeftJoin        
266f0 2f 2a 20 54 72 75 65 20 69 66 20 70 53 75 62 71  /* True if pSubq
26700 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74 65   is the right te
26710 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  rm of a LEFT JOI
26720 4e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  N */.){.  Expr *
26730 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 43 68 6e  pNew;.  int nChn
26740 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 57 68  g = 0;.  if( pWh
26750 65 72 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ere==0 ) return 
26760 30 3b 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e  0;.  if( pSubq->
26770 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
26780 63 75 72 73 69 76 65 20 29 20 72 65 74 75 72 6e  cursive ) return
26790 20 30 3b 20 20 2f 2a 20 72 65 73 74 72 69 63 74   0;  /* restrict
267a0 69 6f 6e 20 28 32 29 20 2a 2f 0a 0a 23 69 66 6e  ion (2) */..#ifn
267b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
267c0 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 69 66 28  WINDOWFUNC.  if(
267d0 20 70 53 75 62 71 2d 3e 70 57 69 6e 20 29 20 72   pSubq->pWin ) r
267e0 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 72  eturn 0;    /* r
267f0 65 73 74 72 69 63 74 69 6f 6e 20 28 36 29 20 2a  estriction (6) *
26800 2f 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  /.#endif..#ifdef
26810 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
26820 2f 2a 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73  /* Only the firs
26830 74 20 74 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70  t term of a comp
26840 6f 75 6e 64 20 63 61 6e 20 68 61 76 65 20 61 20  ound can have a 
26850 57 49 54 48 20 63 6c 61 75 73 65 2e 20 20 42 75  WITH clause.  Bu
26860 74 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65  t make.  ** sure
26870 20 6e 6f 20 6f 74 68 65 72 20 74 65 72 6d 73 20   no other terms 
26880 61 72 65 20 6d 61 72 6b 65 64 20 53 46 5f 52 65  are marked SF_Re
26890 63 75 72 73 69 76 65 20 69 6e 20 63 61 73 65 20  cursive in case 
268a0 73 6f 6d 65 74 68 69 6e 67 20 63 68 61 6e 67 65  something change
268b0 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66 75  s.  ** in the fu
268c0 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20  ture..  */.  {. 
268d0 20 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 20 20     Select *pX;  
268e0 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 75 62  .    for(pX=pSub
268f0 71 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 50  q; pX; pX=pX->pP
26900 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 61 73 73  rior){.      ass
26910 65 72 74 28 20 28 70 58 2d 3e 73 65 6c 46 6c 61  ert( (pX->selFla
26920 67 73 20 26 20 28 53 46 5f 52 65 63 75 72 73 69  gs & (SF_Recursi
26930 76 65 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  ve))==0 );.    }
26940 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
26950 66 28 20 70 53 75 62 71 2d 3e 70 4c 69 6d 69 74  f( pSubq->pLimit
26960 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
26970 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74  n 0; /* restrict
26980 69 6f 6e 20 28 33 29 20 2a 2f 0a 20 20 7d 0a 20  ion (3) */.  }. 
26990 20 77 68 69 6c 65 28 20 70 57 68 65 72 65 2d 3e   while( pWhere->
269a0 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20  op==TK_AND ){.  
269b0 20 20 61 73 73 65 72 74 28 20 70 57 68 65 72 65    assert( pWhere
269c0 2d 3e 65 58 3d 3d 45 58 5f 52 69 67 68 74 20 29  ->eX==EX_Right )
269d0 3b 0a 20 20 20 20 6e 43 68 6e 67 20 2b 3d 20 70  ;.    nChng += p
269e0 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d  ushDownWhereTerm
269f0 73 28 70 50 61 72 73 65 2c 20 70 53 75 62 71 2c  s(pParse, pSubq,
26a00 20 70 57 68 65 72 65 2d 3e 78 2e 70 52 69 67 68   pWhere->x.pRigh
26a10 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
26a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a30 20 20 20 69 43 75 72 73 6f 72 2c 20 69 73 4c 65     iCursor, isLe
26a40 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 57 68  ftJoin);.    pWh
26a50 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e 70 4c  ere = pWhere->pL
26a60 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  eft;.  }.  if( i
26a70 73 4c 65 66 74 4a 6f 69 6e 0a 20 20 20 26 26 20  sLeftJoin.   && 
26a80 28 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  (ExprHasProperty
26a90 28 70 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a  (pWhere,EP_FromJ
26aa0 6f 69 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  oin)==0.        
26ab0 20 7c 7c 20 70 57 68 65 72 65 2d 3e 69 52 69 67   || pWhere->iRig
26ac0 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 69 43 75  htJoinTable!=iCu
26ad0 72 73 6f 72 29 0a 20 20 29 7b 0a 20 20 20 20 72  rsor).  ){.    r
26ae0 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74  eturn 0; /* rest
26af0 72 69 63 74 69 6f 6e 20 28 34 29 20 2a 2f 0a 20  riction (4) */. 
26b00 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48 61 73   }.  if( ExprHas
26b10 50 72 6f 70 65 72 74 79 28 70 57 68 65 72 65 2c  Property(pWhere,
26b20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 26 26 20  EP_FromJoin) && 
26b30 70 57 68 65 72 65 2d 3e 69 52 69 67 68 74 4a 6f  pWhere->iRightJo
26b40 69 6e 54 61 62 6c 65 21 3d 69 43 75 72 73 6f 72  inTable!=iCursor
26b50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
26b60 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e  ; /* restriction
26b70 20 28 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66   (5) */.  }.  if
26b80 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54  ( sqlite3ExprIsT
26b90 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70 57 68  ableConstant(pWh
26ba0 65 72 65 2c 20 69 43 75 72 73 6f 72 29 20 29 7b  ere, iCursor) ){
26bb0 0a 20 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20 20  .    nChng++;.  
26bc0 20 20 77 68 69 6c 65 28 20 70 53 75 62 71 20 29    while( pSubq )
26bd0 7b 0a 20 20 20 20 20 20 53 75 62 73 74 43 6f 6e  {.      SubstCon
26be0 74 65 78 74 20 78 3b 0a 20 20 20 20 20 20 70 4e  text x;.      pN
26bf0 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
26c00 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
26c10 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20  pWhere, 0);.    
26c20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28    unsetJoinExpr(
26c30 70 4e 65 77 2c 20 2d 31 29 3b 0a 20 20 20 20 20  pNew, -1);.     
26c40 20 78 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   x.pParse = pPar
26c50 73 65 3b 0a 20 20 20 20 20 20 78 2e 69 54 61 62  se;.      x.iTab
26c60 6c 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20  le = iCursor;.  
26c70 20 20 20 20 78 2e 69 4e 65 77 54 61 62 6c 65 20      x.iNewTable 
26c80 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  = iCursor;.     
26c90 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20   x.isLeftJoin = 
26ca0 30 3b 0a 20 20 20 20 20 20 78 2e 70 45 4c 69 73  0;.      x.pELis
26cb0 74 20 3d 20 70 53 75 62 71 2d 3e 70 45 4c 69 73  t = pSubq->pELis
26cc0 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  t;.      pNew = 
26cd0 73 75 62 73 74 45 78 70 72 28 26 78 2c 20 70 4e  substExpr(&x, pN
26ce0 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ew);.      if( p
26cf0 53 75 62 71 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Subq->selFlags &
26d00 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 7b   SF_Aggregate ){
26d10 0a 20 20 20 20 20 20 20 20 70 53 75 62 71 2d 3e  .        pSubq->
26d20 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
26d30 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
26d40 3e 64 62 2c 20 70 53 75 62 71 2d 3e 70 48 61 76  >db, pSubq->pHav
26d50 69 6e 67 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  ing, pNew);.    
26d60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26d70 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65 20 3d   pSubq->pWhere =
26d80 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
26d90 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 75 62  pParse->db, pSub
26da0 71 2d 3e 70 57 68 65 72 65 2c 20 70 4e 65 77 29  q->pWhere, pNew)
26db0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26dc0 70 53 75 62 71 20 3d 20 70 53 75 62 71 2d 3e 70  pSubq = pSubq->p
26dd0 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Prior;.    }.  }
26de0 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 6e 67 3b  .  return nChng;
26df0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
26e00 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
26e10 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
26e20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
26e30 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a  MIT_VIEW) */../*
26e40 0a 2a 2a 20 54 68 65 20 70 46 75 6e 63 20 69 73  .** The pFunc is
26e50 20 74 68 65 20 6f 6e 6c 79 20 61 67 67 72 65 67   the only aggreg
26e60 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20  ate function in 
26e70 74 68 65 20 71 75 65 72 79 2e 20 20 43 68 65 63  the query.  Chec
26e80 6b 20 74 6f 20 73 65 65 0a 2a 2a 20 69 66 20 74  k to see.** if t
26e90 68 65 20 71 75 65 72 79 20 69 73 20 61 20 63 61  he query is a ca
26ea0 6e 64 69 64 61 74 65 20 66 6f 72 20 74 68 65 20  ndidate for the 
26eb0 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a 61  min/max optimiza
26ec0 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  tion. .**.** If 
26ed0 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20 63  the query is a c
26ee0 61 6e 64 69 64 61 74 65 20 66 6f 72 20 74 68 65  andidate for the
26ef0 20 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a   min/max optimiz
26f00 61 74 69 6f 6e 2c 20 74 68 65 6e 20 73 65 74 0a  ation, then set.
26f10 2a 2a 20 2a 70 70 4d 69 6e 4d 61 78 20 74 6f 20  ** *ppMinMax to 
26f20 62 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  be an ORDER BY c
26f30 6c 61 75 73 65 20 74 6f 20 62 65 20 75 73 65 64  lause to be used
26f40 20 66 6f 72 20 74 68 65 20 6f 70 74 69 6d 69 7a   for the optimiz
26f50 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72 65 74  ation.** and ret
26f60 75 72 6e 20 65 69 74 68 65 72 20 57 48 45 52 45  urn either WHERE
26f70 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20  _ORDERBY_MIN or 
26f80 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
26f90 58 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 0a 2a  X depending on.*
26fa0 2a 20 77 68 65 74 68 65 72 20 70 46 75 6e 63 20  * whether pFunc 
26fb0 69 73 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61  is a min() or ma
26fc0 78 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  x() function..**
26fd0 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79  .** If the query
26fe0 20 69 73 20 6e 6f 74 20 61 20 63 61 6e 64 69 64   is not a candid
26ff0 61 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f  ate for the min/
27000 6d 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  max optimization
27010 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 57 48 45 52  , return.** WHER
27020 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
27030 20 28 77 68 69 63 68 20 6d 75 73 74 20 62 65 20   (which must be 
27040 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  zero)..**.** Thi
27050 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
27060 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61  e called after a
27070 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
27080 6e 73 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  ns have been.** 
27090 6c 6f 63 61 74 65 64 20 62 75 74 20 62 65 66 6f  located but befo
270a0 72 65 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e  re their argumen
270b0 74 73 20 68 61 76 65 20 62 65 65 6e 20 73 75 62  ts have been sub
270c0 6a 65 63 74 65 64 20 74 6f 20 61 67 67 72 65 67  jected to aggreg
270d0 61 74 65 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2e  ate.** analysis.
270e0 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 6d 69  .*/.static u8 mi
270f0 6e 4d 61 78 51 75 65 72 79 28 73 71 6c 69 74 65  nMaxQuery(sqlite
27100 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 46 75  3 *db, Expr *pFu
27110 6e 63 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a 70  nc, ExprList **p
27120 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20  pMinMax){.  int 
27130 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44  eRet = WHERE_ORD
27140 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20  ERBY_NORMAL;    
27150 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
27160 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
27170 2a 70 45 4c 69 73 74 20 3d 20 70 46 75 6e 63 2d  *pEList = pFunc-
27180 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20  >x.pList;    /* 
27190 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 67 67  Arguments to agg
271a0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 63   function */.  c
271b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
271c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
271d0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
271e0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
271f0 6f 6e 20 70 46 75 6e 63 20 2a 2f 0a 20 20 45 78  on pFunc */.  Ex
27200 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
27210 3b 0a 20 20 75 38 20 73 6f 72 74 4f 72 64 65 72  ;.  u8 sortOrder
27220 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 70  ;..  assert( *pp
27230 4d 69 6e 4d 61 78 3d 3d 30 20 29 3b 0a 20 20 61  MinMax==0 );.  a
27240 73 73 65 72 74 28 20 70 46 75 6e 63 2d 3e 6f 70  ssert( pFunc->op
27250 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  ==TK_AGG_FUNCTIO
27260 4e 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  N );.  if( pELis
27270 74 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74 2d 3e  t==0 || pEList->
27280 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72  nExpr!=1 ) retur
27290 6e 20 65 52 65 74 3b 0a 20 20 7a 46 75 6e 63 20  n eRet;.  zFunc 
272a0 3d 20 70 46 75 6e 63 2d 3e 75 2e 7a 54 6f 6b 65  = pFunc->u.zToke
272b0 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  n;.  if( sqlite3
272c0 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22  StrICmp(zFunc, "
272d0 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  min")==0 ){.    
272e0 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44  eRet = WHERE_ORD
272f0 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 73 6f  ERBY_MIN;.    so
27300 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49 54 45  rtOrder = SQLITE
27310 5f 53 4f 5f 41 53 43 3b 0a 20 20 7d 65 6c 73 65  _SO_ASC;.  }else
27320 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
27330 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78 22  Cmp(zFunc, "max"
27340 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65 52 65 74  )==0 ){.    eRet
27350 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   = WHERE_ORDERBY
27360 5f 4d 41 58 3b 0a 20 20 20 20 73 6f 72 74 4f 72  _MAX;.    sortOr
27370 64 65 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f  der = SQLITE_SO_
27380 44 45 53 43 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  DESC;.  }else{. 
27390 20 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a     return eRet;.
273a0 20 20 7d 0a 20 20 2a 70 70 4d 69 6e 4d 61 78 20    }.  *ppMinMax 
273b0 3d 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  = pOrderBy = sql
273c0 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
273d0 64 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a  db, pEList, 0);.
273e0 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
273f0 42 79 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  By!=0 || db->mal
27400 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
27410 66 28 20 70 4f 72 64 65 72 42 79 20 29 20 70 4f  f( pOrderBy ) pO
27420 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 73 6f 72  rderBy->a[0].sor
27430 74 4f 72 64 65 72 20 3d 20 73 6f 72 74 4f 72 64  tOrder = sortOrd
27440 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 65 52 65  er;.  return eRe
27450 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  t;.}../*.** The 
27460 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
27470 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
27480 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
27490 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75   an aggregate qu
274a0 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ery..** The seco
274b0 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  nd argument is t
274c0 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 61 67  he associated ag
274d0 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a  gregate-info obj
274e0 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75  ect. This .** fu
274f0 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20  nction tests if 
27500 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66  the SELECT is of
27510 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
27520 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
27530 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a  *) FROM <tbl>.**
27540 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c 65 20  .** where table 
27550 69 73 20 61 20 64 61 74 61 62 61 73 65 20 74 61  is a database ta
27560 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73  ble, not a sub-s
27570 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 49  elect or view. I
27580 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 64  f the query.** d
27590 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73 20 70  oes match this p
275a0 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61 20 70  attern, then a p
275b0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61  ointer to the Ta
275c0 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70 72 65  ble object repre
275d0 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e  senting.** <tbl>
275e0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
275f0 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72 65  herwise, 0 is re
27600 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
27610 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c  c Table *isSimpl
27620 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a 70  eCount(Select *p
27630 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
27640 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  nfo){.  Table *p
27650 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 78  Tab;.  Expr *pEx
27660 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  pr;..  assert( !
27670 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a  p->pGroupBy );..
27680 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20    if( p->pWhere 
27690 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  || p->pEList->nE
276a0 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d  xpr!=1 .   || p-
276b0 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c  >pSrc->nSrc!=1 |
276c0 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  | p->pSrc->a[0].
276d0 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20  pSelect.  ){.   
276e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
276f0 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d   pTab = p->pSrc-
27700 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45  >a[0].pTab;.  pE
27710 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
27720 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61  >a[0].pExpr;.  a
27730 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20 21  ssert( pTab && !
27740 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26  pTab->pSelect &&
27750 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69 66 28   pExpr );..  if(
27760 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
27770 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
27780 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
27790 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20  _AGG_FUNCTION ) 
277a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
277b0 4e 45 56 45 52 28 70 41 67 67 49 6e 66 6f 2d 3e  NEVER(pAggInfo->
277c0 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72 65 74 75  nFunc==0) ) retu
277d0 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41 67  rn 0;.  if( (pAg
277e0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e  gInfo->aFunc[0].
277f0 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73  pFunc->funcFlags
27800 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55  &SQLITE_FUNC_COU
27810 4e 54 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  NT)==0 ) return 
27820 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
27830 66 6c 61 67 73 26 45 50 5f 44 69 73 74 69 6e 63  flags&EP_Distinc
27840 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  t ) return 0;.. 
27850 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
27860 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f  ./*.** If the so
27870 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d 20 70  urce-list item p
27880 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
27890 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65 6e 74  ment was augment
278a0 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e  ed with an.** IN
278b0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
278c0 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63   then try to loc
278d0 61 74 65 20 74 68 65 20 73 70 65 63 69 66 69 65  ate the specifie
278e0 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 72  d index. If ther
278f0 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20 61 20  e.** was such a 
27900 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6e  clause and the n
27910 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f  amed index canno
27920 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75  t be found, retu
27930 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52  rn .** SQLITE_ER
27940 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20 61 6e  ROR and leave an
27950 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65   error in pParse
27960 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70 6f 70  . Otherwise, pop
27970 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d  ulate .** pFrom-
27980 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65 74 75  >pIndex and retu
27990 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  rn SQLITE_OK..*/
279a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65  .int sqlite3Inde
279b0 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73  xedByLookup(Pars
279c0 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63  e *pParse, struc
279d0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
279e0 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46  pFrom){.  if( pF
279f0 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70 46 72  rom->pTab && pFr
27a00 6f 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64  om->fg.isIndexed
27a10 42 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  By ){.    Table 
27a20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
27a30 54 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  Tab;.    char *z
27a40 49 6e 64 65 78 65 64 42 79 20 3d 20 70 46 72 6f  IndexedBy = pFro
27a50 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79  m->u1.zIndexedBy
27a60 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  ;.    Index *pId
27a70 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  x;.    for(pIdx=
27a80 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20  pTab->pIndex; . 
27a90 20 20 20 20 20 20 20 70 49 64 78 20 26 26 20 73         pIdx && s
27aa0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49  qlite3StrICmp(pI
27ab0 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65  dx->zName, zInde
27ac0 78 65 64 42 79 29 3b 20 0a 20 20 20 20 20 20 20  xedBy); .       
27ad0 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
27ae0 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  t.    );.    if(
27af0 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20   !pIdx ){.      
27b00 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
27b10 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
27b20 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e   index: %s", zIn
27b30 64 65 78 65 64 42 79 2c 20 30 29 3b 0a 20 20 20  dexedBy, 0);.   
27b40 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b     pParse->check
27b50 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20  Schema = 1;.    
27b60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27b70 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
27b80 20 70 46 72 6f 6d 2d 3e 70 49 42 49 6e 64 65 78   pFrom->pIBIndex
27b90 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72   = pIdx;.  }.  r
27ba0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27bb0 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63 74 20  .}./*.** Detect 
27bc0 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
27bd0 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
27be0 75 73 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  use an ORDER BY 
27bf0 63 6c 61 75 73 65 20 77 69 74 68 20 0a 2a 2a 20  clause with .** 
27c00 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63  an alternative c
27c10 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
27c20 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  e..**.**    SELE
27c30 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45  CT ... FROM t1 E
27c40 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e  XCEPT SELECT ...
27c50 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42   FROM t2 ORDER B
27c60 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e  Y .. COLLATE ...
27c70 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65  .**.** These are
27c80 20 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20   rewritten as a 
27c90 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  subquery:.**.** 
27ca0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
27cb0 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f   (SELECT ... FRO
27cc0 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45  M t1 EXCEPT SELE
27cd0 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 29 0a  CT ... FROM t2).
27ce0 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20  **     ORDER BY 
27cf0 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a  ... COLLATE ....
27d00 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73  **.** This trans
27d10 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 63  formation is nec
27d20 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20 74  essary because t
27d30 68 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  he multiSelectOr
27d40 64 65 72 42 79 28 29 20 72 6f 75 74 69 6e 65 0a  derBy() routine.
27d50 2a 2a 20 61 62 6f 76 65 20 74 68 61 74 20 67 65  ** above that ge
27d60 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
27d70 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20   for a compound 
27d80 53 45 4c 45 43 54 20 77 69 74 68 20 61 6e 20 4f  SELECT with an O
27d90 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a  RDER BY clause.*
27da0 2a 20 75 73 65 73 20 61 20 6d 65 72 67 65 20 61  * uses a merge a
27db0 6c 67 6f 72 69 74 68 6d 20 74 68 61 74 20 72 65  lgorithm that re
27dc0 71 75 69 72 65 73 20 74 68 65 20 73 61 6d 65 20  quires the same 
27dd0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
27de0 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 65 73  ce on the.** res
27df0 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73 20 6f  ult columns as o
27e00 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
27e10 6c 61 75 73 65 2e 20 20 53 65 65 20 74 69 63 6b  lause.  See tick
27e20 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77 77  et.** http://www
27e30 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f  .sqlite.org/src/
27e40 69 6e 66 6f 2f 36 37 30 39 35 37 34 64 32 61 0a  info/6709574d2a.
27e50 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73  **.** This trans
27e60 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c  formation is onl
27e70 79 20 6e 65 65 64 65 64 20 66 6f 72 20 45 58 43  y needed for EXC
27e80 45 50 54 2c 20 49 4e 54 45 52 53 45 43 54 2c 20  EPT, INTERSECT, 
27e90 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68  and UNION..** Th
27ea0 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
27eb0 61 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e 65 20  ator works fine 
27ec0 77 69 74 68 20 6d 75 6c 74 69 53 65 6c 65 63 74  with multiSelect
27ed0 4f 72 64 65 72 42 79 28 29 20 65 76 65 6e 20 77  OrderBy() even w
27ee0 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61 72 65  hen.** there are
27ef0 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73 20 69   COLLATE terms i
27f00 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a  n the ORDER BY..
27f10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
27f20 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c  nvertCompoundSel
27f30 65 63 74 54 6f 53 75 62 71 75 65 72 79 28 57 61  ectToSubquery(Wa
27f40 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
27f50 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74  elect *p){.  int
27f60 20 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e   i;.  Select *pN
27f70 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 58  ew;.  Select *pX
27f80 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
27f90 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
27fa0 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 53 72  st_item *a;.  Sr
27fb0 63 4c 69 73 74 20 2a 70 4e 65 77 53 72 63 3b 0a  cList *pNewSrc;.
27fc0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
27fd0 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a  .  Token dummy;.
27fe0 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
27ff0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
28000 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28  _Continue;.  if(
28010 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
28020 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
28030 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58 3d  tinue;.  for(pX=
28040 70 3b 20 70 58 20 26 26 20 28 70 58 2d 3e 6f 70  p; pX && (pX->op
28050 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e  ==TK_ALL || pX->
28060 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b 20  op==TK_SELECT); 
28070 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 7d  pX=pX->pPrior){}
28080 0a 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 72  .  if( pX==0 ) r
28090 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
280a0 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f 72  ue;.  a = p->pOr
280b0 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72 28  derBy->a;.  for(
280c0 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  i=p->pOrderBy->n
280d0 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  Expr-1; i>=0; i-
280e0 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 5b 69 5d  -){.    if( a[i]
280f0 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  .pExpr->flags & 
28100 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72 65  EP_Collate ) bre
28110 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c  ak;.  }.  if( i<
28120 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
28130 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49  ontinue;..  /* I
28140 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
28150 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e  point, that mean
28160 73 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61  s the transforma
28170 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64  tion is required
28180 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d  . */..  pParse =
28190 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
281a0 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
281b0 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  >db;.  pNew = sq
281c0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
281d0 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e  o(db, sizeof(*pN
281e0 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ew) );.  if( pNe
281f0 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  w==0 ) return WR
28200 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73 65  C_Abort;.  memse
28210 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69 7a  t(&dummy, 0, siz
28220 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20 70  eof(dummy));.  p
28230 4e 65 77 53 72 63 20 3d 20 73 71 6c 69 74 65 33  NewSrc = sqlite3
28240 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f  SrcListAppendFro
28250 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 30 2c 30  mTerm(pParse,0,0
28260 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c 30  ,0,&dummy,pNew,0
28270 2c 30 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 53  ,0);.  if( pNewS
28280 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  rc==0 ) return W
28290 52 43 5f 41 62 6f 72 74 3b 0a 20 20 2a 70 4e 65  RC_Abort;.  *pNe
282a0 77 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70 53 72  w = *p;.  p->pSr
282b0 63 20 3d 20 70 4e 65 77 53 72 63 3b 0a 20 20 70  c = pNewSrc;.  p
282c0 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74  ->pEList = sqlit
282d0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
282e0 28 70 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69  (pParse, 0, sqli
282f0 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 41  te3Expr(db, TK_A
28300 53 54 45 52 49 53 4b 2c 20 30 29 29 3b 0a 20 20  STERISK, 0));.  
28310 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43  p->op = TK_SELEC
28320 54 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  T;.  p->pWhere =
28330 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f   0;.  pNew->pGro
28340 75 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77  upBy = 0;.  pNew
28350 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20  ->pHaving = 0;. 
28360 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
28370 3d 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72  = 0;.  p->pPrior
28380 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e 65 78 74   = 0;.  p->pNext
28390 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 57 69 74 68   = 0;.  p->pWith
283a0 20 3d 20 30 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c   = 0;.  p->selFl
283b0 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f  ags &= ~SF_Compo
283c0 75 6e 64 3b 0a 20 20 61 73 73 65 72 74 28 20 28  und;.  assert( (
283d0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
283e0 5f 43 6f 6e 76 65 72 74 65 64 29 3d 3d 30 20 29  _Converted)==0 )
283f0 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  ;.  p->selFlags 
28400 7c 3d 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 3b  |= SF_Converted;
28410 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
28420 3e 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a 20 20  >pPrior!=0 );.  
28430 70 4e 65 77 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e  pNew->pPrior->pN
28440 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e  ext = pNew;.  pN
28450 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a  ew->pLimit = 0;.
28460 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
28470 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
28480 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
28490 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
284a0 74 65 72 6d 20 70 46 72 6f 6d 20 68 61 73 20 74  term pFrom has t
284b0 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e 63  able-valued func
284c0 74 69 6f 6e 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  tion.** argument
284d0 73 2e 20 20 49 66 20 69 74 20 64 6f 65 73 2c 20  s.  If it does, 
284e0 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
284f0 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
28500 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e   and return.** n
28510 6f 6e 2d 7a 65 72 6f 2c 20 73 69 6e 63 65 20 70  on-zero, since p
28520 46 72 6f 6d 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  From is not allo
28530 77 65 64 20 74 6f 20 62 65 20 61 20 74 61 62 6c  wed to be a tabl
28540 65 2d 76 61 6c 75 65 64 20 66 75 6e 63 74 69 6f  e-valued functio
28550 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
28560 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f   cannotBeFunctio
28570 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
28580 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
28590 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  item *pFrom){.  
285a0 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73  if( pFrom->fg.is
285b0 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 73  TabFunc ){.    s
285c0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
285d0 50 61 72 73 65 2c 20 22 27 25 73 27 20 69 73 20  Parse, "'%s' is 
285e0 6e 6f 74 20 61 20 66 75 6e 63 74 69 6f 6e 22 2c  not a function",
285f0 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pFrom->zName);.
28600 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
28610 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
28620 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
28630 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41  OMIT_CTE./*.** A
28640 72 67 75 6d 65 6e 74 20 70 57 69 74 68 20 28 77  rgument pWith (w
28650 68 69 63 68 20 6d 61 79 20 62 65 20 4e 55 4c 4c  hich may be NULL
28660 29 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c 69  ) points to a li
28670 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e 65 73  nked list of nes
28680 74 65 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f 6e  ted .** WITH con
28690 74 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e 65  texts, from inne
286a0 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e 20  r to outermost. 
286b0 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 64 65  If the table ide
286c0 6e 74 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 46  ntified by .** F
286d0 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65  ROM clause eleme
286e0 6e 74 20 70 49 74 65 6d 20 69 73 20 72 65 61 6c  nt pItem is real
286f0 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c  ly a common-tabl
28700 65 2d 65 78 70 72 65 73 73 69 6f 6e 20 28 43 54  e-expression (CT
28710 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  E) .** then retu
28720 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
28730 74 68 65 20 43 54 45 20 64 65 66 69 6e 69 74 69  the CTE definiti
28740 6f 6e 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c  on for that tabl
28750 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  e. Otherwise.** 
28760 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
28770 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  ** If a non-NULL
28780 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e   value is return
28790 65 64 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74 65  ed, set *ppConte
287a0 78 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  xt to point to t
287b0 68 65 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65 63  he With.** objec
287c0 74 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72  t that the retur
287d0 6e 65 64 20 43 54 45 20 62 65 6c 6f 6e 67 73 20  ned CTE belongs 
287e0 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  to..*/.static st
287f0 72 75 63 74 20 43 74 65 20 2a 73 65 61 72 63 68  ruct Cte *search
28800 57 69 74 68 28 0a 20 20 57 69 74 68 20 2a 70 57  With(.  With *pW
28810 69 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ith,            
28820 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
28830 6e 74 20 69 6e 6e 65 72 6d 6f 73 74 20 57 49 54  nt innermost WIT
28840 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  H clause */.  st
28850 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
28860 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f 2a  m *pItem,     /*
28870 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65   FROM clause ele
28880 6d 65 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65 20  ment to resolve 
28890 2a 2f 0a 20 20 57 69 74 68 20 2a 2a 70 70 43 6f  */.  With **ppCo
288a0 6e 74 65 78 74 20 20 20 20 20 20 20 20 20 20 20  ntext           
288b0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49 54       /* OUT: WIT
288c0 48 20 63 6c 61 75 73 65 20 72 65 74 75 72 6e 20  H clause return 
288d0 76 61 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74 6f  value belongs to
288e0 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
288f0 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66  har *zName;.  if
28900 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  ( pItem->zDataba
28910 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65 20  se==0 && (zName 
28920 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21  = pItem->zName)!
28930 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a  =0 ){.    With *
28940 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 57 69  p;.    for(p=pWi
28950 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75 74  th; p; p=p->pOut
28960 65 72 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  er){.      int i
28970 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
28980 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29   i<p->nCte; i++)
28990 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
289a0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61  lite3StrICmp(zNa
289b0 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  me, p->a[i].zNam
289c0 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
289d0 20 20 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d 20     *ppContext = 
289e0 70 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  p;.          ret
289f0 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  urn &p->a[i];.  
28a00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
28a10 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
28a20 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  rn 0;.}../* The 
28a30 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6d  code generator m
28a40 61 69 6e 74 61 69 6e 73 20 61 20 73 74 61 63 6b  aintains a stack
28a50 20 6f 66 20 61 63 74 69 76 65 20 57 49 54 48 20   of active WITH 
28a60 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74 68 20  clauses.** with 
28a70 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 57  the inner-most W
28a80 49 54 48 20 63 6c 61 75 73 65 20 62 65 69 6e 67  ITH clause being
28a90 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74   at the top of t
28aa0 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  he stack..**.** 
28ab0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75 73  This routine pus
28ac0 68 65 73 20 74 68 65 20 57 49 54 48 20 63 6c 61  hes the WITH cla
28ad0 75 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68  use passed as th
28ae0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
28af0 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74 6f  t.** onto the to
28b00 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20  p of the stack. 
28b10 49 66 20 61 72 67 75 6d 65 6e 74 20 62 46 72 65  If argument bFre
28b20 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  e is true, then 
28b30 74 68 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c 61  this.** WITH cla
28b40 75 73 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  use will never b
28b50 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68  e popped from th
28b60 65 20 73 74 61 63 6b 2e 20 49 6e 20 74 68 69 73  e stack. In this
28b70 20 63 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f 75   case it.** shou
28b80 6c 64 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e  ld be freed alon
28b90 67 20 77 69 74 68 20 74 68 65 20 50 61 72 73 65  g with the Parse
28ba0 20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68 65   object. In othe
28bb0 72 20 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a 2a  r cases, when.**
28bc0 20 62 46 72 65 65 3d 3d 30 2c 20 74 68 65 20 57   bFree==0, the W
28bd0 69 74 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20  ith object will 
28be0 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77  be freed along w
28bf0 69 74 68 20 74 68 65 20 53 45 4c 45 43 54 20 0a  ith the SELECT .
28c00 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74  ** statement wit
28c10 68 20 77 68 69 63 68 20 69 74 20 69 73 20 61 73  h which it is as
28c20 73 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69  sociated..*/.voi
28c30 64 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73  d sqlite3WithPus
28c40 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  h(Parse *pParse,
28c50 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 75 38   With *pWith, u8
28c60 20 62 46 72 65 65 29 7b 0a 20 20 61 73 73 65 72   bFree){.  asser
28c70 74 28 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20 28  t( bFree==0 || (
28c80 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 30  pParse->pWith==0
28c90 20 26 26 20 70 50 61 72 73 65 2d 3e 70 57 69 74   && pParse->pWit
28ca0 68 54 6f 46 72 65 65 3d 3d 30 29 20 29 3b 0a 20  hToFree==0) );. 
28cb0 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20   if( pWith ){.  
28cc0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
28cd0 2d 3e 70 57 69 74 68 21 3d 70 57 69 74 68 20 29  ->pWith!=pWith )
28ce0 3b 0a 20 20 20 20 70 57 69 74 68 2d 3e 70 4f 75  ;.    pWith->pOu
28cf0 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 70 57  ter = pParse->pW
28d00 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ith;.    pParse-
28d10 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a  >pWith = pWith;.
28d20 20 20 20 20 69 66 28 20 62 46 72 65 65 20 29 20      if( bFree ) 
28d30 70 50 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46  pParse->pWithToF
28d40 72 65 65 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d  ree = pWith;.  }
28d50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
28d60 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69  unction checks i
28d70 66 20 61 72 67 75 6d 65 6e 74 20 70 46 72 6f 6d  f argument pFrom
28d80 20 72 65 66 65 72 73 20 74 6f 20 61 20 43 54 45   refers to a CTE
28d90 20 64 65 63 6c 61 72 65 64 20 62 79 20 0a 2a 2a   declared by .**
28da0 20 61 20 57 49 54 48 20 63 6c 61 75 73 65 20 6f   a WITH clause o
28db0 6e 20 74 68 65 20 73 74 61 63 6b 20 63 75 72 72  n the stack curr
28dc0 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65 64  ently maintained
28dd0 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e 20   by the parser. 
28de0 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72 65  And,.** if curre
28df0 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20  ntly processing 
28e00 61 20 43 54 45 20 65 78 70 72 65 73 73 69 6f 6e  a CTE expression
28e10 2c 20 69 66 20 69 74 20 69 73 20 61 20 72 65 63  , if it is a rec
28e20 75 72 73 69 76 65 0a 2a 2a 20 72 65 66 65 72 65  ursive.** refere
28e30 6e 63 65 20 74 6f 20 74 68 65 20 63 75 72 72 65  nce to the curre
28e40 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  nt CTE..**.** If
28e50 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e 74   pFrom falls int
28e60 6f 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  o either of the 
28e70 74 77 6f 20 63 61 74 65 67 6f 72 69 65 73 20 61  two categories a
28e80 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54 61  bove, pFrom->pTa
28e90 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66  b.** and other f
28ea0 69 65 6c 64 73 20 61 72 65 20 70 6f 70 75 6c 61  ields are popula
28eb0 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
28ec0 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75   The caller shou
28ed0 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46 72  ld check.** (pFr
28ee0 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f 20  om->pTab!=0) to 
28ef0 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  determine whethe
28f00 72 20 6f 72 20 6e 6f 74 20 61 20 73 75 63 63 65  r or not a succe
28f10 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20 77  ssful match.** w
28f20 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20  as found..**.** 
28f30 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  Whether or not a
28f40 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c   match is found,
28f50 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
28f60 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
28f70 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49 66  or.** occurs. If
28f80 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f   an error does o
28f90 63 63 75 72 2c 20 61 6e 20 65 72 72 6f 72 20 6d  ccur, an error m
28fa0 65 73 73 61 67 65 20 69 73 20 73 74 6f 72 65 64  essage is stored
28fb0 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73 65   in the.** parse
28fc0 72 20 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f 72  r and some error
28fd0 20 63 6f 64 65 20 6f 74 68 65 72 20 74 68 61 6e   code other than
28fe0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
28ff0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
29000 6e 74 20 77 69 74 68 45 78 70 61 6e 64 28 0a 20  nt withExpand(. 
29010 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72   Walker *pWalker
29020 2c 20 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  , .  struct SrcL
29030 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 0a  ist_item *pFrom.
29040 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
29050 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
29060 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 20  arse;.  sqlite3 
29070 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
29080 3b 0a 20 20 73 74 72 75 63 74 20 43 74 65 20 2a  ;.  struct Cte *
29090 70 43 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  pCte;           
290a0 20 20 20 20 2f 2a 20 4d 61 74 63 68 65 64 20 43      /* Matched C
290b0 54 45 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20 6e  TE (or NULL if n
290c0 6f 20 6d 61 74 63 68 29 20 2a 2f 0a 20 20 57 69  o match) */.  Wi
290d0 74 68 20 2a 70 57 69 74 68 3b 20 20 20 20 20 20  th *pWith;      
290e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
290f0 20 57 49 54 48 20 63 6c 61 75 73 65 20 74 68 61   WITH clause tha
29100 74 20 70 43 74 65 20 62 65 6c 6f 6e 67 73 20 74  t pCte belongs t
29110 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  o */..  assert( 
29120 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
29130 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73 65 61 72  ;..  pCte = sear
29140 63 68 57 69 74 68 28 70 50 61 72 73 65 2d 3e 70  chWith(pParse->p
29150 57 69 74 68 2c 20 70 46 72 6f 6d 2c 20 26 70 57  With, pFrom, &pW
29160 69 74 68 29 3b 0a 20 20 69 66 28 20 70 43 74 65  ith);.  if( pCte
29170 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
29180 54 61 62 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  Tab;.    ExprLis
29190 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53  t *pEList;.    S
291a0 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20  elect *pSel;.   
291b0 20 53 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b 20   Select *pLeft; 
291c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
291d0 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45  * Left-most SELE
291e0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
291f0 20 20 20 20 69 6e 74 20 62 4d 61 79 52 65 63 75      int bMayRecu
29200 72 73 69 76 65 3b 20 20 20 20 20 20 20 20 20 20  rsive;          
29210 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 6f 6d    /* True if com
29220 70 6f 75 6e 64 20 6a 6f 69 6e 65 64 20 62 79 20  pound joined by 
29230 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a 20  UNION [ALL] */. 
29240 20 20 20 57 69 74 68 20 2a 70 53 61 76 65 64 57     With *pSavedW
29250 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ith;            
29260 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75   /* Initial valu
29270 65 20 6f 66 20 70 50 61 72 73 65 2d 3e 70 57 69  e of pParse->pWi
29280 74 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66  th */..    /* If
29290 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69   pCte->zCteErr i
292a0 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74 68  s non-NULL at th
292b0 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74  is point, then t
292c0 68 69 73 20 69 73 20 61 6e 20 69 6c 6c 65 67 61  his is an illega
292d0 6c 0a 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69  l.    ** recursi
292e0 76 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ve reference to 
292f0 43 54 45 20 70 43 74 65 2e 20 4c 65 61 76 65 20  CTE pCte. Leave 
29300 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72  an error in pPar
29310 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  se and return.  
29320 20 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20 70    ** early. If p
29330 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69 73 20  Cte->zCteErr is 
29340 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20  NULL, then this 
29350 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69  is not a recursi
29360 76 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 20 20  ve reference..  
29370 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
29380 65 2c 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a  e, proceed.  */.
29390 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e 7a 43      if( pCte->zC
293a0 74 65 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73  teErr ){.      s
293b0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
293c0 50 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a 43 74  Parse, pCte->zCt
293d0 65 45 72 72 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d  eErr, pCte->zNam
293e0 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
293f0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
29400 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 61 6e     }.    if( can
29410 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50  notBeFunction(pP
29420 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 20 72  arse, pFrom) ) r
29430 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
29440 4f 52 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  OR;..    assert(
29450 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
29460 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  );.    pFrom->pT
29470 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69  ab = pTab = sqli
29480 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
29490 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
294a0 29 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ));.    if( pTab
294b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
294c0 5f 41 62 6f 72 74 3b 0a 20 20 20 20 70 54 61 62  _Abort;.    pTab
294d0 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20  ->nTabRef = 1;. 
294e0 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d     pTab->zName =
294f0 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
29500 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  (db, pCte->zName
29510 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b  );.    pTab->iPK
29520 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 70 54 61  ey = -1;.    pTa
29530 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20  b->nRowLogEst = 
29540 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30  200; assert( 200
29550 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
29560 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 20 20  1048576) );.    
29570 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
29580 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 20 7c  = TF_Ephemeral |
29590 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77   TF_NoVisibleRow
295a0 69 64 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70  id;.    pFrom->p
295b0 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
295c0 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 43  SelectDup(db, pC
295d0 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b  te->pSelect, 0);
295e0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
295f0 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
29600 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
29610 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74  BKPT;.    assert
29620 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  ( pFrom->pSelect
29630 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63   );..    /* Chec
29640 6b 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72  k if this is a r
29650 65 63 75 72 73 69 76 65 20 43 54 45 2e 20 2a 2f  ecursive CTE. */
29660 0a 20 20 20 20 70 53 65 6c 20 3d 20 70 46 72 6f  .    pSel = pFro
29670 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
29680 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 3d 20  bMayRecursive = 
29690 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41  ( pSel->op==TK_A
296a0 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d  LL || pSel->op==
296b0 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20  TK_UNION );.    
296c0 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76  if( bMayRecursiv
296d0 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  e ){.      int i
296e0 3b 0a 20 20 20 20 20 20 53 72 63 4c 69 73 74 20  ;.      SrcList 
296f0 2a 70 53 72 63 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSrc = pFrom->p
29700 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20  Select->pSrc;.  
29710 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
29720 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  Src->nSrc; i++){
29730 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
29740 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
29750 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69  tem = &pSrc->a[i
29760 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
29770 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d  Item->zDatabase=
29780 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0 .         && 
29790 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20  pItem->zName!=0 
297a0 0a 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d  .         && 0==
297b0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
297c0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74  Item->zName, pCt
297d0 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20  e->zName).      
297e0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
297f0 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70   pItem->pTab = p
29800 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Tab;.          p
29810 49 74 65 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72  Item->fg.isRecur
29820 73 69 76 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  sive = 1;.      
29830 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65      pTab->nTabRe
29840 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  f++;.          p
29850 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  Sel->selFlags |=
29860 20 53 46 5f 52 65 63 75 72 73 69 76 65 3b 0a 20   SF_Recursive;. 
29870 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
29880 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f  .    }..    /* O
29890 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72 73 69 76  nly one recursiv
298a0 65 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 70  e reference is p
298b0 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a 20 20  ermitted. */ .  
298c0 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 54 61 62    if( pTab->nTab
298d0 52 65 66 3e 32 20 29 7b 0a 20 20 20 20 20 20 73  Ref>2 ){.      s
298e0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 0a  qlite3ErrorMsg(.
298f0 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
29900 2c 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 66 65  , "multiple refe
29910 72 65 6e 63 65 73 20 74 6f 20 72 65 63 75 72 73  rences to recurs
29920 69 76 65 20 74 61 62 6c 65 3a 20 25 73 22 2c 20  ive table: %s", 
29930 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  pCte->zName.    
29940 20 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72    );.      retur
29950 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
29960 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
29970 28 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3d  ( pTab->nTabRef=
29980 3d 31 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  =1 || .         
29990 20 20 20 28 28 70 53 65 6c 2d 3e 73 65 6c 46 6c     ((pSel->selFl
299a0 61 67 73 26 53 46 5f 52 65 63 75 72 73 69 76 65  ags&SF_Recursive
299b0 29 20 26 26 20 70 54 61 62 2d 3e 6e 54 61 62 52  ) && pTab->nTabR
299c0 65 66 3d 3d 32 20 29 29 3b 0a 0a 20 20 20 20 70  ef==2 ));..    p
299d0 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22  Cte->zCteErr = "
299e0 63 69 72 63 75 6c 61 72 20 72 65 66 65 72 65 6e  circular referen
299f0 63 65 3a 20 25 73 22 3b 0a 20 20 20 20 70 53 61  ce: %s";.    pSa
29a00 76 65 64 57 69 74 68 20 3d 20 70 50 61 72 73 65  vedWith = pParse
29a10 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61  ->pWith;.    pPa
29a20 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69  rse->pWith = pWi
29a30 74 68 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79  th;.    if( bMay
29a40 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
29a50 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f     Select *pPrio
29a60 72 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  r = pSel->pPrior
29a70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
29a80 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 3d 3d 30  pPrior->pWith==0
29a90 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72   );.      pPrior
29aa0 2d 3e 70 57 69 74 68 20 3d 20 70 53 65 6c 2d 3e  ->pWith = pSel->
29ab0 70 57 69 74 68 3b 0a 20 20 20 20 20 20 73 71 6c  pWith;.      sql
29ac0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
29ad0 57 61 6c 6b 65 72 2c 20 70 50 72 69 6f 72 29 3b  Walker, pPrior);
29ae0 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70  .      pPrior->p
29af0 57 69 74 68 20 3d 20 30 3b 0a 20 20 20 20 7d 65  With = 0;.    }e
29b00 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
29b10 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
29b20 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20  lker, pSel);.   
29b30 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70   }.    pParse->p
29b40 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 0a 20  With = pWith;.. 
29b50 20 20 20 66 6f 72 28 70 4c 65 66 74 3d 70 53 65     for(pLeft=pSe
29b60 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72  l; pLeft->pPrior
29b70 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74 2d 3e 70  ; pLeft=pLeft->p
29b80 50 72 69 6f 72 29 3b 0a 20 20 20 20 70 45 4c 69  Prior);.    pELi
29b90 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70 45 4c 69  st = pLeft->pELi
29ba0 73 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 65  st;.    if( pCte
29bb0 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20 20 20 20 20  ->pCols ){.     
29bc0 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70   if( pEList && p
29bd0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 43  EList->nExpr!=pC
29be0 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72  te->pCols->nExpr
29bf0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
29c00 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
29c10 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61  se, "table %s ha
29c20 73 20 25 64 20 76 61 6c 75 65 73 20 66 6f 72 20  s %d values for 
29c30 25 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20  %d columns",.   
29c40 20 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a           pCte->z
29c50 4e 61 6d 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Name, pEList->nE
29c60 78 70 72 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73  xpr, pCte->pCols
29c70 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 20 20  ->nExpr.        
29c80 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
29c90 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65  e->pWith = pSave
29ca0 64 57 69 74 68 3b 0a 20 20 20 20 20 20 20 20 72  dWith;.        r
29cb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
29cc0 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
29cd0 20 20 70 45 4c 69 73 74 20 3d 20 70 43 74 65 2d    pEList = pCte-
29ce0 3e 70 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20  >pCols;.    }.. 
29cf0 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
29d00 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  sFromExprList(pP
29d10 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 26 70  arse, pEList, &p
29d20 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  Tab->nCol, &pTab
29d30 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28  ->aCol);.    if(
29d40 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29   bMayRecursive )
29d50 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c  {.      if( pSel
29d60 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
29d70 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
29d80 20 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45       pCte->zCteE
29d90 72 72 20 3d 20 22 6d 75 6c 74 69 70 6c 65 20 72  rr = "multiple r
29da0 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
29db0 63 65 73 3a 20 25 73 22 3b 0a 20 20 20 20 20 20  ces: %s";.      
29dc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
29dd0 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22  Cte->zCteErr = "
29de0 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
29df0 6e 63 65 20 69 6e 20 61 20 73 75 62 71 75 65 72  nce in a subquer
29e00 79 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a  y: %s";.      }.
29e10 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
29e20 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
29e30 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   pSel);.    }.  
29e40 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20    pCte->zCteErr 
29e50 3d 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  = 0;.    pParse-
29e60 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65 64 57  >pWith = pSavedW
29e70 69 74 68 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ith;.  }..  retu
29e80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
29e90 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
29ea0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
29eb0 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c  /*.** If the SEL
29ec0 45 43 54 20 70 61 73 73 65 64 20 61 73 20 74 68  ECT passed as th
29ed0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
29ee0 74 20 68 61 73 20 61 6e 20 61 73 73 6f 63 69 61  t has an associa
29ef0 74 65 64 20 57 49 54 48 20 0a 2a 2a 20 63 6c 61  ted WITH .** cla
29f00 75 73 65 2c 20 70 6f 70 20 69 74 20 66 72 6f 6d  use, pop it from
29f10 20 74 68 65 20 73 74 61 63 6b 20 73 74 6f 72 65   the stack store
29f20 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
29f30 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a   Parse object..*
29f40 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
29f50 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20 74 68  on is used as th
29f60 65 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  e xSelectCallbac
29f70 6b 32 28 29 20 63 61 6c 6c 62 61 63 6b 20 62 79  k2() callback by
29f80 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63  .** sqlite3Selec
29f90 74 45 78 70 61 6e 64 28 29 20 77 68 65 6e 20 77  tExpand() when w
29fa0 61 6c 6b 69 6e 67 20 61 20 53 45 4c 45 43 54 20  alking a SELECT 
29fb0 74 72 65 65 20 74 6f 20 72 65 73 6f 6c 76 65 20  tree to resolve 
29fc0 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 61  table.** names a
29fd0 6e 64 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c  nd other FROM cl
29fe0 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 2e 20 0a  ause elements. .
29ff0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
2a000 65 6c 65 63 74 50 6f 70 57 69 74 68 28 57 61 6c  electPopWith(Wal
2a010 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
2a020 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73  lect *p){.  Pars
2a030 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
2a040 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  ker->pParse;.  i
2a050 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f  f( OK_IF_ALWAYS_
2a060 54 52 55 45 28 70 50 61 72 73 65 2d 3e 70 57 69  TRUE(pParse->pWi
2a070 74 68 29 20 26 26 20 70 2d 3e 70 50 72 69 6f 72  th) && p->pPrior
2a080 3d 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20  ==0 ){.    With 
2a090 2a 70 57 69 74 68 20 3d 20 66 69 6e 64 52 69 67  *pWith = findRig
2a0a0 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68  htmost(p)->pWith
2a0b0 3b 0a 20 20 20 20 69 66 28 20 70 57 69 74 68 21  ;.    if( pWith!
2a0c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
2a0d0 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74  rt( pParse->pWit
2a0e0 68 3d 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20  h==pWith );.    
2a0f0 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
2a100 3d 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 3b  = pWith->pOuter;
2a110 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c  .    }.  }.}.#el
2a120 73 65 0a 23 64 65 66 69 6e 65 20 73 65 6c 65 63  se.#define selec
2a130 74 50 6f 70 57 69 74 68 20 30 0a 23 65 6e 64 69  tPopWith 0.#endi
2a140 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 53 72 63  f../*.** The Src
2a150 4c 69 73 74 5f 69 74 65 6d 20 73 74 72 75 63 74  List_item struct
2a160 75 72 65 20 70 61 73 73 65 64 20 61 73 20 74 68  ure passed as th
2a170 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
2a180 74 20 72 65 70 72 65 73 65 6e 74 73 20 61 0a 2a  t represents a.*
2a190 2a 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  * sub-query in t
2a1a0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
2a1b0 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  f a SELECT state
2a1c0 6d 65 6e 74 2e 20 54 68 69 73 20 66 75 6e 63 74  ment. This funct
2a1d0 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73  ion.** allocates
2a1e0 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 73 20 74   and populates t
2a1f0 68 65 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 2e  he SrcList_item.
2a200 70 54 61 62 20 6f 62 6a 65 63 74 2e 20 49 66 20  pTab object. If 
2a210 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 53  successful,.** S
2a220 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2a230 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
2a240 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   if an OOM error
2a250 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
2a260 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
2a270 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2a280 45 78 70 61 6e 64 53 75 62 71 75 65 72 79 28 50  ExpandSubquery(P
2a290 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74  arse *pParse, st
2a2a0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2a2b0 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 53 65 6c  m *pFrom){.  Sel
2a2c0 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f  ect *pSel = pFro
2a2d0 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 54 61  m->pSelect;.  Ta
2a2e0 62 6c 65 20 2a 70 54 61 62 3b 0a 0a 20 20 61 73  ble *pTab;..  as
2a2f0 73 65 72 74 28 20 70 53 65 6c 20 29 3b 0a 20 20  sert( pSel );.  
2a300 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
2a310 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ab = sqlite3DbMa
2a320 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
2a330 3e 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  >db, sizeof(Tabl
2a340 65 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  e));.  if( pTab=
2a350 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
2a360 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 54 61 62  TE_NOMEM;.  pTab
2a370 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20  ->nTabRef = 1;. 
2a380 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69   if( pFrom->zAli
2a390 61 73 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e  as ){.    pTab->
2a3a0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
2a3b0 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e  bStrDup(pParse->
2a3c0 64 62 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61  db, pFrom->zAlia
2a3d0 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  s);.  }else{.   
2a3e0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pTab->zName = s
2a3f0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50  qlite3MPrintf(pP
2a400 61 72 73 65 2d 3e 64 62 2c 20 22 73 75 62 71 75  arse->db, "subqu
2a410 65 72 79 5f 25 75 22 2c 20 70 53 65 6c 2d 3e 73  ery_%u", pSel->s
2a420 65 6c 49 64 29 3b 0a 20 20 7d 0a 20 20 77 68 69  elId);.  }.  whi
2a430 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  le( pSel->pPrior
2a440 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d   ){ pSel = pSel-
2a450 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 73 71 6c  >pPrior; }.  sql
2a460 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  ite3ColumnsFromE
2a470 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
2a480 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 26 70 54  pSel->pEList,&pT
2a490 61 62 2d 3e 6e 43 6f 6c 2c 26 70 54 61 62 2d 3e  ab->nCol,&pTab->
2a4a0 61 43 6f 6c 29 3b 0a 20 20 70 54 61 62 2d 3e 69  aCol);.  pTab->i
2a4b0 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61  PKey = -1;.  pTa
2a4c0 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20  b->nRowLogEst = 
2a4d0 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30  200; assert( 200
2a4e0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
2a4f0 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 70 54  1048576) );.  pT
2a500 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
2a510 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 0a 20  TF_Ephemeral;.. 
2a520 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2a530 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
2a540 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61   routine is a Wa
2a550 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f  lker callback fo
2a560 72 20 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20  r "expanding" a 
2a570 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2a580 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22  ..** "Expanding"
2a590 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65   means to do the
2a5a0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
2a5b0 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73  *    (1)  Make s
2a5c0 75 72 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  ure VDBE cursor 
2a5d0 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
2a5e0 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76  n assigned to ev
2a5f0 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65  ery.**         e
2a600 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52  lement of the FR
2a610 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  OM clause..**.**
2a620 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e      (2)  Fill in
2a630 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61   the pTabList->a
2a640 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69  [].pTab fields i
2a650 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68  n the SrcList th
2a660 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64  at .**         d
2a670 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75  efines FROM clau
2a680 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20  se.  When views 
2a690 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52  appear in the FR
2a6a0 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20  OM clause,.**   
2a6b0 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c        fill pTabL
2a6c0 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74  ist->a[].pSelect
2a6d0 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
2a6e0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
2a6f0 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
2a700 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
2a710 74 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70  the view.  A cop
2a720 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65  y is made of the
2a730 20 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a   view's SELECT.*
2a740 2a 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d  *         statem
2a750 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63  ent so that we c
2a760 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79  an freely modify
2a770 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20   or delete that 
2a780 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  statement.**    
2a790 20 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72       without wor
2a7a0 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73  rying about mess
2a7b0 69 6e 67 20 75 70 20 74 68 65 20 70 65 72 73 69  ing up the persi
2a7c0 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61  stent representa
2a7d0 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  tion.**         
2a7e0 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a  of the view..**.
2a7f0 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64 20 74  **    (3)  Add t
2a800 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52  erms to the WHER
2a810 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f  E clause to acco
2a820 6d 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55  mmodate the NATU
2a830 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20  RAL keyword.**  
2a840 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20         on joins 
2a850 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55  and the ON and U
2a860 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a  SING clause of j
2a870 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  oins..**.**    (
2a880 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73  4)  Scan the lis
2a890 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  t of columns in 
2a8a0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 28  the result set (
2a8b0 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a  pEList) looking.
2a8c0 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20 69  **         for i
2a8d0 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
2a8e0 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  "*" operator or 
2a8f0 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72  the TABLE.* oper
2a900 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ator..**        
2a910 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e   If found, expan
2a920 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65  d each "*" to be
2a930 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
2a940 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20   every table.** 
2a950 20 20 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c          and TABL
2a960 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20  E.* to be every 
2a970 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e  column in TABLE.
2a980 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
2a990 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  t selectExpander
2a9a0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2a9b0 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
2a9c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
2a9d0 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
2a9e0 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a  .  int i, j, k;.
2a9f0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
2aa00 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
2aa10 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  *pEList;.  struc
2aa20 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2aa30 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pFrom;.  sqlite3
2aa40 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
2aa50 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c 20 2a  b;.  Expr *pE, *
2aa60 70 52 69 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a  pRight, *pExpr;.
2aa70 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 20 3d    u16 selFlags =
2aa80 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 20 20   p->selFlags;.  
2aa90 75 33 32 20 65 6c 69 73 74 46 6c 61 67 73 20 3d  u32 elistFlags =
2aaa0 20 30 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c 61   0;..  p->selFla
2aab0 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65  gs |= SF_Expande
2aac0 64 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  d;.  if( db->mal
2aad0 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20  locFailed  ){.  
2aae0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
2aaf0 72 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rt;.  }.  assert
2ab00 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 0a  ( p->pSrc!=0 );.
2ab10 20 20 69 66 28 20 28 73 65 6c 46 6c 61 67 73 20    if( (selFlags 
2ab20 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d  & SF_Expanded)!=
2ab30 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
2ab40 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20  WRC_Prune;.  }. 
2ab50 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
2ab60 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  Src;.  pEList = 
2ab70 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c  p->pEList;.  sql
2ab80 69 74 65 33 57 69 74 68 50 75 73 68 28 70 50 61  ite3WithPush(pPa
2ab90 72 73 65 2c 20 70 2d 3e 70 57 69 74 68 2c 20 30  rse, p->pWith, 0
2aba0 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  );..  /* Make su
2abb0 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  re cursor number
2abc0 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69  s have been assi
2abd0 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72  gned to all entr
2abe0 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20  ies in.  ** the 
2abf0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
2ac00 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
2ac10 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ent..  */.  sqli
2ac20 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
2ac30 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
2ac40 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a  pTabList);..  /*
2ac50 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74   Look up every t
2ac60 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68  able named in th
2ac70 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
2ac80 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66   the select.  If
2ac90 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f  .  ** an entry o
2aca0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
2acb0 65 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20  e is a subquery 
2acc0 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74 61 62  instead of a tab
2acd0 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a  le or view,.  **
2ace0 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 74   then create a t
2acf0 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73  ransient table s
2ad00 74 72 75 63 74 75 72 65 20 74 6f 20 64 65 73 63  tructure to desc
2ad10 72 69 62 65 20 74 68 65 20 73 75 62 71 75 65 72  ribe the subquer
2ad20 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  y..  */.  for(i=
2ad30 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
2ad40 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
2ad50 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
2ad60 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  om++){.    Table
2ad70 20 2a 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65   *pTab;.    asse
2ad80 72 74 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73  rt( pFrom->fg.is
2ad90 52 65 63 75 72 73 69 76 65 3d 3d 30 20 7c 7c 20  Recursive==0 || 
2ada0 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29  pFrom->pTab!=0 )
2adb0 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  ;.    if( pFrom-
2adc0 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20  >fg.isRecursive 
2add0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2ade0 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
2adf0 54 61 62 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65  Tab==0 );.#ifnde
2ae00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
2ae10 45 0a 20 20 20 20 69 66 28 20 77 69 74 68 45 78  E.    if( withEx
2ae20 70 61 6e 64 28 70 57 61 6c 6b 65 72 2c 20 70 46  pand(pWalker, pF
2ae30 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 57 52  rom) ) return WR
2ae40 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69 66 28  C_Abort;.    if(
2ae50 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29 20 7b   pFrom->pTab ) {
2ae60 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20  } else.#endif.  
2ae70 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61    if( pFrom->zNa
2ae80 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66  me==0 ){.#ifndef
2ae90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
2aea0 51 55 45 52 59 0a 20 20 20 20 20 20 53 65 6c 65  QUERY.      Sele
2aeb0 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d  ct *pSel = pFrom
2aec0 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
2aed0 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
2aee0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2aef0 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
2af00 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
2af10 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  pSel!=0 );.     
2af20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
2af30 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  pTab==0 );.     
2af40 20 69 66 28 20 73 71 6c 69 74 65 33 57 61 6c 6b   if( sqlite3Walk
2af50 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
2af60 70 53 65 6c 29 20 29 20 72 65 74 75 72 6e 20 57  pSel) ) return W
2af70 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
2af80 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 61 6e  if( sqlite3Expan
2af90 64 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65  dSubquery(pParse
2afa0 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72  , pFrom) ) retur
2afb0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 23 65 6e  n WRC_Abort;.#en
2afc0 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
2afd0 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e       /* An ordin
2afe0 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65  ary table or vie
2aff0 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52  w name in the FR
2b000 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
2b010 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
2b020 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
2b030 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
2b040 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
2b050 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70  ocateTableItem(p
2b060 50 61 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29  Parse, 0, pFrom)
2b070 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
2b080 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
2b090 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 69 66  _Abort;.      if
2b0a0 28 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e  ( pTab->nTabRef>
2b0b0 3d 30 78 66 66 66 66 20 29 7b 0a 20 20 20 20 20  =0xffff ){.     
2b0c0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2b0d0 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
2b0e0 6d 61 6e 79 20 72 65 66 65 72 65 6e 63 65 73 20  many references 
2b0f0 74 6f 20 5c 22 25 73 5c 22 3a 20 6d 61 78 20 36  to \"%s\": max 6
2b100 35 35 33 35 22 2c 0a 20 20 20 20 20 20 20 20 20  5535",.         
2b110 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a    pTab->zName);.
2b120 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70          pFrom->p
2b130 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Tab = 0;.       
2b140 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
2b150 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
2b160 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b   pTab->nTabRef++
2b170 3b 0a 20 20 20 20 20 20 69 66 28 20 21 49 73 56  ;.      if( !IsV
2b180 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26 20  irtual(pTab) && 
2b190 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e  cannotBeFunction
2b1a0 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20  (pParse, pFrom) 
2b1b0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
2b1c0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
2b1d0 20 20 20 7d 0a 23 69 66 20 21 64 65 66 69 6e 65     }.#if !define
2b1e0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
2b1f0 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20  EW) || !defined 
2b200 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
2b210 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20  TUALTABLE).     
2b220 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
2b230 54 61 62 29 20 7c 7c 20 70 54 61 62 2d 3e 70 53  Tab) || pTab->pS
2b240 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
2b250 20 69 31 36 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   i16 nCol;.     
2b260 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 69     if( sqlite3Vi
2b270 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
2b280 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29  (pParse, pTab) )
2b290 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
2b2a0 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
2b2b0 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  t( pFrom->pSelec
2b2c0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
2b2d0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  pFrom->pSelect =
2b2e0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
2b2f0 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c  p(db, pTab->pSel
2b300 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ect, 0);.       
2b310 20 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43   nCol = pTab->nC
2b320 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62  ol;.        pTab
2b330 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20  ->nCol = -1;.   
2b340 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
2b350 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
2b360 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pFrom->pSelect);
2b370 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  .        pTab->n
2b380 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20  Col = nCol;.    
2b390 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
2b3a0 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20  ..    /* Locate 
2b3b0 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 64 20  the index named 
2b3c0 62 79 20 74 68 65 20 49 4e 44 45 58 45 44 20 42  by the INDEXED B
2b3d0 59 20 63 6c 61 75 73 65 2c 20 69 66 20 61 6e 79  Y clause, if any
2b3e0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  . */.    if( sql
2b3f0 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f  ite3IndexedByLoo
2b400 6b 75 70 28 70 50 61 72 73 65 2c 20 70 46 72 6f  kup(pParse, pFro
2b410 6d 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  m) ){.      retu
2b420 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
2b430 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72    }.  }..  /* Pr
2b440 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65  ocess NATURAL ke
2b450 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61  ywords, and ON a
2b460 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
2b470 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a   of joins..  */.
2b480 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
2b490 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65  Failed || sqlite
2b4a0 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72  ProcessJoin(pPar
2b4b0 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65  se, p) ){.    re
2b4c0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
2b4d0 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76    }..  /* For ev
2b4e0 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63  ery "*" that occ
2b4f0 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  urs in the colum
2b500 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74  n list, insert t
2b510 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a  he names of.  **
2b520 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
2b530 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64  all tables.  And
2b540 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45   for every TABLE
2b550 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  .* insert the na
2b560 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20  mes.  ** of all 
2b570 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45  columns in TABLE
2b580 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e  .  The parser in
2b590 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61 6c  serted a special
2b5a0 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
2b5b0 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 53 54   with the TK_AST
2b5c0 45 52 49 53 4b 20 6f 70 65 72 61 74 6f 72 20 66  ERISK operator f
2b5d0 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74  or each "*" that
2b5e0 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65   it found in the
2b5f0 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6c 69 73   column.  ** lis
2b600 74 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  t.  The followin
2b610 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20  g code just has 
2b620 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b  to locate the TK
2b630 5f 41 53 54 45 52 49 53 4b 0a 20 20 2a 2a 20 65  _ASTERISK.  ** e
2b640 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65  xpressions and e
2b650 78 70 61 6e 64 20 65 61 63 68 20 6f 6e 65 20 74  xpand each one t
2b660 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
2b670 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a 20 20 2a  l columns in.  *
2b680 2a 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20  * all tables..  
2b690 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
2b6a0 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63  t loop just chec
2b6b0 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ks to see if the
2b6c0 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f  re are any "*" o
2b6d0 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68  perators.  ** th
2b6e0 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e  at need expandin
2b6f0 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d  g..  */.  for(k=
2b700 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
2b710 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 70 45  pr; k++){.    pE
2b720 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e   = pEList->a[k].
2b730 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
2b740 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49  E->op==TK_ASTERI
2b750 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  SK ) break;.    
2b760 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d  assert( pE->op!=
2b770 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 65 58  TK_DOT || pE->eX
2b780 3d 3d 45 58 5f 52 69 67 68 74 20 29 3b 0a 20 20  ==EX_Right );.  
2b790 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
2b7a0 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d  !=TK_DOT || (pE-
2b7b0 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d  >pLeft!=0 && pE-
2b7c0 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  >pLeft->op==TK_I
2b7d0 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45  D) );.    if( pE
2b7e0 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20  ->op==TK_DOT && 
2b7f0 70 45 2d 3e 78 2e 70 52 69 67 68 74 2d 3e 6f 70  pE->x.pRight->op
2b800 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 20  ==TK_ASTERISK ) 
2b810 62 72 65 61 6b 3b 0a 20 20 20 20 65 6c 69 73 74  break;.    elist
2b820 46 6c 61 67 73 20 7c 3d 20 70 45 2d 3e 66 6c 61  Flags |= pE->fla
2b830 67 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c  gs;.  }.  if( k<
2b840 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
2b850 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49  .    /*.    ** I
2b860 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69 74  f we get here it
2b870 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c   means the resul
2b880 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f  t set contains o
2b890 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20  ne or more "*". 
2b8a0 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20     ** operators 
2b8b0 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
2b8c0 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20  expanded.  Loop 
2b8d0 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70  through each exp
2b8e0 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69  ression.    ** i
2b8f0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
2b900 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d   and expand them
2b910 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20   one by one..   
2b920 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45   */.    struct E
2b930 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20  xprList_item *a 
2b940 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  = pEList->a;.   
2b950 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20   ExprList *pNew 
2b960 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61  = 0;.    int fla
2b970 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  gs = pParse->db-
2b980 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20  >flags;.    int 
2b990 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61  longNames = (fla
2b9a0 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c  gs & SQLITE_Full
2b9b0 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20  ColNames)!=0.   
2b9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b9d0 20 20 20 26 26 20 28 66 6c 61 67 73 20 26 20 53     && (flags & S
2b9e0 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
2b9f0 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f  mes)==0;..    fo
2ba00 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
2ba10 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
2ba20 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45      pE = a[k].pE
2ba30 78 70 72 3b 0a 20 20 20 20 20 20 65 6c 69 73 74  xpr;.      elist
2ba40 46 6c 61 67 73 20 7c 3d 20 70 45 2d 3e 66 6c 61  Flags |= pE->fla
2ba50 67 73 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74  gs;.      pRight
2ba60 20 3d 20 70 45 2d 3e 65 58 3d 3d 45 58 5f 52 69   = pE->eX==EX_Ri
2ba70 67 68 74 20 3f 20 70 45 2d 3e 78 2e 70 52 69 67  ght ? pE->x.pRig
2ba80 68 74 20 3a 20 30 3b 0a 20 20 20 20 20 20 61 73  ht : 0;.      as
2ba90 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b  sert( pE->op!=TK
2baa0 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 21 3d  _DOT || pRight!=
2bab0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
2bac0 45 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49  E->op!=TK_ASTERI
2bad0 53 4b 0a 20 20 20 20 20 20 20 26 26 20 28 70 45  SK.       && (pE
2bae0 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
2baf0 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41  pRight->op!=TK_A
2bb00 53 54 45 52 49 53 4b 29 0a 20 20 20 20 20 20 29  STERISK).      )
2bb10 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
2bb20 73 20 70 61 72 74 69 63 75 6c 61 72 20 65 78 70  s particular exp
2bb30 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ression does not
2bb40 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61   need to be expa
2bb50 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nded..        */
2bb60 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
2bb70 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
2bb80 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e  ppend(pParse, pN
2bb90 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29 3b  ew, a[k].pExpr);
2bba0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
2bbb0 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  w ){.          p
2bbc0 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78  New->a[pNew->nEx
2bbd0 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b  pr-1].zName = a[
2bbe0 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  k].zName;.      
2bbf0 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
2bc00 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61 6e  ->nExpr-1].zSpan
2bc10 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20   = a[k].zSpan;. 
2bc20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e           a[k].zN
2bc30 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
2bc40 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20     a[k].zSpan = 
2bc50 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
2bc60 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20       a[k].pExpr 
2bc70 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
2bc80 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
2bc90 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
2bca0 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c  a "*" or a "TABL
2bcb0 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74  E.*" and needs t
2bcc0 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  o be.        ** 
2bcd0 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20  expanded. */.   
2bce0 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65       int tableSe
2bcf0 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  en = 0;      /* 
2bd00 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41  Set to 1 when TA
2bd10 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20  BLE matches */. 
2bd20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e         char *zTN
2bd30 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ame = 0;       /
2bd40 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f  * text of name o
2bd50 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20  f TABLE */.     
2bd60 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
2bd70 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20  K_DOT ){.       
2bd80 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 70     assert( pE->p
2bd90 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Left!=0 );.     
2bda0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
2bdb0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
2bdc0 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74 56  ->pLeft, EP_IntV
2bdd0 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
2bde0 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d 3e     zTName = pE->
2bdf0 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pLeft->u.zToken;
2be00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2be10 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f     for(i=0, pFro
2be20 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
2be30 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
2be40 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a   i++, pFrom++){.
2be50 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20            Table 
2be60 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
2be70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 53  Tab;.          S
2be80 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 46  elect *pSub = pF
2be90 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  rom->pSelect;.  
2bea0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
2beb0 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e  abName = pFrom->
2bec0 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20  zAlias;.        
2bed0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
2bee0 63 68 65 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a 20  chemaName = 0;. 
2bef0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62           int iDb
2bf00 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2bf10 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  zTabName==0 ){. 
2bf20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e             zTabN
2bf30 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  ame = pTab->zNam
2bf40 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
2bf50 20 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d           if( db-
2bf60 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
2bf70 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
2bf80 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20   if( pSub==0 || 
2bf90 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20  (pSub->selFlags 
2bfa0 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29  & SF_NestedFrom)
2bfb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2bfc0 20 20 20 70 53 75 62 20 3d 20 30 3b 0a 20 20 20     pSub = 0;.   
2bfd0 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
2bfe0 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53 74  ame && sqlite3St
2bff0 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54  rICmp(zTName, zT
2c000 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  abName)!=0 ){.  
2c010 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
2c020 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2c030 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2c040 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
2c050 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
2c060 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
2c070 20 20 20 20 20 20 20 20 20 20 20 7a 53 63 68 65             zSche
2c080 6d 61 4e 61 6d 65 20 3d 20 69 44 62 3e 3d 30 20  maName = iDb>=0 
2c090 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ? db->aDb[iDb].z
2c0a0 44 62 53 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a 20  DbSName : "*";. 
2c0b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c0c0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
2c0d0 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  pTab->nCol; j++)
2c0e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  {.            ch
2c0f0 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62  ar *zName = pTab
2c100 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ->aCol[j].zName;
2c110 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
2c120 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a  r *zColname;  /*
2c130 20 54 68 65 20 63 6f 6d 70 75 74 65 64 20 63 6f   The computed co
2c140 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  lumn name */.   
2c150 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
2c160 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c  ToFree;   /* Mal
2c170 6c 6f 63 65 64 20 73 74 72 69 6e 67 20 74 68 61  loced string tha
2c180 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72  t needs to be fr
2c190 65 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  eed */.         
2c1a0 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d     Token sColnam
2c1b0 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20  e;  /* Computed 
2c1c0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61  column name as a
2c1d0 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20   token */..     
2c1e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a         assert( z
2c1f0 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Name );.        
2c200 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26      if( zTName &
2c210 26 20 70 53 75 62 0a 20 20 20 20 20 20 20 20 20  & pSub.         
2c220 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 4d 61      && sqlite3Ma
2c230 74 63 68 53 70 61 6e 4e 61 6d 65 28 70 53 75 62  tchSpanName(pSub
2c240 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  ->pEList->a[j].z
2c250 53 70 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c  Span, 0, zTName,
2c260 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20   0)==0.         
2c270 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2c280 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2c290 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
2c2a0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61           /* If a
2c2b0 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65   column is marke
2c2c0 64 20 61 73 20 27 68 69 64 64 65 6e 27 2c 20 6f  d as 'hidden', o
2c2d0 6d 69 74 20 69 74 20 66 72 6f 6d 20 74 68 65 20  mit it from the 
2c2e0 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20  expanded.       
2c2f0 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73       ** result-s
2c300 65 74 20 6c 69 73 74 20 75 6e 6c 65 73 73 20 74  et list unless t
2c310 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 74 68  he SELECT has th
2c320 65 20 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64  e SF_IncludeHidd
2c330 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  en.            *
2c340 2a 20 62 69 74 20 73 65 74 2e 0a 20 20 20 20 20  * bit set..     
2c350 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2c360 20 20 20 20 20 20 69 66 28 20 28 70 2d 3e 73 65        if( (p->se
2c370 6c 46 6c 61 67 73 20 26 20 53 46 5f 49 6e 63 6c  lFlags & SF_Incl
2c380 75 64 65 48 69 64 64 65 6e 29 3d 3d 30 0a 20 20  udeHidden)==0.  
2c390 20 20 20 20 20 20 20 20 20 20 20 26 26 20 49 73             && Is
2c3a0 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54  HiddenColumn(&pT
2c3b0 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 0a 20 20  ab->aCol[j]) .  
2c3c0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
2c3d0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
2c3e0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
2c3f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74   }.            t
2c400 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 0a 20  ableSeen = 1;.. 
2c410 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
2c420 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20  >0 && zTName==0 
2c430 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2c440 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 66 67 2e   if( (pFrom->fg.
2c450 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41  jointype & JT_NA
2c460 54 55 52 41 4c 29 21 3d 30 0a 20 20 20 20 20 20  TURAL)!=0.      
2c470 20 20 20 20 20 20 20 20 20 20 26 26 20 74 61 62            && tab
2c480 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78  leAndColumnIndex
2c490 28 70 54 61 62 4c 69 73 74 2c 20 69 2c 20 7a 4e  (pTabList, i, zN
2c4a0 61 6d 65 2c 20 30 2c 20 30 29 0a 20 20 20 20 20  ame, 0, 0).     
2c4b0 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
2c4c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2c4d0 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e  n a NATURAL join
2c4e0 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20  , omit the join 
2c4f0 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65  columns from the
2c500 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2c510 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20 74 68    ** table to th
2c520 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20 6a  e right of the j
2c530 6f 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  oin */.         
2c540 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2c550 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2c560 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2c570 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  f( sqlite3IdList
2c580 49 6e 64 65 78 28 70 46 72 6f 6d 2d 3e 70 55 73  Index(pFrom->pUs
2c590 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29  ing, zName)>=0 )
2c5a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2c5b0 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77    /* In a join w
2c5c0 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75  ith a USING clau
2c5d0 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73  se, omit columns
2c5e0 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20   in the.        
2c5f0 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67          ** using
2c600 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65   clause from the
2c610 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69   table on the ri
2c620 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ght. */.        
2c630 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2c640 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2c650 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
2c660 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
2c670 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
2c680 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d  (db, TK_ID, zNam
2c690 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2c6a0 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65  zColname = zName
2c6b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54  ;.            zT
2c6c0 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20  oFree = 0;.     
2c6d0 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e         if( longN
2c6e0 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74  ames || pTabList
2c6f0 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20  ->nSrc>1 ){.    
2c700 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
2c710 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20  pLeft;.         
2c720 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c       pLeft = sql
2c730 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
2c740 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20  ID, zTabName);. 
2c750 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
2c760 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
2c770 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54  r(pParse, TK_DOT
2c780 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29  , pLeft, pRight)
2c790 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2c7a0 69 66 28 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20  if( zSchemaName 
2c7b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2c7c0 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74     pLeft = sqlit
2c7d0 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44  e3Expr(db, TK_ID
2c7e0 2c 20 7a 53 63 68 65 6d 61 4e 61 6d 65 29 3b 0a  , zSchemaName);.
2c7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c800 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  pExpr = sqlite3P
2c810 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
2c820 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 45 78 70  DOT, pLeft, pExp
2c830 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
2c840 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2c850 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20    if( longNames 
2c860 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2c870 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71     zColname = sq
2c880 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
2c890 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61   "%s.%s", zTabNa
2c8a0 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  me, zName);.    
2c8b0 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46              zToF
2c8c0 72 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a  ree = zColname;.
2c8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2c8e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
2c8f0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
2c900 20 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b   pExpr = pRight;
2c910 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2c920 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20             pNew 
2c930 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
2c940 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
2c950 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20  pNew, pExpr);.  
2c960 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2c970 33 54 6f 6b 65 6e 49 6e 69 74 28 26 73 43 6f 6c  3TokenInit(&sCol
2c980 6e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b  name, zColname);
2c990 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2c9a0 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e  ite3ExprListSetN
2c9b0 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 65 77  ame(pParse, pNew
2c9c0 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b  , &sColname, 0);
2c9d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2c9e0 20 70 4e 65 77 20 26 26 20 28 70 2d 3e 73 65 6c   pNew && (p->sel
2c9f0 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65  Flags & SF_Neste
2ca00 64 46 72 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20  dFrom)!=0 ){.   
2ca10 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63             struc
2ca20 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
2ca30 2a 70 58 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70  *pX = &pNew->a[p
2ca40 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20  New->nExpr-1];. 
2ca50 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2ca60 20 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20   pSub ){.       
2ca70 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70           pX->zSp
2ca80 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  an = sqlite3DbSt
2ca90 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  rDup(db, pSub->p
2caa0 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61  EList->a[j].zSpa
2cab0 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
2cac0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
2cad0 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20  ->zSpan==0 );.  
2cae0 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
2caf0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
2cb00 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73     pX->zSpan = s
2cb10 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
2cb20 2c 20 22 25 73 2e 25 73 2e 25 73 22 2c 0a 20 20  , "%s.%s.%s",.  
2cb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb50 20 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61           zSchema
2cb60 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 2c 20  Name, zTabName, 
2cb70 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20  zColname);.     
2cb80 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
2cb90 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d  ase( pX->zSpan==
2cba0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
2cbb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2cbc0 20 20 20 70 58 2d 3e 62 53 70 61 6e 49 73 54 61     pX->bSpanIsTa
2cbd0 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  b = 1;.         
2cbe0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2cbf0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2cc00 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20  b, zToFree);.   
2cc10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2cc20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   }.        if( !
2cc30 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20  tableSeen ){.   
2cc40 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d         if( zTNam
2cc50 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
2cc60 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2cc70 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
2cc80 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54  h table: %s", zT
2cc90 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
2cca0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2ccb0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2ccc0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
2ccd0 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64  tables specified
2cce0 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ");.          }.
2ccf0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2cd00 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
2cd10 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
2cd20 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20  e(db, pEList);. 
2cd30 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70     p->pEList = p
2cd40 4e 65 77 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  New;.  }.  if( p
2cd50 2d 3e 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20  ->pEList ){.    
2cd60 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  if( p->pEList->n
2cd70 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  Expr>db->aLimit[
2cd80 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
2cd90 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 20 20 73 71  UMN] ){.      sq
2cda0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2cdb0 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
2cdc0 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c  columns in resul
2cdd0 74 20 73 65 74 22 29 3b 0a 20 20 20 20 20 20 72  t set");.      r
2cde0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
2cdf0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
2ce00 65 6c 69 73 74 46 6c 61 67 73 20 26 20 28 45 50  elistFlags & (EP
2ce10 5f 48 61 73 46 75 6e 63 7c 45 50 5f 53 75 62 71  _HasFunc|EP_Subq
2ce20 75 65 72 79 29 29 21 3d 30 20 29 7b 0a 20 20 20  uery))!=0 ){.   
2ce30 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c     p->selFlags |
2ce40 3d 20 53 46 5f 43 6f 6d 70 6c 65 78 52 65 73 75  = SF_ComplexResu
2ce50 6c 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  lt;.    }.  }.  
2ce60 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2ce70 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f  nue;.}../*.** No
2ce80 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  -op routine for 
2ce90 74 68 65 20 70 61 72 73 65 2d 74 72 65 65 20 77  the parse-tree w
2cea0 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  alker..**.** Whe
2ceb0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
2cec0 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45 78  s the Walker.xEx
2ced0 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20  prCallback then 
2cee0 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
2cef0 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20 77  .** are walked w
2cf00 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69 6f  ithout any actio
2cf10 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20 61  ns being taken a
2cf20 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50 72  t each node.  Pr
2cf30 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65  esumably,.** whe
2cf40 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
2cf50 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b 65  s used for Walke
2cf60 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  r.xExprCallback 
2cf70 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e  then .** Walker.
2cf80 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
2cf90 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d  is set to do som
2cfa0 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66 6f  ething useful fo
2cfb0 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62 71  r every .** subq
2cfc0 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72 73  uery in the pars
2cfd0 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20  er tree..*/.int 
2cfe0 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e  sqlite3ExprWalkN
2cff0 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55  oop(Walker *NotU
2d000 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73  sed, Expr *NotUs
2d010 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2){.  UNUSED_P
2d020 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
2d030 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  d, NotUsed2);.  
2d040 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2d050 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f  nue;.}../*.** No
2d060 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  -op routine for 
2d070 74 68 65 20 70 61 72 73 65 2d 74 72 65 65 20 77  the parse-tree w
2d080 61 6c 6b 65 72 20 66 6f 72 20 53 45 4c 45 43 54  alker for SELECT
2d090 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 20   statements..** 
2d0a0 73 75 62 71 75 65 72 79 20 69 6e 20 74 68 65 20  subquery in the 
2d0b0 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a  parser tree..*/.
2d0c0 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
2d0d0 74 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72  tWalkNoop(Walker
2d0e0 20 2a 4e 6f 74 55 73 65 64 2c 20 53 65 6c 65 63   *NotUsed, Selec
2d0f0 74 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20  t *NotUsed2){.  
2d100 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2d110 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
2d120 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 57  ed2);.  return W
2d130 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
2d140 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  #if SQLITE_DEBUG
2d150 0a 2f 2a 0a 2a 2a 20 41 6c 77 61 79 73 20 61 73  ./*.** Always as
2d160 73 65 72 74 2e 20 20 54 68 69 73 20 78 53 65 6c  sert.  This xSel
2d170 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 69 6d 70  ectCallback2 imp
2d180 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 72 6f 76  lementation prov
2d190 65 73 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 78  es that the.** x
2d1a0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
2d1b0 69 73 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 64  is never invoked
2d1c0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2d1d0 33 53 65 6c 65 63 74 57 61 6c 6b 41 73 73 65 72  3SelectWalkAsser
2d1e0 74 32 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73  t2(Walker *NotUs
2d1f0 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55  ed, Select *NotU
2d200 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
2d210 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
2d220 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
2d230 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 7d 0a   assert( 0 );.}.
2d240 23 65 6e 64 69 66 0a 2f 2a 0a 2a 2a 20 54 68 69  #endif./*.** Thi
2d250 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70 61 6e  s routine "expan
2d260 64 73 22 20 61 20 53 45 4c 45 43 54 20 73 74 61  ds" a SELECT sta
2d270 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f  tement and all o
2d280 66 20 69 74 73 20 73 75 62 71 75 65 72 69 65 73  f its subqueries
2d290 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74 69 6f  ..** For additio
2d2a0 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
2d2b0 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61 6e 73  on what it means
2d2c0 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61 20 53   to "expand" a S
2d2d0 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65  ELECT.** stateme
2d2e0 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f 6d 6d  nt, see the comm
2d2f0 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c 65 63  ent on the selec
2d300 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72 20 63  tExpand worker c
2d310 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a  allback above..*
2d320 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20 61  *.** Expanding a
2d330 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2d340 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73  t is the first s
2d350 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73 69 6e  tep in processin
2d360 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  g a.** SELECT st
2d370 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 53 45  atement.  The SE
2d380 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d  LECT statement m
2d390 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20  ust be expanded 
2d3a0 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72  before.** name r
2d3b0 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65 72  esolution is per
2d3c0 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  formed..**.** If
2d3d0 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
2d3e0 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d  rong, an error m
2d3f0 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65  essage is writte
2d400 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a  n into pParse..*
2d410 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  * The calling fu
2d420 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74 65 63  nction can detec
2d430 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 62 79  t the problem by
2d440 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61 72   looking at pPar
2d450 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f  se->nErr.** and/
2d460 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  or pParse->db->m
2d470 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a  allocFailed..*/.
2d480 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
2d490 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
2d4a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
2d4b0 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
2d4c0 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77  .  Walker w;.  w
2d4d0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
2d4e0 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b   sqlite3ExprWalk
2d4f0 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65  Noop;.  w.pParse
2d500 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28   = pParse;.  if(
2d510 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f 54 52   OK_IF_ALWAYS_TR
2d520 55 45 28 70 50 61 72 73 65 2d 3e 68 61 73 43 6f  UE(pParse->hasCo
2d530 6d 70 6f 75 6e 64 29 20 29 7b 0a 20 20 20 20 77  mpound) ){.    w
2d540 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2d550 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75   = convertCompou
2d560 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65  ndSelectToSubque
2d570 72 79 3b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63  ry;.    w.xSelec
2d580 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a  tCallback2 = 0;.
2d590 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
2d5a0 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63  elect(&w, pSelec
2d5b0 74 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53 65 6c  t);.  }.  w.xSel
2d5c0 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  ectCallback = se
2d5d0 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20 20  lectExpander;.  
2d5e0 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
2d5f0 6b 32 20 3d 20 73 65 6c 65 63 74 50 6f 70 57 69  k2 = selectPopWi
2d600 74 68 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  th;.  sqlite3Wal
2d610 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c  kSelect(&w, pSel
2d620 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  ect);.}...#ifnde
2d630 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
2d640 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69  BQUERY./*.** Thi
2d650 73 20 69 73 20 61 20 57 61 6c 6b 65 72 2e 78 53  s is a Walker.xS
2d660 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 63 61  electCallback ca
2d670 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73  llback for the s
2d680 71 6c 69 74 65 33 53 65 6c 65 63 74 54 79 70 65  qlite3SelectType
2d690 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66  Info().** interf
2d6a0 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  ace..**.** For e
2d6b0 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  ach FROM-clause 
2d6c0 73 75 62 71 75 65 72 79 2c 20 61 64 64 20 43 6f  subquery, add Co
2d6d0 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43  lumn.zType and C
2d6e0 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69  olumn.zColl.** i
2d6f0 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
2d700 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
2d710 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74  e that represent
2d720 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
2d730 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73 75 62 71  .** of that subq
2d740 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  uery..**.** The 
2d750 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
2d760 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20  that represents 
2d770 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 77  the result set w
2d780 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a  as constructed.*
2d790 2a 20 62 79 20 73 65 6c 65 63 74 45 78 70 61 6e  * by selectExpan
2d7a0 64 65 72 28 29 20 62 75 74 20 74 68 65 20 74 79  der() but the ty
2d7b0 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  pe and collation
2d7c0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73   information was
2d7d0 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20 74   omitted.** at t
2d7e0 68 61 74 20 70 6f 69 6e 74 20 62 65 63 61 75 73  hat point becaus
2d7f0 65 20 69 64 65 6e 74 69 66 69 65 72 73 20 68 61  e identifiers ha
2d800 64 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 72  d not yet been r
2d810 65 73 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a  esolved.  This.*
2d820 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
2d830 6c 65 64 20 61 66 74 65 72 20 69 64 65 6e 74 69  led after identi
2d840 66 69 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e  fier resolution.
2d850 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2d860 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72  selectAddSubquer
2d870 79 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72  yTypeInfo(Walker
2d880 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
2d890 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a  t *p){.  Parse *
2d8a0 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b  pParse;.  int i;
2d8b0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
2d8c0 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
2d8d0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
2d8e0 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  om;..  assert( p
2d8f0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2d900 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20 69 66  Resolved );.  if
2d910 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
2d920 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29  SF_HasTypeInfo )
2d930 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 73 65   return;.  p->se
2d940 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61 73  lFlags |= SF_Has
2d950 54 79 70 65 49 6e 66 6f 3b 0a 20 20 70 50 61 72  TypeInfo;.  pPar
2d960 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
2d970 61 72 73 65 3b 0a 20 20 70 54 61 62 4c 69 73 74  arse;.  pTabList
2d980 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 66 6f   = p->pSrc;.  fo
2d990 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
2d9a0 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
2d9b0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
2d9c0 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54   pFrom++){.    T
2d9d0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72  able *pTab = pFr
2d9e0 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73  om->pTab;.    as
2d9f0 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
2da00 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e  .    if( (pTab->
2da10 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
2da20 68 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20  hemeral)!=0 ){. 
2da30 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75       /* A sub-qu
2da40 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ery in the FROM 
2da50 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
2da60 43 54 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65  CT */.      Sele
2da70 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d  ct *pSel = pFrom
2da80 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
2da90 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20   if( pSel ){.   
2daa0 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c       while( pSel
2dab0 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 20  ->pPrior ) pSel 
2dac0 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a  = pSel->pPrior;.
2dad0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
2dae0 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
2daf0 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70  peAndCollation(p
2db00 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65  Parse, pTab, pSe
2db10 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
2db20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
2db30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2db40 69 6e 65 20 61 64 64 73 20 64 61 74 61 74 79 70  ine adds datatyp
2db50 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20  e and collating 
2db60 73 65 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61  sequence informa
2db70 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54  tion to.** the T
2db80 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 73 20  able structures 
2db90 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  of all FROM-clau
2dba0 73 65 20 73 75 62 71 75 65 72 69 65 73 20 69 6e  se subqueries in
2dbb0 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61   a.** SELECT sta
2dbc0 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73  tement..**.** Us
2dbd0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  e this routine a
2dbe0 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75  fter name resolu
2dbf0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
2dc00 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
2dc10 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 50 61  ctAddTypeInfo(Pa
2dc20 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
2dc30 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23  ect *pSelect){.#
2dc40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2dc50 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 57 61  IT_SUBQUERY.  Wa
2dc60 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53 65 6c  lker w;.  w.xSel
2dc70 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71  ectCallback = sq
2dc80 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e  lite3SelectWalkN
2dc90 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  oop;.  w.xSelect
2dca0 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65  Callback2 = sele
2dcb0 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70  ctAddSubqueryTyp
2dcc0 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72  eInfo;.  w.xExpr
2dcd0 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
2dce0 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a  e3ExprWalkNoop;.
2dcf0 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61    w.pParse = pPa
2dd00 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  rse;.  sqlite3Wa
2dd10 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65  lkSelect(&w, pSe
2dd20 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  lect);.#endif.}.
2dd30 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2dd40 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 53  tine sets up a S
2dd50 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
2dd60 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  for processing. 
2dd70 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   The.** followin
2dd80 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65  g is accomplishe
2dd90 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20  d:.**.**     *  
2dda0 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62  VDBE Cursor numb
2ddb0 65 72 73 20 61 72 65 20 61 73 73 69 67 6e 65 64  ers are assigned
2ddc0 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61   to all FROM-cla
2ddd0 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20  use terms..**   
2dde0 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54    *  Ephemeral T
2ddf0 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65  able objects are
2de00 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c   created for all
2de10 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
2de20 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20  queries..**     
2de30 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  *  ON and USING 
2de40 63 6c 61 75 73 65 73 20 61 72 65 20 73 68 69 66  clauses are shif
2de50 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73  ted into WHERE s
2de60 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20  tatements.**    
2de70 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a   *  Wildcards "*
2de80 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20  " and "TABLE.*" 
2de90 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73 20 61  in result sets a
2dea0 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20  re expanded..** 
2deb0 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65      *  Identifie
2dec0 72 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  rs in expression
2ded0 20 61 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20   are matched to 
2dee0 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  tables..**.** Th
2def0 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20  is routine acts 
2df00 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61  recursively on a
2df10 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20 77 69  ll subqueries wi
2df20 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e  thin the SELECT.
2df30 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2df40 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61  SelectPrep(.  Pa
2df50 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
2df60 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
2df70 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
2df80 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
2df90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
2dfa0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
2dfb0 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20  eing coded. */. 
2dfc0 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f   NameContext *pO
2dfd0 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20  uterNC  /* Name 
2dfe0 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74  context for cont
2dff0 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 61 73  ainer */.){.  as
2e000 73 65 72 74 28 20 70 21 3d 30 20 7c 7c 20 70 50  sert( p!=0 || pP
2e010 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
2e020 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
2e030 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
2e040 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
2e050 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  n;.  if( p->selF
2e060 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70  lags & SF_HasTyp
2e070 65 49 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a  eInfo ) return;.
2e080 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45    sqlite3SelectE
2e090 78 70 61 6e 64 28 70 50 61 72 73 65 2c 20 70 29  xpand(pParse, p)
2e0a0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
2e0b0 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e  nErr || pParse->
2e0c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2e0d0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
2e0e0 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63  ite3ResolveSelec
2e0f0 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  tNames(pParse, p
2e100 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69  , pOuterNC);.  i
2e110 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
2e120 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
2e130 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
2e140 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53  turn;.  sqlite3S
2e150 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f  electAddTypeInfo
2e160 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a  (pParse, p);.}..
2e170 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20  /*.** Reset the 
2e180 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
2e190 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lator..**.** The
2e1a0 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
2e1b0 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74 20  ulator is a set 
2e1c0 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  of memory cells 
2e1d0 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74  that hold.** int
2e1e0 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
2e1f0 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74  s while calculat
2e200 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74 65  ing an aggregate
2e210 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
2e220 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
2e230 65 20 74 68 61 74 20 73 74 6f 72 65 73 20 4e 55  e that stores NU
2e240 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68  LLs in all of th
2e250 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65  ose memory.** ce
2e260 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  lls..*/.static v
2e270 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c  oid resetAccumul
2e280 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  ator(Parse *pPar
2e290 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
2e2a0 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
2e2b0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
2e2c0 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
2e2d0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
2e2e0 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 6e 74 20  c *pFunc;.  int 
2e2f0 6e 52 65 67 20 3d 20 70 41 67 67 49 6e 66 6f 2d  nReg = pAggInfo-
2e300 3e 6e 46 75 6e 63 20 2b 20 70 41 67 67 49 6e 66  >nFunc + pAggInf
2e310 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66  o->nColumn;.  if
2e320 28 20 6e 52 65 67 3d 3d 30 20 29 20 72 65 74 75  ( nReg==0 ) retu
2e330 72 6e 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  rn;.#ifdef SQLIT
2e340 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72  E_DEBUG.  /* Ver
2e350 69 66 79 20 74 68 61 74 20 61 6c 6c 20 41 67 67  ify that all Agg
2e360 49 6e 66 6f 20 72 65 67 69 73 74 65 72 73 20 61  Info registers a
2e370 72 65 20 77 69 74 68 69 6e 20 74 68 65 20 72 61  re within the ra
2e380 6e 67 65 20 73 70 65 63 69 66 69 65 64 20 62 79  nge specified by
2e390 0a 20 20 2a 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e  .  ** AggInfo.mn
2e3a0 52 65 67 2e 2e 41 67 67 49 6e 66 6f 2e 6d 78 52  Reg..AggInfo.mxR
2e3b0 65 67 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  eg */.  assert( 
2e3c0 6e 52 65 67 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e  nReg==pAggInfo->
2e3d0 6d 78 52 65 67 2d 70 41 67 67 49 6e 66 6f 2d 3e  mxReg-pAggInfo->
2e3e0 6d 6e 52 65 67 2b 31 20 29 3b 0a 20 20 66 6f 72  mnReg+1 );.  for
2e3f0 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
2e400 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
2e410 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67  .    assert( pAg
2e420 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  gInfo->aCol[i].i
2e430 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Mem>=pAggInfo->m
2e440 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26  nReg.         &&
2e450 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
2e460 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66  i].iMem<=pAggInf
2e470 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a  o->mxReg );.  }.
2e480 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67    for(i=0; i<pAg
2e490 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
2e4a0 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
2e4b0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
2e4c0 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66  i].iMem>=pAggInf
2e4d0 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20  o->mnReg.       
2e4e0 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61    && pAggInfo->a
2e4f0 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41  Func[i].iMem<=pA
2e500 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b  ggInfo->mxReg );
2e510 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
2e520 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2e530 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70  v, OP_Null, 0, p
2e540 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20  AggInfo->mnReg, 
2e550 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 29  pAggInfo->mxReg)
2e560 3b 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41  ;.  for(pFunc=pA
2e570 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69  ggInfo->aFunc, i
2e580 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
2e590 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e  nFunc; i++, pFun
2e5a0 63 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46  c++){.    if( pF
2e5b0 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d  unc->iDistinct>=
2e5c0 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  0 ){.      Expr 
2e5d0 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78  *pE = pFunc->pEx
2e5e0 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
2e5f0 28 20 70 45 2d 3e 65 58 3d 3d 45 58 5f 4c 69 73  ( pE->eX==EX_Lis
2e600 74 20 7c 7c 20 70 45 2d 3e 65 58 3d 3d 45 58 5f  t || pE->eX==EX_
2e610 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 20 20 69 66  None );.      if
2e620 28 20 70 45 2d 3e 65 58 3d 3d 45 58 5f 4e 6f 6e  ( pE->eX==EX_Non
2e630 65 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73 74  e || pE->x.pList
2e640 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20  ->nExpr!=1 ){.  
2e650 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2e660 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44  orMsg(pParse, "D
2e670 49 53 54 49 4e 43 54 20 61 67 67 72 65 67 61 74  ISTINCT aggregat
2e680 65 73 20 6d 75 73 74 20 68 61 76 65 20 65 78 61  es must have exa
2e690 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20 20  ctly one ".     
2e6a0 20 20 20 20 20 20 22 61 72 67 75 6d 65 6e 74 22        "argument"
2e6b0 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63  );.        pFunc
2e6c0 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31  ->iDistinct = -1
2e6d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2e6e0 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a         KeyInfo *
2e6f0 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
2e700 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  e3KeyInfoFromExp
2e710 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
2e720 2d 3e 78 2e 70 4c 69 73 74 2c 30 2c 30 29 3b 0a  ->x.pList,0,0);.
2e730 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2e740 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
2e750 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
2e760 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c  Func->iDistinct,
2e770 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
2e780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e790 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
2e7a0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
2e7b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2e7c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
2e7d0 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c   the OP_AggFinal
2e7e0 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65  ize opcode for e
2e7f0 76 65 72 79 20 61 67 67 72 65 67 61 74 65 20 66  very aggregate f
2e800 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  unction.** in th
2e810 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74  e AggInfo struct
2e820 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ure..*/.static v
2e830 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46  oid finalizeAggF
2e840 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a  unctions(Parse *
2e850 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
2e860 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
2e870 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
2e880 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
2e890 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
2e8a0 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72  _func *pF;.  for
2e8b0 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66  (i=0, pF=pAggInf
2e8c0 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67  o->aFunc; i<pAgg
2e8d0 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
2e8e0 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70  , pF++){.    Exp
2e8f0 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
2e900 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  F->pExpr->x.pLis
2e910 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
2e920 46 2d 3e 70 45 78 70 72 2d 3e 65 58 3d 3d 45 58  F->pExpr->eX==EX
2e930 5f 4c 69 73 74 20 7c 7c 20 70 46 2d 3e 70 45 78  _List || pF->pEx
2e940 70 72 2d 3e 65 58 3d 3d 45 58 5f 4e 6f 6e 65 20  pr->eX==EX_None 
2e950 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2e960 46 2d 3e 70 45 78 70 72 2d 3e 65 58 3d 3d 45 58  F->pExpr->eX==EX
2e970 5f 4c 69 73 74 20 7c 7c 20 70 4c 69 73 74 3d 3d  _List || pList==
2e980 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
2e990 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2e9a0 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69  _AggFinal, pF->i
2e9b0 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69  Mem, pList ? pLi
2e9c0 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a  st->nExpr : 0);.
2e9d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2e9e0 70 70 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e 70  ppendP4(v, pF->p
2e9f0 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46  Func, P4_FUNCDEF
2ea00 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
2ea10 20 55 70 64 61 74 65 20 74 68 65 20 61 63 63 75   Update the accu
2ea20 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63  mulator memory c
2ea30 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72  ells for an aggr
2ea40 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a  egate based on.*
2ea50 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  * the current cu
2ea60 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a  rsor position..*
2ea70 2a 0a 2a 2a 20 49 66 20 72 65 67 41 63 63 20 69  *.** If regAcc i
2ea80 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74  s non-zero and t
2ea90 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 69 6e 28  here are no min(
2eaa0 29 20 6f 72 20 6d 61 78 28 29 20 61 67 67 72 65  ) or max() aggre
2eab0 67 61 74 65 73 0a 2a 2a 20 69 6e 20 70 41 67 67  gates.** in pAgg
2eac0 49 6e 66 6f 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  Info, then only 
2ead0 70 6f 70 75 6c 61 74 65 20 74 68 65 20 70 41 67  populate the pAg
2eae0 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61  gInfo->nAccumula
2eaf0 74 6f 72 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a  tor accumulator.
2eb00 2a 2a 20 72 65 67 69 73 74 65 72 73 20 69 20 72  ** registers i r
2eb10 65 67 69 73 74 65 72 20 72 65 67 41 63 63 20 63  egister regAcc c
2eb20 6f 6e 74 61 69 6e 73 20 30 2e 20 54 68 65 20 63  ontains 0. The c
2eb30 61 6c 6c 65 72 20 77 69 6c 6c 20 74 61 6b 65 20  aller will take 
2eb40 63 61 72 65 0a 2a 2a 20 6f 66 20 73 65 74 74 69  care.** of setti
2eb50 6e 67 20 61 6e 64 20 63 6c 65 61 72 69 6e 67 20  ng and clearing 
2eb60 72 65 67 41 63 63 2e 0a 2a 2f 0a 73 74 61 74 69  regAcc..*/.stati
2eb70 63 20 76 6f 69 64 20 75 70 64 61 74 65 41 63 63  c void updateAcc
2eb80 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a  umulator(Parse *
2eb90 70 50 61 72 73 65 2c 20 69 6e 74 20 72 65 67 41  pParse, int regA
2eba0 63 63 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  cc, AggInfo *pAg
2ebb0 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
2ebc0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
2ebd0 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
2ebe0 74 20 72 65 67 48 69 74 20 3d 20 30 3b 0a 20 20  t regHit = 0;.  
2ebf0 69 6e 74 20 61 64 64 72 48 69 74 54 65 73 74 20  int addrHitTest 
2ec00 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 41 67  = 0;.  struct Ag
2ec10 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a  gInfo_func *pF;.
2ec20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
2ec30 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67  _col *pC;..  pAg
2ec40 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
2ec50 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30  e = 1;.  for(i=0
2ec60 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pF=pAggInfo->a
2ec70 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f  Func; i<pAggInfo
2ec80 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
2ec90 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72  ++){.    int nAr
2eca0 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e  g;.    int addrN
2ecb0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ext = 0;.    int
2ecc0 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45 78 70   regAgg;.    Exp
2ecd0 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
2ece0 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  F->pExpr->x.pLis
2ecf0 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
2ed00 46 2d 3e 70 45 78 70 72 2d 3e 65 58 3d 3d 45 58  F->pExpr->eX==EX
2ed10 5f 4c 69 73 74 20 7c 7c 20 70 46 2d 3e 70 45 78  _List || pF->pEx
2ed20 70 72 2d 3e 65 58 3d 3d 45 58 5f 4e 6f 6e 65 20  pr->eX==EX_None 
2ed30 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
2ed40 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d   ){.      nArg =
2ed50 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
2ed60 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 73 71       regAgg = sq
2ed70 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
2ed80 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b  e(pParse, nArg);
2ed90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2eda0 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
2edb0 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65  Parse, pList, re
2edc0 67 41 67 67 2c 20 30 2c 20 53 51 4c 49 54 45 5f  gAgg, 0, SQLITE_
2edd0 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20 7d  ECEL_DUP);.    }
2ede0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67  else{.      nArg
2edf0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41   = 0;.      regA
2ee00 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  gg = 0;.    }.  
2ee10 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69    if( pF->iDisti
2ee20 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  nct>=0 ){.      
2ee30 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74  addrNext = sqlit
2ee40 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
2ee50 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  v);.      testca
2ee60 73 65 28 20 6e 41 72 67 3d 3d 30 20 29 3b 20 20  se( nArg==0 );  
2ee70 2f 2a 20 45 72 72 6f 72 20 63 6f 6e 64 69 74 69  /* Error conditi
2ee80 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  on */.      test
2ee90 63 61 73 65 28 20 6e 41 72 67 3e 31 20 29 3b 20  case( nArg>1 ); 
2eea0 20 20 2f 2a 20 41 6c 73 6f 20 61 6e 20 65 72 72    /* Also an err
2eeb0 6f 72 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65  or */.      code
2eec0 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c  Distinct(pParse,
2eed0 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20   pF->iDistinct, 
2eee0 61 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67  addrNext, 1, reg
2eef0 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Agg);.    }.    
2ef00 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66  if( pF->pFunc->f
2ef10 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
2ef20 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20  E_FUNC_NEEDCOLL 
2ef30 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
2ef40 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20   *pColl = 0;.   
2ef50 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
2ef60 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
2ef70 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
2ef80 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
2ef90 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74  !=0 );  /* pList
2efa0 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63  !=0 if pF->pFunc
2efb0 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f   has NEEDCOLL */
2efc0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
2efd0 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  pItem=pList->a; 
2efe0 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67  !pColl && j<nArg
2eff0 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
2f000 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
2f010 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2f020 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65  Seq(pParse, pIte
2f030 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
2f040 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43   }.      if( !pC
2f050 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  oll ){.        p
2f060 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
2f070 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
2f080 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2f090 72 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41 67  regHit==0 && pAg
2f0a0 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61  gInfo->nAccumula
2f0b0 74 6f 72 20 29 20 72 65 67 48 69 74 20 3d 20 2b  tor ) regHit = +
2f0c0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2f0d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2f0e0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp4(v, OP_Col
2f0f0 6c 53 65 71 2c 20 72 65 67 48 69 74 2c 20 30 2c  lSeq, regHit, 0,
2f100 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c   0, (char *)pCol
2f110 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
2f120 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2f130 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2f140 50 5f 41 67 67 53 74 65 70 2c 20 30 2c 20 72 65  P_AggStep, 0, re
2f150 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 29 3b  gAgg, pF->iMem);
2f160 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2f170 41 70 70 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e  AppendP4(v, pF->
2f180 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
2f190 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  F);.    sqlite3V
2f1a0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28  dbeChangeP5(v, (
2f1b0 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71  u8)nArg);.    sq
2f1c0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
2f1d0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
2f1e0 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20  gAgg, nArg);.   
2f1f0 20 69 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b   if( addrNext ){
2f200 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2f210 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
2f220 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20  , addrNext);.   
2f230 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67   }.  }.  if( reg
2f240 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e  Hit==0 && pAggIn
2f250 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  fo->nAccumulator
2f260 20 29 7b 0a 20 20 20 20 72 65 67 48 69 74 20 3d   ){.    regHit =
2f270 20 72 65 67 41 63 63 3b 0a 20 20 7d 0a 20 20 69   regAcc;.  }.  i
2f280 66 28 20 72 65 67 48 69 74 20 29 7b 0a 20 20 20  f( regHit ){.   
2f290 20 61 64 64 72 48 69 74 54 65 73 74 20 3d 20 73   addrHitTest = s
2f2a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
2f2b0 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48 69  (v, OP_If, regHi
2f2c0 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
2f2d0 28 76 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  (v);.  }.  for(i
2f2e0 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d  =0, pC=pAggInfo-
2f2f0 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66  >aCol; i<pAggInf
2f300 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b  o->nAccumulator;
2f310 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20   i++, pC++){.   
2f320 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
2f330 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78  (pParse, pC->pEx
2f340 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20  pr, pC->iMem);. 
2f350 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64   }.  pAggInfo->d
2f360 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20  irectMode = 0;. 
2f370 20 69 66 28 20 61 64 64 72 48 69 74 54 65 73 74   if( addrHitTest
2f380 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
2f390 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
2f3a0 64 64 72 48 69 74 54 65 73 74 29 3b 0a 20 20 7d  ddrHitTest);.  }
2f3b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
2f3c0 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69  single OP_Explai
2f3d0 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  n instruction to
2f3e0 20 74 68 65 20 56 44 42 45 20 74 6f 20 65 78 70   the VDBE to exp
2f3f0 6c 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a  lain a simple.**
2f400 20 63 6f 75 6e 74 28 2a 29 20 71 75 65 72 79 20   count(*) query 
2f410 28 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  ("SELECT count(*
2f420 29 20 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a  ) FROM pTab")..*
2f430 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2f440 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74  _OMIT_EXPLAIN.st
2f450 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
2f460 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20  nSimpleCount(.  
2f470 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2f480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f490 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
2f4a0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
2f4b0 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
2f4c0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62        /* Table b
2f4d0 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a  eing queried */.
2f4e0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
2f4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f500 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20    /* Index used 
2f510 74 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e  to optimize scan
2f520 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  , or NULL */.){.
2f530 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
2f540 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
2f550 69 6e 74 20 62 43 6f 76 65 72 20 3d 20 28 70 49  int bCover = (pI
2f560 64 78 21 3d 30 20 26 26 20 28 48 61 73 52 6f 77  dx!=0 && (HasRow
2f570 69 64 28 70 54 61 62 29 20 7c 7c 20 21 49 73 50  id(pTab) || !IsP
2f580 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
2f590 49 64 78 29 29 29 3b 0a 20 20 20 20 73 71 6c 69  Idx)));.    sqli
2f5a0 74 65 33 56 64 62 65 45 78 70 6c 61 69 6e 28 70  te3VdbeExplain(p
2f5b0 50 61 72 73 65 2c 20 30 2c 20 22 53 43 41 4e 20  Parse, 0, "SCAN 
2f5c0 54 41 42 4c 45 20 25 73 25 73 25 73 22 2c 0a 20  TABLE %s%s%s",. 
2f5d0 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
2f5e0 6d 65 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76  me,.        bCov
2f5f0 65 72 20 3f 20 22 20 55 53 49 4e 47 20 43 4f 56  er ? " USING COV
2f600 45 52 49 4e 47 20 49 4e 44 45 58 20 22 20 3a 20  ERING INDEX " : 
2f610 22 22 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76  "",.        bCov
2f620 65 72 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  er ? pIdx->zName
2f630 20 3a 20 22 22 0a 20 20 20 20 29 3b 0a 20 20 7d   : "".    );.  }
2f640 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
2f650 65 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43  e explainSimpleC
2f660 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64  ount(a,b,c).#end
2f670 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65  if../*.** sqlite
2f680 33 57 61 6c 6b 45 78 70 72 28 29 20 63 61 6c 6c  3WalkExpr() call
2f690 62 61 63 6b 20 75 73 65 64 20 62 79 20 68 61 76  back used by hav
2f6a0 69 6e 67 54 6f 57 68 65 72 65 28 29 2e 0a 2a 2a  ingToWhere()..**
2f6b0 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 64 65 20  .** If the node 
2f6c0 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 63 61  passed to the ca
2f6d0 6c 6c 62 61 63 6b 20 69 73 20 61 20 54 4b 5f 41  llback is a TK_A
2f6e0 4e 44 20 6e 6f 64 65 2c 20 72 65 74 75 72 6e 20  ND node, return 
2f6f0 0a 2a 2a 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  .** WRC_Continue
2f700 20 74 6f 20 74 65 6c 6c 20 73 71 6c 69 74 65 33   to tell sqlite3
2f710 57 61 6c 6b 45 78 70 72 28 29 20 74 6f 20 69 74  WalkExpr() to it
2f720 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 63 68  erate through ch
2f730 69 6c 64 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a  ild nodes..**.**
2f740 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
2f750 72 6e 20 57 52 43 5f 50 72 75 6e 65 2e 20 49 6e  rn WRC_Prune. In
2f760 20 74 68 69 73 20 63 61 73 65 2c 20 61 6c 73 6f   this case, also
2f770 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 0a 2a   check if the .*
2f780 2a 20 73 75 62 2d 65 78 70 72 65 73 73 69 6f 6e  * sub-expression
2f790 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 72 69   matches the cri
2f7a0 74 65 72 69 61 20 66 6f 72 20 62 65 69 6e 67 20  teria for being 
2f7b0 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 57 48 45  moved to the WHE
2f7c0 52 45 0a 2a 2a 20 63 6c 61 75 73 65 2e 20 49 66  RE.** clause. If
2f7d0 20 73 6f 2c 20 61 64 64 20 69 74 20 74 6f 20 74   so, add it to t
2f7e0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2f7f0 61 6e 64 20 72 65 70 6c 61 63 65 20 74 68 65 20  and replace the 
2f800 73 75 62 2d 65 78 70 72 65 73 73 69 6f 6e 0a 2a  sub-expression.*
2f810 2a 20 77 69 74 68 69 6e 20 74 68 65 20 48 41 56  * within the HAV
2f820 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20 77  ING expression w
2f830 69 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20 22  ith a constant "
2f840 31 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  1"..*/.static in
2f850 74 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65 45  t havingToWhereE
2f860 78 70 72 43 62 28 57 61 6c 6b 65 72 20 2a 70 57  xprCb(Walker *pW
2f870 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
2f880 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  pr){.  if( pExpr
2f890 2d 3e 6f 70 21 3d 54 4b 5f 41 4e 44 20 29 7b 0a  ->op!=TK_AND ){.
2f8a0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d      Select *pS =
2f8b0 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 65 6c   pWalker->u.pSel
2f8c0 65 63 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ect;.    if( sql
2f8d0 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
2f8e0 6e 74 4f 72 47 72 6f 75 70 42 79 28 70 57 61 6c  ntOrGroupBy(pWal
2f8f0 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20 70 45 78  ker->pParse, pEx
2f900 70 72 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42 79  pr, pS->pGroupBy
2f910 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
2f920 65 33 20 2a 64 62 20 3d 20 70 57 61 6c 6b 65 72  e3 *db = pWalker
2f930 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  ->pParse->db;.  
2f940 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
2f950 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
2f960 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52  c(db, TK_INTEGER
2f970 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b  , &sqlite3IntTok
2f980 65 6e 73 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20  ens[1], 0);.    
2f990 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
2f9a0 20 20 20 20 20 20 45 78 70 72 20 2a 70 57 68 65        Expr *pWhe
2f9b0 72 65 20 3d 20 70 53 2d 3e 70 57 68 65 72 65 3b  re = pS->pWhere;
2f9c0 0a 20 20 20 20 20 20 20 20 53 57 41 50 28 45 78  .        SWAP(Ex
2f9d0 70 72 2c 20 2a 70 4e 65 77 2c 20 2a 70 45 78 70  pr, *pNew, *pExp
2f9e0 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  r);.        pNew
2f9f0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
2fa00 64 28 64 62 2c 20 70 57 68 65 72 65 2c 20 70 4e  d(db, pWhere, pN
2fa10 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 53 2d  ew);.        pS-
2fa20 3e 70 57 68 65 72 65 20 3d 20 70 4e 65 77 3b 0a  >pWhere = pNew;.
2fa30 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
2fa40 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20  >eCode = 1;.    
2fa50 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65    }.    }.    re
2fa60 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
2fa70 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43    }.  return WRC
2fa80 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
2fa90 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 6c 69  .** Transfer eli
2faa0 67 69 62 6c 65 20 74 65 72 6d 73 20 66 72 6f 6d  gible terms from
2fab0 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   the HAVING clau
2fac0 73 65 20 6f 66 20 61 20 71 75 65 72 79 2c 20 77  se of a query, w
2fad0 68 69 63 68 20 69 73 0a 2a 2a 20 70 72 6f 63 65  hich is.** proce
2fae0 73 73 65 64 20 61 66 74 65 72 20 67 72 6f 75 70  ssed after group
2faf0 69 6e 67 2c 20 74 6f 20 74 68 65 20 57 48 45 52  ing, to the WHER
2fb00 45 20 63 6c 61 75 73 65 2c 20 77 68 69 63 68 20  E clause, which 
2fb10 69 73 20 70 72 6f 63 65 73 73 65 64 20 62 65 66  is processed bef
2fb20 6f 72 65 0a 2a 2a 20 67 72 6f 75 70 69 6e 67 2e  ore.** grouping.
2fb30 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   For example, th
2fb40 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  e query:.**.**  
2fb50 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 3c   SELECT * FROM <
2fb60 74 61 62 6c 65 73 3e 20 57 48 45 52 45 20 61 3d  tables> WHERE a=
2fb70 3f 20 47 52 4f 55 50 20 42 59 20 62 20 48 41 56  ? GROUP BY b HAV
2fb80 49 4e 47 20 62 3d 3f 20 41 4e 44 20 63 3d 3f 0a  ING b=? AND c=?.
2fb90 2a 2a 0a 2a 2a 20 63 61 6e 20 62 65 20 72 65 77  **.** can be rew
2fba0 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a  ritten as:.**.**
2fbb0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
2fbc0 20 3c 74 61 62 6c 65 73 3e 20 57 48 45 52 45 20   <tables> WHERE 
2fbd0 61 3d 3f 20 41 4e 44 20 62 3d 3f 20 47 52 4f 55  a=? AND b=? GROU
2fbe0 50 20 42 59 20 62 20 48 41 56 49 4e 47 20 63 3d  P BY b HAVING c=
2fbf0 3f 0a 2a 2a 0a 2a 2a 20 41 20 74 65 72 6d 20 6f  ?.**.** A term o
2fc00 66 20 74 68 65 20 48 41 56 49 4e 47 20 65 78 70  f the HAVING exp
2fc10 72 65 73 73 69 6f 6e 20 69 73 20 65 6c 69 67 69  ression is eligi
2fc20 62 6c 65 20 66 6f 72 20 74 72 61 6e 73 66 65 72  ble for transfer
2fc30 20 69 66 20 69 74 20 63 6f 6e 73 69 73 74 73 0a   if it consists.
2fc40 2a 2a 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 63  ** entirely of c
2fc50 6f 6e 73 74 61 6e 74 73 20 61 6e 64 20 65 78 70  onstants and exp
2fc60 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72  ressions that ar
2fc70 65 20 61 6c 73 6f 20 47 52 4f 55 50 20 42 59 20  e also GROUP BY 
2fc80 74 65 72 6d 73 20 74 68 61 74 0a 2a 2a 20 75 73  terms that.** us
2fc90 65 20 74 68 65 20 22 42 49 4e 41 52 59 22 20 63  e the "BINARY" c
2fca0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
2fcb0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
2fcc0 64 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65 28  d havingToWhere(
2fcd0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
2fce0 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 57 61 6c  elect *p){.  Wal
2fcf0 6b 65 72 20 73 57 61 6c 6b 65 72 3b 0a 20 20 6d  ker sWalker;.  m
2fd00 65 6d 73 65 74 28 26 73 57 61 6c 6b 65 72 2c 20  emset(&sWalker, 
2fd10 30 2c 20 73 69 7a 65 6f 66 28 73 57 61 6c 6b 65  0, sizeof(sWalke
2fd20 72 29 29 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 70  r));.  sWalker.p
2fd30 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
2fd40 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70 72 43    sWalker.xExprC
2fd50 61 6c 6c 62 61 63 6b 20 3d 20 68 61 76 69 6e 67  allback = having
2fd60 54 6f 57 68 65 72 65 45 78 70 72 43 62 3b 0a 20  ToWhereExprCb;. 
2fd70 20 73 57 61 6c 6b 65 72 2e 75 2e 70 53 65 6c 65   sWalker.u.pSele
2fd80 63 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65  ct = p;.  sqlite
2fd90 33 57 61 6c 6b 45 78 70 72 28 26 73 57 61 6c 6b  3WalkExpr(&sWalk
2fda0 65 72 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b  er, p->pHaving);
2fdb0 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
2fdc0 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
2fdd0 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 26 26 20  Walker.eCode && 
2fde0 28 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72  (sqlite3SelectTr
2fdf0 61 63 65 20 26 20 30 78 31 30 30 29 21 3d 30 20  ace & 0x100)!=0 
2fe00 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41  ){.    SELECTTRA
2fe10 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c  CE(0x100,pParse,
2fe20 70 2c 28 22 4d 6f 76 65 20 48 41 56 49 4e 47 20  p,("Move HAVING 
2fe30 74 65 72 6d 73 20 69 6e 74 6f 20 57 48 45 52 45  terms into WHERE
2fe40 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  :\n"));.    sqli
2fe50 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
2fe60 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a  t(0, p, 0);.  }.
2fe70 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
2fe80 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
2fe90 74 68 65 20 70 54 68 69 73 20 65 6e 74 72 79 20  the pThis entry 
2fea0 6f 66 20 70 54 61 62 4c 69 73 74 20 69 73 20 61  of pTabList is a
2feb0 20 73 65 6c 66 2d 6a 6f 69 6e 20 6f 66 20 61 20   self-join of a 
2fec0 70 72 69 6f 72 20 76 69 65 77 2e 0a 2a 2a 20 49  prior view..** I
2fed0 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 72 65  f it is, then re
2fee0 74 75 72 6e 20 74 68 65 20 53 72 63 4c 69 73 74  turn the SrcList
2fef0 5f 69 74 65 6d 20 66 6f 72 20 74 68 65 20 70 72  _item for the pr
2ff00 69 6f 72 20 76 69 65 77 2e 20 20 49 66 20 69 74  ior view.  If it
2ff10 20 69 73 20 6e 6f 74 2c 0a 2a 2a 20 74 68 65 6e   is not,.** then
2ff20 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74   return 0..*/.st
2ff30 61 74 69 63 20 73 74 72 75 63 74 20 53 72 63 4c  atic struct SrcL
2ff40 69 73 74 5f 69 74 65 6d 20 2a 69 73 53 65 6c 66  ist_item *isSelf
2ff50 4a 6f 69 6e 56 69 65 77 28 0a 20 20 53 72 63 4c  JoinView(.  SrcL
2ff60 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
2ff70 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72           /* Sear
2ff80 63 68 20 66 6f 72 20 73 65 6c 66 2d 6a 6f 69 6e  ch for self-join
2ff90 73 20 69 6e 20 74 68 69 73 20 46 52 4f 4d 20 63  s in this FROM c
2ffa0 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
2ffb0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2ffc0 70 54 68 69 73 20 20 20 2f 2a 20 53 65 61 72 63  pThis   /* Searc
2ffd0 68 20 66 6f 72 20 70 72 69 6f 72 20 72 65 66 65  h for prior refe
2ffe0 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20 73 75  rence to this su
2fff0 62 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 73  bquery */.){.  s
30000 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
30010 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 66 6f 72  em *pItem;.  for
30020 28 70 49 74 65 6d 20 3d 20 70 54 61 62 4c 69 73  (pItem = pTabLis
30030 74 2d 3e 61 3b 20 70 49 74 65 6d 3c 70 54 68 69  t->a; pItem<pThi
30040 73 3b 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  s; pItem++){.   
30050 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c   if( pItem->pSel
30060 65 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ect==0 ) continu
30070 65 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  e;.    if( pItem
30080 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e  ->fg.viaCoroutin
30090 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
300a0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61    if( pItem->zNa
300b0 6d 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  me==0 ) continue
300c0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
300d0 33 5f 73 74 72 69 63 6d 70 28 70 49 74 65 6d 2d  3_stricmp(pItem-
300e0 3e 7a 44 61 74 61 62 61 73 65 2c 20 70 54 68 69  >zDatabase, pThi
300f0 73 2d 3e 7a 44 61 74 61 62 61 73 65 29 21 3d 30  s->zDatabase)!=0
30100 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
30110 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
30120 69 63 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  icmp(pItem->zNam
30130 65 2c 20 70 54 68 69 73 2d 3e 7a 4e 61 6d 65 29  e, pThis->zName)
30140 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
30150 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
30160 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 0a 20  xprCompare(0, . 
30170 20 20 20 20 20 20 20 20 20 70 54 68 69 73 2d 3e           pThis->
30180 70 53 65 6c 65 63 74 2d 3e 70 57 68 65 72 65 2c  pSelect->pWhere,
30190 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d   pItem->pSelect-
301a0 3e 70 57 68 65 72 65 2c 20 2d 31 29 20 0a 20 20  >pWhere, -1) .  
301b0 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68    ){.      /* Th
301c0 65 20 76 69 65 77 20 77 61 73 20 6d 6f 64 69 66  e view was modif
301d0 69 65 64 20 62 79 20 73 6f 6d 65 20 6f 74 68 65  ied by some othe
301e0 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 73  r optimization s
301f0 75 63 68 20 61 73 0a 20 20 20 20 20 20 2a 2a 20  uch as.      ** 
30200 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72  pushDownWhereTer
30210 6d 73 28 29 20 2a 2f 0a 20 20 20 20 20 20 63 6f  ms() */.      co
30220 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
30230 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d 3b 0a    return pItem;.
30240 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
30250 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
30260 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54  _COUNTOFVIEW_OPT
30270 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20  IMIZATION./*.** 
30280 41 74 74 65 6d 70 74 20 74 6f 20 74 72 61 6e 73  Attempt to trans
30290 66 6f 72 6d 20 61 20 71 75 65 72 79 20 6f 66 20  form a query of 
302a0 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20  the form.**.**  
302b0 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
302c0 29 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  ) FROM (SELECT x
302d0 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 41   FROM t1 UNION A
302e0 4c 4c 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d  LL SELECT y FROM
302f0 20 74 32 29 0a 2a 2a 0a 2a 2a 20 49 6e 74 6f 20   t2).**.** Into 
30300 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  this:.**.**    S
30310 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f  ELECT (SELECT co
30320 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 29 2b  unt(*) FROM t1)+
30330 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  (SELECT count(*)
30340 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 0a 2a 2a 20   FROM t2).**.** 
30350 54 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  The transformati
30360 6f 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66  on only works if
30370 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
30380 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
30390 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20 73  **.**   *  The s
303a0 75 62 71 75 65 72 79 20 69 73 20 61 20 55 4e 49  ubquery is a UNI
303b0 4f 4e 20 41 4c 4c 20 6f 66 20 74 77 6f 20 6f 72  ON ALL of two or
303c0 20 6d 6f 72 65 20 74 65 72 6d 73 0a 2a 2a 20 20   more terms.**  
303d0 20 2a 20 20 54 68 65 20 73 75 62 71 75 65 72 79   *  The subquery
303e0 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61   does not have a
303f0 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 0a 2a 2a   LIMIT clause.**
30400 20 20 20 2a 20 20 54 68 65 72 65 20 69 73 20 6e     *  There is n
30410 6f 20 57 48 45 52 45 20 6f 72 20 47 52 4f 55 50  o WHERE or GROUP
30420 20 42 59 20 6f 72 20 48 41 56 49 4e 47 20 63 6c   BY or HAVING cl
30430 61 75 73 65 73 20 6f 6e 20 74 68 65 20 73 75 62  auses on the sub
30440 71 75 65 72 69 65 73 0a 2a 2a 20 20 20 2a 20 20  queries.**   *  
30450 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
30460 69 73 20 61 20 73 69 6d 70 6c 65 20 63 6f 75 6e  is a simple coun
30470 74 28 2a 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  t(*).**.** Retur
30480 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6f 70  n TRUE if the op
30490 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 6e  timization is un
304a0 64 65 72 74 61 6b 65 6e 2e 0a 2a 2f 0a 73 74 61  dertaken..*/.sta
304b0 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 4f 66 56  tic int countOfV
304c0 69 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28  iewOptimization(
304d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
304e0 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 65 6c  elect *p){.  Sel
304f0 65 63 74 20 2a 70 53 75 62 2c 20 2a 70 50 72 69  ect *pSub, *pPri
30500 6f 72 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70  or;.  Expr *pExp
30510 72 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f 75 6e  r;.  Expr *pCoun
30520 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
30530 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  ;.  if( (p->selF
30540 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
30550 61 74 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ate)==0 ) return
30560 20 30 3b 20 20 20 2f 2a 20 54 68 69 73 20 69 73   0;   /* This is
30570 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f   an aggregate */
30580 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74  .  if( p->pEList
30590 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74  ->nExpr!=1 ) ret
305a0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
305b0 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 72       /* Single r
305c0 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  esult column */.
305d0 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c    pExpr = p->pEL
305e0 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
305f0 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
30600 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  !=TK_AGG_FUNCTIO
30610 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  N ) return 0;   
30620 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 69       /* Result i
30630 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a  s an aggregate *
30640 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  /.  if( sqlite3_
30650 73 74 72 69 63 6d 70 28 70 45 78 70 72 2d 3e 75  stricmp(pExpr->u
30660 2e 7a 54 6f 6b 65 6e 2c 22 63 6f 75 6e 74 22 29  .zToken,"count")
30670 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
30680 20 49 73 20 63 6f 75 6e 74 28 29 20 2a 2f 0a 20   Is count() */. 
30690 20 69 66 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c   if( pExpr->x.pL
306a0 69 73 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20  ist!=0 ) return 
306b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
306c0 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f     /* Must be co
306d0 75 6e 74 28 2a 29 20 2a 2f 0a 20 20 69 66 28 20  unt(*) */.  if( 
306e0 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  p->pSrc->nSrc!=1
306f0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
30700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30710 20 4f 6e 65 20 74 61 62 6c 65 20 69 6e 20 46 52   One table in FR
30720 4f 4d 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20  OM  */.  pSub = 
30730 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  p->pSrc->a[0].pS
30740 65 6c 65 63 74 3b 0a 20 20 69 66 28 20 70 53 75  elect;.  if( pSu
30750 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  b==0 ) return 0;
30760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
30780 65 20 46 52 4f 4d 20 69 73 20 61 20 73 75 62 71  e FROM is a subq
30790 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 70 53  uery */.  if( pS
307a0 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20  ub->pPrior==0 ) 
307b0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
307c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
307d0 75 73 74 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e  ust be a compoun
307e0 64 20 72 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20  d ry */.  do{.  
307f0 20 20 69 66 28 20 70 53 75 62 2d 3e 6f 70 21 3d    if( pSub->op!=
30800 54 4b 5f 41 4c 4c 20 26 26 20 70 53 75 62 2d 3e  TK_ALL && pSub->
30810 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20  pPrior ) return 
30820 30 3b 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 55  0;  /* Must be U
30830 4e 49 4f 4e 20 41 4c 4c 20 2a 2f 0a 20 20 20 20  NION ALL */.    
30840 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65  if( pSub->pWhere
30850 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
30860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30870 20 20 2f 2a 20 4e 6f 20 57 48 45 52 45 20 63 6c    /* No WHERE cl
30880 61 75 73 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  ause */.    if( 
30890 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 20 72  pSub->pLimit ) r
308a0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
308b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
308c0 20 4e 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73 65   No LIMIT clause
308d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62   */.    if( pSub
308e0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
308f0 41 67 67 72 65 67 61 74 65 20 29 20 72 65 74 75  Aggregate ) retu
30900 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 4e 6f 74  rn 0;     /* Not
30910 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f   an aggregate */
30920 0a 20 20 20 20 70 53 75 62 20 3d 20 70 53 75 62  .    pSub = pSub
30930 2d 3e 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20  ->pPrior;       
30940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30950 20 20 20 20 20 20 20 2f 2a 20 52 65 70 65 61 74         /* Repeat
30960 20 6f 76 65 72 20 63 6f 6d 70 6f 75 6e 64 20 2a   over compound *
30970 2f 0a 20 20 7d 77 68 69 6c 65 28 20 70 53 75 62  /.  }while( pSub
30980 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20   );..  /* If we 
30990 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
309a0 20 74 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 74   then it is OK t
309b0 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20 74 72  o perform the tr
309c0 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a  ansformation */.
309d0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
309e0 64 62 3b 0a 20 20 70 43 6f 75 6e 74 20 3d 20 70  db;.  pCount = p
309f0 45 78 70 72 3b 0a 20 20 70 45 78 70 72 20 3d 20  Expr;.  pExpr = 
30a00 30 3b 0a 20 20 70 53 75 62 20 3d 20 70 2d 3e 70  0;.  pSub = p->p
30a10 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
30a20 74 3b 0a 20 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  t;.  p->pSrc->a[
30a30 30 5d 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a  0].pSelect = 0;.
30a40 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
30a50 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53  Delete(db, p->pS
30a60 72 63 29 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d  rc);.  p->pSrc =
30a70 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
30a80 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c  Zero(pParse->db,
30a90 20 73 69 7a 65 6f 66 28 2a 70 2d 3e 70 53 72 63   sizeof(*p->pSrc
30aa0 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 75  ));.  while( pSu
30ab0 62 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  b ){.    Expr *p
30ac0 54 65 72 6d 3b 0a 20 20 20 20 70 50 72 69 6f 72  Term;.    pPrior
30ad0 20 3d 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b   = pSub->pPrior;
30ae0 0a 20 20 20 20 70 53 75 62 2d 3e 70 50 72 69 6f  .    pSub->pPrio
30af0 72 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 2d  r = 0;.    pSub-
30b00 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  >pNext = 0;.    
30b10 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  pSub->selFlags |
30b20 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a  = SF_Aggregate;.
30b30 20 20 20 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61      pSub->selFla
30b40 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75  gs &= ~SF_Compou
30b50 6e 64 3b 0a 20 20 20 20 70 53 75 62 2d 3e 6e 53  nd;.    pSub->nS
30b60 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20  electRow = 0;.  
30b70 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
30b80 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62  tDelete(db, pSub
30b90 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  ->pEList);.    p
30ba0 54 65 72 6d 20 3d 20 70 50 72 69 6f 72 20 3f 20  Term = pPrior ? 
30bb0 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
30bc0 62 2c 20 70 43 6f 75 6e 74 2c 20 30 29 20 3a 20  b, pCount, 0) : 
30bd0 70 43 6f 75 6e 74 3b 0a 20 20 20 20 70 53 75 62  pCount;.    pSub
30be0 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74  ->pEList = sqlit
30bf0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
30c00 28 70 50 61 72 73 65 2c 20 30 2c 20 70 54 65 72  (pParse, 0, pTer
30c10 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  m);.    pTerm = 
30c20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
30c30 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43 54 2c 20  rse, TK_SELECT, 
30c40 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
30c50 65 33 50 45 78 70 72 41 64 64 53 65 6c 65 63 74  e3PExprAddSelect
30c60 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
30c70 70 53 75 62 29 3b 0a 20 20 20 20 69 66 28 20 70  pSub);.    if( p
30c80 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Expr==0 ){.     
30c90 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 3b 0a   pExpr = pTerm;.
30ca0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30cb0 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
30cc0 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
30cd0 5f 50 4c 55 53 2c 20 70 54 65 72 6d 2c 20 70 45  _PLUS, pTerm, pE
30ce0 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  xpr);.    }.    
30cf0 70 53 75 62 20 3d 20 70 50 72 69 6f 72 3b 0a 20  pSub = pPrior;. 
30d00 20 7d 0a 20 20 70 2d 3e 70 45 4c 69 73 74 2d 3e   }.  p->pEList->
30d10 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70 45 78  a[0].pExpr = pEx
30d20 70 72 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67  pr;.  p->selFlag
30d30 73 20 26 3d 20 7e 53 46 5f 41 67 67 72 65 67 61  s &= ~SF_Aggrega
30d40 74 65 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54  te;..#if SELECTT
30d50 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
30d60 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
30d70 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b  Trace & 0x400 ){
30d80 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
30d90 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x400,pParse,p,
30da0 28 22 41 66 74 65 72 20 63 6f 75 6e 74 2d 6f 66  ("After count-of
30db0 2d 76 69 65 77 20 6f 70 74 69 6d 69 7a 61 74 69  -view optimizati
30dc0 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71  on:\n"));.    sq
30dd0 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
30de0 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
30df0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
30e00 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
30e10 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46 56   SQLITE_COUNTOFV
30e20 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IEW_OPTIMIZATION
30e30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72   */../*.** Gener
30e40 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
30e50 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
30e60 74 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70  t given in the p
30e70 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a   argument.  .**.
30e80 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  ** The results a
30e90 72 65 20 72 65 74 75 72 6e 65 64 20 61 63 63 6f  re returned acco
30ea0 72 64 69 6e 67 20 74 6f 20 74 68 65 20 53 65 6c  rding to the Sel
30eb0 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72  ectDest structur
30ec0 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e  e..** See commen
30ed0 74 73 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e  ts in sqliteInt.
30ee0 68 20 66 6f 72 20 66 75 72 74 68 65 72 20 69 6e  h for further in
30ef0 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  formation..**.**
30f00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
30f10 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
30f20 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
30f30 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a  any errors are.*
30f40 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  * encountered, t
30f50 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61  hen an appropria
30f60 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  te error message
30f70 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70   is left in.** p
30f80 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
30f90 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
30fa0 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65  ne does NOT free
30fb0 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75   the Select stru
30fc0 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e  cture passed in.
30fd0 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
30fe0 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20   function needs 
30ff0 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69  to do that..*/.i
31000 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
31010 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
31020 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
31030 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
31040 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
31050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31060 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
31070 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
31080 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  . */.  SelectDes
31090 74 20 2a 70 44 65 73 74 20 20 20 20 20 20 2f 2a  t *pDest      /*
310a0 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
310b0 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c   the query resul
310c0 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
310d0 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
310e0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
310f0 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  rs */.  WhereInf
31100 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f  o *pWInfo;     /
31110 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71  * Return from sq
31120 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
31130 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  ) */.  Vdbe *v; 
31140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31150 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   The virtual mac
31160 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  hine under const
31170 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
31180 20 69 73 41 67 67 3b 20 20 20 20 20 20 20 20 20   isAgg;         
31190 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
311a0 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b  select lists lik
311b0 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a  e "count(*)" */.
311c0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
311d0 73 74 20 3d 20 30 3b 20 20 2f 2a 20 4c 69 73 74  st = 0;  /* List
311e0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65   of columns to e
311f0 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63  xtract. */.  Src
31200 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20  List *pTabList; 
31210 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74      /* List of t
31220 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20  ables to select 
31230 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a  from */.  Expr *
31240 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
31250 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
31260 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
31270 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
31280 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f   *pGroupBy;    /
31290 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63  * The GROUP BY c
312a0 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
312b0 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ULL */.  Expr *p
312c0 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20  Having;         
312d0 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c  /* The HAVING cl
312e0 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
312f0 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  LL */.  int rc =
31300 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   1;            /
31310 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
31320 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  n from this func
31330 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e  tion */.  Distin
31340 63 74 43 74 78 20 73 44 69 73 74 69 6e 63 74 3b  ctCtx sDistinct;
31350 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20   /* Info on how 
31360 74 6f 20 63 6f 64 65 20 74 68 65 20 44 49 53 54  to code the DIST
31370 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a  INCT keyword */.
31380 20 20 53 6f 72 74 43 74 78 20 73 53 6f 72 74 3b    SortCtx sSort;
31390 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
313a0 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20   on how to code 
313b0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
313c0 75 73 65 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f  use */.  AggInfo
313d0 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20   sAggInfo;      
313e0 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75  /* Information u
313f0 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74 65  sed by aggregate
31400 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e   queries */.  in
31410 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20  t iEnd;         
31420 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
31430 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  of the end of th
31440 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c  e query */.  sql
31450 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
31460 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
31470 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
31480 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d  /.  ExprList *pM
31490 69 6e 4d 61 78 4f 72 64 65 72 42 79 20 3d 20 30  inMaxOrderBy = 0
314a0 3b 20 20 2f 2a 20 41 64 64 65 64 20 4f 52 44 45  ;  /* Added ORDE
314b0 52 20 42 59 20 66 6f 72 20 6d 69 6e 2f 6d 61 78  R BY for min/max
314c0 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 75 38   queries */.  u8
314d0 20 6d 69 6e 4d 61 78 46 6c 61 67 3b 20 20 20 20   minMaxFlag;    
314e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
314f0 46 6c 61 67 20 66 6f 72 20 6d 69 6e 2f 6d 61 78  Flag for min/max
31500 20 71 75 65 72 69 65 73 20 2a 2f 0a 0a 20 20 64   queries */..  d
31510 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
31520 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
31530 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
31540 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e  if( p==0 || db->
31550 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
31560 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
31570 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
31580 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  }.  if( sqlite3A
31590 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
315a0 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20   SQLITE_SELECT, 
315b0 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  0, 0, 0) ) retur
315c0 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  n 1;.  memset(&s
315d0 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  AggInfo, 0, size
315e0 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 23  of(sAggInfo));.#
315f0 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
31600 4e 41 42 4c 45 44 0a 20 20 53 45 4c 45 43 54 54  NABLED.  SELECTT
31610 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c  RACE(1,pParse,p,
31620 20 28 22 62 65 67 69 6e 20 70 72 6f 63 65 73 73   ("begin process
31630 69 6e 67 3a 5c 6e 22 2c 20 70 50 61 72 73 65 2d  ing:\n", pParse-
31640 3e 61 64 64 72 45 78 70 6c 61 69 6e 29 29 3b 0a  >addrExplain));.
31650 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
31660 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30  ectTrace & 0x100
31670 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54   ){.    sqlite3T
31680 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
31690 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
316a0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  if..  assert( p-
316b0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
316c0 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
316d0 54 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20  T_DistFifo );.  
316e0 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
316f0 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d  rBy==0 || pDest-
31700 3e 65 44 65 73 74 21 3d 53 52 54 5f 46 69 66 6f  >eDest!=SRT_Fifo
31710 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
31720 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
31730 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
31740 54 5f 44 69 73 74 51 75 65 75 65 20 29 3b 0a 20  T_DistQueue );. 
31750 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
31760 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74  erBy==0 || pDest
31770 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 51 75 65  ->eDest!=SRT_Que
31780 75 65 20 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f  ue );.  if( Igno
31790 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65  rableOrderby(pDe
317a0 73 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  st) ){.    asser
317b0 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  t(pDest->eDest==
317c0 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44  SRT_Exists || pD
317d0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
317e0 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20  Union || .      
317f0 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73       pDest->eDes
31800 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c  t==SRT_Except ||
31810 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
31820 52 54 5f 44 69 73 63 61 72 64 20 7c 7c 0a 20 20  RT_Discard ||.  
31830 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e           pDest->
31840 65 44 65 73 74 3d 3d 53 52 54 5f 51 75 65 75 65  eDest==SRT_Queue
31850 20 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73    || pDest->eDes
31860 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
31870 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70 44  ||.           pD
31880 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
31890 44 69 73 74 51 75 65 75 65 20 7c 7c 20 70 44 65  DistQueue || pDe
318a0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46  st->eDest==SRT_F
318b0 69 66 6f 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20  ifo);.    /* If 
318c0 4f 52 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e  ORDER BY makes n
318d0 6f 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20  o difference in 
318e0 74 68 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20  the output then 
318f0 6e 65 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20  neither does.   
31900 20 2a 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20   ** DISTINCT so 
31910 69 74 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65  it can be remove
31920 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71  d too. */.    sq
31930 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
31940 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ete(db, p->pOrde
31950 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  rBy);.    p->pOr
31960 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70  derBy = 0;.    p
31970 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
31980 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a  F_Distinct;.  }.
31990 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50    sqlite3SelectP
319a0 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30  rep(pParse, p, 0
319b0 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
319c0 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
319d0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
319e0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
319f0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
31a00 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  p->pEList!=0 );.
31a10 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
31a20 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
31a30 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
31a40 20 26 20 30 78 31 30 34 20 29 7b 0a 20 20 20 20   & 0x104 ){.    
31a50 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30  SELECTTRACE(0x10
31a60 34 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 61 66  4,pParse,p, ("af
31a70 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  ter name resolut
31a80 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73  ion:\n"));.    s
31a90 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
31aa0 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
31ab0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
31ac0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
31ad0 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
31ae0 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
31af0 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b  ames(pParse, p);
31b00 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
31b10 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
31b20 46 55 4e 43 0a 20 20 69 66 28 20 73 71 6c 69 74  FUNC.  if( sqlit
31b30 65 33 57 69 6e 64 6f 77 52 65 77 72 69 74 65 28  e3WindowRewrite(
31b40 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20  pParse, p) ){.  
31b50 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
31b60 64 3b 0a 20 20 7d 0a 23 69 66 20 53 45 4c 45 43  d;.  }.#if SELEC
31b70 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
31b80 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
31b90 63 74 54 72 61 63 65 20 26 20 30 78 31 30 38 20  ctTrace & 0x108 
31ba0 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41  ){.    SELECTTRA
31bb0 43 45 28 30 78 31 30 34 2c 70 50 61 72 73 65 2c  CE(0x104,pParse,
31bc0 70 2c 20 28 22 61 66 74 65 72 20 77 69 6e 64 6f  p, ("after windo
31bd0 77 20 72 65 77 72 69 74 65 3a 5c 6e 22 29 29 3b  w rewrite:\n"));
31be0 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
31bf0 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
31c00 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
31c10 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
31c20 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43  _OMIT_WINDOWFUNC
31c30 20 2a 2f 0a 20 20 70 54 61 62 4c 69 73 74 20 3d   */.  pTabList =
31c40 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 73 41 67   p->pSrc;.  isAg
31c50 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  g = (p->selFlags
31c60 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29   & SF_Aggregate)
31c70 21 3d 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  !=0;.  memset(&s
31c80 53 6f 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Sort, 0, sizeof(
31c90 73 53 6f 72 74 29 29 3b 0a 20 20 73 53 6f 72 74  sSort));.  sSort
31ca0 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70  .pOrderBy = p->p
31cb0 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 54  OrderBy;..  /* T
31cc0 72 79 20 74 6f 20 76 61 72 69 6f 75 73 20 6f 70  ry to various op
31cd0 74 69 6d 69 7a 61 74 69 6f 6e 73 20 28 66 6c 61  timizations (fla
31ce0 74 74 65 6e 69 6e 67 20 73 75 62 71 75 65 72 69  ttening subqueri
31cf0 65 73 2c 20 61 6e 64 20 73 74 72 65 6e 67 74 68  es, and strength
31d00 0a 20 20 2a 2a 20 72 65 64 75 63 74 69 6f 6e 20  .  ** reduction 
31d10 6f 66 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  of join operator
31d20 73 29 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  s) in the FROM c
31d30 6c 61 75 73 65 20 75 70 20 69 6e 74 6f 20 74 68  lause up into th
31d40 65 20 6d 61 69 6e 20 71 75 65 72 79 0a 20 20 2a  e main query.  *
31d50 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
31d60 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
31d70 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
31d80 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
31d90 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70  W).  for(i=0; !p
31da0 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54  ->pPrior && i<pT
31db0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
31dc0 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
31dd0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
31de0 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
31df0 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74  a[i];.    Select
31e00 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e   *pSub = pItem->
31e10 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 54 61 62  pSelect;.    Tab
31e20 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d  le *pTab = pItem
31e30 2d 3e 70 54 61 62 3b 0a 0a 20 20 20 20 2f 2a 20  ->pTab;..    /* 
31e40 43 6f 6e 76 65 72 74 20 4c 45 46 54 20 4a 4f 49  Convert LEFT JOI
31e50 4e 20 69 6e 74 6f 20 4a 4f 49 4e 20 69 66 20 74  N into JOIN if t
31e60 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20 6f  here are terms o
31e70 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  f the right tabl
31e80 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  e.    ** of the 
31e90 4c 45 46 54 20 4a 4f 49 4e 20 75 73 65 64 20 69  LEFT JOIN used i
31ea0 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
31eb0 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
31ec0 66 28 20 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f  f( (pItem->fg.jo
31ed0 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54  intype & JT_LEFT
31ee0 29 21 3d 30 0a 20 20 20 20 20 26 26 20 73 71 6c  )!=0.     && sql
31ef0 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 4e  ite3ExprImpliesN
31f00 6f 6e 4e 75 6c 6c 52 6f 77 28 70 2d 3e 70 57 68  onNullRow(p->pWh
31f10 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  ere, pItem->iCur
31f20 73 6f 72 29 0a 20 20 20 20 20 26 26 20 4f 70 74  sor).     && Opt
31f30 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
31f40 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 69 6d 70  (db, SQLITE_Simp
31f50 6c 69 66 79 4a 6f 69 6e 29 0a 20 20 20 20 29 7b  lifyJoin).    ){
31f60 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41  .      SELECTTRA
31f70 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c  CE(0x100,pParse,
31f80 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
31f90 20 20 20 28 22 4c 45 46 54 2d 4a 4f 49 4e 20 73     ("LEFT-JOIN s
31fa0 69 6d 70 6c 69 66 69 65 73 20 74 6f 20 4a 4f 49  implifies to JOI
31fb0 4e 20 6f 6e 20 74 65 72 6d 20 25 64 5c 6e 22 2c  N on term %d\n",
31fc0 69 29 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  i));.      pItem
31fd0 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 3d  ->fg.jointype &=
31fe0 20 7e 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55   ~(JT_LEFT|JT_OU
31ff0 54 45 52 29 3b 0a 20 20 20 20 20 20 75 6e 73 65  TER);.      unse
32000 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 57 68  tJoinExpr(p->pWh
32010 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  ere, pItem->iCur
32020 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  sor);.    }..   
32030 20 2f 2a 20 4e 6f 20 66 75 74 68 65 72 20 61 63   /* No futher ac
32040 74 69 6f 6e 20 69 66 20 74 68 69 73 20 74 65 72  tion if this ter
32050 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  m of the FROM cl
32060 61 75 73 65 20 69 73 20 6e 6f 20 61 20 73 75 62  ause is no a sub
32070 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 69 66 28  query */.    if(
32080 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69   pSub==0 ) conti
32090 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 74  nue;..    /* Cat
320a0 63 68 20 6d 69 73 6d 61 74 63 68 20 69 6e 20 74  ch mismatch in t
320b0 68 65 20 64 65 63 6c 61 72 65 64 20 63 6f 6c 75  he declared colu
320c0 6d 6e 73 20 6f 66 20 61 20 76 69 65 77 20 61 6e  mns of a view an
320d0 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  d the number of.
320e0 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69      ** columns i
320f0 6e 20 74 68 65 20 53 45 4c 45 43 54 20 6f 6e 20  n the SELECT on 
32100 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 20 20 69  the RHS */.    i
32110 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 21 3d 70  f( pTab->nCol!=p
32120 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  Sub->pEList->nEx
32130 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  pr ){.      sqli
32140 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
32150 73 65 2c 20 22 65 78 70 65 63 74 65 64 20 25 64  se, "expected %d
32160 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 27 25 73   columns for '%s
32170 27 20 62 75 74 20 67 6f 74 20 25 64 22 2c 0a 20  ' but got %d",. 
32180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32190 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c       pTab->nCol,
321a0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 53   pTab->zName, pS
321b0 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ub->pEList->nExp
321c0 72 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  r);.      goto s
321d0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
321e0 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  ..    /* Do not 
321f0 74 72 79 20 74 6f 20 66 6c 61 74 74 65 6e 20 61  try to flatten a
32200 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62 71  n aggregate subq
32210 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  uery..    **.   
32220 20 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 61   ** Flattening a
32230 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62 71  n aggregate subq
32240 75 65 72 79 20 69 73 20 6f 6e 6c 79 20 70 6f 73  uery is only pos
32250 73 69 62 6c 65 20 69 66 20 74 68 65 20 6f 75 74  sible if the out
32260 65 72 20 71 75 65 72 79 0a 20 20 20 20 2a 2a 20  er query.    ** 
32270 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 20 20  is not a join.  
32280 42 75 74 20 69 66 20 74 68 65 20 6f 75 74 65 72  But if the outer
32290 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
322a0 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68 65 20 73  join, then the s
322b0 75 62 71 75 65 72 79 0a 20 20 20 20 2a 2a 20 77  ubquery.    ** w
322c0 69 6c 6c 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74  ill be implement
322d0 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69  ed as a co-routi
322e0 6e 65 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  ne and there is 
322f0 6e 6f 20 61 64 76 61 6e 74 61 67 65 20 74 6f 0a  no advantage to.
32300 20 20 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e      ** flattenin
32310 67 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a  g in that case..
32320 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
32330 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
32340 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d   SF_Aggregate)!=
32350 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
32360 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e    assert( pSub->
32370 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 0a  pGroupBy==0 );..
32380 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75      /* If the ou
32390 74 65 72 20 71 75 65 72 79 20 63 6f 6e 74 61 69  ter query contai
323a0 6e 73 20 61 20 22 63 6f 6d 70 6c 65 78 22 20 72  ns a "complex" r
323b0 65 73 75 6c 74 20 73 65 74 20 28 74 68 61 74 20  esult set (that 
323c0 69 73 2c 0a 20 20 20 20 2a 2a 20 69 66 20 74 68  is,.    ** if th
323d0 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
323e0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
323f0 75 73 65 73 20 66 75 6e 63 74 69 6f 6e 73 20 6f  uses functions o
32400 72 20 73 75 62 71 75 65 72 69 65 73 29 0a 20 20  r subqueries).  
32410 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20    ** and if the 
32420 73 75 62 71 75 65 72 79 20 63 6f 6e 74 61 69 6e  subquery contain
32430 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
32440 61 75 73 65 20 61 6e 64 20 69 66 0a 20 20 20 20  ause and if.    
32450 2a 2a 20 69 74 20 77 69 6c 6c 20 62 65 20 69 6d  ** it will be im
32460 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63  plemented as a c
32470 6f 2d 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20  o-routine, then 
32480 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e 2e 20  do not flatten. 
32490 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 72 65 73   This.    ** res
324a0 74 72 69 63 74 69 6f 6e 20 61 6c 6c 6f 77 73 20  triction allows 
324b0 53 51 4c 20 63 6f 6e 73 74 72 75 63 74 73 20 6c  SQL constructs l
324c0 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a  ike this:.    **
324d0 0a 20 20 20 20 2a 2a 20 20 53 45 4c 45 43 54 20  .    **  SELECT 
324e0 65 78 70 65 6e 73 69 76 65 5f 66 75 6e 63 74 69  expensive_functi
324f0 6f 6e 28 78 29 0a 20 20 20 20 2a 2a 20 20 20 20  on(x).    **    
32500 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 20 46  FROM (SELECT x F
32510 52 4f 4d 20 74 61 62 20 4f 52 44 45 52 20 42 59  ROM tab ORDER BY
32520 20 79 20 4c 49 4d 49 54 20 31 30 29 3b 0a 20 20   y LIMIT 10);.  
32530 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
32540 65 78 70 65 6e 73 69 76 65 5f 66 75 6e 63 74 69  expensive_functi
32550 6f 6e 28 29 20 69 73 20 6f 6e 6c 79 20 63 6f 6d  on() is only com
32560 70 75 74 65 64 20 6f 6e 20 74 68 65 20 31 30 20  puted on the 10 
32570 72 6f 77 73 20 74 68 61 74 0a 20 20 20 20 2a 2a  rows that.    **
32580 20 61 72 65 20 6f 75 74 70 75 74 2c 20 72 61 74   are output, rat
32590 68 65 72 20 74 68 61 6e 20 65 76 65 72 79 20 72  her than every r
325a0 6f 77 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ow of the table.
325b0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
325c0 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 20 74  he requirement t
325d0 68 61 74 20 74 68 65 20 6f 75 74 65 72 20 71 75  hat the outer qu
325e0 65 72 79 20 68 61 76 65 20 61 20 63 6f 6d 70 6c  ery have a compl
325f0 65 78 20 72 65 73 75 6c 74 20 73 65 74 0a 20 20  ex result set.  
32600 20 20 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20    ** means that 
32610 66 6c 61 74 74 65 6e 69 6e 67 20 64 6f 65 73 20  flattening does 
32620 6f 63 63 75 72 20 6f 6e 20 73 69 6d 70 6c 65 72  occur on simpler
32630 20 53 51 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73   SQL constraints
32640 20 77 69 74 68 6f 75 74 0a 20 20 20 20 2a 2a 20   without.    ** 
32650 74 68 65 20 65 78 70 65 6e 73 69 76 65 5f 66 75  the expensive_fu
32660 6e 63 74 69 6f 6e 28 29 20 6c 69 6b 65 3a 0a 20  nction() like:. 
32670 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 53 45     **.    **  SE
32680 4c 45 43 54 20 78 20 46 52 4f 4d 20 28 53 45 4c  LECT x FROM (SEL
32690 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 20 4f  ECT x FROM tab O
326a0 52 44 45 52 20 42 59 20 79 20 4c 49 4d 49 54 20  RDER BY y LIMIT 
326b0 31 30 29 3b 0a 20 20 20 20 2a 2f 0a 20 20 20 20  10);.    */.    
326c0 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  if( pSub->pOrder
326d0 42 79 21 3d 30 0a 20 20 20 20 20 26 26 20 69 3d  By!=0.     && i=
326e0 3d 30 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 73  =0.     && (p->s
326f0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d  elFlags & SF_Com
32700 70 6c 65 78 52 65 73 75 6c 74 29 21 3d 30 0a 20  plexResult)!=0. 
32710 20 20 20 20 26 26 20 28 70 54 61 62 4c 69 73 74      && (pTabList
32720 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20 20  ->nSrc==1.      
32730 20 20 20 7c 7c 20 28 70 54 61 62 4c 69 73 74 2d     || (pTabList-
32740 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70  >a[1].fg.jointyp
32750 65 26 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52  e&(JT_LEFT|JT_CR
32760 4f 53 53 29 29 21 3d 30 29 0a 20 20 20 20 29 7b  OSS))!=0).    ){
32770 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
32780 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
32790 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28  flattenSubquery(
327a0 70 50 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73  pParse, p, i, is
327b0 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Agg) ){.      /*
327c0 20 54 68 69 73 20 73 75 62 71 75 65 72 79 20 63   This subquery c
327d0 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20 69  an be absorbed i
327e0 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 20  nto its parent. 
327f0 2a 2f 0a 20 20 20 20 20 20 69 20 3d 20 2d 31 3b  */.      i = -1;
32800 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 4c  .    }.    pTabL
32810 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
32820 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
32830 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73  cFailed ) goto s
32840 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69  elect_end;.    i
32850 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64  f( !IgnorableOrd
32860 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20  erby(pDest) ){. 
32870 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65       sSort.pOrde
32880 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
32890 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  y;.    }.  }.#en
328a0 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
328b0 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
328c0 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 48 61  D_SELECT.  /* Ha
328d0 6e 64 6c 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45  ndle compound SE
328e0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
328f0 75 73 69 6e 67 20 74 68 65 20 73 65 70 61 72 61  using the separa
32900 74 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 29  te multiSelect()
32910 0a 20 20 2a 2a 20 70 72 6f 63 65 64 75 72 65 2e  .  ** procedure.
32920 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
32930 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 63 20  Prior ){.    rc 
32940 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50  = multiSelect(pP
32950 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b  arse, p, pDest);
32960 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
32970 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 53 45 4c  _ENABLED.    SEL
32980 45 43 54 54 52 41 43 45 28 30 78 31 2c 70 50 61  ECTTRACE(0x1,pPa
32990 72 73 65 2c 70 2c 28 22 65 6e 64 20 63 6f 6d 70  rse,p,("end comp
329a0 6f 75 6e 64 2d 73 65 6c 65 63 74 20 70 72 6f 63  ound-select proc
329b0 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 20  essing\n"));.   
329c0 20 69 66 28 20 28 73 71 6c 69 74 65 33 53 65 6c   if( (sqlite3Sel
329d0 65 63 74 54 72 61 63 65 20 26 20 30 78 32 30 30  ectTrace & 0x200
329e0 30 29 21 3d 30 20 26 26 20 45 78 70 6c 61 69 6e  0)!=0 && Explain
329f0 51 75 65 72 79 50 6c 61 6e 50 61 72 65 6e 74 28  QueryPlanParent(
32a00 70 50 61 72 73 65 29 3d 3d 30 20 29 7b 0a 20 20  pParse)==0 ){.  
32a10 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
32a20 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
32a30 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  0);.    }.#endif
32a40 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78  .    if( p->pNex
32a50 74 3d 3d 30 20 29 20 45 78 70 6c 61 69 6e 51 75  t==0 ) ExplainQu
32a60 65 72 79 50 6c 61 6e 50 6f 70 28 70 50 61 72 73  eryPlanPop(pPars
32a70 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  e);.    return r
32a80 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  c;.  }.#endif.. 
32a90 20 2f 2a 20 44 6f 20 74 68 65 20 57 48 45 52 45   /* Do the WHERE
32aa0 2d 63 6c 61 75 73 65 20 63 6f 6e 73 74 61 6e 74  -clause constant
32ab0 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6f 70 74   propagation opt
32ac0 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 74 68 69  imization if thi
32ad0 73 20 69 73 0a 20 20 2a 2a 20 61 20 6a 6f 69 6e  s is.  ** a join
32ae0 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 73 70  .  No need to sp
32af0 65 65 64 20 74 69 6d 65 20 6f 6e 20 74 68 69 73  eed time on this
32b00 20 6f 70 65 72 61 74 69 6f 6e 20 66 6f 72 20 6e   operation for n
32b10 6f 6e 2d 6a 6f 69 6e 20 71 75 65 72 69 65 73 0a  on-join queries.
32b20 20 20 2a 2a 20 61 73 20 74 68 65 20 65 71 75 69    ** as the equi
32b30 76 61 6c 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74  valent optimizat
32b40 69 6f 6e 20 77 69 6c 6c 20 62 65 20 68 61 6e 64  ion will be hand
32b50 6c 65 64 20 62 79 20 71 75 65 72 79 20 70 6c 61  led by query pla
32b60 6e 6e 65 72 20 69 6e 0a 20 20 2a 2a 20 73 71 6c  nner in.  ** sql
32b70 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
32b80 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ..  */.  if( pTa
32b90 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 0a 20 20  bList->nSrc>1.  
32ba0 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
32bb0 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
32bc0 54 45 5f 50 72 6f 70 61 67 61 74 65 43 6f 6e 73  TE_PropagateCons
32bd0 74 29 0a 20 20 20 26 26 20 70 72 6f 70 61 67 61  t).   && propaga
32be0 74 65 43 6f 6e 73 74 61 6e 74 73 28 70 50 61 72  teConstants(pPar
32bf0 73 65 2c 20 70 29 0a 20 20 29 7b 0a 23 69 66 20  se, p).  ){.#if 
32c00 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
32c10 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69  LED.    if( sqli
32c20 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
32c30 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 20 20   0x100 ){.      
32c40 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30  SELECTTRACE(0x10
32c50 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74  0,pParse,p,("Aft
32c60 65 72 20 63 6f 6e 73 74 61 6e 74 20 70 72 6f 70  er constant prop
32c70 61 67 61 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20  agation:\n"));. 
32c80 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
32c90 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
32ca0 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   0);.    }.#endi
32cb0 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 53  f.  }else{.    S
32cc0 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30  ELECTTRACE(0x100
32cd0 2c 70 50 61 72 73 65 2c 70 2c 28 22 43 6f 6e 73  ,pParse,p,("Cons
32ce0 74 61 6e 74 20 70 72 6f 70 61 67 61 74 69 6f 6e  tant propagation
32cf0 20 6e 6f 74 20 68 65 6c 70 66 75 6c 5c 6e 22 29   not helpful\n")
32d00 29 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  );.  }..#ifdef S
32d10 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45  QLITE_COUNTOFVIE
32d20 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20  W_OPTIMIZATION. 
32d30 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f   if( Optimizatio
32d40 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  nEnabled(db, SQL
32d50 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e  ITE_QueryFlatten
32d60 65 72 7c 53 51 4c 49 54 45 5f 43 6f 75 6e 74 4f  er|SQLITE_CountO
32d70 66 56 69 65 77 29 0a 20 20 20 26 26 20 63 6f 75  fView).   && cou
32d80 6e 74 4f 66 56 69 65 77 4f 70 74 69 6d 69 7a 61  ntOfViewOptimiza
32d90 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 29 0a  tion(pParse, p).
32da0 20 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d    ){.    if( db-
32db0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
32dc0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
32dd0 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  .    pEList = p-
32de0 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 70 54 61  >pEList;.    pTa
32df0 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
32e00 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
32e10 2a 20 46 6f 72 20 65 61 63 68 20 74 65 72 6d 20  * For each term 
32e20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
32e30 73 65 2c 20 64 6f 20 74 77 6f 20 74 68 69 6e 67  se, do two thing
32e40 73 3a 0a 20 20 2a 2a 20 28 31 29 20 41 75 74 68  s:.  ** (1) Auth
32e50 6f 72 69 7a 65 64 20 75 6e 72 65 66 65 72 65 6e  orized unreferen
32e60 63 65 64 20 74 61 62 6c 65 73 0a 20 20 2a 2a 20  ced tables.  ** 
32e70 28 32 29 20 47 65 6e 65 72 61 74 65 20 63 6f 64  (2) Generate cod
32e80 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75  e for all sub-qu
32e90 65 72 69 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72  eries.  */.  for
32ea0 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
32eb0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
32ec0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
32ed0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
32ee0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a  pTabList->a[i];.
32ef0 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64      SelectDest d
32f00 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  est;.    Select 
32f10 2a 70 53 75 62 3b 0a 23 69 66 20 21 64 65 66 69  *pSub;.#if !defi
32f20 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
32f30 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
32f40 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
32f50 54 5f 56 49 45 57 29 0a 20 20 20 20 63 6f 6e 73  T_VIEW).    cons
32f60 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75  t char *zSavedAu
32f70 74 68 43 6f 6e 74 65 78 74 3b 0a 23 65 6e 64 69  thContext;.#endi
32f80 66 0a 0a 20 20 20 20 2f 2a 20 49 73 73 75 65 20  f..    /* Issue 
32f90 53 51 4c 49 54 45 5f 52 45 41 44 20 61 75 74 68  SQLITE_READ auth
32fa0 6f 72 69 7a 61 74 69 6f 6e 73 20 77 69 74 68 20  orizations with 
32fb0 61 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61  a fake column na
32fc0 6d 65 20 66 6f 72 20 61 6e 79 0a 20 20 20 20 2a  me for any.    *
32fd0 2a 20 74 61 62 6c 65 73 20 74 68 61 74 20 61 72  * tables that ar
32fe0 65 20 72 65 66 65 72 65 6e 63 65 64 20 62 75 74  e referenced but
32ff0 20 66 72 6f 6d 20 77 68 69 63 68 20 6e 6f 20 76   from which no v
33000 61 6c 75 65 73 20 61 72 65 20 65 78 74 72 61 63  alues are extrac
33010 74 65 64 2e 0a 20 20 20 20 2a 2a 20 45 78 61 6d  ted..    ** Exam
33020 70 6c 65 73 20 6f 66 20 77 68 65 72 65 20 74 68  ples of where th
33030 65 73 65 20 6b 69 6e 64 73 20 6f 66 20 6e 75 6c  ese kinds of nul
33040 6c 20 53 51 4c 49 54 45 5f 52 45 41 44 20 61 75  l SQLITE_READ au
33050 74 68 6f 72 69 7a 61 74 69 6f 6e 73 0a 20 20 20  thorizations.   
33060 20 2a 2a 20 77 6f 75 6c 64 20 6f 63 63 75 72 3a   ** would occur:
33070 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
33080 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
33090 2a 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 2d 2d  *) FROM t1;   --
330a0 20 53 51 4c 49 54 45 5f 52 45 41 44 20 74 31 2e   SQLITE_READ t1.
330b0 22 22 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 45  "".    **     SE
330c0 4c 45 43 54 20 74 31 2e 2a 20 46 52 4f 4d 20 74  LECT t1.* FROM t
330d0 31 2c 20 74 32 3b 20 20 20 2d 2d 20 53 51 4c 49  1, t2;   -- SQLI
330e0 54 45 5f 52 45 41 44 20 74 32 2e 22 22 0a 20 20  TE_READ t2."".  
330f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
33100 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  fake column name
33110 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72   is an empty str
33120 69 6e 67 2e 20 20 49 74 20 69 73 20 70 6f 73 73  ing.  It is poss
33130 69 62 6c 65 20 66 6f 72 20 61 20 74 61 62 6c 65  ible for a table
33140 20 74 6f 0a 20 20 20 20 2a 2a 20 68 61 76 65 20   to.    ** have 
33150 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 62  a column named b
33160 79 20 74 68 65 20 65 6d 70 74 79 20 73 74 72 69  y the empty stri
33170 6e 67 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73  ng, in which cas
33180 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61  e there is no wa
33190 79 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 74  y to.    ** dist
331a0 69 6e 67 75 69 73 68 20 62 65 74 77 65 65 6e 20  inguish between 
331b0 61 6e 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20  an unreferenced 
331c0 74 61 62 6c 65 20 61 6e 64 20 61 6e 20 61 63 74  table and an act
331d0 75 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ual reference to
331e0 20 74 68 65 0a 20 20 20 20 2a 2a 20 22 22 20 63   the.    ** "" c
331f0 6f 6c 75 6d 6e 2e 20 54 68 65 20 6f 72 69 67 69  olumn. The origi
33200 6e 61 6c 20 64 65 73 69 67 6e 20 77 61 73 20 66  nal design was f
33210 6f 72 20 74 68 65 20 66 61 6b 65 20 63 6f 6c 75  or the fake colu
33220 6d 6e 20 6e 61 6d 65 20 74 6f 20 62 65 20 61 20  mn name to be a 
33230 4e 55 4c 4c 2c 0a 20 20 20 20 2a 2a 20 77 68 69  NULL,.    ** whi
33240 63 68 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 6d  ch would be unam
33250 62 69 67 75 6f 75 73 2e 20 20 42 75 74 20 6c 65  biguous.  But le
33260 67 61 63 79 20 61 75 74 68 6f 72 69 7a 61 74 69  gacy authorizati
33270 6f 6e 20 63 61 6c 6c 62 61 63 6b 73 20 6d 69 67  on callbacks mig
33280 68 74 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65  ht.    ** assume
33290 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
332a0 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64   is non-NULL and
332b0 20 73 65 67 66 61 75 6c 74 2e 20 20 54 68 65 20   segfault.  The 
332c0 75 73 65 20 6f 66 20 61 6e 20 65 6d 70 74 79 0a  use of an empty.
332d0 20 20 20 20 2a 2a 20 73 74 72 69 6e 67 20 66 6f      ** string fo
332e0 72 20 74 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d  r the fake colum
332f0 6e 20 6e 61 6d 65 20 73 65 65 6d 73 20 73 61 66  n name seems saf
33300 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  er..    */.    i
33310 66 28 20 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  f( pItem->colUse
33320 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  d==0 ){.      sq
33330 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
33340 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45  Parse, SQLITE_RE
33350 41 44 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  AD, pItem->zName
33360 2c 20 22 22 2c 20 70 49 74 65 6d 2d 3e 7a 44 61  , "", pItem->zDa
33370 74 61 62 61 73 65 29 3b 0a 20 20 20 20 7d 0a 0a  tabase);.    }..
33380 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
33390 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
333a0 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
333b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
333c0 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
333d0 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75   code for all su
333e0 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  b-queries in the
333f0 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20   FROM clause.   
33400 20 2a 2f 0a 20 20 20 20 70 53 75 62 20 3d 20 70   */.    pSub = p
33410 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  Item->pSelect;. 
33420 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29     if( pSub==0 )
33430 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
33440 2f 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 65  /* Sometimes the
33450 20 63 6f 64 65 20 66 6f 72 20 61 20 73 75 62 71   code for a subq
33460 75 65 72 79 20 77 69 6c 6c 20 62 65 20 67 65 6e  uery will be gen
33470 65 72 61 74 65 64 20 6d 6f 72 65 20 74 68 61 6e  erated more than
33480 0a 20 20 20 20 2a 2a 20 6f 6e 63 65 2c 20 69 66  .    ** once, if
33490 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
334a0 20 70 61 72 74 20 6f 66 20 74 68 65 20 57 48 45   part of the WHE
334b0 52 45 20 63 6c 61 75 73 65 20 69 6e 20 61 20 4c  RE clause in a L
334c0 45 46 54 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a  EFT JOIN,.    **
334d0 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 49   for example.  I
334e0 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64 6f 20  n that case, do 
334f0 6e 6f 74 20 72 65 67 65 6e 65 72 61 74 65 20 74  not regenerate t
33500 68 65 20 63 6f 64 65 20 74 6f 20 6d 61 6e 69 66  he code to manif
33510 65 73 74 0a 20 20 20 20 2a 2a 20 61 20 76 69 65  est.    ** a vie
33520 77 20 6f 72 20 74 68 65 20 63 6f 2d 72 6f 75 74  w or the co-rout
33530 69 6e 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ine to implement
33540 20 61 20 76 69 65 77 2e 20 20 54 68 65 20 66 69   a view.  The fi
33550 72 73 74 20 69 6e 73 74 61 6e 63 65 0a 20 20 20  rst instance.   
33560 20 2a 2a 20 69 73 20 73 75 66 66 69 63 69 65 6e   ** is sufficien
33570 74 2c 20 74 68 6f 75 67 68 20 74 68 65 20 73 75  t, though the su
33580 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6e 69  broutine to mani
33590 66 65 73 74 20 74 68 65 20 76 69 65 77 20 64 6f  fest the view do
335a0 65 73 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74  es need.    ** t
335b0 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 67 61  o be invoked aga
335c0 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  in. */.    if( p
335d0 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
335e0 62 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  b ){.      if( p
335f0 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f  Item->fg.viaCoro
33600 75 74 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20  utine==0 ){.    
33610 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 72 6f      /* The subro
33620 75 74 69 6e 65 20 74 68 61 74 20 6d 61 6e 69 66  utine that manif
33630 65 73 74 73 20 74 68 65 20 76 69 65 77 20 6d 69  ests the view mi
33640 67 68 74 20 62 65 20 61 20 6f 6e 65 2d 74 69 6d  ght be a one-tim
33650 65 20 72 6f 75 74 69 6e 65 2c 0a 20 20 20 20 20  e routine,.     
33660 20 20 20 2a 2a 20 6f 72 20 69 74 20 6d 69 67 68     ** or it migh
33670 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 72  t need to be rer
33680 75 6e 20 6f 6e 20 65 61 63 68 20 69 74 65 72 61  un on each itera
33690 74 69 6f 6e 20 62 65 63 61 75 73 65 20 69 74 0a  tion because it.
336a0 20 20 20 20 20 20 20 20 2a 2a 20 65 6e 63 6f 64          ** encod
336b0 65 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  es a correlated 
336c0 73 75 62 71 75 65 72 79 2e 20 2a 2f 0a 20 20 20  subquery. */.   
336d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73       testcase( s
336e0 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
336f0 76 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69  v, pItem->addrFi
33700 6c 6c 53 75 62 29 2d 3e 6f 70 63 6f 64 65 3d 3d  llSub)->opcode==
33710 4f 50 5f 4f 6e 63 65 20 29 3b 0a 20 20 20 20 20  OP_Once );.     
33720 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
33730 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
33740 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
33750 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  rn, pItem->addrF
33760 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 20 20 7d  illSub);.      }
33770 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
33780 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
33790 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e  ncrement Parse.n
337a0 48 65 69 67 68 74 20 62 79 20 74 68 65 20 68 65  Height by the he
337b0 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61 72 67  ight of the larg
337c0 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  est expression. 
337d0 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66 65 72     ** tree refer
337e0 72 65 64 20 74 6f 20 62 79 20 74 68 69 73 2c 20  red to by this, 
337f0 74 68 65 20 70 61 72 65 6e 74 20 73 65 6c 65 63  the parent selec
33800 74 2e 20 54 68 65 20 63 68 69 6c 64 20 73 65 6c  t. The child sel
33810 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63  ect.    ** may c
33820 6f 6e 74 61 69 6e 20 65 78 70 72 65 73 73 69 6f  ontain expressio
33830 6e 20 74 72 65 65 73 20 6f 66 20 61 74 20 6d 6f  n trees of at mo
33840 73 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49 54  st.    ** (SQLIT
33850 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
33860 2d 50 61 72 73 65 2e 6e 48 65 69 67 68 74 29 20  -Parse.nHeight) 
33870 68 65 69 67 68 74 2e 20 54 68 69 73 20 69 73 20  height. This is 
33880 61 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72  a bit.    ** mor
33890 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 74  e conservative t
338a0 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2c 20 62  han necessary, b
338b0 75 74 20 6d 75 63 68 20 65 61 73 69 65 72 20 74  ut much easier t
338c0 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20  han enforcing.  
338d0 20 20 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c 69    ** an exact li
338e0 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mit..    */.    
338f0 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20  pParse->nHeight 
33900 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  += sqlite3Select
33910 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 0a  ExprHeight(p);..
33920 20 20 20 20 2f 2a 20 4d 61 6b 65 20 63 6f 70 69      /* Make copi
33930 65 73 20 6f 66 20 63 6f 6e 73 74 61 6e 74 20 57  es of constant W
33940 48 45 52 45 2d 63 6c 61 75 73 65 20 74 65 72 6d  HERE-clause term
33950 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  s in the outer q
33960 75 65 72 79 20 64 6f 77 6e 0a 20 20 20 20 2a 2a  uery down.    **
33970 20 69 6e 73 69 64 65 20 74 68 65 20 73 75 62 71   inside the subq
33980 75 65 72 79 2e 20 20 54 68 69 73 20 63 61 6e 20  uery.  This can 
33990 68 65 6c 70 20 74 68 65 20 73 75 62 71 75 65 72  help the subquer
339a0 79 20 74 6f 20 72 75 6e 20 6d 6f 72 65 20 65 66  y to run more ef
339b0 66 69 63 69 65 6e 74 6c 79 2e 0a 20 20 20 20 2a  ficiently..    *
339c0 2f 0a 20 20 20 20 69 66 28 20 4f 70 74 69 6d 69  /.    if( Optimi
339d0 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
339e0 2c 20 53 51 4c 49 54 45 5f 50 75 73 68 44 6f 77  , SQLITE_PushDow
339f0 6e 29 0a 20 20 20 20 20 26 26 20 70 75 73 68 44  n).     && pushD
33a00 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 70 50  ownWhereTerms(pP
33a10 61 72 73 65 2c 20 70 53 75 62 2c 20 70 2d 3e 70  arse, pSub, p->p
33a20 57 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43  Where, pItem->iC
33a30 75 72 73 6f 72 2c 0a 20 20 20 20 20 20 20 20 20  ursor,.         
33a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a50 20 20 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69    (pItem->fg.joi
33a60 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
33a70 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 23 69 66  )!=0).    ){.#if
33a80 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
33a90 42 4c 45 44 0a 20 20 20 20 20 20 69 66 28 20 73  BLED.      if( s
33aa0 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
33ab0 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20  e & 0x100 ){.   
33ac0 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45       SELECTTRACE
33ad0 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x100,pParse,p,
33ae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 22 41  .            ("A
33af0 66 74 65 72 20 57 48 45 52 45 2d 63 6c 61 75 73  fter WHERE-claus
33b00 65 20 70 75 73 68 2d 64 6f 77 6e 20 69 6e 74 6f  e push-down into
33b10 20 73 75 62 71 75 65 72 79 20 25 64 3a 5c 6e 22   subquery %d:\n"
33b20 2c 20 70 53 75 62 2d 3e 73 65 6c 49 64 29 29 3b  , pSub->selId));
33b30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
33b40 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
33b50 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , p, 0);.      }
33b60 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
33b70 65 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54  e{.      SELECTT
33b80 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73  RACE(0x100,pPars
33b90 65 2c 70 2c 28 22 50 75 73 68 2d 64 6f 77 6e 20  e,p,("Push-down 
33ba0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 5c 6e 22 29  not possible\n")
33bb0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7a 53  );.    }..    zS
33bc0 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20  avedAuthContext 
33bd0 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43  = pParse->zAuthC
33be0 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70 50 61 72  ontext;.    pPar
33bf0 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
33c00 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b   = pItem->zName;
33c10 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  ..    /* Generat
33c20 65 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d  e code to implem
33c30 65 6e 74 20 74 68 65 20 73 75 62 71 75 65 72 79  ent the subquery
33c40 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
33c50 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 69  he subquery is i
33c60 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
33c70 63 6f 2d 72 6f 75 74 69 6e 65 20 69 66 20 74 68  co-routine if th
33c80 65 20 73 75 62 71 75 65 72 79 20 69 73 0a 20 20  e subquery is.  
33c90 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20    ** guaranteed 
33ca0 74 6f 20 62 65 20 74 68 65 20 6f 75 74 65 72 20  to be the outer 
33cb0 6c 6f 6f 70 20 28 73 6f 20 74 68 61 74 20 69 74  loop (so that it
33cc0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
33cd0 6f 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  o be.    ** comp
33ce0 75 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f  uted more than o
33cf0 6e 63 65 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nce).    **.    
33d00 2a 2a 20 54 4f 44 4f 3a 20 41 72 65 20 74 68 65  ** TODO: Are the
33d10 72 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 73  re other reasons
33d20 20 62 65 73 69 64 65 20 28 31 29 20 74 6f 20 75   beside (1) to u
33d30 73 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 0a  se a co-routine.
33d40 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74      ** implement
33d50 61 74 69 6f 6e 3f 0a 20 20 20 20 2a 2f 0a 20 20  ation?.    */.  
33d60 20 20 69 66 28 20 69 3d 3d 30 0a 20 20 20 20 20    if( i==0.     
33d70 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53  && (pTabList->nS
33d80 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 20  rc==1.          
33d90 20 20 7c 7c 20 28 70 54 61 62 4c 69 73 74 2d 3e    || (pTabList->
33da0 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65  a[1].fg.jointype
33db0 26 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f  &(JT_LEFT|JT_CRO
33dc0 53 53 29 29 21 3d 30 29 20 20 2f 2a 20 28 31 29  SS))!=0)  /* (1)
33dd0 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20   */.    ){.     
33de0 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20   /* Implement a 
33df0 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20  co-routine that 
33e00 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 73 69  will return a si
33e10 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20  ngle row of the 
33e20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20  result.      ** 
33e30 73 65 74 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f  set on each invo
33e40 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  cation..      */
33e50 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
33e60 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
33e70 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31  CurrentAddr(v)+1
33e80 3b 0a 20 20 20 20 20 0a 20 20 20 20 20 20 70 49  ;.     .      pI
33e90 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d  tem->regReturn =
33ea0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
33eb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
33ec0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
33ed0 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49  nitCoroutine, pI
33ee0 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  tem->regReturn, 
33ef0 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20  0, addrTop);.   
33f00 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
33f10 76 2c 20 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e  v, "%s", pItem->
33f20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
33f30 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72       pItem->addr
33f40 46 69 6c 6c 53 75 62 20 3d 20 61 64 64 72 54 6f  FillSub = addrTo
33f50 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  p;.      sqlite3
33f60 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
33f70 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74  dest, SRT_Corout
33f80 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  ine, pItem->regR
33f90 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 45 78  eturn);.      Ex
33fa0 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28  plainQueryPlan((
33fb0 70 50 61 72 73 65 2c 20 31 2c 20 22 43 4f 2d 52  pParse, 1, "CO-R
33fc0 4f 55 54 49 4e 45 20 25 75 22 2c 20 70 53 75 62  OUTINE %u", pSub
33fd0 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20 20 20 20  ->selId));.     
33fe0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
33ff0 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65  Parse, pSub, &de
34000 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  st);.      pItem
34010 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45  ->pTab->nRowLogE
34020 73 74 20 3d 20 70 53 75 62 2d 3e 6e 53 65 6c 65  st = pSub->nSele
34030 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 70 49 74  ctRow;.      pIt
34040 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74  em->fg.viaCorout
34050 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  ine = 1;.      p
34060 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74 20  Item->regResult 
34070 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20  = dest.iSdst;.  
34080 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
34090 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 70  ndCoroutine(v, p
340a0 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
340b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
340c0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
340d0 64 64 72 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20  ddrTop-1);.     
340e0 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d   sqlite3ClearTem
340f0 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65  pRegCache(pParse
34100 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
34110 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
34120 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
34130 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65  t will fill an e
34140 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77  phemeral table w
34150 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ith.      ** the
34160 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73   content of this
34170 20 73 75 62 71 75 65 72 79 2e 20 20 70 49 74 65   subquery.  pIte
34180 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 77  m->addrFillSub w
34190 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20 20  ill point.      
341a0 2a 2a 20 74 6f 20 74 68 65 20 61 64 64 72 65 73  ** to the addres
341b0 73 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74  s of the generat
341c0 65 64 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20  ed subroutine.  
341d0 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
341e0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20 72  .      ** is a r
341f0 65 67 69 73 74 65 72 20 61 6c 6c 6f 63 61 74 65  egister allocate
34200 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 73 75  d to hold the su
34210 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20  broutine return 
34220 61 64 64 72 65 73 73 0a 20 20 20 20 20 20 2a 2f  address.      */
34230 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70 41 64  .      int topAd
34240 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e  dr;.      int on
34250 63 65 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  ceAddr = 0;.    
34260 20 20 69 6e 74 20 72 65 74 41 64 64 72 3b 0a 20    int retAddr;. 
34270 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
34280 69 73 74 5f 69 74 65 6d 20 2a 70 50 72 69 6f 72  ist_item *pPrior
34290 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
342a0 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
342b0 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Sub==0 );.      
342c0 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
342d0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
342e0 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41 64 64 72  m;.      topAddr
342f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
34300 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
34310 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65  er, 0, pItem->re
34320 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
34330 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
34340 75 62 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a  ub = topAddr+1;.
34350 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
34360 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61 74 65 64  >fg.isCorrelated
34370 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
34380 2a 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72  * If the subquer
34390 79 20 69 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61  y is not correla
343a0 74 65 64 20 61 6e 64 20 69 66 20 77 65 20 61 72  ted and if we ar
343b0 65 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a  e not inside of.
343c0 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69          ** a tri
343d0 67 67 65 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e  gger, then we on
343e0 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75  ly need to compu
343f0 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  te the value of 
34400 74 68 65 20 73 75 62 71 75 65 72 79 0a 20 20 20  the subquery.   
34410 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f       ** once. */
34420 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 41 64 64  .        onceAdd
34430 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
34440 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65  ddOp0(v, OP_Once
34450 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
34460 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  v);.        Vdbe
34470 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74  Comment((v, "mat
34480 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22  erialize \"%s\""
34490 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
344a0 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 65  Name));.      }e
344b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 56 64 62  lse{.        Vdb
344c0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
344d0 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c 22   "materialize \"
344e0 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54  %s\"", pItem->pT
344f0 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ab->zName));.   
34500 20 20 20 7d 0a 20 20 20 20 20 20 70 50 72 69 6f     }.      pPrio
34510 72 20 3d 20 69 73 53 65 6c 66 4a 6f 69 6e 56 69  r = isSelfJoinVi
34520 65 77 28 70 54 61 62 4c 69 73 74 2c 20 70 49 74  ew(pTabList, pIt
34530 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  em);.      if( p
34540 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  Prior ){.       
34550 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
34560 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70  p2(v, OP_OpenDup
34570 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
34580 2c 20 70 50 72 69 6f 72 2d 3e 69 43 75 72 73 6f  , pPrior->iCurso
34590 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  r);.        asse
345a0 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 53 65 6c  rt( pPrior->pSel
345b0 65 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ect!=0 );.      
345c0 20 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52    pSub->nSelectR
345d0 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 70 53 65  ow = pPrior->pSe
345e0 6c 65 63 74 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  lect->nSelectRow
345f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
34600 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
34610 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
34620 73 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62  st, SRT_EphemTab
34630 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
34640 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 6c 61  );.        Expla
34650 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
34660 72 73 65 2c 20 31 2c 20 22 4d 41 54 45 52 49 41  rse, 1, "MATERIA
34670 4c 49 5a 45 20 25 75 22 2c 20 70 53 75 62 2d 3e  LIZE %u", pSub->
34680 73 65 6c 49 64 29 29 3b 0a 20 20 20 20 20 20 20  selId));.       
34690 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
346a0 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65  Parse, pSub, &de
346b0 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
346c0 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e     pItem->pTab->
346d0 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53 75  nRowLogEst = pSu
346e0 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  b->nSelectRow;. 
346f0 20 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64 64       if( onceAdd
34700 72 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  r ) sqlite3VdbeJ
34710 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65 41  umpHere(v, onceA
34720 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74 41  ddr);.      retA
34730 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
34740 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
34750 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67  turn, pItem->reg
34760 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 56  Return);.      V
34770 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
34780 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e  end %s", pItem->
34790 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
347a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
347b0 43 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70 41  ChangeP1(v, topA
347c0 64 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a 20  ddr, retAddr);. 
347d0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61       sqlite3Clea
347e0 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50  rTempRegCache(pP
347f0 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  arse);.    }.   
34800 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
34810 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c  ailed ) goto sel
34820 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70 50 61  ect_end;.    pPa
34830 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20  rse->nHeight -= 
34840 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
34850 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20 20 20  rHeight(p);.    
34860 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
34870 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74  text = zSavedAut
34880 68 43 6f 6e 74 65 78 74 3b 0a 23 65 6e 64 69 66  hContext;.#endif
34890 0a 20 20 7d 0a 0a 20 20 2f 2a 20 56 61 72 69 6f  .  }..  /* Vario
348a0 75 73 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  us elements of t
348b0 68 65 20 53 45 4c 45 43 54 20 63 6f 70 69 65 64  he SELECT copied
348c0 20 69 6e 74 6f 20 6c 6f 63 61 6c 20 76 61 72 69   into local vari
348d0 61 62 6c 65 73 20 66 6f 72 0a 20 20 2a 2a 20 63  ables for.  ** c
348e0 6f 6e 76 65 6e 69 65 6e 63 65 20 2a 2f 0a 20 20  onvenience */.  
348f0 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
34900 73 74 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70  st;.  pWhere = p
34910 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f  ->pWhere;.  pGro
34920 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
34930 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20  By;.  pHaving = 
34940 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44  p->pHaving;.  sD
34950 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d  istinct.isTnct =
34960 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
34970 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b  SF_Distinct)!=0;
34980 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ..#if SELECTTRAC
34990 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
349a0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
349b0 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20  ce & 0x400 ){.  
349c0 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
349d0 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41  400,pParse,p,("A
349e0 66 74 65 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c  fter all FROM-cl
349f0 61 75 73 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e  ause analysis:\n
34a00 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
34a10 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
34a20 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , p, 0);.  }.#en
34a30 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
34a40 20 71 75 65 72 79 20 69 73 20 44 49 53 54 49 4e   query is DISTIN
34a50 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52  CT with an ORDER
34a60 20 42 59 20 62 75 74 20 69 73 20 6e 6f 74 20 61   BY but is not a
34a70 6e 20 61 67 67 72 65 67 61 74 65 2c 20 61 6e 64  n aggregate, and
34a80 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 73 65   .  ** if the se
34a90 6c 65 63 74 2d 6c 69 73 74 20 69 73 20 74 68 65  lect-list is the
34aa0 20 73 61 6d 65 20 61 73 20 74 68 65 20 4f 52 44   same as the ORD
34ab0 45 52 20 42 59 20 6c 69 73 74 2c 20 74 68 65 6e  ER BY list, then
34ac0 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2a   this query.  **
34ad0 20 63 61 6e 20 62 65 20 72 65 77 72 69 74 74 65   can be rewritte
34ae0 6e 20 61 73 20 61 20 47 52 4f 55 50 20 42 59 2e  n as a GROUP BY.
34af0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
34b00 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   this:.  **.  **
34b10 20 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54       SELECT DIST
34b20 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e  INCT xyz FROM ..
34b30 2e 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20  . ORDER BY xyz. 
34b40 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e   **.  ** is tran
34b50 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a  sformed to:.  **
34b60 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
34b70 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52   xyz FROM ... GR
34b80 4f 55 50 20 42 59 20 78 79 7a 20 4f 52 44 45 52  OUP BY xyz ORDER
34b90 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a   BY xyz.  **.  *
34ba0 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  * The second for
34bb0 6d 20 69 73 20 70 72 65 66 65 72 72 65 64 20 61  m is preferred a
34bc0 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65 78  s a single index
34bd0 20 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c 65 29   (or temp-table)
34be0 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20 75 73   may be .  ** us
34bf0 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20  ed for both the 
34c00 4f 52 44 45 52 20 42 59 20 61 6e 64 20 44 49 53  ORDER BY and DIS
34c10 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69 6e 67  TINCT processing
34c20 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20  . As originally 
34c30 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 68  .  ** written th
34c40 65 20 71 75 65 72 79 20 6d 75 73 74 20 75 73 65  e query must use
34c50 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f   a temp-table fo
34c60 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  r at least one o
34c70 66 20 74 68 65 20 4f 52 44 45 52 20 0a 20 20 2a  f the ORDER .  *
34c80 2a 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43  * BY and DISTINC
34c90 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65 78 20  T, and an index 
34ca0 6f 72 20 73 65 70 61 72 61 74 65 20 74 65 6d 70  or separate temp
34cb0 2d 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6f  -table for the o
34cc0 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ther..  */.  if(
34cd0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
34ce0 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
34cf0 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
34d00 44 69 73 74 69 6e 63 74 20 0a 20 20 20 26 26 20  Distinct .   && 
34d10 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
34d20 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e 70 4f 72  ompare(sSort.pOr
34d30 64 65 72 42 79 2c 20 70 45 4c 69 73 74 2c 20 2d  derBy, pEList, -
34d40 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70  1)==0.  ){.    p
34d50 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
34d60 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20  F_Distinct;.    
34d70 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
34d80 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
34d90 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
34da0 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20  pEList, 0);.    
34db0 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 65  /* Notice that e
34dc0 76 65 6e 20 74 68 6f 75 67 68 74 20 53 46 5f 44  ven thought SF_D
34dd0 69 73 74 69 6e 63 74 20 68 61 73 20 62 65 65 6e  istinct has been
34de0 20 63 6c 65 61 72 65 64 20 66 72 6f 6d 20 70 2d   cleared from p-
34df0 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20 2a  >selFlags,.    *
34e00 2a 20 74 68 65 20 73 44 69 73 74 69 6e 63 74 2e  * the sDistinct.
34e10 69 73 54 6e 63 74 20 69 73 20 73 74 69 6c 6c 20  isTnct is still 
34e20 73 65 74 2e 20 20 48 65 6e 63 65 2c 20 69 73 54  set.  Hence, isT
34e30 6e 63 74 20 72 65 70 72 65 73 65 6e 74 73 20 74  nct represents t
34e40 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e  he.    ** origin
34e50 61 6c 20 73 65 74 74 69 6e 67 20 6f 66 20 74 68  al setting of th
34e60 65 20 53 46 5f 44 69 73 74 69 6e 63 74 20 66 6c  e SF_Distinct fl
34e70 61 67 2c 20 6e 6f 74 20 74 68 65 20 63 75 72 72  ag, not the curr
34e80 65 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20  ent setting */. 
34e90 20 20 20 61 73 73 65 72 74 28 20 73 44 69 73 74     assert( sDist
34ea0 69 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b 0a 0a  inct.isTnct );..
34eb0 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
34ec0 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20  ENABLED.    if( 
34ed0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
34ee0 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20  ce & 0x400 ){.  
34ef0 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
34f00 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28  0x400,pParse,p,(
34f10 22 54 72 61 6e 73 66 6f 72 6d 20 44 49 53 54 49  "Transform DISTI
34f20 4e 43 54 20 69 6e 74 6f 20 47 52 4f 55 50 20 42  NCT into GROUP B
34f30 59 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 73  Y:\n"));.      s
34f40 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
34f50 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
34f60 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
34f70 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
34f80 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
34f90 61 75 73 65 2c 20 74 68 65 6e 20 63 72 65 61 74  ause, then creat
34fa0 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69  e an ephemeral i
34fb0 6e 64 65 78 20 74 6f 0a 20 20 2a 2a 20 64 6f 20  ndex to.  ** do 
34fc0 74 68 65 20 73 6f 72 74 69 6e 67 2e 20 20 42 75  the sorting.  Bu
34fd0 74 20 74 68 69 73 20 73 6f 72 74 69 6e 67 20 65  t this sorting e
34fe0 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 6d  phemeral index m
34ff0 69 67 68 74 20 65 6e 64 20 75 70 0a 20 20 2a 2a  ight end up.  **
35000 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20 69 66   being unused if
35010 20 74 68 65 20 64 61 74 61 20 63 61 6e 20 62 65   the data can be
35020 20 65 78 74 72 61 63 74 65 64 20 69 6e 20 70 72   extracted in pr
35030 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 0a  e-sorted order..
35040 20 20 2a 2a 20 49 66 20 74 68 61 74 20 69 73 20    ** If that is 
35050 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74  the case, then t
35060 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
35070 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
35080 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 63 68 61  will be.  ** cha
35090 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f  nged to an OP_No
350a0 6f 70 20 6f 6e 63 65 20 77 65 20 66 69 67 75 72  op once we figur
350b0 65 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 73  e out that the s
350c0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73 0a  orting index is.
350d0 20 20 2a 2a 20 6e 6f 74 20 6e 65 65 64 65 64 2e    ** not needed.
350e0 20 20 54 68 65 20 73 53 6f 72 74 2e 61 64 64 72    The sSort.addr
350f0 53 6f 72 74 49 6e 64 65 78 20 76 61 72 69 61 62  SortIndex variab
35100 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 66 61  le is used to fa
35110 63 69 6c 69 74 61 74 65 0a 20 20 2a 2a 20 74 68  cilitate.  ** th
35120 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a  at change..  */.
35130 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64    if( sSort.pOrd
35140 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49  erBy ){.    KeyI
35150 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
35160 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
35170 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d  lite3KeyInfoFrom
35180 45 78 70 72 4c 69 73 74 28 0a 20 20 20 20 20 20  ExprList(.      
35190 20 20 70 50 61 72 73 65 2c 20 73 53 6f 72 74 2e    pParse, sSort.
351a0 70 4f 72 64 65 72 42 79 2c 20 30 2c 20 70 45 4c  pOrderBy, 0, pEL
351b0 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
351c0 20 73 53 6f 72 74 2e 69 45 43 75 72 73 6f 72 20   sSort.iECursor 
351d0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
351e0 3b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72  ;.    sSort.addr
351f0 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20  SortIndex =.    
35200 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
35210 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
35220 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20  hemeral,.       
35230 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73 6f     sSort.iECurso
35240 72 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  r, sSort.pOrderB
35250 79 2d 3e 6e 45 78 70 72 2b 31 2b 70 45 4c 69 73  y->nExpr+1+pELis
35260 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a 20 20 20  t->nExpr, 0,.   
35270 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
35280 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
35290 46 4f 0a 20 20 20 20 20 20 29 3b 0a 20 20 7d 65  FO.      );.  }e
352a0 6c 73 65 7b 0a 20 20 20 20 73 53 6f 72 74 2e 61  lse{.    sSort.a
352b0 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d  ddrSortIndex = -
352c0 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
352d0 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64 65  the output is de
352e0 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d  stined for a tem
352f0 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70  porary table, op
35300 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20  en that table.. 
35310 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d   */.  if( pDest-
35320 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65  >eDest==SRT_Ephe
35330 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  mTab ){.    sqli
35340 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
35350 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
35360 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  l, pDest->iSDPar
35370 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  m, pEList->nExpr
35380 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  );.  }..  /* Set
35390 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20   the limiter..  
353a0 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c 69  */.  iEnd = sqli
353b0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
353c0 28 76 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73  (v);.  if( (p->s
353d0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 46 69 78  elFlags & SF_Fix
353e0 65 64 4c 69 6d 69 74 29 3d 3d 30 20 29 7b 0a 20  edLimit)==0 ){. 
353f0 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
35400 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20 62 69   = 320;  /* 4 bi
35410 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a 20 20  llion rows */.  
35420 7d 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  }.  computeLimit
35430 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
35440 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20 69 66  , p, iEnd);.  if
35450 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20 26  ( p->iLimit==0 &
35460 26 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74  & sSort.addrSort
35470 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20 20 20  Index>=0 ){.    
35480 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
35490 65 4f 70 63 6f 64 65 28 76 2c 20 73 53 6f 72 74  eOpcode(v, sSort
354a0 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 2c 20  .addrSortIndex, 
354b0 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 29 3b 0a  OP_SorterOpen);.
354c0 20 20 20 20 73 53 6f 72 74 2e 73 6f 72 74 46 6c      sSort.sortFl
354d0 61 67 73 20 7c 3d 20 53 4f 52 54 46 4c 41 47 5f  ags |= SORTFLAG_
354e0 55 73 65 53 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a  UseSorter;.  }..
354f0 20 20 2f 2a 20 4f 70 65 6e 20 61 6e 20 65 70 68    /* Open an eph
35500 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 6f 20  emeral index to 
35510 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74  use for the dist
35520 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  inct set..  */. 
35530 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
35540 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29   & SF_Distinct )
35550 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e  {.    sDistinct.
35560 74 61 62 54 6e 63 74 20 3d 20 70 50 61 72 73 65  tabTnct = pParse
35570 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 44  ->nTab++;.    sD
35580 69 73 74 69 6e 63 74 2e 61 64 64 72 54 6e 63 74  istinct.addrTnct
35590 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
355a0 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
355b0 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20  phemeral,.      
355c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
355d0 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e   sDistinct.tabTn
355e0 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  ct, 0, 0,.      
355f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35600 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b   (char*)sqlite3K
35610 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
35620 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45  st(pParse, p->pE
35630 4c 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20 20 20  List,0,0),.     
35640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35650 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20    P4_KEYINFO);. 
35660 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
35670 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f  angeP5(v, BTREE_
35680 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20  UNORDERED);.    
35690 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
356a0 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54  ype = WHERE_DIST
356b0 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a  INCT_UNORDERED;.
356c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44 69    }else{.    sDi
356d0 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65  stinct.eTnctType
356e0 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
356f0 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69  T_NOOP;.  }..  i
35700 66 28 20 21 69 73 41 67 67 20 26 26 20 70 47 72  f( !isAgg && pGr
35710 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  oupBy==0 ){.    
35720 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61 74 65 20  /* No aggregate 
35730 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f  functions and no
35740 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
35750 20 2a 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72   */.    u16 wctr
35760 6c 46 6c 61 67 73 20 3d 20 28 73 44 69 73 74 69  lFlags = (sDisti
35770 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20 57 48 45  nct.isTnct ? WHE
35780 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
35790 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20 20 20   : 0).          
357a0 20 20 20 20 20 20 20 20 20 7c 20 28 70 2d 3e 73           | (p->s
357b0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 46 69 78  elFlags & SF_Fix
357c0 65 64 4c 69 6d 69 74 29 3b 0a 23 69 66 6e 64 65  edLimit);.#ifnde
357d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
357e0 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 57 69 6e  NDOWFUNC.    Win
357f0 64 6f 77 20 2a 70 57 69 6e 20 3d 20 70 2d 3e 70  dow *pWin = p->p
35800 57 69 6e 3b 20 20 20 20 20 20 2f 2a 20 4d 61 73  Win;      /* Mas
35810 74 65 72 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63  ter window objec
35820 74 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20  t (or NULL) */. 
35830 20 20 20 69 66 28 20 70 57 69 6e 20 29 7b 0a 20     if( pWin ){. 
35840 20 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64       sqlite3Wind
35850 6f 77 43 6f 64 65 49 6e 69 74 28 70 50 61 72 73  owCodeInit(pPars
35860 65 2c 20 70 57 69 6e 29 3b 0a 20 20 20 20 7d 0a  e, pWin);.    }.
35870 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72  #endif.    asser
35880 74 28 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d  t( WHERE_USE_LIM
35890 49 54 3d 3d 53 46 5f 46 69 78 65 64 4c 69 6d 69  IT==SF_FixedLimi
358a0 74 20 29 3b 0a 0a 0a 20 20 20 20 2f 2a 20 42 65  t );...    /* Be
358b0 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  gin the database
358c0 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 53 45   scan. */.    SE
358d0 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72  LECTTRACE(1,pPar
358e0 73 65 2c 70 2c 28 22 57 68 65 72 65 42 65 67 69  se,p,("WhereBegi
358f0 6e 5c 6e 22 29 29 3b 0a 20 20 20 20 70 57 49 6e  n\n"));.    pWIn
35900 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
35910 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
35920 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
35930 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c   sSort.pOrderBy,
35940 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
35950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35960 70 2d 3e 70 45 4c 69 73 74 2c 20 77 63 74 72 6c  p->pEList, wctrl
35970 46 6c 61 67 73 2c 20 70 2d 3e 6e 53 65 6c 65 63  Flags, p->nSelec
35980 74 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70  tRow);.    if( p
35990 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
359a0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
359b0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
359c0 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70  OutputRowCount(p
359d0 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c  WInfo) < p->nSel
359e0 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20  ectRow ){.      
359f0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
35a00 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70  sqlite3WhereOutp
35a10 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66  utRowCount(pWInf
35a20 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  o);.    }.    if
35a30 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e  ( sDistinct.isTn
35a40 63 74 20 26 26 20 73 71 6c 69 74 65 33 57 68 65  ct && sqlite3Whe
35a50 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49  reIsDistinct(pWI
35a60 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 73 44  nfo) ){.      sD
35a70 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70  istinct.eTnctTyp
35a80 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  e = sqlite3Where
35a90 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66  IsDistinct(pWInf
35aa0 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  o);.    }.    if
35ab0 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  ( sSort.pOrderBy
35ac0 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e   ){.      sSort.
35ad0 6e 4f 42 53 61 74 20 3d 20 73 71 6c 69 74 65 33  nOBSat = sqlite3
35ae0 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70  WhereIsOrdered(p
35af0 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 53  WInfo);.      sS
35b00 6f 72 74 2e 6c 61 62 65 6c 4f 42 4c 6f 70 74 20  ort.labelOBLopt 
35b10 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 72  = sqlite3WhereOr
35b20 64 65 72 42 79 4c 69 6d 69 74 4f 70 74 4c 61 62  derByLimitOptLab
35b30 65 6c 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  el(pWInfo);.    
35b40 20 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f 42 53    if( sSort.nOBS
35b50 61 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64 65 72  at==sSort.pOrder
35b60 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  By->nExpr ){.   
35b70 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65       sSort.pOrde
35b80 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  rBy = 0;.      }
35b90 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
35ba0 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  f sorting index 
35bb0 74 68 61 74 20 77 61 73 20 63 72 65 61 74 65 64  that was created
35bc0 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f   by a prior OP_O
35bd0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20  penEphemeral .  
35be0 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
35bf0 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65   ended up not be
35c00 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e  ing needed, then
35c10 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f   change the OP_O
35c20 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20  penEphemeral.   
35c30 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e   ** into an OP_N
35c40 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
35c50 69 66 28 20 73 53 6f 72 74 2e 61 64 64 72 53 6f  if( sSort.addrSo
35c60 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 73 53  rtIndex>=0 && sS
35c70 6f 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d 30 20  ort.pOrderBy==0 
35c80 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
35c90 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
35ca0 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f  (v, sSort.addrSo
35cb0 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d 0a  rtIndex);.    }.
35cc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
35cd0 70 45 4c 69 73 74 3d 3d 70 45 4c 69 73 74 20 29  pEList==pEList )
35ce0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
35cf0 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43  _OMIT_WINDOWFUNC
35d00 0a 20 20 20 20 69 66 28 20 70 57 69 6e 20 29 7b  .    if( pWin ){
35d10 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 47  .      int addrG
35d20 6f 73 75 62 20 3d 20 73 71 6c 69 74 65 33 56 64  osub = sqlite3Vd
35d30 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
35d40 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 20        int iCont 
35d50 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
35d60 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
35d70 20 69 6e 74 20 69 42 72 65 61 6b 20 3d 20 73 71   int iBreak = sq
35d80 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
35d90 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74  el(v);.      int
35da0 20 72 65 67 47 6f 73 75 62 20 3d 20 2b 2b 70 50   regGosub = ++pP
35db0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20  arse->nMem;..   
35dc0 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77     sqlite3Window
35dd0 43 6f 64 65 53 74 65 70 28 70 50 61 72 73 65 2c  CodeStep(pParse,
35de0 20 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67 47   p, pWInfo, regG
35df0 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29  osub, addrGosub)
35e00 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
35e10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
35e20 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b  _Goto, 0, iBreak
35e30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
35e40 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
35e50 28 76 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a  (v, addrGosub);.
35e60 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f        VdbeNoopCo
35e70 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 6e 65 72  mment((v, "inner
35e80 2d 6c 6f 6f 70 20 73 75 62 72 6f 75 74 69 6e 65  -loop subroutine
35e90 22 29 29 3b 0a 20 20 20 20 20 20 73 53 6f 72 74  "));.      sSort
35ea0 2e 6c 61 62 65 6c 4f 42 4c 6f 70 74 20 3d 20 30  .labelOBLopt = 0
35eb0 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  ;.      selectIn
35ec0 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
35ed0 70 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 20 26  p, -1, &sSort, &
35ee0 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74  sDistinct, pDest
35ef0 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29  , iCont, iBreak)
35f00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
35f10 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
35f20 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
35f30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
35f40 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
35f50 20 72 65 67 47 6f 73 75 62 29 3b 0a 20 20 20 20   regGosub);.    
35f60 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
35f70 2c 20 22 65 6e 64 20 69 6e 6e 65 72 2d 6c 6f 6f  , "end inner-loo
35f80 70 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  p subroutine"));
35f90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
35fa0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
35fb0 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 7d  , iBreak);.    }
35fc0 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
35fd0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
35fe0 57 46 55 4e 43 20 2a 2f 0a 20 20 20 20 7b 0a 20  WFUNC */.    {. 
35ff0 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20       /* Use the 
36000 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c  standard inner l
36010 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 20 20 73 65  oop. */.      se
36020 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
36030 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73 53  arse, p, -1, &sS
36040 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63 74 2c  ort, &sDistinct,
36050 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   pDest,.        
36060 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f    sqlite3WhereCo
36070 6e 74 69 6e 75 65 4c 61 62 65 6c 28 70 57 49 6e  ntinueLabel(pWIn
36080 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 73  fo),.          s
36090 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b  qlite3WhereBreak
360a0 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a  Label(pWInfo));.
360b0 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 74 68  .      /* End th
360c0 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20  e database scan 
360d0 6c 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  loop..      */. 
360e0 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
360f0 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
36100 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
36110 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 77 68   /* This case wh
36120 65 6e 20 74 68 65 72 65 20 65 78 69 73 74 20 61  en there exist a
36130 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
36140 6e 73 20 6f 72 20 61 20 47 52 4f 55 50 20 42 59  ns or a GROUP BY
36150 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 6f   clause.    ** o
36160 72 20 62 6f 74 68 20 2a 2f 0a 20 20 20 20 4e 61  r both */.    Na
36170 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20  meContext sNC;  
36180 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
36190 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67  t for processing
361a0 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72   aggregate infor
361b0 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e  mation */.    in
361c0 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20  t iAMem;        
361d0 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61    /* First Mem a
361e0 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69  ddress for stori
361f0 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  ng current GROUP
36200 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69   BY */.    int i
36210 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  BMem;          /
36220 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72  * First Mem addr
36230 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73  ess for previous
36240 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20   GROUP BY */.   
36250 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20   int iUseFlag;  
36260 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72       /* Mem addr
36270 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67  ess holding flag
36280 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
36290 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20   at least.      
362a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
362b0 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20    ** one row of 
362c0 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65  the input to the
362d0 20 61 67 67 72 65 67 61 74 6f 72 20 68 61 73 20   aggregator has 
362e0 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20  been.           
362f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
36300 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20  processed */.   
36310 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b   int iAbortFlag;
36320 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72       /* Mem addr
36330 65 73 73 20 77 68 69 63 68 20 63 61 75 73 65 73  ess which causes
36340 20 71 75 65 72 79 20 61 62 6f 72 74 20 69 66 20   query abort if 
36350 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20  positive */.    
36360 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b  int groupBySort;
36370 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65      /* Rows come
36380 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20   from source in 
36390 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a  GROUP BY order *
363a0 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e  /.    int addrEn
363b0 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64  d;        /* End
363c0 20 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20 66   of processing f
363d0 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a  or this SELECT *
363e0 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 50 54  /.    int sortPT
363f0 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73 65  ab = 0;   /* Pse
36400 75 64 6f 74 61 62 6c 65 20 75 73 65 64 20 74 6f  udotable used to
36410 20 64 65 63 6f 64 65 20 73 6f 72 74 69 6e 67 20   decode sorting 
36420 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 69  results */.    i
36430 6e 74 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b 20  nt sortOut = 0; 
36440 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 72 65 67     /* Output reg
36450 69 73 74 65 72 20 66 72 6f 6d 20 74 68 65 20 73  ister from the s
36460 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  orter */.    int
36470 20 6f 72 64 65 72 42 79 47 72 70 20 3d 20 30 3b   orderByGrp = 0;
36480 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
36490 47 52 4f 55 50 20 42 59 20 61 6e 64 20 4f 52 44  GROUP BY and ORD
364a0 45 52 20 42 59 20 61 72 65 20 74 68 65 20 73 61  ER BY are the sa
364b0 6d 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65  me */..    /* Re
364c0 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c  move any and all
364d0 20 61 6c 69 61 73 65 73 20 62 65 74 77 65 65 6e   aliases between
364e0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
364f0 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 47  and the.    ** G
36500 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a  ROUP BY clause..
36510 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
36520 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
36530 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20   int k;         
36540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36550 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
36560 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  /.      struct E
36570 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
36580 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f  tem;  /* For loo
36590 70 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65 73  ping over expres
365a0 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a  sion in a list *
365b0 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70  /..      for(k=p
365c0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
365d0 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74   pItem=p->pEList
365e0 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70  ->a; k>0; k--, p
365f0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
36600 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69   pItem->u.x.iAli
36610 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  as = 0;.      }.
36620 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f        for(k=pGro
36630 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74  upBy->nExpr, pIt
36640 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20  em=pGroupBy->a; 
36650 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b  k>0; k--, pItem+
36660 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65  +){.        pIte
36670 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20  m->u.x.iAlias = 
36680 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
36690 20 61 73 73 65 72 74 28 20 36 36 3d 3d 73 71 6c   assert( 66==sql
366a0 69 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29 20  ite3LogEst(100) 
366b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
366c0 6e 53 65 6c 65 63 74 52 6f 77 3e 36 36 20 29 20  nSelectRow>66 ) 
366d0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
366e0 36 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  66;.    }else{. 
366f0 20 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d       assert( 0==
36700 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29  sqlite3LogEst(1)
36710 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65   );.      p->nSe
36720 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20  lectRow = 0;.   
36730 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
36740 65 72 65 20 69 73 20 62 6f 74 68 20 61 20 47 52  ere is both a GR
36750 4f 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52  OUP BY and an OR
36760 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
36770 64 20 74 68 65 79 20 61 72 65 0a 20 20 20 20 2a  d they are.    *
36780 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65  * identical, the
36790 6e 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73  n it may be poss
367a0 69 62 6c 65 20 74 6f 20 64 69 73 61 62 6c 65 20  ible to disable 
367b0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
367c0 75 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  use .    ** on t
367d0 68 65 20 67 72 6f 75 6e 64 73 20 74 68 61 74 20  he grounds that 
367e0 74 68 65 20 47 52 4f 55 50 20 42 59 20 77 69 6c  the GROUP BY wil
367f0 6c 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74 73  l cause elements
36800 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20 20   to come out .  
36810 20 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 72    ** in the corr
36820 65 63 74 20 6f 72 64 65 72 2e 20 49 74 20 61 6c  ect order. It al
36830 73 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68 65  so may not - the
36840 20 47 52 4f 55 50 20 42 59 20 6d 69 67 68 74 20   GROUP BY might 
36850 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 64 61 74  use a.    ** dat
36860 61 62 61 73 65 20 69 6e 64 65 78 20 74 68 61 74  abase index that
36870 20 63 61 75 73 65 73 20 72 6f 77 73 20 74 6f 20   causes rows to 
36880 62 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74  be grouped toget
36890 68 65 72 20 61 73 20 72 65 71 75 69 72 65 64 0a  her as required.
368a0 20 20 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 61      ** but not a
368b0 63 74 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e 20  ctually sorted. 
368c0 45 69 74 68 65 72 20 77 61 79 2c 20 72 65 63 6f  Either way, reco
368d0 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rd the fact that
368e0 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44 45   the.    ** ORDE
368f0 52 20 42 59 20 61 6e 64 20 47 52 4f 55 50 20 42  R BY and GROUP B
36900 59 20 63 6c 61 75 73 65 73 20 61 72 65 20 74 68  Y clauses are th
36910 65 20 73 61 6d 65 20 62 79 20 73 65 74 74 69 6e  e same by settin
36920 67 20 74 68 65 20 6f 72 64 65 72 42 79 47 72 70  g the orderByGrp
36930 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  .    ** variable
36940 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  .  */.    if( sq
36950 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d  lite3ExprListCom
36960 70 61 72 65 28 70 47 72 6f 75 70 42 79 2c 20 73  pare(pGroupBy, s
36970 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d  Sort.pOrderBy, -
36980 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f  1)==0 ){.      o
36990 72 64 65 72 42 79 47 72 70 20 3d 20 31 3b 0a 20  rderByGrp = 1;. 
369a0 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43 72     }. .    /* Cr
369b0 65 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20  eate a label to 
369c0 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20  jump to when we 
369d0 77 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68  want to abort th
369e0 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61  e query */.    a
369f0 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33  ddrEnd = sqlite3
36a00 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
36a10 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  ;..    /* Conver
36a20 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  t TK_COLUMN node
36a30 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f  s into TK_AGG_CO
36a40 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e  LUMN and make en
36a50 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20  tries in.    ** 
36a60 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c  sAggInfo for all
36a70 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
36a80 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73   nodes in expres
36a90 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20  sions of the.   
36aa0 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   ** SELECT state
36ab0 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ment..    */.   
36ac0 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
36ad0 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
36ae0 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
36af0 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e  pParse;.    sNC.
36b00 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
36b10 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 75 4e 43  ist;.    sNC.uNC
36b20 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67  .pAggInfo = &sAg
36b30 67 49 6e 66 6f 3b 0a 20 20 20 20 56 56 41 5f 4f  gInfo;.    VVA_O
36b40 4e 4c 59 28 20 73 4e 43 2e 6e 63 46 6c 61 67 73  NLY( sNC.ncFlags
36b50 20 3d 20 4e 43 5f 55 41 67 67 49 6e 66 6f 3b 20   = NC_UAggInfo; 
36b60 29 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d  ).    sAggInfo.m
36b70 6e 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nReg = pParse->n
36b80 4d 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49  Mem+1;.    sAggI
36b90 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
36ba0 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20  mn = pGroupBy ? 
36bb0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20  pGroupBy->nExpr 
36bc0 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66  : 0;.    sAggInf
36bd0 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72  o.pGroupBy = pGr
36be0 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74  oupBy;.    sqlit
36bf0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
36c00 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73  List(&sNC, pELis
36c10 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
36c20 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
36c30 74 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f  t(&sNC, sSort.pO
36c40 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28  rderBy);.    if(
36c50 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20   pHaving ){.    
36c60 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
36c70 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
36c80 28 20 70 57 68 65 72 65 3d 3d 70 2d 3e 70 57 68  ( pWhere==p->pWh
36c90 65 72 65 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ere );.        a
36ca0 73 73 65 72 74 28 20 70 48 61 76 69 6e 67 3d 3d  ssert( pHaving==
36cb0 70 2d 3e 70 48 61 76 69 6e 67 20 29 3b 0a 20 20  p->pHaving );.  
36cc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 47        assert( pG
36cd0 72 6f 75 70 42 79 3d 3d 70 2d 3e 70 47 72 6f 75  roupBy==p->pGrou
36ce0 70 42 79 20 29 3b 0a 20 20 20 20 20 20 20 20 68  pBy );.        h
36cf0 61 76 69 6e 67 54 6f 57 68 65 72 65 28 70 50 61  avingToWhere(pPa
36d00 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 20  rse, p);.       
36d10 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
36d20 65 72 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ere;.      }.   
36d30 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
36d40 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
36d50 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a  &sNC, pHaving);.
36d60 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e      }.    sAggIn
36d70 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20  fo.nAccumulator 
36d80 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  = sAggInfo.nColu
36d90 6d 6e 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  mn;.    if( p->p
36da0 47 72 6f 75 70 42 79 3d 3d 30 20 26 26 20 70 2d  GroupBy==0 && p-
36db0 3e 70 48 61 76 69 6e 67 3d 3d 30 20 26 26 20 73  >pHaving==0 && s
36dc0 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3d 3d 31  AggInfo.nFunc==1
36dd0 20 29 7b 0a 20 20 20 20 20 20 6d 69 6e 4d 61 78   ){.      minMax
36de0 46 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65  Flag = minMaxQue
36df0 72 79 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e  ry(db, sAggInfo.
36e00 61 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72 2c 20  aFunc[0].pExpr, 
36e10 26 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79 29  &pMinMaxOrderBy)
36e20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
36e30 20 20 20 6d 69 6e 4d 61 78 46 6c 61 67 20 3d 20     minMaxFlag = 
36e40 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f  WHERE_ORDERBY_NO
36e50 52 4d 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RMAL;.    }.    
36e60 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
36e70 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b  nfo.nFunc; i++){
36e80 0a 20 20 20 20 20 20 69 66 28 20 73 41 67 67 49  .      if( sAggI
36e90 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78  nfo.aFunc[i].pEx
36ea0 70 72 2d 3e 65 58 3d 3d 45 58 5f 4c 69 73 74 20  pr->eX==EX_List 
36eb0 29 7b 0a 20 20 20 20 20 20 20 20 73 4e 43 2e 6e  ){.        sNC.n
36ec0 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41  cFlags |= NC_InA
36ed0 67 67 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20  ggFunc;.        
36ee0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
36ef0 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
36f00 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69  sAggInfo.aFunc[i
36f10 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ].pExpr->x.pList
36f20 29 3b 0a 20 20 20 20 20 20 20 20 73 4e 43 2e 6e  );.        sNC.n
36f30 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 49 6e  cFlags &= ~NC_In
36f40 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 20 20 7d  AggFunc;.      }
36f50 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49  .    }.    sAggI
36f60 6e 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72  nfo.mxReg = pPar
36f70 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66  se->nMem;.    if
36f80 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
36f90 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  ed ) goto select
36fa0 5f 65 6e 64 3b 0a 23 69 66 20 53 45 4c 45 43 54  _end;.#if SELECT
36fb0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
36fc0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
36fd0 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30  ectTrace & 0x400
36fe0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69   ){.      int ii
36ff0 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  ;.      SELECTTR
37000 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65  ACE(0x400,pParse
37010 2c 70 2c 28 22 41 66 74 65 72 20 61 67 67 72 65  ,p,("After aggre
37020 67 61 74 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e  gate analysis:\n
37030 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
37040 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
37050 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20  (0, p, 0);.     
37060 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 41   for(ii=0; ii<sA
37070 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20  ggInfo.nColumn; 
37080 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73  ii++){.        s
37090 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
370a0 66 28 22 61 67 67 2d 63 6f 6c 75 6d 6e 5b 25 64  f("agg-column[%d
370b0 5d 20 69 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20  ] iMem=%d\n",.  
370c0 20 20 20 20 20 20 20 20 20 20 69 69 2c 20 73 41            ii, sA
370d0 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 69 5d 2e  ggInfo.aCol[ii].
370e0 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73  iMem);.        s
370f0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
37100 70 72 28 30 2c 20 73 41 67 67 49 6e 66 6f 2e 61  pr(0, sAggInfo.a
37110 43 6f 6c 5b 69 69 5d 2e 70 45 78 70 72 2c 20 30  Col[ii].pExpr, 0
37120 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
37130 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 41   for(ii=0; ii<sA
37140 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 69  ggInfo.nFunc; ii
37150 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
37160 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
37170 22 61 67 67 2d 66 75 6e 63 5b 25 64 5d 3a 20 69  "agg-func[%d]: i
37180 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  Mem=%d\n",.     
37190 20 20 20 20 20 20 20 69 69 2c 20 73 41 67 67 49         ii, sAggI
371a0 6e 66 6f 2e 61 46 75 6e 63 5b 69 69 5d 2e 69 4d  nfo.aFunc[ii].iM
371b0 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  em);.        sql
371c0 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72  ite3TreeViewExpr
371d0 28 30 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  (0, sAggInfo.aFu
371e0 6e 63 5b 69 69 5d 2e 70 45 78 70 72 2c 20 30 29  nc[ii].pExpr, 0)
371f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
37200 23 65 6e 64 69 66 0a 0a 0a 20 20 20 20 2f 2a 20  #endif...    /* 
37210 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61  Processing for a
37220 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20 47  ggregates with G
37230 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79 20  ROUP BY is very 
37240 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20  different and.  
37250 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63    ** much more c
37260 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72  omplex than aggr
37270 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61  egates without a
37280 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a   GROUP BY..    *
37290 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
372a0 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49  By ){.      KeyI
372b0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
372c0 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d  /* Keying inform
372d0 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72  ation for the gr
372e0 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f  oup by clause */
372f0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 31  .      int addr1
37300 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d  ;          /* A-
37310 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e  vs-B comparision
37320 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69   jump */.      i
37330 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  nt addrOutputRow
37340 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73  ;  /* Start of s
37350 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
37360 75 74 70 75 74 73 20 61 20 72 65 73 75 6c 74 20  utputs a result 
37370 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  row */.      int
37380 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20   regOutputRow;  
37390 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65   /* Return addre
373a0 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
373b0 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
373c0 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  e */.      int a
373d0 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f  ddrSetAbort;   /
373e0 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72 74 20  * Set the abort 
373f0 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20  flag and return 
37400 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
37410 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20  rTopOfLoop;  /* 
37420 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74  Top of the input
37430 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69   loop */.      i
37440 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64  nt addrSortingId
37450 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65  x; /* The OP_Ope
37460 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74  nEphemeral for t
37470 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
37480 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
37490 64 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  drReset;      /*
374a0 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   Subroutine for 
374b0 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 61 63  resetting the ac
374c0 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20  cumulator */.   
374d0 20 20 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b     int regReset;
374e0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
374f0 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
37500 72 20 66 6f 72 20 72 65 73 65 74 20 73 75 62 72  r for reset subr
37510 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20  outine */..     
37520 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
37530 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
37540 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20  e we might need 
37550 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  a sorting index 
37560 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c  to.      ** impl
37570 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63  ement it.  Alloc
37580 61 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67  ate that sorting
37590 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20   index now.  If 
375a0 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20  it turns out.   
375b0 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
375c0 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74   not need it aft
375d0 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53  er all, the OP_S
375e0 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 72 75  orterOpen instru
375f0 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77  ction.      ** w
37600 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
37610 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a   into a Noop.  .
37620 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
37630 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
37640 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
37650 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  b++;.      pKeyI
37660 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
37670 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
37680 28 70 50 61 72 73 65 2c 70 47 72 6f 75 70 42 79  (pParse,pGroupBy
37690 2c 30 2c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c  ,0,sAggInfo.nCol
376a0 75 6d 6e 29 3b 0a 20 20 20 20 20 20 61 64 64 72  umn);.      addr
376b0 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c  SortingIdx = sql
376c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
376d0 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c  , OP_SorterOpen,
376e0 20 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67   .          sAgg
376f0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
37700 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69   sAggInfo.nSorti
37710 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20  ngColumn, .     
37720 20 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70       0, (char*)p
37730 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
37740 4e 46 4f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  NFO);..      /* 
37750 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72  Initialize memor
37760 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64  y locations used
37770 20 62 79 20 47 52 4f 55 50 20 42 59 20 61 67 67   by GROUP BY agg
37780 72 65 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e  regate processin
37790 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  g.      */.     
377a0 20 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50   iUseFlag = ++pP
377b0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
377c0 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b    iAbortFlag = +
377d0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
377e0 20 20 20 20 20 72 65 67 4f 75 74 70 75 74 52 6f       regOutputRo
377f0 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  w = ++pParse->nM
37800 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75  em;.      addrOu
37810 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  tputRow = sqlite
37820 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
37830 29 3b 0a 20 20 20 20 20 20 72 65 67 52 65 73 65  );.      regRese
37840 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
37850 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 52 65  em;.      addrRe
37860 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  set = sqlite3Vdb
37870 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
37880 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61       iAMem = pPa
37890 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
378a0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
378b0 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  m += pGroupBy->n
378c0 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65  Expr;.      iBMe
378d0 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
378e0 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72   + 1;.      pPar
378f0 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f  se->nMem += pGro
37900 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
37910 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
37920 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
37930 65 72 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c 61  er, 0, iAbortFla
37940 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
37950 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65 61 72  mment((v, "clear
37960 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
37970 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
37980 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75  eAddOp3(v, OP_Nu
37990 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20 69 41  ll, 0, iAMem, iA
379a0 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e 6e 45  Mem+pGroupBy->nE
379b0 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20 2f  xpr-1);..      /
379c0 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74  * Begin a loop t
379d0 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74  hat will extract
379e0 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73   all source rows
379f0 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64   in GROUP BY ord
37a00 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  er..      ** Thi
37a10 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20  s might involve 
37a20 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f  two separate loo
37a30 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f  ps with an OP_So
37a40 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f  rt in between, o
37a50 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69  r.      ** it mi
37a60 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20  ght be a single 
37a70 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20 61  loop that uses a
37a80 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61  n index to extra
37a90 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20  ct information. 
37aa0 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72       ** in the r
37ab0 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65  ight order to be
37ac0 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20  gin with..      
37ad0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
37ae0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
37af0 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74  _Gosub, regReset
37b00 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
37b10 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
37b20 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 57 68 65  1,pParse,p,("Whe
37b30 72 65 42 65 67 69 6e 5c 6e 22 29 29 3b 0a 20 20  reBegin\n"));.  
37b40 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
37b50 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
37b60 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
37b70 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70 42   pWhere, pGroupB
37b80 79 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  y, 0,.          
37b90 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 7c 20  WHERE_GROUPBY | 
37ba0 28 6f 72 64 65 72 42 79 47 72 70 20 3f 20 57 48  (orderByGrp ? WH
37bb0 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20  ERE_SORTBYGROUP 
37bc0 3a 20 30 29 2c 20 30 0a 20 20 20 20 20 20 29 3b  : 0), 0.      );
37bd0 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
37be0 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
37bf0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66  ct_end;.      if
37c00 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  ( sqlite3WhereIs
37c10 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3d  Ordered(pWInfo)=
37c20 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  =pGroupBy->nExpr
37c30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
37c40 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20  he optimizer is 
37c50 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20  able to deliver 
37c60 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79  rows in group by
37c70 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20   order so.      
37c80 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68    ** we do not h
37c90 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68  ave to sort.  Th
37ca0 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
37cb0 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65  al table will be
37cc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63  .        ** canc
37cd0 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61  elled later beca
37ce0 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65  use we still nee
37cf0 64 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65  d to use the pKe
37d00 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f  yInfo.        */
37d10 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79  .        groupBy
37d20 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Sort = 0;.      
37d30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
37d40 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e  * Rows are comin
37d50 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72  g out in undeter
37d60 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65  mined order.  We
37d70 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20   have to push.  
37d80 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f        ** each ro
37d90 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67  w into a sorting
37da0 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74   index, terminat
37db0 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70  e the first loop
37dc0 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
37dd0 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20  n loop over the 
37de0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e  sorting index in
37df0 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68   order to get th
37e00 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20  e output.       
37e10 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72   ** in sorted or
37e20 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  der.        */. 
37e30 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 42 61         int regBa
37e40 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se;.        int 
37e50 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20  regRecord;.     
37e60 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20     int nCol;.   
37e70 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42       int nGroupB
37e80 79 3b 0a 0a 20 20 20 20 20 20 20 20 65 78 70 6c  y;..        expl
37e90 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61  ainTempTable(pPa
37ea0 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
37eb0 20 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54    (sDistinct.isT
37ec0 6e 63 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c  nct && (p->selFl
37ed0 61 67 73 26 53 46 5f 44 69 73 74 69 6e 63 74 29  ags&SF_Distinct)
37ee0 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20  ==0) ?.         
37ef0 20 20 20 20 20 20 20 20 20 20 20 22 44 49 53 54             "DIST
37f00 49 4e 43 54 22 20 3a 20 22 47 52 4f 55 50 20 42  INCT" : "GROUP B
37f10 59 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 67 72  Y");..        gr
37f20 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20  oupBySort = 1;. 
37f30 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42 79 20         nGroupBy 
37f40 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
37f50 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20  r;.        nCol 
37f60 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  = nGroupBy;.    
37f70 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79      j = nGroupBy
37f80 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
37f90 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  0; i<sAggInfo.nC
37fa0 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
37fb0 20 20 20 20 20 20 20 69 66 28 20 73 41 67 67 49         if( sAggI
37fc0 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72  nfo.aCol[i].iSor
37fd0 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a  terColumn>=j ){.
37fe0 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c              nCol
37ff0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
38000 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  j++;.          }
38010 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
38020 20 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c     regBase = sql
38030 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
38040 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a  (pParse, nCol);.
38050 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
38060 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
38070 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
38080 2c 20 72 65 67 42 61 73 65 2c 20 30 2c 20 30 29  , regBase, 0, 0)
38090 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47  ;.        j = nG
380a0 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20  roupBy;.        
380b0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
380c0 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  nfo.nColumn; i++
380d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
380e0 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
380f0 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66  *pCol = &sAggInf
38100 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20  o.aCol[i];.     
38110 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
38120 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20  SorterColumn>=j 
38130 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
38140 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65 67 42  nt r1 = j + regB
38150 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ase;.           
38160 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
38170 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
38180 28 76 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (v,.            
38190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
381a0 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70     pCol->pTab, p
381b0 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 70 43 6f  Col->iTable, pCo
381c0 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b  l->iColumn, r1);
381d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b  .            j++
381e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
381f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
38200 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69  regRecord = sqli
38210 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
38220 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
38230 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
38240 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
38250 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c  d, regBase, nCol
38260 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
38270 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
38280 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
38290 72 74 65 72 49 6e 73 65 72 74 2c 20 73 41 67 67  rterInsert, sAgg
382a0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
382b0 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
382c0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
382d0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
382e0 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  e, regRecord);. 
382f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
38300 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
38310 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
38320 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
38330 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
38340 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
38350 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
38360 49 64 78 50 54 61 62 20 3d 20 73 6f 72 74 50 54  IdxPTab = sortPT
38370 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
38380 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f 72  b++;.        sor
38390 74 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 47 65  tOut = sqlite3Ge
383a0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
383b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
383c0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
383d0 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73 6f  P_OpenPseudo, so
383e0 72 74 50 54 61 62 2c 20 73 6f 72 74 4f 75 74 2c  rtPTab, sortOut,
383f0 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
38400 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
38410 32 28 76 2c